From 57584a22d7eb05adcde0422252d56f350d73019c Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 17 Nov 2019 19:13:23 -0500 Subject: [PATCH] add some guard code to the Is_*_level macros in dungeon.h All Is_*_level tests during early startup would test as true until dungeon_topology was initialized in a new game or restored from a save file. That could result in some unexpected code paths being taken. --- doc/fixes36.3 | 3 +++ include/dungeon.h | 55 ++++++++++++++++++++++++++--------------------- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/doc/fixes36.3 b/doc/fixes36.3 index 1b2caaebf..16ab5de31 100644 --- a/doc/fixes36.3 +++ b/doc/fixes36.3 @@ -235,6 +235,9 @@ dipping lichen corpse into acid when not blind and acid was undicovered would pluralization improvement for words ending in a k-sound like "biotech" check for whether a monster was entering a region (gas cloud) erroneously depended upon whether or not the hero was inside the same region +all Is_*_level tests during early startup would test as true until + dungeon_topology was initialized in a new game or restored from + a save file Fixes to Post-3.6.2 Problems that Were Exposed Via git Repository diff --git a/include/dungeon.h b/include/dungeon.h index 45246f150..1d476ff7a 100644 --- a/include/dungeon.h +++ b/include/dungeon.h @@ -98,31 +98,36 @@ typedef struct branch { * * Depth corresponds to the number of floors below the surface. */ -#define Is_astralevel(x) (on_level(x, &astral_level)) -#define Is_earthlevel(x) (on_level(x, &earth_level)) -#define Is_waterlevel(x) (on_level(x, &water_level)) -#define Is_firelevel(x) (on_level(x, &fire_level)) -#define Is_airlevel(x) (on_level(x, &air_level)) -#define Is_medusa_level(x) (on_level(x, &medusa_level)) -#define Is_oracle_level(x) (on_level(x, &oracle_level)) -#define Is_valley(x) (on_level(x, &valley_level)) -#define Is_juiblex_level(x) (on_level(x, &juiblex_level)) -#define Is_asmo_level(x) (on_level(x, &asmodeus_level)) -#define Is_baal_level(x) (on_level(x, &baalzebub_level)) -#define Is_wiz1_level(x) (on_level(x, &wiz1_level)) -#define Is_wiz2_level(x) (on_level(x, &wiz2_level)) -#define Is_wiz3_level(x) (on_level(x, &wiz3_level)) -#define Is_sanctum(x) (on_level(x, &sanctum_level)) -#define Is_portal_level(x) (on_level(x, &portal_level)) -#define Is_rogue_level(x) (on_level(x, &rogue_level)) -#define Is_stronghold(x) (on_level(x, &stronghold_level)) -#define Is_bigroom(x) (on_level(x, &bigroom_level)) -#define Is_qstart(x) (on_level(x, &qstart_level)) -#define Is_qlocate(x) (on_level(x, &qlocate_level)) -#define Is_nemesis(x) (on_level(x, &nemesis_level)) -#define Is_knox(x) (on_level(x, &knox_level)) -#define Is_mineend_level(x) (on_level(x, &mineend_level)) -#define Is_sokoend_level(x) (on_level(x, &sokoend_level)) + +/* These both can't be zero, or dungeon_topology isn't init'd / restored */ +#define Lassigned(y) ((y)->dlevel || (y)->dnum) +#define Lcheck(x,z) (Lassigned(z) && on_level(x, z)) + +#define Is_astralevel(x) (Lcheck(x, &astral_level)) +#define Is_earthlevel(x) (Lcheck(x, &earth_level)) +#define Is_waterlevel(x) (Lcheck(x, &water_level)) +#define Is_firelevel(x) (Lcheck(x, &fire_level)) +#define Is_airlevel(x) (Lcheck(x, &air_level)) +#define Is_medusa_level(x) (Lcheck(x, &medusa_level)) +#define Is_oracle_level(x) (Lcheck(x, &oracle_level)) +#define Is_valley(x) (Lcheck(x, &valley_level)) +#define Is_juiblex_level(x) (Lcheck(x, &juiblex_level)) +#define Is_asmo_level(x) (Lcheck(x, &asmodeus_level)) +#define Is_baal_level(x) (Lcheck(x, &baalzebub_level)) +#define Is_wiz1_level(x) (Lcheck(x, &wiz1_level)) +#define Is_wiz2_level(x) (Lcheck(x, &wiz2_level)) +#define Is_wiz3_level(x) (Lcheck(x, &wiz3_level)) +#define Is_sanctum(x) (Lcheck(x, &sanctum_level)) +#define Is_portal_level(x) (Lcheck(x, &portal_level)) +#define Is_rogue_level(x) (Lcheck(x, &rogue_level)) +#define Is_stronghold(x) (Lcheck(x, &stronghold_level)) +#define Is_bigroom(x) (Lcheck(x, &bigroom_level)) +#define Is_qstart(x) (Lcheck(x, &qstart_level)) +#define Is_qlocate(x) (Lcheck(x, &qlocate_level)) +#define Is_nemesis(x) (Lcheck(x, &nemesis_level)) +#define Is_knox(x) (Lcheck(x, &knox_level)) +#define Is_mineend_level(x) (Lcheck(x, &mineend_level)) +#define Is_sokoend_level(x) (Lcheck(x, &sokoend_level)) #define In_sokoban(x) ((x)->dnum == sokoban_dnum) #define Inhell In_hell(&u.uz) /* now gehennom */