mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-01-12 02:10:34 +00:00
more header shifting
This commit is contained in:
parent
1c6b8ad3f0
commit
cb666fb24a
@ -6,6 +6,70 @@ namespace hr {
|
|||||||
|
|
||||||
EX namespace arcm {
|
EX namespace arcm {
|
||||||
|
|
||||||
|
#if HDR
|
||||||
|
struct archimedean_tiling {
|
||||||
|
|
||||||
|
int coloring;
|
||||||
|
|
||||||
|
string symbol;
|
||||||
|
|
||||||
|
vector<int> faces;
|
||||||
|
vector<int> adj;
|
||||||
|
vector<bool> invert;
|
||||||
|
vector<int> nflags;
|
||||||
|
|
||||||
|
bool have_ph, have_line, have_symmetry;
|
||||||
|
int real_faces;
|
||||||
|
int real_face_type;
|
||||||
|
|
||||||
|
int repetition;
|
||||||
|
int N;
|
||||||
|
|
||||||
|
ld euclidean_angle_sum;
|
||||||
|
|
||||||
|
vector<int> flags;
|
||||||
|
|
||||||
|
vector<vector<pair<int, int>>> adjacent;
|
||||||
|
vector<vector<pair<ld, ld>>> triangles;
|
||||||
|
|
||||||
|
void make_match(int a, int i, int b, int j);
|
||||||
|
void prepare();
|
||||||
|
void compute_geometry();
|
||||||
|
|
||||||
|
void parse();
|
||||||
|
void parse(string s) { symbol = s; parse(); }
|
||||||
|
|
||||||
|
ld edgelength;
|
||||||
|
|
||||||
|
vector<ld> inradius, circumradius, alphas;
|
||||||
|
|
||||||
|
int matches[30][30];
|
||||||
|
int periods[30];
|
||||||
|
int tilegroup[30], groupoffset[30], tilegroups;
|
||||||
|
|
||||||
|
int errors;
|
||||||
|
string errormsg;
|
||||||
|
|
||||||
|
pair<int, int>& get_adj(heptagon *h, int cid);
|
||||||
|
pair<int, int>& get_adj(heptspin hs) { return get_adj(hs.at, hs.spin); }
|
||||||
|
pair<ld, ld>& get_triangle(heptagon *h, int cid);
|
||||||
|
pair<ld, ld>& get_triangle(heptspin hs) { return get_triangle(hs.at, hs.spin); }
|
||||||
|
pair<ld, ld>& get_triangle(const pair<int, int>& p, int delta = 0);
|
||||||
|
pair<int, int>& get_adj(const pair<int, int>& p, int delta = 0);
|
||||||
|
|
||||||
|
int support_threecolor();
|
||||||
|
int support_threecolor_bitruncated();
|
||||||
|
int support_football();
|
||||||
|
bool support_chessboard();
|
||||||
|
void regroup();
|
||||||
|
string world_size();
|
||||||
|
|
||||||
|
eGeometryClass get_class();
|
||||||
|
|
||||||
|
ld scale();
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#if CAP_ARCM
|
#if CAP_ARCM
|
||||||
|
|
||||||
static const int sfPH = 1;
|
static const int sfPH = 1;
|
||||||
@ -351,7 +415,7 @@ ld archimedean_tiling::scale() {
|
|||||||
|
|
||||||
map<heptagon*, vector<pair<heptagon*, transmatrix> > > altmap;
|
map<heptagon*, vector<pair<heptagon*, transmatrix> > > altmap;
|
||||||
|
|
||||||
map<heptagon*, pair<heptagon*, transmatrix>> archimedean_gmatrix;
|
EX map<heptagon*, pair<heptagon*, transmatrix>> archimedean_gmatrix;
|
||||||
|
|
||||||
hrmap *current_altmap;
|
hrmap *current_altmap;
|
||||||
|
|
||||||
@ -703,7 +767,7 @@ transmatrix adjcell_matrix(heptagon *h, int d) {
|
|||||||
return spin(-t1.first) * xpush(t1.second) * spin(M_PI + t2.first);
|
return spin(-t1.first) * xpush(t1.second) * spin(M_PI + t2.first);
|
||||||
}
|
}
|
||||||
|
|
||||||
int fix(heptagon *h, int spin) {
|
EX int fix(heptagon *h, int spin) {
|
||||||
int type = isize(current.adjacent[id_of(h)]);
|
int type = isize(current.adjacent[id_of(h)]);
|
||||||
spin %= type;
|
spin %= type;
|
||||||
if(spin < 0) spin += type;
|
if(spin < 0) spin += type;
|
||||||
|
12
blizzard.cpp
12
blizzard.cpp
@ -12,6 +12,10 @@ struct snowball {
|
|||||||
snowball(int t) { T = rgpushxto0(randomPointIn(t)); phase = randd(); }
|
snowball(int t) { T = rgpushxto0(randomPointIn(t)); phase = randd(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if HDR
|
||||||
|
struct blizzardcell;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct blizzardcell {
|
struct blizzardcell {
|
||||||
cell *c;
|
cell *c;
|
||||||
int frame;
|
int frame;
|
||||||
@ -25,17 +29,17 @@ struct blizzardcell {
|
|||||||
~blizzardcell() { for(auto i: inorder) delete i; }
|
~blizzardcell() { for(auto i: inorder) delete i; }
|
||||||
};
|
};
|
||||||
|
|
||||||
map<cell*, blizzardcell> blizzardcells;
|
EX map<cell*, blizzardcell> blizzardcells;
|
||||||
|
|
||||||
EX void set_blizzard_frame(cell *c, int frameid) {
|
EX void set_blizzard_frame(cell *c, int frameid) {
|
||||||
blizzardcells[c].frame = frameid;
|
blizzardcells[c].frame = frameid;
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<blizzardcell*> bcells;
|
EX vector<blizzardcell*> bcells;
|
||||||
|
|
||||||
int blizzard_N;
|
int blizzard_N;
|
||||||
|
|
||||||
blizzardcell* getbcell(cell *c) {
|
EX blizzardcell* getbcell(cell *c) {
|
||||||
int i = c->listindex;
|
int i = c->listindex;
|
||||||
if(i<0 || i >= blizzard_N) return NULL;
|
if(i<0 || i >= blizzard_N) return NULL;
|
||||||
if(bcells[i]->c != c) return NULL;
|
if(bcells[i]->c != c) return NULL;
|
||||||
@ -205,7 +209,7 @@ EX void drawBlizzards() {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<cell*> arrowtraps;
|
EX vector<cell*> arrowtraps;
|
||||||
|
|
||||||
EX void drawArrowTraps() {
|
EX void drawArrowTraps() {
|
||||||
for(cell *c: arrowtraps) {
|
for(cell *c: arrowtraps) {
|
||||||
|
@ -2213,7 +2213,7 @@ EX int read_gamemode_args() {
|
|||||||
auto ah_config = addHook(hooks_args, 0, read_config_args) + addHook(hooks_args, 0, read_gamemode_args) + addHook(hooks_args, 0, read_color_args);
|
auto ah_config = addHook(hooks_args, 0, read_config_args) + addHook(hooks_args, 0, read_gamemode_args) + addHook(hooks_args, 0, read_color_args);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
unordered_map<string, ld&> params = {
|
EX unordered_map<string, ld&> params = {
|
||||||
{"linewidth", vid.linewidth},
|
{"linewidth", vid.linewidth},
|
||||||
{"patternlinewidth", linepatterns::width},
|
{"patternlinewidth", linepatterns::width},
|
||||||
{"scale", vid.scale},
|
{"scale", vid.scale},
|
||||||
|
121
expansion.cpp
121
expansion.cpp
@ -7,6 +7,61 @@ int subtype(cell *c) {
|
|||||||
return patterns::getpatterninfo(c, patterns::PAT_NONE, 0).id;
|
return patterns::getpatterninfo(c, patterns::PAT_NONE, 0).id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if HDR
|
||||||
|
struct bignum {
|
||||||
|
static const int BASE = 1000000000;
|
||||||
|
static const long long BASE2 = BASE * (long long)BASE;
|
||||||
|
vector<int> digits;
|
||||||
|
bignum() {}
|
||||||
|
bignum(int i) : digits() { digits.push_back(i); }
|
||||||
|
void be(int i) { digits.resize(1); digits[0] = i; }
|
||||||
|
bignum& operator +=(const bignum& b);
|
||||||
|
void addmul(const bignum& b, int factor);
|
||||||
|
string get_str(int max_length);
|
||||||
|
|
||||||
|
bool operator < (const bignum&) const;
|
||||||
|
|
||||||
|
ld leading() const {
|
||||||
|
switch(isize(digits)) {
|
||||||
|
case 0:
|
||||||
|
return 0;
|
||||||
|
case 1:
|
||||||
|
return digits.back();
|
||||||
|
default:
|
||||||
|
return digits.back() + ld(digits[isize(digits)-2]) / BASE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ld approx() const {
|
||||||
|
return leading() * pow(BASE, isize(digits) - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ld log_approx() const {
|
||||||
|
return log(leading()) * log(BASE) * (isize(digits) - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ld operator / (const bignum& b) const {
|
||||||
|
return leading() / b.leading() * pow(BASE, isize(digits) - isize(b.digits));
|
||||||
|
}
|
||||||
|
|
||||||
|
int approx_int() const {
|
||||||
|
if(isize(digits) > 1) return BASE;
|
||||||
|
if(digits.empty()) return 0;
|
||||||
|
return digits[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
long long approx_ll() const {
|
||||||
|
if(isize(digits) > 2) return BASE2;
|
||||||
|
if(digits.empty()) return 0;
|
||||||
|
if(isize(digits) == 1) return digits[0];
|
||||||
|
return digits[0] + digits[1] * (long long) BASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend inline bignum operator +(bignum a, const bignum& b) { a.addmul(b, 1); return a; }
|
||||||
|
friend inline bignum operator -(bignum a, const bignum& b) { a.addmul(b, -1); return a; }
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
bignum& bignum::operator +=(const bignum& b) {
|
bignum& bignum::operator +=(const bignum& b) {
|
||||||
int K = isize(b.digits);
|
int K = isize(b.digits);
|
||||||
if(K > isize(digits)) digits.resize(K);
|
if(K > isize(digits)) digits.resize(K);
|
||||||
@ -116,6 +171,40 @@ void canonicize(vector<int>& t) {
|
|||||||
std::rotate(t.begin()+1, t.begin()+i, t.end());
|
std::rotate(t.begin()+1, t.begin()+i, t.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if HDR
|
||||||
|
struct expansion_analyzer {
|
||||||
|
vector<int> gettype(cell *c);
|
||||||
|
int N;
|
||||||
|
vector<cell*> samples;
|
||||||
|
map<vector<int>, int> codeid;
|
||||||
|
vector<vector<int> > children;
|
||||||
|
int rootid, diskid;
|
||||||
|
int coefficients_known;
|
||||||
|
vector<int> coef;
|
||||||
|
int valid_from, tested_to;
|
||||||
|
ld growth;
|
||||||
|
|
||||||
|
int sample_id(cell *c);
|
||||||
|
void preliminary_grouping();
|
||||||
|
void reduce_grouping();
|
||||||
|
vector<vector<bignum>> descendants;
|
||||||
|
bignum& get_descendants(int level);
|
||||||
|
bignum& get_descendants(int level, int type);
|
||||||
|
void find_coefficients();
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
expansion_analyzer() { reset(); }
|
||||||
|
|
||||||
|
string approximate_descendants(int d, int max_length);
|
||||||
|
void view_distances_dialog();
|
||||||
|
ld get_growth();
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool verify(int id);
|
||||||
|
int valid(int v, int step);
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
vector<int> expansion_analyzer::gettype(cell *c) {
|
vector<int> expansion_analyzer::gettype(cell *c) {
|
||||||
vector<int> res;
|
vector<int> res;
|
||||||
res.push_back(subtype(c) * 4 + 2);
|
res.push_back(subtype(c) * 4 + 2);
|
||||||
@ -445,7 +534,7 @@ int curr_dist(cell *c) {
|
|||||||
|
|
||||||
int position;
|
int position;
|
||||||
|
|
||||||
int type_in_reduced(expansion_analyzer& ea, cell *c, const cellfunction& f) {
|
EX int type_in_reduced(expansion_analyzer& ea, cell *c, const cellfunction& f) {
|
||||||
int a = ea.N;
|
int a = ea.N;
|
||||||
int t = type_in(ea, c, f);
|
int t = type_in(ea, c, f);
|
||||||
if(expansion.N != a) {
|
if(expansion.N != a) {
|
||||||
@ -457,7 +546,7 @@ int type_in_reduced(expansion_analyzer& ea, cell *c, const cellfunction& f) {
|
|||||||
|
|
||||||
// which=1 => right, which=-1 => left
|
// which=1 => right, which=-1 => left
|
||||||
|
|
||||||
int parent_id(cell *c, int which, const cellfunction& cf) {
|
EX int parent_id(cell *c, int which, const cellfunction& cf) {
|
||||||
int d = cf(c)-1;
|
int d = cf(c)-1;
|
||||||
for(int i=0; i<c->type; i++) {
|
for(int i=0; i<c->type; i++) {
|
||||||
|
|
||||||
@ -482,43 +571,49 @@ void generate_around(cell *c) {
|
|||||||
forCellCM(c2, c) if(c2->mpdist > BARLEV) setdist(c2, BARLEV, c);
|
forCellCM(c2, c) if(c2->mpdist > BARLEV) setdist(c2, BARLEV, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace ts {
|
EX namespace ts {
|
||||||
cell *verified_add(cell *c, int which, int bonus, const cellfunction& cf) {
|
EX cell *verified_add(cell *c, int which, int bonus, const cellfunction& cf) {
|
||||||
int id = parent_id(c, which, cf);
|
int id = parent_id(c, which, cf);
|
||||||
if(id == -1) return NULL;
|
if(id == -1) return NULL;
|
||||||
return c->cmodmove(id + bonus);
|
return c->cmodmove(id + bonus);
|
||||||
}
|
}
|
||||||
|
|
||||||
cell *verified_add_gen(cell *c, int which, int bonus, const cellfunction& cf) {
|
EX cell *verified_add_gen(cell *c, int which, int bonus, const cellfunction& cf) {
|
||||||
return verified_add(c, which, bonus, cf);
|
return verified_add(c, which, bonus, cf);
|
||||||
}
|
}
|
||||||
|
|
||||||
cell *add(cell *c, int which, int bonus, const cellfunction& cf) {
|
EX cell *add(cell *c, int which, int bonus, const cellfunction& cf) {
|
||||||
int pid = parent_id(c, which, cf);
|
int pid = parent_id(c, which, cf);
|
||||||
if(pid == -1) pid = 0;
|
if(pid == -1) pid = 0;
|
||||||
return c->cmodmove(pid + bonus);
|
return c->cmodmove(pid + bonus);
|
||||||
}
|
}
|
||||||
|
|
||||||
cell *left_of(cell *c, const cellfunction& cf) {
|
EX cell *left_of(cell *c, const cellfunction& cf) {
|
||||||
int pid = parent_id(c, 1, cf);
|
int pid = parent_id(c, 1, cf);
|
||||||
if(pid == -1) return c;
|
if(pid == -1) return c;
|
||||||
if(VALENCE == 3) return c->cmodmove(pid+1);
|
if(VALENCE == 3) return c->cmodmove(pid+1);
|
||||||
else return (cellwalker(c, pid) + wstep - 1).cpeek();
|
else return (cellwalker(c, pid) + wstep - 1).cpeek();
|
||||||
}
|
}
|
||||||
|
|
||||||
cell *right_of(cell *c, const cellfunction& cf) {
|
EX cell *right_of(cell *c, const cellfunction& cf) {
|
||||||
int pid = parent_id(c, -1, cf);
|
int pid = parent_id(c, -1, cf);
|
||||||
if(pid == -1) return c;
|
if(pid == -1) return c;
|
||||||
if(VALENCE == 3) return c->cmodmove(pid-1);
|
if(VALENCE == 3) return c->cmodmove(pid-1);
|
||||||
else return (cellwalker(c, pid) + wstep + 1).cpeek();
|
else return (cellwalker(c, pid) + wstep + 1).cpeek();
|
||||||
}
|
}
|
||||||
|
|
||||||
cell *child_number(cell *c, int id, const cellfunction& cf) {
|
EX cell *child_number(cell *c, int id, const cellfunction& cf) {
|
||||||
int pid = parent_id(c, 1, cf);
|
int pid = parent_id(c, 1, cf);
|
||||||
if(pid == -1) return c->cmove(id);
|
if(pid == -1) return c->cmove(id);
|
||||||
return c->cmodmove(pid + (VALENCE == 3 ? 2 : 1) + id);
|
return c->cmodmove(pid + (VALENCE == 3 ? 2 : 1) + id);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
#if HDR
|
||||||
|
inline cell *left_parent(cell *c, const cellfunction& cf) { return verified_add(c, 1, 0, cf); }
|
||||||
|
inline cell *right_parent(cell *c, const cellfunction& cf) { return verified_add(c, -1, 0, cf); }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
EX }
|
||||||
|
|
||||||
bool viewdists = false, use_color_codes = true, use_analyzer = true, show_distance_lists = true;
|
bool viewdists = false, use_color_codes = true, use_analyzer = true, show_distance_lists = true;
|
||||||
|
|
||||||
@ -860,11 +955,11 @@ auto ea_hook = addHook(hooks_args, 100, expansion_readArgs);
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
expansion_analyzer expansion;
|
EX expansion_analyzer expansion;
|
||||||
|
|
||||||
int sibling_limit = 0;
|
EX int sibling_limit = 0;
|
||||||
|
|
||||||
void set_sibling_limit() {
|
EX void set_sibling_limit() {
|
||||||
if(0) ;
|
if(0) ;
|
||||||
#if CAP_IRR
|
#if CAP_IRR
|
||||||
else if(IRREGULAR) sibling_limit = 3;
|
else if(IRREGULAR) sibling_limit = 3;
|
||||||
|
12
help.cpp
12
help.cpp
@ -7,6 +7,18 @@ EX string help;
|
|||||||
|
|
||||||
EX function<void()> help_delegate;
|
EX function<void()> help_delegate;
|
||||||
|
|
||||||
|
#if HDR
|
||||||
|
struct help_extension {
|
||||||
|
char key;
|
||||||
|
string text;
|
||||||
|
string subtext;
|
||||||
|
color_t color;
|
||||||
|
reaction_t action;
|
||||||
|
help_extension() { color = forecolor; }
|
||||||
|
help_extension(char k, string t, reaction_t a) : key(k), text(t), action(a) { color = forecolor; }
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
EX vector<help_extension> help_extensions;
|
EX vector<help_extension> help_extensions;
|
||||||
|
|
||||||
vector<string> extra_keys = {
|
vector<string> extra_keys = {
|
||||||
|
277
hyper.h
277
hyper.h
@ -3754,27 +3754,7 @@ bool score_loaded(int id);
|
|||||||
int score_default(int id);
|
int score_default(int id);
|
||||||
void handle_event(SDL_Event& ev);
|
void handle_event(SDL_Event& ev);
|
||||||
|
|
||||||
void start_game();
|
|
||||||
void stop_game();
|
|
||||||
void switch_game_mode(char switchWhat);
|
|
||||||
|
|
||||||
void stop_game_and_switch_mode(char switchWhat = rg::nothing); // stop_game + switch_game_mode
|
|
||||||
void restart_game(char switchWhat = rg::nothing); // popAllScreens + popAllGames + stop_game + switch_game_mode + start_game
|
|
||||||
|
|
||||||
// these work as stop_game_and_switch_mode
|
|
||||||
void set_variation(eVariation);
|
|
||||||
void set_geometry(eGeometry);
|
|
||||||
|
|
||||||
void generate_floorshapes();
|
void generate_floorshapes();
|
||||||
void drawArrowTraps();
|
|
||||||
void drawBlizzards();
|
|
||||||
|
|
||||||
struct blizzardcell;
|
|
||||||
|
|
||||||
extern vector<cell*> arrowtraps;
|
|
||||||
extern map<cell*, blizzardcell> blizzardcells;
|
|
||||||
extern vector<blizzardcell*> bcells;
|
|
||||||
void set_blizzard_frame(cell *c, int frameid);
|
|
||||||
|
|
||||||
#define SIDE_SLEV 0
|
#define SIDE_SLEV 0
|
||||||
#define SIDE_WTS3 3
|
#define SIDE_WTS3 3
|
||||||
@ -4168,21 +4148,6 @@ struct pathdata {
|
|||||||
|
|
||||||
extern int timetowait;
|
extern int timetowait;
|
||||||
|
|
||||||
extern vector<pair<cell*, int> > airmap;
|
|
||||||
extern void compute_graphical_distance();
|
|
||||||
|
|
||||||
struct help_extension {
|
|
||||||
char key;
|
|
||||||
string text;
|
|
||||||
string subtext;
|
|
||||||
color_t color;
|
|
||||||
reaction_t action;
|
|
||||||
help_extension() { color = forecolor; }
|
|
||||||
help_extension(char k, string t, reaction_t a) : key(k), text(t), action(a) { color = forecolor; }
|
|
||||||
};
|
|
||||||
|
|
||||||
extern vector<help_extension> help_extensions;
|
|
||||||
|
|
||||||
#define RING(i) for(double i=0; i<=cgi.S84+1e-6; i+=SD3 * pow(.5, vid.linequality))
|
#define RING(i) for(double i=0; i<=cgi.S84+1e-6; i+=SD3 * pow(.5, vid.linequality))
|
||||||
#define REVRING(i) for(double i=cgi.S84; i>=-1e-6; i-=SD3 * pow(.5, vid.linequality))
|
#define REVRING(i) for(double i=cgi.S84; i>=-1e-6; i-=SD3 * pow(.5, vid.linequality))
|
||||||
#define PRING(i) for(double i=0; i<=cgi.S84+1e-6; i+= pow(.5, vid.linequality))
|
#define PRING(i) for(double i=0; i<=cgi.S84+1e-6; i+= pow(.5, vid.linequality))
|
||||||
@ -4212,81 +4177,6 @@ namespace reg3 {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace arcm {
|
|
||||||
#if CAP_ARCM
|
|
||||||
|
|
||||||
struct archimedean_tiling {
|
|
||||||
|
|
||||||
int coloring;
|
|
||||||
|
|
||||||
string symbol;
|
|
||||||
|
|
||||||
vector<int> faces;
|
|
||||||
vector<int> adj;
|
|
||||||
vector<bool> invert;
|
|
||||||
vector<int> nflags;
|
|
||||||
|
|
||||||
bool have_ph, have_line, have_symmetry;
|
|
||||||
int real_faces;
|
|
||||||
int real_face_type;
|
|
||||||
|
|
||||||
int repetition;
|
|
||||||
int N;
|
|
||||||
|
|
||||||
ld euclidean_angle_sum;
|
|
||||||
|
|
||||||
vector<int> flags;
|
|
||||||
|
|
||||||
vector<vector<pair<int, int>>> adjacent;
|
|
||||||
vector<vector<pair<ld, ld>>> triangles;
|
|
||||||
|
|
||||||
void make_match(int a, int i, int b, int j);
|
|
||||||
void prepare();
|
|
||||||
void compute_geometry();
|
|
||||||
|
|
||||||
void parse();
|
|
||||||
void parse(string s) { symbol = s; parse(); }
|
|
||||||
|
|
||||||
ld edgelength;
|
|
||||||
|
|
||||||
vector<ld> inradius, circumradius, alphas;
|
|
||||||
|
|
||||||
int matches[30][30];
|
|
||||||
int periods[30];
|
|
||||||
int tilegroup[30], groupoffset[30], tilegroups;
|
|
||||||
|
|
||||||
int errors;
|
|
||||||
string errormsg;
|
|
||||||
|
|
||||||
pair<int, int>& get_adj(heptagon *h, int cid);
|
|
||||||
pair<int, int>& get_adj(heptspin hs) { return get_adj(hs.at, hs.spin); }
|
|
||||||
pair<ld, ld>& get_triangle(heptagon *h, int cid);
|
|
||||||
pair<ld, ld>& get_triangle(heptspin hs) { return get_triangle(hs.at, hs.spin); }
|
|
||||||
pair<ld, ld>& get_triangle(const pair<int, int>& p, int delta = 0);
|
|
||||||
pair<int, int>& get_adj(const pair<int, int>& p, int delta = 0);
|
|
||||||
|
|
||||||
int support_threecolor();
|
|
||||||
int support_threecolor_bitruncated();
|
|
||||||
int support_football();
|
|
||||||
bool support_chessboard();
|
|
||||||
void regroup();
|
|
||||||
string world_size();
|
|
||||||
|
|
||||||
eGeometryClass get_class();
|
|
||||||
|
|
||||||
ld scale();
|
|
||||||
};
|
|
||||||
|
|
||||||
extern archimedean_tiling current;
|
|
||||||
|
|
||||||
extern map<heptagon*, pair<heptagon*, transmatrix>> archimedean_gmatrix;
|
|
||||||
|
|
||||||
void initialize(heptagon *root);
|
|
||||||
short& id_of(heptagon *);
|
|
||||||
int fix(heptagon *h, int spin);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace crystal {
|
namespace crystal {
|
||||||
#if CAP_CRYSTAL
|
#if CAP_CRYSTAL
|
||||||
static const int MAXDIM = 7;
|
static const int MAXDIM = 7;
|
||||||
@ -4328,141 +4218,8 @@ namespace crystal {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
struct bignum {
|
|
||||||
static const int BASE = 1000000000;
|
|
||||||
static const long long BASE2 = BASE * (long long)BASE;
|
|
||||||
vector<int> digits;
|
|
||||||
bignum() {}
|
|
||||||
bignum(int i) : digits() { digits.push_back(i); }
|
|
||||||
void be(int i) { digits.resize(1); digits[0] = i; }
|
|
||||||
bignum& operator +=(const bignum& b);
|
|
||||||
void addmul(const bignum& b, int factor);
|
|
||||||
string get_str(int max_length);
|
|
||||||
|
|
||||||
bool operator < (const bignum&) const;
|
|
||||||
|
|
||||||
ld leading() const {
|
|
||||||
switch(isize(digits)) {
|
|
||||||
case 0:
|
|
||||||
return 0;
|
|
||||||
case 1:
|
|
||||||
return digits.back();
|
|
||||||
default:
|
|
||||||
return digits.back() + ld(digits[isize(digits)-2]) / BASE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ld approx() const {
|
|
||||||
return leading() * pow(BASE, isize(digits) - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
ld log_approx() const {
|
|
||||||
return log(leading()) * log(BASE) * (isize(digits) - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
ld operator / (const bignum& b) const {
|
|
||||||
return leading() / b.leading() * pow(BASE, isize(digits) - isize(b.digits));
|
|
||||||
}
|
|
||||||
|
|
||||||
int approx_int() const {
|
|
||||||
if(isize(digits) > 1) return BASE;
|
|
||||||
if(digits.empty()) return 0;
|
|
||||||
return digits[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
long long approx_ll() const {
|
|
||||||
if(isize(digits) > 2) return BASE2;
|
|
||||||
if(digits.empty()) return 0;
|
|
||||||
if(isize(digits) == 1) return digits[0];
|
|
||||||
return digits[0] + digits[1] * (long long) BASE;
|
|
||||||
}
|
|
||||||
|
|
||||||
friend inline bignum operator +(bignum a, const bignum& b) { a.addmul(b, 1); return a; }
|
|
||||||
friend inline bignum operator -(bignum a, const bignum& b) { a.addmul(b, -1); return a; }
|
|
||||||
};
|
|
||||||
|
|
||||||
struct expansion_analyzer {
|
|
||||||
vector<int> gettype(cell *c);
|
|
||||||
int N;
|
|
||||||
vector<cell*> samples;
|
|
||||||
map<vector<int>, int> codeid;
|
|
||||||
vector<vector<int> > children;
|
|
||||||
int rootid, diskid;
|
|
||||||
int coefficients_known;
|
|
||||||
vector<int> coef;
|
|
||||||
int valid_from, tested_to;
|
|
||||||
ld growth;
|
|
||||||
|
|
||||||
int sample_id(cell *c);
|
|
||||||
void preliminary_grouping();
|
|
||||||
void reduce_grouping();
|
|
||||||
vector<vector<bignum>> descendants;
|
|
||||||
bignum& get_descendants(int level);
|
|
||||||
bignum& get_descendants(int level, int type);
|
|
||||||
void find_coefficients();
|
|
||||||
void reset();
|
|
||||||
|
|
||||||
expansion_analyzer() { reset(); }
|
|
||||||
|
|
||||||
string approximate_descendants(int d, int max_length);
|
|
||||||
void view_distances_dialog();
|
|
||||||
ld get_growth();
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool verify(int id);
|
|
||||||
int valid(int v, int step);
|
|
||||||
};
|
|
||||||
|
|
||||||
extern expansion_analyzer expansion;
|
|
||||||
|
|
||||||
int towerval(cell *c, const cellfunction& cf);
|
int towerval(cell *c, const cellfunction& cf);
|
||||||
|
|
||||||
int parent_id(cell *c, int which, const cellfunction& cf);
|
|
||||||
|
|
||||||
extern int sibling_limit;
|
|
||||||
extern void set_sibling_limit();
|
|
||||||
int type_in_reduced(expansion_analyzer& ea, cell *c, const function<int(cell*)>& f);
|
|
||||||
|
|
||||||
namespace ts {
|
|
||||||
cell *verified_add(cell *c, int which, int bonus, const cellfunction& cf);
|
|
||||||
cell *add(cell *c, int which, int bonus, const cellfunction& cf);
|
|
||||||
|
|
||||||
inline cell *left_parent(cell *c, const cellfunction& cf) { return verified_add(c, 1, 0, cf); }
|
|
||||||
inline cell *right_parent(cell *c, const cellfunction& cf) { return verified_add(c, -1, 0, cf); }
|
|
||||||
cell *left_of(cell *c, const cellfunction& cf);
|
|
||||||
cell *right_of(cell *c, const cellfunction& cf);
|
|
||||||
cell *child_number(cell *c, int id, const cellfunction& cf);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct exp_parser {
|
|
||||||
string s;
|
|
||||||
int at;
|
|
||||||
exp_parser() { at = 0; }
|
|
||||||
|
|
||||||
map<string, cld> extra_params;
|
|
||||||
|
|
||||||
bool ok() { return at == isize(s); }
|
|
||||||
char next(int step=0) { if(at >= isize(s)-step || at == -1) return 0; else return s[at+step]; }
|
|
||||||
|
|
||||||
bool eat(const char *c) {
|
|
||||||
int orig_at = at;
|
|
||||||
while(*c && *c == next()) at++, c++;
|
|
||||||
if(*c == 0) return true;
|
|
||||||
else at = orig_at;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
cld parse(int prio = 0);
|
|
||||||
|
|
||||||
cld parsepar() {
|
|
||||||
cld res = parse();
|
|
||||||
if(next() != ')') { at = -1; return res; }
|
|
||||||
at++;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#if CAP_COMPLEX2
|
#if CAP_COMPLEX2
|
||||||
namespace brownian {
|
namespace brownian {
|
||||||
const int level = 5;
|
const int level = 5;
|
||||||
@ -4482,10 +4239,6 @@ namespace brownian {
|
|||||||
|
|
||||||
void menuitem_sightrange(char c = 'r');
|
void menuitem_sightrange(char c = 'r');
|
||||||
|
|
||||||
static const ld degree = M_PI / 180;
|
|
||||||
|
|
||||||
extern unordered_map<string, ld&> params;
|
|
||||||
|
|
||||||
namespace dq {
|
namespace dq {
|
||||||
extern queue<tuple<heptagon*, transmatrix, ld>> drawqueue;
|
extern queue<tuple<heptagon*, transmatrix, ld>> drawqueue;
|
||||||
|
|
||||||
@ -4514,34 +4267,6 @@ template <class T> void texture_order(const T& f) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct gamedata {
|
|
||||||
// important parameters should be visible
|
|
||||||
eGeometry geo;
|
|
||||||
eVariation var;
|
|
||||||
eLand specland;
|
|
||||||
bool active;
|
|
||||||
// other properties are recorded
|
|
||||||
vector<char> record;
|
|
||||||
int index, mode;
|
|
||||||
void storegame();
|
|
||||||
void restoregame();
|
|
||||||
template<class T> void store(T& x) {
|
|
||||||
int ssize = sizeof(x);
|
|
||||||
if(ssize & 7) ssize = (ssize | 7) + 1;
|
|
||||||
if(mode == 0) {
|
|
||||||
record.resize(index+ssize);
|
|
||||||
T& at = *(new (&record[index]) T());
|
|
||||||
at = move(x);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
T& at = (T&) record[index];
|
|
||||||
x = move(at);
|
|
||||||
at.~T();
|
|
||||||
}
|
|
||||||
index += ssize;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* lastmovetype uses lmSkip, lmMove, lmAttack, lmPush, lmTree */
|
/* lastmovetype uses lmSkip, lmMove, lmAttack, lmPush, lmTree */
|
||||||
enum eLastmovetype { lmSkip, lmMove, lmAttack, lmPush, lmTree, lmInstant };
|
enum eLastmovetype { lmSkip, lmMove, lmAttack, lmPush, lmTree, lmInstant };
|
||||||
extern eLastmovetype lastmovetype, nextmovetype;
|
extern eLastmovetype lastmovetype, nextmovetype;
|
||||||
@ -4549,8 +4274,6 @@ extern eLastmovetype lastmovetype, nextmovetype;
|
|||||||
enum eForcemovetype { fmSkip, fmMove, fmAttack, fmInstant, fmActivate };
|
enum eForcemovetype { fmSkip, fmMove, fmAttack, fmInstant, fmActivate };
|
||||||
extern eForcemovetype forcedmovetype;
|
extern eForcemovetype forcedmovetype;
|
||||||
|
|
||||||
static const int PSEUDOKEY_MEMORY = 16397;
|
|
||||||
|
|
||||||
static const color_t NOCOLOR = 0;
|
static const color_t NOCOLOR = 0;
|
||||||
|
|
||||||
typedef pair<cell**, bool> euc_pointer;
|
typedef pair<cell**, bool> euc_pointer;
|
||||||
|
@ -4,6 +4,10 @@
|
|||||||
|
|
||||||
namespace hr {
|
namespace hr {
|
||||||
|
|
||||||
|
#if HDR
|
||||||
|
static const ld degree = M_PI / 180;
|
||||||
|
#endif
|
||||||
|
|
||||||
eGeometry geometry;
|
eGeometry geometry;
|
||||||
eVariation variation;
|
eVariation variation;
|
||||||
|
|
||||||
|
@ -7,6 +7,36 @@
|
|||||||
|
|
||||||
namespace hr {
|
namespace hr {
|
||||||
|
|
||||||
|
#if HDR
|
||||||
|
struct gamedata {
|
||||||
|
// important parameters should be visible
|
||||||
|
eGeometry geo;
|
||||||
|
eVariation var;
|
||||||
|
eLand specland;
|
||||||
|
bool active;
|
||||||
|
// other properties are recorded
|
||||||
|
vector<char> record;
|
||||||
|
int index, mode;
|
||||||
|
void storegame();
|
||||||
|
void restoregame();
|
||||||
|
template<class T> void store(T& x) {
|
||||||
|
int ssize = sizeof(x);
|
||||||
|
if(ssize & 7) ssize = (ssize | 7) + 1;
|
||||||
|
if(mode == 0) {
|
||||||
|
record.resize(index+ssize);
|
||||||
|
T& at = *(new (&record[index]) T());
|
||||||
|
at = move(x);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
T& at = (T&) record[index];
|
||||||
|
x = move(at);
|
||||||
|
at.~T();
|
||||||
|
}
|
||||||
|
index += ssize;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
void gamedata_all(gamedata& gd) {
|
void gamedata_all(gamedata& gd) {
|
||||||
gd.index = 0;
|
gd.index = 0;
|
||||||
gd.store(firstland);
|
gd.store(firstland);
|
||||||
|
@ -3,6 +3,10 @@
|
|||||||
|
|
||||||
namespace hr {
|
namespace hr {
|
||||||
|
|
||||||
|
#if HDR
|
||||||
|
static const int PSEUDOKEY_MEMORY = 16397;
|
||||||
|
#endif
|
||||||
|
|
||||||
bool memory_saving_mode = true;
|
bool memory_saving_mode = true;
|
||||||
|
|
||||||
bool show_memory_warning = true;
|
bool show_memory_warning = true;
|
||||||
|
26
system.cpp
26
system.cpp
@ -102,7 +102,7 @@ bool trailer_safety = true;
|
|||||||
hookset<void()> *hooks_initgame;
|
hookset<void()> *hooks_initgame;
|
||||||
|
|
||||||
// initialize the game
|
// initialize the game
|
||||||
void initgame() {
|
EX void initgame() {
|
||||||
DEBBI(DF_INIT, ("initGame"));
|
DEBBI(DF_INIT, ("initGame"));
|
||||||
callhooks(hooks_initgame);
|
callhooks(hooks_initgame);
|
||||||
|
|
||||||
@ -834,7 +834,7 @@ void remove_emergency_save() {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void saveStats(bool emergency = false) {
|
EX void saveStats(bool emergency IS(false)) {
|
||||||
DEBBI(DF_INIT, ("saveStats [%s]", scorefile));
|
DEBBI(DF_INIT, ("saveStats [%s]", scorefile));
|
||||||
|
|
||||||
if(autocheat) return;
|
if(autocheat) return;
|
||||||
@ -958,7 +958,7 @@ void saveStats(bool emergency = false) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// load the save
|
// load the save
|
||||||
void loadsave() {
|
EX void loadsave() {
|
||||||
if(autocheat) return;
|
if(autocheat) return;
|
||||||
#if CAP_TOUR
|
#if CAP_TOUR
|
||||||
if(tour::on) return;
|
if(tour::on) return;
|
||||||
@ -1088,7 +1088,7 @@ void loadsave() {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void stop_game() {
|
EX void stop_game() {
|
||||||
if(!game_active) return;
|
if(!game_active) return;
|
||||||
if(dual::split(stop_game)) return;
|
if(dual::split(stop_game)) return;
|
||||||
DEBBI(DF_INIT, ("stop_game"));
|
DEBBI(DF_INIT, ("stop_game"));
|
||||||
@ -1125,7 +1125,7 @@ void stop_game() {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_geometry(eGeometry target) {
|
EX void set_geometry(eGeometry target) {
|
||||||
if(geometry != target) {
|
if(geometry != target) {
|
||||||
int old_DIM = DIM;
|
int old_DIM = DIM;
|
||||||
stop_game();
|
stop_game();
|
||||||
@ -1161,7 +1161,7 @@ void set_geometry(eGeometry target) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_variation(eVariation target) {
|
EX void set_variation(eVariation target) {
|
||||||
if(variation != target) {
|
if(variation != target) {
|
||||||
stop_game();
|
stop_game();
|
||||||
if(euclid6 || binarytiling || sol || penrose) geometry = gNormal;
|
if(euclid6 || binarytiling || sol || penrose) geometry = gNormal;
|
||||||
@ -1182,7 +1182,7 @@ void stop_tour() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void switch_game_mode(char switchWhat) {
|
EX void switch_game_mode(char switchWhat) {
|
||||||
DEBBI(DF_INIT, ("switch_game_mode ", switchWhat));
|
DEBBI(DF_INIT, ("switch_game_mode ", switchWhat));
|
||||||
switch(switchWhat) {
|
switch(switchWhat) {
|
||||||
case rg::peace:
|
case rg::peace:
|
||||||
@ -1312,7 +1312,7 @@ void switch_game_mode(char switchWhat) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void start_game() {
|
EX void start_game() {
|
||||||
if(game_active) return;
|
if(game_active) return;
|
||||||
DEBBI(DF_INIT, ("start_game"));
|
DEBBI(DF_INIT, ("start_game"));
|
||||||
if(dual::state == 1) dual::assign_landsides();
|
if(dual::state == 1) dual::assign_landsides();
|
||||||
@ -1353,21 +1353,23 @@ void start_game() {
|
|||||||
subscreens::prepare();
|
subscreens::prepare();
|
||||||
}
|
}
|
||||||
|
|
||||||
void restart_game(char switchWhat) {
|
// popAllScreens + popAllGames + stop_game + switch_game_mode + start_game
|
||||||
|
EX void restart_game(char switchWhat IS(rg::nothing)) {
|
||||||
popScreenAll();
|
popScreenAll();
|
||||||
stop_game();
|
stop_game();
|
||||||
switch_game_mode(switchWhat);
|
switch_game_mode(switchWhat);
|
||||||
start_game();
|
start_game();
|
||||||
}
|
}
|
||||||
|
|
||||||
void stop_game_and_switch_mode(char switchWhat) {
|
// stop_game + switch_game_mode
|
||||||
|
EX void stop_game_and_switch_mode(char switchWhat IS(rg::nothing)) {
|
||||||
stop_game();
|
stop_game();
|
||||||
switch_game_mode(switchWhat);
|
switch_game_mode(switchWhat);
|
||||||
}
|
}
|
||||||
|
|
||||||
purehookset clearmemory;
|
EX purehookset clearmemory;
|
||||||
|
|
||||||
void clearMemory() {
|
EX void clearMemory() {
|
||||||
callhooks(clearmemory);
|
callhooks(clearmemory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
31
util.cpp
31
util.cpp
@ -103,6 +103,37 @@ EX bool appears(const string& haystack, const string& needle) {
|
|||||||
return simplify(haystack).find(simplify(needle)) != string::npos;
|
return simplify(haystack).find(simplify(needle)) != string::npos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if HDR
|
||||||
|
struct exp_parser {
|
||||||
|
string s;
|
||||||
|
int at;
|
||||||
|
exp_parser() { at = 0; }
|
||||||
|
|
||||||
|
map<string, cld> extra_params;
|
||||||
|
|
||||||
|
bool ok() { return at == isize(s); }
|
||||||
|
char next(int step=0) { if(at >= isize(s)-step || at == -1) return 0; else return s[at+step]; }
|
||||||
|
|
||||||
|
bool eat(const char *c) {
|
||||||
|
int orig_at = at;
|
||||||
|
while(*c && *c == next()) at++, c++;
|
||||||
|
if(*c == 0) return true;
|
||||||
|
else at = orig_at;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
cld parse(int prio = 0);
|
||||||
|
|
||||||
|
cld parsepar() {
|
||||||
|
cld res = parse();
|
||||||
|
if(next() != ')') { at = -1; return res; }
|
||||||
|
at++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
cld exp_parser::parse(int prio) {
|
cld exp_parser::parse(int prio) {
|
||||||
cld res;
|
cld res;
|
||||||
while(next() == ' ') at++;
|
while(next() == ' ') at++;
|
||||||
|
Loading…
Reference in New Issue
Block a user