From 05bd7a905c7ee3dd38af361b125dac91f89953d1 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Fri, 9 Aug 2019 23:08:42 +0200 Subject: [PATCH] more header cleanup --- config.cpp | 12 +-- game.cpp | 2 +- graph.cpp | 38 +++++-- hud.cpp | 14 +++ hyper.h | 289 +++------------------------------------------------ landgen.cpp | 6 +- menus.cpp | 4 +- pattern2.cpp | 82 +++++++++++---- shmup.cpp | 162 ++++++++++++++++++----------- 9 files changed, 231 insertions(+), 378 deletions(-) diff --git a/config.cpp b/config.cpp index 60a759b7..3cdfcd3e 100644 --- a/config.cpp +++ b/config.cpp @@ -472,7 +472,7 @@ EX void initConfig() { addsaver(nisot::geodesic_movement, "solv_geodesic_movement", true); #if CAP_SHMUP - shmup::initConfig(); + multi::initConfig(); #endif #if CAP_CONFIG @@ -1621,7 +1621,7 @@ EX void showCustomizeChar() { gamescreen(4); dialog::init(XLAT("Customize character")); - if(shmup::on || multi::players) shmup::cpid = shmup::cpid_edit % shmup::players; + if(shmup::on || multi::players) multi::cpid = multi::cpid_edit % multi::players; charstyle& cs = getcs(); dialog::addSelItem(XLAT("character"), csname(cs), 'g'); @@ -1639,7 +1639,7 @@ EX void showCustomizeChar() { if(!shmup::on && multi::players == 1) dialog::addSelItem(XLAT("save whom"), XLAT1(minf[moPrincess].name), 'p'); - if(numplayers() > 1) dialog::addSelItem(XLAT("player"), its(shmup::cpid+1), 'a'); + if(numplayers() > 1) dialog::addSelItem(XLAT("player"), its(multi::cpid+1), 'a'); dialog::addBoolItem(XLAT("left-handed"), cs.lefthanded, 'l'); @@ -1666,10 +1666,10 @@ EX void showCustomizeChar() { keyhandler = [] (int sym, int uni) { dialog::handleNavigation(sym, uni); - if(shmup::on || multi::players) shmup::cpid = shmup::cpid_edit % shmup::players; + if(shmup::on || multi::players) multi::cpid = multi::cpid_edit % multi::players; charstyle& cs = getcs(); bool cat = cs.charid >= 4; - if(uni == 'a') { shmup::cpid_edit++; shmup::cpid_edit %= 60; } + if(uni == 'a') { multi::cpid_edit++; multi::cpid_edit %= 60; } else if(uni == 'g') { cs.charid++; if(cs.charid == 2 && !princess::everSaved && !autocheat) cs.charid = 4; @@ -1980,7 +1980,7 @@ EX void showSettings() { #if CAP_SHMUP if(CAP_SHMUP && !ISMOBILE) { dialog::addSelItem(XLAT("keyboard & joysticks"), "", 'k'); - dialog::add_action(shmup::configure); + dialog::add_action(multi::configure); } #endif diff --git a/game.cpp b/game.cpp index 0d629096..0553457f 100644 --- a/game.cpp +++ b/game.cpp @@ -311,7 +311,7 @@ EX void countLocalTreasure() { } } -EX int gold(int no) { +EX int gold(int no IS(0)) { int i = 0; if(!(no & NO_YENDOR)) i += items[itOrbYendor] * 50; if(!(no & NO_GRAIL)) i += items[itHolyGrail] * 10; diff --git a/graph.cpp b/graph.cpp index 1451f4f2..f6a67505 100644 --- a/graph.cpp +++ b/graph.cpp @@ -377,7 +377,7 @@ EX transmatrix iddspin(cell *c, int d, ld bonus IS(0)) { #define UNTRANS (DIM == 3 ? 0x000000FF : 0) -void drawPlayerEffects(const transmatrix& V, cell *c, bool onplayer) { +EX void drawPlayerEffects(const transmatrix& V, cell *c, bool onplayer) { if(!onplayer && !items[itOrbEmpathy]) return; if(items[itOrbShield] > (shmup::on ? 0 : ORBBASE)) drawShield(V, itOrbShield); if(items[itOrbShell] > (shmup::on ? 0 : ORBBASE)) drawShield(V, itOrbShell); @@ -552,7 +552,7 @@ double footfun(double d) { d-1; } -bool ivoryz; +EX bool ivoryz; void animallegs(const transmatrix& V, eMonster mo, color_t col, double footphase) { #if CAP_SHAPES @@ -793,7 +793,7 @@ pair makeradar(hyperpoint h) { return {true, h}; } -void addradar(const transmatrix& V, char ch, color_t col, color_t outline) { +EX void addradar(const transmatrix& V, char ch, color_t col, color_t outline) { hyperpoint h = tC0(V); auto hp = makeradar(h); if(hp.first) @@ -817,13 +817,13 @@ color_t kind_outline(eItem it) { return OUTLINE_OTHER; } -transmatrix face_the_player(const transmatrix V) { +EX transmatrix face_the_player(const transmatrix V) { if(DIM == 2) return V; if(nonisotropic) return V * cspin(0, 2, ptick(618, 0)); return rgpushxto0(tC0(V)); } -hpcshape& orbshape(eOrbshape s) { +EX hpcshape& orbshape(eOrbshape s) { switch(s) { case osLove: return cgi.shLoveRing; case osRanged: return cgi.shTargetRing; @@ -1347,7 +1347,7 @@ void drawMimic(eMonster m, cell *where, const transmatrix& V, color_t col, doubl } } -bool drawMonsterType(eMonster m, cell *where, const transmatrix& V1, color_t col, double footphase, color_t asciicol) { +EX bool drawMonsterType(eMonster m, cell *where, const transmatrix& V1, color_t col, double footphase, color_t asciicol) { #if MAXMDIM >= 4 if(DIM == 3 && m != moPlayer && asciicol != NOCOLOR) @@ -3065,7 +3065,7 @@ EX int countMinesAround(cell *c) { return mines; } -transmatrix applyPatterndir(cell *c, const patterns::patterninfo& si) { +EX transmatrix applyPatterndir(cell *c, const patterns::patterninfo& si) { if(NONSTDVAR || binarytiling) return Id; transmatrix V = ddspin(c, si.dir, M_PI); if(si.reflect) V = V * Mirror; @@ -6754,14 +6754,14 @@ EX void drawFireParticles(cell *c, int qty, int maxspeed IS(100)) { for(int i=0; iland].color, 1), 4, 50); } -void fallingMonsterAnimation(cell *c, eMonster m, int id) { +EX void fallingMonsterAnimation(cell *c, eMonster m, int id IS(multi::cpid)) { if(!mmspatial) return; fallanim& fa = fallanims[c]; fa.t_mon = ticks; @@ -7836,7 +7836,25 @@ auto graphcm = addHook(clearmemory, 0, [] () { //=== animation -array, ANIMLAYERS> animations; +#if HDR +struct animation { + int ltick; + double footphase; + transmatrix wherenow; + int attacking; + transmatrix attackat; + bool mirrored; + }; + +// we need separate animation layers for Orb of Domination and Tentacle+Ghost, +// and also to mark Boats +#define ANIMLAYERS 3 +#define LAYER_BIG 0 // for worms and krakens +#define LAYER_SMALL 1 // for others +#define LAYER_BOAT 2 // mark that a boat has moved +#endif + +EX array, ANIMLAYERS> animations; EX int revhint(cell *c, int hint) { if(hint >= 0 && hint < c->type) return c->c.spin(hint); diff --git a/hud.cpp b/hud.cpp index ab1c7c07..6487d2ca 100644 --- a/hud.cpp +++ b/hud.cpp @@ -3,6 +3,20 @@ namespace hr { +#if HDR +struct radarpoint { + hyperpoint h; + char glyph; + color_t color; + color_t line; + }; + +struct radarline { + hyperpoint h1, h2; + color_t line; + }; +#endif + EX vector radarpoints; EX vector radarlines; diff --git a/hyper.h b/hyper.h index b8c91705..0f2fae18 100644 --- a/hyper.h +++ b/hyper.h @@ -891,161 +891,16 @@ void initcs(charstyle& cs); extern bool flipplayer; -namespace multi { - - extern bool alwaysuse; - void recall(); - extern cell *origpos[MAXPLAYER], *origtarget[MAXPLAYER]; - extern int players; - extern cellwalker player[MAXPLAYER]; - extern bool flipped[MAXPLAYER]; - cell *mplayerpos(int i); - - extern vector revive_queue; // queue for revival - - extern movedir whereto[MAXPLAYER]; // player's target cell - - extern int cpid; // player id -- an extra parameter for player-related functions - extern int cpid_edit; // cpid currently being edited - - // treasure collection, kill, and death statistics - extern int treasures[MAXPLAYER], kills[MAXPLAYER], deaths[MAXPLAYER]; - - void saveConfig(FILE *f); - void loadConfig(FILE *f); - void initConfig(); - - extern charstyle scs[MAXPLAYER]; - - bool playerActive(int p); - int activePlayers(); - cell *multiPlayerTarget(int i); - void checklastmove(); - void leaveGame(int i); - void configure(); - - void showConfigureMultiplayer(); - } - template class hookset : public map> {}; typedef hookset *purehookset; -namespace shmup { - using namespace multi; - void recall(); - extern bool on; - extern bool delayed_safety; - extern int curtime; - void clearMonsters(); - void clearMemory(); - void init(); - void teleported(); - - struct monster { - eMonster type; - cell *base; - cell *torigin; - // tortoises: origin - // butterflies: last position - transmatrix at; - transmatrix pat; - eMonster stk; - bool dead; - bool notpushed; - bool inBoat; - bool no_targetting; - monster *parent; // who shot this missile - eMonster parenttype; // type of the parent - int nextshot; // when will it be able to shot (players/flailers) - int pid; // player ID - int hitpoints; // hitpoints; or time elapsed in Asteroids - int stunoff; - int blowoff; - double swordangle; // sword angle wrt at - double vel; // velocity, for flail balls - double footphase; - bool isVirtual; // off the screen: gmatrix is unknown, and pat equals at - hyperpoint inertia;// for frictionless lands - - monster() { - dead = false; inBoat = false; parent = NULL; nextshot = 0; - stunoff = 0; blowoff = 0; footphase = 0; no_targetting = false; - swordangle = 0; inertia = Hypc; - } - - void store(); - - void findpat(); - - cell *findbase(const transmatrix& T); - - void rebasePat(const transmatrix& new_pat); - - }; - - extern struct monster* mousetarget; - extern monster *pc[MAXPLAYER]; - extern eItem targetRangedOrb(orbAction a); - void degradeDemons(); - void killThePlayer(eMonster m); - void killThePlayer(eMonster m, int i); - void visibleFor(int t); - bool verifyTeleport(); - bool dragonbreath(cell *dragon); - - void shmupDrownPlayers(cell *c); - - cell *playerpos(int i); - - bool playerInBoat(int i); - void destroyBoats(cell *c); - bool boatAt(cell *c); - - void fixStorage(); - void addShmupHelp(string& out); - void activateArrow(cell *c); - - void pushmonsters(); - void popmonsters(); - - extern hookset *hooks_turn; - extern hookset *hooks_draw; - extern hookset *hooks_kill; - extern hookset *hooks_describe; - - void turn(int); - extern monster *lmousetarget; - void virtualRebase(shmup::monster *m, bool tohex); - - extern monster *pc[MAXPLAYER]; - int reflect(cell*& c2, cell*& mbase, transmatrix& nat); - - void switch_shmup(); - } - static const int NOHINT = -1; -typedef color_t color_t; - -inline string ONOFF(bool b) { return XLAT(b ? "ON" : "OFF"); } - typedef function reaction_t; typedef function bool_reaction_t; #define HELPFUN(x) (help_delegate = x, "HELPFUN") -struct radarpoint { - hyperpoint h; - char glyph; - color_t color; - color_t line; - }; - -struct radarline { - hyperpoint h1, h2; - color_t line; - }; - extern vector< function > screens; template void pushScreen(const T& x) { screens.push_back(x); } @@ -1095,75 +950,6 @@ extern display_data *current_display; typedef function cellfunction; -int coastvalEdge(cell *c); - -namespace patterns { - extern char whichShape; - extern int canvasback; - - extern cpatterntype cgroup, old_cgroup; - - enum ePattern : char { - PAT_NONE = 0, - PAT_TYPES = 'T', - PAT_ZEBRA = 'z', - PAT_EMERALD = 'f', - PAT_PALACE = 'p', - PAT_FIELD = 'F', - PAT_DOWN = 'H', - PAT_COLORING = 'C', - PAT_SIBLING = 'S', - PAT_CHESS = 'c', - PAT_SINGLETYPE = 't' - }; - - extern ePattern whichPattern; - - extern int subpattern_flags; - - static const int SPF_ROT = 1; - static const int SPF_SYM01 = 2; - static const int SPF_SYM02 = 4; - static const int SPF_SYM03 = 8; - static const int SPF_CHANGEROT = 16; - static const int SPF_TWOCOL = 32; - static const int SPF_EXTRASYM = 64; - static const int SPF_ALTERNATE = 128; - static const int SPF_FOOTBALL = 256; - static const int SPF_FULLSYM = 512; - static const int SPF_DOCKS = 1024; - static const int SPF_NO_SUBCODES = 2048; - - static const int SPF_SYM0123 = SPF_SYM01 | SPF_SYM02 | SPF_SYM03; - - extern char whichCanvas; - - extern bool displaycodes; - - int generateCanvas(cell *c); - - struct patterninfo { - int id; - int dir; - bool reflect; - int symmetries; - }; - - patterninfo getpatterninfo(cell *c, ePattern pat, int sub); - - inline patterninfo getpatterninfo0(cell *c) { - return getpatterninfo(c, whichPattern, subpattern_flags); - } - - bool compatible(cpatterntype oldp, cpatterntype newp); - extern void pushChangeablePatterns(); - void computeCgroup(); - void showPattern(); - void val38(cell *c, patterninfo &si, int sub, int pat); - - int downdir(cell *c, const cellfunction& cf = coastvalEdge); - } - namespace mapeditor { #if CAP_EDIT extern map modelcell; @@ -1299,6 +1085,8 @@ extern ld ruggo; #define HASLINEVIEW +namespace shmup { struct monster; } + namespace conformal { extern bool on; extern vector > killhistory; @@ -1351,7 +1139,7 @@ namespace conformal { void apply(); void movetophase(); void renderAutoband(); - + extern vector v; extern double phase; void applyIB(); @@ -1488,9 +1276,6 @@ static const int NO_YENDOR = 2; static const int NO_GRAIL = 4; static const int NO_LOVE = 8; -int gold(int no = 0); -int tkills(); - bool markOrb(eItem it); // mark the orb as 'used', return true if exists bool markEmpathy(eItem it); // mark both the given orb and Empathy as 'used', return true if exists bool markEmpathy2(eItem it); // as above, but next turn @@ -1644,9 +1429,6 @@ bool isDragon(eMonster m); extern "C" { void *_Unwind_Resume = 0; } #endif -extern bool autocheat; -extern bool inHighQual; - void mountmove(cell *c, int spin, bool fp); void mountmove(cell *c, int spin, bool fp, cell *ppos); void mountswap(cell *c1, int spin1, bool fp1, cell *c2, int spin2, bool fp2); @@ -1749,8 +1531,6 @@ namespace svg { } #endif -extern int sightrange_bonus, genrange_bonus, gamerange_bonus; - namespace halloween { void getTreat(cell *where); } @@ -1758,55 +1538,12 @@ namespace halloween { // just in case if I change my mind about when Orbs lose their power #define ORBBASE 0 -transmatrix mscale(const transmatrix& t, double fac); -transmatrix mzscale(const transmatrix& t, double fac); -extern bool ivoryz; #define mmscale(V, x) (mmspatial ? (ivoryz ? mzscale(V,x) : mscale(V, x)) : (V)) #define SHADOW_WALL 0x60 #define SHADOW_SL 0x18 #define SHADOW_MON 0x30 -transmatrix face_the_player(const transmatrix V); -void addradar(const transmatrix& V, char ch, color_t col, color_t outline); - -bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, color_t col, double footphase, color_t asciicol); - -void drawPlayerEffects(const transmatrix& V, cell *c, bool onPlayer); - -// monster movement animations - -struct animation { - int ltick; - double footphase; - transmatrix wherenow; - int attacking; - transmatrix attackat; - bool mirrored; - }; - -// we need separate animation layers for Orb of Domination and Tentacle+Ghost, -// and also to mark Boats -#define ANIMLAYERS 3 -#define LAYER_BIG 0 // for worms and krakens -#define LAYER_SMALL 1 // for others -#define LAYER_BOAT 2 // mark that a boat has moved - -extern array, ANIMLAYERS> animations; - -void animateAttack(cell *src, cell *tgt, int layer, int direction_hint); - -void animateMovement(cell *src, cell *tgt, int layer, int direction_hint); - -// for animations which might use the same locations, -// such as replacements or multi-tile monsters -void indAnimateMovement(cell *src, cell *tgt, int layer, int direction_hint); -void commitAnimations(int layer); - -void animateReplacement(cell *a, cell *b, int layer, int direction_hinta, int direction_hintb); -void fallingFloorAnimation(cell *c, eWall w = waNone, eMonster m = moNone); -void fallingMonsterAnimation(cell *c, eMonster m, int id = multi::cpid); - // ranks: enum class PPR { ZERO, EUCLIDEAN_SKY, OUTCIRCLE, MOVESTAR, @@ -2002,6 +1739,8 @@ color_t darkena(color_t c, int lev, int a); namespace anims { void animate_parameter(ld &x, string f, const reaction_t& r); } extern bool timerghost; +extern bool autocheat; +extern int cheater; namespace arg { #if CAP_COMMANDLINE @@ -2748,20 +2487,9 @@ extern colortable nestcolors; unsigned char& part(color_t& col, int i); -transmatrix applyPatterndir(cell *c, const patterns::patterninfo& si); - int pattern_threecolor(cell *c); int fiftyval200(cell *c); -// T * C0, optimized -inline hyperpoint tC0(const transmatrix &T) { - hyperpoint z; - for(int i=0; i> 2; - int subcanvas; - bool displaycodes; - char whichShape = 0; - char whichCanvas = 0; +EX namespace patterns { + EX int canvasback = linf[laCanvas].color >> 2; + EX int subcanvas; + EX bool displaycodes; + EX char whichShape = 0; + EX char whichCanvas = 0; int sevenval(cell *c) { if(!euclid) return 0; @@ -1445,7 +1489,7 @@ namespace patterns { return ep.parse(); } - int generateCanvas(cell *c) { + EX int generateCanvas(cell *c) { switch(whichCanvas) { #if CAP_CRYSTAL case 'K': @@ -1710,7 +1754,7 @@ namespace patterns { #define REMAP_TEXTURE (void)0 #endif - void showPattern() { + EX void showPattern() { cmode = sm::SIDE | sm::MAYDARK; { dynamicval dc(displaycodes, whichPattern); @@ -1886,7 +1930,7 @@ namespace patterns { }; } - bool compatible(cpatterntype oldp, cpatterntype newp) { + EX bool compatible(cpatterntype oldp, cpatterntype newp) { // larges are not incompatible between themselves if(newp == cpLarge || newp == cpZebra) return false; @@ -1996,7 +2040,7 @@ namespace patterns { }} }; - cpatterntype cgroup, old_cgroup; + EX cpatterntype cgroup, old_cgroup; void showChangeablePatterns() { cmode = sm::SIDE | sm::MAYDARK; @@ -2067,7 +2111,7 @@ namespace patterns { }; } - void computeCgroup() { + EX void computeCgroup() { cgroup = cpUnknown; if(whichPattern == PAT_SINGLETYPE) { cgroup = cpSingle; @@ -2093,11 +2137,11 @@ namespace patterns { old_cgroup = cgroup; } - void pushChangeablePatterns() { + EX void pushChangeablePatterns() { pushScreen(showChangeablePatterns); computeCgroup(); } - } + EX } bool is_master(cell *c) { if(euclid) return pseudohept(c); diff --git a/shmup.cpp b/shmup.cpp index 79ee73e8..44209b44 100644 --- a/shmup.cpp +++ b/shmup.cpp @@ -22,24 +22,25 @@ namespace shmupballs { } } -namespace multi { +EX namespace multi { config scfg; - charstyle scs[MAXPLAYER]; + EX charstyle scs[MAXPLAYER]; - int players = 1; - cellwalker player[MAXPLAYER]; - vector revive_queue; // queue for revival + EX int players = 1; + EX cellwalker player[MAXPLAYER]; + EX vector revive_queue; // queue for revival - cell *origpos[MAXPLAYER], *origtarget[MAXPLAYER]; + EX cell *origpos[MAXPLAYER], *origtarget[MAXPLAYER]; - bool flipped[MAXPLAYER]; + EX bool flipped[MAXPLAYER]; - int treasures[MAXPLAYER], kills[MAXPLAYER], deaths[MAXPLAYER]; + // treasure collection, kill, and death statistics + EX int treasures[MAXPLAYER], kills[MAXPLAYER], deaths[MAXPLAYER]; - bool alwaysuse = false; + EX bool alwaysuse = false; - void recall() { + EX void recall() { for(int i=0; itype; cell *c2 = cwt.at->move(idir); @@ -60,10 +61,10 @@ namespace multi { bool combo[MAXPLAYER]; - int cpid; // player id -- an extra parameter for player-related functions - int cpid_edit; // cpid currently being edited + EX int cpid; // player id -- an extra parameter for player-related functions + EX int cpid_edit; // cpid currently being edited - movedir whereto[MAXPLAYER]; // player's target cell + EX movedir whereto[MAXPLAYER]; // player's target cell double mdx[MAXPLAYER], mdy[MAXPLAYER]; // movement vector for the next move @@ -471,11 +472,11 @@ struct shmup_configurer { } }; -void configure() { +EX void configure() { pushScreen(shmup_configurer()); } -void showConfigureMultiplayer() { +EX void showConfigureMultiplayer() { gamescreen(1); dialog::init("multiplayer"); @@ -500,7 +501,7 @@ void showConfigureMultiplayer() { }); dialog::addSelItem(XLAT("keyboard & joysticks"), "", 'k'); - dialog::add_action(shmup::configure); + dialog::add_action(multi::configure); } else dialog::addBreak(200); @@ -532,7 +533,7 @@ bool notremapped(int sym) { return k > multi::players; } -void initConfig() { +EX void initConfig() { char* t = scfg.keyaction; @@ -750,26 +751,25 @@ void handleInput(int delta) { int tableid[7] = {1, 2, 4, 5, 6, 7, 8}; - - void leaveGame(int i) { + EX void leaveGame(int i) { multi::player[i].at = NULL; multi::deaths[i]++; revive_queue.push_back(i); checklastmove(); } - bool playerActive(int p) { + EX bool playerActive(int p) { if(multi::players == 1 || shmup::on) return true; return player[p].at; } - int activePlayers() { + EX int activePlayers() { int q = 0; for(int i=0; i= 2); } - } + EX } /* const char *lastprofile = ""; @@ -976,7 +976,51 @@ void profile(const char *buf) { #define SCALE cgi.scalefactor #define SCALE2 (SCALE*SCALE) -namespace shmup { +EX namespace shmup { + +#if HDR +struct monster { + eMonster type; + cell *base; + cell *torigin; + // tortoises: origin + // butterflies: last position + transmatrix at; + transmatrix pat; + eMonster stk; + bool dead; + bool notpushed; + bool inBoat; + bool no_targetting; + monster *parent; // who shot this missile + eMonster parenttype; // type of the parent + int nextshot; // when will it be able to shot (players/flailers) + int pid; // player ID + int hitpoints; // hitpoints; or time elapsed in Asteroids + int stunoff; + int blowoff; + double swordangle; // sword angle wrt at + double vel; // velocity, for flail balls + double footphase; + bool isVirtual; // off the screen: gmatrix is unknown, and pat equals at + hyperpoint inertia;// for frictionless lands + + monster() { + dead = false; inBoat = false; parent = NULL; nextshot = 0; + stunoff = 0; blowoff = 0; footphase = 0; no_targetting = false; + swordangle = 0; inertia = Hypc; + } + + void store(); + + void findpat(); + + cell *findbase(const transmatrix& T); + + void rebasePat(const transmatrix& new_pat); + + }; +#endif using namespace multi; @@ -985,14 +1029,12 @@ eItem keyresult[MAXPLAYER]; ld fabsl(ld x) { return x>0?x:-x; } -bool on = false; -bool delayed_safety = false; +EX bool on = false; +EX bool delayed_safety = false; bool lastdead = false; -struct monster; - -multimap monstersAt; +EX multimap monstersAt; typedef multimap::iterator mit; @@ -1110,9 +1152,9 @@ bool trackroute(monster *m, transmatrix goal, double spd) { return true; } -monster *pc[MAXPLAYER], *mousetarget, *lmousetarget; +EX monster *pc[MAXPLAYER], *mousetarget, *lmousetarget; -int curtime, nextmove, nextdragon; +EX int curtime, nextmove, nextdragon; bool isBullet(monster *m) { return isBulletType(m->type); @@ -1120,7 +1162,7 @@ bool isBullet(monster *m) { bool isPlayer(monster *m) { return m->type == moPlayer; } bool isMonster(monster *m) { return m->type != moPlayer && m->type != moBullet; } -hookset *hooks_kill; +EX hookset *hooks_kill; void killMonster(monster* m, eMonster who_kills, int flags = 0) { int tk = tkills(); @@ -1147,7 +1189,7 @@ void killMonster(monster* m, eMonster who_kills, int flags = 0) { multi::kills[multi::cpid] += tkills() - tk; } -void pushmonsters() { +EX void pushmonsters() { for(monster *m: nonvirtual) { m->notpushed = isPlayer(m) || m->dead || (m->base->monst && m->base->monst != m->type); if(!m->notpushed) { @@ -1157,7 +1199,7 @@ void pushmonsters() { } } -void popmonsters() { +EX void popmonsters() { for(int i=isize(nonvirtual)-1; i>=0; i--) { monster *m = nonvirtual[i]; if(!m->notpushed) { @@ -1176,7 +1218,7 @@ void popmonsters() { } } -void degradeDemons() { +EX void degradeDemons() { for(monster* m: nonvirtual) { if(m->type == moGreater) m->type = moLesser; if(m->stk == moGreater) m->type = moLesser; @@ -1232,7 +1274,7 @@ void awakenMimics(monster *m, cell *c2) { int visibleAt; -void visibleFor(int t) { +EX void visibleFor(int t) { visibleAt = max(visibleAt, curtime + t); } @@ -1292,7 +1334,7 @@ void shootBullet(monster *m) { } } -void killThePlayer(eMonster m) { +EX void killThePlayer(eMonster m) { if(cpid >= 0 && cpid < MAXPLAYER && pc[cpid]) pc[cpid]->dead = true; } @@ -1497,7 +1539,7 @@ bool hornKills(eMonster m) { queue> traplist, firetraplist; -void activateArrow(cell *c) { +EX void activateArrow(cell *c) { if(isCentralTrap(c)) traplist.emplace(ticks + 500, c); } @@ -2203,7 +2245,7 @@ bool reflectmatrix(transmatrix& M, cell *c1, cell *c2, bool onlypos) { return true; } -int reflect(cell*& c2, cell*& mbase, transmatrix& nat) { +EX int reflect(cell*& c2, cell*& mbase, transmatrix& nat) { int reflections = 0; if(c2 != mbase && c2->wall == waMirrorWall && inmirror(c2)) { if(reflectmatrix(nat, mbase, c2, false)) { @@ -2292,7 +2334,7 @@ monster *parentOrSelf(monster *m) { return m->parent ? m->parent : m; } -bool verifyTeleport() { +EX bool verifyTeleport() { if(!on) return true; if(playerCrash(pc[cpid], mouseh)) return false; return true; @@ -2304,7 +2346,7 @@ void destroyMimics() { m->dead = true; } -void teleported() { +EX void teleported() { monster *m = pc[cpid]; m->base = cwt.at; m->at = rgpushxto0(inverse(gmatrix[cwt.at]) * mouseh) * spin(rand() % 1000 * M_PI / 2000); @@ -2357,7 +2399,7 @@ eItem targetRangedOrbKey(orbAction a) { return r; } -eItem targetRangedOrb(orbAction a) { +EX eItem targetRangedOrb(orbAction a) { if(!on) return itNone; monster *wpc = pc[cpid]; if(a != roCheck && !wpc) return itNone; @@ -2664,7 +2706,7 @@ bool closer(monster *m1, monster *m2) { return intval(m1->pat*C0, closerTo) < intval(m2->pat*C0, closerTo); } -bool dragonbreath(cell *dragon) { +EX bool dragonbreath(cell *dragon) { int randplayer = hrand(numplayers()); monster* bullet = new monster; bullet->base = dragon; @@ -3284,7 +3326,7 @@ void activateMonstersAt(cell *c) { } } -void fixStorage() { +EX void fixStorage() { vector restore; @@ -3296,9 +3338,9 @@ void fixStorage() { for(monster *m: restore) m->store(); } -hookset *hooks_turn; +EX hookset *hooks_turn; -void turn(int delta) { +EX void turn(int delta) { if(racing::on && subscreens::split( [delta] () { turn(delta); })) return; @@ -3554,7 +3596,7 @@ void turn(int delta) { active.clear(); } -void recall() { +EX void recall() { for(int i=0; ibase = cwt.at; if(players == 1) @@ -3568,7 +3610,7 @@ void recall() { destroyMimics(); } -void init() { +EX void init() { for(int i=0; i p = monstersAt.equal_range(c); for(mit it = p.first; it != p.second; it++) { @@ -3608,7 +3650,7 @@ bool boatAt(cell *c) { return false; } -hookset *hooks_draw; +EX hookset *hooks_draw; bool drawMonster(const transmatrix& V, cell *c, const transmatrix*& Vboat, transmatrix& Vboat0, const transmatrix *Vdp) { #if CAP_SHAPES @@ -3789,7 +3831,7 @@ bool drawMonster(const transmatrix& V, cell *c, const transmatrix*& Vboat, trans return false; } -void clearMonsters() { +EX void clearMonsters() { for(mit it = monstersAt.begin(); it != monstersAt.end(); it++) delete(it->second); for(monster *m: active) delete m; @@ -3799,7 +3841,7 @@ void clearMonsters() { active.clear(); } -void clearMemory() { +EX void clearMemory() { clearMonsters(); gmatrix.clear(); while(!traplist.empty()) traplist.pop(); @@ -3830,29 +3872,29 @@ void gamedata(hr::gamedata* gd) { } } -cell *playerpos(int i) { +EX cell *playerpos(int i) { if(!pc[i]) return NULL; return pc[i]->base; } -bool playerInBoat(int i) { +EX bool playerInBoat(int i) { if(!pc[i]) return false; return pc[i]->inBoat; } -void destroyBoats(cell *c) { +EX void destroyBoats(cell *c) { for(monster *m: active) if(m->base == c && m->inBoat) m->inBoat = false; } -void virtualRebase(shmup::monster *m, bool tohex) { +EX void virtualRebase(shmup::monster *m, bool tohex) { virtualRebase(m->base, m->at, tohex); } -hookset *hooks_describe; +EX hookset *hooks_describe; -void addShmupHelp(string& out) { +EX void addShmupHelp(string& out) { if(shmup::mousetarget && intval(mouseh, tC0(shmup::mousetarget->pat)) < .1) { if(callhandlers(false, hooks_describe, shmup::mousetarget, out)) return; out += XLAT1(minf[shmup::mousetarget->type].name); @@ -3873,7 +3915,7 @@ auto hooks = addHook(clearmemory, 0, shmup::clearMemory) + } }); -void switch_shmup() { +EX void switch_shmup() { stop_game(); switch_game_mode(rg::shmup); resetScores();