more header cleanup
This commit is contained in:
parent
e1194ff588
commit
05bd7a905c
12
config.cpp
12
config.cpp
|
@ -472,7 +472,7 @@ EX void initConfig() {
|
||||||
addsaver(nisot::geodesic_movement, "solv_geodesic_movement", true);
|
addsaver(nisot::geodesic_movement, "solv_geodesic_movement", true);
|
||||||
|
|
||||||
#if CAP_SHMUP
|
#if CAP_SHMUP
|
||||||
shmup::initConfig();
|
multi::initConfig();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CAP_CONFIG
|
#if CAP_CONFIG
|
||||||
|
@ -1621,7 +1621,7 @@ EX void showCustomizeChar() {
|
||||||
gamescreen(4);
|
gamescreen(4);
|
||||||
dialog::init(XLAT("Customize character"));
|
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();
|
charstyle& cs = getcs();
|
||||||
|
|
||||||
dialog::addSelItem(XLAT("character"), csname(cs), 'g');
|
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(!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');
|
dialog::addBoolItem(XLAT("left-handed"), cs.lefthanded, 'l');
|
||||||
|
|
||||||
|
@ -1666,10 +1666,10 @@ EX void showCustomizeChar() {
|
||||||
keyhandler = [] (int sym, int uni) {
|
keyhandler = [] (int sym, int uni) {
|
||||||
dialog::handleNavigation(sym, 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();
|
charstyle& cs = getcs();
|
||||||
bool cat = cs.charid >= 4;
|
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') {
|
else if(uni == 'g') {
|
||||||
cs.charid++;
|
cs.charid++;
|
||||||
if(cs.charid == 2 && !princess::everSaved && !autocheat) cs.charid = 4;
|
if(cs.charid == 2 && !princess::everSaved && !autocheat) cs.charid = 4;
|
||||||
|
@ -1980,7 +1980,7 @@ EX void showSettings() {
|
||||||
#if CAP_SHMUP
|
#if CAP_SHMUP
|
||||||
if(CAP_SHMUP && !ISMOBILE) {
|
if(CAP_SHMUP && !ISMOBILE) {
|
||||||
dialog::addSelItem(XLAT("keyboard & joysticks"), "", 'k');
|
dialog::addSelItem(XLAT("keyboard & joysticks"), "", 'k');
|
||||||
dialog::add_action(shmup::configure);
|
dialog::add_action(multi::configure);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
2
game.cpp
2
game.cpp
|
@ -311,7 +311,7 @@ EX void countLocalTreasure() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EX int gold(int no) {
|
EX int gold(int no IS(0)) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
if(!(no & NO_YENDOR)) i += items[itOrbYendor] * 50;
|
if(!(no & NO_YENDOR)) i += items[itOrbYendor] * 50;
|
||||||
if(!(no & NO_GRAIL)) i += items[itHolyGrail] * 10;
|
if(!(no & NO_GRAIL)) i += items[itHolyGrail] * 10;
|
||||||
|
|
38
graph.cpp
38
graph.cpp
|
@ -377,7 +377,7 @@ EX transmatrix iddspin(cell *c, int d, ld bonus IS(0)) {
|
||||||
|
|
||||||
#define UNTRANS (DIM == 3 ? 0x000000FF : 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(!onplayer && !items[itOrbEmpathy]) return;
|
||||||
if(items[itOrbShield] > (shmup::on ? 0 : ORBBASE)) drawShield(V, itOrbShield);
|
if(items[itOrbShield] > (shmup::on ? 0 : ORBBASE)) drawShield(V, itOrbShield);
|
||||||
if(items[itOrbShell] > (shmup::on ? 0 : ORBBASE)) drawShield(V, itOrbShell);
|
if(items[itOrbShell] > (shmup::on ? 0 : ORBBASE)) drawShield(V, itOrbShell);
|
||||||
|
@ -552,7 +552,7 @@ double footfun(double d) {
|
||||||
d-1;
|
d-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ivoryz;
|
EX bool ivoryz;
|
||||||
|
|
||||||
void animallegs(const transmatrix& V, eMonster mo, color_t col, double footphase) {
|
void animallegs(const transmatrix& V, eMonster mo, color_t col, double footphase) {
|
||||||
#if CAP_SHAPES
|
#if CAP_SHAPES
|
||||||
|
@ -793,7 +793,7 @@ pair<bool, hyperpoint> makeradar(hyperpoint h) {
|
||||||
return {true, 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);
|
hyperpoint h = tC0(V);
|
||||||
auto hp = makeradar(h);
|
auto hp = makeradar(h);
|
||||||
if(hp.first)
|
if(hp.first)
|
||||||
|
@ -817,13 +817,13 @@ color_t kind_outline(eItem it) {
|
||||||
return OUTLINE_OTHER;
|
return OUTLINE_OTHER;
|
||||||
}
|
}
|
||||||
|
|
||||||
transmatrix face_the_player(const transmatrix V) {
|
EX transmatrix face_the_player(const transmatrix V) {
|
||||||
if(DIM == 2) return V;
|
if(DIM == 2) return V;
|
||||||
if(nonisotropic) return V * cspin(0, 2, ptick(618, 0));
|
if(nonisotropic) return V * cspin(0, 2, ptick(618, 0));
|
||||||
return rgpushxto0(tC0(V));
|
return rgpushxto0(tC0(V));
|
||||||
}
|
}
|
||||||
|
|
||||||
hpcshape& orbshape(eOrbshape s) {
|
EX hpcshape& orbshape(eOrbshape s) {
|
||||||
switch(s) {
|
switch(s) {
|
||||||
case osLove: return cgi.shLoveRing;
|
case osLove: return cgi.shLoveRing;
|
||||||
case osRanged: return cgi.shTargetRing;
|
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 MAXMDIM >= 4
|
||||||
if(DIM == 3 && m != moPlayer && asciicol != NOCOLOR)
|
if(DIM == 3 && m != moPlayer && asciicol != NOCOLOR)
|
||||||
|
@ -3065,7 +3065,7 @@ EX int countMinesAround(cell *c) {
|
||||||
return mines;
|
return mines;
|
||||||
}
|
}
|
||||||
|
|
||||||
transmatrix applyPatterndir(cell *c, const patterns::patterninfo& si) {
|
EX transmatrix applyPatterndir(cell *c, const patterns::patterninfo& si) {
|
||||||
if(NONSTDVAR || binarytiling) return Id;
|
if(NONSTDVAR || binarytiling) return Id;
|
||||||
transmatrix V = ddspin(c, si.dir, M_PI);
|
transmatrix V = ddspin(c, si.dir, M_PI);
|
||||||
if(si.reflect) V = V * Mirror;
|
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; i<qty; i++)
|
for(int i=0; i<qty; i++)
|
||||||
drawParticle(c, firegradient(i / (qty-1.)), maxspeed);
|
drawParticle(c, firegradient(i / (qty-1.)), maxspeed);
|
||||||
}
|
}
|
||||||
void fallingFloorAnimation(cell *c, eWall w, eMonster m) {
|
EX void fallingFloorAnimation(cell *c, eWall w IS(waNone), eMonster m IS(moNone)) {
|
||||||
if(!wmspatial) return;
|
if(!wmspatial) return;
|
||||||
fallanim& fa = fallanims[c];
|
fallanim& fa = fallanims[c];
|
||||||
fa.t_floor = ticks;
|
fa.t_floor = ticks;
|
||||||
fa.walltype = w; fa.m = m;
|
fa.walltype = w; fa.m = m;
|
||||||
// drawParticles(c, darkenedby(linf[c->land].color, 1), 4, 50);
|
// drawParticles(c, darkenedby(linf[c->land].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;
|
if(!mmspatial) return;
|
||||||
fallanim& fa = fallanims[c];
|
fallanim& fa = fallanims[c];
|
||||||
fa.t_mon = ticks;
|
fa.t_mon = ticks;
|
||||||
|
@ -7836,7 +7836,25 @@ auto graphcm = addHook(clearmemory, 0, [] () {
|
||||||
|
|
||||||
//=== animation
|
//=== animation
|
||||||
|
|
||||||
array<map<cell*, animation>, 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<map<cell*, animation>, ANIMLAYERS> animations;
|
||||||
|
|
||||||
EX int revhint(cell *c, int hint) {
|
EX int revhint(cell *c, int hint) {
|
||||||
if(hint >= 0 && hint < c->type) return c->c.spin(hint);
|
if(hint >= 0 && hint < c->type) return c->c.spin(hint);
|
||||||
|
|
14
hud.cpp
14
hud.cpp
|
@ -3,6 +3,20 @@
|
||||||
|
|
||||||
namespace hr {
|
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<radarpoint> radarpoints;
|
EX vector<radarpoint> radarpoints;
|
||||||
EX vector<radarline> radarlines;
|
EX vector<radarline> radarlines;
|
||||||
|
|
||||||
|
|
289
hyper.h
289
hyper.h
|
@ -891,161 +891,16 @@ void initcs(charstyle& cs);
|
||||||
|
|
||||||
extern bool flipplayer;
|
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<int> 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 T> class hookset : public map<int, function<T>> {};
|
template<class T> class hookset : public map<int, function<T>> {};
|
||||||
typedef hookset<void()> *purehookset;
|
typedef hookset<void()> *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<bool(int)> *hooks_turn;
|
|
||||||
extern hookset<bool(const transmatrix&, cell*, shmup::monster*)> *hooks_draw;
|
|
||||||
extern hookset<bool(shmup::monster*)> *hooks_kill;
|
|
||||||
extern hookset<bool(shmup::monster*, string&)> *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;
|
static const int NOHINT = -1;
|
||||||
|
|
||||||
typedef color_t color_t;
|
|
||||||
|
|
||||||
inline string ONOFF(bool b) { return XLAT(b ? "ON" : "OFF"); }
|
|
||||||
|
|
||||||
typedef function<void()> reaction_t;
|
typedef function<void()> reaction_t;
|
||||||
typedef function<bool()> bool_reaction_t;
|
typedef function<bool()> bool_reaction_t;
|
||||||
|
|
||||||
#define HELPFUN(x) (help_delegate = x, "HELPFUN")
|
#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<void()> > screens;
|
extern vector< function<void()> > screens;
|
||||||
|
|
||||||
template<class T> void pushScreen(const T& x) { screens.push_back(x); }
|
template<class T> void pushScreen(const T& x) { screens.push_back(x); }
|
||||||
|
@ -1095,75 +950,6 @@ extern display_data *current_display;
|
||||||
|
|
||||||
typedef function<int(cell*)> cellfunction;
|
typedef function<int(cell*)> 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 {
|
namespace mapeditor {
|
||||||
#if CAP_EDIT
|
#if CAP_EDIT
|
||||||
extern map<int, cell*> modelcell;
|
extern map<int, cell*> modelcell;
|
||||||
|
@ -1299,6 +1085,8 @@ extern ld ruggo;
|
||||||
|
|
||||||
#define HASLINEVIEW
|
#define HASLINEVIEW
|
||||||
|
|
||||||
|
namespace shmup { struct monster; }
|
||||||
|
|
||||||
namespace conformal {
|
namespace conformal {
|
||||||
extern bool on;
|
extern bool on;
|
||||||
extern vector<pair<cell*, eMonster> > killhistory;
|
extern vector<pair<cell*, eMonster> > killhistory;
|
||||||
|
@ -1351,7 +1139,7 @@ namespace conformal {
|
||||||
void apply();
|
void apply();
|
||||||
void movetophase();
|
void movetophase();
|
||||||
void renderAutoband();
|
void renderAutoband();
|
||||||
|
|
||||||
extern vector<shmup::monster*> v;
|
extern vector<shmup::monster*> v;
|
||||||
extern double phase;
|
extern double phase;
|
||||||
void applyIB();
|
void applyIB();
|
||||||
|
@ -1488,9 +1276,6 @@ static const int NO_YENDOR = 2;
|
||||||
static const int NO_GRAIL = 4;
|
static const int NO_GRAIL = 4;
|
||||||
static const int NO_LOVE = 8;
|
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 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 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
|
bool markEmpathy2(eItem it); // as above, but next turn
|
||||||
|
@ -1644,9 +1429,6 @@ bool isDragon(eMonster m);
|
||||||
extern "C" { void *_Unwind_Resume = 0; }
|
extern "C" { void *_Unwind_Resume = 0; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern bool autocheat;
|
|
||||||
extern bool inHighQual;
|
|
||||||
|
|
||||||
void mountmove(cell *c, int spin, bool fp);
|
void mountmove(cell *c, int spin, bool fp);
|
||||||
void mountmove(cell *c, int spin, bool fp, cell *ppos);
|
void mountmove(cell *c, int spin, bool fp, cell *ppos);
|
||||||
void mountswap(cell *c1, int spin1, bool fp1, cell *c2, int spin2, bool fp2);
|
void mountswap(cell *c1, int spin1, bool fp1, cell *c2, int spin2, bool fp2);
|
||||||
|
@ -1749,8 +1531,6 @@ namespace svg {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int sightrange_bonus, genrange_bonus, gamerange_bonus;
|
|
||||||
|
|
||||||
namespace halloween {
|
namespace halloween {
|
||||||
void getTreat(cell *where);
|
void getTreat(cell *where);
|
||||||
}
|
}
|
||||||
|
@ -1758,55 +1538,12 @@ namespace halloween {
|
||||||
// just in case if I change my mind about when Orbs lose their power
|
// just in case if I change my mind about when Orbs lose their power
|
||||||
#define ORBBASE 0
|
#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 mmscale(V, x) (mmspatial ? (ivoryz ? mzscale(V,x) : mscale(V, x)) : (V))
|
||||||
|
|
||||||
#define SHADOW_WALL 0x60
|
#define SHADOW_WALL 0x60
|
||||||
#define SHADOW_SL 0x18
|
#define SHADOW_SL 0x18
|
||||||
#define SHADOW_MON 0x30
|
#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<map<cell*, animation>, 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:
|
// ranks:
|
||||||
enum class PPR {
|
enum class PPR {
|
||||||
ZERO, EUCLIDEAN_SKY, OUTCIRCLE, MOVESTAR,
|
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); }
|
namespace anims { void animate_parameter(ld &x, string f, const reaction_t& r); }
|
||||||
|
|
||||||
extern bool timerghost;
|
extern bool timerghost;
|
||||||
|
extern bool autocheat;
|
||||||
|
extern int cheater;
|
||||||
|
|
||||||
namespace arg {
|
namespace arg {
|
||||||
#if CAP_COMMANDLINE
|
#if CAP_COMMANDLINE
|
||||||
|
@ -2748,20 +2487,9 @@ extern colortable nestcolors;
|
||||||
|
|
||||||
unsigned char& part(color_t& col, int i);
|
unsigned char& part(color_t& col, int i);
|
||||||
|
|
||||||
transmatrix applyPatterndir(cell *c, const patterns::patterninfo& si);
|
|
||||||
|
|
||||||
int pattern_threecolor(cell *c);
|
int pattern_threecolor(cell *c);
|
||||||
int fiftyval200(cell *c);
|
int fiftyval200(cell *c);
|
||||||
|
|
||||||
// T * C0, optimized
|
|
||||||
inline hyperpoint tC0(const transmatrix &T) {
|
|
||||||
hyperpoint z;
|
|
||||||
for(int i=0; i<MDIM; i++) z[i] = T[i][DIM];
|
|
||||||
return z;
|
|
||||||
}
|
|
||||||
|
|
||||||
transmatrix actualV(const heptspin& hs, const transmatrix& V);
|
|
||||||
transmatrix cview();
|
|
||||||
bool isWall3(cell *c, color_t& wcol);
|
bool isWall3(cell *c, color_t& wcol);
|
||||||
extern transmatrix actual_view_transform, radar_transform;
|
extern transmatrix actual_view_transform, radar_transform;
|
||||||
ld wall_radar(cell *c, transmatrix T);
|
ld wall_radar(cell *c, transmatrix T);
|
||||||
|
@ -3457,4 +3185,11 @@ namespace hr {
|
||||||
inline hyperpoint xpush0(ld x) { return cpush0(0, x); }
|
inline hyperpoint xpush0(ld x) { return cpush0(0, x); }
|
||||||
inline hyperpoint ypush0(ld x) { return cpush0(1, x); }
|
inline hyperpoint ypush0(ld x) { return cpush0(1, x); }
|
||||||
inline void reset_projection() { new_projection_needed = true; }
|
inline void reset_projection() { new_projection_needed = true; }
|
||||||
|
|
||||||
|
// T * C0, optimized
|
||||||
|
inline hyperpoint tC0(const transmatrix &T) {
|
||||||
|
hyperpoint z;
|
||||||
|
for(int i=0; i<MDIM; i++) z[i] = T[i][DIM];
|
||||||
|
return z;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,10 +15,10 @@ int lastexplore;
|
||||||
EX bool randomPatternsMode = false;
|
EX bool randomPatternsMode = false;
|
||||||
EX int randompattern[landtypes];
|
EX int randompattern[landtypes];
|
||||||
|
|
||||||
int genrange_bonus = 0;
|
EX int genrange_bonus = 0;
|
||||||
|
|
||||||
bool chaosUnlocked = false;
|
EX bool chaosUnlocked = false;
|
||||||
bool chaosAchieved = false;
|
EX bool chaosAchieved = false;
|
||||||
|
|
||||||
void doOvergenerate() {
|
void doOvergenerate() {
|
||||||
for(int i=0; i<numplayers(); i++)
|
for(int i=0; i<numplayers(); i++)
|
||||||
|
|
|
@ -822,7 +822,7 @@ EX void showStartMenu() {
|
||||||
welcomeMessage();
|
welcomeMessage();
|
||||||
stampbase = ticks;
|
stampbase = ticks;
|
||||||
if(uni == 's')
|
if(uni == 's')
|
||||||
shmup::configure();
|
multi::configure();
|
||||||
}
|
}
|
||||||
else if(uni == 'Z') {
|
else if(uni == 'Z') {
|
||||||
popScreenAll();
|
popScreenAll();
|
||||||
|
@ -997,7 +997,7 @@ int read_menu_args() {
|
||||||
PHASEFROM(2); launch_dialog(showChangeMode);
|
PHASEFROM(2); launch_dialog(showChangeMode);
|
||||||
}
|
}
|
||||||
else if(argis("-d:shmup")) {
|
else if(argis("-d:shmup")) {
|
||||||
PHASEFROM(2); launch_dialog(); shmup::configure();
|
PHASEFROM(2); launch_dialog(); multi::configure();
|
||||||
}
|
}
|
||||||
else return 1;
|
else return 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
82
pattern2.cpp
82
pattern2.cpp
|
@ -519,7 +519,45 @@ int getHemisphere(cell *c, int which) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace patterns {
|
EX namespace patterns {
|
||||||
|
|
||||||
|
#if HDR
|
||||||
|
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'
|
||||||
|
};
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
struct patterninfo {
|
||||||
|
int id;
|
||||||
|
int dir;
|
||||||
|
bool reflect;
|
||||||
|
int symmetries;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
void valSibling(cell *c, patterninfo& si, int sub, int pat) {
|
void valSibling(cell *c, patterninfo& si, int sub, int pat) {
|
||||||
if(ctof(c)) {
|
if(ctof(c)) {
|
||||||
|
@ -651,7 +689,7 @@ namespace patterns {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void val38(cell *c, patterninfo &si, int sub, int pat) {
|
EX void val38(cell *c, patterninfo &si, int sub, int pat) {
|
||||||
bool symRotation = sub & SPF_ROT;
|
bool symRotation = sub & SPF_ROT;
|
||||||
|
|
||||||
if(ctof(c)) {
|
if(ctof(c)) {
|
||||||
|
@ -879,9 +917,9 @@ namespace patterns {
|
||||||
if(GOLDBERG && has_nice_dual() && !ishept(c) && ishex1(c)) si.dir = gmod(si.dir+3, S6);
|
if(GOLDBERG && has_nice_dual() && !ishept(c) && ishex1(c)) si.dir = gmod(si.dir+3, S6);
|
||||||
}
|
}
|
||||||
|
|
||||||
ePattern whichPattern = PAT_NONE;
|
EX ePattern whichPattern = PAT_NONE;
|
||||||
|
|
||||||
int subpattern_flags;
|
EX int subpattern_flags;
|
||||||
|
|
||||||
void val_threecolors(cell *c, patterninfo& si, int sub) {
|
void val_threecolors(cell *c, patterninfo& si, int sub) {
|
||||||
int pcol = pattern_threecolor(c);
|
int pcol = pattern_threecolor(c);
|
||||||
|
@ -907,7 +945,7 @@ namespace patterns {
|
||||||
applyAlt(si, sub, PAT_COLORING);
|
applyAlt(si, sub, PAT_COLORING);
|
||||||
}
|
}
|
||||||
|
|
||||||
patterninfo getpatterninfo(cell *c, ePattern pat, int sub) {
|
EX patterninfo getpatterninfo(cell *c, ePattern pat, int sub) {
|
||||||
if(!(sub & SPF_NO_SUBCODES)) {
|
if(!(sub & SPF_NO_SUBCODES)) {
|
||||||
auto si = getpatterninfo(c, pat, sub | SPF_NO_SUBCODES);
|
auto si = getpatterninfo(c, pat, sub | SPF_NO_SUBCODES);
|
||||||
if(1) ;
|
if(1) ;
|
||||||
|
@ -1118,7 +1156,13 @@ namespace patterns {
|
||||||
return si;
|
return si;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
#if HDR
|
||||||
|
inline patterninfo getpatterninfo0(cell *c) {
|
||||||
|
return getpatterninfo(c, whichPattern, subpattern_flags);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
EX }
|
||||||
|
|
||||||
EX bool geosupport_chessboard() {
|
EX bool geosupport_chessboard() {
|
||||||
return
|
return
|
||||||
|
@ -1398,12 +1442,12 @@ color_t random_landscape(cell *c, int mul, int div, int step, color_t base) {
|
||||||
return (base + col[0] + (col[1] << 8) + (col[2] << 16));
|
return (base + col[0] + (col[1] << 8) + (col[2] << 16));
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace patterns {
|
EX namespace patterns {
|
||||||
int canvasback = linf[laCanvas].color >> 2;
|
EX int canvasback = linf[laCanvas].color >> 2;
|
||||||
int subcanvas;
|
EX int subcanvas;
|
||||||
bool displaycodes;
|
EX bool displaycodes;
|
||||||
char whichShape = 0;
|
EX char whichShape = 0;
|
||||||
char whichCanvas = 0;
|
EX char whichCanvas = 0;
|
||||||
|
|
||||||
int sevenval(cell *c) {
|
int sevenval(cell *c) {
|
||||||
if(!euclid) return 0;
|
if(!euclid) return 0;
|
||||||
|
@ -1445,7 +1489,7 @@ namespace patterns {
|
||||||
return ep.parse();
|
return ep.parse();
|
||||||
}
|
}
|
||||||
|
|
||||||
int generateCanvas(cell *c) {
|
EX int generateCanvas(cell *c) {
|
||||||
switch(whichCanvas) {
|
switch(whichCanvas) {
|
||||||
#if CAP_CRYSTAL
|
#if CAP_CRYSTAL
|
||||||
case 'K':
|
case 'K':
|
||||||
|
@ -1710,7 +1754,7 @@ namespace patterns {
|
||||||
#define REMAP_TEXTURE (void)0
|
#define REMAP_TEXTURE (void)0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void showPattern() {
|
EX void showPattern() {
|
||||||
cmode = sm::SIDE | sm::MAYDARK;
|
cmode = sm::SIDE | sm::MAYDARK;
|
||||||
{
|
{
|
||||||
dynamicval<bool> dc(displaycodes, whichPattern);
|
dynamicval<bool> 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
|
// larges are not incompatible between themselves
|
||||||
if(newp == cpLarge || newp == cpZebra)
|
if(newp == cpLarge || newp == cpZebra)
|
||||||
return false;
|
return false;
|
||||||
|
@ -1996,7 +2040,7 @@ namespace patterns {
|
||||||
}}
|
}}
|
||||||
};
|
};
|
||||||
|
|
||||||
cpatterntype cgroup, old_cgroup;
|
EX cpatterntype cgroup, old_cgroup;
|
||||||
|
|
||||||
void showChangeablePatterns() {
|
void showChangeablePatterns() {
|
||||||
cmode = sm::SIDE | sm::MAYDARK;
|
cmode = sm::SIDE | sm::MAYDARK;
|
||||||
|
@ -2067,7 +2111,7 @@ namespace patterns {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void computeCgroup() {
|
EX void computeCgroup() {
|
||||||
cgroup = cpUnknown;
|
cgroup = cpUnknown;
|
||||||
if(whichPattern == PAT_SINGLETYPE) {
|
if(whichPattern == PAT_SINGLETYPE) {
|
||||||
cgroup = cpSingle;
|
cgroup = cpSingle;
|
||||||
|
@ -2093,11 +2137,11 @@ namespace patterns {
|
||||||
old_cgroup = cgroup;
|
old_cgroup = cgroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pushChangeablePatterns() {
|
EX void pushChangeablePatterns() {
|
||||||
pushScreen(showChangeablePatterns);
|
pushScreen(showChangeablePatterns);
|
||||||
computeCgroup();
|
computeCgroup();
|
||||||
}
|
}
|
||||||
}
|
EX }
|
||||||
|
|
||||||
bool is_master(cell *c) {
|
bool is_master(cell *c) {
|
||||||
if(euclid) return pseudohept(c);
|
if(euclid) return pseudohept(c);
|
||||||
|
|
162
shmup.cpp
162
shmup.cpp
|
@ -22,24 +22,25 @@ namespace shmupballs {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace multi {
|
EX namespace multi {
|
||||||
|
|
||||||
config scfg;
|
config scfg;
|
||||||
charstyle scs[MAXPLAYER];
|
EX charstyle scs[MAXPLAYER];
|
||||||
|
|
||||||
int players = 1;
|
EX int players = 1;
|
||||||
cellwalker player[MAXPLAYER];
|
EX cellwalker player[MAXPLAYER];
|
||||||
vector<int> revive_queue; // queue for revival
|
EX vector<int> 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; i<numplayers(); i++) {
|
for(int i=0; i<numplayers(); i++) {
|
||||||
int idir = (3 * i) % cwt.at->type;
|
int idir = (3 * i) % cwt.at->type;
|
||||||
cell *c2 = cwt.at->move(idir);
|
cell *c2 = cwt.at->move(idir);
|
||||||
|
@ -60,10 +61,10 @@ namespace multi {
|
||||||
|
|
||||||
bool combo[MAXPLAYER];
|
bool combo[MAXPLAYER];
|
||||||
|
|
||||||
int cpid; // player id -- an extra parameter for player-related functions
|
EX int cpid; // player id -- an extra parameter for player-related functions
|
||||||
int cpid_edit; // cpid currently being edited
|
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
|
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());
|
pushScreen(shmup_configurer());
|
||||||
}
|
}
|
||||||
|
|
||||||
void showConfigureMultiplayer() {
|
EX void showConfigureMultiplayer() {
|
||||||
gamescreen(1);
|
gamescreen(1);
|
||||||
dialog::init("multiplayer");
|
dialog::init("multiplayer");
|
||||||
|
|
||||||
|
@ -500,7 +501,7 @@ void showConfigureMultiplayer() {
|
||||||
});
|
});
|
||||||
|
|
||||||
dialog::addSelItem(XLAT("keyboard & joysticks"), "", 'k');
|
dialog::addSelItem(XLAT("keyboard & joysticks"), "", 'k');
|
||||||
dialog::add_action(shmup::configure);
|
dialog::add_action(multi::configure);
|
||||||
}
|
}
|
||||||
else dialog::addBreak(200);
|
else dialog::addBreak(200);
|
||||||
|
|
||||||
|
@ -532,7 +533,7 @@ bool notremapped(int sym) {
|
||||||
return k > multi::players;
|
return k > multi::players;
|
||||||
}
|
}
|
||||||
|
|
||||||
void initConfig() {
|
EX void initConfig() {
|
||||||
|
|
||||||
char* t = scfg.keyaction;
|
char* t = scfg.keyaction;
|
||||||
|
|
||||||
|
@ -750,26 +751,25 @@ void handleInput(int delta) {
|
||||||
|
|
||||||
int tableid[7] = {1, 2, 4, 5, 6, 7, 8};
|
int tableid[7] = {1, 2, 4, 5, 6, 7, 8};
|
||||||
|
|
||||||
|
EX void leaveGame(int i) {
|
||||||
void leaveGame(int i) {
|
|
||||||
multi::player[i].at = NULL;
|
multi::player[i].at = NULL;
|
||||||
multi::deaths[i]++;
|
multi::deaths[i]++;
|
||||||
revive_queue.push_back(i);
|
revive_queue.push_back(i);
|
||||||
checklastmove();
|
checklastmove();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool playerActive(int p) {
|
EX bool playerActive(int p) {
|
||||||
if(multi::players == 1 || shmup::on) return true;
|
if(multi::players == 1 || shmup::on) return true;
|
||||||
return player[p].at;
|
return player[p].at;
|
||||||
}
|
}
|
||||||
|
|
||||||
int activePlayers() {
|
EX int activePlayers() {
|
||||||
int q = 0;
|
int q = 0;
|
||||||
for(int i=0; i<players; i++) if(playerActive(i)) q++;
|
for(int i=0; i<players; i++) if(playerActive(i)) q++;
|
||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
cell *multiPlayerTarget(int i) {
|
EX cell *multiPlayerTarget(int i) {
|
||||||
cellwalker cwti = multi::player[i];
|
cellwalker cwti = multi::player[i];
|
||||||
if(!cwti.at) return NULL;
|
if(!cwti.at) return NULL;
|
||||||
int dir = multi::whereto[i].d;
|
int dir = multi::whereto[i].d;
|
||||||
|
@ -780,7 +780,7 @@ void handleInput(int delta) {
|
||||||
return cwti.at;
|
return cwti.at;
|
||||||
}
|
}
|
||||||
|
|
||||||
void checklastmove() {
|
EX void checklastmove() {
|
||||||
for(int i=0; i<numplayers(); i++) if(playerActive(i)) {
|
for(int i=0; i<numplayers(); i++) if(playerActive(i)) {
|
||||||
multi::cpid = i;
|
multi::cpid = i;
|
||||||
cwt = multi::player[i]; break;
|
cwt = multi::player[i]; break;
|
||||||
|
@ -959,7 +959,7 @@ void handleInput(int delta) {
|
||||||
((countplayers == 2 && !countplayers_undecided) || countplayers_undecided >= 2);
|
((countplayers == 2 && !countplayers_undecided) || countplayers_undecided >= 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
EX }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
const char *lastprofile = "";
|
const char *lastprofile = "";
|
||||||
|
@ -976,7 +976,51 @@ void profile(const char *buf) {
|
||||||
#define SCALE cgi.scalefactor
|
#define SCALE cgi.scalefactor
|
||||||
#define SCALE2 (SCALE*SCALE)
|
#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;
|
using namespace multi;
|
||||||
|
|
||||||
|
@ -985,14 +1029,12 @@ eItem keyresult[MAXPLAYER];
|
||||||
|
|
||||||
ld fabsl(ld x) { return x>0?x:-x; }
|
ld fabsl(ld x) { return x>0?x:-x; }
|
||||||
|
|
||||||
bool on = false;
|
EX bool on = false;
|
||||||
bool delayed_safety = false;
|
EX bool delayed_safety = false;
|
||||||
|
|
||||||
bool lastdead = false;
|
bool lastdead = false;
|
||||||
|
|
||||||
struct monster;
|
EX multimap<cell*, monster*> monstersAt;
|
||||||
|
|
||||||
multimap<cell*, monster*> monstersAt;
|
|
||||||
|
|
||||||
typedef multimap<cell*, monster*>::iterator mit;
|
typedef multimap<cell*, monster*>::iterator mit;
|
||||||
|
|
||||||
|
@ -1110,9 +1152,9 @@ bool trackroute(monster *m, transmatrix goal, double spd) {
|
||||||
return true;
|
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) {
|
bool isBullet(monster *m) {
|
||||||
return isBulletType(m->type);
|
return isBulletType(m->type);
|
||||||
|
@ -1120,7 +1162,7 @@ bool isBullet(monster *m) {
|
||||||
bool isPlayer(monster *m) { return m->type == moPlayer; }
|
bool isPlayer(monster *m) { return m->type == moPlayer; }
|
||||||
bool isMonster(monster *m) { return m->type != moPlayer && m->type != moBullet; }
|
bool isMonster(monster *m) { return m->type != moPlayer && m->type != moBullet; }
|
||||||
|
|
||||||
hookset<bool(shmup::monster*)> *hooks_kill;
|
EX hookset<bool(shmup::monster*)> *hooks_kill;
|
||||||
|
|
||||||
void killMonster(monster* m, eMonster who_kills, int flags = 0) {
|
void killMonster(monster* m, eMonster who_kills, int flags = 0) {
|
||||||
int tk = tkills();
|
int tk = tkills();
|
||||||
|
@ -1147,7 +1189,7 @@ void killMonster(monster* m, eMonster who_kills, int flags = 0) {
|
||||||
multi::kills[multi::cpid] += tkills() - tk;
|
multi::kills[multi::cpid] += tkills() - tk;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pushmonsters() {
|
EX void pushmonsters() {
|
||||||
for(monster *m: nonvirtual) {
|
for(monster *m: nonvirtual) {
|
||||||
m->notpushed = isPlayer(m) || m->dead || (m->base->monst && m->base->monst != m->type);
|
m->notpushed = isPlayer(m) || m->dead || (m->base->monst && m->base->monst != m->type);
|
||||||
if(!m->notpushed) {
|
if(!m->notpushed) {
|
||||||
|
@ -1157,7 +1199,7 @@ void pushmonsters() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void popmonsters() {
|
EX void popmonsters() {
|
||||||
for(int i=isize(nonvirtual)-1; i>=0; i--) {
|
for(int i=isize(nonvirtual)-1; i>=0; i--) {
|
||||||
monster *m = nonvirtual[i];
|
monster *m = nonvirtual[i];
|
||||||
if(!m->notpushed) {
|
if(!m->notpushed) {
|
||||||
|
@ -1176,7 +1218,7 @@ void popmonsters() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void degradeDemons() {
|
EX void degradeDemons() {
|
||||||
for(monster* m: nonvirtual) {
|
for(monster* m: nonvirtual) {
|
||||||
if(m->type == moGreater) m->type = moLesser;
|
if(m->type == moGreater) m->type = moLesser;
|
||||||
if(m->stk == moGreater) m->type = moLesser;
|
if(m->stk == moGreater) m->type = moLesser;
|
||||||
|
@ -1232,7 +1274,7 @@ void awakenMimics(monster *m, cell *c2) {
|
||||||
|
|
||||||
int visibleAt;
|
int visibleAt;
|
||||||
|
|
||||||
void visibleFor(int t) {
|
EX void visibleFor(int t) {
|
||||||
visibleAt = max(visibleAt, curtime + 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])
|
if(cpid >= 0 && cpid < MAXPLAYER && pc[cpid])
|
||||||
pc[cpid]->dead = true;
|
pc[cpid]->dead = true;
|
||||||
}
|
}
|
||||||
|
@ -1497,7 +1539,7 @@ bool hornKills(eMonster m) {
|
||||||
|
|
||||||
queue<pair<int, cell*>> traplist, firetraplist;
|
queue<pair<int, cell*>> traplist, firetraplist;
|
||||||
|
|
||||||
void activateArrow(cell *c) {
|
EX void activateArrow(cell *c) {
|
||||||
if(isCentralTrap(c))
|
if(isCentralTrap(c))
|
||||||
traplist.emplace(ticks + 500, c);
|
traplist.emplace(ticks + 500, c);
|
||||||
}
|
}
|
||||||
|
@ -2203,7 +2245,7 @@ bool reflectmatrix(transmatrix& M, cell *c1, cell *c2, bool onlypos) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int reflect(cell*& c2, cell*& mbase, transmatrix& nat) {
|
EX int reflect(cell*& c2, cell*& mbase, transmatrix& nat) {
|
||||||
int reflections = 0;
|
int reflections = 0;
|
||||||
if(c2 != mbase && c2->wall == waMirrorWall && inmirror(c2)) {
|
if(c2 != mbase && c2->wall == waMirrorWall && inmirror(c2)) {
|
||||||
if(reflectmatrix(nat, mbase, c2, false)) {
|
if(reflectmatrix(nat, mbase, c2, false)) {
|
||||||
|
@ -2292,7 +2334,7 @@ monster *parentOrSelf(monster *m) {
|
||||||
return m->parent ? m->parent : m;
|
return m->parent ? m->parent : m;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool verifyTeleport() {
|
EX bool verifyTeleport() {
|
||||||
if(!on) return true;
|
if(!on) return true;
|
||||||
if(playerCrash(pc[cpid], mouseh)) return false;
|
if(playerCrash(pc[cpid], mouseh)) return false;
|
||||||
return true;
|
return true;
|
||||||
|
@ -2304,7 +2346,7 @@ void destroyMimics() {
|
||||||
m->dead = true;
|
m->dead = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void teleported() {
|
EX void teleported() {
|
||||||
monster *m = pc[cpid];
|
monster *m = pc[cpid];
|
||||||
m->base = cwt.at;
|
m->base = cwt.at;
|
||||||
m->at = rgpushxto0(inverse(gmatrix[cwt.at]) * mouseh) * spin(rand() % 1000 * M_PI / 2000);
|
m->at = rgpushxto0(inverse(gmatrix[cwt.at]) * mouseh) * spin(rand() % 1000 * M_PI / 2000);
|
||||||
|
@ -2357,7 +2399,7 @@ eItem targetRangedOrbKey(orbAction a) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
eItem targetRangedOrb(orbAction a) {
|
EX eItem targetRangedOrb(orbAction a) {
|
||||||
if(!on) return itNone;
|
if(!on) return itNone;
|
||||||
monster *wpc = pc[cpid];
|
monster *wpc = pc[cpid];
|
||||||
if(a != roCheck && !wpc) return itNone;
|
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);
|
return intval(m1->pat*C0, closerTo) < intval(m2->pat*C0, closerTo);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dragonbreath(cell *dragon) {
|
EX bool dragonbreath(cell *dragon) {
|
||||||
int randplayer = hrand(numplayers());
|
int randplayer = hrand(numplayers());
|
||||||
monster* bullet = new monster;
|
monster* bullet = new monster;
|
||||||
bullet->base = dragon;
|
bullet->base = dragon;
|
||||||
|
@ -3284,7 +3326,7 @@ void activateMonstersAt(cell *c) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void fixStorage() {
|
EX void fixStorage() {
|
||||||
|
|
||||||
vector<monster*> restore;
|
vector<monster*> restore;
|
||||||
|
|
||||||
|
@ -3296,9 +3338,9 @@ void fixStorage() {
|
||||||
for(monster *m: restore) m->store();
|
for(monster *m: restore) m->store();
|
||||||
}
|
}
|
||||||
|
|
||||||
hookset<bool(int)> *hooks_turn;
|
EX hookset<bool(int)> *hooks_turn;
|
||||||
|
|
||||||
void turn(int delta) {
|
EX void turn(int delta) {
|
||||||
|
|
||||||
if(racing::on && subscreens::split( [delta] () { turn(delta); })) return;
|
if(racing::on && subscreens::split( [delta] () { turn(delta); })) return;
|
||||||
|
|
||||||
|
@ -3554,7 +3596,7 @@ void turn(int delta) {
|
||||||
active.clear();
|
active.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void recall() {
|
EX void recall() {
|
||||||
for(int i=0; i<players; i++) {
|
for(int i=0; i<players; i++) {
|
||||||
pc[i]->base = cwt.at;
|
pc[i]->base = cwt.at;
|
||||||
if(players == 1)
|
if(players == 1)
|
||||||
|
@ -3568,7 +3610,7 @@ void recall() {
|
||||||
destroyMimics();
|
destroyMimics();
|
||||||
}
|
}
|
||||||
|
|
||||||
void init() {
|
EX void init() {
|
||||||
|
|
||||||
for(int i=0; i<players; i++) pc[i] = NULL;
|
for(int i=0; i<players; i++) pc[i] = NULL;
|
||||||
|
|
||||||
|
@ -3598,7 +3640,7 @@ void init() {
|
||||||
delayed_safety = false;
|
delayed_safety = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool boatAt(cell *c) {
|
EX bool boatAt(cell *c) {
|
||||||
pair<mit, mit> p =
|
pair<mit, mit> p =
|
||||||
monstersAt.equal_range(c);
|
monstersAt.equal_range(c);
|
||||||
for(mit it = p.first; it != p.second; it++) {
|
for(mit it = p.first; it != p.second; it++) {
|
||||||
|
@ -3608,7 +3650,7 @@ bool boatAt(cell *c) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
hookset<bool(const transmatrix&, cell*, shmup::monster*)> *hooks_draw;
|
EX hookset<bool(const transmatrix&, cell*, shmup::monster*)> *hooks_draw;
|
||||||
|
|
||||||
bool drawMonster(const transmatrix& V, cell *c, const transmatrix*& Vboat, transmatrix& Vboat0, const transmatrix *Vdp) {
|
bool drawMonster(const transmatrix& V, cell *c, const transmatrix*& Vboat, transmatrix& Vboat0, const transmatrix *Vdp) {
|
||||||
#if CAP_SHAPES
|
#if CAP_SHAPES
|
||||||
|
@ -3789,7 +3831,7 @@ bool drawMonster(const transmatrix& V, cell *c, const transmatrix*& Vboat, trans
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void clearMonsters() {
|
EX void clearMonsters() {
|
||||||
for(mit it = monstersAt.begin(); it != monstersAt.end(); it++)
|
for(mit it = monstersAt.begin(); it != monstersAt.end(); it++)
|
||||||
delete(it->second);
|
delete(it->second);
|
||||||
for(monster *m: active) delete m;
|
for(monster *m: active) delete m;
|
||||||
|
@ -3799,7 +3841,7 @@ void clearMonsters() {
|
||||||
active.clear();
|
active.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void clearMemory() {
|
EX void clearMemory() {
|
||||||
clearMonsters();
|
clearMonsters();
|
||||||
gmatrix.clear();
|
gmatrix.clear();
|
||||||
while(!traplist.empty()) traplist.pop();
|
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;
|
if(!pc[i]) return NULL;
|
||||||
return pc[i]->base;
|
return pc[i]->base;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool playerInBoat(int i) {
|
EX bool playerInBoat(int i) {
|
||||||
if(!pc[i]) return false;
|
if(!pc[i]) return false;
|
||||||
return pc[i]->inBoat;
|
return pc[i]->inBoat;
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyBoats(cell *c) {
|
EX void destroyBoats(cell *c) {
|
||||||
for(monster *m: active)
|
for(monster *m: active)
|
||||||
if(m->base == c && m->inBoat)
|
if(m->base == c && m->inBoat)
|
||||||
m->inBoat = false;
|
m->inBoat = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void virtualRebase(shmup::monster *m, bool tohex) {
|
EX void virtualRebase(shmup::monster *m, bool tohex) {
|
||||||
virtualRebase(m->base, m->at, tohex);
|
virtualRebase(m->base, m->at, tohex);
|
||||||
}
|
}
|
||||||
|
|
||||||
hookset<bool(shmup::monster*, string&)> *hooks_describe;
|
EX hookset<bool(shmup::monster*, string&)> *hooks_describe;
|
||||||
|
|
||||||
void addShmupHelp(string& out) {
|
EX void addShmupHelp(string& out) {
|
||||||
if(shmup::mousetarget && intval(mouseh, tC0(shmup::mousetarget->pat)) < .1) {
|
if(shmup::mousetarget && intval(mouseh, tC0(shmup::mousetarget->pat)) < .1) {
|
||||||
if(callhandlers(false, hooks_describe, shmup::mousetarget, out)) return;
|
if(callhandlers(false, hooks_describe, shmup::mousetarget, out)) return;
|
||||||
out += XLAT1(minf[shmup::mousetarget->type].name);
|
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();
|
stop_game();
|
||||||
switch_game_mode(rg::shmup);
|
switch_game_mode(rg::shmup);
|
||||||
resetScores();
|
resetScores();
|
||||||
|
|
Loading…
Reference in New Issue