diff options
| -rw-r--r-- | randomizer/generator.gd | 122 |
1 files changed, 120 insertions, 2 deletions
| diff --git a/randomizer/generator.gd b/randomizer/generator.gd index ad6263d..fca9aa9 100644 --- a/randomizer/generator.gd +++ b/randomizer/generator.gd | |||
| @@ -22,6 +22,7 @@ var _answers_by_unique_pool = {} | |||
| 22 | var _needs_reuse = [] | 22 | var _needs_reuse = [] |
| 23 | var _possible_reuse = [] | 23 | var _possible_reuse = [] |
| 24 | 24 | ||
| 25 | const kOrangeMiddle = -2 | ||
| 25 | const kWhiteMiddle = -1 | 26 | const kWhiteMiddle = -1 |
| 26 | const kWhiteTop = 0 | 27 | const kWhiteTop = 0 |
| 27 | const kWhiteBottom = 1 | 28 | const kWhiteBottom = 1 |
| @@ -63,6 +64,7 @@ const kPuzzleTypes = [ | |||
| 63 | const kMustReuseAnswer = 1 | 64 | const kMustReuseAnswer = 1 |
| 64 | const kObscureHint = 2 | 65 | const kObscureHint = 2 |
| 65 | const kShortAnswer = 4 | 66 | const kShortAnswer = 4 |
| 67 | const kForcePalindrome = 8 | ||
| 66 | 68 | ||
| 67 | signal generator_status | 69 | signal generator_status |
| 68 | 70 | ||
| @@ -265,6 +267,8 @@ func generate(chosen_seed): | |||
| 265 | _gSingle("Challenge Room/Panel_nevertrusted_maladjusted", kPurpleMiddle) | 267 | _gSingle("Challenge Room/Panel_nevertrusted_maladjusted", kPurpleMiddle) |
| 266 | _gSingle("Challenge Room/Panel_writer_songwriter", kBlueMiddle) | 268 | _gSingle("Challenge Room/Panel_writer_songwriter", kBlueMiddle) |
| 267 | _gSingle("Challenge Room/Panel_lobs_lobster", kBlueMiddle) | 269 | _gSingle("Challenge Room/Panel_lobs_lobster", kBlueMiddle) |
| 270 | _gChain("Challenge Room/Panel_grub_burger", [kBlackMiddle, kBlueMiddle]) | ||
| 271 | _gChain("Challenge Room/Panel_open_nepotism", [kBlackMiddle, kBlueMiddle]) | ||
| 268 | 272 | ||
| 269 | _setUniquePool("red") | 273 | _setUniquePool("red") |
| 270 | _gSingle("Hangry Room/Panel_red_bot_1", kRedBottom) | 274 | _gSingle("Hangry Room/Panel_red_bot_1", kRedBottom) |
| @@ -280,6 +284,7 @@ func generate(chosen_seed): | |||
| 280 | _gSingle("Shuffle Room/Panel_lost_found", kBlackBottom) | 284 | _gSingle("Shuffle Room/Panel_lost_found", kBlackBottom) |
| 281 | _gSingle("Shuffle Room/Panel_clockwise_counterclockwise", kBlackBottom) | 285 | _gSingle("Shuffle Room/Panel_clockwise_counterclockwise", kBlackBottom) |
| 282 | _gSingle("Shuffle Room/Panel_order_chaos", kBlackBottom) | 286 | _gSingle("Shuffle Room/Panel_order_chaos", kBlackBottom) |
| 287 | _gChain("Shuffle Room/Panel_runt3", [kYellowMiddle, kBlueMiddle]) | ||
| 283 | 288 | ||
| 284 | _gSingle("Maze Room/Panel_down_up", kBlackBottom) | 289 | _gSingle("Maze Room/Panel_down_up", kBlackBottom) |
| 285 | _gSingle("Maze Room/Panel_strays_maze", kPurpleTop) | 290 | _gSingle("Maze Room/Panel_strays_maze", kPurpleTop) |
| @@ -318,6 +323,11 @@ func generate(chosen_seed): | |||
| 318 | 323 | ||
| 319 | _gSingle("Color Arrow Room/Panel_hues_colors", kWhiteBottom) | 324 | _gSingle("Color Arrow Room/Panel_hues_colors", kWhiteBottom) |
| 320 | 325 | ||
| 326 | _gDouble("Open Areas/Panel_rise_horizon", "Open Areas/Panel_rise_sunrise", kBlueTop) | ||
| 327 | _gDouble("Open Areas/Panel_son_horizon", "Open Areas/Panel_son_sunrise", kBlueTop) | ||
| 328 | |||
| 329 | _gChain("Lingo Room/Panel_lingo_7", [kOrangeMiddle, kBlueMiddle]) | ||
| 330 | |||
| 321 | # Now we'll generate puzzles that don't need to be reused, and hopefully cover | 331 | # Now we'll generate puzzles that don't need to be reused, and hopefully cover |
| 322 | # all previously generated answers. | 332 | # all previously generated answers. |
| 323 | _clearFlag(kMustReuseAnswer) | 333 | _clearFlag(kMustReuseAnswer) |
| @@ -358,7 +368,15 @@ func generate(chosen_seed): | |||
| 358 | _gSingle("Palindrome Room/Panel_dread_dead", kRedMiddle) | 368 | _gSingle("Palindrome Room/Panel_dread_dead", kRedMiddle) |
| 359 | _gSingle("Palindrome Room/Panel_massacred_sacred", kRedMiddle) | 369 | _gSingle("Palindrome Room/Panel_massacred_sacred", kRedMiddle) |
| 360 | _gSingle("Palindrome Room/Panel_decay_day", kRedMiddle) | 370 | _gSingle("Palindrome Room/Panel_decay_day", kRedMiddle) |
| 361 | # do palindromes | 371 | |
| 372 | _setFlag(kForcePalindrome) | ||
| 373 | _gSingle("Palindrome Room/Panel_solos_solos", kWhiteMiddle) | ||
| 374 | _gSingle("Palindrome Room/Panel_racecar_racecar", kWhiteMiddle) | ||
| 375 | _gSingle("Palindrome Room/Panel_level_level", kWhiteMiddle) | ||
| 376 | _gCopyHidden("Palindrome Room/Panel_solos_solos", "Palindrome Room/Panel_solos_solos_2") | ||
| 377 | _gCopyHidden("Palindrome Room/Panel_racecar_racecar", "Palindrome Room/Panel_racecar_racecar_2") | ||
| 378 | _gCopyHidden("Palindrome Room/Panel_level_level", "Palindrome Room/Panel_level_level_2") | ||
| 379 | _clearFlag(kForcePalindrome) | ||
| 362 | 380 | ||
| 363 | _setUniquePool("discerning") | 381 | _setUniquePool("discerning") |
| 364 | _gSingle("Sun Room/Panel_hits_this", kYellowMiddle) | 382 | _gSingle("Sun Room/Panel_hits_this", kYellowMiddle) |
| @@ -374,6 +392,20 @@ func generate(chosen_seed): | |||
| 374 | _gDouble("Sun Room/Panel_arts_star", "Sun Room/Panel_tsar_star", kYellowMiddle) | 392 | _gDouble("Sun Room/Panel_arts_star", "Sun Room/Panel_tsar_star", kYellowMiddle) |
| 375 | _gDouble("Sun Room/Panel_dear_read", "Sun Room/Panel_dare_read", kYellowMiddle) | 393 | _gDouble("Sun Room/Panel_dear_read", "Sun Room/Panel_dare_read", kYellowMiddle) |
| 376 | 394 | ||
| 395 | _setUniquePool("bearer") | ||
| 396 | _gChain("Cross Room/Panel_part_rap", [kRedMiddle, kYellowMiddle]) | ||
| 397 | _gChain("Cross Room/Panel_heart_tar", [kRedMiddle, kYellowMiddle]) | ||
| 398 | _gChain("Cross Room/Panel_smile_lime", [kRedMiddle, kYellowMiddle]) | ||
| 399 | _gChain("Cross Room/Panel_snow_won", [kRedMiddle, kYellowMiddle]) | ||
| 400 | _gChain("Cross Room/Panel_warts_star", [kRedMiddle, kYellowMiddle]) | ||
| 401 | _gChain("Cross Room/Panel_pots_top", [kYellowMiddle, kRedMiddle]) | ||
| 402 | _gChain("Cross Room/Panel_silent_list", [kRedMiddle, kYellowMiddle]) | ||
| 403 | _gChain("Cross Room/Panel_silent_list_2", [kYellowMiddle, kRedMiddle]) | ||
| 404 | _gChain("Cross Room/Panel_tent_net", [kRedMiddle, kYellowMiddle]) | ||
| 405 | _gChain("Cross Room/Panel_peace_ape", [kRedMiddle, kYellowMiddle]) | ||
| 406 | _gChain("Cross Room/Panel_space_cape", [kRedMiddle, kYellowMiddle]) | ||
| 407 | _gChain("Cross Room/Panel_bowl_low", [kRedMiddle, kYellowMiddle]) | ||
| 408 | |||
| 377 | _setUniquePool("bold") | 409 | _setUniquePool("bold") |
| 378 | _gSingle("Truncate Room/Panel_sushi_hi", kRedMiddle) | 410 | _gSingle("Truncate Room/Panel_sushi_hi", kRedMiddle) |
| 379 | _gSingle("Truncate Room/Panel_thistle_this", kRedMiddle) | 411 | _gSingle("Truncate Room/Panel_thistle_this", kRedMiddle) |
| @@ -450,6 +482,8 @@ func generate(chosen_seed): | |||
| 450 | _gSingle("Naps Room/Panel_same_mace", kBlackTop) | 482 | _gSingle("Naps Room/Panel_same_mace", kBlackTop) |
| 451 | _gSingle("Naps Room/Panel_safe_face", kBlackTop) | 483 | _gSingle("Naps Room/Panel_safe_face", kBlackTop) |
| 452 | _gSingle("Naps Room/Panel_might_time", kBlackTop) | 484 | _gSingle("Naps Room/Panel_might_time", kBlackTop) |
| 485 | _gChain("Naps Room/Panel_one_none", [kWhiteTop, kBlackBottom]) | ||
| 486 | _gChain("Naps Room/Panel_one_many", [kBlackBottom, kWhiteTop]) | ||
| 453 | 487 | ||
| 454 | _setUniquePool("unchallenged") | 488 | _setUniquePool("unchallenged") |
| 455 | _setFlag(kObscureHint) | 489 | _setFlag(kObscureHint) |
| @@ -465,6 +499,7 @@ func generate(chosen_seed): | |||
| 465 | _gSingle("Challenge Room/Panel_double_anagram_4", kYellowMiddle) | 499 | _gSingle("Challenge Room/Panel_double_anagram_4", kYellowMiddle) |
| 466 | _gSingle("Challenge Room/Panel_double_anagram_5", kYellowMiddle) | 500 | _gSingle("Challenge Room/Panel_double_anagram_5", kYellowMiddle) |
| 467 | _gSingle("Challenge Room/Panel_double_anagram_6", kYellowMiddle) | 501 | _gSingle("Challenge Room/Panel_double_anagram_6", kYellowMiddle) |
| 502 | _gChain("Challenge Room/Panel_tales_stale", [kOrangeMiddle, kYellowMiddle]) | ||
| 468 | 503 | ||
| 469 | _setUniquePool("ecstatic") | 504 | _setUniquePool("ecstatic") |
| 470 | _gSingle("Smiley Room/Panel_anagram_7_1", kYellowTop) | 505 | _gSingle("Smiley Room/Panel_anagram_7_1", kYellowTop) |
| @@ -529,6 +564,7 @@ func generate(chosen_seed): | |||
| 529 | _gSingle("Painting Room/Panel_any_many", kBlueMiddle) | 564 | _gSingle("Painting Room/Panel_any_many", kBlueMiddle) |
| 530 | _gSingle("Painting Room/Panel_man_many", kBlueMiddle) | 565 | _gSingle("Painting Room/Panel_man_many", kBlueMiddle) |
| 531 | _clearFlag(kShortAnswer) | 566 | _clearFlag(kShortAnswer) |
| 567 | _gSingle("Painting Room/Panel_runts_turns", kYellowMiddle) | ||
| 532 | _gOrangeAddition("Painting Room/Panel_send_use_turns") | 568 | _gOrangeAddition("Painting Room/Panel_send_use_turns") |
| 533 | _gOrangeWord("Painting Room/Panel_trust_06890") | 569 | _gOrangeWord("Painting Room/Panel_trust_06890") |
| 534 | _gOrangeNumber("Painting Room/Panel_06890_trust") | 570 | _gOrangeNumber("Painting Room/Panel_06890_trust") |
| @@ -638,6 +674,9 @@ func generate(chosen_seed): | |||
| 638 | _gPaintingPuzzle("Panel Room/Panel_painting_owl", "owl_painting_gray") | 674 | _gPaintingPuzzle("Panel Room/Panel_painting_owl", "owl_painting_gray") |
| 639 | _gPaintingPuzzle("Panel Room/Panel_painting_panda", "panda_painting_gray") | 675 | _gPaintingPuzzle("Panel Room/Panel_painting_panda", "panda_painting_gray") |
| 640 | 676 | ||
| 677 | _gStack2("Open Areas/Panel_angered_enraged", kYellowMiddle, "", kWhiteBottom) | ||
| 678 | _gStack2("Open Areas/Panel_vote_veto", kYellowMiddle, "", kBlackBottom) | ||
| 679 | |||
| 641 | _setFlag(kObscureHint) | 680 | _setFlag(kObscureHint) |
| 642 | _gSingle("Entry Room/Panel_forward_forward", kWhiteMiddle) | 681 | _gSingle("Entry Room/Panel_forward_forward", kWhiteMiddle) |
| 643 | _gSingle("Entry Room/Panel_between_between", kWhiteMiddle) | 682 | _gSingle("Entry Room/Panel_between_between", kWhiteMiddle) |
| @@ -663,6 +702,16 @@ func generate(chosen_seed): | |||
| 663 | 702 | ||
| 664 | _gSingle("Double Room/Panel_leap_leap", kWhiteMiddle) | 703 | _gSingle("Double Room/Panel_leap_leap", kWhiteMiddle) |
| 665 | 704 | ||
| 705 | _gPaired("Appendix Room/Panel_left_left", "Appendix Room/Panel_right_right", kWhiteMiddle) | ||
| 706 | |||
| 707 | _gSingle("Hallway Room/Panel_hollow_hollow", kWhiteMiddle) | ||
| 708 | _gSingle("Hallway Room/Panel_out_out", kWhiteMiddle) | ||
| 709 | |||
| 710 | _gSingle("Open Areas/Panel_staircase", kWhiteMiddle) | ||
| 711 | _gSingle("Open Areas/Panel_smile_smile", kWhiteMiddle) | ||
| 712 | _gSingle("Open Areas/Panel_undistracted", kWhiteMiddle) | ||
| 713 | _gSingle("Open Areas/Panel_stargazer_stargazer", kWhiteMiddle) | ||
| 714 | |||
| 666 | _gSingle("Backside Room/Panel_backside_1", kWhiteMiddle) | 715 | _gSingle("Backside Room/Panel_backside_1", kWhiteMiddle) |
| 667 | _gSingle("Backside Room/Panel_backside_2", kWhiteMiddle) | 716 | _gSingle("Backside Room/Panel_backside_2", kWhiteMiddle) |
| 668 | _gSingle("Backside Room/Panel_backside_3", kWhiteMiddle) | 717 | _gSingle("Backside Room/Panel_backside_3", kWhiteMiddle) |
| @@ -673,6 +722,8 @@ func generate(chosen_seed): | |||
| 673 | _gSingle("Backside Room/Panel_second_second", kWhiteMiddle) | 722 | _gSingle("Backside Room/Panel_second_second", kWhiteMiddle) |
| 674 | _gSingle("Backside Room/Panel_third_third", kWhiteMiddle) | 723 | _gSingle("Backside Room/Panel_third_third", kWhiteMiddle) |
| 675 | _gSingle("Backside Room/Panel_fourth_fourth", kWhiteMiddle) | 724 | _gSingle("Backside Room/Panel_fourth_fourth", kWhiteMiddle) |
| 725 | _gSingle("Backside Room/Panel_paranoid_paranoid", kWhiteMiddle) | ||
| 726 | _gPaired("Backside Room/Panel_salt_pepper", "Backside Room/Panel_pepper_salt", kBlackBottom) | ||
| 676 | 727 | ||
| 677 | _gExactLength("Backside Room/Panel_four_four", kWhiteMiddle, 4) | 728 | _gExactLength("Backside Room/Panel_four_four", kWhiteMiddle, 4) |
| 678 | _gExactLength("Backside Room/Panel_four_four_2", kWhiteMiddle, 4) | 729 | _gExactLength("Backside Room/Panel_four_four_2", kWhiteMiddle, 4) |
| @@ -728,10 +779,18 @@ func generate(chosen_seed): | |||
| 728 | 779 | ||
| 729 | func apply(scene): | 780 | func apply(scene): |
| 730 | var panels_parent = scene.get_node("Panels") | 781 | var panels_parent = scene.get_node("Panels") |
| 782 | var found_panels = [] | ||
| 731 | for puzzle in panel_mapping: | 783 | for puzzle in panel_mapping: |
| 732 | var panel = panels_parent.get_node(puzzle[0]) | 784 | var panel = panels_parent.get_node(puzzle[0]) |
| 733 | panel.text = puzzle[1] | 785 | panel.text = puzzle[1] |
| 734 | panel.answer = puzzle[2] | 786 | panel.answer = puzzle[2] |
| 787 | found_panels.append(puzzle[0]) | ||
| 788 | |||
| 789 | for panel_group in panels_parent.get_children(): | ||
| 790 | for panel_panel in panel_group.get_children(): | ||
| 791 | var relpath = String(panels_parent.get_path_to(panel_panel)) | ||
| 792 | if !found_panels.has(relpath): | ||
| 793 | print("Unrandomized: %s" % relpath) | ||
| 735 | 794 | ||
| 736 | for mapping in painting_mapping: | 795 | for mapping in painting_mapping: |
| 737 | var scene_path = "res://nodes/paintings/%s.tscn" % mapping[1] | 796 | var scene_path = "res://nodes/paintings/%s.tscn" % mapping[1] |
| @@ -880,7 +939,57 @@ func _gStack2(panel1_path, puzzle_type1, panel2_path, puzzle_type2): | |||
| 880 | var hint2_choices = _puzzle_by_id[answer_id][1][puzzle_type2] | 939 | var hint2_choices = _puzzle_by_id[answer_id][1][puzzle_type2] |
| 881 | var hint2_id = _pickRandom(hint2_choices) | 940 | var hint2_id = _pickRandom(hint2_choices) |
| 882 | _setPanel(panel1_path, hint1_id, answer_id) | 941 | _setPanel(panel1_path, hint1_id, answer_id) |
| 883 | _setPanel(panel2_path, hint2_id, answer_id) | 942 | if panel2_path != "": |
| 943 | _setPanel(panel2_path, hint2_id, answer_id) | ||
| 944 | |||
| 945 | |||
| 946 | func _gChain(panel_path, puzzle_types): | ||
| 947 | var remaining = [] | ||
| 948 | puzzle_types.invert() | ||
| 949 | for ptype in puzzle_types: | ||
| 950 | if remaining.empty(): | ||
| 951 | for answer in _answers_by_type[ptype]: | ||
| 952 | for choice in _puzzle_by_id[answer][1][ptype]: | ||
| 953 | remaining.append([choice, answer]) | ||
| 954 | elif ptype == kOrangeMiddle: | ||
| 955 | var newrem = [] | ||
| 956 | for puzzle in remaining: | ||
| 957 | if _generated_puzzles.wanderlust.has(puzzle[0]): | ||
| 958 | newrem.append(puzzle) | ||
| 959 | if newrem.empty(): | ||
| 960 | print("No possible puzzles for panel %s" % panel_path) | ||
| 961 | return | ||
| 962 | remaining = newrem | ||
| 963 | else: | ||
| 964 | var newrem = [] | ||
| 965 | for puzzle in remaining: | ||
| 966 | if _puzzle_by_id[puzzle[0]][1].has(ptype): | ||
| 967 | for choice in _puzzle_by_id[puzzle[0]][1][ptype]: | ||
| 968 | newrem.append([choice, puzzle[1]]) | ||
| 969 | if newrem.empty(): | ||
| 970 | print("No possible puzzles for panel %s" % panel_path) | ||
| 971 | return | ||
| 972 | remaining = newrem | ||
| 973 | var just_answers = [] | ||
| 974 | var hints_by_answer = {} | ||
| 975 | for puzzle in remaining: | ||
| 976 | if !just_answers.has(puzzle[1]): | ||
| 977 | just_answers.append(puzzle[1]) | ||
| 978 | hints_by_answer[puzzle[1]] = [puzzle[0]] | ||
| 979 | else: | ||
| 980 | hints_by_answer[puzzle[1]].append(puzzle[0]) | ||
| 981 | var puzzle_choices = _filterBestPuzzles(just_answers) | ||
| 982 | if puzzle_choices.empty(): | ||
| 983 | print("No possible puzzles for panel %s" % panel_path) | ||
| 984 | else: | ||
| 985 | var answer_id = _pickRandom(puzzle_choices) | ||
| 986 | var hint_choices = hints_by_answer[answer_id] | ||
| 987 | var hint_id = _pickRandom(hint_choices) | ||
| 988 | if puzzle_types[puzzle_types.size()-1] == kOrangeMiddle: | ||
| 989 | var hint = _applyCipher(_answer_by_id[hint_id]) | ||
| 990 | _writePanel(panel_path, hint, _answer_by_id[answer_id]) | ||
| 991 | else: | ||
| 992 | _setPanel(panel_path, hint_id, answer_id) | ||
| 884 | 993 | ||
| 885 | 994 | ||
| 886 | func _gCopy(panel1_path, panel2_path): | 995 | func _gCopy(panel1_path, panel2_path): |
| @@ -978,6 +1087,8 @@ func _filterBestPuzzles(input): | |||
| 978 | continue | 1087 | continue |
| 979 | if _isFlag(kShortAnswer) and _answer_by_id[word_id].length() > 4: | 1088 | if _isFlag(kShortAnswer) and _answer_by_id[word_id].length() > 4: |
| 980 | continue | 1089 | continue |
| 1090 | if _isFlag(kForcePalindrome) and _answer_by_id[word_id] != _reverseString(_answer_by_id[word_id]): | ||
| 1091 | continue | ||
| 981 | acceptable.append(word_id) | 1092 | acceptable.append(word_id) |
| 982 | #if _isFlag(kMustReuseAnswer): | 1093 | #if _isFlag(kMustReuseAnswer): |
| 983 | # var possible = [] | 1094 | # var possible = [] |
| @@ -1029,3 +1140,10 @@ func _writePanel(panel_path, hint, answer): | |||
| 1029 | _answer_by_path[panel_path] = answer | 1140 | _answer_by_path[panel_path] = answer |
| 1030 | _total_generated += 1 | 1141 | _total_generated += 1 |
| 1031 | emit_signal("generator_status", "Generating puzzles... (%d/?)" % _total_generated) | 1142 | emit_signal("generator_status", "Generating puzzles... (%d/?)" % _total_generated) |
| 1143 | |||
| 1144 | |||
| 1145 | func _reverseString(s): | ||
| 1146 | var r = "" | ||
| 1147 | for i in range(s.length()-1, -1, -1): | ||
| 1148 | r += s[i] | ||
| 1149 | return r | ||
