summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorStar Rauchenberger <fefferburbia@gmail.com>2023-02-17 09:51:36 -0500
committerStar Rauchenberger <fefferburbia@gmail.com>2023-02-17 09:51:36 -0500
commit26aa11444ca03571a2bf1ea14d54402094b5c15f (patch)
tree2c1d3b7ad2d5608007245d552eac187829aabfef
parentcebfd065c029788f3d6a8cc33b9401a708052335 (diff)
downloadlingo-randomizer-26aa11444ca03571a2bf1ea14d54402094b5c15f.tar.gz
lingo-randomizer-26aa11444ca03571a2bf1ea14d54402094b5c15f.tar.bz2
lingo-randomizer-26aa11444ca03571a2bf1ea14d54402094b5c15f.zip
many changes (should stop doing this)
max_len_diff is an attempt to make mid blue and mid purple more reasonable. It maybe works for blue, but it is not good enough for purple. what we will need to do is limit on how much of the word can be removed, and that's going to require a change to verbly to allow that kind of query.

copy_hidden was added for the champion's rest colour pairs. The solution to the pair is found at champion's rest, and the corresponding colour pair has a hint that is just question marks.

must_be_broad forces a generated word to be targettable by bottom white/red/blue. this + reusing solution for most bottom white/red/blue puzzles makes those puzzles much more reasonable (though still hard).

an attempt to randomise cross tower was made, but I'm not happy with it.

hyphens in obscured hints will no longer be obscured. I think obscured hints tend to be too obscured sometimes though, especially when it comes to the number hunt and uncommon words.

middle red triviality check: middle red two word puzzles should not just remove one of the words

middle yellow triviality check: middle yellow two word puzzles should not just swap the words

top yellow triviality check: top yellow should not be able to swap two phonemes that are identical other than stress and say that it rearranged the word.

the colorful is partially randomised.

champion's rest is as randomsied as it could be (it is likely not reasonable to randomise the red/blue/yellow panels behind the walls.

the fearless is partially randomised (besides the chain puzzles).

the challenge is partially randomised.
-rw-r--r--generator.cpp106
-rw-r--r--generator.h3
-rw-r--r--main.cpp309
m---------vendor/verbly0
4 files changed, 297 insertions, 121 deletions
diff --git a/generator.cpp b/generator.cpp index d0ef1a9..c4dd76f 100644 --- a/generator.cpp +++ b/generator.cpp
@@ -1,6 +1,9 @@
1#include "generator.h" 1#include "generator.h"
2#include <algorithm> 2#include <algorithm>
3#include <iostream> 3#include <iostream>
4#include <cstdlib>
5#include <cctype>
6#include <hkutil/string.h>
4 7
5verbly::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)
6{ 9{
@@ -262,6 +265,11 @@ bool Generator::GenerateSinglePanelImpl(std::string name, Height height, Colour
262 solution = database_->forms(verbly::form::text == word).first(); 265 solution = database_->forms(verbly::form::text == word).first();
263 } else { 266 } else {
264 verbly::filter forward = MakeHintFilter({}, height, colour, kTowardSolution); 267 verbly::filter forward = MakeHintFilter({}, height, colour, kTowardSolution);
268 if (options.must_be_broad) {
269 forward &= MakeHintFilter({}, kBottom, kWhite, kTowardSolution);
270 forward &= MakeHintFilter({}, kBottom, kRed, kTowardSolution);
271 forward &= MakeHintFilter({}, kBottom, kBlue, kTowardSolution);
272 }
265 std::vector<verbly::form> solutions = database_->forms(forward && GetWordFilter(kTowardSolution, options)).all(); 273 std::vector<verbly::form> solutions = database_->forms(forward && GetWordFilter(kTowardSolution, options)).all();
266 solution = solutions.front();//solutions.at(std::uniform_int_distribution<int>(0, solutions.size())(rng_)); 274 solution = solutions.front();//solutions.at(std::uniform_int_distribution<int>(0, solutions.size())(rng_));
267 } 275 }
@@ -282,6 +290,12 @@ bool Generator::GenerateSinglePanelImpl(std::string name, Height height, Colour
282 // Finish early if this is a middle white. 290 // Finish early if this is a middle white.
283 if (height == kMiddle && colour == kWhite) { 291 if (height == kMiddle && colour == kWhite) {
284 SavePanel(name, solution.getText(), solution.getText(), options); 292 SavePanel(name, solution.getText(), solution.getText(), options);
293 if (!options.copy_to.empty()) {
294 SavePanel(options.copy_to, solution.getText(), solution.getText(), options);
295 }
296 if (!options.copy_hidden.empty()) {
297 SavePanel(options.copy_hidden, std::string(solution.getText().size(), '?'), solution.getText(), options);
298 }
285 return true; 299 return true;
286 } 300 }
287 301
@@ -293,6 +307,9 @@ bool Generator::GenerateSinglePanelImpl(std::string name, Height height, Colour
293 if (IsClueTrivial(height, colour, question, solution)) { 307 if (IsClueTrivial(height, colour, question, solution)) {
294 return false; 308 return false;
295 } 309 }
310 if (options.max_len_diff >= 0 && std::abs(static_cast<int>(question.getText().size() - solution.getText().size())) > options.max_len_diff) {
311 return false;
312 }
296 313
297 SavePanel(name, question.getText(), solution.getText(), options); 314 SavePanel(name, question.getText(), solution.getText(), options);
298 if (!options.copy_to.empty()) { 315 if (!options.copy_to.empty()) {
@@ -314,6 +331,11 @@ bool Generator::GenerateDoublePanelImpl(std::string name1, std::string name2, He
314 solution = database_->forms(verbly::form::text == word).first(); 331 solution = database_->forms(verbly::form::text == word).first();
315 } else { 332 } else {
316 verbly::filter forward = MakeHintFilter({}, height, colour, kTowardSolution); 333 verbly::filter forward = MakeHintFilter({}, height, colour, kTowardSolution);
334 if (options.must_be_broad) {
335 forward &= MakeHintFilter({}, kBottom, kWhite, kTowardSolution);
336 forward &= MakeHintFilter({}, kBottom, kRed, kTowardSolution);
337 forward &= MakeHintFilter({}, kBottom, kBlue, kTowardSolution);
338 }
317 std::vector<verbly::form> solutions = database_->forms(forward && GetWordFilter(kTowardSolution, options)).all(); 339 std::vector<verbly::form> solutions = database_->forms(forward && GetWordFilter(kTowardSolution, options)).all();
318 solution = solutions.front();//solutions.at(std::uniform_int_distribution<int>(0, solutions.size())(rng_)); 340 solution = solutions.front();//solutions.at(std::uniform_int_distribution<int>(0, solutions.size())(rng_));
319 } 341 }
@@ -338,6 +360,12 @@ bool Generator::GenerateDoublePanelImpl(std::string name1, std::string name2, He
338 if (IsClueTrivial(height, colour, questions[0], solution) || IsClueTrivial(height, colour, questions[1], solution)) { 360 if (IsClueTrivial(height, colour, questions[0], solution) || IsClueTrivial(height, colour, questions[1], solution)) {
339 return false; 361 return false;
340 } 362 }
363 if (options.max_len_diff >= 0) {
364 if (std::abs(static_cast<int>(questions[0].getText().size() - solution.getText().size())) > options.max_len_diff
365 || std::abs(static_cast<int>(questions[1].getText().size() - solution.getText().size())) > options.max_len_diff) {
366 return false;
367 }
368 }
341 369
342 SavePanel(name1, questions[0].getText(), solution.getText(), options); 370 SavePanel(name1, questions[0].getText(), solution.getText(), options);
343 SavePanel(name2, questions[1].getText(), solution.getText(), options); 371 SavePanel(name2, questions[1].getText(), solution.getText(), options);
@@ -370,6 +398,12 @@ bool Generator::GenerateCohintedPanelsImpl(std::string name1, std::string name2,
370 if (IsClueTrivial(height, colour, question, solutions[0]) || IsClueTrivial(height, colour, question, solutions[1])) { 398 if (IsClueTrivial(height, colour, question, solutions[0]) || IsClueTrivial(height, colour, question, solutions[1])) {
371 return false; 399 return false;
372 } 400 }
401 if (options.max_len_diff >= 0) {
402 if (std::abs(static_cast<int>(question.getText().size() - solutions[0].getText().size())) > options.max_len_diff
403 || std::abs(static_cast<int>(question.getText().size() - solutions[1].getText().size())) > options.max_len_diff) {
404 return false;
405 }
406 }
373 407
374 SavePanel(name1, question.getText(), solutions[0].getText(), options); 408 SavePanel(name1, question.getText(), solutions[0].getText(), options);
375 SavePanel(name2, question.getText(), solutions[1].getText(), options); 409 SavePanel(name2, question.getText(), solutions[1].getText(), options);
@@ -408,6 +442,12 @@ bool Generator::GeneratePairedPanelsImpl(std::string name1, std::string name2, H
408 } 442 }
409 } 443 }
410 444
445 if (options.max_len_diff >= 0) {
446 if (std::abs(static_cast<int>(question.getText().size() - solution.getText().size())) > options.max_len_diff) {
447 return false;
448 }
449 }
450
411 if (height == kMiddle && colour == kWhite) { 451 if (height == kMiddle && colour == kWhite) {
412 SavePanel(name1, question.getText(), question.getText(), options); 452 SavePanel(name1, question.getText(), question.getText(), options);
413 SavePanel(name2, solution.getText(), solution.getText(), options); 453 SavePanel(name2, solution.getText(), solution.getText(), options);
@@ -587,7 +627,30 @@ void Generator::GenerateCrossTower(
587 std::string west_other_name3) 627 std::string west_other_name3)
588{ 628{
589 std::vector<std::vector<std::string>> sets = cross_tower_->GetPuzzleSet(rng_); 629 std::vector<std::vector<std::string>> sets = cross_tower_->GetPuzzleSet(rng_);
590 630
631 SavePanel(north_tower_name, "", sets[0][0]);
632 SavePanel(north_lookout_name, "", sets[0][0]);
633 SavePanel(north_other_name1, sets[0][1], sets[0][1]);
634 SavePanel(north_other_name2, sets[0][2], sets[0][2]);
635 SavePanel(north_other_name3, sets[0][3], sets[0][3]);
636
637 SavePanel(south_tower_name, "", sets[1][0]);
638 SavePanel(south_lookout_name, "", sets[1][0]);
639 SavePanel(south_other_name1, sets[1][1], sets[1][1]);
640 SavePanel(south_other_name2, sets[1][2], sets[1][2]);
641 SavePanel(south_other_name3, sets[1][3], sets[1][3]);
642
643 SavePanel(east_tower_name, "", sets[2][0]);
644 SavePanel(east_lookout_name, "", sets[2][0]);
645 SavePanel(east_other_name1, sets[2][1], sets[2][1]);
646 SavePanel(east_other_name2, sets[2][2], sets[2][2]);
647 SavePanel(east_other_name3, sets[2][3], sets[2][3]);
648
649 SavePanel(west_tower_name, "", sets[3][0]);
650 SavePanel(west_lookout_name, "", sets[3][0]);
651 SavePanel(west_other_name1, sets[3][1], sets[3][1]);
652 SavePanel(west_other_name2, sets[3][2], sets[3][2]);
653 SavePanel(west_other_name3, sets[3][3], sets[3][3]);
591} 654}
592 655
593void Generator::SavePanel(std::string name, std::string question, std::string answer, GenerateOptions options) { 656void Generator::SavePanel(std::string name, std::string question, std::string answer, GenerateOptions options) {
@@ -606,7 +669,7 @@ void Generator::SavePanel(std::string name, std::string question, std::string an
606 std::shuffle(indicies.begin(), indicies.end(), rng_); 669 std::shuffle(indicies.begin(), indicies.end(), rng_);
607 670
608 for (int i=0; i<numToObscure; i++) { 671 for (int i=0; i<numToObscure; i++) {
609 if (question[indicies[i]] != ' ') { 672 if (question[indicies[i]] != ' ' && question[indicies[i]] != '-') {
610 question[indicies[i]] = '?'; 673 question[indicies[i]] = '?';
611 } 674 }
612 } 675 }
@@ -653,6 +716,10 @@ verbly::filter Generator::GetWordFilter(FilterDirection dir, GenerateOptions opt
653 return wordFilter; 716 return wordFilter;
654} 717}
655 718
719bool isDigitWrapper(unsigned char ch) {
720 return std::isdigit(ch);
721}
722
656bool Generator::IsClueTrivial(Height height, Colour colour, const verbly::form& clue, const verbly::form& solution) const 723bool Generator::IsClueTrivial(Height height, Colour colour, const verbly::form& clue, const verbly::form& solution) const
657{ 724{
658 if (height == kTop && colour == kWhite) 725 if (height == kTop && colour == kWhite)
@@ -670,6 +737,41 @@ bool Generator::IsClueTrivial(Height height, Colour colour, const verbly::form&
670 return (clue.getId() == solution.getId()) 737 return (clue.getId() == solution.getId())
671 || !database_->forms((verbly::filter)clue && (verbly::form::merographs %= solution)).all().empty() 738 || !database_->forms((verbly::filter)clue && (verbly::form::merographs %= solution)).all().empty()
672 || !database_->forms((verbly::filter)clue && (verbly::form::holographs %= solution)).all().empty(); 739 || !database_->forms((verbly::filter)clue && (verbly::form::holographs %= solution)).all().empty();
740 } else if (height == kMiddle && colour == kRed) {
741 if (clue.getComplexity() == 2 && solution.getComplexity() == 1) {
742 auto words = hatkirby::split<std::vector<std::string>>(clue.getText(), " ");
743 for (const auto& word : words) {
744 if (word == solution.getText()) {
745 return true;
746 }
747 }
748 }
749 } else if (height == kMiddle && colour == kYellow) {
750 if (clue.getComplexity() == solution.getComplexity()) {
751 auto clueWords = hatkirby::split<std::vector<std::string>>(clue.getText(), " ");
752 auto solutionWords = hatkirby::split<std::vector<std::string>>(solution.getText(), " ");
753 std::sort(clueWords.begin(), clueWords.end());
754 std::sort(solutionWords.begin(), solutionWords.end());
755 if (clueWords == solutionWords) {
756 return true;
757 }
758 }
759 } else if (height == kTop && colour == kYellow) {
760 std::set<std::string> hint_stressless;
761 for (const verbly::pronunciation& pronunciation : clue.getPronunciations()) {
762 std::string stressed = hatkirby::implode(pronunciation.getPhonemes(), " ");
763 std::string stressless;
764 std::remove_copy_if(stressed.begin(), stressed.end(), std::back_inserter(stressless), &isDigitWrapper);
765 hint_stressless.insert(stressless);
766 }
767 for (const verbly::pronunciation& pronunciation : solution.getPronunciations()) {
768 std::string stressed = hatkirby::implode(pronunciation.getPhonemes(), " ");
769 std::string stressless;
770 std::remove_copy_if(stressed.begin(), stressed.end(), std::back_inserter(stressless), &isDigitWrapper);
771 if (hint_stressless.count(stressless)) {
772 return true;
773 }
774 }
673 } 775 }
674 return false; 776 return false;
675} 777}
diff --git a/generator.h b/generator.h index 1381cd3..1c7934e 100644 --- a/generator.h +++ b/generator.h
@@ -45,6 +45,7 @@ struct GenerateOptions {
45 int max_answer_len = 0; 45 int max_answer_len = 0;
46 int max_hint_len = 0; 46 int max_hint_len = 0;
47 int exact_len = 0; 47 int exact_len = 0;
48 int max_len_diff = -1; // supported by single, double, paired, cohinted
48 bool multiword = false; 49 bool multiword = false;
49 bool save_for_later = false; 50 bool save_for_later = false;
50 bool reuse_solution = false; // supported by single, double, and stack 51 bool reuse_solution = false; // supported by single, double, and stack
@@ -52,7 +53,9 @@ struct GenerateOptions {
52 PalindromeQuery palindrome = kPalindromeUnspecified; // only important for middle black. supported by single and paired 53 PalindromeQuery palindrome = kPalindromeUnspecified; // only important for middle black. supported by single and paired
53 std::string copy_to; // supported by single and paired 54 std::string copy_to; // supported by single and paired
54 std::string copy_to2; // supported by paired 55 std::string copy_to2; // supported by paired
56 std::string copy_hidden; // supported by single mid white
55 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
56}; 59};
57 60
58class Wanderlust { 61class Wanderlust {
diff --git a/main.cpp b/main.cpp index ab19805..3b6e8e1 100644 --- a/main.cpp +++ b/main.cpp
@@ -16,31 +16,16 @@ public:
16 gen_.GenerateStaticPanel("Panel_this_this", "normal"); 16 gen_.GenerateStaticPanel("Panel_this_this", "normal");
17 gen_.GenerateStaticPanel("Panel_write_write", "random seed"); 17 gen_.GenerateStaticPanel("Panel_write_write", "random seed");
18 gen_.GenerateStaticPanel("Panel_same_same", std::to_string(seed_)); 18 gen_.GenerateStaticPanel("Panel_same_same", std::to_string(seed_));
19 gen_.GenerateSinglePanel("Panel_hidden_hidden", kMiddle, kWhite); 19 gen_.GenerateSinglePanel("Panel_hidden_hidden", kMiddle, kWhite, {.save_for_later = true});
20 gen_.GenerateSinglePanel("Panel_hi_high", kTop, kWhite); 20 gen_.GenerateSinglePanel("Panel_hi_high", kTop, kWhite, {.save_for_later = true});
21 gen_.GenerateSinglePanel("Panel_low_low", kBottom, kWhite, {.max_answer_len = 7}); 21 gen_.GenerateSinglePanel("Panel_low_low", kBottom, kWhite, {.max_answer_len = 7});
22 gen_.GenerateSinglePanel("Panel_forward_forward", kMiddle, kWhite, {.obscure_hint = true, .max_answer_len = 20}); 22 gen_.GenerateSinglePanel("Panel_forward_forward", kMiddle, kWhite, {.obscure_hint = true, .max_answer_len = 20, .save_for_later = true, .must_be_broad = true});
23 gen_.GenerateSinglePanel("Panel_between_between", kMiddle, kWhite, {.obscure_hint = true, .max_answer_len = 20}); 23 gen_.GenerateSinglePanel("Panel_between_between", kMiddle, kWhite, {.obscure_hint = true, .max_answer_len = 20, .save_for_later = true, .must_be_broad = true});
24 gen_.GenerateSinglePanel("Panel_backward_backward", kMiddle, kWhite, {.obscure_hint = true, .max_answer_len = 20}); 24 gen_.GenerateSinglePanel("Panel_backward_backward", kMiddle, kWhite, {.obscure_hint = true, .max_answer_len = 20, .save_for_later = true, .must_be_broad = true});
25 gen_.GenerateSinglePanel("Panel_secret_secret", kMiddle, kWhite, {.obscure_hint = true, .max_answer_len = 20}); 25 gen_.GenerateSinglePanel("Panel_secret_secret", kMiddle, kWhite, {.obscure_hint = true, .max_answer_len = 20, .save_for_later = true, .must_be_broad = true});
26
27 // The Traveled
28 gen_.GenerateSinglePanel("Panel_open_open", kMiddle, kWhite, {.obscure_hint = true, .unique_pool = "traveled"});
29 gen_.GenerateSinglePanel("Panel_close_near", kBottom, kWhite, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "traveled"});
30 gen_.GenerateDoublePanel("Panel_compose_write", "Panel_record_write", kBottom, kWhite, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "traveled"});
31 gen_.GenerateSinglePanel("Panel_category_type", kBottom, kWhite, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "traveled"});
32 gen_.GenerateSinglePanel("Panel_hello_hi", kBottom, kWhite, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "traveled"});
33 gen_.GenerateDoublePanel("Panel_duplicate_same", "Panel_identical_same", kBottom, kWhite, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "traveled"});
34 gen_.GenerateSinglePanel("Panel_distant_far", kBottom, kWhite, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "traveled"});
35 gen_.GenerateSinglePanel("Panel_hay_straw", kBottom, kWhite, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "traveled"});
36 gen_.GenerateDoublePanel("Panel_giggle_laugh", "Panel_chuckle_laugh", kBottom, kWhite, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "traveled"});
37 gen_.GenerateSinglePanel("Panel_snitch_rat", kBottom, kWhite, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "traveled"});
38 gen_.GenerateSinglePanel("Panel_concealed_hidden", kBottom, kWhite, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "traveled"});
39 gen_.GenerateDoublePanel("Panel_plunge_fall", "Panel_autumn_fall", kBottom, kWhite, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "traveled"});
40 gen_.GenerateSinglePanel("Panel_growths_warts", kBottom, kWhite, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "traveled"});
41 26
42 // The Agreeable 27 // The Agreeable
43 gen_.GenerateSinglePanel("Panel_close_open", kBottom, kBlack, {.max_answer_len = 6, .unique_pool = "agreeable"}); 28 gen_.GenerateSinglePanel("Panel_close_open", kBottom, kBlack, {.max_answer_len = 6, .save_for_later = true, .unique_pool = "agreeable"});
44 gen_.GenerateSinglePanel("Panel_retool_looter", kMiddle, kBlack, {.save_for_later = true, .unique_pool = "agreeable", .palindrome = kRejectPalindrome}); 29 gen_.GenerateSinglePanel("Panel_retool_looter", kMiddle, kBlack, {.save_for_later = true, .unique_pool = "agreeable", .palindrome = kRejectPalindrome});
45 gen_.GenerateSinglePanel("Panel_drawer_reward", kMiddle, kBlack, {.save_for_later = true, .unique_pool = "agreeable", .palindrome = kRejectPalindrome}); 30 gen_.GenerateSinglePanel("Panel_drawer_reward", kMiddle, kBlack, {.save_for_later = true, .unique_pool = "agreeable", .palindrome = kRejectPalindrome});
46 gen_.GenerateSinglePanel("Panel_read_write", kBottom, kBlack, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "agreeable"}); 31 gen_.GenerateSinglePanel("Panel_read_write", kBottom, kBlack, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "agreeable"});
@@ -49,24 +34,24 @@ public:
49 gen_.GenerateSinglePanel("Panel_low_high", kBottom, kBlack, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "agreeable"}); 34 gen_.GenerateSinglePanel("Panel_low_high", kBottom, kBlack, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "agreeable"});
50 gen_.GenerateSinglePanel("Panel_alive_dead", kBottom, kBlack, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "agreeable"}); 35 gen_.GenerateSinglePanel("Panel_alive_dead", kBottom, kBlack, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "agreeable"});
51 gen_.GenerateSinglePanel("Panel_that_this", kBottom, kBlack, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "agreeable"}); 36 gen_.GenerateSinglePanel("Panel_that_this", kBottom, kBlack, {.max_answer_len = 7, .save_for_later = true, .unique_pool = "agreeable"});
52 gen_.GenerateSinglePanel("Panel_stressed_desserts", kMiddle, kBlack, {.unique_pool = "agreeable", .palindrome = kRejectPalindrome}); 37 gen_.GenerateSinglePanel("Panel_stressed_desserts", kMiddle, kBlack, {.unique_pool = "agreeable", .palindrome = kRejectPalindrome, .save_for_later = true});
53 gen_.GenerateSinglePanel("Panel_star_rats", kMiddle, kBlack, {.unique_pool = "agreeable", .palindrome = kRejectPalindrome}); 38 gen_.GenerateSinglePanel("Panel_star_rats", kMiddle, kBlack, {.unique_pool = "agreeable", .palindrome = kRejectPalindrome, .save_for_later = true});
54 gen_.GenerateSinglePanel("Panel_tame_mate", kTop, kBlack, {.unique_pool = "agreeable"}); 39 gen_.GenerateSinglePanel("Panel_tame_mate", kTop, kBlack, {.unique_pool = "agreeable", .save_for_later = true});
55 gen_.GenerateSinglePanel("Panel_cat_tack", kTop, kBlack, {.unique_pool = "agreeable"}); 40 gen_.GenerateSinglePanel("Panel_cat_tack", kTop, kBlack, {.unique_pool = "agreeable", .save_for_later = true});
56 gen_.GeneratePairedPanels("Panel_leaf_feel", "Panel_feel_leaf", kTop, kBlack, {.obscure_hint = true, .save_for_later = true}); 41 gen_.GeneratePairedPanels("Panel_leaf_feel", "Panel_feel_leaf", kTop, kBlack, {.obscure_hint = true, .save_for_later = true});
57 gen_.GeneratePairedPanels("Panel_warts_straw", "Panel_straw_warts", kMiddle, kBlack, {.obscure_hint = true, .save_for_later = true, .palindrome = kRejectPalindrome}); 42 gen_.GeneratePairedPanels("Panel_warts_straw", "Panel_straw_warts", kMiddle, kBlack, {.obscure_hint = true, .save_for_later = true, .palindrome = kRejectPalindrome});
58 gen_.GeneratePairedPanels("Panel_near_far", "Panel_far_near", kBottom, kBlack, {.obscure_hint = true, .save_for_later = true}); 43 gen_.GeneratePairedPanels("Panel_near_far", "Panel_far_near", kBottom, kBlack, {.obscure_hint = true, .save_for_later = true});
59 // Panel_left_wrong: left? wrong! 44 // Panel_left_wrong: left? wrong!
60 gen_.GenerateSinglePanel("Panel_black_white", kBottom, kBlack, {.max_answer_len = 7}); 45 gen_.GenerateSinglePanel("Panel_black_white", kBottom, kBlack, {.max_answer_len = 7, .save_for_later = true});
61 gen_.GeneratePairedPanels("Panel_left_right", "Panel_right_left", kBottom, kBlack, {.obscure_hint = true}); 46 gen_.GeneratePairedPanels("Panel_left_right", "Panel_right_left", kBottom, kBlack, {.obscure_hint = true, .save_for_later = true});
62 47
63 // The Seeker 48 // The Seeker
64 gen_.GenerateSinglePanel("Panel_entrance_entrance", kMiddle, kWhite, {.obscure_hint = true, .save_for_later = true, .unique_pool = "seeker"}); 49 gen_.GenerateSinglePanel("Panel_entrance_entrance", kMiddle, kWhite, {.obscure_hint = true, .save_for_later = true, .unique_pool = "seeker", .must_be_broad = true});
65 gen_.GenerateSinglePanel("Panel_bear_bear", kMiddle, kWhite, {.obscure_hint = true, .save_for_later = true, .unique_pool = "seeker"}); 50 gen_.GenerateSinglePanel("Panel_bear_bear", kMiddle, kWhite, {.obscure_hint = true, .save_for_later = true, .unique_pool = "seeker", .must_be_broad = true});
66 gen_.GenerateDoublePanel("Panel_mine_mine", "Panel_mine_mine_2", kMiddle, kWhite, {.obscure_hint = true, .save_for_later = true, .unique_pool = "seeker"}); 51 gen_.GenerateDoublePanel("Panel_mine_mine", "Panel_mine_mine_2", kMiddle, kWhite, {.obscure_hint = true, .save_for_later = true, .unique_pool = "seeker", .must_be_broad = true});
67 gen_.GenerateSinglePanel("Panel_bow_bow", kMiddle, kWhite, {.obscure_hint = true, .save_for_later = true, .unique_pool = "seeker"}); 52 gen_.GenerateSinglePanel("Panel_bow_bow", kMiddle, kWhite, {.obscure_hint = true, .save_for_later = true, .unique_pool = "seeker", .must_be_broad = true});
68 gen_.GenerateSinglePanel("Panel_does_does", kMiddle, kWhite, {.obscure_hint = true, .save_for_later = true, .unique_pool = "seeker"}); 53 gen_.GenerateSinglePanel("Panel_does_does", kMiddle, kWhite, {.obscure_hint = true, .save_for_later = true, .unique_pool = "seeker", .must_be_broad = true});
69 gen_.GenerateDoublePanel("Panel_mobile_mobile", "Panel_mobile_mobile_2", kMiddle, kWhite, {.obscure_hint = true, .save_for_later = true, .unique_pool = "seeker"}); 54 gen_.GenerateDoublePanel("Panel_mobile_mobile", "Panel_mobile_mobile_2", kMiddle, kWhite, {.obscure_hint = true, .save_for_later = true, .unique_pool = "seeker", .must_be_broad = true});
70 gen_.GeneratePanelStack("Panel_desert_dessert", kWhite, "Panel_desert_desert", kWhite, "", {}, {.obscure_hint = true, .save_for_later = true, .unique_pool = "seeker"}); 55 gen_.GeneratePanelStack("Panel_desert_dessert", kWhite, "Panel_desert_desert", kWhite, "", {}, {.obscure_hint = true, .save_for_later = true, .unique_pool = "seeker"});
71 gen_.GeneratePanelStack("Panel_sow_so", kWhite, "Panel_sow_sow", kWhite, "", {}, {.obscure_hint = true, .save_for_later = true, .unique_pool = "seeker"}); 56 gen_.GeneratePanelStack("Panel_sow_so", kWhite, "Panel_sow_sow", kWhite, "", {}, {.obscure_hint = true, .save_for_later = true, .unique_pool = "seeker"});
72 gen_.GenerateDoublePanel("Panel_two_to", "Panel_two_too", kTop, kWhite, {.save_for_later = true, .unique_pool = "seeker"}); 57 gen_.GenerateDoublePanel("Panel_two_to", "Panel_two_too", kTop, kWhite, {.save_for_later = true, .unique_pool = "seeker"});
@@ -76,14 +61,29 @@ public:
76 gen_.GenerateSinglePanel("Panel_bear_bare", kTop, kWhite, {.save_for_later = true, .unique_pool = "seeker"}); 61 gen_.GenerateSinglePanel("Panel_bear_bare", kTop, kWhite, {.save_for_later = true, .unique_pool = "seeker"});
77 62
78 // The Tenacious 63 // The Tenacious
79 gen_.GenerateSinglePanel("Panel_slaughter_laughter", kMiddle, kRed, {.unique_pool = "tenacious"}); 64 gen_.GenerateSinglePanel("Panel_slaughter_laughter", kMiddle, kRed, {.unique_pool = "tenacious", .save_for_later = true});
80 gen_.GenerateSinglePanel("Panel_dread_dead", kMiddle, kRed, {.unique_pool = "tenacious"}); 65 gen_.GenerateSinglePanel("Panel_dread_dead", kMiddle, kRed, {.unique_pool = "tenacious", .save_for_later = true});
81 gen_.GenerateSinglePanel("Panel_massacred_sacred", kMiddle, kRed, {.unique_pool = "tenacious"}); 66 gen_.GenerateSinglePanel("Panel_massacred_sacred", kMiddle, kRed, {.unique_pool = "tenacious", .save_for_later = true});
82 gen_.GenerateSinglePanel("Panel_decay_day", kMiddle, kRed, {.unique_pool = "tenacious"}); 67 gen_.GenerateSinglePanel("Panel_decay_day", kMiddle, kRed, {.unique_pool = "tenacious", .save_for_later = true});
83 gen_.GeneratePairedPanels("Panel_solos_solos", "Panel_solos_solos_2", kMiddle, kBlack, {.palindrome = kForcePalindrome}); 68 gen_.GeneratePairedPanels("Panel_solos_solos", "Panel_solos_solos_2", kMiddle, kBlack, {.palindrome = kForcePalindrome});
84 gen_.GeneratePairedPanels("Panel_racecar_racecar", "Panel_racecar_racecar_2", kMiddle, kBlack, {.palindrome = kForcePalindrome}); 69 gen_.GeneratePairedPanels("Panel_racecar_racecar", "Panel_racecar_racecar_2", kMiddle, kBlack, {.palindrome = kForcePalindrome});
85 gen_.GeneratePairedPanels("Panel_level_level", "Panel_level_level_2", kMiddle, kBlack, {.palindrome = kForcePalindrome}); 70 gen_.GeneratePairedPanels("Panel_level_level", "Panel_level_level_2", kMiddle, kBlack, {.palindrome = kForcePalindrome});
86 71
72 // The Discerning
73 gen_.GenerateSinglePanel("Panel_nope_open", kMiddle, kYellow, {.max_answer_len = 4, .unique_pool = "discerning"});
74 gen_.GenerateSinglePanel("Panel_hits_this", kMiddle, kYellow, {.max_answer_len = 6, .save_for_later = true, .unique_pool = "discerning"});
75 gen_.GenerateDoublePanel("Panel_warred_drawer", "Panel_redraw_drawer", kMiddle, kYellow, {.max_answer_len = 6, .save_for_later = true, .unique_pool = "discerning"});
76 gen_.GenerateSinglePanel("Panel_adder_dread", kMiddle, kYellow, {.max_answer_len = 6, .save_for_later = true, .unique_pool = "discerning"});
77 gen_.GenerateSinglePanel("Panel_laughters_slaughter", kMiddle, kYellow, {.save_for_later = true, .unique_pool = "discerning"});
78 gen_.GenerateDoublePanel("Panel_stone_notes", "Panel_onset_notes", kMiddle, kYellow, {.max_answer_len = 6, .save_for_later = true, .unique_pool = "discerning"});
79 gen_.GenerateSinglePanel("Panel_rat_art", kMiddle, kYellow, {.max_answer_len = 6, .save_for_later = true, .unique_pool = "discerning"});
80 gen_.GenerateSinglePanel("Panel_dusty_study", kMiddle, kYellow, {.max_answer_len = 6, .save_for_later = true, .unique_pool = "discerning"});
81 gen_.GenerateDoublePanel("Panel_arts_star", "Panel_tsar_star", kMiddle, kYellow, {.max_answer_len = 6, .save_for_later = true, .unique_pool = "discerning"});
82 gen_.GenerateSinglePanel("Panel_state_taste", kMiddle, kYellow, {.max_answer_len = 6, .save_for_later = true, .unique_pool = "discerning"});
83 gen_.GenerateSinglePanel("Panel_react_trace", kMiddle, kYellow, {.max_answer_len = 6, .save_for_later = true, .unique_pool = "discerning"});
84 gen_.GenerateDoublePanel("Panel_dear_read", "Panel_dare_read", kMiddle, kYellow, {.save_for_later = true, .unique_pool = "discerning"});
85 gen_.GenerateSinglePanel("Panel_seam_same", kMiddle, kYellow, {.max_answer_len = 6, .save_for_later = true, .unique_pool = "discerning"});
86
87 // The Bold 87 // The Bold
88 gen_.GenerateSinglePanel("Panel_heartbreak_brake", kTop, kRed, {.save_for_later = true, .unique_pool = "bold"}); 88 gen_.GenerateSinglePanel("Panel_heartbreak_brake", kTop, kRed, {.save_for_later = true, .unique_pool = "bold"});
89 gen_.GenerateSinglePanel("Panel_airplane_plain", kTop, kRed, {.save_for_later = true, .unique_pool = "bold"}); 89 gen_.GenerateSinglePanel("Panel_airplane_plain", kTop, kRed, {.save_for_later = true, .unique_pool = "bold"});
@@ -91,45 +91,30 @@ public:
91 gen_.GenerateSinglePanel("Panel_sign_sigh", kTop, kRed, {.save_for_later = true, .unique_pool = "bold"}); 91 gen_.GenerateSinglePanel("Panel_sign_sigh", kTop, kRed, {.save_for_later = true, .unique_pool = "bold"});
92 gen_.GenerateSinglePanel("Panel_unopened_open", kMiddle, kRed, {.save_for_later = true, .unique_pool = "bold"}); 92 gen_.GenerateSinglePanel("Panel_unopened_open", kMiddle, kRed, {.save_for_later = true, .unique_pool = "bold"});
93 gen_.GenerateDoublePanel("Panel_undead_dead", "Panel_deadline_dead", kMiddle, kRed, {.save_for_later = true, .unique_pool = "bold"}); 93 gen_.GenerateDoublePanel("Panel_undead_dead", "Panel_deadline_dead", kMiddle, kRed, {.save_for_later = true, .unique_pool = "bold"});
94 gen_.GenerateSinglePanel("Panel_sushi_hi", kMiddle, kRed, {.reuse_solution = true, .unique_pool = "bold"}); 94 gen_.GenerateSinglePanel("Panel_sushi_hi", kMiddle, kRed, {.save_for_later = true, .unique_pool = "bold"});
95 gen_.GenerateSinglePanel("Panel_thistle_this", kMiddle, kRed, {.reuse_solution = true, .unique_pool = "bold"}); 95 gen_.GenerateSinglePanel("Panel_thistle_this", kMiddle, kRed, {.save_for_later = true, .unique_pool = "bold"});
96 gen_.GenerateDoublePanel("Panel_landmass_mass", "Panel_massacred_mass", kMiddle, kRed, {.save_for_later = true, .unique_pool = "bold"}); 96 gen_.GenerateDoublePanel("Panel_landmass_mass", "Panel_massacred_mass", kMiddle, kRed, {.save_for_later = true, .unique_pool = "bold"});
97 gen_.GenerateDoublePanel("Panel_face_eye", "Panel_needle_eye", kBottom, kRed, {.max_answer_len = 6, .unique_pool = "bold"}); 97 gen_.GenerateDoublePanel("Panel_face_eye", "Panel_needle_eye", kBottom, kRed, {.reuse_solution = true, .unique_pool = "bold"});
98 gen_.GenerateSinglePanel("Panel_foot_toe", kBottom, kRed, {.max_answer_len = 6, .unique_pool = "bold"}); 98 gen_.GenerateSinglePanel("Panel_foot_toe", kBottom, kRed, {.reuse_solution = true, .unique_pool = "bold"});
99 gen_.GenerateDoublePanel("Panel_mouth_teeth", "Panel_saw_teeth", kBottom, kRed, {.max_answer_len = 6, .unique_pool = "bold"}); 99 gen_.GenerateDoublePanel("Panel_mouth_teeth", "Panel_saw_teeth", kBottom, kRed, {.reuse_solution = true, .unique_pool = "bold"});
100 gen_.GenerateSinglePanel("Panel_hand_finger", kBottom, kRed, {.max_answer_len = 6, .unique_pool = "bold"}); 100 gen_.GenerateSinglePanel("Panel_hand_finger", kBottom, kRed, {.reuse_solution = true, .unique_pool = "bold"});
101 101
102 // The Steady 102 // The Steady
103 103
104 // The Undeterred 104 // The Undeterred
105 gen_.GenerateSinglePanel("Panel_two_toucan", kTop, kBlue, {.unique_pool = "undeterred", .reuse_solution = true}); 105 gen_.GenerateSinglePanel("Panel_two_toucan", kTop, kBlue, {.unique_pool = "undeterred", .reuse_solution = true, .max_len_diff = 3});
106 gen_.GenerateDoublePanel("Panel_ice_eyesight", "Panel_height_eyesight", kTop, kBlue, {.unique_pool = "undeterred", .max_answer_len = 6}); 106 gen_.GenerateDoublePanel("Panel_ice_eyesight", "Panel_height_eyesight", kTop, kBlue, {.unique_pool = "undeterred", .max_len_diff = 4, .reuse_solution = true});
107 gen_.GenerateSinglePanel("Panel_eye_hi", kTop, kBlue, {.unique_pool = "undeterred", .reuse_solution = true}); 107 gen_.GenerateSinglePanel("Panel_eye_hi", kTop, kBlue, {.unique_pool = "undeterred", .reuse_solution = true});
108 gen_.GenerateSinglePanel("Panel_pen_open", kMiddle, kBlue, {.max_answer_len = 4, .unique_pool = "undeterred"}); 108 gen_.GenerateSinglePanel("Panel_pen_open", kMiddle, kBlue, {.max_answer_len = 4, .unique_pool = "undeterred"});
109 gen_.GenerateSinglePanel("Panel_not_notice", kMiddle, kBlue, {.unique_pool = "undeterred", .max_answer_len = 6}); 109 gen_.GenerateSinglePanel("Panel_not_notice", kMiddle, kBlue, {.unique_pool = "undeterred", .max_len_diff = 3, .reuse_solution = true});
110 gen_.GenerateDoublePanel("Panel_just_readjust", "Panel_read_readjust", kMiddle, kBlue, {.unique_pool = "undeterred"}); 110 gen_.GenerateDoublePanel("Panel_just_readjust", "Panel_read_readjust", kMiddle, kBlue, {.unique_pool = "undeterred", .max_len_diff = 4});
111 gen_.GenerateSinglePanel("Panel_ate_primate", kMiddle, kBlue, {.unique_pool = "undeterred", .reuse_solution = true}); 111 gen_.GenerateSinglePanel("Panel_ate_primate", kMiddle, kBlue, {.unique_pool = "undeterred", .reuse_solution = true});
112 gen_.GenerateSinglePanel("Panel_bone_skeleton", kBottom, kBlue, {.max_answer_len = 7, .unique_pool = "undeterred"}); 112 gen_.GenerateSinglePanel("Panel_bone_skeleton", kBottom, kBlue, {.reuse_solution = true, .unique_pool = "undeterred"});
113 gen_.GenerateDoublePanel("Panel_mouth_face", "Panel_eye_face", kBottom, kBlue, {.max_answer_len = 4, .unique_pool = "undeterred"}); 113 gen_.GenerateDoublePanel("Panel_mouth_face", "Panel_eye_face", kBottom, kBlue, {.reuse_solution = true, .unique_pool = "undeterred"});
114 gen_.GenerateSinglePanel("Panel_toucan_bird", kBottom, kBlue, {.max_answer_len = 4, .unique_pool = "undeterred"}); 114 gen_.GenerateSinglePanel("Panel_toucan_bird", kBottom, kBlue, {.reuse_solution = true, .unique_pool = "undeterred"});
115 gen_.GenerateSinglePanel("Panel_primate_mammal", kBottom, kBlue, {.max_answer_len = 6, .unique_pool = "undeterred"}); 115 gen_.GenerateSinglePanel("Panel_primate_mammal", kBottom, kBlue, {.reuse_solution = true, .unique_pool = "undeterred"});
116 gen_.GenerateDoublePanel("Panel_continent_planet", "Panel_ocean_planet", kBottom, kBlue, {.max_answer_len = 6, .unique_pool = "undeterred"}); 116 gen_.GenerateDoublePanel("Panel_continent_planet", "Panel_ocean_planet", kBottom, kBlue, {.reuse_solution = true, .unique_pool = "undeterred"});
117 gen_.GenerateSinglePanel("Panel_wall_room", kBottom, kBlue, {.max_answer_len = 4, .unique_pool = "undeterred"}); 117 gen_.GenerateSinglePanel("Panel_wall_room", kBottom, kBlue, {.reuse_solution = true, .unique_pool = "undeterred"});
118
119 // The Discerning
120 gen_.GenerateSinglePanel("Panel_nope_open", kMiddle, kYellow, {.max_answer_len = 4, .unique_pool = "discerning"});
121 gen_.GenerateSinglePanel("Panel_hits_this", kMiddle, kYellow, {.save_for_later = true, .unique_pool = "discerning"});
122 gen_.GenerateDoublePanel("Panel_warred_drawer", "Panel_redraw_drawer", kMiddle, kYellow, {.save_for_later = true, .unique_pool = "discerning"});
123 gen_.GenerateSinglePanel("Panel_adder_dread", kMiddle, kYellow, {.save_for_later = true, .unique_pool = "discerning"});
124 gen_.GenerateSinglePanel("Panel_laughters_slaughter", kMiddle, kYellow, {.save_for_later = true, .unique_pool = "discerning"});
125 gen_.GenerateDoublePanel("Panel_stone_notes", "Panel_onset_notes", kMiddle, kYellow, {.save_for_later = true, .unique_pool = "discerning"});
126 gen_.GenerateSinglePanel("Panel_rat_art", kMiddle, kYellow, {.save_for_later = true, .unique_pool = "discerning"});
127 gen_.GenerateSinglePanel("Panel_dusty_study", kMiddle, kYellow, {.save_for_later = true, .unique_pool = "discerning"});
128 gen_.GenerateDoublePanel("Panel_arts_star", "Panel_tsar_star", kMiddle, kYellow, {.save_for_later = true, .unique_pool = "discerning"});
129 gen_.GenerateSinglePanel("Panel_state_taste", kMiddle, kYellow, {.save_for_later = true, .unique_pool = "discerning"});
130 gen_.GenerateSinglePanel("Panel_react_trace", kMiddle, kYellow, {.save_for_later = true, .unique_pool = "discerning"});
131 gen_.GenerateDoublePanel("Panel_dear_read", "Panel_dare_read", kMiddle, kYellow, {.save_for_later = true, .unique_pool = "discerning"});
132 gen_.GenerateSinglePanel("Panel_seam_same", kMiddle, kYellow, {.save_for_later = true, .unique_pool = "discerning"});
133 118
134 // Crossroads 119 // Crossroads
135 gen_.GeneratePairedPanels("Panel_sword_words", "Panel_words_sword", kMiddle, kYellow); 120 gen_.GeneratePairedPanels("Panel_sword_words", "Panel_words_sword", kMiddle, kYellow);
@@ -190,7 +175,7 @@ public:
190 175
191 // Knight/Night 176 // Knight/Night
192 gen_.GenerateSinglePanel("Panel_rat_tar", kMiddle, kBlack, {.palindrome = kRejectPalindrome}); 177 gen_.GenerateSinglePanel("Panel_rat_tar", kMiddle, kBlack, {.palindrome = kRejectPalindrome});
193 gen_.GenerateSinglePanel("Panel_discover_recover", kMiddle, kPurple, {.max_answer_len = 7}); 178 gen_.GenerateSinglePanel("Panel_discover_recover", kMiddle, kPurple, {.max_len_diff = 1});
194 gen_.GenerateSinglePanel("Panel_deadend_deadened", kTop, kWhite, {.multiword = true}); 179 gen_.GenerateSinglePanel("Panel_deadend_deadened", kTop, kWhite, {.multiword = true});
195 gen_.GenerateSinglePanel("Panel_deadend_deadend", kMiddle, kWhite, {.multiword = true, .obscure_hint = true}); 180 gen_.GenerateSinglePanel("Panel_deadend_deadend", kMiddle, kWhite, {.multiword = true, .obscure_hint = true});
196 gen_.GenerateSinglePanel("Panel_warner_corner", kTop, kPurple); 181 gen_.GenerateSinglePanel("Panel_warner_corner", kTop, kPurple);
@@ -203,46 +188,51 @@ public:
203 gen_.GenerateCohintedPanels("Panel_rust_trust", "Panel_rust_crust", kMiddle, kBlue, {.max_answer_len = 5, .save_for_later = true}); 188 gen_.GenerateCohintedPanels("Panel_rust_trust", "Panel_rust_crust", kMiddle, kBlue, {.max_answer_len = 5, .save_for_later = true});
204 gen_.GenerateSinglePanel("Panel_encrusted_rust", kMiddle, kRed, {.save_for_later = true}); 189 gen_.GenerateSinglePanel("Panel_encrusted_rust", kMiddle, kRed, {.save_for_later = true});
205 gen_.GenerateCohintedPanels("Panel_adjust_readjust", "Panel_adjust_adjusted", kMiddle, kBlue, {.max_answer_len = 6, .save_for_later = true}); 190 gen_.GenerateCohintedPanels("Panel_adjust_readjust", "Panel_adjust_adjusted", kMiddle, kBlue, {.max_answer_len = 6, .save_for_later = true});
206 gen_.GenerateSinglePanel("Panel_adjust_readjusted", kMiddle, kBlue, {.save_for_later = true}); 191 gen_.GenerateSinglePanel("Panel_adjust_readjusted", kMiddle, kBlue, {.save_for_later = true, .max_len_diff = 2});
207 gen_.GeneratePairedPanels("Panel_before_fore", "Panel_be_before", kMiddle, kRed, {.obscure_hint = true}); 192 gen_.GeneratePairedPanels("Panel_before_fore", "Panel_be_before", kMiddle, kRed, {.obscure_hint = true});
208 gen_.GenerateSinglePanel("Panel_trust_crust", kMiddle, kPurple, {.reuse_solution = true}); 193 gen_.GenerateSinglePanel("Panel_trust_crust", kMiddle, kPurple, {.reuse_solution = true, .max_len_diff = 0});
209 gen_.GenerateSinglePanel("Panel_trust_crust_2", kMiddle, kPurple, {.reuse_solution = true}); 194 gen_.GenerateSinglePanel("Panel_trust_crust_2", kMiddle, kPurple, {.reuse_solution = true, .max_len_diff = 0});
210 gen_.GenerateSinglePanel("Panel_trusted_readjusted", kMiddle, kPurple, {.reuse_solution = true}); 195 gen_.GenerateSinglePanel("Panel_trusted_readjusted", kMiddle, kPurple, {.reuse_solution = true, .max_len_diff = 1});
196
197 // The Traveled
198 gen_.GenerateSinglePanel("Panel_open_open", kMiddle, kWhite, {.obscure_hint = true, .unique_pool = "traveled", .save_for_later = true});
199 gen_.GenerateSinglePanel("Panel_close_near", kBottom, kWhite, {.reuse_solution = true, .unique_pool = "traveled"});
200 gen_.GenerateDoublePanel("Panel_compose_write", "Panel_record_write", kBottom, kWhite, {.reuse_solution = true, .unique_pool = "traveled"});
201 gen_.GenerateSinglePanel("Panel_category_type", kBottom, kWhite, {.reuse_solution = true, .unique_pool = "traveled"});
202 gen_.GenerateSinglePanel("Panel_hello_hi", kBottom, kWhite, {.reuse_solution = true, .unique_pool = "traveled"});
203 gen_.GenerateDoublePanel("Panel_duplicate_same", "Panel_identical_same", kBottom, kWhite, {.reuse_solution = true, .unique_pool = "traveled"});
204 gen_.GenerateSinglePanel("Panel_distant_far", kBottom, kWhite, {.reuse_solution = true, .unique_pool = "traveled"});
205 gen_.GenerateSinglePanel("Panel_hay_straw", kBottom, kWhite, {.reuse_solution = true, .unique_pool = "traveled"});
206 gen_.GenerateDoublePanel("Panel_giggle_laugh", "Panel_chuckle_laugh", kBottom, kWhite, {.reuse_solution = true, .unique_pool = "traveled"});
207 gen_.GenerateSinglePanel("Panel_snitch_rat", kBottom, kWhite, {.reuse_solution = true, .unique_pool = "traveled"});
208 gen_.GenerateSinglePanel("Panel_concealed_hidden", kBottom, kWhite, {.reuse_solution = true, .unique_pool = "traveled"});
209 gen_.GenerateDoublePanel("Panel_plunge_fall", "Panel_autumn_fall", kBottom, kWhite, {.reuse_solution = true, .unique_pool = "traveled"});
210 gen_.GenerateSinglePanel("Panel_growths_warts", kBottom, kWhite, {.reuse_solution = true, .unique_pool = "traveled"});
211 211
212 // The Initiated 212 // The Initiated
213 gen_.GenerateSinglePanel("Panel_locked_knocked", kMiddle, kPurple, {.max_hint_len = 5, .max_answer_len = 5, .reuse_solution = true, .unique_pool = "initiated"}); 213 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"}); 214 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"}); 215 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"}); 216 gen_.GenerateSinglePanel("Panel_scope_type", kMiddle, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1});
217 gen_.GenerateSinglePanel("Panel_abyss_this", kMiddle, kPurple, {.max_hint_len = 6, .reuse_solution = true, .unique_pool = "initiated"}); 217 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, {.max_hint_len = 6, .reuse_solution = true, .unique_pool = "initiated"}); 218 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"}); 219 gen_.GenerateSinglePanel("Panel_alumni_hi", kTop, kPurple, {.reuse_solution = true, .unique_pool = "initiated"});
220 gen_.GenerateSinglePanel("Panel_wrath_path", kMiddle, kPurple, {.max_hint_len = 6, .reuse_solution = true, .unique_pool = "initiated"}); 220 gen_.GenerateSinglePanel("Panel_wrath_path", kMiddle, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1});
221 gen_.GenerateDoublePanel("Panel_knight_write", "Panel_byte_write", kTop, kPurple, {.reuse_solution = true, .unique_pool = "initiated"}); 221 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"}); 222 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"}); 223 gen_.GenerateSinglePanel("Panel_bare_bear", kTop, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 0});
224 gen_.GeneratePanelStack("Panel_chair_bear", kPurple, "", {}, "Panel_cost_most", kPurple, {.reuse_solution = true, .unique_pool = "initiated"}); 224 gen_.GeneratePanelStack("Panel_chair_bear", kPurple, "", {}, "Panel_cost_most", kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 1});
225 gen_.GenerateSinglePanel("Panel_bed_dead", kMiddle, kPurple, {.max_hint_len = 6, .reuse_solution = true, .unique_pool = "initiated"}); 225 gen_.GenerateSinglePanel("Panel_bed_dead", kMiddle, kPurple, {.reuse_solution = true, .unique_pool = "initiated", .max_len_diff = 2});
226 226
227 // The Bearer 227 // The Bearer
228 // Panel_north_missing: ? north! 228 gen_.GenerateCrossTower(
229 // Panel_diamonds_missing: ? diamonds! 229 "Panel_north_missing", "Panel_diamonds_missing", "Panel_fire_missing", "Panel_winter_missing",
230 // Panel_fire_missing: ? fire! 230 "Panel_north_north", "Panel_diamonds_diamonds", "Panel_fire_fire", "Panel_winter_winter",
231 // Panel_winter_missing: ? winter! 231 "Panel_mouth_south", "Panel_yeast_east", "Panel_wet_west",
232 "Panel_spades_spades", "Panel_clubs_clubs", "Panel_hearts_hearts",
233 "Panel_earth_earth", "Panel_water_water", "Panel_water_water",
234 "Panel_summer_summer", "Panel_autumn_autumn", "Panel_spring_spring");
232 gen_.GenerateSinglePanel("Panel_shortcut_shortcut", kMiddle, kWhite, {.obscure_hint = true, .max_answer_len = 20}); 235 gen_.GenerateSinglePanel("Panel_shortcut_shortcut", kMiddle, kWhite, {.obscure_hint = true, .max_answer_len = 20});
233 // Panel_north_north: ? north!
234 // Panel_mouth_south: sound? south!
235 // Panel_yeast_east: yeast? east!
236 // Panel_wet_west: wet? west!
237 // Panel_fire_fire: ? fire!
238 // Panel_earth_earth: earth? earth!
239 // Panel_water_water: water? water!
240 // Panel_air_air: air? air!
241 // Panel_winter_winter: ? winter!
242 // Panel_diamonds_diamonds: ? diamonds!
243 // Panel_spades_spades: spades? spades!
244 // Panel_clubs_clubs: clubs? clubs!
245 // Panel_hearts_hearts: hearts? hearts!
246 // Panel_part_rap: part? rap! 236 // Panel_part_rap: part? rap!
247 // Panel_heart_tar: heart? tar! 237 // Panel_heart_tar: heart? tar!
248 // Panel_smile_lime: smile? lime! 238 // Panel_smile_lime: smile? lime!
@@ -295,8 +285,8 @@ public:
295 // Art Gallery 285 // Art Gallery
296 gen_.GenerateSinglePanel("Panel_eon_one", kMiddle, kYellow, {.max_answer_len = 5}); 286 gen_.GenerateSinglePanel("Panel_eon_one", kMiddle, kYellow, {.max_answer_len = 5});
297 gen_.GenerateSinglePanel("Panel_to_two", kMiddle, kRed); 287 gen_.GenerateSinglePanel("Panel_to_two", kMiddle, kRed);
298 gen_.GenerateSinglePanel("Panel_free_three", kMiddle, kPurple, {.reuse_solution = true, .max_hint_len = 5}); 288 gen_.GenerateSinglePanel("Panel_free_three", kMiddle, kPurple, {.reuse_solution = true, .max_len_diff = 1});
299 gen_.GenerateSinglePanel("Panel_our_four", kMiddle, kBlue, {.reuse_solution = true}); 289 gen_.GenerateSinglePanel("Panel_our_four", kMiddle, kBlue, {.reuse_solution = true, .max_len_diff = 1});
300 gen_.GenerateSinglePanel("Panel_house_neighborhood", kBottom, kBlue, {.max_answer_len = 6}); 290 gen_.GenerateSinglePanel("Panel_house_neighborhood", kBottom, kBlue, {.max_answer_len = 6});
301 gen_.GenerateStaticPanel("Panel_path_road", "path", "road"); // can't randomise brown yet 291 gen_.GenerateStaticPanel("Panel_path_road", "path", "road"); // can't randomise brown yet
302 gen_.GenerateSinglePanel("Panel_park_drive", kBottom, kBlack, {.max_answer_len = 6}); 292 gen_.GenerateSinglePanel("Panel_park_drive", kBottom, kBlack, {.max_answer_len = 6});
@@ -305,8 +295,8 @@ public:
305 gen_.GenerateSinglePanel("Panel_may_many", kMiddle, kBlue, {.max_answer_len = 4}); 295 gen_.GenerateSinglePanel("Panel_may_many", kMiddle, kBlue, {.max_answer_len = 4});
306 gen_.GenerateSinglePanel("Panel_any_many", kMiddle, kBlue, {.max_answer_len = 4}); 296 gen_.GenerateSinglePanel("Panel_any_many", kMiddle, kBlue, {.max_answer_len = 4});
307 gen_.GenerateSinglePanel("Panel_man_many", kMiddle, kBlue, {.max_answer_len = 4}); 297 gen_.GenerateSinglePanel("Panel_man_many", kMiddle, kBlue, {.max_answer_len = 4});
308 gen_.GenerateSinglePanel("Panel_urns_turns", kMiddle, kBlue, {.reuse_solution = true}); 298 gen_.GenerateSinglePanel("Panel_urns_turns", kMiddle, kBlue, {.max_len_diff = 1});
309 gen_.GenerateSinglePanel("Panel_learns_turns", kMiddle, kPurple, {.reuse_solution = true, .max_answer_len = 5}); 299 gen_.GenerateSinglePanel("Panel_learns_turns", kMiddle, kPurple, {.reuse_solution = true, .max_len_diff = 0});
310 gen_.GenerateSinglePanel("Panel_runts_turns", kMiddle, kYellow); 300 gen_.GenerateSinglePanel("Panel_runts_turns", kMiddle, kYellow);
311 gen_.GenerateOrangeAdditionPanel("Panel_send_use_turns"); 301 gen_.GenerateOrangeAdditionPanel("Panel_send_use_turns");
312 gen_.GenerateOrangeWordPanel("Panel_trust_06890"); 302 gen_.GenerateOrangeWordPanel("Panel_trust_06890");
@@ -398,16 +388,97 @@ public:
398 // Directional Gallery 388 // Directional Gallery
399 gen_.GenerateStaticPanel("Panel_paranoid_paranoid", "welcome back"); 389 gen_.GenerateStaticPanel("Panel_paranoid_paranoid", "welcome back");
400 gen_.GeneratePairedPanels("Panel_salt_pepper", "Panel_pepper_salt", kBottom, kBlack); 390 gen_.GeneratePairedPanels("Panel_salt_pepper", "Panel_pepper_salt", kBottom, kBlack);
401 gen_.GenerateSinglePanel("Panel_ward_forward", kMiddle, kBlue, {.reuse_solution = true}); 391 gen_.GenerateSinglePanel("Panel_ward_forward", kMiddle, kBlue, {.reuse_solution = true, .max_len_diff = 3});
402 gen_.GenerateSinglePanel("Panel_hind_behind", kMiddle, kBlue, {.reuse_solution = true}); 392 gen_.GenerateSinglePanel("Panel_hind_behind", kMiddle, kBlue, {.reuse_solution = true, .max_len_diff = 2});
403 gen_.GenerateSinglePanel("Panel_rig_right", kMiddle, kBlue, {.reuse_solution = true}); 393 gen_.GenerateSinglePanel("Panel_rig_right", kMiddle, kBlue, {.reuse_solution = true, .max_len_diff = 2});
404 gen_.GenerateSinglePanel("Panel_windward_forward", kMiddle, kPurple, {.reuse_solution = true}); 394 gen_.GenerateSinglePanel("Panel_windward_forward", kMiddle, kPurple, {.reuse_solution = true, .max_len_diff = 1});
405 gen_.GenerateSinglePanel("Panel_light_right", kMiddle, kPurple, {.reuse_solution = true}); 395 gen_.GenerateSinglePanel("Panel_light_right", kMiddle, kPurple, {.reuse_solution = true, .max_len_diff = 0});
406 gen_.GenerateSinglePanel("Panel_rewind_behind", kMiddle, kPurple, {.reuse_solution = true}); 396 gen_.GenerateSinglePanel("Panel_rewind_behind", kMiddle, kPurple, {.reuse_solution = true, .max_len_diff = 0});
407 gen_.GenerateSinglePanel("Panel_learn_return", kMiddle, kPurple, {.reuse_solution = true}); 397 gen_.GenerateSinglePanel("Panel_learn_return", kMiddle, kPurple, {.reuse_solution = true, .max_len_diff = 1});
408 gen_.GenerateSinglePanel("Panel_turn_return", kMiddle, kBlue, {.reuse_solution = true}); 398 gen_.GenerateSinglePanel("Panel_turn_return", kMiddle, kBlue, {.reuse_solution = true, .max_len_diff = 2});
409 399
410 400
401
402
403
404
405
406
407 // The Colorful
408 gen_.GenerateSinglePanel("Panel_begin_start", kBottom, kWhite, {.reuse_solution = true});
409 gen_.GenerateSinglePanel("Panel_found_lost", kBottom, kBlack, {.reuse_solution = true});
410 gen_.GenerateSinglePanel("Panel_loaf_crust", kBottom, kRed, {.reuse_solution = true});
411 //Panel_eggs_breakfast: cream? butter!
412 gen_.GenerateSinglePanel("Panel_sun_sky", kBottom, kBlue, {.reuse_solution = true});
413 //Panel_teacher_substitute: spoon? fork!
414 //Panel_walnuts_orange: letters? numbers!
415 //Panel_path_i: walls? green!
416 //Panel_iron_rust: iron? rust!
417 //Panel_obstacle_door: obstacle? door!
418
419 // Champion's Rest
420 gen_.GenerateSinglePanel("Panel_hues_colors", kBottom, kWhite, {.max_answer_len = 6});
421 gen_.GenerateSinglePanel("Panel_red_near", kMiddle, kWhite, {.copy_hidden = "Panel_red_afar"});
422 gen_.GenerateSinglePanel("Panel_blue_near", kMiddle, kWhite, {.copy_hidden = "Panel_blue_afar"});
423 gen_.GenerateSinglePanel("Panel_yellow_near", kMiddle, kWhite, {.copy_hidden = "Panel_yellow_afar"});
424 gen_.GenerateSinglePanel("Panel_purple_near", kMiddle, kWhite, {.copy_hidden = "Panel_purple_afar"});
425 gen_.GenerateSinglePanel("Panel_orange_near", kMiddle, kWhite, {.copy_hidden = "Panel_orange_afar"});
426 gen_.GenerateSinglePanel("Panel_green_near", kMiddle, kWhite, {.copy_hidden = "Panel_green_afar"});
427 //Panel_you: you? jeff!
428 gen_.GenerateStaticPanel("Panel_me", "me", "hatkirby");
429 //Panel_secret_blue: blue? blue!
430 //Panel_secret_yellow: yellow? yellow!
431 //Panel_secret_red: red? red!
432
433 // The Fearless
434 gen_.GenerateSinglePanel("Panel_naps_span", kMiddle, kBlack, {.unique_pool = "fearless"});
435 gen_.GenerateSinglePanel("Panel_funny_enough", kTop, kBlack, {.unique_pool = "fearless"});
436 //Panel_easy_soft: easy? soft!
437 //Panel_sometimes_always: sometimes? always!
438 //Panel_dark_extinguish: dark? heavy!
439 //Panel_impatient_doctor: impatient? doctor!
440 //Panel_even_ordinary: even? ordinary!
441 //Panel_one_none: sum? none!
442 //Panel_one_many: none? sum!
443 gen_.GenerateSinglePanel("Panel_team_meet", kTop, kBlack, {.unique_pool = "fearless"});
444 gen_.GenerateSinglePanel("Panel_teem_meat", kTop, kBlack, {.unique_pool = "fearless"});
445 gen_.GenerateSinglePanel("Panel_eat_tea", kTop, kBlack, {.unique_pool = "fearless"});
446 gen_.GenerateSinglePanel("Panel_came_make", kTop, kBlack, {.unique_pool = "fearless"});
447 gen_.GenerateSinglePanel("Panel_same_mace", kTop, kBlack, {.unique_pool = "fearless"});
448 gen_.GenerateSinglePanel("Panel_safe_face", kTop, kBlack, {.unique_pool = "fearless"});
449 gen_.GenerateSinglePanel("Panel_might_time", kTop, kBlack, {.unique_pool = "fearless"});
450
451 // The Scientific
452
453
454
455 // Challenge
456 gen_.GenerateSinglePanel("Panel_challenge_challenge", kMiddle, kWhite, {.unique_pool = "challenge", .obscure_hint = true, .max_answer_len = 20});
457 gen_.GenerateSinglePanel("Panel_welcome_welcome", kMiddle, kWhite, {.unique_pool = "challenge", .obscure_hint = true, .max_answer_len = 20});
458 //Panel_open_nepotism: open? nepotism!
459 gen_.GenerateSinglePanel("Panel_singed_singsong", kMiddle, kPurple, {.unique_pool = "challenge", .reuse_solution = true});
460 gen_.GenerateSinglePanel("Panel_nevertrusted_maladjusted", kMiddle, kPurple, {.unique_pool = "challenge", .reuse_solution = true});
461 gen_.GenerateSinglePanel("Panel_corner_corn", kMiddle, kRed, {.unique_pool = "challenge"});
462 //Panel_strawberries_mold: strawberries? mold!
463 //Panel_grub_burger: grub? burger!
464 //Panel_bread_mold: cheese? mold!
465 //Panel_color_gray: color? gray!
466 gen_.GenerateSinglePanel("Panel_writer_songwriter", kMiddle, kBlue, {.unique_pool = "challenge", .reuse_solution = true});
467 //Panel_tales_stale: 02759? stale!
468 gen_.GenerateSinglePanel("Panel_realeyes_realize", kTop, kWhite, {.unique_pool = "challenge", .multiword = true, .max_answer_len = 20});
469 gen_.GenerateSinglePanel("Panel_lobs_lobster", kMiddle, kBlue, {.unique_pool = "challenge", .max_len_diff = 4});
470 gen_.GenerateSinglePanel("Panel_double_anagram_1", kMiddle, kYellow, {.unique_pool = "challenge", .force_two_words = true});
471 gen_.GenerateSinglePanel("Panel_double_anagram_2", kMiddle, kYellow, {.unique_pool = "challenge", .force_two_words = true});
472 gen_.GenerateSinglePanel("Panel_double_anagram_3", kMiddle, kYellow, {.unique_pool = "challenge", .force_two_words = true});
473 gen_.GenerateSinglePanel("Panel_double_anagram_4", kMiddle, kYellow, {.unique_pool = "challenge", .force_two_words = true});
474 gen_.GenerateSinglePanel("Panel_double_anagram_5", kMiddle, kYellow, {.unique_pool = "challenge", .force_two_words = true});
475 gen_.GenerateSinglePanel("Panel_double_anagram_6", kMiddle, kYellow, {.unique_pool = "challenge", .force_two_words = true});
476 //Panel_facts: facts? car!
477 //Panel_facts2: facts? acts!
478 //Panel_facts3: acts? axe!
479 //Panel_facts4: acts? axle!
480 //Panel_facts5: acts? axles!
481 //Panel_facts6: acts? car!
411 482
412 483
413 484
@@ -489,13 +560,13 @@ public:
489 gen_.GenerateComboPanel("Panel_lingo_4", kBottom, kWhite, kMiddle, kPurple); 560 gen_.GenerateComboPanel("Panel_lingo_4", kBottom, kWhite, kMiddle, kPurple);
490 gen_.GenerateComboPanel("Panel_lingo_6", kBottom, kBlack, kBottom, kWhite); 561 gen_.GenerateComboPanel("Panel_lingo_6", kBottom, kBlack, kBottom, kWhite);
491 gen_.GenerateSinglePanel("Panel_lingo_3", kBottom, kWhite); 562 gen_.GenerateSinglePanel("Panel_lingo_3", kBottom, kWhite);
492 gen_.GenerateComboPanel("Panel_lingo_10", kBottom, kBlack, kMiddle, kRed); 563 gen_.GenerateComboPanel("Panel_lingo_10", kMiddle, kBlue, kMiddle, kRed);
493 gen_.GenerateSinglePanel("Panel_lingo_2", kBottom, kWhite); 564 gen_.GenerateSinglePanel("Panel_lingo_2", kBottom, kWhite);
494 gen_.GenerateSinglePanel("Panel_lingo_5", kMiddle, kYellow, {.multiword = true, .max_answer_len = 20}); 565 gen_.GenerateSinglePanel("Panel_lingo_5", kMiddle, kYellow, {.multiword = true, .max_answer_len = 20});
495 gen_.GenerateSinglePanel("Panel_lingo_11", kMiddle, kYellow, {.multiword = true, .max_answer_len = 20}); 566 gen_.GenerateSinglePanel("Panel_lingo_11", kMiddle, kYellow, {.multiword = true, .max_answer_len = 20});
496 // Panel_lingo_9: this? pilgrim room! 567 // Panel_lingo_9: this? pilgrim room!
497 568
498 std::ifstream level1("../level1.tscn"); 569 std::ifstream level1("../babe.tscn");
499 std::ofstream output("newlevel.tscn"); 570 std::ofstream output("newlevel.tscn");
500 std::string line; 571 std::string line;
501 std::string name; 572 std::string name;
diff --git a/vendor/verbly b/vendor/verbly
Subproject e5d8d42eae6ce486678d87e33c1a7c26e2a6c1a Subproject 1e30651c96912e5475f1ceb46972ec4e2fa54b1