mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-02-02 20:29:17 +00:00
rulegen:: tests improved
This commit is contained in:
parent
9b741ebb47
commit
80d5ee7c37
@ -69,6 +69,7 @@ struct hrmap_testproto : hrmap {
|
||||
}
|
||||
|
||||
transmatrix adj(heptagon *h, int dir) override {
|
||||
if(h->move(dir) == &oob || h == &oob) return Id;
|
||||
return arb::get_adj(arb::current_or_slided(), shvid(h->c7), dir, -1, h->c.move(dir) ? h->c.spin(dir) : -1);
|
||||
}
|
||||
|
||||
@ -81,13 +82,117 @@ struct hrmap_testproto : hrmap {
|
||||
return cc->id;
|
||||
}
|
||||
|
||||
bool strict_tree_rules() { return true; }
|
||||
bool strict_tree_rules() { return false; }
|
||||
};
|
||||
|
||||
reaction_t clear_debug = [] {};
|
||||
|
||||
map<tcell*,int> sprawl_shown;
|
||||
|
||||
int total_analyzers();
|
||||
|
||||
void iterate(int qty) {
|
||||
auto m = dynamic_cast<hrmap_testproto*> (currentmap);
|
||||
for(int i=0; i<qty; i++) {
|
||||
try {
|
||||
rules_iteration();
|
||||
try_count--;
|
||||
break;
|
||||
}
|
||||
catch(rulegen_retry& f) {
|
||||
println(hlog, "retry on: ", f.what());
|
||||
}
|
||||
catch(rulegen_failure& f) {
|
||||
println(hlog, "failure: ", f.what());
|
||||
}
|
||||
catch(rulegen_surrender& f) {
|
||||
println(hlog, "surrender: ", f.what());
|
||||
}
|
||||
}
|
||||
println(hlog, "try_count = ", try_count, " states = ", isize(treestates), " imp = ", isize(important), " analyzers = ", total_analyzers(), " cell = ", tcellcount);
|
||||
auto *c = first_tcell;
|
||||
while(c) {
|
||||
auto wh = m->clone(c);
|
||||
for(int i=0; i<wh->type; i++) if(wh->move(i) == &oob) wh->move(i) = nullptr;
|
||||
for(int i=0; i<wh->c7->type; i++) if(wh->c7->move(i) == &out_of_bounds) wh->c7->move(i) = nullptr;
|
||||
c = c->next;
|
||||
}
|
||||
}
|
||||
|
||||
void print_rules();
|
||||
|
||||
void debug_menu() {
|
||||
cmode = sm::SIDE | sm::MAYDARK;
|
||||
gamescreen(0);
|
||||
auto m = dynamic_cast<hrmap_testproto*> (currentmap);
|
||||
dialog::init("debug menu");
|
||||
|
||||
dialog::addItem("sprawl", 's');
|
||||
dialog::add_action([m] {
|
||||
tcell *c = m->counterpart[centerover->master];
|
||||
auto [d, id] = get_code(c);
|
||||
twalker cw(c, d);
|
||||
auto res = spread(get_analyzer(cw), cw);
|
||||
println(hlog, "sprawl result = ", res);
|
||||
sprawl_shown.clear();
|
||||
for(int i=0; i<isize(res); i++) sprawl_shown[res[i].at] = i;
|
||||
});
|
||||
|
||||
dialog::addItem("parent_dir", 'p');
|
||||
dialog::add_action([m] {
|
||||
tcell *c = m->counterpart[centerover->master];
|
||||
auto c1 = c;
|
||||
ufindc(c1);
|
||||
if(c != c1) {
|
||||
println(hlog, "ufindc changes ", c, " to ", c1);
|
||||
for(int i=0; i<c->type; i++)
|
||||
println(hlog, twalker(c,i), twalker(c,i)+wstep, twalker(c,i)+wstep+wstep);
|
||||
}
|
||||
println(hlog, "parent_dir = ", c->parent_dir);
|
||||
c->parent_dir = MYSTERY;
|
||||
parent_debug = true;
|
||||
get_parent_dir(c);
|
||||
parent_debug = false;
|
||||
println(hlog, "parent_dir = ", c->parent_dir);
|
||||
});
|
||||
|
||||
dialog::addItem("iterate", 'm');
|
||||
dialog::add_action([] { iterate(1); });
|
||||
|
||||
dialog::addItem("iterate x100", 'M');
|
||||
dialog::add_action([] { iterate(100); });
|
||||
|
||||
dialog::addItem("iterate x1000", 'T');
|
||||
dialog::add_action([] { iterate(1000); });
|
||||
|
||||
dialog::addItem("debug tiles", 'd');
|
||||
dialog::add_action_push([m] {
|
||||
cmode = sm::SIDE | sm::MAYDARK;
|
||||
gamescreen(0);
|
||||
dialog::init();
|
||||
for(auto dw: debuglist) {
|
||||
dialog::addItem("go to " + index_pointer(dw.at), 'a');
|
||||
dialog::add_action([dw,m] {
|
||||
cwt = cellwalker(m->clone(dw.at)->c7, dw.spin, dw.mirrored);
|
||||
centerover = cwt.at;
|
||||
View = Id;
|
||||
});
|
||||
}
|
||||
dialog::display();
|
||||
});
|
||||
|
||||
dialog::addItem("print rules", 'P');
|
||||
dialog::add_action(print_rules);
|
||||
|
||||
dialog::addItem("clean data", 'c');
|
||||
dialog::add_action(clean_data);
|
||||
|
||||
dialog::addItem("clean data and parents", 'C');
|
||||
dialog::add_action(clean_parents);
|
||||
|
||||
dialog::display();
|
||||
}
|
||||
|
||||
void view_debug() {
|
||||
auto m = dynamic_cast<hrmap_testproto*> (currentmap);
|
||||
if(m) {
|
||||
@ -95,7 +200,7 @@ void view_debug() {
|
||||
tcell *tc = m->counterpart[c->master];
|
||||
|
||||
string s;
|
||||
auto label = (tc->code == MYSTERY ? "?" : its(tc->code)) + "/" + (tc->dist == MYSTERY ? "?" : tc->dist == MYSTERY_DIST ? "*" : its(tc->dist));
|
||||
auto label = (tc->code == MYSTERY ? "?" : its(tc->code)) + "/" + (tc->dist == MYSTERY ? "?" : its(tc->dist));
|
||||
|
||||
color_t col = 0xFFFFFF + 0x512960 * tc->code;
|
||||
|
||||
@ -117,35 +222,14 @@ void view_debug() {
|
||||
vector<int> dh;
|
||||
|
||||
dh.push_back(addHook(hooks_o_key, 15, [m] (o_funcs& v) {
|
||||
v.push_back(named_functionality("sprawl", [m] {
|
||||
tcell *c = m->counterpart[centerover->master];
|
||||
auto [d, id] = get_code(c);
|
||||
twalker cw(c, d);
|
||||
auto res = spread(get_analyzer(cw), cw);
|
||||
println(hlog, "sprawl result = ", res);
|
||||
sprawl_shown.clear();
|
||||
for(int i=0; i<isize(res); i++) sprawl_shown[res[i].at] = i;
|
||||
}));
|
||||
/* v.push_back(named_functionality("mark", [m] {
|
||||
for(auto c: marklist)
|
||||
m->clone(c.at)->c7->item = itGold;
|
||||
})); */
|
||||
|
||||
v.push_back(named_functionality("parent_dir", [m] {
|
||||
tcell *c = m->counterpart[centerover->master];
|
||||
println(hlog, "parent_dir = ", c->parent_dir);
|
||||
c->parent_dir = MYSTERY;
|
||||
parent_debug = true;
|
||||
get_parent_dir(c);
|
||||
parent_debug = false;
|
||||
println(hlog, "parent_dir = ", c->parent_dir);
|
||||
}));
|
||||
v.push_back(named_dialog("debug menu", debug_menu));
|
||||
}));
|
||||
|
||||
for(auto dw: debuglist)
|
||||
dh.push_back(addHook(hooks_o_key, 10, [m,dw] (o_funcs& v) {
|
||||
v.push_back(named_functionality(lalign(0, "go to ", dw), [dw,m] {
|
||||
cwt = cellwalker(m->clone(dw.at)->c7, dw.spin, dw.mirrored);
|
||||
centerover = cwt.at;
|
||||
View = Id;
|
||||
}));
|
||||
}));
|
||||
clear_debug = [ah, dh] {
|
||||
delHook(hooks_drawcell, ah);
|
||||
for(auto dhk: dh) delHook(hooks_o_key, dhk);
|
||||
@ -281,7 +365,29 @@ void restart_game_on(hrmap *m) {
|
||||
|
||||
bool add_header = false;
|
||||
bool add_labels = true;
|
||||
string test_stats = "gsmctTf";
|
||||
string test_stats = "gsmctTlAhf";
|
||||
|
||||
pair<int,int> longest_shortcut() {
|
||||
int res = 0;
|
||||
int qty = 0;
|
||||
for(auto& p: shortcuts) for(auto& v: p.second) {
|
||||
res = max<int>(res, isize(v->pre));
|
||||
qty++;
|
||||
}
|
||||
return {qty, res};
|
||||
}
|
||||
|
||||
int longest_analyzer() {
|
||||
int res = 0;
|
||||
for(auto& a: analyzers) res = max(res, isize(a.second.spread));
|
||||
return res;
|
||||
}
|
||||
|
||||
int total_analyzers() {
|
||||
int res = 0;
|
||||
for(auto& a: analyzers) res += isize(a.second.spread);
|
||||
return res;
|
||||
}
|
||||
|
||||
void test_current() {
|
||||
stop_game();
|
||||
@ -392,6 +498,8 @@ void test_current() {
|
||||
case 'a': Out("amin;amax", lalign(0, areas[0], ";", areas.back()));
|
||||
case 'h': Out("shapes", isize(arb::current.shapes));
|
||||
case 'f': Out("file", arb::current.filename);
|
||||
case 'l': Out("shortcut", longest_shortcut());
|
||||
case 'A': Out("analyzer", longest_analyzer());
|
||||
}
|
||||
println(hlog);
|
||||
fflush(stdout);
|
||||
|
Loading…
Reference in New Issue
Block a user