diff options
Diffstat (limited to 'randomizer')
-rw-r--r-- | randomizer/generator.gd | 257 | ||||
-rw-r--r-- | randomizer/load.gd | 69 |
2 files changed, 284 insertions, 42 deletions
diff --git a/randomizer/generator.gd b/randomizer/generator.gd index 22ab178..e04d0e3 100644 --- a/randomizer/generator.gd +++ b/randomizer/generator.gd | |||
@@ -2,6 +2,7 @@ extends Node | |||
2 | 2 | ||
3 | var panel_mapping = [] | 3 | var panel_mapping = [] |
4 | var gen_seed | 4 | var gen_seed |
5 | var is_set_seed = false | ||
5 | 6 | ||
6 | var _generated_puzzles | 7 | var _generated_puzzles |
7 | var _answer_by_id | 8 | var _answer_by_id |
@@ -11,6 +12,8 @@ var _puzzle_by_id | |||
11 | var _rng | 12 | var _rng |
12 | var _flags = 0 | 13 | var _flags = 0 |
13 | var _total_generated = 0 | 14 | var _total_generated = 0 |
15 | var _hint_by_path = {} | ||
16 | var _answer_by_path = {} | ||
14 | 17 | ||
15 | var _unique_pool = "" | 18 | var _unique_pool = "" |
16 | var _answers_by_unique_pool = {} | 19 | var _answers_by_unique_pool = {} |
@@ -55,9 +58,9 @@ const kPuzzleTypes = [ | |||
55 | kPurpleMiddle | 58 | kPurpleMiddle |
56 | ] | 59 | ] |
57 | 60 | ||
58 | const kMustReuseAnswer = 1 >> 0 | 61 | const kMustReuseAnswer = 1 |
59 | const kObscureHint = 1 >> 1 | 62 | const kObscureHint = 2 |
60 | const kShortAnswer = 1 >> 2 | 63 | const kShortAnswer = 4 |
61 | 64 | ||
62 | signal generator_status | 65 | signal generator_status |
63 | 66 | ||
@@ -77,8 +80,10 @@ func generate(chosen_seed): | |||
77 | var seed_rng = RandomNumberGenerator.new() | 80 | var seed_rng = RandomNumberGenerator.new() |
78 | seed_rng.randomize() | 81 | seed_rng.randomize() |
79 | gen_seed = seed_rng.randi_range(0, 999999) | 82 | gen_seed = seed_rng.randi_range(0, 999999) |
83 | is_set_seed = false | ||
80 | else: | 84 | else: |
81 | gen_seed = int(chosen_seed) | 85 | gen_seed = int(chosen_seed) |
86 | is_set_seed = true | ||
82 | 87 | ||
83 | _rng = RandomNumberGenerator.new() | 88 | _rng = RandomNumberGenerator.new() |
84 | _rng.seed = gen_seed | 89 | _rng.seed = gen_seed |
@@ -88,6 +93,8 @@ func generate(chosen_seed): | |||
88 | _answers_by_type = {} | 93 | _answers_by_type = {} |
89 | _answers_by_length = {} | 94 | _answers_by_length = {} |
90 | _puzzle_by_id = [] | 95 | _puzzle_by_id = [] |
96 | _hint_by_path = {} | ||
97 | _answer_by_path = {} | ||
91 | var openable_answers = [] | 98 | var openable_answers = [] |
92 | 99 | ||
93 | for puzzle_type in kPuzzleTypes: | 100 | for puzzle_type in kPuzzleTypes: |
@@ -137,7 +144,9 @@ func generate(chosen_seed): | |||
137 | ) | 144 | ) |
138 | 145 | ||
139 | _setUniquePool("seeker") | 146 | _setUniquePool("seeker") |
147 | _setFlag(kObscureHint) | ||
140 | _setPanel("Heteronym Room/Panel_entrance_entrance", open_answer_id, open_answer_id) | 148 | _setPanel("Heteronym Room/Panel_entrance_entrance", open_answer_id, open_answer_id) |
149 | _clearFlag(kObscureHint) | ||
141 | 150 | ||
142 | _setUniquePool("traveled") | 151 | _setUniquePool("traveled") |
143 | _setPanel("Synonym Room/Panel_open_open", open_answer_id, open_answer_id) | 152 | _setPanel("Synonym Room/Panel_open_open", open_answer_id, open_answer_id) |
@@ -170,6 +179,14 @@ func generate(chosen_seed): | |||
170 | open_answer_id | 179 | open_answer_id |
171 | ) | 180 | ) |
172 | 181 | ||
182 | _setUniquePool("scientific") | ||
183 | _setPanel("Chemistry Room/Panel_open", open_answer_id, open_answer_id) | ||
184 | _setPanel( | ||
185 | "Chemistry Room/Panel_close", | ||
186 | _pickRandom(_puzzle_by_id[open_answer_id][1][kBlackBottom]), | ||
187 | open_answer_id | ||
188 | ) | ||
189 | |||
173 | # Start generating puzzles that need to have reused solutions. | 190 | # Start generating puzzles that need to have reused solutions. |
174 | _setFlag(kMustReuseAnswer) | 191 | _setFlag(kMustReuseAnswer) |
175 | 192 | ||
@@ -241,6 +258,7 @@ func generate(chosen_seed): | |||
241 | _gSingle("Naps Room/Panel_even_ordinary", kDoubleBlackBottom) | 258 | _gSingle("Naps Room/Panel_even_ordinary", kDoubleBlackBottom) |
242 | 259 | ||
243 | _setUniquePool("unchallenged") | 260 | _setUniquePool("unchallenged") |
261 | _gSingle("Challenge Room/Panel_singed_singsong", kPurpleMiddle) | ||
244 | _gSingle("Challenge Room/Panel_nevertrusted_maladjusted", kPurpleMiddle) | 262 | _gSingle("Challenge Room/Panel_nevertrusted_maladjusted", kPurpleMiddle) |
245 | _gSingle("Challenge Room/Panel_writer_songwriter", kBlueMiddle) | 263 | _gSingle("Challenge Room/Panel_writer_songwriter", kBlueMiddle) |
246 | _gSingle("Challenge Room/Panel_lobs_lobster", kBlueMiddle) | 264 | _gSingle("Challenge Room/Panel_lobs_lobster", kBlueMiddle) |
@@ -419,12 +437,57 @@ func generate(chosen_seed): | |||
419 | "Double Room/Panel_descend_rhyme", kPurpleTop, "Double Room/Panel_descend_ant", kBlackBottom | 437 | "Double Room/Panel_descend_rhyme", kPurpleTop, "Double Room/Panel_descend_ant", kBlackBottom |
420 | ) | 438 | ) |
421 | 439 | ||
440 | _setUniquePool("fearless") | ||
441 | _gSingle("Naps Room/Panel_naps_span", kBlackMiddle) | ||
442 | _gSingle("Naps Room/Panel_funny_enough", kBlackTop) | ||
443 | _gSingle("Naps Room/Panel_team_meet", kBlackTop) | ||
444 | _gSingle("Naps Room/Panel_teem_meat", kBlackTop) | ||
445 | _gSingle("Naps Room/Panel_eat_tea", kBlackTop) | ||
446 | _gSingle("Naps Room/Panel_came_make", kBlackTop) | ||
447 | _gSingle("Naps Room/Panel_same_mace", kBlackTop) | ||
448 | _gSingle("Naps Room/Panel_safe_face", kBlackTop) | ||
449 | _gSingle("Naps Room/Panel_might_time", kBlackTop) | ||
450 | |||
451 | _setUniquePool("unchallenged") | ||
452 | _setFlag(kObscureHint) | ||
453 | _gSingle("Challenge Room/Panel_challenge_challenge", kWhiteMiddle) | ||
454 | _gSingle("Challenge Room/Panel_welcome_welcome", kWhiteMiddle) | ||
455 | _clearFlag(kObscureHint) | ||
456 | _writePanel("Entry Room/Panel_return_return", "%s back" % _answer_by_path["Challenge Room/Panel_welcome_welcome"], "%s back" % _answer_by_path["Challenge Room/Panel_welcome_welcome"]) | ||
457 | _gSingle("Challenge Room/Panel_corner_corn", kRedMiddle) | ||
458 | _gSingle("Challenge Room/Panel_realeyes_realize", kWhiteTop) | ||
459 | _gSingle("Challenge Room/Panel_double_anagram_1", kYellowMiddle) | ||
460 | _gSingle("Challenge Room/Panel_double_anagram_2", kYellowMiddle) | ||
461 | _gSingle("Challenge Room/Panel_double_anagram_3", kYellowMiddle) | ||
462 | _gSingle("Challenge Room/Panel_double_anagram_4", kYellowMiddle) | ||
463 | _gSingle("Challenge Room/Panel_double_anagram_5", kYellowMiddle) | ||
464 | _gSingle("Challenge Room/Panel_double_anagram_6", kYellowMiddle) | ||
465 | |||
466 | _setUniquePool("ecstatic") | ||
467 | _gSingle("Smiley Room/Panel_anagram_7_1", kYellowTop) | ||
468 | _gSingle("Smiley Room/Panel_anagram_7_2", kYellowTop) | ||
469 | _gSingle("Smiley Room/Panel_anagram_7_3", kYellowTop) | ||
470 | _gSingle("Smiley Room/Panel_anagram_7_4", kYellowTop) | ||
471 | _gSingle("Smiley Room/Panel_anagram_8_1", kYellowTop) | ||
472 | _gSingle("Smiley Room/Panel_anagram_8_2", kYellowTop) | ||
473 | _gSingle("Smiley Room/Panel_anagram_8_3", kYellowTop) | ||
474 | |||
475 | _setUniquePool("red") | ||
476 | _gSingle("Hangry Room/Panel_red_top_1", kRedTop) | ||
477 | _gSingle("Hangry Room/Panel_red_top_2", kRedTop) | ||
478 | _gSingle("Hangry Room/Panel_red_top_3", kRedTop) | ||
479 | _gSingle("Hangry Room/Panel_red_top_4", kRedTop) | ||
480 | _gSingle("Hangry Room/Panel_red_mid_1", kRedMiddle) | ||
481 | _gSingle("Hangry Room/Panel_red_mid_3", kRedMiddle) | ||
482 | _gStack2("Hangry Room/Panel_red_mid_4", kRedMiddle, "Hangry Room/Panel_red_bot_4", kRedBottom) | ||
483 | _gStack2("Hangry Room/Panel_red_mid_5", kRedMiddle, "Hangry Room/Panel_red_bot_5", kRedBottom) | ||
484 | |||
422 | _clearUniquePool() | 485 | _clearUniquePool() |
423 | _gSingle("Entry Room/Panel_hidden_hidden", kWhiteMiddle) | 486 | _gSingle("Entry Room/Panel_hidden_hidden", kWhiteMiddle) |
424 | 487 | ||
425 | _gPaired("Shuffle Room/Panel_sword_words", "Shuffle Room/Panel_words_sword", kYellowMiddle) | 488 | _gPaired("Shuffle Room/Panel_sword_words", "Shuffle Room/Panel_words_sword", kYellowMiddle) |
426 | _gPaired("Shuffle Room/Panel_turn_runt", "Shuffle Room/Panel_turn_runt2", kYellowMiddle) | 489 | _gPaired("Shuffle Room/Panel_turn_runt", "Shuffle Room/Panel_turn_runt2", kYellowMiddle) |
427 | _gCohinted("Shuffle Room/Panel_lost_lots", "Shuffle Room/Panel_lost_slot", kYellowMiddle) | 490 | _gPaired("Shuffle Room/Panel_lost_lots", "Shuffle Room/Panel_lost_slot", kYellowMiddle) |
428 | _gDouble("Shuffle Room/Panel_amen_mean", "Shuffle Room/Panel_name_mean", kYellowMiddle) | 491 | _gDouble("Shuffle Room/Panel_amen_mean", "Shuffle Room/Panel_name_mean", kYellowMiddle) |
429 | _gSingle("Shuffle Room/Panel_corner", kYellowTop) | 492 | _gSingle("Shuffle Room/Panel_corner", kYellowTop) |
430 | _gSingle("Shuffle Room/Panel_gel", kYellowTop) | 493 | _gSingle("Shuffle Room/Panel_gel", kYellowTop) |
@@ -437,8 +500,9 @@ func generate(chosen_seed): | |||
437 | _gCopy("Shuffle Room/Panel_left_left", "Shuffle Room/Panel_left_left_2") | 500 | _gCopy("Shuffle Room/Panel_left_left", "Shuffle Room/Panel_left_left_2") |
438 | _gCopy("Shuffle Room/Panel_right_right", "Shuffle Room/Panel_right_right_2") | 501 | _gCopy("Shuffle Room/Panel_right_right", "Shuffle Room/Panel_right_right_2") |
439 | _gCopy("Shuffle Room/Panel_middle_middle", "Shuffle Room/Panel_middle_middle_2") | 502 | _gCopy("Shuffle Room/Panel_middle_middle", "Shuffle Room/Panel_middle_middle_2") |
440 | _gSingle("Shuffle Room/Panel_shortcuts", kWhiteMiddle) | 503 | _gSingle("Shuffle Room/Panel_shortcuts", kYellowMiddle) |
441 | _gSingle("Shuffle Room/Panel_tower", kWhiteMiddle) | 504 | _gSingle("Shuffle Room/Panel_tower", kYellowMiddle) |
505 | _gPaired("Shuffle Room/Panel_far_far", "Shuffle Room/Panel_near_near", kWhiteMiddle) | ||
442 | 506 | ||
443 | _gSingle("Maze Room/Panel_reflow_flower", kYellowMiddle) | 507 | _gSingle("Maze Room/Panel_reflow_flower", kYellowMiddle) |
444 | 508 | ||
@@ -447,12 +511,10 @@ func generate(chosen_seed): | |||
447 | _gPaired("Appendix Room/Panel_night_knight", "Appendix Room/Panel_knight_night", kBlueMiddle) | 511 | _gPaired("Appendix Room/Panel_night_knight", "Appendix Room/Panel_knight_night", kBlueMiddle) |
448 | _gPaired("Appendix Room/Panel_bee_be", "Appendix Room/Panel_new_knew", kRedMiddle) | 512 | _gPaired("Appendix Room/Panel_bee_be", "Appendix Room/Panel_new_knew", kRedMiddle) |
449 | _gSingle("Appendix Room/Panel_fore_for", kRedMiddle) | 513 | _gSingle("Appendix Room/Panel_fore_for", kRedMiddle) |
450 | _gCohinted( | 514 | _gPaired("Appendix Room/Panel_trusted_trust", "Appendix Room/Panel_trusted_rusted", kRedMiddle) |
451 | "Appendix Room/Panel_trusted_trust", "Appendix Room/Panel_trusted_rusted", kRedMiddle | 515 | _gPaired("Appendix Room/Panel_rust_trust", "Appendix Room/Panel_rust_crust", kBlueMiddle) |
452 | ) | ||
453 | _gCohinted("Appendix Room/Panel_rust_trust", "Appendix Room/Panel_rust_crust", kBlueMiddle) | ||
454 | _gSingle("Appendix Room/Panel_encrusted_rust", kRedMiddle) | 516 | _gSingle("Appendix Room/Panel_encrusted_rust", kRedMiddle) |
455 | _gCohinted( | 517 | _gPaired( |
456 | "Appendix Room/Panel_adjust_readjust", "Appendix Room/Panel_adjust_adjusted", kBlueMiddle | 518 | "Appendix Room/Panel_adjust_readjust", "Appendix Room/Panel_adjust_adjusted", kBlueMiddle |
457 | ) | 519 | ) |
458 | 520 | ||
@@ -464,6 +526,65 @@ func generate(chosen_seed): | |||
464 | _gSingle("Painting Room/Panel_any_many", kBlueMiddle) | 526 | _gSingle("Painting Room/Panel_any_many", kBlueMiddle) |
465 | _gSingle("Painting Room/Panel_man_many", kBlueMiddle) | 527 | _gSingle("Painting Room/Panel_man_many", kBlueMiddle) |
466 | _clearFlag(kShortAnswer) | 528 | _clearFlag(kShortAnswer) |
529 | _writePanel("Painting Room/Panel_order_onepathmanyturns", "order", "%s road %s turns" % [_answer_by_path["Painting Room/Panel_eon_one"], _answer_by_path["Painting Room/Panel_any_many"]]) | ||
530 | |||
531 | _gStack2("Ceiling Room/Panel_blue_top_1", kBlueTop, "Ceiling Room/Panel_red_bot_1", kRedBottom) | ||
532 | _gStack2( | ||
533 | "Ceiling Room/Panel_red_mid_2", kRedMiddle, "Ceiling Room/Panel_blue_bot_2", kBlueBottom | ||
534 | ) | ||
535 | _gStack2( | ||
536 | "Ceiling Room/Panel_blue_mid_3", kBlueMiddle, "Ceiling Room/Panel_red_bot_3", kRedBottom | ||
537 | ) | ||
538 | _gStack2("Ceiling Room/Panel_red_top_4", kRedTop, "Ceiling Room/Panel_blue_mid_4", kBlueMiddle) | ||
539 | _gStack2( | ||
540 | "Ceiling Room/Panel_yellow_top_5", kYellowTop, "Ceiling Room/Panel_blue_bot_5", kBlueBottom | ||
541 | ) | ||
542 | _gStack2( | ||
543 | "Ceiling Room/Panel_blue_top_6", kBlueTop, "Ceiling Room/Panel_yellow_mid_6", kYellowMiddle | ||
544 | ) | ||
545 | # gen_.GeneratePanelStack("", {}, "Panel_blue_mid_7", kBlue, "Panel_yellow_bot_7", kYellow); | ||
546 | _gStack2( | ||
547 | "Ceiling Room/Panel_yellow_mid_8", | ||
548 | kYellowMiddle, | ||
549 | "Ceiling Room/Panel_black_bot_8", | ||
550 | kBlackBottom | ||
551 | ) | ||
552 | # gen_.GeneratePanelStack("Panel_black_top_9", kBlack, "", {}, "Panel_yellow_bot_9", kYellow); | ||
553 | _gStack2( | ||
554 | "Ceiling Room/Panel_yellow_top_10", | ||
555 | kYellowTop, | ||
556 | "Ceiling Room/Panel_black_bot_10", | ||
557 | kBlackBottom | ||
558 | ) | ||
559 | _gStack2( | ||
560 | "Ceiling Room/Panel_black_top_11", | ||
561 | kBlackTop, | ||
562 | "Ceiling Room/Panel_yellow_mid_11", | ||
563 | kYellowMiddle | ||
564 | ) | ||
565 | _gStack2( | ||
566 | "Ceiling Room/Panel_black_top_12", kBlackTop, "Ceiling Room/Panel_red_bot_12", kRedBottom | ||
567 | ) | ||
568 | _gStack2( | ||
569 | "Ceiling Room/Panel_red_top_13", kRedTop, "Ceiling Room/Panel_black_bot_13", kBlackBottom | ||
570 | ) | ||
571 | _gStack2( | ||
572 | "Ceiling Room/Panel_black_mid_14", kBlackMiddle, "Ceiling Room/Panel_red_bot_14", kRedBottom | ||
573 | ) | ||
574 | _gStack2( | ||
575 | "Ceiling Room/Panel_black_top_15", kBlackTop, "Ceiling Room/Panel_red_mid_15", kRedMiddle | ||
576 | ) | ||
577 | #gen_.GenerateSinglePanel("Panel_answer_1", kBottom, kRed); | ||
578 | #_gSingle("Ceiling Room/Panel_answer_2", kBlackTop) | ||
579 | _setFlag(kShortAnswer) | ||
580 | _gSingle("Ceiling Room/Panel_answer_3", kBlueMiddle) | ||
581 | _clearFlag(kShortAnswer) | ||
582 | _gSingle("Ceiling Room/Panel_answer_4", kBlackTop) | ||
583 | _writePanel("Countdown Panels/Panel_artistic_artistic", "", "the art %s %s" % [_answer_by_path["Ceiling Room/Panel_answer_3"], _answer_by_path["Ceiling Room/Panel_answer_4"]]) | ||
584 | |||
585 | _gQuadruple("Hallway Room/Panel_castle_1", "Hallway Room/Panel_castle_2", "Hallway Room/Panel_castle_3", "Hallway Room/Panel_castle_4", kBlueBottom) | ||
586 | _gQuadruple("Hallway Room/Panel_counterclockwise_1", "Hallway Room/Panel_counterclockwise_2", "Hallway Room/Panel_counterclockwise_3", "Hallway Room/Panel_counterclockwise_4", kBlueMiddle) | ||
587 | _gQuadruple("Hallway Room/Panel_transformation_1", "Hallway Room/Panel_transformation_2", "Hallway Room/Panel_transformation_3", "Hallway Room/Panel_transformation_4", kBlueTop) | ||
467 | 588 | ||
468 | _gExactLength("Backside Room/Panel_one_one", kWhiteMiddle, 1) | 589 | _gExactLength("Backside Room/Panel_one_one", kWhiteMiddle, 1) |
469 | _gExactLength("Backside Room/Panel_two_two", kWhiteMiddle, 2) | 590 | _gExactLength("Backside Room/Panel_two_two", kWhiteMiddle, 2) |
@@ -472,6 +593,19 @@ func generate(chosen_seed): | |||
472 | _gExactLength("Backside Room/Panel_three_three_2", kWhiteMiddle, 3) | 593 | _gExactLength("Backside Room/Panel_three_three_2", kWhiteMiddle, 3) |
473 | _gExactLength("Backside Room/Panel_three_three_3", kWhiteMiddle, 3) | 594 | _gExactLength("Backside Room/Panel_three_three_3", kWhiteMiddle, 3) |
474 | 595 | ||
596 | _gSingle("Color Arrow Room/Panel_red_near", kWhiteMiddle) | ||
597 | _gSingle("Color Arrow Room/Panel_blue_near", kWhiteMiddle) | ||
598 | _gSingle("Color Arrow Room/Panel_yellow_near", kWhiteMiddle) | ||
599 | _gSingle("Color Arrow Room/Panel_orange_near", kWhiteMiddle) | ||
600 | _gSingle("Color Arrow Room/Panel_purple_near", kWhiteMiddle) | ||
601 | _gSingle("Color Arrow Room/Panel_green_near", kWhiteMiddle) | ||
602 | _gCopyHidden("Color Arrow Room/Panel_red_near", "Color Arrow Room/Panel_red_afar") | ||
603 | _gCopyHidden("Color Arrow Room/Panel_blue_near", "Color Arrow Room/Panel_blue_afar") | ||
604 | _gCopyHidden("Color Arrow Room/Panel_yellow_near", "Color Arrow Room/Panel_yellow_afar") | ||
605 | _gCopyHidden("Color Arrow Room/Panel_orange_near", "Color Arrow Room/Panel_orange_afar") | ||
606 | _gCopyHidden("Color Arrow Room/Panel_purple_near", "Color Arrow Room/Panel_purple_afar") | ||
607 | _gCopyHidden("Color Arrow Room/Panel_green_near", "Color Arrow Room/Panel_green_afar") | ||
608 | |||
475 | _setFlag(kObscureHint) | 609 | _setFlag(kObscureHint) |
476 | _gSingle("Entry Room/Panel_forward_forward", kWhiteMiddle) | 610 | _gSingle("Entry Room/Panel_forward_forward", kWhiteMiddle) |
477 | _gSingle("Entry Room/Panel_between_between", kWhiteMiddle) | 611 | _gSingle("Entry Room/Panel_between_between", kWhiteMiddle) |
@@ -487,7 +621,6 @@ func generate(chosen_seed): | |||
487 | _gSingle("Shuffle Room/Panel_crossroads_crossroads", kWhiteMiddle) | 621 | _gSingle("Shuffle Room/Panel_crossroads_crossroads", kWhiteMiddle) |
488 | _gSingle("Shuffle Room/Panel_corner_corner", kWhiteMiddle) | 622 | _gSingle("Shuffle Room/Panel_corner_corner", kWhiteMiddle) |
489 | _gSingle("Shuffle Room/Panel_hollow_hollow", kWhiteMiddle) | 623 | _gSingle("Shuffle Room/Panel_hollow_hollow", kWhiteMiddle) |
490 | _gPaired("Shuffle Room/Panel_far_far", "Shuffle Room/Panel_near_near", kWhiteMiddle) | ||
491 | 624 | ||
492 | _gSingle("Maze Room/Panel_trace_trace", kWhiteMiddle) | 625 | _gSingle("Maze Room/Panel_trace_trace", kWhiteMiddle) |
493 | 626 | ||
@@ -561,6 +694,14 @@ func generate(chosen_seed): | |||
561 | print("%s: %s? %s!" % puzzle) | 694 | print("%s: %s? %s!" % puzzle) |
562 | 695 | ||
563 | 696 | ||
697 | func apply(scene): | ||
698 | var panels_parent = scene.get_node("Panels") | ||
699 | for puzzle in panel_mapping: | ||
700 | var panel = panels_parent.get_node(puzzle[0]) | ||
701 | panel.text = puzzle[1] | ||
702 | panel.answer = puzzle[2] | ||
703 | |||
704 | |||
564 | func _pickRandom(set): | 705 | func _pickRandom(set): |
565 | var id = _rng.randi_range(0, set.size() - 1) | 706 | var id = _rng.randi_range(0, set.size() - 1) |
566 | return set[id] | 707 | return set[id] |
@@ -628,10 +769,34 @@ func _gDouble(panel1_path, panel2_path, puzzle_type): | |||
628 | _setPanel(panel2_path, hint2_id, answer_id) | 769 | _setPanel(panel2_path, hint2_id, answer_id) |
629 | 770 | ||
630 | 771 | ||
772 | func _gQuadruple(panel1_path, panel2_path, panel3_path, panel4_path, puzzle_type): | ||
773 | var pre_choices = _filterBestPuzzles(_answers_by_type[puzzle_type]) | ||
774 | var puzzle_choices = [] | ||
775 | for word_id in pre_choices: | ||
776 | if _puzzle_by_id[word_id][1][puzzle_type].size() > 3: | ||
777 | puzzle_choices.append(word_id) | ||
778 | if puzzle_choices.empty(): | ||
779 | print("No possible puzzles for panel %s" % panel1_path) | ||
780 | else: | ||
781 | var answer_id = _pickRandom(puzzle_choices) | ||
782 | var hint_choices = _puzzle_by_id[answer_id][1][puzzle_type].duplicate() | ||
783 | var hint1_id = _pickRandom(hint_choices) | ||
784 | hint_choices.erase(hint1_id) | ||
785 | var hint2_id = _pickRandom(hint_choices) | ||
786 | hint_choices.erase(hint2_id) | ||
787 | var hint3_id = _pickRandom(hint_choices) | ||
788 | hint_choices.erase(hint3_id) | ||
789 | var hint4_id = _pickRandom(hint_choices) | ||
790 | _setPanel(panel1_path, hint1_id, answer_id) | ||
791 | _setPanel(panel2_path, hint2_id, answer_id) | ||
792 | _setPanel(panel3_path, hint3_id, answer_id) | ||
793 | _setPanel(panel4_path, hint4_id, answer_id) | ||
794 | |||
795 | |||
631 | func _gPaired(panel1_path, panel2_path, puzzle_type): | 796 | func _gPaired(panel1_path, panel2_path, puzzle_type): |
632 | var needed_type = puzzle_type | 797 | var needed_type = puzzle_type |
633 | if puzzle_type == kWhiteMiddle: | 798 | if puzzle_type == kWhiteMiddle: |
634 | needed_type = kBlackMiddle | 799 | needed_type = kBlackBottom |
635 | var puzzle_choices = _filterBestPuzzles(_answers_by_type[needed_type]) | 800 | var puzzle_choices = _filterBestPuzzles(_answers_by_type[needed_type]) |
636 | if puzzle_choices.empty(): | 801 | if puzzle_choices.empty(): |
637 | print("No possible puzzles for panel %s" % panel1_path) | 802 | print("No possible puzzles for panel %s" % panel1_path) |
@@ -647,10 +812,6 @@ func _gPaired(panel1_path, panel2_path, puzzle_type): | |||
647 | _setPanel(panel2_path, answer_id, hint_id) | 812 | _setPanel(panel2_path, answer_id, hint_id) |
648 | 813 | ||
649 | 814 | ||
650 | func _gCohinted(panel1_path, panel2_path, puzzle_type): | ||
651 | pass | ||
652 | |||
653 | |||
654 | func _gStack2(panel1_path, puzzle_type1, panel2_path, puzzle_type2): | 815 | func _gStack2(panel1_path, puzzle_type1, panel2_path, puzzle_type2): |
655 | if puzzle_type1 == kWhiteMiddle or puzzle_type2 == kWhiteMiddle: | 816 | if puzzle_type1 == kWhiteMiddle or puzzle_type2 == kWhiteMiddle: |
656 | if puzzle_type1 == kWhiteMiddle: | 817 | if puzzle_type1 == kWhiteMiddle: |
@@ -678,17 +839,15 @@ func _gStack2(panel1_path, puzzle_type1, panel2_path, puzzle_type2): | |||
678 | 839 | ||
679 | 840 | ||
680 | func _gCopy(panel1_path, panel2_path): | 841 | func _gCopy(panel1_path, panel2_path): |
681 | for thing in panel_mapping: | 842 | _writePanel(panel2_path, _hint_by_path[panel1_path], _answer_by_path[panel1_path]) |
682 | if thing[0] == panel1_path: | ||
683 | panel_mapping.append([panel2_path, thing[1], thing[2]]) | ||
684 | return | ||
685 | 843 | ||
686 | 844 | ||
687 | func _gCopyAnswer(panel1_path, panel2_path): | 845 | func _gCopyAnswer(panel1_path, panel2_path): |
688 | for thing in panel_mapping: | 846 | _writePanel(panel2_path, _answer_by_path[panel1_path], _answer_by_path[panel1_path]) |
689 | if thing[0] == panel1_path: | 847 | |
690 | panel_mapping.append([panel2_path, thing[2], thing[2]]) | 848 | |
691 | return | 849 | func _gCopyHidden(panel1_path, panel2_path): |
850 | _writePanel(panel2_path, "?".repeat(_answer_by_path[panel1_path].length()), _answer_by_path[panel1_path]) | ||
692 | 851 | ||
693 | 852 | ||
694 | func _gExactLength(panel_path, puzzle_type, answer_length): | 853 | func _gExactLength(panel_path, puzzle_type, answer_length): |
@@ -709,15 +868,17 @@ func _gExactLength(panel_path, puzzle_type, answer_length): | |||
709 | 868 | ||
710 | 869 | ||
711 | func _filterBestPuzzles(input): | 870 | func _filterBestPuzzles(input): |
712 | var not_uniqued = [] | 871 | var acceptable = [] |
713 | if _unique_pool == "": | 872 | for word_id in input: |
714 | not_uniqued = input | 873 | if ( |
715 | elif _answers_by_unique_pool.has(_unique_pool): | 874 | _unique_pool != "" |
716 | for word_id in input: | 875 | and _answers_by_unique_pool.has(_unique_pool) |
717 | if not _answers_by_unique_pool[_unique_pool].has(word_id): | 876 | and _answers_by_unique_pool[_unique_pool].has(word_id) |
718 | not_uniqued.append(word_id) | 877 | ): |
719 | else: | 878 | continue |
720 | not_uniqued = input | 879 | if _isFlag(kShortAnswer) and _answer_by_id[word_id].length() > 4: |
880 | continue | ||
881 | acceptable.append(word_id) | ||
721 | #if _isFlag(kMustReuseAnswer): | 882 | #if _isFlag(kMustReuseAnswer): |
722 | # var possible = [] | 883 | # var possible = [] |
723 | # for word_id in not_uniqued: | 884 | # for word_id in not_uniqued: |
@@ -725,11 +886,11 @@ func _filterBestPuzzles(input): | |||
725 | # possible.append(word_id) | 886 | # possible.append(word_id) |
726 | # not_uniqued = possible | 887 | # not_uniqued = possible |
727 | var result = [] | 888 | var result = [] |
728 | for word_id in not_uniqued: | 889 | for word_id in acceptable: |
729 | if _needs_reuse.has(word_id): | 890 | if _needs_reuse.has(word_id): |
730 | result.append(word_id) | 891 | result.append(word_id) |
731 | if result.empty(): | 892 | if result.empty(): |
732 | for word_id in not_uniqued: | 893 | for word_id in acceptable: |
733 | result.append(word_id) | 894 | result.append(word_id) |
734 | if _possible_reuse.has(word_id): | 895 | if _possible_reuse.has(word_id): |
735 | result.append(word_id) | 896 | result.append(word_id) |
@@ -739,10 +900,32 @@ func _filterBestPuzzles(input): | |||
739 | func _setPanel(panel_path, hint_id, answer_id): | 900 | func _setPanel(panel_path, hint_id, answer_id): |
740 | if _unique_pool != "": | 901 | if _unique_pool != "": |
741 | _answers_by_unique_pool[_unique_pool].append(answer_id) | 902 | _answers_by_unique_pool[_unique_pool].append(answer_id) |
742 | panel_mapping.append([panel_path, _answer_by_id[hint_id], _answer_by_id[answer_id]]) | 903 | |
904 | var hint_text = _answer_by_id[hint_id] | ||
905 | if _isFlag(kObscureHint): | ||
906 | var numToObscure = 1 | ||
907 | if hint_text.length()/3 > 0: | ||
908 | numToObscure = _rng.randi_range(1, hint_text.length()/3) | ||
909 | var iota = range(0, hint_text.length()) | ||
910 | var order = [] | ||
911 | while not iota.empty(): | ||
912 | var i = _rng.randi_range(0, iota.size() - 1) | ||
913 | order.append(iota[i]) | ||
914 | iota.remove(i) | ||
915 | for i in range(0, numToObscure): | ||
916 | if hint_text[order[i]] != " " and hint_text[order[i]] != "-": | ||
917 | hint_text[order[i]] = "?" | ||
918 | |||
919 | _writePanel(panel_path, hint_text, _answer_by_id[answer_id]) | ||
743 | if not _isFlag(kMustReuseAnswer): | 920 | if not _isFlag(kMustReuseAnswer): |
744 | if _needs_reuse.has(answer_id): | 921 | if _needs_reuse.has(answer_id): |
745 | _needs_reuse.erase(answer_id) | 922 | _needs_reuse.erase(answer_id) |
746 | _possible_reuse.append(answer_id) | 923 | _possible_reuse.append(answer_id) |
924 | |||
925 | |||
926 | func _writePanel(panel_path, hint, answer): | ||
927 | panel_mapping.append([panel_path, hint, answer]) | ||
928 | _hint_by_path[panel_path] = hint | ||
929 | _answer_by_path[panel_path] = answer | ||
747 | _total_generated += 1 | 930 | _total_generated += 1 |
748 | emit_signal("generator_status", "Generating puzzles... (%d/?)" % _total_generated) | 931 | emit_signal("generator_status", "Generating puzzles... (%d/?)" % _total_generated) |
diff --git a/randomizer/load.gd b/randomizer/load.gd index 727e368..9fcd038 100644 --- a/randomizer/load.gd +++ b/randomizer/load.gd | |||
@@ -5,14 +5,73 @@ func _load(): | |||
5 | global._print("Hooked Load Start") | 5 | global._print("Hooked Load Start") |
6 | 6 | ||
7 | var randomizer = global.get_node("Randomizer") | 7 | var randomizer = global.get_node("Randomizer") |
8 | var panels_parent = $Panels | ||
9 | |||
10 | # Hide the countdown true panels. | ||
11 | for child in $CountdownPanels.get_children(): | ||
12 | if child.is_class("Spatial"): | ||
13 | child.get_node(child.replace_with).translation.y -= 100.0 | ||
8 | 14 | ||
9 | # Apply the randomized panels. | 15 | # Apply the randomized panels. |
10 | var panels_parent = $Panels | 16 | randomizer.generator.apply(self) |
11 | for puzzle in randomizer.generator.panel_mapping: | 17 | |
12 | var panel = panels_parent.get_node(puzzle[0]) | 18 | # Write static panels. |
13 | panel.text = puzzle[1] | 19 | set_static_panel("Entry Room/Panel_hi_hi", "hi") |
14 | panel.answer = puzzle[2] | 20 | if randomizer.generator.is_set_seed: |
21 | set_static_panel("Entry Room/Panel_write_write", "set seed") | ||
22 | else: | ||
23 | set_static_panel("Entry Room/Panel_write_write", "random seed") | ||
24 | set_static_panel("Entry Room/Panel_same_same", str(randomizer.generator.gen_seed)) | ||
25 | set_static_panel("Entry Room/Panel_type_type", "version") | ||
26 | set_static_panel("Entry Room/Panel_this_this", randomizer.my_version) | ||
27 | set_static_panel("Entry Room/Panel_hi_high", "goode", "good") | ||
28 | set_static_panel("Entry Room/Panel_low_low", "serendipity", "luck") | ||
29 | set_static_panel("Shuffle Room/Panel_secret_secret", "trans rights", "human rights") | ||
30 | set_static_panel("Color Arrow Room/Panel_me", "me", "hatkirby") | ||
31 | |||
32 | # HOT CRUSTS should be at eye-level, have a yellow block behind it, and | ||
33 | # not vanish when solved. | ||
34 | var hotcrusts = panels_parent.get_node("Shuffle Room/Panel_shortcuts") | ||
35 | hotcrusts.translation.y = 1.5 | ||
36 | hotcrusts.get_node("Viewport/GUI/Panel/TextEdit").disconnect( | ||
37 | "answer_correct", hotcrusts, "handle_correct" | ||
38 | ) | ||
39 | |||
40 | set_gridmap_tile(-20.5, 1.5, -79.5, "MeshInstance9") | ||
41 | |||
42 | # TRANS RIGHTS should be bottom white, like it used to be. | ||
43 | var trans_rights = panels_parent.get_node("Shuffle Room/Panel_secret_secret") | ||
44 | trans_rights.translation.y = 0.5 | ||
45 | |||
46 | # Move LOW/LOW back to where it used to be. | ||
47 | var panel_low = panels_parent.get_node("Entry Room/Panel_low_low") | ||
48 | var sign_low = $Decorations/PanelSign/sign21 | ||
49 | panel_low.translation = sign_low.translation | ||
50 | panel_low.rotation = sign_low.rotation | ||
51 | sign_low.queue_free() | ||
52 | |||
53 | # Require LOW/LOW for opening the second door. | ||
54 | get_node("Doors/Entry Room Area Doors/Door_hi_high").panels.append("../../../Panels/Entry Room/Panel_low_low") | ||
55 | get_node("Doors/Entry Room Area Doors/Door_hi_high")._ready() | ||
15 | 56 | ||
16 | # Proceed with the rest of the load. | 57 | # Proceed with the rest of the load. |
17 | global._print("Hooked Load End") | 58 | global._print("Hooked Load End") |
18 | ._load() | 59 | ._load() |
60 | |||
61 | |||
62 | func set_static_panel(name, question, answer = ""): | ||
63 | if answer == "": | ||
64 | answer = question | ||
65 | |||
66 | var node = self.get_node("Panels").get_node(name) | ||
67 | |||
68 | node.text = question | ||
69 | node.answer = answer | ||
70 | |||
71 | |||
72 | func set_gridmap_tile(x, y, z, tile): | ||
73 | var gridmap = self.get_node("GridMap") | ||
74 | var mesh_library = gridmap.mesh_library | ||
75 | var mapvec = gridmap.world_to_map(gridmap.to_local(Vector3(x, y, z))) | ||
76 | |||
77 | gridmap.set_cell_item(mapvec.x, mapvec.y, mapvec.z, mesh_library.find_item_by_name(tile)) | ||