mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-05-28 12:04:07 +00:00
expansion_analyzer is now in cgi
This commit is contained in:
parent
cfcd8a5e57
commit
5d81260f0b
@ -1814,7 +1814,7 @@ EX void buildCamelot(cell *c) {
|
|||||||
c->monst = camelot_monster();
|
c->monst = camelot_monster();
|
||||||
if(d == 1) {
|
if(d == 1) {
|
||||||
// roughly as many knights as table cells
|
// roughly as many knights as table cells
|
||||||
if(hrand(1000000) < 1000000 / expansion.get_growth() && !reptilecheat)
|
if(hrand(1000000) < 1000000 / get_expansion().get_growth() && !reptilecheat)
|
||||||
c->monst = moKnight;
|
c->monst = moKnight;
|
||||||
if(!eubinary) for(int i=0; i<c->master->type; i++) currentmap->extend_altmap(c->master->move(i));
|
if(!eubinary) for(int i=0; i<c->master->type; i++) currentmap->extend_altmap(c->master->move(i));
|
||||||
for(int i=0; i<c->type; i++)
|
for(int i=0; i<c->type; i++)
|
||||||
|
@ -1003,6 +1003,7 @@ EX namespace clearing {
|
|||||||
cell *c1 = c;
|
cell *c1 = c;
|
||||||
if(c->mondir < c->type)
|
if(c->mondir < c->type)
|
||||||
c1 = c->move(c->mondir);
|
c1 = c->move(c->mondir);
|
||||||
|
auto& expansion = get_expansion();
|
||||||
return make_tuple(
|
return make_tuple(
|
||||||
celldistAlt(c), type_in(expansion, c, celldistAlt),
|
celldistAlt(c), type_in(expansion, c, celldistAlt),
|
||||||
celldistAlt(c1), type_in(expansion, c1, celldistAlt)
|
celldistAlt(c1), type_in(expansion, c1, celldistAlt)
|
||||||
|
@ -460,7 +460,7 @@ EX void knightFlavorMessage(cell *c2) {
|
|||||||
s = crystal::get_table_boundary();
|
s = crystal::get_table_boundary();
|
||||||
#endif
|
#endif
|
||||||
else if(!quotient && rad)
|
else if(!quotient && rad)
|
||||||
s = expansion.get_descendants(rad).get_str(100);
|
s = get_expansion().get_descendants(rad).get_str(100);
|
||||||
if(s == "") { msgid++; goto retry; }
|
if(s == "") { msgid++; goto retry; }
|
||||||
addMessage(XLAT("\"Our Table seats %1 Knights!\"", s));
|
addMessage(XLAT("\"Our Table seats %1 Knights!\"", s));
|
||||||
}
|
}
|
||||||
@ -472,7 +472,7 @@ EX void knightFlavorMessage(cell *c2) {
|
|||||||
s = crystal::get_table_volume();
|
s = crystal::get_table_volume();
|
||||||
#endif
|
#endif
|
||||||
else if(!quotient && rad)
|
else if(!quotient && rad)
|
||||||
s = expansion.get_descendants(rad-1, expansion.diskid).get_str(100);
|
s = get_expansion().get_descendants(rad-1, get_expansion().diskid).get_str(100);
|
||||||
if(s == "") { msgid++; goto retry; }
|
if(s == "") { msgid++; goto retry; }
|
||||||
addMessage(XLAT("\"There are %1 floor tiles inside our Table!\"", s));
|
addMessage(XLAT("\"There are %1 floor tiles inside our Table!\"", s));
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ void canonicize(vector<int>& t) {
|
|||||||
|
|
||||||
#if HDR
|
#if HDR
|
||||||
struct expansion_analyzer {
|
struct expansion_analyzer {
|
||||||
|
int sibling_limit;
|
||||||
vector<int> gettype(cell *c);
|
vector<int> gettype(cell *c);
|
||||||
int N;
|
int N;
|
||||||
vector<cell*> samples;
|
vector<cell*> samples;
|
||||||
@ -456,6 +457,7 @@ int position;
|
|||||||
EX 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);
|
||||||
|
auto& expansion = get_expansion();
|
||||||
if(expansion.N != a) {
|
if(expansion.N != a) {
|
||||||
expansion.reduce_grouping();
|
expansion.reduce_grouping();
|
||||||
t = type_in(ea, c, f);
|
t = type_in(ea, c, f);
|
||||||
@ -598,7 +600,7 @@ void celldrawer::do_viewdist() {
|
|||||||
if(c->master->alt) t = c->master->alt->fieldval;
|
if(c->master->alt) t = c->master->alt->fieldval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else t = type_in_reduced(expansion, c, curr_dist);
|
else t = type_in_reduced(get_expansion(), c, curr_dist);
|
||||||
if(t >= 0) label = its(t), dc = distribute_color(t);
|
if(t >= 0) label = its(t), dc = distribute_color(t);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -727,6 +729,7 @@ void expansion_analyzer::view_distances_dialog() {
|
|||||||
|
|
||||||
int maxlen = bounded ? 128 : 16 + first_distance;
|
int maxlen = bounded ? 128 : 16 + first_distance;
|
||||||
vector<bignum> qty(maxlen);
|
vector<bignum> qty(maxlen);
|
||||||
|
auto& expansion = get_expansion();
|
||||||
|
|
||||||
bool really_use_analyzer = use_analyzer && sizes_known();
|
bool really_use_analyzer = use_analyzer && sizes_known();
|
||||||
|
|
||||||
@ -826,6 +829,7 @@ void compute_coefficients() {
|
|||||||
println(hlog, gp::operation_name(), " ", ginf[geometry].tiling_name);
|
println(hlog, gp::operation_name(), " ", ginf[geometry].tiling_name);
|
||||||
start_game();
|
start_game();
|
||||||
|
|
||||||
|
auto& expansion = get_expansion();
|
||||||
printf(" sizes:");
|
printf(" sizes:");
|
||||||
for(int i=0; i<expansion.valid_from+10; i++) printf(" %d", expansion.get_descendants(i).approx_int());
|
for(int i=0; i<expansion.valid_from+10; i++) printf(" %d", expansion.get_descendants(i).approx_int());
|
||||||
|
|
||||||
@ -847,6 +851,7 @@ int expansion_readArgs() {
|
|||||||
else if(argis("-vap")) {
|
else if(argis("-vap")) {
|
||||||
PHASEFROM(2);
|
PHASEFROM(2);
|
||||||
start_game();
|
start_game();
|
||||||
|
auto& expansion = get_expansion();
|
||||||
shift(); int radius = argi();
|
shift(); int radius = argi();
|
||||||
while(true) {
|
while(true) {
|
||||||
string s = expansion.approximate_descendants(radius, 100);
|
string s = expansion.approximate_descendants(radius, 100);
|
||||||
@ -857,6 +862,7 @@ int expansion_readArgs() {
|
|||||||
else if(argis("-csizes")) {
|
else if(argis("-csizes")) {
|
||||||
PHASEFROM(2);
|
PHASEFROM(2);
|
||||||
start_game();
|
start_game();
|
||||||
|
auto& expansion = get_expansion();
|
||||||
expansion.get_growth();
|
expansion.get_growth();
|
||||||
shift(); for(int i=0; i<argi(); i++)
|
shift(); for(int i=0; i<argi(); i++)
|
||||||
printf("%s / %s\n", expansion.get_descendants(i).get_str(1000).c_str(), expansion.get_descendants(i, expansion.diskid).get_str(1000).c_str());
|
printf("%s / %s\n", expansion.get_descendants(i).get_str(1000).c_str(), expansion.get_descendants(i, expansion.diskid).get_str(1000).c_str());
|
||||||
@ -864,6 +870,7 @@ int expansion_readArgs() {
|
|||||||
else if(argis("-csolve")) {
|
else if(argis("-csolve")) {
|
||||||
PHASEFROM(2);
|
PHASEFROM(2);
|
||||||
start_game();
|
start_game();
|
||||||
|
auto& expansion = get_expansion();
|
||||||
printf("preliminary_grouping...\n");
|
printf("preliminary_grouping...\n");
|
||||||
expansion.preliminary_grouping();
|
expansion.preliminary_grouping();
|
||||||
printf("N = %d\n", expansion.N);
|
printf("N = %d\n", expansion.N);
|
||||||
@ -949,11 +956,13 @@ auto ea_hook = addHook(hooks_args, 100, expansion_readArgs);
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
EX expansion_analyzer expansion;
|
EX expansion_analyzer& get_expansion() {
|
||||||
|
if(!cgi.expansion) cgi.expansion = make_shared<expansion_analyzer> ();
|
||||||
EX int sibling_limit = 0;
|
return *cgi.expansion;
|
||||||
|
}
|
||||||
|
|
||||||
EX void set_sibling_limit() {
|
EX void set_sibling_limit() {
|
||||||
|
auto& sibling_limit = get_expansion().sibling_limit;
|
||||||
if(0) ;
|
if(0) ;
|
||||||
#if CAP_IRR
|
#if CAP_IRR
|
||||||
else if(IRREGULAR) sibling_limit = 3;
|
else if(IRREGULAR) sibling_limit = 3;
|
||||||
@ -1006,6 +1015,7 @@ EX int hyperbolic_celldistance(cell *c1, cell *c2) {
|
|||||||
int found_distance = INF;
|
int found_distance = INF;
|
||||||
|
|
||||||
int d = 0, d1 = celldist0(c1), d2 = celldist0(c2), sl_used = 0;
|
int d = 0, d1 = celldist0(c1), d2 = celldist0(c2), sl_used = 0;
|
||||||
|
auto& sibling_limit = get_expansion().sibling_limit;
|
||||||
|
|
||||||
cell *cl1=c1, *cr1=c1, *cl2=c2, *cr2=c2;
|
cell *cl1=c1, *cr1=c1, *cl2=c2, *cr2=c2;
|
||||||
while(true) {
|
while(true) {
|
||||||
|
@ -107,6 +107,8 @@ struct gi_extension {
|
|||||||
virtual ~gi_extension() {}
|
virtual ~gi_extension() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct expansion_analyzer;
|
||||||
|
|
||||||
/** both for 'heptagon' 3D cells and subdivided 3D cells */
|
/** both for 'heptagon' 3D cells and subdivided 3D cells */
|
||||||
struct subcellshape {
|
struct subcellshape {
|
||||||
/** \brief raw coordinates of vertices of all faces */
|
/** \brief raw coordinates of vertices of all faces */
|
||||||
@ -500,6 +502,8 @@ hpcshape
|
|||||||
shared_ptr<gpdata_t> gpdata = nullptr;
|
shared_ptr<gpdata_t> gpdata = nullptr;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
shared_ptr<expansion_analyzer> expansion = nullptr;
|
||||||
|
|
||||||
int state = 0;
|
int state = 0;
|
||||||
int usershape_state = 0;
|
int usershape_state = 0;
|
||||||
|
|
||||||
|
@ -876,6 +876,7 @@ EX pathgen generate_random_path(cellwalker start, int length, bool for_yendor, b
|
|||||||
|
|
||||||
cellwalker ycw = start;
|
cellwalker ycw = start;
|
||||||
if(for_yendor) setdist(p.path[0], 7, NULL);
|
if(for_yendor) setdist(p.path[0], 7, NULL);
|
||||||
|
auto& expansion = get_expansion();
|
||||||
|
|
||||||
for(int i=0; i<length; i++) {
|
for(int i=0; i<length; i++) {
|
||||||
|
|
||||||
@ -939,7 +940,7 @@ EX pathgen generate_random_path(cellwalker start, int length, bool for_yendor, b
|
|||||||
t = type_in(expansion, randomdir ? start.at : start.cpeek(), sdist);
|
t = type_in(expansion, randomdir ? start.at : start.cpeek(), sdist);
|
||||||
ycw--;
|
ycw--;
|
||||||
if(valence() == 3) ycw--;
|
if(valence() == 3) ycw--;
|
||||||
bignum b = expansion.get_descendants(randomdir ? length : length-1, t);
|
bignum b = get_expansion().get_descendants(randomdir ? length : length-1, t);
|
||||||
p.full_id_0 = full_id = hrand(b);
|
p.full_id_0 = full_id = hrand(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
hud.cpp
2
hud.cpp
@ -412,7 +412,7 @@ EX void drawStats() {
|
|||||||
if(nohud) return;
|
if(nohud) return;
|
||||||
if(callhandlers(false, hooks_prestats)) return;
|
if(callhandlers(false, hooks_prestats)) return;
|
||||||
if(viewdists && show_distance_lists)
|
if(viewdists && show_distance_lists)
|
||||||
expansion.view_distances_dialog();
|
get_expansion().view_distances_dialog();
|
||||||
if(current_display->sidescreen) return;
|
if(current_display->sidescreen) return;
|
||||||
|
|
||||||
first_cell_to_draw = true;
|
first_cell_to_draw = true;
|
||||||
|
2
quit.cpp
2
quit.cpp
@ -254,7 +254,7 @@ EX hint hints[] = {
|
|||||||
[]() { return !canmove && sizes_known() && celldist(cwt.at) >= 50; },
|
[]() { return !canmove && sizes_known() && celldist(cwt.at) >= 50; },
|
||||||
[]() {
|
[]() {
|
||||||
int d = celldist(cwt.at);
|
int d = celldist(cwt.at);
|
||||||
string s = expansion.approximate_descendants(d, 10000);
|
string s = get_expansion().approximate_descendants(d, 10000);
|
||||||
dialog::addHelp(XLAT(
|
dialog::addHelp(XLAT(
|
||||||
"You are %1 cells away from the starting point, or "
|
"You are %1 cells away from the starting point, or "
|
||||||
"the place where you used an Orb of Safety last time. "
|
"the place where you used an Orb of Safety last time. "
|
||||||
|
@ -1561,7 +1561,7 @@ EX void start_game() {
|
|||||||
arcm::current_or_fake().compute_geometry();
|
arcm::current_or_fake().compute_geometry();
|
||||||
#endif
|
#endif
|
||||||
initcells();
|
initcells();
|
||||||
expansion.reset();
|
get_expansion().reset();
|
||||||
|
|
||||||
if(randomPatternsMode) {
|
if(randomPatternsMode) {
|
||||||
for(int i=0; i<landtypes; i++) {
|
for(int i=0; i<landtypes; i++) {
|
||||||
|
@ -317,6 +317,7 @@ EX namespace yendor {
|
|||||||
|
|
||||||
if(key->land == laWestWall && trees_known()) {
|
if(key->land == laWestWall && trees_known()) {
|
||||||
|
|
||||||
|
auto& expansion = get_expansion();
|
||||||
int t = type_in(expansion, yendor, [yendor] (cell *c) { return celldistance(yendor, c); });
|
int t = type_in(expansion, yendor, [yendor] (cell *c) { return celldistance(yendor, c); });
|
||||||
int maxage = 10;
|
int maxage = 10;
|
||||||
for(int i=0; i<min(items[itOrbYendor], 8); i++)
|
for(int i=0; i<min(items[itOrbYendor], 8); i++)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user