1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-06-15 21:04:08 +00:00

arb:: int sliders

This commit is contained in:
Zeno Rogue 2022-04-24 22:09:54 +02:00
parent 5a748e113a
commit 89efe24c2d
3 changed files with 70 additions and 16 deletions

View File

@ -87,6 +87,14 @@ struct slider {
ld max; ld max;
}; };
struct intslider {
string name;
int zero;
int current;
int min;
int max;
};
struct arbi_tiling { struct arbi_tiling {
int order; int order;
@ -108,6 +116,7 @@ struct arbi_tiling {
string comment; string comment;
vector<slider> sliders; vector<slider> sliders;
vector<intslider> intsliders;
ld cscale; ld cscale;
int range; int range;
@ -558,7 +567,7 @@ EX void add_connection(arbi_tiling& c, int ai, int as, int bi, int bs, int m) {
while(bs != bs0); while(bs != bs0);
} }
EX void load(const string& fname, bool after_sliding IS(false)) { EX void load(const string& fname, bool load_as_slided IS(false), bool keep_sliders IS(false)) {
fhstream f(fname, "rt"); fhstream f(fname, "rt");
if(!f.f) throw hr_parse_exception("file " + fname + " does not exist"); if(!f.f) throw hr_parse_exception("file " + fname + " does not exist");
string s; string s;
@ -567,10 +576,14 @@ EX void load(const string& fname, bool after_sliding IS(false)) {
if(c < 0) break; if(c < 0) break;
s += c; s += c;
} }
auto& c = after_sliding ? slided : current; auto& c = load_as_slided ? slided : current;
c.order++; c.order++;
c.shapes.clear(); c.shapes.clear();
c.sliders.clear(); if(!keep_sliders) {
c.sliders.clear();
c.intsliders.clear();
}
int qsliders = 0, qintsliders = 0;
c.name = unnamed; c.name = unnamed;
c.comment = ""; c.comment = "";
c.filename = fname; c.filename = fname;
@ -688,9 +701,27 @@ EX void load(const string& fname, bool after_sliding IS(false)) {
ep.force_eat(","); ep.force_eat(",");
sl.max = ep.rparse(); sl.max = ep.rparse();
ep.force_eat(")"); ep.force_eat(")");
c.sliders.push_back(sl); if(load_as_slided || !keep_sliders)
if(after_sliding) c.sliders.push_back(sl);
ep.extra_params[sl.name] = current.sliders[isize(c.sliders)-1].current; if(load_as_slided || keep_sliders)
ep.extra_params[sl.name] = current.sliders[qsliders++].current;
else
ep.extra_params[sl.name] = sl.zero;
}
else if(ep.eat("intslider(")) {
intslider sl;
sl.name = ep.next_token();
ep.force_eat(",");
sl.current = sl.zero = ep.iparse();
ep.force_eat(",");
sl.min = ep.iparse();
ep.force_eat(",");
sl.max = ep.iparse();
ep.force_eat(")");
if(load_as_slided || !keep_sliders)
c.intsliders.push_back(sl);
if(load_as_slided || keep_sliders)
ep.extra_params[sl.name] = current.intsliders[qintsliders++].current;
else else
ep.extra_params[sl.name] = sl.zero; ep.extra_params[sl.name] = sl.zero;
} }
@ -860,7 +891,7 @@ EX void load(const string& fname, bool after_sliding IS(false)) {
if(c.have_tree) rulegen::verify_parsed_treestates(c); if(c.have_tree) rulegen::verify_parsed_treestates(c);
if(!after_sliding) slided = current; if(!load_as_slided) slided = current;
} }
arbi_tiling debugged; arbi_tiling debugged;
@ -1234,35 +1265,49 @@ EX void run(string fname) {
string slider_error; string slider_error;
EX void sliders_changed() { EX void sliders_changed(bool need_restart) {
if(need_restart) stop_game();
auto& c = current_or_slided();
arbi_tiling backup = c;
try { try {
load(current.filename, true); load(current.filename, !need_restart, need_restart);
using_slided = true; using_slided = !need_restart;
slider_error = "OK"; slider_error = "OK";
#if CAP_TEXTURE #if CAP_TEXTURE
texture::config.remap(); texture::config.remap();
#endif #endif
} }
catch(hr_parse_exception& ex) { catch(hr_parse_exception& ex) {
using_slided = false; c = backup;
slider_error = ex.s; slider_error = ex.s;
} }
catch(hr_polygon_error& poly) { catch(hr_polygon_error& poly) {
using_slided = false; c = backup;
slider_error = poly.generate_error(); slider_error = poly.generate_error();
} }
if(need_restart) start_game();
} }
EX void set_sliders() { EX void set_sliders() {
cmode = sm::SIDE | sm::MAYDARK; cmode = sm::SIDE | sm::MAYDARK;
gamescreen(1); gamescreen(1);
dialog::init(XLAT("tessellation sliders")); dialog::init(XLAT("tessellation sliders"));
dialog::addHelp(current.comment);
char ch = 'A'; char ch = 'A';
for(auto& sl: current.sliders) { for(auto& sl: current.sliders) {
dialog::addSelItem(sl.name, fts(sl.current), ch++); dialog::addSelItem(sl.name, fts(sl.current), ch++);
dialog::add_action([&] { dialog::add_action([&] {
dialog::editNumber(sl.current, sl.min, sl.max, 1, sl.zero, sl.name, sl.name); dialog::editNumber(sl.current, sl.min, sl.max, 1, sl.zero, sl.name, sl.name);
dialog::reaction = sliders_changed; dialog::reaction = [] { sliders_changed(false); };
});
}
if(isize(current.intsliders))
dialog::addInfo(XLAT("the following sliders will restart the game"));
for(auto& sl: current.intsliders) {
dialog::addSelItem(sl.name, its(sl.current), ch++);
dialog::add_action([&] {
dialog::editNumber(sl.current, sl.min, sl.max, 1, sl.zero, sl.name, sl.name);
dialog::reaction = [] { sliders_changed(true); };
}); });
} }
dialog::addInfo(slider_error); dialog::addInfo(slider_error);
@ -1521,7 +1566,14 @@ int readArgs() {
bool found = true; bool found = true;
for(auto& sl: current.sliders) for(auto& sl: current.sliders)
if(sl.name == slider) { if(sl.name == slider) {
shift_arg_formula(sl.current, sliders_changed); shift_arg_formula(sl.current, [] { sliders_changed(false); });
found = true;
}
for(auto& sl: current.intsliders)
if(sl.name == slider) {
shift(); sl.current = argi();
stop_game();
sliders_changed(false);
found = true; found = true;
} }
if(!found) { if(!found) {

View File

@ -976,7 +976,7 @@ EX void showEuclideanMenu() {
}); });
} }
if(arb::in() && !arb::current.sliders.empty()) { if(arb::in() && !(arb::current.sliders.empty() && arb::current.intsliders.empty())) {
dialog::addItem(XLAT("tessellation sliders"), '4'); dialog::addItem(XLAT("tessellation sliders"), '4');
dialog::add_action_push(arb::set_sliders); dialog::add_action_push(arb::set_sliders);
} }

View File

@ -1130,9 +1130,11 @@ EX string cgi_string() {
V("GEO", its(int(geometry))); V("GEO", its(int(geometry)));
V("VAR", its(int(variation))); V("VAR", its(int(variation)));
if(arb::in() && arb::using_slided) { if(arb::in()) {
for(auto& sl: arb::current.sliders) for(auto& sl: arb::current.sliders)
V("AS", fts(sl.current)); V("AS", fts(sl.current));
for(auto& sl: arb::current.intsliders)
V("AS", its(sl.current));
} }
if(fake::in()) { if(fake::in()) {