From 82f24b4b6c2e528aa7d310243a1924ddfbdcfa79 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Thu, 5 Sep 2019 12:00:55 +0200 Subject: [PATCH] exporting necessary stuff all over (in progress) --- basegraph.cpp | 20 +---- cell.cpp | 2 + classes.cpp | 30 +++---- complex.cpp | 224 +++++++++++++++++++++++++---------------------- complex2.cpp | 26 +++--- drawing.cpp | 22 ++--- expansion.cpp | 21 ++--- fake-mobile.cpp | 2 +- fieldpattern.cpp | 4 +- flags.cpp | 76 ++++++++-------- floorshapes.cpp | 2 +- game.cpp | 83 ++++++++++-------- geometry.cpp | 20 ++--- goldberg.cpp | 14 +-- heptagon.cpp | 2 +- hyperpoint.cpp | 14 +-- inventory.cpp | 14 +-- irregular.cpp | 14 +-- landgen.cpp | 2 +- landlock.cpp | 4 +- langen.cpp | 7 +- monstergen.cpp | 2 +- nonisotropic.cpp | 17 ++-- orbgen.cpp | 6 +- pattern2.cpp | 16 ++-- patterns.cpp | 14 +-- polygons.cpp | 6 +- savemem.cpp | 14 +-- screenshot.cpp | 5 +- shaders.cpp | 77 +++++++++++----- system.cpp | 2 +- usershapes.cpp | 4 +- util.cpp | 12 +-- yendor.cpp | 58 ++++++------ 34 files changed, 451 insertions(+), 385 deletions(-) diff --git a/basegraph.cpp b/basegraph.cpp index 6c61c71d..73b2574d 100644 --- a/basegraph.cpp +++ b/basegraph.cpp @@ -557,8 +557,7 @@ EX void setGLProjection(color_t col IS(backcolor)) { glClear(GL_DEPTH_BUFFER_BIT); } -inline int next_p2 (int a ) -{ +EX int next_p2 (int a ) { int rval=1; // rval<<=1 Is A Prettier Way Of Writing rval*=2; while(rval tver; glhr::textured_vertex charvertex(int x1, int y1, ld tx, ld ty) { @@ -1263,7 +1247,7 @@ ld textscale() { return vid.fsize / (current_display->radius * cgi.crossf) * (1+vid.alpha) * 2; } -bool setfsize = true; +EX bool setfsize = true; EX bool vsync_off; diff --git a/cell.cpp b/cell.cpp index 87a641f8..7d3c0978 100644 --- a/cell.cpp +++ b/cell.cpp @@ -605,7 +605,9 @@ EX int randpatternCode(cell *c, int rval) { return 0; } +#if HDR #define RANDITER 31 +#endif char rpm_memoize[3][256][RANDITER+1]; diff --git a/classes.cpp b/classes.cpp index 4a4a86bd..ee08de3b 100644 --- a/classes.cpp +++ b/classes.cpp @@ -61,7 +61,7 @@ const char *trollhelp = "A big monster from the Living Caves. A dead Troll will be reunited " "with the rocks, causing some walls to grow around its body."; -const char *trollhelp2 = +EX const char *trollhelp2 = " Additionally, all items around the killed Troll will be destroyed."; const char *trollhelpX = @@ -293,7 +293,7 @@ const char *GENDERSWITCH = NODESC; // --- monsters --- -const char *rosedesc = +EX const char *rosedesc = "Each eight turns, each rosebush at distance at most 5 from you will " "release a wave of alluring scent. Creatures on the frontwave " "will move towards where the scent came from. Even if it causes them " @@ -301,7 +301,7 @@ const char *rosedesc = "Ivies, Ghosts, Rock Snakes, Rose Ladies and Lords, and monsters restricted to a specific " "terrain are immune to scents."; -const char *warpdesc = +EX const char *warpdesc = "This part of the world is warped, restricting the movement somewhat. " "\"Diagonal\" movement and attacking between triangular cells is not allowed. " "Flash, Storms, and Freedom spells ignore this, and Ghosts can move, attack, and " @@ -460,7 +460,7 @@ const landtype linf[landtypes] = { #include "content.cpp" }; -vector land_tac = { +EX vector land_tac = { {laIce, 10, 1}, {laDesert, 10, 1}, {laHunting, 5, 2}, {laMotion, 10, 1}, {laCaves, 10, 1}, {laAlchemist, 10, 1}, @@ -497,7 +497,7 @@ vector land_tac = { {laWestWall, 10, 1}, }; -vector randlands = { +EX vector randlands = { laIce, laDesert, laCaves, laAlchemist, laGraveyard, laPower, laLivefjord, laZebra, laRlyeh, laDryForest, laEmerald, laWineyard, laDeadCaves, laRedRock, laOvergrown, laWildWest, laWarpCoast, laRuins, laBull, laDragon, laReptile, laDocks @@ -516,18 +516,18 @@ static const flagtype qsSMALLBF = qsSMALLB | qsFIELD; static const flagtype qsSMALLBE = qsSMALLB | qELLIPTIC; static const flagtype qsBP = qBINARY | qPENROSE; -geometryinfo1 giEuclid2 = { gcEuclid, 2, 2, 3, {1,1, 0,0 } }; -geometryinfo1 giHyperb2 = { gcHyperbolic, 2, 2, 3, {1,1,-1,0 } }; -geometryinfo1 giSphere2 = { gcSphere, 2, 2, 3, {1,1,+1,0 } }; +EX geometryinfo1 giEuclid2 = { gcEuclid, 2, 2, 3, {1,1, 0,0 } }; +EX geometryinfo1 giHyperb2 = { gcHyperbolic, 2, 2, 3, {1,1,-1,0 } }; +EX geometryinfo1 giSphere2 = { gcSphere, 2, 2, 3, {1,1,+1,0 } }; -geometryinfo1 giEuclid3 = { gcEuclid, 3, 3, 4, {1,1, 1,0 } }; -geometryinfo1 giHyperb3 = { gcHyperbolic, 3, 3, 4, {1,1, 1,-1} }; -geometryinfo1 giSphere3 = { gcSphere, 3, 3, 4, {1,1, 1,+1} }; +EX geometryinfo1 giEuclid3 = { gcEuclid, 3, 3, 4, {1,1, 1,0 } }; +EX geometryinfo1 giHyperb3 = { gcHyperbolic, 3, 3, 4, {1,1, 1,-1} }; +EX geometryinfo1 giSphere3 = { gcSphere, 3, 3, 4, {1,1, 1,+1} }; -geometryinfo1 giSol = { gcSol, 3, 3, 4, {1,1, 1,0 } }; -geometryinfo1 giNil = { gcNil, 3, 3, 4, {1,1, 1,0 } }; -geometryinfo1 giProduct = { /* will be filled in product::configure() */ }; -geometryinfo1 giSL2 = { gcSL2, 3, 3, 4, {1,1,-1,-1} }; +EX geometryinfo1 giSol = { gcSol, 3, 3, 4, {1,1, 1,0 } }; +EX geometryinfo1 giNil = { gcNil, 3, 3, 4, {1,1, 1,0 } }; +EX geometryinfo1 giProduct = { /* will be filled in product::configure() */ }; +EX geometryinfo1 giSL2 = { gcSL2, 3, 3, 4, {1,1,-1,-1} }; /** list of available geometries */ vector ginf = { diff --git a/complex.cpp b/complex.cpp index 8176a5fb..32294e8d 100644 --- a/complex.cpp +++ b/complex.cpp @@ -12,7 +12,7 @@ namespace hr { EX namespace whirlwind { - int fzebra3(cell *c) { + EX int fzebra3(cell *c) { if(archimedean) return 0; if(euclid) { if(fulltorus) return 0; @@ -31,7 +31,7 @@ EX namespace whirlwind { return zebra3(c); } - void switchTreasure(cell *c) { + EX void switchTreasure(cell *c) { c->item = itNone; if(safety) return; if(hrand(5000) < PT(100 + 2 * (kills[moAirElemental] + kills[moWindCrow]), 200) && notDippingFor(itWindstone) @@ -41,7 +41,7 @@ EX namespace whirlwind { placeLocalOrbs(c); } - int cat(cell *c) { + EX int cat(cell *c) { if(c->land != laWhirlwind) return 0; if(c->wall != waNone && c->wall != waChasm && c->wall != waSea && !isAlchAny(c) && @@ -53,11 +53,12 @@ EX namespace whirlwind { } cell *where; - int dfrom[2], dto[2], qdirs; + int dfrom[2], dto[2]; + EX int qdirs; int gdist(int d, int e) { return dirdiff(d-e, where->type); } - void calcdirs(cell *c) { + EX void calcdirs(cell *c) { where = c; int d = cat(c); qdirs = 0; @@ -87,7 +88,7 @@ EX namespace whirlwind { return min(gdist(d, tab[0]), gdist(d, tab[1])); } - int winddir(int d) { + EX int winddir(int d) { if(d == -1) return 0; int mdf = mindist(d, dfrom); int mdt = mindist(d, dto); @@ -146,7 +147,7 @@ EX namespace whirlwind { pickupMovedItems(whirlline[i]); } - void move() { + EX void move() { manual_celllister cl; for(int i=0; ilistindex = charges[i].otmp; charges.resize(0); @@ -434,18 +435,20 @@ EX namespace elec { draw(dcal[i], ecCharged); } - bool affected(cell *c) { + EX bool affected(cell *c) { if(c->listindex >= 0 && c->listindex < isize(charges) && charges[c->listindex].c == c) return charges[c->listindex].fire; return false; } + #if HDR struct builder { builder() { init(); } ~builder() { cleanup(); } }; + #endif - void act() { + EX void act() { int k = tkills(); for(int i=0; iland == laStorms && !afterOrb) @@ -458,7 +461,7 @@ EX namespace elec { // 0 = no close escape, 1 = close escape, 2 = message already shown EX int lightningfast; - void checklightningfast() { + EX void checklightningfast() { if(lightningfast == 1) { addMessage(XLAT("Wow! That was close.")); lightningfast = 2; @@ -505,11 +508,12 @@ struct info { EX bool forceMouse = false; EX bool gotoPrincess = false; EX bool nodungeon = false; - bool squeaked = false; + EX bool squeaked = false; - int saveHP = 0, saveArmedHP = 0; + EX int saveHP = 0; + EX int saveArmedHP = 0; - int reviveAt; + EX int reviveAt; vector infos; @@ -530,7 +534,7 @@ struct info { return i->id; } - void newFakeInfo(cell *c) { + EX void newFakeInfo(cell *c) { info *i = new info; i->prison = NULL; i->princess = c; @@ -542,7 +546,7 @@ struct info { assign(i); } - info *getPrisonInfo(cell *c) { + EX info *getPrisonInfo(cell *c) { if(euclid || quotient || sphere) return NULL; if(c->land != laPalace) return NULL; if(!c->master->alt) return NULL; @@ -552,7 +556,7 @@ struct info { return infos[ev]; } - info *getPrincessInfo(cell *c) { + EX info *getPrincessInfo(cell *c) { for(int i=0; iprincess == c) { while(i) { infos[i]->id = i-1; assign(infos[i]); @@ -565,7 +569,7 @@ struct info { return NULL; } - int dist(cell *c) { + EX int dist(cell *c) { if(c->land != laPalace && c->land != laDungeon) return OUT_OF_PALACE; else if(quotient || sphere || fulltorus) return OUT_OF_PRISON; else if(euclid) return celldistAlt(c); @@ -597,7 +601,7 @@ struct info { return true; } - void bringBack() { + EX void bringBack() { if(bringBackAt(cwt.peek())) return; for(int i=1; ibestdist <= 3) princess->monst = moNone; else if(i) setdist(i, OUT_OF_PRISON); } - void move(cell *ct, cell *cf) { + EX void move(cell *ct, cell *cf) { if(euclid) return; princess::info *i = princess::getPrincessInfo(cf); if(!i) { @@ -655,7 +659,7 @@ struct info { } } - void mouseSqueak(cell *c) { + EX void mouseSqueak(cell *c) { eMonster m = c->monst; info *i = getPrisonInfo(c); int d = dist(c); @@ -679,7 +683,7 @@ struct info { addMessage(XLAT("%The1 squeaks excitedly!", m)); } - void line(cell *c) { + EX void line(cell *c) { int d = (euclid || c->master->alt) ? celldistAlt(c) : 200; eMonster m = c->monst; @@ -749,7 +753,7 @@ struct info { msgid++; } - void playernear(cell *c) { + EX void playernear(cell *c) { info *i = getPrisonInfo(c); int d = dist(c); // if(i) printf("d=%d bn=%d\n", d, i->bestnear); @@ -778,9 +782,9 @@ EX namespace clearing { EX std::map bpdata; - cell *current_root; + EX cell *current_root; - void new_root() { + EX void new_root() { if(!current_root || current_root->monst != moMutant) { auto& ac = currentmap->allcells(); int iter = 0; @@ -955,7 +959,7 @@ EX } EX namespace whirlpool { - bool escaped = false; // escaped the Whirlpool? + EX bool escaped = false; // escaped the Whirlpool? // next == +1 -> next // next == -1 -> prev @@ -1074,7 +1078,7 @@ EX namespace whirlpool { whirlMove(whirlline[z-1], NULL); } - void move() { + EX void move() { manual_celllister cl; for(int i=0; i> mirrors; - static const int LIGHTNING = -1; // passed instead of cpid + EX vector> mirrors; + #if HDR + constexpr int LIGHTNING = -1; // passed instead of cpid + #endif bool noMirrorOn(cell *c) { return c->monst || (!shmup::on && isPlayerOn(c)) || (geometry != gFieldQuotient && geometry != gTorus && c->cpdist > gamerange()); @@ -1167,12 +1173,12 @@ EX namespace mirror { m.second.at->monst = moMimic; } - void destroyAll() { + EX void destroyAll() { unlist(); mirrors.clear(); } - void createMirror(cellwalker cw, int cpid) { + EX void createMirror(cellwalker cw, int cpid) { if(!shmup::on && inmirror(cw)) cw = reflect(cw); if(cpid == LIGHTNING) @@ -1223,7 +1229,7 @@ EX namespace mirror { } #endif - void createMirrors(cellwalker cw, int cpid) { + EX void createMirrors(cellwalker cw, int cpid) { if(penrose || sol) return; @@ -1261,7 +1267,7 @@ EX namespace mirror { } } - void createMirages(cellwalker cw, int cpid) { + EX void createMirages(cellwalker cw, int cpid) { #if CAP_ARCM if(archimedean) { create_archimedean(cw, cpid, false); @@ -1335,7 +1341,7 @@ EX namespace mirror { } } - bool isKilledByMirror(cell *c) { + EX bool isKilledByMirror(cell *c) { for(auto& m: mirrors) { cell *c1 = (m.second + wstep).at; if(inmirror(c1)) c1 = reflect(cellwalker(c1, 0, false)).at; @@ -1410,7 +1416,7 @@ EX namespace mirror { list(); } - void breakAll() { + EX void breakAll() { destroyKilled(); unlist(); if(numplayers() == 1) @@ -1576,12 +1582,12 @@ EX namespace mirror { EX namespace hive { - int hivehard() { + EX int hivehard() { return items[itRoyalJelly] + hardness_empty(); // 0, 5, 40, 135 } - eMonster randomHyperbug() { + EX eMonster randomHyperbug() { int h = hivehard(); if(hrand(200) < h) return moBug2; @@ -1720,7 +1726,7 @@ EX namespace hive { isIvy(c->monst) || isMutantIvy(c->monst); } - void movebugs() { + EX void movebugs() { buginfo.clear(); for(int k=0; kLHU.heat; } +#endif -namespace heat { +EX namespace heat { - void affect(cell *c, double delta) { + EX void affect(cell *c, double delta) { if(isIcyLand(c)) HEAT(c) += delta; } - double absheat(cell *c) { + EX double absheat(cell *c) { if(c->land == laCocytus) return HEAT(c) -.6; if(c->land == laIce || c->land == laBlizzard) return HEAT(c) -.4; return 0; } - double celsius(cell *c) { return absheat(c) * 60; } + EX double celsius(cell *c) { return absheat(c) * 60; } // adjust to the improved heat transfer algorithm in 9.4 const float FIX94 = 1.5; - vector offscreen_heat, offscreen_fire; // offscreen cells to take care off + EX vector offscreen_heat, offscreen_fire; // offscreen cells to take care off - void processheat(double rate = 1) { + EX void processheat(double rate IS(1)) { if(markOrb(itOrbSpeed)) rate /= 2; if(racing::on) return; int oldmelt = kills[0]; @@ -2078,7 +2086,9 @@ namespace heat { offscreen_heat.push_back(c); } + #if HDR #define MELTCOLOR 0xA04040 + #endif for(int i=0; i > newfires; - void processfires() { + EX void processfires() { newfires.clear(); vector offscreen2; @@ -2223,13 +2233,13 @@ namespace heat { offscreen_fire = move(offscreen2); } - } +EX } bool gardener = false; bool lifebrought = false; // was Life brought to the Dead Caves? -void livecaves() { +EX void livecaves() { vector& allcells = currentmap->allcells(); int dcs = isize(allcells); @@ -2398,10 +2408,11 @@ void livecaves() { /* evolver */ EX namespace tortoise { - map emap; - map babymap; - int last; + EX map emap; + EX map babymap; + EX int last; + #if HDR enum tflag { tfShell, tfScute0, tfScute1, tfScute2, tfScute3, tfEdge1, tfEdge, tfEdge3, @@ -2411,16 +2422,17 @@ EX namespace tortoise { tfShellDark, tfSkinDark, tfCOUNT }; + #endif - const int numbits = (int) tfCOUNT; - const int mask = (1<> i)&1) bi++; return bi; @@ -2430,7 +2442,7 @@ EX namespace tortoise { EX int getRandomBits() { return hrand(1 << numbits); } - bool seek() { return items[itBabyTortoise] % 5; } + EX bool seek() { return items[itBabyTortoise] % 5; } EX int seekbits; double seekval[numbits]; double currval[numbits]; @@ -2470,18 +2482,18 @@ EX namespace tortoise { return res; } - int diff(int bits) { return countBits(bits ^ tortoise::seekbits); } + EX int diff(int bits) { return countBits(bits ^ tortoise::seekbits); } int progress(int bits) { return numbits - diff(bits); } - string measure(int bits) { + EX string measure(int bits) { return "(" + its(progress(bits)) + "/" + its(tortoise::numbits) + ")"; } EX } -namespace dragon { +EX namespace dragon { - int whichturn; // which turn has the target been set on - cell *target; // actually for all Orb of Control + EX int whichturn; // which turn has the target been set on + EX cell *target; // actually for all Orb of Control void pullback(cell *c) { int maxlen = 1000; @@ -2499,7 +2511,7 @@ namespace dragon { bool dragbugs = false; - cell *findhead(cell *c) { + EX cell *findhead(cell *c) { cell *cor = c; int maxlen=1000; findhead: @@ -2545,7 +2557,7 @@ namespace dragon { return 0; } - void kill(cell *c, eMonster who) { + EX void kill(cell *c, eMonster who) { int delay = false; kills[moDragonHead]++; int penalty = 0; @@ -2576,7 +2588,7 @@ namespace dragon { } } - int totalhp(cell *c) { + EX int totalhp(cell *c) { int total = 0; int maxlen = 1000; while(maxlen-->0) { @@ -2627,7 +2639,7 @@ namespace dragon { } } - bool move(cell *dt, cell *df) { + EX bool move(cell *dt, cell *df) { if(df->monst == moDragonHead) { dt->mondir = neighborId(dt,df); // printf("pull back\n"); @@ -2658,7 +2670,7 @@ namespace dragon { return false; } - } +EX } EX namespace sword { @@ -2679,7 +2691,7 @@ EX namespace sword { void possible_divisor(int s) { sword_angles *= s / gcd(sword_angles, s); } - void determine_sword_angles() { + EX void determine_sword_angles() { sword_angles = 2; if(SWORDDIM == 3) sword_angles = 1; else if(IRREGULAR) sword_angles = 840; @@ -2721,9 +2733,9 @@ EX namespace sword { } eItem orbof(bool rev) { return rev ? itOrbSword2 : itOrbSword; } - int orbcount(bool rev) { return items[orbof(rev)]; } + EX int orbcount(bool rev) { return items[orbof(rev)]; } - cell *pos(int id, bool rev) { + EX cell *pos(int id, bool rev) { if(!orbcount(rev)) return NULL; return pos(playerpos(id), dir[id], rev); } @@ -2736,7 +2748,7 @@ EX namespace sword { return false; } - bool isnear(cell *where) { + EX bool isnear(cell *where) { if(at(where, false)) return true; forCellEx(w2, where) if(at(w2, false)) return true; return false; @@ -2771,7 +2783,7 @@ EX namespace sword { return cspin(0, 1, 0.1) * cspin(0, 2, 0.1) * cspin(1, 2, 0.1) * Id; } - sworddir initial(cell *c) { + EX sworddir initial(cell *c) { sworddir res; res.angle = (sword::sword_angles / cwt.at->type + 1) / 2; if(SWORDDIM == 3) res.T = initial_matrix(); @@ -2783,7 +2795,7 @@ EX namespace sword { if(SWORDDIM == 3) dir[i].T = initial_matrix(); } - void reset() { + EX void reset() { items[itOrbSword] = items[itOrbSword2] = 0; shuffle(multi::cpid); } @@ -2793,15 +2805,15 @@ EX namespace sword { } EX } -namespace kraken { +EX namespace kraken { - cell *head(cell *c) { + EX cell *head(cell *c) { if(c->monst == moKrakenH) return c; if(c->monst == moKrakenT) return c->move(c->mondir); return NULL; } - void kill(cell *c, eMonster who) { + EX void kill(cell *c, eMonster who) { drawParticles(c, minf[moKrakenH].color, 16); c->monst = moNone; if(checkOrb(who, itOrbUndeath)) c->monst = moFriendlyGhost; @@ -2821,7 +2833,7 @@ namespace kraken { } } - int totalhp(cell *c) { + EX int totalhp(cell *c) { int total = 0; for(int i=0; itype; i++) if(c->move(i)->monst == moKrakenT) @@ -2837,7 +2849,7 @@ namespace kraken { forCellEx(c2, c) c2->stuntime = 1; } - void attacks() { + EX void attacks() { pathdata pd(2); bool offboat[MAXPLAYER]; for(int i=0; imove(c->mondir); if(!isWatery(c)) return; @@ -2934,14 +2946,14 @@ namespace kraken { return; } - } +EX } bool barrierhept(cell *c) { return c->bardir != NOBARRIERS && c->bardir != NODIR; } #if CAP_FIELD -namespace prairie { +EX namespace prairie { using namespace fieldpattern; @@ -2950,7 +2962,7 @@ namespace prairie { return 0; } - void spread(cell *c, cell *from) { + EX void spread(cell *c, cell *from) { int rd; c->LHU.fi.flowerdist = 8; @@ -3034,12 +3046,12 @@ namespace prairie { #define RLOW (sphere?(PURE?7:6):PURE?4:2) #define RHIGH (sphere?(PURE?8:9):PURE?11:13) - bool no_worms(cell *c) { + EX bool no_worms(cell *c) { int rv = c->LHU.fi.rval; return rv > RLOW+1 && rv < RHIGH-1; } - bool isriver(cell *c) { + EX bool isriver(cell *c) { return c->land == laPrairie && c->LHU.fi.rval <= RHIGH && c->LHU.fi.rval >= RLOW; } @@ -3047,7 +3059,7 @@ namespace prairie { return c->LHU.fi.rval <= 8 && c->LHU.fi.rval >= 7; } - bool nearriver(cell *c) { + EX bool nearriver(cell *c) { return c->LHU.fi.rval == RHIGH+1 || c->LHU.fi.rval == RLOW-1; } @@ -3093,9 +3105,9 @@ namespace prairie { } } - vector beaststogen; + EX vector beaststogen; - void generateBeast(cell *c) { + EX void generateBeast(cell *c) { int beastdistance = min(beastdist(c, 1), beastdist(c, -1)); if(hrand(1000) >= 15 * beastdistance + 2 * items[itGreenGrass]) return; c->monst = moHerdBull; @@ -3153,7 +3165,7 @@ namespace prairie { } } - void move() { + EX void move() { if(chaosmode) return; manual_celllister cl; for(int i=0; iland != laCA) return; vector& allcells = currentmap->allcells(); int dcs = isize(allcells); @@ -3282,7 +3294,7 @@ namespace ca { c->wall = willlive[i] ? waFloorA : waNone; } } - } +EX } auto ccm = addHook(clearmemory, 0, [] () { heat::offscreen_heat.clear(); @@ -3480,13 +3492,13 @@ EX namespace windmap { return windmap::windcodes[windmap::getId(c)]; } - } +EX } #endif // Halloween namespace EX namespace halloween { - cell *dragoncells[4]; + EX cell *dragoncells[4]; vector srch; cell *farempty(bool lastresort = false) { @@ -3730,7 +3742,7 @@ EX } // ... also includes the Ivory Tower -namespace dungeon { +EX namespace dungeon { void towerError(cell *c) { // only care in the standard geometry -- weird ones are intentionally left buggy @@ -4039,7 +4051,7 @@ namespace dungeon { bool is02(int i) { return i == 0 || i == 2; } - void all(cell *c, int d) { + EX void all(cell *c, int d) { if(d == 8 && (c->land == laIvoryTower || c->land == laDungeon) && !euclid) { if(hrand(1000) < 75 && (WDIM == 3 || (c->landparam & 1))) { @@ -4061,6 +4073,6 @@ namespace dungeon { if(d == (BARLEV == 8 ? 7 : 8) && c->land == laDungeon) build(c); if(d == 7 && c->land == laDungeon) buildPlates(c); } - } +EX } } diff --git a/complex2.cpp b/complex2.cpp index 9054de3f..03de7a32 100644 --- a/complex2.cpp +++ b/complex2.cpp @@ -79,7 +79,7 @@ EX namespace brownian { } } - void dissolve_brownian(cell *c, int x) { + EX void dissolve_brownian(cell *c, int x) { if(c->land == laBrownian) { if(among(c->wall, waNone, waStrandedBoat, waMineOpen, waFire)) { if(c->landparam >= 4 * level) c->landparam = 4 * level - 1; @@ -91,7 +91,7 @@ EX namespace brownian { } } - void dissolve(cell *c, int x) { + EX void dissolve(cell *c, int x) { destroyTrapsAround(c); if(c->land == laBrownian) dissolve_brownian(c, x); @@ -146,7 +146,7 @@ EX namespace brownian { if(!c2->monst && c2->wall != waBoat) c2->monst = moAcidBird; } - void apply_futures(cell *c) { + EX void apply_futures(cell *c) { if(futures.count(c)) { auto m = move(futures[c]); futures.erase(c); @@ -175,7 +175,7 @@ EX namespace brownian { } } - colortable colors = { 0x603000, 0x804000, 0xA05000, 0xC09050, 0xE0D0A0 }; + EX colortable colors = { 0x603000, 0x804000, 0xA05000, 0xC09050, 0xE0D0A0 }; color_t get_color(int y) { return @@ -185,7 +185,7 @@ EX namespace brownian { colors[4]; } - color_t& get_color_edit(int y) { + EX color_t& get_color_edit(int y) { return y < level/2 ? colors[0] : y < level ? colors[1] : @@ -201,11 +201,11 @@ EX namespace brownian { }) + addHook(clearmemory, 0, [] () { futures.clear(); }) + addHook(hooks_gamedata, 0, [] (gamedata* gd) { gd->store(futures); }); - } +EX } -namespace westwall { +EX namespace westwall { - void switchTreasure(cell *c) { + EX void switchTreasure(cell *c) { c->item = itNone; if(safety) return; if(hrand(5000) < PT(100 + 2 * (kills[moAirElemental] + kills[moWindCrow]), 200) && c->landparam >= 5 + items[itWest]) @@ -255,7 +255,7 @@ namespace westwall { pickupMovedItems(whirlline[i]); } - void move() { + EX void move() { manual_celllister cl; if(gravity_state == gsLevitation) return; for(cell *c: dcal) moveAt(c, cl); @@ -272,8 +272,9 @@ namespace westwall { } } } - } +EX } +#if HDR struct variant_feature { color_t color_change; int rate_change; @@ -281,9 +282,12 @@ struct variant_feature { void (*build)(cell*); }; +extern array variant_features; +#endif + #define VF [] (cell *c) -const array variant_features {{ +array variant_features {{ variant_feature{(color_t)(-0x202020), 5, moNecromancer, VF { if(c->wall == waNone && hrand(1500) < 20) c->wall = waFreshGrave; if(hrand(20000) < 10 + items[itVarTreasure]) diff --git a/drawing.cpp b/drawing.cpp index fbab8013..80f2cf65 100644 --- a/drawing.cpp +++ b/drawing.cpp @@ -116,13 +116,11 @@ EX color_t poly_outline; EX vector> ptds; #if CAP_GL -color_t text_color; -int text_shift; -GLuint text_texture; -int texts_merged; -int shapes_merged; - -vector text_vertices; +EX color_t text_color; +EX int text_shift; +EX GLuint text_texture; +EX int texts_merged; +EX int shapes_merged; #if MINIMIZE_GL_CALLS color_t triangle_color, line_color; @@ -191,18 +189,20 @@ SDL_Surface *aux; #endif #if CAP_POLY +#if HDR #define POLYMAX 60000 +#endif EX vector glcoords; #endif -int spherespecial, spherephase; +EX int spherespecial, spherephase; #if CAP_POLY int polyi; -int polyx[POLYMAX], polyxr[POLYMAX], polyy[POLYMAX]; +EX int polyx[POLYMAX], polyxr[POLYMAX], polyy[POLYMAX]; int poly_flags; @@ -426,7 +426,7 @@ void polylineColor(SDL_Surface *s, int *x, int *y, int polyi, color_t col) { lineColor(s, x[i-1], y[i-1], x[i], y[i], col); } -void filledPolygonColorI(SDL_Surface *s, int* px, int *py, int polyi, color_t col) { +EX void filledPolygonColorI(SDL_Surface *s, int* px, int *py, int polyi, color_t col) { std::vector spx(px, px + polyi); std::vector spy(py, py + polyi); filledPolygonColor(s, spx.data(), spy.data(), polyi, col); @@ -1486,7 +1486,7 @@ ld xintval(const hyperpoint& h) { return -intval(h, C0); } -ld backbrightness = .25; +EX ld backbrightness = .25; purehookset hook_drawqueue; diff --git a/expansion.cpp b/expansion.cpp index c899ebca..28d72257 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -115,7 +115,7 @@ void bignum::addmul(const bignum& b, int factor) { while(isize(digits) && digits.back() == 0) digits.pop_back(); } -bignum hrand(bignum b) { +EX bignum hrand(bignum b) { bignum res; int d = isize(b.digits); while(true) { @@ -126,7 +126,7 @@ bignum hrand(bignum b) { } } -void operator ++(bignum &b, int) { +EX void operator ++(bignum &b, int) { int i = 0; while(true) { if(isize(b.digits) == i) { b.digits.push_back(1); break; } @@ -141,7 +141,7 @@ void operator ++(bignum &b, int) { } } -void operator --(bignum &b, int) { +EX void operator --(bignum &b, int) { int i = 0; while(true) { if(isize(b.digits) == i) { b.digits.push_back(bignum::BASE-1); break; } @@ -444,7 +444,7 @@ void expansion_analyzer::reset() { descendants.clear(); } -int type_in(expansion_analyzer& ea, cell *c, const cellfunction& f) { +EX int type_in(expansion_analyzer& ea, cell *c, const cellfunction& f) { if(!ea.N) ea.preliminary_grouping(), ea.reduce_grouping(); vector res; res.push_back(subtype(c) * 4 + 2); @@ -483,7 +483,7 @@ int type_in_quick(expansion_analyzer& ea, cell *c, const cellfunction& f) { return -1; } -bool sizes_known() { +EX bool sizes_known() { if(GDIM == 3) return false; if(bounded) return false; // Castle Anthrax is infinite @@ -494,7 +494,7 @@ bool sizes_known() { return true; } -bool trees_known() { +EX bool trees_known() { return sizes_known() && !(BITRUNCATED && a4 && S7 <= 5); } @@ -525,7 +525,7 @@ bool mod_allowed() { return cheater || autocheat || archimedean || tour::on; } -int curr_dist(cell *c) { +EX int curr_dist(cell *c) { switch(distance_from) { case dfPlayer: return c->cpdist < INFD ? c->cpdist : celldistance(cwt.at, c); @@ -575,7 +575,7 @@ EX int parent_id(cell *c, int which, const cellfunction& cf) { // set which=1,bonus=1 to get right neighbor on level -void generate_around(cell *c) { +EX void generate_around(cell *c) { forCellCM(c2, c) if(c2->mpdist > BARLEV) setdist(c2, BARLEV, c); } @@ -623,12 +623,13 @@ EX namespace ts { EX } -bool viewdists = false, use_color_codes = true, use_analyzer = true, show_distance_lists = true; +EX bool viewdists = false; +bool use_color_codes = true, use_analyzer = true, show_distance_lists = true; int first_distance = 0, scrolltime = 0; bool scrolling_distances = false; -map expcolors; +EX map expcolors; color_t distribute_color(int id) { if(expcolors.count(id)) return expcolors[id]; diff --git a/fake-mobile.cpp b/fake-mobile.cpp index 0bd98b44..0afc8963 100644 --- a/fake-mobile.cpp +++ b/fake-mobile.cpp @@ -13,7 +13,7 @@ namespace hr { #include -#include "init.cpp" +#include "hyper.cpp" #include #include diff --git a/fieldpattern.cpp b/fieldpattern.cpp index 66f686cc..5e82948a 100644 --- a/fieldpattern.cpp +++ b/fieldpattern.cpp @@ -766,7 +766,7 @@ void info() { EX fpattern current_quotient_field = fpattern(0); EX fpattern fp_invalid = fpattern(0); -bool quotient_field_changed; +EX bool quotient_field_changed; EX struct fpattern& getcurrfp() { if(geometry == gFieldQuotient && quotient_field_changed) @@ -852,7 +852,7 @@ EX void enableFieldChange() { fieldpattern::current_quotient_field.init(gxcur.primes[gxcur.current_prime_id].p); } -} +EX } #define currfp fieldpattern::getcurrfp() diff --git a/flags.cpp b/flags.cpp index 2dbf783e..2cc92dcd 100644 --- a/flags.cpp +++ b/flags.cpp @@ -9,12 +9,13 @@ #include "hyper.h" namespace hr { +#if HDR const flagtype& classflag(eItem it) { return iinf[it].flags; } const flagtype& classflag(eWall w) { return winf[w].flags; } const flagtype& classflag(eMonster m) { return minf[m].flags; } const flagtype& classflag(eLand l) { return linf[l].flags; } -#define ANYFLAGCHECK(name, cond, field, enum) bool name(enum w) { flagtype flag = classflag(w); return cond; } bool name(cell *c) { return name(c->field); } +#define ANYFLAGCHECK(name, cond, field, enum) inline bool name(enum w) { flagtype flag = classflag(w); return cond; } inline bool name(cell *c) { return name(c->field); } #define MONFLAGCHECK(name, cond) ANYFLAGCHECK(name, cond, monst, eMonster) #define WALLFLAGCHECK(name, cond) ANYFLAGCHECK(name, cond, wall, eWall) @@ -116,26 +117,27 @@ ITEMFLAGCHECK(isProtectionOrb, flag & IF_PROTECTION) ITEMFLAGCHECK(isEmpathyOrb, flag & IF_EMPATHY) ITEMFLAGCHECK(isRangedOrb, flag & IF_RANGED) ITEMFLAGCHECK(isRevivalOrb, flag & IF_REVIVAL) +#endif eMonster movegroup(eMonster m); // watery -bool boatStrandable(cell *c) { +EX bool boatStrandable(cell *c) { return c->wall == waNone && (c->land == laLivefjord || c->land == laOcean); } // monster/wall types -bool isFireOrMagma(cell *w) { +EX bool isFireOrMagma(cell *w) { return isFire(w) || w->wall == waMagma; } -int mirrorcolor(bool mirrored) { +EX int mirrorcolor(bool mirrored) { return winf[mirrored ? waMirror : waCloud].color; } -bool isMounted(cell *c) { +EX bool isMounted(cell *c) { if(c && c->monst && c->monst != moTentacleGhost && isMountable(c->monst)) { for(int i=0; imonst && sameMonster(c, playerpos(i))) @@ -147,31 +149,31 @@ bool isMounted(cell *c) { return false; } -int itemclass(eItem it) { return iinf[it].itemclass; } +EX int itemclass(eItem it) { return iinf[it].itemclass; } -bool isFriendly(eMonster m) { return isFriendlyType(m); } +EX bool isFriendly(eMonster m) { return isFriendlyType(m); } -bool isFriendly(cell *c) { +EX bool isFriendly(cell *c) { return isMounted(c) || isFriendly(c->monst); } -bool isFriendlyOrBug(cell *c) { // or killable discord! +EX bool isFriendlyOrBug(cell *c) { // or killable discord! // do not attack the stunned Princess if(isPrincess(c->monst) && c->stuntime) return false; return isFriendly(c) || isBug(c) || (c->monst && markOrb(itOrbDiscord) && !c->stuntime); } -bool cellUnstable(cell *c) { +EX bool cellUnstable(cell *c) { return (c->land == laMotion && c->wall == waNone) || c->wall == waTrapdoor; } -bool cellUnstableOrChasm(cell *c) { +EX bool cellUnstableOrChasm(cell *c) { return (c->land == laMotion && c->wall == waNone) || c->wall == waChasm || c->wall == waTrapdoor; } -eMonster elementalOf(eLand l) { +EX eMonster elementalOf(eLand l) { if(l == laEFire) return moFireElemental; if(l == laEWater) return moWaterElemental; if(l == laEAir) return moAirElemental; @@ -179,11 +181,11 @@ eMonster elementalOf(eLand l) { return moNone; } -eItem localshardof(eLand l) { +EX eItem localshardof(eLand l) { return eItem(itFireShard + (l - laEFire)); } -int snakelevel(cell *c) { +EX int snakelevel(cell *c) { #if CAP_COMPLEX2 if(c->land == laBrownian && among(c->wall, waNone, waMineMine, waFire)) return min(c->landparam / brownian::level, 3); #endif @@ -192,23 +194,23 @@ int snakelevel(cell *c) { // from-to -eSlimegroup slimegroup(cell *c) { +EX eSlimegroup slimegroup(cell *c) { return winf[c->wall].sg; } -bool isFlying(eMonster m) { +EX bool isFlying(eMonster m) { return isFlyingType(m) || checkOrb(m, itOrbAether); } -bool survivesChasm(eMonster m) { +EX bool survivesChasm(eMonster m) { return isFlying(m); } -bool ignoresPlates(eMonster m) { +EX bool ignoresPlates(eMonster m) { return ignoresPlatesType(m) || isFlying(m); } -bool isInactiveEnemy(cell *w, eMonster forwho) { +EX bool isInactiveEnemy(cell *w, eMonster forwho) { if(forwho != moPlayer) { if(w->monst == moGreaterM || w->monst == moLesserM) return true; if(w->monst == moGreater || w->monst == moLesser) return false; @@ -220,7 +222,7 @@ bool isInactiveEnemy(cell *w, eMonster forwho) { } // forpc = true (for PC), false (for golems) -bool isActiveEnemy(cell *w, eMonster forwho) { +EX bool isActiveEnemy(cell *w, eMonster forwho) { if(((forwho == moPlayer) ? realstuntime(w) : realstuntime(w) > 1)) return false; if(w->monst == passive_switch) return false; @@ -230,16 +232,16 @@ bool isActiveEnemy(cell *w, eMonster forwho) { return true; } -bool isArmedEnemy(cell *w, eMonster forwho) { +EX bool isArmedEnemy(cell *w, eMonster forwho) { return w->monst != moCrystalSage && w->monst != moCrusher && isActiveEnemy(w, forwho); } -bool eternalFire(cell *c) { +EX bool eternalFire(cell *c) { return c->land == laDryForest || (c->land == laPower && !smallbounded) || c->land == laMinefield || c->land == laEFire || c->land == laElementalWall; } -bool haveRangedOrb() { +EX bool haveRangedOrb() { return items[itOrbPsi] || items[itOrbDragon] || items[itOrbTeleport] || items[itOrbIllusion] || items[itOrbSpace] || items[itOrbAir] || @@ -249,15 +251,15 @@ bool haveRangedOrb() { items[itOrbMorph] || items[itOrbPhasing]; } -bool isFriendlyGhost(eMonster m) { +EX bool isFriendlyGhost(eMonster m) { return m == moFriendlyGhost || (markEmpathy(itOrbAether) && isFriendly(m)); } -bool isGhostAether(eMonster m) { +EX bool isGhostAether(eMonster m) { return isGhost(m) || checkOrb(m, itOrbAether); } -bool survivesWater(eMonster m) { +EX bool survivesWater(eMonster m) { return m == moShark || m == moGreaterShark || m == moCShark || isGhostAether(m) || m == moWitchGhost || m == moShadow || @@ -269,18 +271,18 @@ bool survivesWater(eMonster m) { } // survives Mercury or Sulphur or Lava -bool survivesPoison(eMonster m, eWall p) { +EX bool survivesPoison(eMonster m, eWall p) { return isGhostAether(m) || m == moWitchGhost || m == moShadow || isBird(m) || m == moAirElemental || isDragon(m) || isWorm(m); } // flying even if stunned -bool isPermanentFlying(eMonster m) { +EX bool isPermanentFlying(eMonster m) { return m == moAirElemental || isGhostAether(m); } -bool survivesFire(eMonster m) { +EX bool survivesFire(eMonster m) { return isGhostAether(m) || m == moWitchWinter || m == moWitchGhost || m == moBomberbird || m == moTameBomberbird || m == moTameBomberbirdMoved || @@ -288,15 +290,15 @@ bool survivesFire(eMonster m) { isDragon(m) || m == moShadow; } -bool survivesWall(eMonster m) { +EX bool survivesWall(eMonster m) { return isGhostAether(m); } -bool survivesThorns(eMonster m) { +EX bool survivesThorns(eMonster m) { return isGhostAether(m) || m == moSkeleton || m == moDraugr; } -bool survivesFall(eMonster m) { +EX bool survivesFall(eMonster m) { return isBird(m) || m == moAirElemental || m == moSkeleton || isDragon(m) || m == moShadow || isGhostAether(m); } @@ -312,11 +314,11 @@ EX bool checkOrb2(eMonster m1, eItem orb) { return false; } -bool ignoresSmell(eMonster m) { +EX bool ignoresSmell(eMonster m) { return ignoresSmellType(m) || checkOrb(m, itOrbBeauty) || checkOrb(m, itOrbAether) || checkOrb(m, itOrbShield); } -bool highwall(cell *c) { +EX bool highwall(cell *c) { if(c->wall == waGlass) return false; if(wmescher && wmspatial && c->wall == waBarrier && c->land == laOceanWall) return false; @@ -327,7 +329,7 @@ bool highwall(cell *c) { return winf[c->wall].glyph == '#' || c->wall == waClosedGate; } -int chasmgraph(cell *c) { +EX int chasmgraph(cell *c) { if(c->wall == waChasm || c->wall == waInvisibleFloor) return 2; if(isChasmy(c)) return 1; if(isWateryOrBoat(c)) return 1; @@ -336,11 +338,11 @@ int chasmgraph(cell *c) { return 0; } -bool conegraph(cell *c) { +EX bool conegraph(cell *c) { return wmescher && wmspatial && (conegraphtype(c) || (c->wall == waBarrier && c->land == laOceanWall)); } -bool hornStuns(cell *c) { +EX bool hornStuns(cell *c) { eMonster m = c->monst; return m == moRagingBull || m == moSleepBull || m == moHerdBull || diff --git a/floorshapes.cpp b/floorshapes.cpp index ff5a7262..e2ac4efd 100644 --- a/floorshapes.cpp +++ b/floorshapes.cpp @@ -841,7 +841,7 @@ void draw_floorshape(cell *c, const transmatrix& V, const floorshape &fsh, color draw_shapevec(c, V, fsh.b, col, prio); } -void draw_qfi(cell *c, const transmatrix& V, color_t col, PPR prio = PPR::DEFAULT, vector floorshape::* tab = &floorshape::b) { +EX void draw_qfi(cell *c, const transmatrix& V, color_t col, PPR prio IS(PPR::DEFAULT), vector floorshape::* tab IS(&floorshape::b)) { if(qfi.shape) queuepolyat(V * qfi.spin, *qfi.shape, col, prio); else if(qfi.usershape >= 0) { diff --git a/game.cpp b/game.cpp index 55f3dd18..32c80d07 100644 --- a/game.cpp +++ b/game.cpp @@ -19,8 +19,8 @@ extern eForcemovetype forcedmovetype; EX int lastsafety; EX int mutantphase; EX int turncount; -int rosewave, rosephase; -int avengers, mirrorspirits, wandering_jiangshi, jiangshi_on_screen; +EX int rosewave, rosephase; +EX int avengers, mirrorspirits, wandering_jiangshi, jiangshi_on_screen; EX int gamerange_bonus = 0; EX int gamerange() { return getDistLimit() + gamerange_bonus; } @@ -29,16 +29,15 @@ cell *lastmove; eLastmovetype lastmovetype, nextmovetype; eForcemovetype forcedmovetype; -bool hauntedWarning; -bool survivalist; +EX bool hauntedWarning; +EX bool survivalist; -bool hardcore = false; -int hardcoreAt; +EX bool hardcore = false; +EX int hardcoreAt; set snaketypes; -flagtype havewhat, hadwhat; - +#if HDR #define HF_BUG Flag(0) #define HF_EARTH Flag(1) #define HF_BIRD Flag(2) @@ -71,22 +70,24 @@ flagtype havewhat, hadwhat; #define HF_ALT Flag(29) #define HF_MONK Flag(30) #define HF_WESTWALL Flag(31) +#endif +EX flagtype havewhat, hadwhat; -bool seenSevenMines = false; +EX bool seenSevenMines = false; EX bool pureHardcore() { return hardcore && hardcoreAt < PUREHARDCORE_LEVEL; } EX bool canmove = true; -int sagephase = 0; +EX int sagephase = 0; /** number of Grails collected, to show you as a knight */ -int knighted = 0; +EX int knighted = 0; -bool usedSafety = false; -eLand safetyland; -int safetyseed; +EX bool usedSafety = false; +EX eLand safetyland; +EX int safetyseed; int showid = 0; @@ -95,15 +96,15 @@ EX bool invismove = false; /** last move was invisible due to Orb of Fish (thus Fish still see you)*/ EX bool invisfish = false; -int noiseuntil; // noise until the given turn +EX int noiseuntil; // noise until the given turn -void createNoise(int t) { +EX void createNoise(int t) { noiseuntil = max(noiseuntil, turncount+t); invismove = false; if(shmup::on) shmup::visibleFor(100 * t); } -int currentLocalTreasure; +EX int currentLocalTreasure; bool landvisited[landtypes]; @@ -116,7 +117,7 @@ EX array kills; EX int explore[10], exploreland[10][landtypes], landcount[landtypes]; EX map > hiitems; -bool orbused[ittypes], lastorbused[ittypes]; +EX bool orbused[ittypes], lastorbused[ittypes]; /** should we center the screen on the PC? */ EX bool playermoved = true; /** if false, make the PC look in direction cwt.spin (after attack); otherwise, make them look the other direction (after move) */ @@ -125,18 +126,18 @@ EX bool flipplayer = true; EX int cheater = 0; /** this value is used when using Orb of Safety in the Camelot in Pure Tactics Mode */ -int anthraxBonus = 0; +EX int anthraxBonus = 0; /** the list of all nearby cells, according to cpdist */ EX vector dcal; /** the list of all nearby cells, according to current pathdist */ -vector pathq; +EX vector pathq; /** offscreen cells to take care off */ -vector offscreen; +EX vector offscreen; /** list of monsters to move (pathq restriced to monsters) */ -vector pathqm; +EX vector pathqm; /** list of cells that the monsters are targetting (PCs, allies, Thumpers, etc.) */ vector targets; @@ -152,13 +153,13 @@ vector> tempmonsters; * the opposite cell will be added to the queue first, * which helps the AI. **/ -vector reachedfrom; +EX vector reachedfrom; /** monsters to move, ordered by the number of possible good moves */ vector movesofgood[MAX_EDGE+1]; /** The position of the first cell in dcal in distance 7. New wandering monsters can be generated in dcal[first7..]. */ -int first7; +EX int first7; /** Cellwalker describing the single player. Also used temporarily in shmup and multiplayer modes. */ EX cellwalker cwt; @@ -792,7 +793,7 @@ EX bool passable(cell *w, cell *from, flagtype flags) { return true; } -vector > airmap; +EX vector > airmap; EX int airdist(cell *c) { if(!(havewhat & HF_AIR)) return 3; @@ -1376,7 +1377,7 @@ EX eMonster active_switch() { return eMonster(passive_switch ^ moSwitch1 ^ moSwitch2); } -vector crush_now, crush_next; +EX vector crush_now, crush_next; EX bool monstersnear(stalemate1& sm) { @@ -1476,7 +1477,7 @@ namespace multi { bool aftermove; } EX bool monstersnear2(); -int lastkills; +EX int lastkills; EX bool multimove() { if(multi::cpid == 0) lastkills = tkills(); @@ -2835,11 +2836,11 @@ bool bugsfighting; bool keepLightning = false; -int statuecount; +EX int statuecount; int tidalphase; -int tidalsize, tide[200]; +EX int tidalsize, tide[200]; EX void calcTidalPhase() { if(!tidalsize) { @@ -2879,9 +2880,11 @@ EX int tidespeed() { bool recalcTide; +#if HDR #define SEADIST LHU.bytes[0] #define LANDDIST LHU.bytes[1] #define CHAOSPARAM LHU.bytes[2] +#endif #if CAP_FIELD EX int lavatide(cell *c, int t) { @@ -2963,7 +2966,7 @@ EX void buildAirmap() { * 2 - wave phase 1 * 3 - wave phase 2 */ -map rosemap; +EX map rosemap; EX int rosedist(cell *c) { if(!(havewhat&HF_ROSE)) return 0; @@ -3144,7 +3147,7 @@ struct pathdata { #endif // pathdist end -vector > butterflies; +EX vector > butterflies; EX void addButterfly(cell *c) { for(int i=0; imonst; @@ -5680,7 +5683,9 @@ EX int movevalue(eMonster m, cell *c, cell *c2, flagtype flags) { return val; } -#define STRONGWIND 99 +#if HDR +constexpr int STRONGWIND = 99; +#endif EX void movegolems(flagtype flags) { if(items[itOrbEmpathy] && items[itOrbSlaying]) @@ -6255,8 +6260,8 @@ EX void markAmbush(cell *c, manual_celllister& cl) { markAmbush(c2, cl); } -int ambush_distance; -bool ambushed; +EX int ambush_distance; +EX bool ambushed; EX void checkAmbushState() { if(havewhat & HF_HUNTER) { @@ -6937,7 +6942,7 @@ EX void collectMessage(cell *c2, eItem which) { } } -int ambushval; +EX int ambushval; EX int ambushSize(cell *c, eItem what) { bool restricted = false; @@ -7581,7 +7586,7 @@ EX void knightFlavorMessage(cell *c2) { int mine_adjacency_rule = 0; -map> adj_memo; +EX map> adj_memo; EX bool geometry_has_alt_mine_rule() { if(WDIM == 2) return VALENCE > 3; @@ -7722,8 +7727,10 @@ namespace orbbull { } } +#if HDR // predictable or not static constexpr bool randterra = false; +#endif EX void terracotta(cell *c) { if(c->wall == waTerraWarrior && !c->monst && !racing::on) { @@ -7955,7 +7962,7 @@ EX bool monsterPushable(cell *c2) { return (c2->monst != moFatGuard && !(isMetalBeast(c2->monst) && c2->stuntime < 2) && c2->monst != moTortoise && c2->monst != moTerraWarrior && c2->monst != moVizier); } -bool got_survivalist; +EX bool got_survivalist; EX bool should_switchplace(cell *c1, cell *c2) { if(isPrincess(c2->monst) || among(c2->monst, moGolem, moIllusion, moMouse, moFriendlyGhost)) diff --git a/geometry.cpp b/geometry.cpp index bb6c9af6..cd6589e2 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -408,7 +408,7 @@ hpcshape static const ld hcrossf7 = 0.620672, hexf7 = 0.378077, tessf7 = 1.090550, hexhexdist7 = 0.566256; #endif -bool scale_used() { return (shmup::on && geometry == gNormal && BITRUNCATED) ? (cheater || autocheat) : true; } +EX bool scale_used() { return (shmup::on && geometry == gNormal && BITRUNCATED) ? (cheater || autocheat) : true; } void geometry_information::prepare_basics() { @@ -601,7 +601,7 @@ void geometry_information::prepare_basics() { currfp.analyze(); } -transmatrix xspinpush(ld dir, ld dist) { +EX transmatrix xspinpush(ld dir, ld dist) { if(euclid) return eupush(cos(dir) * dist, -sin(dir) * dist); else @@ -610,7 +610,7 @@ transmatrix xspinpush(ld dir, ld dist) { EX purehookset hooks_swapdim; -namespace geom3 { +EX namespace geom3 { // Here we convert between the following parameters: @@ -638,11 +638,11 @@ namespace geom3 { return lev_to_projection(0) / proj; } - ld factor_to_projection(ld fac) { + EX ld factor_to_projection(ld fac) { return lev_to_projection(0) / fac; } - ld lev_to_factor(ld lev) { + EX ld lev_to_factor(ld lev) { if(prod) return -lev; if(WDIM == 3) return lev; if(GDIM == 3) return vid.depth - lev; @@ -654,7 +654,7 @@ namespace geom3 { return vid.depth - projection_to_abslev(factor_to_projection(fac)); } - void do_auto_eye() { + EX void do_auto_eye() { if(!vid.auto_eye) return; auto& cs = getcs(); if(cs.charid < 4) @@ -671,9 +671,9 @@ namespace geom3 { return cosh(vid.depth - lev); } - string invalid; + EX string invalid; - ld actual_wall_height() { + EX ld actual_wall_height() { if(hybri) return cgi.plevel; #if CAP_GP if(GOLDBERG && vid.gp_autoscale_heights) @@ -681,7 +681,7 @@ namespace geom3 { #endif return vid.wall_height; } - } + EX } void geometry_information::prepare_compute3() { using namespace geom3; @@ -897,7 +897,7 @@ EX map cgis; #define cgi (*cgip) #endif -int last_texture_step; +EX int last_texture_step; int ntimestamp; diff --git a/goldberg.cpp b/goldberg.cpp index bac01f6f..deda532d 100644 --- a/goldberg.cpp +++ b/goldberg.cpp @@ -71,7 +71,7 @@ EX namespace gp { #if CAP_GP EX loc param = loc(1, 0); - hyperpoint next; + EX hyperpoint next; struct goldberg_mapping_t { cellwalker cw; @@ -80,9 +80,9 @@ EX namespace gp { loc start; }; - int fixg6(int x) { return (x + MODFIXER) % SG6; } + EX int fixg6(int x) { return (x + MODFIXER) % SG6; } - int get_code(const local_info& li) { + EX int get_code(const local_info& li) { return ((li.relative.first & 15) << 0) + ((li.relative.second & 15) << 4) + @@ -475,7 +475,7 @@ EX namespace gp { DEBB(DF_GP, ("DONE")) } - hyperpoint loctoh_ort(loc at) { + EX hyperpoint loctoh_ort(loc at) { return point3(at.first, at.second, 1); } @@ -559,7 +559,7 @@ EX namespace gp { } } - hyperpoint get_corner_position(const local_info& li, int cid, ld cf = 3) { + EX hyperpoint get_corner_position(const local_info& li, int cid, ld cf IS(3)) { int i = li.last_dir; if(i == -1) return atz(dir_matrix(cid), cgi.gpdata->corners, li.relative, 0, cf); @@ -569,7 +569,7 @@ EX namespace gp { } } - hyperpoint get_corner_position(cell *c, int cid, ld cf = 3) { + EX hyperpoint get_corner_position(cell *c, int cid, ld cf IS(3)) { return get_corner_position(get_local_info(c), cid, cf); } @@ -620,7 +620,7 @@ EX namespace gp { return v; } - loc human_representation(loc v) { + EX loc human_representation(loc v) { int& x = v.first, &y = v.second; if(S3 == 3) while(x < 0 || y < 0 || (x == 0 && y > 0)) v = v * loc(0, 1); diff --git a/heptagon.cpp b/heptagon.cpp index 6f807a75..dfa1d7bb 100644 --- a/heptagon.cpp +++ b/heptagon.cpp @@ -65,7 +65,7 @@ hstate transition(hstate s, int dir) { #define COMPUTE -1000000 // create a new heptagon -heptagon *buildHeptagon1(heptagon *h, heptagon *parent, int d, hstate s, int pard = 0) { +EX heptagon *buildHeptagon1(heptagon *h, heptagon *parent, int d, hstate s, int pard IS(0)) { h->alt = NULL; h->s = s; h->c.connect(pard, parent, d, false); diff --git a/hyperpoint.cpp b/hyperpoint.cpp index 07db52cf..5f916c11 100644 --- a/hyperpoint.cpp +++ b/hyperpoint.cpp @@ -313,19 +313,21 @@ EX ld edge_of_triangle_with_angles(ld alpha, ld beta, ld gamma) { return acos_auto((cos(alpha) + cos(beta) * cos(gamma)) / (sin(beta) * sin(gamma))); } -hyperpoint hpxy(ld x, ld y) { +EX hyperpoint hpxy(ld x, ld y) { return hpxyz(x,y, sl2 ? sqrt(1+x*x+y*y) : translatable ? 1 : sphere ? sqrt(1-x*x-y*y) : sqrt(1+x*x+y*y)); } -hyperpoint hpxy3(ld x, ld y, ld z) { +EX hyperpoint hpxy3(ld x, ld y, ld z) { return hpxyz3(x,y,z, sl2 ? sqrt(1+x*x+y*y-z*z) :translatable ? 1 : sphere ? sqrt(1-x*x-y*y-z*z) : sqrt(1+x*x+y*y+z*z)); } +#if HDR // a point (I hope this number needs no comments ;) ) constexpr hyperpoint Cx12 = hyperpoint(1,0,1.41421356237,0); constexpr hyperpoint Cx13 = hyperpoint(1,0,0,1.41421356237); #define Cx1 (GDIM==2?Cx12:Cx13) +#endif EX bool zero_d(int d, hyperpoint h) { for(int i=0; i0?1:0; } -bool asign(ld y1, ld y2) { return signum(y1) != signum(y2); } +EX bool asign(ld y1, ld y2) { return signum(y1) != signum(y2); } -ld xcross(ld x1, ld y1, ld x2, ld y2) { return x1 + (x2 - x1) * y1 / (y1 - y2); } +EX ld xcross(ld x1, ld y1, ld x2, ld y2) { return x1 + (x2 - x1) * y1 / (y1 - y2); } EX transmatrix parallel_transport(const transmatrix Position, const transmatrix& ori, const hyperpoint direction) { if(nonisotropic) return nisot::parallel_transport(Position, direction); @@ -1143,11 +1145,11 @@ EX ld geo_dist(const hyperpoint h1, const hyperpoint h2, iePrecision p) { return hypot_d(3, inverse_exp(inverse(nisot::translate(h1)) * h2, p, false)); } -hyperpoint lp_iapply(const hyperpoint h) { +EX hyperpoint lp_iapply(const hyperpoint h) { return nisot::local_perspective_used() ? inverse(nisot::local_perspective) * h : h; } -hyperpoint lp_apply(const hyperpoint h) { +EX hyperpoint lp_apply(const hyperpoint h) { return nisot::local_perspective_used() ? nisot::local_perspective * h : h; } diff --git a/inventory.cpp b/inventory.cpp index 9a922d16..a638abc6 100644 --- a/inventory.cpp +++ b/inventory.cpp @@ -13,9 +13,9 @@ EX namespace inv { EX bool on; EX array usedup; EX array remaining; - array extra_orbs; + EX array extra_orbs; - int rseed; + EX int rseed; EX bool usedForbidden; @@ -112,8 +112,8 @@ EX namespace inv { return invr() % i; } - eItem whichorbinfo; - string orbinfoline, extra; + EX eItem whichorbinfo; + EX string orbinfoline, extra; string extraline(eItem it, string s) { return " "+XLAT1(iinf[it].name) + " ("+s+")"; @@ -404,7 +404,7 @@ EX namespace inv { bool mirroring; - const char* helptext = + EX const char* helptext = "You are playing in the Orb Strategy Mode. Collecting treasure " "gives you access to magical Orb powers. In this mode, " "unlocking requirements are generally higher, and " @@ -444,7 +444,7 @@ EX namespace inv { } } - string osminfo(eItem orb) { + EX string osminfo(eItem orb) { string s = XLAT("Number of uses left: %1", its(remaining[orb])); int us = usedup[orb]; if(us >= TESTMIRRORED) s += XLAT(" (mirrored)"), us = us - MIRRORED + mirrorqty0(orb); @@ -655,7 +655,7 @@ EX namespace inv { } #if CAP_SAVE - void applyBox(eItem it) { + EX void applyBox(eItem it) { applyBoxNum(usedup[it]); } #endif diff --git a/irregular.cpp b/irregular.cpp index 8e7980c3..8674c8c1 100644 --- a/irregular.cpp +++ b/irregular.cpp @@ -21,6 +21,7 @@ EX int rearrange_less = 10; EX int cellcount; +#if HDR struct cellinfo { cell *owner; map relmatrices; @@ -35,10 +36,11 @@ struct cellinfo { int patterndir; int generation; }; +#endif -map cellindex; +EX map cellindex; -vector cells; +EX vector cells; ld inner(hyperpoint h1, hyperpoint h2) { return @@ -520,7 +522,7 @@ bool step(int delta) { return false; } -void compute_geometry() { +EX void compute_geometry() { if(IRREGULAR) { ld scale = sqrt(isize(cells_of_heptagon) * 1. / isize(cells)); cgi.crossf *= scale; @@ -553,13 +555,15 @@ bool draw_cell_schematics(cell *c, transmatrix V) { return false; } +#if HDR struct heptinfo { heptspin base; vector subcells; vector celldists[2]; }; +#endif -map periodmap; +EX map periodmap; EX void link_to_base(heptagon *h, heptspin base) { // printf("linking %p to %p/%d\n", h, base.at, base.spin); @@ -1006,7 +1010,7 @@ EX void visual_creator() { gridmaking = true; } -void auto_creator() { +EX void auto_creator() { variation = eVariation::pure; int cc = cellcount; bitruncations_requested = bitruncations_performed; diff --git a/landgen.cpp b/landgen.cpp index 08d91fa9..4a6ca575 100644 --- a/landgen.cpp +++ b/landgen.cpp @@ -26,7 +26,7 @@ EX int genrange_bonus = 0; EX bool chaosUnlocked = false; EX bool chaosAchieved = false; -void doOvergenerate() { +EX void doOvergenerate() { for(int i=0; i= 40 * kills[elementalOf(l)] / (elementalKills()+1); } -eLand pickLandRPM(eLand old) { +EX eLand pickLandRPM(eLand old) { while(true) { eLand n = randlands[hrand(isize(randlands))]; if(incompatible(n, old)) continue; diff --git a/langen.cpp b/langen.cpp index 53d02497..d4d76304 100644 --- a/langen.cpp +++ b/langen.cpp @@ -320,14 +320,17 @@ int main() { if(isize(elt) >= 2) { javastring += elt; vchars.push_back(elt); } } printf("\n"); + printf("#if HDR\n"); printf("#define NUMEXTRA %d\n", isize(vchars)); printf("#define NATCHARS {"); for(auto&& elt : vchars) printf("\"%s\",", elt.c_str()); printf("};\n"); - printf("const char* natchars[NUMEXTRA] = NATCHARS;"); + printf("extern char* natchars[NUMEXTRA];\n"); + printf("#endif\n"); + printf("char* natchars[NUMEXTRA] = NATCHARS;\n"); printf("//javastring = \"%s\";\n", javastring.c_str()); - printf("\nint transcompleteness[NUMLAN] = {"); + printf("\nEX int transcompleteness[NUMLAN] = {"); for(int i=0; i ptlow; + #endif EX transmatrix local_perspective; #if HDR @@ -36,11 +38,11 @@ EX namespace nisot { EX namespace solv { - int PRECX, PRECY, PRECZ; + EX int PRECX, PRECY, PRECZ; - vector inverse_exp_table; + EX vector inverse_exp_table; - bool table_loaded; + EX bool table_loaded; EX string solfname = "solv-geodesics.dat"; @@ -281,7 +283,8 @@ EX namespace solv { EX ld solrange_xy = 15; EX ld solrange_z = 4; - EX ld glitch_xy = 2, glitch_z = 0.6; + EX ld glitch_xy = 2; + EX ld glitch_z = 0.6; EX bool in_table_range(hyperpoint h) { if(abs(h[0]) > glitch_xy && abs(h[1]) > glitch_xy && abs(h[2]) < glitch_z) return false; @@ -598,9 +601,9 @@ EX namespace hybrid { ginf[g].flags |= qHYBRID; } - hrmap *pmap; + EX hrmap *pmap; geometry_information *pcgip; - eGeometry actual_geometry; + EX eGeometry actual_geometry; template auto in_actual(const T& t) -> decltype(t()) { dynamicval g(geometry, actual_geometry); @@ -658,7 +661,7 @@ EX namespace hybrid { EX pair get_where(cell *c) { return hmap()->where[c]; } - void find_cell_connection(cell *c, int d) { + EX void find_cell_connection(cell *c, int d) { auto m = hmap(); if(d >= c->type - 2) { int s = cgi.single_step; diff --git a/orbgen.cpp b/orbgen.cpp index bfa1534c..fa336a65 100644 --- a/orbgen.cpp +++ b/orbgen.cpp @@ -32,6 +32,7 @@ enum eOrbLandRelation { }; #endif +#if HDR namespace orbgenflags { // generates in the given land from 10 treasures, in the classic mode static const int LOCAL10 = 1; @@ -74,8 +75,9 @@ struct orbinfo { eItem orb; bool is_native() const { using namespace orbgenflags; return flags & NATIVE; } }; +#endif -const vector orbinfos = { +EX vector orbinfos = { {orbgenflags::S_NATIVE, laGraveyard, 200, 200,itGreenStone}, // must be first so that it does not reduce {orbgenflags::S_NATIVE, laJungle, 1200, 1500,itOrbLightning}, {orbgenflags::S_NATIVE, laIce, 2000, 1500,itOrbFlash}, @@ -178,7 +180,7 @@ const orbinfo& getNativityOrbInfo(eItem orb) { return oi; } -string olrDescriptions[] = { +EX string olrDescriptions[] = { "forbidden to find in %the1", "too dangerous to use in %the1", "useless in %the1", diff --git a/pattern2.cpp b/pattern2.cpp index fc5f9ecd..3852e2d1 100644 --- a/pattern2.cpp +++ b/pattern2.cpp @@ -142,7 +142,7 @@ int fiftyval(cell *c) { } } -int cdist50(cell *c) { +EX int cdist50(cell *c) { if(sphere || S7>7 || S6>6) return 0; if(euclid) { if(c->land == laWildWest) @@ -455,7 +455,7 @@ pair subval(cell *c, int _subpathid = subpathid, int _subpathorder = s EX } #endif -int getHemisphere(heptagon *h, int which) { +EX int getHemisphere(heptagon *h, int which) { int id = h->fiftyval; if(S7 == 5) { int hemitable[3][12] = { @@ -484,7 +484,7 @@ int getHemisphere(heptagon *h, int which) { else return 0; } -int getHemisphere(cell *c, int which) { +EX int getHemisphere(cell *c, int which) { if(euwrap) return 0; if(WDIM == 3) { hyperpoint p = tC0(calc_relative_matrix(c, currentmap->gamestart(), C0)); @@ -1403,7 +1403,7 @@ EX bool pseudohept(cell *c) { // while Krakens movement is usually restricted to non-pseudohept cells, // there is one special case when this does not work (because non-pseudohept cells have varying degrees) -bool kraken_pseudohept(cell *c) { +EX bool kraken_pseudohept(cell *c) { if(0); #if CAP_GP else if(!euclid && S3 == 4 && GOLDBERG && (gp::param.first % 2 || gp::param.second % 2 || S7 % 2)) @@ -1427,7 +1427,7 @@ bool kraken_pseudohept(cell *c) { return pseudohept(c); } -bool warptype(cell *c) { +EX bool warptype(cell *c) { if(geosupport_chessboard()) return chessvalue(c); else if(NONSTDVAR) @@ -1436,7 +1436,7 @@ bool warptype(cell *c) { return pattern_threecolor(c) == 0; } -map colortables = { +EX map colortables = { {'A', { 0xF04040, 0x40F040, 0x4040F0, 0xD0D000, 0xD000D0, 0x00D0D0, @@ -1492,7 +1492,7 @@ EX namespace patterns { return gmod(p.first - p.second * 2, 7); } - string color_formula = "to01(rgb(x,y,z))"; + EX string color_formula = "to01(rgb(x,y,z))"; cld compute_map_function(cell *c, int p, const string& formula) { exp_parser ep; @@ -1782,7 +1782,7 @@ EX namespace patterns { } void showPrePattern() { showPrePatternP(true); } - void showPrePatternNoninstant() { showPrePatternP(false); } + EX void showPrePatternNoninstant() { showPrePatternP(false); } #if CAP_TEXTURE diff --git a/patterns.cpp b/patterns.cpp index 33feca59..04211325 100644 --- a/patterns.cpp +++ b/patterns.cpp @@ -11,7 +11,7 @@ namespace hr { // === EMERALD PATTERN === // rules for the emeraldvalues of heptagons. -int emerald_heptagon(int parent, int dir) { +EX int emerald_heptagon(int parent, int dir) { if(a46) return parent ^ (dir & 1) ^ 2 ^ (((parent^dir) & 1) << 2); @@ -374,7 +374,7 @@ int emerald_heptagon(int parent, int dir) { // calculate the emeraldvalue of a hexagonal cell, // based on the emeraldvalues of the neighbor heptacells. -int emerald_hexagon(int a, int b, int c) { +EX int emerald_hexagon(int a, int b, int c) { // pick the lexicographically smallest representation of the cycle if(b <= a || c 3) d--; return fiftytable[0][d]; } -int nextfiftyval(int par, int gpar, int d) { +EX int nextfiftyval(int par, int gpar, int d) { if(S7 == 8 && d > 3) d--; for(int i=0; i<7; i++) if(fiftytable[par][i] == gpar) return fiftytable[par][(i+d)%7]; @@ -1059,7 +1059,7 @@ int zebratable[12][7] = { {74, 112, 95, 132, 143, 123, 135} }; -int zebratable6[28][3] = { +EX int zebratable6[28][3] = { {4,10,6}, {5,11,7}, {4,6,12}, {5,7,13}, {8,14,10}, {9,15,11}, {4,8,10}, {5,9,11}, {6,14,12}, {7,15,13}, {8,12,14}, {9,13,15}, @@ -1070,7 +1070,7 @@ int zebratable6[28][3] = { }; // rules for the emeraldvalues of heptagons. -int zebra_heptagon(int parent, int dir) { +EX int zebra_heptagon(int parent, int dir) { if(S3 == 4) { int mm = (parent % 10 + S7 - dir) % S7; int mv = parent / 10; @@ -1122,7 +1122,7 @@ int zebra_heptagon(int parent, int dir) { return zebratable[parent/10-4][(70+dir-(parent%10))%7]; } -int fifty_38(int f, int d) { +EX int fifty_38(int f, int d) { // This creates the 'p' pattern for the a38 geometry. // Hexagons have codes 4 and 8, while octagons have 0, 1, 2. // Heptagons also have a 'dock flag' which is flipped diff --git a/polygons.cpp b/polygons.cpp index cbc3cd59..30e22459 100644 --- a/polygons.cpp +++ b/polygons.cpp @@ -10,10 +10,12 @@ namespace hr { +#if HDR static constexpr ld NEWSHAPE = (-13.5); +#endif static constexpr ld WOLF = (-15.5); -extern long double polydata[]; +EX long double polydata[]; void geometry_information::hpcpush(hyperpoint h) { if(sphere) h = mid(h,h); @@ -292,7 +294,9 @@ template ld grot(bool geometry, ld factor, T... t) { else return grot(t...); } +#if HDR #define SHADMUL (S3==4 ? 1.05 : 1.3) +#endif void geometry_information::make_sidewalls() { for(int i=0; i<=3; i++) diff --git a/savemem.cpp b/savemem.cpp index 7ed87253..3a95575c 100644 --- a/savemem.cpp +++ b/savemem.cpp @@ -14,8 +14,8 @@ static const int PSEUDOKEY_MEMORY = 16397; EX bool memory_saving_mode = true; -bool show_memory_warning = true; -bool ignored_memory_warning; +EX bool show_memory_warning = true; +EX bool ignored_memory_warning; static const int LIM = 150; @@ -93,7 +93,7 @@ bool unsafeLand(cell *c) { among(c->land, laCaribbean, laOcean, laGraveyard, laPrincessQuest); } -void save_memory() { +EX void save_memory() { if(quotient || !hyperbolic || NONSTDVAR) return; if(!memory_saving_mode) return; if(unsafeLand(cwt.at)) return; @@ -184,14 +184,14 @@ EX void set_if_removed(cell*& c, cell *val) { typedef array reserve_block; int reserve_count = 0; -int reserve_limit = 128; +EX int reserve_limit = 128; const int max_reserve = 4096; array reserve; std::new_handler default_handler; -purehookset hooks_clear_cache; +EX purehookset hooks_clear_cache; void reserve_handler() { if(reserve_count) { @@ -202,7 +202,7 @@ void reserve_handler() { if(!reserve_count) std::set_new_handler(default_handler); } -void apply_memory_reserve() { +EX void apply_memory_reserve() { #if CAP_MEMORY_RESERVE if(reserve_count > 0) std::set_new_handler(default_handler); if(reserve_limit > max_reserve) reserve_limit = max_reserve; @@ -230,7 +230,7 @@ void memory_for_lib() { if(reserve_count) { reserve_count--; delete reserve[reserve_count]; } } -void show_memory_menu() { +EX void show_memory_menu() { gamescreen(0); dialog::init(XLAT("memory")); diff --git a/screenshot.cpp b/screenshot.cpp index 72741a8a..3bdc3229 100644 --- a/screenshot.cpp +++ b/screenshot.cpp @@ -247,7 +247,7 @@ EX bool make_svg = false; EX bool transparent = true; EX ld gamma = 1; EX int shotformat = -1; -string caption; +EX string caption; EX ld fade = 1; void set_shotx() { @@ -520,7 +520,8 @@ transmatrix rotation_center_View; color_t circle_display_color = 0x00FF00FF; -EX ld circle_radius = acosh(2.), circle_spins = 1; +EX ld circle_radius = acosh(2.); +EX ld circle_spins = 1; void moved() { optimizeview(); diff --git a/shaders.cpp b/shaders.cpp index 297272c5..c5cbb03d 100644 --- a/shaders.cpp +++ b/shaders.cpp @@ -17,7 +17,7 @@ namespace hr { // Copyright (C) 2011-2018 Zeno Rogue, see 'hyper.cpp' for details -void glError(const char* GLcall, const char* file, const int line) { +EX void glError(const char* GLcall, const char* file, const int line) { GLenum errCode = glGetError(); if(errCode!=GL_NO_ERROR) { fprintf(stderr, "OPENGL ERROR #%i: in file %s on line %i :: %s\n",errCode,file, line, GLcall); @@ -107,9 +107,9 @@ enum class shader_projection { standard, band, halfplane, standardH3, standardR3 #endif #if CAP_SHADER -bool noshaders = false; +EX bool noshaders = false; #else -bool noshaders = true; +EX bool noshaders = true; #endif bool glew = false; @@ -117,14 +117,18 @@ bool glew = false; bool current_depthtest, current_depthwrite; ld fogbase; +#if HDR typedef const void *constvoidptr; +#endif -constvoidptr current_vertices, buffered_vertices; +EX constvoidptr current_vertices, buffered_vertices; ld current_linewidth; GLuint buf_current, buf_buffered; +#if HDR enum eMode { gmColored, gmTextured, gmVarColored, gmLightFog, gmMAX}; +#endif static const flagtype GF_TEXTURE = 1; static const flagtype GF_VARCOLOR = 2; @@ -137,7 +141,7 @@ eMode mode; EX shader_projection current_shader_projection, new_shader_projection; -void switch_mode(eMode m, shader_projection sp); +EX void switch_mode(eMode m, shader_projection sp); void display(const glmatrix& m) { for(int i=0; i<4; i++) { @@ -159,9 +163,9 @@ glmatrix operator * (glmatrix m1, glmatrix m2) { return res; } -glmatrix id = {{{1,0,0,0}, {0,1,0,0}, {0,0,1,0}, {0,0,0,1}}}; +EX glmatrix id = {{{1,0,0,0}, {0,1,0,0}, {0,0,1,0}, {0,0,0,1}}}; -glmatrix scale(ld x, ld y, ld z) { +EX glmatrix scale(ld x, ld y, ld z) { glmatrix tmp; for(int i=0; i<4; i++) for(int j=0; j<4; j++) @@ -180,7 +184,7 @@ EX glmatrix tmtogl(const transmatrix& T) { return tmp; } -glmatrix tmtogl_transpose(const transmatrix& T) { +EX glmatrix tmtogl_transpose(const transmatrix& T) { glmatrix tmp; for(int i=0; i<4; i++) for(int j=0; j<4; j++) @@ -188,16 +192,16 @@ glmatrix tmtogl_transpose(const transmatrix& T) { return tmp; } -glmatrix ortho(ld x, ld y, ld z) { +EX glmatrix ortho(ld x, ld y, ld z) { return scale(1/x, 1/y, 1/z); } -glmatrix& as_glmatrix(GLfloat o[16]) { +EX glmatrix& as_glmatrix(GLfloat o[16]) { glmatrix& tmp = (glmatrix&) (o[0]); return tmp; } -glmatrix frustum(ld x, ld y, ld vnear = 1e-3, ld vfar = 1e9) { +EX glmatrix frustum(ld x, ld y, ld vnear IS(1e-3), ld vfar IS(1e9)) { GLfloat frustum[16] = { GLfloat(1 / x), 0, 0, 0, 0, GLfloat(1 / y), 0, 0, @@ -223,7 +227,7 @@ EX glmatrix translate(ld x, ld y, ld z) { glmatrix projection; -void new_projection() { +EX void new_projection() { WITHSHADER({ projection = id; }, { @@ -235,7 +239,7 @@ void new_projection() { }) } -void projection_multiply(const glmatrix& m) { +EX void projection_multiply(const glmatrix& m) { WITHSHADER({ projection = m * projection; }, { @@ -244,7 +248,7 @@ void projection_multiply(const glmatrix& m) { }) } -void init(); +EX void init(); int compileShader(int type, const string& s) { GLint status; @@ -279,13 +283,21 @@ int compileShader(int type, const string& s) { // https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php -struct GLprogram *current = NULL; +#if HDR +struct GLprogram; +#endif +EX struct GLprogram *current = NULL; + +#if HDR static const int aPosition = 0; static const int aColor = 3; static const int aTexture = 8; +#endif -const int INVERSE_EXP_BINDING = 2; +#if HDR +constexpr int INVERSE_EXP_BINDING = 2; +#endif struct GLprogram { GLuint _program; @@ -455,7 +467,7 @@ EX void set_modelview(const glmatrix& modelview) { // glUniformMatrix3fv(current->uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, nm[0]); } -void id_modelview() { +EX void id_modelview() { #if CAP_NOSHADER if(noshaders) { glMatrixMode(GL_MODELVIEW); @@ -604,7 +616,7 @@ void switch_mode(eMode m, shader_projection sp) { else glDisable(GL_DEPTH_TEST); */ } -void fog_max(ld fogmax, color_t fogcolor) { +EX void fog_max(ld fogmax, color_t fogcolor) { WITHSHADER({ glUniform1f(current->uFog, 1 / fogmax); @@ -616,7 +628,7 @@ void fog_max(ld fogmax, color_t fogcolor) { }) } -void set_fogbase(ld _fogbase) { +EX void set_fogbase(ld _fogbase) { WITHSHADER({ if(fogbase != _fogbase) { fogbase = _fogbase; @@ -625,7 +637,7 @@ void set_fogbase(ld _fogbase) { }, {}) } -void set_ualpha(ld alpha) { +EX void set_ualpha(ld alpha) { WITHSHADER({ glUniform1f(current->uAlpha, alpha); }, {}) @@ -861,7 +873,7 @@ template void bindbuffer(T& v) { #endif -void vertices(const vector& v, int vshift = 0) { +EX void vertices(const vector& v, int vshift IS(0)) { #if CAP_VERTEXBUFFER if(&v[0] == buffered_vertices) { if(&v[0] == current_vertices) return; @@ -882,7 +894,7 @@ void vertices(const vector& v, int vshift = 0) { #endif } -void vertices_texture(const vector& v, const vector& t, int vshift = 0, int tshift = 0) { +EX void vertices_texture(const vector& v, const vector& t, int vshift IS(0), int tshift IS(0)) { #if CAP_VERTEXBUFFER int q = min(isize(v)-vshift, isize(t)-tshift); vector tv(q); @@ -958,7 +970,7 @@ EX void prepare(vector& v) { #endif } -void store_in_buffer(vector& v) { +EX void store_in_buffer(vector& v) { #if CAP_VERTEXBUFFER if(!buf_buffered) { printf("no buffer yet\n"); @@ -1004,7 +1016,24 @@ EX void switch_to_text(const vector& v, const vector& t) { vertices_texture(v, t, 0, 0); } -} +EX } + +EX vector text_vertices; + +EX void texture_vertices(GLfloat *f, int qty, int stride IS(2)) { + WITHSHADER( + glVertexAttribPointer(aTexture, stride, GL_FLOAT, GL_FALSE, stride * sizeof(GLfloat), f);, + glTexCoordPointer(stride, GL_FLOAT, 0, f); + ) + } + +EX void oldvertices(GLfloat *f, int qty) { + WITHSHADER( + glVertexAttribPointer(aPosition, SHDIM, GL_FLOAT, GL_FALSE, SHDIM * sizeof(GLfloat), f);, + glVertexPointer(SHDIM, GL_FLOAT, 0, f); + ) + } + } #define glMatrixMode DISABLED diff --git a/system.cpp b/system.cpp index 9f35ba6e..e751bd7a 100644 --- a/system.cpp +++ b/system.cpp @@ -48,7 +48,7 @@ EX int asteroids_generated, asteroid_orbs_generated; EX time_t timerstart, savetime; EX bool timerstopped; -int savecount; +EX int savecount; EX bool showoff = false; EX bool doCross = false; diff --git a/usershapes.cpp b/usershapes.cpp index dd0c0dd0..e0eb08ca 100644 --- a/usershapes.cpp +++ b/usershapes.cpp @@ -12,7 +12,7 @@ namespace hr { EX int usershape_changes; -array, mapeditor::USERSHAPEGROUPS> usershapes; +EX array, mapeditor::USERSHAPEGROUPS> usershapes; EX void initShape(int sg, int id) { if(!usershapes[sg][id]) { @@ -32,7 +32,7 @@ EX void initShape(int sg, int id) { } } -basic_textureinfo user_triangles_texture; +EX basic_textureinfo user_triangles_texture; void geometry_information::pushShape(usershapelayer& ds) { diff --git a/util.cpp b/util.cpp index 2cfb35b3..485a637d 100644 --- a/util.cpp +++ b/util.cpp @@ -74,8 +74,8 @@ void profile_frame() { for(int t=0; t<16; t++) proftable[t][pframeid] = 0; } -void profile_start(int t) { proftable[t][pframeid] -= getms(); } -void profile_stop(int t) { proftable[t][pframeid] += getms(); } +EX void profile_start(int t) { proftable[t][pframeid] -= getms(); } +EX void profile_stop(int t) { proftable[t][pframeid] += getms(); } void profile_info() { for(int t=0; t<16; t++) { @@ -88,16 +88,18 @@ void profile_info() { proftable[t][48], proftable[t][63]); } } +#endif -#else - +#if !CAP_PROFILING +#if HDR #define profile_frame() #define profile_start(t) #define profile_stop(t) #define profile_info() #endif +#endif -purehookset hooks_tests; +EX purehookset hooks_tests; EX string simplify(const string& s) { string res; diff --git a/yendor.cpp b/yendor.cpp index 0e9ba6f8..c00b5540 100644 --- a/yendor.cpp +++ b/yendor.cpp @@ -10,13 +10,13 @@ namespace hr { namespace peace { extern bool on; } -int hiitemsMax(eItem it) { +EX int hiitemsMax(eItem it) { int mx = 0; for(auto& a: hiitems) if(a.second[it] > mx) mx = a.second[it]; return mx; } -modecode_t modecode(); +EX modecode_t modecode(); typedef vector > subscoreboard; @@ -40,13 +40,13 @@ EX namespace yendor { EX bool on = false; EX bool generating = false; - bool path = false; - bool everwon = false; - bool won = false; + EX bool path = false; + EX bool everwon = false; + EX bool won = false; bool easy = false; - int challenge; // id of the challenge - int lastchallenge; + EX int challenge; // id of the challenge + EX int lastchallenge; #if HDR #define YF_DEAD 1 @@ -73,11 +73,11 @@ EX namespace yendor { eLand l; int flags; }; + + #define YENDORLEVELS 33 #endif - #define YENDORLEVELS 33 - - map> bestscore; + EX map> bestscore; EX eLand nexttostart; @@ -138,7 +138,7 @@ EX namespace yendor { achievement_score(LB_YENDOR_CHALLENGE, tscore); } - yendorlevel& clev() { return levels[challenge]; } + EX yendorlevel& clev() { return levels[challenge]; } eLand changeland(int i, eLand l) { if(l == laIvoryTower) return laNone; @@ -150,6 +150,7 @@ EX namespace yendor { string name; eLand first, second, last; + #if HDR struct yendorinfo { cell *path[YDIST]; cell *actualKey; @@ -162,13 +163,14 @@ EX namespace yendor { cell *actual_key() { return actualKey ? actualKey : key(); } cell* orb() { return path[0]; } }; + #endif - vector yi; + EX vector yi; #define NOYENDOR 999999 int yii = NOYENDOR; - int hardness() { + EX int hardness() { if(peace::on) return 15; // just to generate monsters if(!yendor::generating && !yendor::path && !yendor::on) return 0; int thf = 0; @@ -182,15 +184,17 @@ EX namespace yendor { return items[itOrbYendor] * 5 + (thf * 5) / (YDIST-25); } + #if HDR enum eState { ysUntouched, ysLocked, ysUnlocked }; + #endif - eState state(cell *yendor) { + EX eState state(cell *yendor) { for(int i=0; icpdist <= 7) { @@ -500,7 +504,7 @@ EX namespace yendor { } } - void init(int phase) { + EX void init(int phase) { if(!on) return; if(phase == 1) { @@ -726,7 +730,7 @@ EX namespace yendor { }; } - void collected(cell* c2) { + EX void collected(cell* c2) { int pg = gold(); playSound(c2, "tada"); items[itOrbShield] += 31; @@ -785,7 +789,7 @@ EX namespace tactic { EX bool trailer = false; EX bool on = false; - int id; + EX int id; map> recordsum; map, landtypes> > lsc; @@ -821,7 +825,7 @@ EX namespace tactic { return hiitemsMax(treasureType(l)) * landMultiplier(l) >= 20; } - void record(eLand land, int score, int xc = modecode()) { + EX void record(eLand land, int score, int xc IS(modecode())) { if(land >=0 && land < landtypes) { for(int i=MAXTAC-1; i; i--) lsc[xc][land][i] = lsc[xc][land][i-1]; tactic::lsc[xc][land][0] = score; @@ -1166,9 +1170,9 @@ modecode_t modecode() { EX namespace peace { EX bool on = false; - bool hint = false; + EX bool hint = false; - bool otherpuzzles; + EX bool otherpuzzles; eLand simonlevels[] = { laCrossroads, laCrossroads2, laDesert, laCaves, laAlchemist, laRlyeh, laEmerald, @@ -1228,7 +1232,7 @@ EX namespace peace { "a large hyperbolic circle), and Palace (follow the mouse). " "Other places listed are for exploration."; - namespace simon { + EX namespace simon { vector path; int tobuild; @@ -1273,7 +1277,7 @@ EX namespace peace { } } - void extend() { + EX void extend() { int i = 0; while(iitem != itDodeca) i++; if(tobuild == i+9) @@ -1282,7 +1286,7 @@ EX namespace peace { build(); } - void init() { + EX void init() { tobuild = 0; if(!on) return; if(otherpuzzles) { items[itGreenStone] = 500; return; } @@ -1296,12 +1300,12 @@ EX namespace peace { extend(); } - void restore() { + EX void restore() { for(int i=1; iitem == itNone && items[itDodeca]) path[i]->item = itDodeca, items[itDodeca]--; } - } + EX } void showMenu() { listLevels();