From 479b2eaf3ccafa9c997dbdd4cd4a5fa12484e8e9 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Fri, 9 Jul 2021 14:01:55 +0200 Subject: [PATCH] reg3:: the new variations can be selected from the menu --- geom-exp.cpp | 7 ++++-- goldberg.cpp | 8 +++++- reg3.cpp | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++ system.cpp | 4 ++- 4 files changed, 85 insertions(+), 4 deletions(-) diff --git a/geom-exp.cpp b/geom-exp.cpp index 21008d0b..28423459 100644 --- a/geom-exp.cpp +++ b/geom-exp.cpp @@ -630,7 +630,7 @@ EX void select_quotient() { EX string full_geometry_name() { string qstring = ginf[geometry].quotient_name; bool variable = - !(prod || hybri || bt::in() || WDIM == 3 || kite::in() || arb::in()); + !(prod || hybri || bt::in() || (WDIM == 3 && !reg3::in()) || kite::in() || arb::in()); string fgname = XLAT(ginf[geometry].tiling_name); if(qstring != "none") fgname += " " + XLAT(qstring); @@ -644,6 +644,9 @@ void action_change_variation() { #if CAP_ARCM else if(arcm::in()) arcm::next_variation(); #endif + #if MAXMDIM >= 4 + else if(reg3::in()) reg3::configure_variation(); + #endif else if(euc::in(2,4) || !CAP_GP) dialog::do_if_confirmed([] { set_variation(PURE ? eVariation::bitruncated : eVariation::pure); start_game(); @@ -968,7 +971,7 @@ EX void showEuclideanMenu() { else if(nil) { menuitem_nilwidth('v'); } - else if(WDIM == 3 || kite::in() || arb::in()) dialog::addBreak(100); + else if((WDIM == 3 || kite::in() || arb::in()) && !reg3::in()) dialog::addBreak(100); else menuitem_change_variation('v'); diff --git a/goldberg.cpp b/goldberg.cpp index 7b75d2c4..315b383f 100644 --- a/goldberg.cpp +++ b/goldberg.cpp @@ -1079,7 +1079,13 @@ EX namespace gp { else if(GOLDBERG && param == loc(3, 0) && S3 == 3) return XLAT("2x bitruncated"); else if(variation == eVariation::subcubes) - return XLAT("subcube") + "(" + its(reg3::subcube_count) + ")"; + return XLAT("subcubed") + "(" + its(reg3::subcube_count) + ")"; + else if(variation == eVariation::dual_subcubes) + return XLAT("dual-subcubed") + "(" + its(reg3::subcube_count) + ")"; + else if(variation == eVariation::bch) + return XLAT("bitruncated-subcubed") + "(" + its(reg3::subcube_count) + ")"; + else if(variation == eVariation::coxeter) + return XLAT("subdivided") + "(" + its(reg3::coxeter_param) + ")"; else { auto p = human_representation(param); string s = "GP(" + its(p.first) + "," + its(p.second) + ")"; diff --git a/reg3.cpp b/reg3.cpp index 48d4039c..b841f260 100644 --- a/reg3.cpp +++ b/reg3.cpp @@ -2286,6 +2286,76 @@ EX void construct_relations() { } } +eVariation target_variation; +flagtype target_coxeter; +int target_subcube_count; + +EX void edit_variation() { + cmode = sm::SIDE | sm::MAYDARK; + gamescreen(0); + dialog::init(XLAT("variations")); + + dialog::addBoolItem(XLAT("pure"), target_variation == eVariation::pure, 'p'); + dialog::add_action([] { target_variation = eVariation::pure; }); + + dialog::addBoolItem(XLAT("symmetric subdivision"), target_variation == eVariation::coxeter, 't'); + dialog::add_action([] { target_variation = eVariation::coxeter; }); + + if(S7 == 6) { + dialog::addBoolItem(XLAT("sub-cubes"), target_variation == eVariation::subcubes, 'c'); + dialog::add_action([] { target_variation = eVariation::subcubes; }); + + if(!(cgflags & qIDEAL)) { + dialog::addBoolItem(XLAT("dual sub-cubes"), target_variation == eVariation::dual_subcubes, 'd'); + dialog::add_action([] { target_variation = eVariation::dual_subcubes; }); + + dialog::addBoolItem(XLAT("bitruncated sub-cubes"), target_variation == eVariation::bch, 'b'); + dialog::add_action([] { target_variation = eVariation::bch; }); + } + } + + else + dialog::addInfo(XLAT("note: more choices in cubic honeycombs")); + + if(is_subcube_based(target_variation)) { + dialog::addBreak(100); + dialog::addSelItem(XLAT("subdivision"), its(target_subcube_count), 'z'); + dialog::add_action([] { + dialog::editNumber(target_subcube_count, 1, 8, 1, 2, XLAT("subdivision"), ""); + dialog::bound_low(1); + }); + } + + if(target_variation == eVariation::coxeter) { + dialog::addBreak(100); + dialog::addBoolItem(XLAT("split by original faces"), target_coxeter & cox_othercell, 'f'); + dialog::add_action([] { target_coxeter ^= cox_othercell; }); + dialog::addBoolItem(XLAT("split by vertex axes"), target_coxeter & cox_vertices, 'v'); + dialog::add_action([] { target_coxeter ^= cox_vertices; }); + dialog::addBoolItem(XLAT("split by midedges"), target_coxeter & cox_midedges, 'm'); + dialog::add_action([] { target_coxeter ^= cox_midedges; }); + } + + dialog::addBreak(100); + dialog::addItem(XLAT("activate"), 'x'); + dialog::add_action([] { + stop_game(); + set_variation(target_variation); + subcube_count = target_subcube_count; + coxeter_param = target_coxeter; + start_game(); + }); + dialog::addBack(); + dialog::display(); + } + +EX void configure_variation() { + target_variation = variation; + target_subcube_count = subcube_count; + target_coxeter = coxeter_param; + pushScreen(edit_variation); + } + EX } #endif diff --git a/system.cpp b/system.cpp index 26a39fd8..9447fae3 100644 --- a/system.cpp +++ b/system.cpp @@ -1387,7 +1387,9 @@ EX void set_variation(eVariation target) { variation = target; return; } - if(bt::in() || sol || kite::in() || WDIM == 3) if(!prod) geometry = gNormal; + if(target != eVariation::pure) { + if(bt::in() || sol || kite::in() || WDIM == 3) if(!prod) geometry = gNormal; + } auto& cd = ginf[gCrystal]; if(target == eVariation::bitruncated && cryst && cd.sides == 8 && cd.vertex == 4) { cd.vertex = 3;