summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorStar Rauchenberger <fefferburbia@gmail.com>2023-02-17 11:13:56 -0500
committerStar Rauchenberger <fefferburbia@gmail.com>2023-02-17 11:13:56 -0500
commit6ce1edf606a384f0722f15ab25caad899c271280 (patch)
tree70782f24c761179691ea9585987c1e98a3d105cd
parent26aa11444ca03571a2bf1ea14d54402094b5c15f (diff)
downloadlingo-randomizer-6ce1edf606a384f0722f15ab25caad899c271280.tar.gz
lingo-randomizer-6ce1edf606a384f0722f15ab25caad899c271280.tar.bz2
lingo-randomizer-6ce1edf606a384f0722f15ab25caad899c271280.zip
allow_top_expansion
When this flag is unset (which is in most cases), top clues must be distinct from middle clues.

also we forgot to have the common word filter lol
-rw-r--r--generator.cpp27
-rw-r--r--generator.h5
-rw-r--r--main.cpp62
3 files changed, 53 insertions, 41 deletions
diff --git a/generator.cpp b/generator.cpp index c4dd76f..6b6c1be 100644 --- a/generator.cpp +++ b/generator.cpp
@@ -5,7 +5,7 @@
5#include <cctype> 5#include <cctype>
6#include <hkutil/string.h> 6#include <hkutil/string.h>
7 7
8verbly::filter Generator::MakeHintFilter(verbly::filter subfilter, Height height, Colour colour, FilterDirection filter_direction) 8verbly::filter Generator::MakeHintFilter(verbly::filter subfilter, Height height, Colour colour, FilterDirection filter_direction) const
9{ 9{
10 switch (colour) { 10 switch (colour) {
11 case kWhite: { 11 case kWhite: {
@@ -304,7 +304,7 @@ bool Generator::GenerateSinglePanelImpl(std::string name, Height height, Colour
304 if (questions.size() < 1) return false; 304 if (questions.size() < 1) return false;
305 verbly::form question = questions.front();// questions.at(std::uniform_int_distribution<int>(0, questions.size())(rng_)); 305 verbly::form question = questions.front();// questions.at(std::uniform_int_distribution<int>(0, questions.size())(rng_));
306 306
307 if (IsClueTrivial(height, colour, question, solution)) { 307 if (IsClueTrivial(height, colour, question, solution, options)) {
308 return false; 308 return false;
309 } 309 }
310 if (options.max_len_diff >= 0 && std::abs(static_cast<int>(question.getText().size() - solution.getText().size())) > options.max_len_diff) { 310 if (options.max_len_diff >= 0 && std::abs(static_cast<int>(question.getText().size() - solution.getText().size())) > options.max_len_diff) {
@@ -357,7 +357,7 @@ bool Generator::GenerateDoublePanelImpl(std::string name1, std::string name2, He
357 357
358 //std::shuffle(questions.begin(), questions.end(), rng_); 358 //std::shuffle(questions.begin(), questions.end(), rng_);
359 359
360 if (IsClueTrivial(height, colour, questions[0], solution) || IsClueTrivial(height, colour, questions[1], solution)) { 360 if (IsClueTrivial(height, colour, questions[0], solution, options) || IsClueTrivial(height, colour, questions[1], solution, options)) {
361 return false; 361 return false;
362 } 362 }
363 if (options.max_len_diff >= 0) { 363 if (options.max_len_diff >= 0) {
@@ -395,7 +395,8 @@ bool Generator::GenerateCohintedPanelsImpl(std::string name1, std::string name2,
395 395
396 //std::shuffle(questions.begin(), questions.end(), rng_); 396 //std::shuffle(questions.begin(), questions.end(), rng_);
397 397
398 if (IsClueTrivial(height, colour, question, solutions[0]) || IsClueTrivial(height, colour, question, solutions[1])) { 398 if (IsClueTrivial(height, colour, question, solutions[0], options)
399 || IsClueTrivial(height, colour, question, solutions[1], options)) {
399 return false; 400 return false;
400 } 401 }
401 if (options.max_len_diff >= 0) { 402 if (options.max_len_diff >= 0) {
@@ -428,7 +429,7 @@ bool Generator::GeneratePairedPanelsImpl(std::string name1, std::string name2, H
428 if (questions.size() < 1) return false; 429 if (questions.size() < 1) return false;
429 verbly::form question = questions.front();// questions.at(std::uniform_int_distribution<int>(0, questions.size())(rng_)); 430 verbly::form question = questions.front();// questions.at(std::uniform_int_distribution<int>(0, questions.size())(rng_));
430 431
431 if (IsClueTrivial(height, effectiveColour, question, solution)) { 432 if (IsClueTrivial(height, effectiveColour, question, solution, options)) {
432 return false; 433 return false;
433 } 434 }
434 435
@@ -506,7 +507,7 @@ bool Generator::GeneratePanelStackImpl(std::string top_name, Colour top_colour,
506 if (questions.empty()) return false; 507 if (questions.empty()) return false;
507 top_hint = questions.front().getText(); 508 top_hint = questions.front().getText();
508 509
509 if (IsClueTrivial(kTop, top_colour, questions.front(), solution)) { 510 if (IsClueTrivial(kTop, top_colour, questions.front(), solution, options)) {
510 return false; 511 return false;
511 } 512 }
512 } 513 }
@@ -517,7 +518,7 @@ bool Generator::GeneratePanelStackImpl(std::string top_name, Colour top_colour,
517 if (questions.empty()) return false; 518 if (questions.empty()) return false;
518 middle_hint = questions.front().getText(); 519 middle_hint = questions.front().getText();
519 520
520 if (IsClueTrivial(kMiddle, middle_colour, questions.front(), solution)) { 521 if (IsClueTrivial(kMiddle, middle_colour, questions.front(), solution, options)) {
521 return false; 522 return false;
522 } 523 }
523 } 524 }
@@ -528,7 +529,7 @@ bool Generator::GeneratePanelStackImpl(std::string top_name, Colour top_colour,
528 if (questions.empty()) return false; 529 if (questions.empty()) return false;
529 bottom_hint = questions.front().getText(); 530 bottom_hint = questions.front().getText();
530 531
531 if (IsClueTrivial(kBottom, bottom_colour, questions.front(), solution)) { 532 if (IsClueTrivial(kBottom, bottom_colour, questions.front(), solution, options)) {
532 return false; 533 return false;
533 } 534 }
534 } 535 }
@@ -708,6 +709,7 @@ verbly::filter Generator::GetWordFilter(FilterDirection dir, GenerateOptions opt
708 wordFilter &= (verbly::form::complexity == 2); 709 wordFilter &= (verbly::form::complexity == 2);
709 } else { 710 } else {
710 wordFilter &= (verbly::form::complexity == 1); 711 wordFilter &= (verbly::form::complexity == 1);
712 wordFilter &= (verbly::form::frequency > 2000000);
711 } 713 }
712 } else { 714 } else {
713 wordFilter &= ((verbly::form::complexity > 1) || (verbly::form::frequency > 2000000)); 715 wordFilter &= ((verbly::form::complexity > 1) || (verbly::form::frequency > 2000000));
@@ -720,8 +722,15 @@ bool isDigitWrapper(unsigned char ch) {
720 return std::isdigit(ch); 722 return std::isdigit(ch);
721} 723}
722 724
723bool Generator::IsClueTrivial(Height height, Colour colour, const verbly::form& clue, const verbly::form& solution) const 725bool Generator::IsClueTrivial(Height height, Colour colour, const verbly::form& clue, const verbly::form& solution, GenerateOptions options) const
724{ 726{
727 if (!options.allow_top_expansion && height == kTop) {
728 verbly::filter questionFilter = MakeHintFilter(solution, kMiddle, colour, kTowardQuestion) && clue;
729 if (!database_->forms(questionFilter).all().empty()) {
730 return true;
731 }
732 }
733
725 if (height == kTop && colour == kWhite) 734 if (height == kTop && colour == kWhite)
726 { 735 {
727 return !database_->forms((verbly::filter)clue && (verbly::word::synonyms %= solution)).all().empty(); 736 return !database_->forms((verbly::filter)clue && (verbly::word::synonyms %= solution)).all().empty();
diff --git a/generator.h b/generator.h index 1c7934e..7803004 100644 --- a/generator.h +++ b/generator.h
@@ -56,6 +56,7 @@ struct GenerateOptions {
56 std::string copy_hidden; // supported by single mid white 56 std::string copy_hidden; // supported by single mid white
57 bool force_two_words = false; 57 bool force_two_words = false;
58 bool must_be_broad = false; // the solution must also be gettable by bottom white/red/blue. supported by single and double 58 bool must_be_broad = false; // the solution must also be gettable by bottom white/red/blue. supported by single and double
59 bool allow_top_expansion = false; // this disables the triviality check that top puzzles can't also apply to middle
59}; 60};
60 61
61class Wanderlust { 62class Wanderlust {
@@ -197,7 +198,7 @@ public:
197 198
198private: 199private:
199 200
200 verbly::filter MakeHintFilter(verbly::filter subfilter, Height height, Colour colour, FilterDirection filter_direction); 201 verbly::filter MakeHintFilter(verbly::filter subfilter, Height height, Colour colour, FilterDirection filter_direction) const;
201 202
202 bool GenerateSinglePanelImpl(std::string name, Height height, Colour colour, GenerateOptions options); 203 bool GenerateSinglePanelImpl(std::string name, Height height, Colour colour, GenerateOptions options);
203 204
@@ -215,7 +216,7 @@ private:
215 216
216 verbly::filter GetWordFilter(FilterDirection direction, GenerateOptions options) const; 217 verbly::filter GetWordFilter(FilterDirection direction, GenerateOptions options) const;
217 218
218 bool IsClueTrivial(Height height, Colour colour, const verbly::form& clue, const verbly::form& solution) const; 219 bool IsClueTrivial(Height height, Colour colour, const verbly::form& clue, const verbly::form& solution, GenerateOptions options = {}) const;
219 220
220 unsigned int seed_; 221 unsigned int seed_;
221 std::mt19937 rng_; 222 std::mt19937 rng_;
diff --git a/main.cpp b/main.cpp index 3b6e8e1..3d53cb0 100644 --- a/main.cpp +++ b/main.cpp
@@ -174,6 +174,8 @@ public:
174 // The Observant 174 // The Observant
175 175
176 // Knight/Night 176 // Knight/Night
177 // there are some .allow_top_expansion = true panels that don't do anything yet
178 // and some paired top/middle stacks that aren't implemented bc honestly who caressss
177 gen_.GenerateSinglePanel("Panel_rat_tar", kMiddle, kBlack, {.palindrome = kRejectPalindrome}); 179 gen_.GenerateSinglePanel("Panel_rat_tar", kMiddle, kBlack, {.palindrome = kRejectPalindrome});
178 gen_.GenerateSinglePanel("Panel_discover_recover", kMiddle, kPurple, {.max_len_diff = 1}); 180 gen_.GenerateSinglePanel("Panel_discover_recover", kMiddle, kPurple, {.max_len_diff = 1});
179 gen_.GenerateSinglePanel("Panel_deadend_deadened", kTop, kWhite, {.multiword = true}); 181 gen_.GenerateSinglePanel("Panel_deadend_deadened", kTop, kWhite, {.multiword = true});
@@ -181,9 +183,9 @@ public:
181 gen_.GenerateSinglePanel("Panel_warner_corner", kTop, kPurple); 183 gen_.GenerateSinglePanel("Panel_warner_corner", kTop, kPurple);
182 gen_.GenerateSinglePanel("Panel_lies_lies", kMiddle, kWhite, {.obscure_hint = true, .max_answer_len = 20}); 184 gen_.GenerateSinglePanel("Panel_lies_lies", kMiddle, kWhite, {.obscure_hint = true, .max_answer_len = 20});
183 gen_.GeneratePairedPanels("Panel_night_knight", "Panel_knight_night", kMiddle, kBlue); 185 gen_.GeneratePairedPanels("Panel_night_knight", "Panel_knight_night", kMiddle, kBlue);
184 gen_.GenerateSinglePanel("Panel_bee_be", kMiddle, kRed); 186 gen_.GenerateSinglePanel("Panel_bee_be", kMiddle, kRed, {.allow_top_expansion = true});
185 gen_.GenerateSinglePanel("Panel_new_knew", kMiddle, kBlue, {.max_answer_len = 4}); 187 gen_.GenerateSinglePanel("Panel_new_knew", kMiddle, kBlue, {.max_answer_len = 4, .allow_top_expansion = true});
186 gen_.GenerateSinglePanel("Panel_fore_for", kMiddle, kRed); 188 gen_.GenerateSinglePanel("Panel_fore_for", kMiddle, kRed, {.allow_top_expansion = true});
187 gen_.GenerateCohintedPanels("Panel_trusted_trust", "Panel_trusted_rusted", kMiddle, kRed, {.save_for_later = true}); 189 gen_.GenerateCohintedPanels("Panel_trusted_trust", "Panel_trusted_rusted", kMiddle, kRed, {.save_for_later = true});
188 gen_.GenerateCohintedPanels("Panel_rust_trust", "Panel_rust_crust", kMiddle, kBlue, {.max_answer_len = 5, .save_for_later = true}); 190 gen_.GenerateCohintedPanels("Panel_rust_trust", "Panel_rust_crust", kMiddle, kBlue, {.max_answer_len = 5, .save_for_later = true});
189 gen_.GenerateSinglePanel("Panel_encrusted_rust", kMiddle, kRed, {.save_for_later = true}); 191 gen_.GenerateSinglePanel("Panel_encrusted_rust", kMiddle, kRed, {.save_for_later = true});
@@ -213,11 +215,11 @@ public:
213 gen_.GenerateSinglePanel("Panel_locked_knocked", kMiddle, kPurple, {.max_answer_len = 5, .reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1}); 215 gen_.GenerateSinglePanel("Panel_locked_knocked", kMiddle, kPurple, {.max_answer_len = 5, .reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1});
214 gen_.GenerateSinglePanel("Panel_daughter_laughter", kMiddle, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1}); 216 gen_.GenerateSinglePanel("Panel_daughter_laughter", kMiddle, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1});
215 gen_.GenerateDoublePanel("Panel_move_love", "Panel_stove_love", kMiddle, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1}); 217 gen_.GenerateDoublePanel("Panel_move_love", "Panel_stove_love", kMiddle, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1});
216 gen_.GenerateSinglePanel("Panel_scope_type", kMiddle, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1}); 218 gen_.GenerateSinglePanel("Panel_scope_type", kMiddle, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1, .allow_top_expansion = true});
217 gen_.GenerateSinglePanel("Panel_abyss_this", kMiddle, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1}); 219 gen_.GenerateSinglePanel("Panel_abyss_this", kMiddle, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1});
218 gen_.GenerateDoublePanel("Panel_sweat_great", "Panel_beat_great", kMiddle, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1}); 220 gen_.GenerateDoublePanel("Panel_sweat_great", "Panel_beat_great", kMiddle, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1});
219 gen_.GenerateSinglePanel("Panel_alumni_hi", kTop, kPurple, {.reuse_solution = true, .unique_pool = "initiated"}); 221 gen_.GenerateSinglePanel("Panel_alumni_hi", kTop, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .allow_top_expansion = true});
220 gen_.GenerateSinglePanel("Panel_wrath_path", kMiddle, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1}); 222 gen_.GenerateSinglePanel("Panel_wrath_path", kMiddle, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1, .allow_top_expansion = true});
221 gen_.GenerateDoublePanel("Panel_knight_write", "Panel_byte_write", kTop, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 2}); 223 gen_.GenerateDoublePanel("Panel_knight_write", "Panel_byte_write", kTop, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 2});
222 gen_.GenerateSinglePanel("Panel_maim_same", kTop, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 0}); 224 gen_.GenerateSinglePanel("Panel_maim_same", kTop, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 0});
223 gen_.GenerateSinglePanel("Panel_bare_bear", kTop, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 0}); 225 gen_.GenerateSinglePanel("Panel_bare_bear", kTop, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 0});
@@ -304,24 +306,24 @@ public:
304 gen_.GenerateOneRoadManyTurns("Panel_order_onepathmanyturns", "Panel_eon_one", "Panel_path_road", "Panel_any_many", "Panel_send_use_turns"); 306 gen_.GenerateOneRoadManyTurns("Panel_order_onepathmanyturns", "Panel_eon_one", "Panel_path_road", "Panel_any_many", "Panel_send_use_turns");
305 307
306 // Rhyme Rooms 308 // Rhyme Rooms
307 gen_.GeneratePanelStack("Panel_ascend_rhyme", kPurple, "", {}, "Panel_ascend_syn", kWhite, {.unique_pool = "rhyme"}); 309 gen_.GeneratePanelStack("Panel_ascend_rhyme", kPurple, "", {}, "Panel_ascend_syn", kWhite, {.unique_pool = "rhyme", .allow_top_expansion = true});
308 gen_.GeneratePanelStack("Panel_double_rhyme", kPurple, "", {}, "Panel_double_syn", kWhite, {.unique_pool = "rhyme"}); 310 gen_.GeneratePanelStack("Panel_double_rhyme", kPurple, "", {}, "Panel_double_syn", kWhite, {.unique_pool = "rhyme", .allow_top_expansion = true});
309 gen_.GeneratePanelStack("Panel_blocked_rhyme", kPurple, "", {}, "Panel_blocked_syn", kWhite, {.unique_pool = "rhyme"}); 311 gen_.GeneratePanelStack("Panel_blocked_rhyme", kPurple, "", {}, "Panel_blocked_syn", kWhite, {.unique_pool = "rhyme", .allow_top_expansion = true});
310 gen_.GeneratePanelStack("Panel_rise_rhyme", kPurple, "", {}, "Panel_rise_syn", kWhite, {.unique_pool = "rhyme"}); 312 gen_.GeneratePanelStack("Panel_rise_rhyme", kPurple, "", {}, "Panel_rise_syn", kWhite, {.unique_pool = "rhyme", .allow_top_expansion = true});
311 gen_.GeneratePanelStack("Panel_crystal_rhyme", kPurple, "", {}, "Panel_crystal_syn", kWhite, {.unique_pool = "rhyme"}); 313 gen_.GeneratePanelStack("Panel_crystal_rhyme", kPurple, "", {}, "Panel_crystal_syn", kWhite, {.unique_pool = "rhyme", .allow_top_expansion = true});
312 gen_.GeneratePanelStack("Panel_creative_rhyme", kPurple, "", {}, "Panel_creative_syn", kWhite, {.unique_pool = "rhyme"}); 314 gen_.GeneratePanelStack("Panel_creative_rhyme", kPurple, "", {}, "Panel_creative_syn", kWhite, {.unique_pool = "rhyme", .allow_top_expansion = true});
313 gen_.GeneratePanelStack("Panel_child_rhyme", kPurple, "", {}, "Panel_child_syn", kWhite, {.unique_pool = "rhyme"}); 315 gen_.GeneratePanelStack("Panel_child_rhyme", kPurple, "", {}, "Panel_child_syn", kWhite, {.unique_pool = "rhyme", .allow_top_expansion = true});
314 gen_.GeneratePanelStack("Panel_hidden_rhyme", kPurple, "", {}, "Panel_hidden_syn", kWhite, {.unique_pool = "rhyme"}); 316 gen_.GeneratePanelStack("Panel_hidden_rhyme", kPurple, "", {}, "Panel_hidden_syn", kWhite, {.unique_pool = "rhyme", .allow_top_expansion = true});
315 gen_.GeneratePanelStack("Panel_word_rhyme", kPurple, "", {}, "Panel_word_whole", kBlue, {.unique_pool = "rhyme"}); 317 gen_.GeneratePanelStack("Panel_word_rhyme", kPurple, "", {}, "Panel_word_whole", kBlue, {.unique_pool = "rhyme", .allow_top_expansion = true});
316 gen_.GeneratePanelStack("Panel_silent_rhyme", kPurple, "", {}, "Panel_silent_syn", kWhite, {.unique_pool = "rhyme"}); 318 gen_.GeneratePanelStack("Panel_silent_rhyme", kPurple, "", {}, "Panel_silent_syn", kWhite, {.unique_pool = "rhyme", .allow_top_expansion = true});
317 gen_.GeneratePanelStack("Panel_bones_rhyme", kPurple, "", {}, "Panel_bones_syn", kWhite, {.unique_pool = "rhyme"}); 319 gen_.GeneratePanelStack("Panel_bones_rhyme", kPurple, "", {}, "Panel_bones_syn", kWhite, {.unique_pool = "rhyme", .allow_top_expansion = true});
318 gen_.GeneratePanelStack("Panel_sentence_rhyme", kPurple, "", {}, "Panel_sentence_whole", kBlue, {.unique_pool = "rhyme"}); 320 gen_.GeneratePanelStack("Panel_sentence_rhyme", kPurple, "", {}, "Panel_sentence_whole", kBlue, {.unique_pool = "rhyme", .allow_top_expansion = true});
319 gen_.GeneratePanelStack("Panel_dream_rhyme", kPurple, "", {}, "Panel_dream_syn", kWhite, {.unique_pool = "rhyme"}); 321 gen_.GeneratePanelStack("Panel_dream_rhyme", kPurple, "", {}, "Panel_dream_syn", kWhite, {.unique_pool = "rhyme", .allow_top_expansion = true});
320 gen_.GeneratePanelStack("Panel_mystery_rhyme", kPurple, "", {}, "Panel_mystery_syn", kWhite, {.unique_pool = "rhyme"}); 322 gen_.GeneratePanelStack("Panel_mystery_rhyme", kPurple, "", {}, "Panel_mystery_syn", kWhite, {.unique_pool = "rhyme", .allow_top_expansion = true});
321 gen_.GeneratePanelStack("Panel_jump_rhyme", kPurple, "", {}, "Panel_jump_syn", kWhite, {.unique_pool = "rhyme"}); 323 gen_.GeneratePanelStack("Panel_jump_rhyme", kPurple, "", {}, "Panel_jump_syn", kWhite, {.unique_pool = "rhyme", .allow_top_expansion = true});
322 gen_.GeneratePanelStack("Panel_fall_rhyme", kPurple, "", {}, "Panel_fall_syn", kWhite, {.unique_pool = "rhyme"}); 324 gen_.GeneratePanelStack("Panel_fall_rhyme", kPurple, "", {}, "Panel_fall_syn", kWhite, {.unique_pool = "rhyme", .allow_top_expansion = true});
323 //gen_.GeneratePanelStack("Panel_return_rhyme", kPurple, "", {}, "Panel_return_ant", kBlack, {.unique_pool = "rhyme"}); 325 //gen_.GeneratePanelStack("Panel_return_rhyme", kPurple, "", {}, "Panel_return_ant", kBlack, {.unique_pool = "rhyme", .allow_top_expansion = true});
324 //gen_.GeneratePanelStack("Panel_descend_rhyme", kPurple, "", {}, "Panel_descend_ant", kBlack, {.unique_pool = "rhyme"}); 326 //gen_.GeneratePanelStack("Panel_descend_rhyme", kPurple, "", {}, "Panel_descend_ant", kBlack, {.unique_pool = "rhyme", .allow_top_expansion = true});
325 // ^ commenting those out for now because they take disproportionately long to generate currently 327 // ^ commenting those out for now because they take disproportionately long to generate currently
326 gen_.GenerateSinglePanel("Panel_leap_leap", kMiddle, kWhite, {.obscure_hint = true}); 328 gen_.GenerateSinglePanel("Panel_leap_leap", kMiddle, kWhite, {.obscure_hint = true});
327 329
@@ -405,11 +407,11 @@ public:
405 407
406 408
407 // The Colorful 409 // The Colorful
408 gen_.GenerateSinglePanel("Panel_begin_start", kBottom, kWhite, {.reuse_solution = true}); 410 gen_.GenerateSinglePanel("Panel_begin_start", kBottom, kWhite, {.reuse_solution = true, .unique_pool = "traveled"});
409 gen_.GenerateSinglePanel("Panel_found_lost", kBottom, kBlack, {.reuse_solution = true}); 411 gen_.GenerateSinglePanel("Panel_found_lost", kBottom, kBlack, {.reuse_solution = true, .unique_pool = "agreeable"});
410 gen_.GenerateSinglePanel("Panel_loaf_crust", kBottom, kRed, {.reuse_solution = true}); 412 gen_.GenerateSinglePanel("Panel_loaf_crust", kBottom, kRed, {.reuse_solution = true, .unique_pool = "bold"});
411 //Panel_eggs_breakfast: cream? butter! 413 //Panel_eggs_breakfast: cream? butter!
412 gen_.GenerateSinglePanel("Panel_sun_sky", kBottom, kBlue, {.reuse_solution = true}); 414 gen_.GenerateSinglePanel("Panel_sun_sky", kBottom, kBlue, {.reuse_solution = true, .unique_pool = "undeterred"});
413 //Panel_teacher_substitute: spoon? fork! 415 //Panel_teacher_substitute: spoon? fork!
414 //Panel_walnuts_orange: letters? numbers! 416 //Panel_walnuts_orange: letters? numbers!
415 //Panel_path_i: walls? green! 417 //Panel_path_i: walls? green!
@@ -506,7 +508,7 @@ public:
506 gen_.GenerateSinglePanel("Panel_red_top_2", kTop, kRed); 508 gen_.GenerateSinglePanel("Panel_red_top_2", kTop, kRed);
507 gen_.GenerateSinglePanel("Panel_red_top_3", kTop, kRed); 509 gen_.GenerateSinglePanel("Panel_red_top_3", kTop, kRed);
508 gen_.GenerateSinglePanel("Panel_red_top_4", kTop, kRed); 510 gen_.GenerateSinglePanel("Panel_red_top_4", kTop, kRed);
509 //gen_.GeneratePanelStack("Panel_red_top_5", kRed, "Panel_red_mid_2", kRed, "", {}); // slow 511 //gen_.GeneratePanelStack("Panel_red_top_5", kRed, "Panel_red_mid_2", kRed, "", {}, .allow_top_expansion = true); // slow
510 gen_.GenerateSinglePanel("Panel_red_mid_1", kMiddle, kRed); 512 gen_.GenerateSinglePanel("Panel_red_mid_1", kMiddle, kRed);
511 gen_.GenerateSinglePanel("Panel_red_mid_3", kMiddle, kRed); 513 gen_.GenerateSinglePanel("Panel_red_mid_3", kMiddle, kRed);
512 gen_.GeneratePanelStack("", {}, "Panel_red_mid_4", kRed, "Panel_red_bot_4", kRed); 514 gen_.GeneratePanelStack("", {}, "Panel_red_mid_4", kRed, "Panel_red_bot_4", kRed);
@@ -518,7 +520,7 @@ public:
518 520
519 // The Artistic 521 // The Artistic
520 gen_.GeneratePanelStack("Panel_blue_top_1", kBlue, "", {}, "Panel_red_bot_1", kRed); 522 gen_.GeneratePanelStack("Panel_blue_top_1", kBlue, "", {}, "Panel_red_bot_1", kRed);
521 gen_.GeneratePanelStack("", {}, "Panel_red_mid_2", kRed, "Panel_blue_bot_2", kBlue); 523 gen_.GeneratePanelStack("", {}, "Panel_red_mid_22", kRed, "Panel_blue_bot_2", kBlue);
522 gen_.GeneratePanelStack("", {}, "Panel_blue_mid_3", kBlue, "Panel_red_bot_3", kRed); 524 gen_.GeneratePanelStack("", {}, "Panel_blue_mid_3", kBlue, "Panel_red_bot_3", kRed);
523 gen_.GeneratePanelStack("Panel_red_top_4", kRed, "Panel_blue_mid_4", kBlue, "", {}); 525 gen_.GeneratePanelStack("Panel_red_top_4", kRed, "Panel_blue_mid_4", kBlue, "", {});
524 gen_.GeneratePanelStack("Panel_yellow_top_5", kYellow, "", {}, "Panel_blue_bot_5", kBlue); 526 gen_.GeneratePanelStack("Panel_yellow_top_5", kYellow, "", {}, "Panel_blue_bot_5", kBlue);