diff --git a/hyper.h b/hyper.h index 5af7bd56..037e419a 100644 --- a/hyper.h +++ b/hyper.h @@ -1472,7 +1472,7 @@ bool isAlchAny(eWall w); bool isAlchAny(cell *c); #define YDIST 101 -#define MODECODES 255 +#define MODECODES (1ll<<61) extern cellwalker cwt; // player character position @@ -1481,7 +1481,7 @@ extern array kills; extern int explore[10], exploreland[10][landtypes], landcount[landtypes]; -typedef int modecode_t; +typedef flagtype modecode_t; extern map > hiitems; extern eLand firstland, specialland; @@ -3832,7 +3832,7 @@ enum eOrbLandRelation { namespace torusconfig { extern int sdx, sdy; - enum eTorusMode { + enum eTorusMode : char { tmSingleHex, tmSingle, tmSlantedHex, diff --git a/yendor.cpp b/yendor.cpp index c6404ecc..dff60b1f 100644 --- a/yendor.cpp +++ b/yendor.cpp @@ -955,6 +955,31 @@ int modecode() { mct += irr::density_code() << 21; // 8 bits } + // 32 bits [29..61) for geometry specifics + if(torus) { + mct += ll(torusconfig::dx) << 29; + mct += ll(torusconfig::dy) << 37; + mct += ll(torusconfig::qty) << 45; + mct += ll(torusconfig::torusmode) << 53; + } + + if(geometry == gQuotient) { + mct += ll(current_extra) << 29; + mct += ll(fgeomextras[current_extra].current_prime_id) << 37; + } + + if(geometry == gCrystal) { + mct += ll(ginf[geometry].sides) << 29; + mct += ll(ginf[geometry].vertices) << 37; + } + + if(geometry == gArchimedean) { + unsigned res = 7; + for(char c: arcm::current.symbol) res = res * 157 + c; + mct += ll(res) << 29; + if(PURE) mct ^= (1<<29); + } + return mct; }