diff options
Diffstat (limited to 'Archipelago')
| -rw-r--r-- | Archipelago/client.gd | 2 | ||||
| -rw-r--r-- | Archipelago/generator.gd | 1027 | ||||
| -rw-r--r-- | Archipelago/load.gd | 7 | ||||
| -rw-r--r-- | Archipelago/settings_screen.gd | 46 |
4 files changed, 1080 insertions, 2 deletions
| diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 85cfd05..390b14d 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd | |||
| @@ -2,6 +2,7 @@ extends Node | |||
| 2 | 2 | ||
| 3 | var SCRIPT_doorControl | 3 | var SCRIPT_doorControl |
| 4 | var SCRIPT_effects | 4 | var SCRIPT_effects |
| 5 | var SCRIPT_generator | ||
| 5 | var SCRIPT_location | 6 | var SCRIPT_location |
| 6 | var SCRIPT_multiplayer | 7 | var SCRIPT_multiplayer |
| 7 | var SCRIPT_mypainting | 8 | var SCRIPT_mypainting |
| @@ -53,6 +54,7 @@ const kPILGRIMAGE = 3 | |||
| 53 | 54 | ||
| 54 | const kNO_PANEL_SHUFFLE = 0 | 55 | const kNO_PANEL_SHUFFLE = 0 |
| 55 | const kREARRANGE_PANELS = 1 | 56 | const kREARRANGE_PANELS = 1 |
| 57 | const kEXPERIMENTAL_PANELS = 2 | ||
| 56 | 58 | ||
| 57 | const kCLASSIFICATION_LOCAL_NORMAL = 1 | 59 | const kCLASSIFICATION_LOCAL_NORMAL = 1 |
| 58 | const kCLASSIFICATION_LOCAL_REDUCED = 2 | 60 | const kCLASSIFICATION_LOCAL_REDUCED = 2 |
| diff --git a/Archipelago/generator.gd b/Archipelago/generator.gd new file mode 100644 index 0000000..2aeca82 --- /dev/null +++ b/Archipelago/generator.gd | |||
| @@ -0,0 +1,1027 @@ | |||
| 1 | extends Node | ||
| 2 | |||
| 3 | var panel_mapping = [] | ||
| 4 | var painting_mapping = [] | ||
| 5 | var steady_mapping = [] | ||
| 6 | var gen_seed | ||
| 7 | var is_set_seed = false | ||
| 8 | |||
| 9 | var _gen_forms | ||
| 10 | var _gen_paintings | ||
| 11 | var _gen_wanderlust | ||
| 12 | var _gen_addition | ||
| 13 | var _gen_walls | ||
| 14 | var _gen_combos | ||
| 15 | |||
| 16 | var _answer_by_id | ||
| 17 | var _answers_by_type | ||
| 18 | var _answers_by_length | ||
| 19 | var _puzzle_by_id | ||
| 20 | var _rng | ||
| 21 | var _flags = 0 | ||
| 22 | var _total_generated = 0 | ||
| 23 | var _hint_by_path = {} | ||
| 24 | var _answer_by_path = {} | ||
| 25 | var _painting_puzzles = [] | ||
| 26 | var _chain_cache = {} | ||
| 27 | var _short_answer_length = 4 | ||
| 28 | |||
| 29 | var _unique_pool = "" | ||
| 30 | var _answers_by_unique_pool = {} | ||
| 31 | var _needs_reuse = [] | ||
| 32 | var _possible_reuse = [] | ||
| 33 | |||
| 34 | var _cur_panel = "" | ||
| 35 | |||
| 36 | const kOrangeMiddle = -2 | ||
| 37 | const kWhiteMiddle = -1 | ||
| 38 | const kWhiteTop = 0 | ||
| 39 | const kWhiteBottom = 1 | ||
| 40 | const kYellowTop = 2 | ||
| 41 | const kYellowMiddle = 3 | ||
| 42 | const kBlackTop = 4 | ||
| 43 | const kBlackMiddle = 5 | ||
| 44 | const kBlackBottom = 6 | ||
| 45 | const kDoubleBlackBottom = 7 | ||
| 46 | const kRedTop = 8 | ||
| 47 | const kRedMiddle = 9 | ||
| 48 | const kRedBottom = 10 | ||
| 49 | const kBlueTop = 11 | ||
| 50 | const kBlueMiddle = 12 | ||
| 51 | const kBlueBottom = 13 | ||
| 52 | const kPurpleTop = 14 | ||
| 53 | const kPurpleMiddle = 15 | ||
| 54 | const kColorIs = 16 | ||
| 55 | |||
| 56 | const kPuzzleTypes = [ | ||
| 57 | kWhiteMiddle, | ||
| 58 | kWhiteTop, | ||
| 59 | kWhiteBottom, | ||
| 60 | kYellowTop, | ||
| 61 | kYellowMiddle, | ||
| 62 | kBlackTop, | ||
| 63 | kBlackMiddle, | ||
| 64 | kBlackBottom, | ||
| 65 | kDoubleBlackBottom, | ||
| 66 | kRedTop, | ||
| 67 | kRedMiddle, | ||
| 68 | kRedBottom, | ||
| 69 | kBlueTop, | ||
| 70 | kBlueMiddle, | ||
| 71 | kBlueBottom, | ||
| 72 | kPurpleTop, | ||
| 73 | kPurpleMiddle, | ||
| 74 | kColorIs | ||
| 75 | ] | ||
| 76 | |||
| 77 | const kMustReuseAnswer = 1 | ||
| 78 | const kObscureHint = 2 | ||
| 79 | const kShortAnswer = 4 | ||
| 80 | const kForcePalindrome = 8 | ||
| 81 | |||
| 82 | signal generator_status | ||
| 83 | |||
| 84 | |||
| 85 | func _init(gen_puzzles): | ||
| 86 | _gen_forms = gen_puzzles[0] | ||
| 87 | _gen_paintings = gen_puzzles[1] | ||
| 88 | _gen_wanderlust = gen_puzzles[2] | ||
| 89 | _gen_addition = gen_puzzles[3] | ||
| 90 | _gen_walls = gen_puzzles[4] | ||
| 91 | _gen_combos = gen_puzzles[5] | ||
| 92 | |||
| 93 | |||
| 94 | func generate(chosen_seed): | ||
| 95 | emit_signal("generator_status", "Generating puzzles...") | ||
| 96 | |||
| 97 | _flags = 0 | ||
| 98 | _total_generated = 0 | ||
| 99 | |||
| 100 | # Seed the random number generator. | ||
| 101 | if chosen_seed == "": | ||
| 102 | var seed_rng = RandomNumberGenerator.new() | ||
| 103 | seed_rng.randomize() | ||
| 104 | gen_seed = seed_rng.randi_range(0, 999999) | ||
| 105 | is_set_seed = false | ||
| 106 | else: | ||
| 107 | gen_seed = int(chosen_seed) | ||
| 108 | is_set_seed = true | ||
| 109 | |||
| 110 | _rng = RandomNumberGenerator.new() | ||
| 111 | _rng.seed = gen_seed | ||
| 112 | |||
| 113 | # Create some helpful indexes. | ||
| 114 | _answer_by_id = [] | ||
| 115 | _answers_by_type = {} | ||
| 116 | _answers_by_length = {} | ||
| 117 | _puzzle_by_id = [] | ||
| 118 | _hint_by_path = {} | ||
| 119 | _answer_by_path = {} | ||
| 120 | _painting_puzzles = _gen_paintings | ||
| 121 | var openable_answers = [] | ||
| 122 | |||
| 123 | for puzzle_type in kPuzzleTypes: | ||
| 124 | _answers_by_type[puzzle_type] = [] | ||
| 125 | |||
| 126 | var puzzle_id = 0 | ||
| 127 | for puzzle in _gen_forms: | ||
| 128 | _answers_by_type[kWhiteMiddle].append(puzzle_id) | ||
| 129 | |||
| 130 | match typeof(puzzle): | ||
| 131 | TYPE_ARRAY: | ||
| 132 | _answer_by_id.append(puzzle[0]) | ||
| 133 | if not _answers_by_length.has(puzzle[0].length()): | ||
| 134 | _answers_by_length[puzzle[0].length()] = [] | ||
| 135 | _answers_by_length[puzzle[0].length()].append(puzzle_id) | ||
| 136 | _puzzle_by_id.append(puzzle) | ||
| 137 | |||
| 138 | for puzzle_type in puzzle[1].keys(): | ||
| 139 | _answers_by_type[puzzle_type].append(puzzle_id) | ||
| 140 | |||
| 141 | if ( | ||
| 142 | puzzle[1].has(kYellowMiddle) | ||
| 143 | and puzzle[1].has(kBlackBottom) | ||
| 144 | and puzzle[1].has(kRedMiddle) | ||
| 145 | and puzzle[1].has(kBlueMiddle) | ||
| 146 | and puzzle[1].has(kPurpleMiddle) | ||
| 147 | ): | ||
| 148 | openable_answers.append(puzzle_id) | ||
| 149 | TYPE_STRING: | ||
| 150 | _answer_by_id.append(puzzle) | ||
| 151 | if not _answers_by_length.has(puzzle.length()): | ||
| 152 | _answers_by_length[puzzle.length()] = [] | ||
| 153 | _answers_by_length[puzzle.length()].append(puzzle_id) | ||
| 154 | _puzzle_by_id.append([puzzle, []]) | ||
| 155 | |||
| 156 | puzzle_id += 1 | ||
| 157 | |||
| 158 | # Choose the answer for the OPEN panels. | ||
| 159 | # There is a hedge maze OPEN but we can't randomize those yet. | ||
| 160 | var open_answer_id = _pickRandom(openable_answers) | ||
| 161 | |||
| 162 | _setUniquePool("agreeable") | ||
| 163 | _setPanel( | ||
| 164 | "Antonym Room/Panel_close_open", | ||
| 165 | _pickRandom(_puzzle_by_id[open_answer_id][1][kBlackBottom]), | ||
| 166 | open_answer_id | ||
| 167 | ) | ||
| 168 | |||
| 169 | _setUniquePool("seeker") | ||
| 170 | _setFlag(kObscureHint) | ||
| 171 | _setPanel("Heteronym Room/Panel_entrance_entrance", open_answer_id, open_answer_id) | ||
| 172 | _clearFlag(kObscureHint) | ||
| 173 | |||
| 174 | _setUniquePool("traveled") | ||
| 175 | _setPanel("Synonym Room/Panel_open_open", open_answer_id, open_answer_id) | ||
| 176 | |||
| 177 | _setUniquePool("discerning") | ||
| 178 | _setPanel( | ||
| 179 | "Sun Room/Panel_nope_open", | ||
| 180 | _pickRandom(_puzzle_by_id[open_answer_id][1][kYellowMiddle]), | ||
| 181 | open_answer_id | ||
| 182 | ) | ||
| 183 | |||
| 184 | _setUniquePool("bold") | ||
| 185 | _setPanel( | ||
| 186 | "Truncate Room/Panel_unopened_open", | ||
| 187 | _pickRandom(_puzzle_by_id[open_answer_id][1][kRedMiddle]), | ||
| 188 | open_answer_id | ||
| 189 | ) | ||
| 190 | |||
| 191 | _setUniquePool("undeterred") | ||
| 192 | _setPanel( | ||
| 193 | "Blue Room/Panel_pen_open", | ||
| 194 | _pickRandom(_puzzle_by_id[open_answer_id][1][kBlueMiddle]), | ||
| 195 | open_answer_id | ||
| 196 | ) | ||
| 197 | |||
| 198 | _setUniquePool("initiated") | ||
| 199 | _setPanel( | ||
| 200 | "Rhyme Room/Panel_locked_knocked", | ||
| 201 | _pickRandom(_puzzle_by_id[open_answer_id][1][kPurpleMiddle]), | ||
| 202 | open_answer_id | ||
| 203 | ) | ||
| 204 | |||
| 205 | _setUniquePool("scientific") | ||
| 206 | _setPanel("Chemistry Room/Panel_open", open_answer_id, open_answer_id) | ||
| 207 | _setPanel( | ||
| 208 | "Chemistry Room/Panel_close", | ||
| 209 | _pickRandom(_puzzle_by_id[open_answer_id][1][kBlackBottom]), | ||
| 210 | open_answer_id | ||
| 211 | ) | ||
| 212 | |||
| 213 | _setUniquePool("agreeable") | ||
| 214 | _gSingle("Antonym Room/Panel_retool_looter", kBlackMiddle) | ||
| 215 | _gSingle("Antonym Room/Panel_drawer_reward", kBlackMiddle) | ||
| 216 | _gSingle("Antonym Room/Panel_stressed_desserts", kBlackMiddle) | ||
| 217 | _gSingle("Antonym Room/Panel_star_rats", kBlackMiddle) | ||
| 218 | |||
| 219 | _setUniquePool("seeker") | ||
| 220 | #_setFlag(kObscureHint) | ||
| 221 | _gSingle("Heteronym Room/Panel_bear_bear", kWhiteMiddle) | ||
| 222 | _gSingle("Heteronym Room/Panel_bow_bow", kWhiteMiddle) | ||
| 223 | _gSingle("Heteronym Room/Panel_does_does", kWhiteMiddle) | ||
| 224 | _gDouble("Heteronym Room/Panel_mine_mine", "Heteronym Room/Panel_mine_mine_2", kWhiteMiddle) | ||
| 225 | _gDouble( | ||
| 226 | "Heteronym Room/Panel_mobile_mobile", "Heteronym Room/Panel_mobile_mobile_2", kWhiteMiddle | ||
| 227 | ) | ||
| 228 | _gStack2( | ||
| 229 | "Heteronym Room/Panel_desert_dessert", | ||
| 230 | kWhiteTop, | ||
| 231 | "Heteronym Room/Panel_desert_desert", | ||
| 232 | kWhiteMiddle | ||
| 233 | ) | ||
| 234 | _gStack2("Heteronym Room/Panel_sow_so", kWhiteTop, "Heteronym Room/Panel_sow_sow", kWhiteMiddle) | ||
| 235 | #_clearFlag(kObscureHint) | ||
| 236 | |||
| 237 | _setUniquePool("tenacious") | ||
| 238 | _gSingle("Palindrome Room/Panel_slaughter_laughter", kRedMiddle) | ||
| 239 | _gSingle("Palindrome Room/Panel_dread_dead", kRedMiddle) | ||
| 240 | _gSingle("Palindrome Room/Panel_massacred_sacred", kRedMiddle) | ||
| 241 | _gSingle("Palindrome Room/Panel_decay_day", kRedMiddle) | ||
| 242 | |||
| 243 | _setFlag(kForcePalindrome) | ||
| 244 | _gSingle("Palindrome Room/Panel_solos_solos", kWhiteMiddle) | ||
| 245 | _gSingle("Palindrome Room/Panel_racecar_racecar", kWhiteMiddle) | ||
| 246 | _gSingle("Palindrome Room/Panel_level_level", kWhiteMiddle) | ||
| 247 | _gCopyHidden("Palindrome Room/Panel_solos_solos", "Palindrome Room/Panel_solos_solos_2") | ||
| 248 | _gCopyHidden("Palindrome Room/Panel_racecar_racecar", "Palindrome Room/Panel_racecar_racecar_2") | ||
| 249 | _gCopyHidden("Palindrome Room/Panel_level_level", "Palindrome Room/Panel_level_level_2") | ||
| 250 | _clearFlag(kForcePalindrome) | ||
| 251 | |||
| 252 | _setUniquePool("discerning") | ||
| 253 | _gSingle("Sun Room/Panel_hits_this", kYellowMiddle) | ||
| 254 | _gSingle("Sun Room/Panel_adder_dread", kYellowMiddle) | ||
| 255 | _gSingle("Sun Room/Panel_laughters_slaughter", kYellowMiddle) | ||
| 256 | _gSingle("Sun Room/Panel_rat_art", kYellowMiddle) | ||
| 257 | _gSingle("Sun Room/Panel_dusty_study", kYellowMiddle) | ||
| 258 | _gSingle("Sun Room/Panel_state_taste", kYellowMiddle) | ||
| 259 | _gSingle("Sun Room/Panel_react_trace", kYellowMiddle) | ||
| 260 | _gSingle("Sun Room/Panel_seam_same", kYellowMiddle) | ||
| 261 | _gDouble("Sun Room/Panel_warred_drawer", "Sun Room/Panel_redraw_drawer", kYellowMiddle) | ||
| 262 | _gDouble("Sun Room/Panel_stone_notes", "Sun Room/Panel_onset_notes", kYellowMiddle) | ||
| 263 | _gDouble("Sun Room/Panel_arts_star", "Sun Room/Panel_tsar_star", kYellowMiddle) | ||
| 264 | _gDouble("Sun Room/Panel_dear_read", "Sun Room/Panel_dare_read", kYellowMiddle) | ||
| 265 | |||
| 266 | _setUniquePool("bearer") | ||
| 267 | _setFlag(kShortAnswer) | ||
| 268 | _short_answer_length = 6 | ||
| 269 | _gChain("Cross Room/Panel_part_rap", [kRedMiddle, kYellowMiddle]) | ||
| 270 | _gChain("Cross Room/Panel_heart_tar", [kRedMiddle, kYellowMiddle]) | ||
| 271 | _gChain("Cross Room/Panel_smile_lime", [kRedMiddle, kYellowMiddle]) | ||
| 272 | _gChain("Cross Room/Panel_snow_won", [kRedMiddle, kYellowMiddle]) | ||
| 273 | _gChain("Cross Room/Panel_warts_star", [kRedMiddle, kYellowMiddle]) | ||
| 274 | _gChain("Cross Room/Panel_pots_top", [kYellowMiddle, kRedMiddle]) | ||
| 275 | _gChain("Cross Room/Panel_silent_list", [kRedMiddle, kYellowMiddle]) | ||
| 276 | _gChain("Cross Room/Panel_silent_list_2", [kYellowMiddle, kRedMiddle]) | ||
| 277 | _gChain("Cross Room/Panel_tent_net", [kRedMiddle, kYellowMiddle]) | ||
| 278 | _gChain("Cross Room/Panel_peace_ape", [kRedMiddle, kYellowMiddle]) | ||
| 279 | _gChain("Cross Room/Panel_space_cape", [kRedMiddle, kYellowMiddle]) | ||
| 280 | _gChain("Cross Room/Panel_bowl_low", [kRedMiddle, kYellowMiddle]) | ||
| 281 | _clearFlag(kShortAnswer) | ||
| 282 | |||
| 283 | _setUniquePool("bold") | ||
| 284 | _gSingle("Truncate Room/Panel_sushi_hi", kRedMiddle) | ||
| 285 | _gSingle("Truncate Room/Panel_thistle_this", kRedMiddle) | ||
| 286 | _gDouble("Truncate Room/Panel_undead_dead", "Truncate Room/Panel_deadline_dead", kRedMiddle) | ||
| 287 | _gDouble("Truncate Room/Panel_landmass_mass", "Truncate Room/Panel_massacred_mass", kRedMiddle) | ||
| 288 | |||
| 289 | _gSingle("Challenge Room/Panel_welcome_welcome", kWhiteMiddle) | ||
| 290 | _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"]) | ||
| 291 | |||
| 292 | _setUniquePool("steady") | ||
| 293 | _gSteady("Rock Room/Panel_limelight_lime", kRedMiddle) | ||
| 294 | _gSteady("Rock Room/Panel_blue_blueberry", kBlueMiddle) | ||
| 295 | _gSteady("Rock Room/Panel_lump_plum", kYellowMiddle) | ||
| 296 | _gSteady("Rock Room/Panel_hairy_cherry", kBlueTop) | ||
| 297 | _gSteady("Rock Room/Panel_blue_orange", kBlackBottom) | ||
| 298 | _gSteady("Rock Room/Panel_melon_lemon", kYellowMiddle) | ||
| 299 | _gSteady("Rock Room/Panel_herald_emerald", kPurpleMiddle) | ||
| 300 | _gSteady("Rock Room/Panel_sap_sapphire", kBlueMiddle) | ||
| 301 | _gSteady("Rock Room/Panel_thistle_amethyst", kPurpleTop) | ||
| 302 | _gSteady("Rock Room/Panel_bury_ruby", kYellowMiddle) | ||
| 303 | _gSteady("Rock Room/Panel_antechamber_amber", kRedMiddle) | ||
| 304 | _gSteady("Rock Room/Panel_top_topaz", kBlueMiddle) | ||
| 305 | _gSteady("Rock Room/Panel_lielack_lilac", kWhiteTop) | ||
| 306 | _gSteady("Rock Room/Panel_soar_rose", kBlackTop) | ||
| 307 | _gSteady("Rock Room/Panel_incarnation_carnation", kRedMiddle) | ||
| 308 | _gSteady("Rock Room/Panel_sun_sunflower", kBlueMiddle) | ||
| 309 | |||
| 310 | _clearUniquePool() | ||
| 311 | |||
| 312 | _gPaired("Shuffle Room/Panel_sword_words", "Shuffle Room/Panel_words_sword", kYellowMiddle) | ||
| 313 | _gPaired("Shuffle Room/Panel_turn_runt", "Shuffle Room/Panel_turn_runt2", kYellowMiddle) | ||
| 314 | _gPaired("Shuffle Room/Panel_lost_lots", "Shuffle Room/Panel_lost_slot", kYellowMiddle) | ||
| 315 | _gDouble("Shuffle Room/Panel_amen_mean", "Shuffle Room/Panel_name_mean", kYellowMiddle) | ||
| 316 | _gSingle("Shuffle Room/Panel_eyes_see_shuffle", kYellowMiddle) | ||
| 317 | _gSingle("Shuffle Room/Panel_behind", kYellowMiddle) | ||
| 318 | _gPaired("Shuffle Room/Panel_left_left", "Shuffle Room/Panel_right_right", kWhiteMiddle) | ||
| 319 | _gSingle("Shuffle Room/Panel_middle_middle", kWhiteMiddle) | ||
| 320 | _gCopy("Shuffle Room/Panel_left_left", "Shuffle Room/Panel_left_left_2") | ||
| 321 | _gCopy("Shuffle Room/Panel_right_right", "Shuffle Room/Panel_right_right_2") | ||
| 322 | _gCopy("Shuffle Room/Panel_middle_middle", "Shuffle Room/Panel_middle_middle_2") | ||
| 323 | _gSingle("Shuffle Room/Panel_shortcuts", kYellowMiddle) | ||
| 324 | _gSingle("Shuffle Room/Panel_tower", kYellowMiddle) | ||
| 325 | _gPaired("Shuffle Room/Panel_far_far", "Shuffle Room/Panel_near_near", kWhiteMiddle) | ||
| 326 | |||
| 327 | _gSingle("Maze Room/Panel_reflow_flower", kYellowMiddle) | ||
| 328 | |||
| 329 | _gSingle("Appendix Room/Panel_rat_tar", kBlackMiddle) | ||
| 330 | |||
| 331 | _gSingle("Painting Room/Panel_eon_one", kYellowMiddle) | ||
| 332 | _gSingle("Painting Room/Panel_to_two", kRedMiddle) | ||
| 333 | _setFlag(kShortAnswer) | ||
| 334 | _short_answer_length = 4 | ||
| 335 | _gSingle("Painting Room/Panel_an_many", kBlueMiddle) | ||
| 336 | _gSingle("Painting Room/Panel_may_many", kBlueMiddle) | ||
| 337 | _gSingle("Painting Room/Panel_any_many", kBlueMiddle) | ||
| 338 | _gSingle("Painting Room/Panel_man_many", kBlueMiddle) | ||
| 339 | _clearFlag(kShortAnswer) | ||
| 340 | _gSingle("Painting Room/Panel_runts_turns", kYellowMiddle) | ||
| 341 | _gOrangeAddition("Painting Room/Panel_send_use_turns") | ||
| 342 | _gOrangeWord("Painting Room/Panel_trust_06890") | ||
| 343 | _gOrangeNumber("Painting Room/Panel_06890_trust") | ||
| 344 | _writePanel("Painting Room/Panel_order_onepathmanyturns", "order", "%s road %s %s" % [_answer_by_path["Painting Room/Panel_eon_one"], _answer_by_path["Painting Room/Panel_any_many"], _answer_by_path["Painting Room/Panel_send_use_turns"]]) | ||
| 345 | |||
| 346 | _gStack2("Ceiling Room/Panel_blue_top_1", kBlueTop, "Ceiling Room/Panel_red_bot_1", kRedBottom) | ||
| 347 | _gStack2( | ||
| 348 | "Ceiling Room/Panel_red_mid_2", kRedMiddle, "Ceiling Room/Panel_blue_bot_2", kBlueBottom | ||
| 349 | ) | ||
| 350 | _gStack2( | ||
| 351 | "Ceiling Room/Panel_blue_mid_3", kBlueMiddle, "Ceiling Room/Panel_red_bot_3", kRedBottom | ||
| 352 | ) | ||
| 353 | _gStack2("Ceiling Room/Panel_red_top_4", kRedTop, "Ceiling Room/Panel_blue_mid_4", kBlueMiddle) | ||
| 354 | _gStack2( | ||
| 355 | "Ceiling Room/Panel_yellow_top_5", kYellowTop, "Ceiling Room/Panel_blue_bot_5", kBlueBottom | ||
| 356 | ) | ||
| 357 | _gStack2( | ||
| 358 | "Ceiling Room/Panel_blue_top_6", kBlueTop, "Ceiling Room/Panel_yellow_mid_6", kYellowMiddle | ||
| 359 | ) | ||
| 360 | # gen_.GeneratePanelStack("", {}, "Panel_blue_mid_7", kBlue, "Panel_yellow_bot_7", kYellow); | ||
| 361 | _gStack2( | ||
| 362 | "Ceiling Room/Panel_yellow_mid_8", | ||
| 363 | kYellowMiddle, | ||
| 364 | "Ceiling Room/Panel_black_bot_8", | ||
| 365 | kBlackBottom | ||
| 366 | ) | ||
| 367 | # gen_.GeneratePanelStack("Panel_black_top_9", kBlack, "", {}, "Panel_yellow_bot_9", kYellow); | ||
| 368 | _gStack2( | ||
| 369 | "Ceiling Room/Panel_yellow_top_10", | ||
| 370 | kYellowTop, | ||
| 371 | "Ceiling Room/Panel_black_bot_10", | ||
| 372 | kBlackBottom | ||
| 373 | ) | ||
| 374 | _gStack2( | ||
| 375 | "Ceiling Room/Panel_black_top_11", | ||
| 376 | kBlackTop, | ||
| 377 | "Ceiling Room/Panel_yellow_mid_11", | ||
| 378 | kYellowMiddle | ||
| 379 | ) | ||
| 380 | _gStack2( | ||
| 381 | "Ceiling Room/Panel_black_top_12", kBlackTop, "Ceiling Room/Panel_red_bot_12", kRedBottom | ||
| 382 | ) | ||
| 383 | _gStack2( | ||
| 384 | "Ceiling Room/Panel_red_top_13", kRedTop, "Ceiling Room/Panel_black_bot_13", kBlackBottom | ||
| 385 | ) | ||
| 386 | _gStack2( | ||
| 387 | "Ceiling Room/Panel_black_mid_14", kBlackMiddle, "Ceiling Room/Panel_red_bot_14", kRedBottom | ||
| 388 | ) | ||
| 389 | _gStack2( | ||
| 390 | "Ceiling Room/Panel_black_top_15", kBlackTop, "Ceiling Room/Panel_red_mid_15", kRedMiddle | ||
| 391 | ) | ||
| 392 | #gen_.GenerateSinglePanel("Panel_answer_1", kBottom, kRed); | ||
| 393 | #_gSingle("Ceiling Room/Panel_answer_2", kBlackTop) | ||
| 394 | _writePanel("Ceiling Room/Panel_answer_1", "article", "the") | ||
| 395 | _writePanel("Ceiling Room/Panel_answer_2", "paints", "art") | ||
| 396 | _setFlag(kShortAnswer) | ||
| 397 | _short_answer_length = 4 | ||
| 398 | _gSingle("Ceiling Room/Panel_answer_3", kBlueMiddle) | ||
| 399 | _clearFlag(kShortAnswer) | ||
| 400 | _gSingle("Ceiling Room/Panel_answer_4", kBlackTop) | ||
| 401 | _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"]]) | ||
| 402 | |||
| 403 | _gExactLength("Backside Room/Panel_one_one", kWhiteMiddle, 1) | ||
| 404 | _gExactLength("Backside Room/Panel_two_two", kWhiteMiddle, 2) | ||
| 405 | _gExactLength("Backside Room/Panel_two_two_2", kWhiteMiddle, 2) | ||
| 406 | _gExactLength("Backside Room/Panel_three_three", kWhiteMiddle, 3) | ||
| 407 | _gExactLength("Backside Room/Panel_three_three_2", kWhiteMiddle, 3) | ||
| 408 | _gExactLength("Backside Room/Panel_three_three_3", kWhiteMiddle, 3) | ||
| 409 | |||
| 410 | _gSingle("Color Arrow Room/Panel_red_near", kWhiteMiddle) | ||
| 411 | _gSingle("Color Arrow Room/Panel_blue_near", kWhiteMiddle) | ||
| 412 | _gSingle("Color Arrow Room/Panel_yellow_near", kWhiteMiddle) | ||
| 413 | _gSingle("Color Arrow Room/Panel_orange_near", kWhiteMiddle) | ||
| 414 | _gSingle("Color Arrow Room/Panel_purple_near", kWhiteMiddle) | ||
| 415 | _gSingle("Color Arrow Room/Panel_green_near", kWhiteMiddle) | ||
| 416 | _gCopy("Color Arrow Room/Panel_red_near", "Color Arrow Room/Panel_red_afar") | ||
| 417 | _gCopy("Color Arrow Room/Panel_blue_near", "Color Arrow Room/Panel_blue_afar") | ||
| 418 | _gCopy("Color Arrow Room/Panel_yellow_near", "Color Arrow Room/Panel_yellow_afar") | ||
| 419 | _gCopy("Color Arrow Room/Panel_orange_near", "Color Arrow Room/Panel_orange_afar") | ||
| 420 | _gCopy("Color Arrow Room/Panel_purple_near", "Color Arrow Room/Panel_purple_afar") | ||
| 421 | _gCopy("Color Arrow Room/Panel_green_near", "Color Arrow Room/Panel_green_afar") | ||
| 422 | #painting_mapping.append(["colors_painting", "hatkirby"]) | ||
| 423 | |||
| 424 | _gOrangeNumber("Orange Room/Panel_lust") | ||
| 425 | _gOrangeNumber("Orange Room/Panel_read") | ||
| 426 | _gOrangeNumber("Orange Room/Panel_sew") | ||
| 427 | _gOrangeNumber("Orange Room/Panel_dead") | ||
| 428 | _gOrangeNumber("Tower Room/Panel_834283054_undaunted") | ||
| 429 | _gOrangeWord("Orange Room/Panel_learn") | ||
| 430 | _gOrangeWord("Orange Room/Panel_dust") | ||
| 431 | _gOrangeWord("Orange Room/Panel_star") | ||
| 432 | _gOrangeWord("Orange Room/Panel_wander") | ||
| 433 | _gOrangeWord("Tower Room/Panel_wanderlust_1234567890") | ||
| 434 | _gOrangeAddition("Tower Room/Panel_dads_ale_dead_1") | ||
| 435 | _gOrangeAddition("Tower Room/Panel_art_art_eat_2") | ||
| 436 | _gOrangeAddition("Tower Room/Panel_deer_wren_rats_3") | ||
| 437 | _gOrangeAddition("Tower Room/Panel_learns_unsew_unrest_4") | ||
| 438 | _gOrangeAddition("Tower Room/Panel_drawl_runs_enter_5") | ||
| 439 | _gOrangeAddition("Tower Room/Panel_reads_rust_lawns_6") | ||
| 440 | _gOrangeAddition("Tower Room/Panel_waded_wee_warts_7") | ||
| 441 | |||
| 442 | _gPaintingPuzzle("Panel Room/Panel_painting_flower", "flower_painting_gray") | ||
| 443 | _gPaintingPuzzle("Panel Room/Panel_painting_eye", "eye_painting_gray") | ||
| 444 | _gPaintingPuzzle("Panel Room/Panel_painting_snowman", "snowman_painting_gray") | ||
| 445 | _gPaintingPuzzle("Panel Room/Panel_painting_owl", "owl_painting_gray") | ||
| 446 | _gPaintingPuzzle("Panel Room/Panel_painting_panda", "panda_painting_gray") | ||
| 447 | |||
| 448 | _gStack2("Open Areas/Panel_angered_enraged", kYellowMiddle, "", kWhiteBottom) | ||
| 449 | _gStack2("Open Areas/Panel_vote_veto", kYellowMiddle, "", kBlackBottom) | ||
| 450 | |||
| 451 | #_setFlag(kObscureHint) | ||
| 452 | _gSingle("Entry Room/Panel_forward_forward", kWhiteMiddle) | ||
| 453 | _gSingle("Entry Room/Panel_between_between", kWhiteMiddle) | ||
| 454 | _gSingle("Entry Room/Panel_backward_backward", kWhiteMiddle) | ||
| 455 | |||
| 456 | _gPaired("Symmetry Room/Panel_leaf_feel", "Symmetry Room/Panel_feel_leaf", kBlackTop) | ||
| 457 | _gPaired("Symmetry Room/Panel_warts_straw", "Symmetry Room/Panel_straw_warts", kBlackMiddle) | ||
| 458 | _gPaired("Symmetry Room/Panel_near_far", "Symmetry Room/Panel_far_near", kBlackBottom) | ||
| 459 | _gPaired("Symmetry Room/Panel_left_right", "Symmetry Room/Panel_right_left", kBlackBottom) | ||
| 460 | |||
| 461 | _gSingle("Shuffle Room/Panel_theeyes_theeyes", kWhiteMiddle) | ||
| 462 | _gSingle("Shuffle Room/Panel_crossroads_crossroads", kWhiteMiddle) | ||
| 463 | _gSingle("Shuffle Room/Panel_corner_corner", kWhiteMiddle) | ||
| 464 | _gSingle("Shuffle Room/Panel_hollow_hollow", kWhiteMiddle) | ||
| 465 | |||
| 466 | _gSingle("Maze Room/Panel_trace_trace", kWhiteMiddle) | ||
| 467 | |||
| 468 | _gSingle("Appendix Room/Panel_deadend_deadend", kWhiteMiddle) | ||
| 469 | _gSingle("Appendix Room/Panel_lies_lies", kWhiteMiddle) | ||
| 470 | |||
| 471 | _gSingle("Cross Room/Panel_shortcut_shortcut", kWhiteMiddle) | ||
| 472 | |||
| 473 | _gSingle("Double Room/Panel_leap_leap", kWhiteMiddle) | ||
| 474 | |||
| 475 | _gPaired("Appendix Room/Panel_left_left", "Appendix Room/Panel_right_right", kWhiteMiddle) | ||
| 476 | |||
| 477 | _gSingle("Hallway Room/Panel_hollow_hollow", kWhiteMiddle) | ||
| 478 | _gSingle("Hallway Room/Panel_out_out", kWhiteMiddle) | ||
| 479 | |||
| 480 | _gSingle("Open Areas/Panel_staircase", kWhiteMiddle) | ||
| 481 | _gSingle("Open Areas/Panel_smile_smile", kWhiteMiddle) | ||
| 482 | _gSingle("Open Areas/Panel_undistracted", kWhiteMiddle) | ||
| 483 | _gSingle("Open Areas/Panel_stargazer_stargazer", kWhiteMiddle) | ||
| 484 | |||
| 485 | _gSingle("Backside Room/Panel_backside_1", kWhiteMiddle) | ||
| 486 | _gSingle("Backside Room/Panel_backside_2", kWhiteMiddle) | ||
| 487 | _gSingle("Backside Room/Panel_backside_3", kWhiteMiddle) | ||
| 488 | _gSingle("Backside Room/Panel_backside_4", kWhiteMiddle) | ||
| 489 | _gSingle("Backside Room/Panel_backside_5", kWhiteMiddle) | ||
| 490 | _gSingle("Backside Room/Panel_farther_far", kRedMiddle) | ||
| 491 | _gSingle("Backside Room/Panel_first_first", kWhiteMiddle) | ||
| 492 | _gSingle("Backside Room/Panel_second_second", kWhiteMiddle) | ||
| 493 | _gSingle("Backside Room/Panel_third_third", kWhiteMiddle) | ||
| 494 | _gSingle("Backside Room/Panel_fourth_fourth", kWhiteMiddle) | ||
| 495 | _gSingle("Backside Room/Panel_paranoid_paranoid", kWhiteMiddle) | ||
| 496 | _gPaired("Backside Room/Panel_salt_pepper", "Backside Room/Panel_pepper_salt", kBlackBottom) | ||
| 497 | |||
| 498 | _gExactLength("Backside Room/Panel_four_four", kWhiteMiddle, 4) | ||
| 499 | _gExactLength("Backside Room/Panel_four_four_2", kWhiteMiddle, 4) | ||
| 500 | _gExactLength("Backside Room/Panel_four_four_3", kWhiteMiddle, 4) | ||
| 501 | _gExactLength("Backside Room/Panel_four_four_4", kWhiteMiddle, 4) | ||
| 502 | _gExactLength("Backside Room/Panel_five_five", kWhiteMiddle, 5) | ||
| 503 | _gExactLength("Backside Room/Panel_five_five_2", kWhiteMiddle, 5) | ||
| 504 | _gExactLength("Backside Room/Panel_five_five_3", kWhiteMiddle, 5) | ||
| 505 | _gExactLength("Backside Room/Panel_five_five_4", kWhiteMiddle, 5) | ||
| 506 | _gExactLength("Backside Room/Panel_five_five_5", kWhiteMiddle, 5) | ||
| 507 | _gExactLength("Backside Room/Panel_six_six", kWhiteMiddle, 6) | ||
| 508 | _gExactLength("Backside Room/Panel_six_six_2", kWhiteMiddle, 6) | ||
| 509 | _gExactLength("Backside Room/Panel_six_six_3", kWhiteMiddle, 6) | ||
| 510 | _gExactLength("Backside Room/Panel_six_six_4", kWhiteMiddle, 6) | ||
| 511 | _gExactLength("Backside Room/Panel_six_six_5", kWhiteMiddle, 6) | ||
| 512 | _gExactLength("Backside Room/Panel_six_six_6", kWhiteMiddle, 6) | ||
| 513 | _gExactLength("Backside Room/Panel_seven_seven", kWhiteMiddle, 7) | ||
| 514 | _gExactLength("Backside Room/Panel_seven_seven_2", kWhiteMiddle, 7) | ||
| 515 | _gExactLength("Backside Room/Panel_seven_seven_3", kWhiteMiddle, 7) | ||
| 516 | _gExactLength("Backside Room/Panel_seven_seven_4", kWhiteMiddle, 7) | ||
| 517 | _gExactLength("Backside Room/Panel_seven_seven_5", kWhiteMiddle, 7) | ||
| 518 | _gExactLength("Backside Room/Panel_seven_seven_6", kWhiteMiddle, 7) | ||
| 519 | _gExactLength("Backside Room/Panel_seven_seven_7", kWhiteMiddle, 7) | ||
| 520 | _gExactLength("Backside Room/Panel_eight_eight", kWhiteMiddle, 8) | ||
| 521 | _gExactLength("Backside Room/Panel_eight_eight_2", kWhiteMiddle, 8) | ||
| 522 | _gExactLength("Backside Room/Panel_eight_eight_3", kWhiteMiddle, 8) | ||
| 523 | _gExactLength("Backside Room/Panel_eight_eight_4", kWhiteMiddle, 8) | ||
| 524 | _gExactLength("Backside Room/Panel_eight_eight_5", kWhiteMiddle, 8) | ||
| 525 | _gExactLength("Backside Room/Panel_eight_eight_6", kWhiteMiddle, 8) | ||
| 526 | _gExactLength("Backside Room/Panel_eight_eight_7", kWhiteMiddle, 8) | ||
| 527 | _gExactLength("Backside Room/Panel_eight_eight_8", kWhiteMiddle, 8) | ||
| 528 | _gExactLength("Backside Room/Panel_nine_nine", kWhiteMiddle, 9) | ||
| 529 | _gExactLength("Backside Room/Panel_nine_nine_2", kWhiteMiddle, 9) | ||
| 530 | _gExactLength("Backside Room/Panel_nine_nine_3", kWhiteMiddle, 9) | ||
| 531 | _gExactLength("Backside Room/Panel_nine_nine_4", kWhiteMiddle, 9) | ||
| 532 | _gExactLength("Backside Room/Panel_nine_nine_5", kWhiteMiddle, 9) | ||
| 533 | _gExactLength("Backside Room/Panel_nine_nine_6", kWhiteMiddle, 9) | ||
| 534 | _gExactLength("Backside Room/Panel_nine_nine_7", kWhiteMiddle, 9) | ||
| 535 | _gExactLength("Backside Room/Panel_nine_nine_8", kWhiteMiddle, 9) | ||
| 536 | _gExactLength("Backside Room/Panel_nine_nine_9", kWhiteMiddle, 9) | ||
| 537 | |||
| 538 | #_clearFlag(kObscureHint) | ||
| 539 | |||
| 540 | if _needs_reuse.size() > 0: | ||
| 541 | print("Generation failed; the following words need to be reused:") | ||
| 542 | for word_id in _needs_reuse: | ||
| 543 | print(_answer_by_id[word_id]) | ||
| 544 | |||
| 545 | print("Generated!") | ||
| 546 | for puzzle in panel_mapping: | ||
| 547 | print("%s: %s? %s!" % puzzle) | ||
| 548 | |||
| 549 | |||
| 550 | func apply(scene): | ||
| 551 | var panels_parent = scene.get_node("Panels") | ||
| 552 | var found_panels = [] | ||
| 553 | for puzzle in panel_mapping: | ||
| 554 | var panel = panels_parent.get_node(puzzle[0]) | ||
| 555 | panel.text = puzzle[1] | ||
| 556 | panel.answer = puzzle[2] | ||
| 557 | found_panels.append(puzzle[0]) | ||
| 558 | |||
| 559 | for panel_group in panels_parent.get_children(): | ||
| 560 | for panel_panel in panel_group.get_children(): | ||
| 561 | var relpath = String(panels_parent.get_path_to(panel_panel)) | ||
| 562 | if !found_panels.has(relpath): | ||
| 563 | print("Unrandomized: %s" % relpath) | ||
| 564 | |||
| 565 | for mapping in painting_mapping: | ||
| 566 | var scene_path = "res://nodes/paintings/%s.tscn" % mapping[1] | ||
| 567 | var painting_scene = load(scene_path) | ||
| 568 | var new_painting = painting_scene.instance() | ||
| 569 | new_painting.set_name("%s_new" % mapping[0]) | ||
| 570 | |||
| 571 | var old_painting = scene.get_node("Decorations/Paintings").get_node(mapping[0]) | ||
| 572 | new_painting.translation = old_painting.translation | ||
| 573 | new_painting.rotation = old_painting.rotation | ||
| 574 | |||
| 575 | scene.get_node("Decorations/Paintings").add_child(new_painting) | ||
| 576 | old_painting.queue_free() | ||
| 577 | |||
| 578 | # Randomize THE COLORFUL - WALLS | ||
| 579 | var gridmap = scene.get_node("GridMap") | ||
| 580 | var mesh_library = gridmap.mesh_library | ||
| 581 | var mapvec1 = gridmap.world_to_map(gridmap.to_local(Vector3(-14.5, 0, -95.5))) | ||
| 582 | var mapvec2 = gridmap.world_to_map(gridmap.to_local(Vector3(-9.5, 6.5, -84.5))) | ||
| 583 | var mapvec_ex = gridmap.world_to_map(gridmap.to_local(Vector3(-10.5, 0.5, -86.5))) | ||
| 584 | |||
| 585 | var walls_puzzle = _pickRandom(_gen_walls) | ||
| 586 | var mesh_item = mesh_library.find_item_by_name(walls_puzzle[1]) | ||
| 587 | |||
| 588 | for x in range(mapvec1.x, mapvec2.x + 1): | ||
| 589 | for y in range(mapvec1.y, mapvec2.y + 1): | ||
| 590 | for z in range(mapvec1.z, mapvec2.z + 1): | ||
| 591 | if gridmap.get_cell_item(x,y,z) != GridMap.INVALID_CELL_ITEM: | ||
| 592 | gridmap.set_cell_item(x, y, z, mesh_item) | ||
| 593 | |||
| 594 | gridmap.set_cell_item(mapvec_ex.x, mapvec_ex.y, mapvec_ex.z, mesh_library.find_item_by_name("MeshInstance2")) | ||
| 595 | scene.get_node("Doors/Doorway Room Doors/Door_green/Hinge/MeshInstance").set_surface_material(0, mesh_library.get_item_mesh(mesh_item).surface_get_material(0)) | ||
| 596 | |||
| 597 | var walls_puzzle_node = panels_parent.get_node("Doorways Room/Panel_path_i") | ||
| 598 | walls_puzzle_node.answer = walls_puzzle[0] | ||
| 599 | |||
| 600 | # Randomize ceilings of The Steady | ||
| 601 | var ceilings = [ | ||
| 602 | [71.5, 98.5], [64.5, 98.5], [57.5, 98.5], [50.5, 98.5], [43.5, 98.5], [36.5, 98.5], | ||
| 603 | [71.5, 91.5], [64.5, 91.5], [57.5, 91.5], [50.5, 91.5], [43.5, 91.5], [36.5, 91.5], | ||
| 604 | [57.5, 84.5], [50.5, 84.5], [43.5, 84.5], [36.5, 84.5] | ||
| 605 | ] | ||
| 606 | for i in range(0, 16): | ||
| 607 | var color_mesh = mesh_library.find_item_by_name(steady_mapping[i]) | ||
| 608 | var ceilingvec1 = gridmap.world_to_map(gridmap.to_local(Vector3(ceilings[i][0], 5.5, ceilings[i][1]))) | ||
| 609 | for x in range(ceilingvec1.x - 4, ceilingvec1.x + 1): | ||
| 610 | for z in range(ceilingvec1.z - 4, ceilingvec1.z + 1): | ||
| 611 | gridmap.set_cell_item(x, ceilingvec1.y, z, color_mesh) | ||
| 612 | |||
| 613 | |||
| 614 | func _pickRandom(set): | ||
| 615 | if set.size() == 0: | ||
| 616 | print("This is a problem: %s" % _cur_panel) | ||
| 617 | var id = _rng.randi_range(0, set.size() - 1) | ||
| 618 | return set[id] | ||
| 619 | |||
| 620 | |||
| 621 | func _setFlag(flag): | ||
| 622 | _flags |= flag | ||
| 623 | |||
| 624 | |||
| 625 | func _clearFlag(flag): | ||
| 626 | _flags &= ~flag | ||
| 627 | |||
| 628 | |||
| 629 | func _isFlag(flag): | ||
| 630 | return (_flags & flag) > 0 | ||
| 631 | |||
| 632 | |||
| 633 | func _setUniquePool(pool): | ||
| 634 | _unique_pool = pool | ||
| 635 | if not _answers_by_unique_pool.has(_unique_pool): | ||
| 636 | _answers_by_unique_pool[_unique_pool] = [] | ||
| 637 | |||
| 638 | |||
| 639 | func _clearUniquePool(): | ||
| 640 | _unique_pool = "" | ||
| 641 | |||
| 642 | |||
| 643 | func _gSingle(panel_path, puzzle_type): | ||
| 644 | _cur_panel = panel_path | ||
| 645 | if puzzle_type == kWhiteMiddle: | ||
| 646 | var word_choices = _filterBestPuzzles(_answers_by_type[kWhiteMiddle]) | ||
| 647 | var answer_id = _pickRandom(word_choices) | ||
| 648 | _setPanel(panel_path, answer_id, answer_id) | ||
| 649 | else: | ||
| 650 | var puzzle_choices = _filterBestPuzzles(_answers_by_type[puzzle_type]) | ||
| 651 | if puzzle_choices.empty(): | ||
| 652 | print("No possible puzzles for panel %s" % panel_path) | ||
| 653 | else: | ||
| 654 | var answer_id = _pickRandom(puzzle_choices) | ||
| 655 | var hint_choices = _puzzle_by_id[answer_id][1][puzzle_type] | ||
| 656 | var hint_id = _pickRandom(hint_choices) | ||
| 657 | _setPanel(panel_path, hint_id, answer_id) | ||
| 658 | |||
| 659 | |||
| 660 | func _gDouble(panel1_path, panel2_path, puzzle_type): | ||
| 661 | _cur_panel = panel1_path | ||
| 662 | if puzzle_type == kWhiteMiddle: | ||
| 663 | var word_choices = _filterBestPuzzles(_answers_by_type[kWhiteMiddle]) | ||
| 664 | var answer_id = _pickRandom(word_choices) | ||
| 665 | _setPanel(panel1_path, answer_id, answer_id) | ||
| 666 | _setPanel(panel2_path, answer_id, answer_id) | ||
| 667 | else: | ||
| 668 | var pre_choices = _filterBestPuzzles(_answers_by_type[puzzle_type]) | ||
| 669 | var puzzle_choices = [] | ||
| 670 | for word_id in pre_choices: | ||
| 671 | if _puzzle_by_id[word_id][1][puzzle_type].size() > 1: | ||
| 672 | puzzle_choices.append(word_id) | ||
| 673 | if puzzle_choices.empty(): | ||
| 674 | print("No possible puzzles for panel %s" % panel1_path) | ||
| 675 | else: | ||
| 676 | var answer_id = _pickRandom(puzzle_choices) | ||
| 677 | var hint_choices = _puzzle_by_id[answer_id][1][puzzle_type].duplicate() | ||
| 678 | var hint1_id = _pickRandom(hint_choices) | ||
| 679 | hint_choices.erase(hint1_id) | ||
| 680 | var hint2_id = _pickRandom(hint_choices) | ||
| 681 | _setPanel(panel1_path, hint1_id, answer_id) | ||
| 682 | _setPanel(panel2_path, hint2_id, answer_id) | ||
| 683 | |||
| 684 | |||
| 685 | func _gQuadruple(panel1_path, panel2_path, panel3_path, panel4_path, puzzle_type): | ||
| 686 | _cur_panel = panel1_path | ||
| 687 | var pre_choices = _filterBestPuzzles(_answers_by_type[puzzle_type]) | ||
| 688 | var puzzle_choices = [] | ||
| 689 | for word_id in pre_choices: | ||
| 690 | if _puzzle_by_id[word_id][1][puzzle_type].size() > 3: | ||
| 691 | puzzle_choices.append(word_id) | ||
| 692 | if puzzle_choices.empty(): | ||
| 693 | print("No possible puzzles for panel %s" % panel1_path) | ||
| 694 | else: | ||
| 695 | var answer_id = _pickRandom(puzzle_choices) | ||
| 696 | var hint_choices = _puzzle_by_id[answer_id][1][puzzle_type].duplicate() | ||
| 697 | var hint1_id = _pickRandom(hint_choices) | ||
| 698 | hint_choices.erase(hint1_id) | ||
| 699 | var hint2_id = _pickRandom(hint_choices) | ||
| 700 | hint_choices.erase(hint2_id) | ||
| 701 | var hint3_id = _pickRandom(hint_choices) | ||
| 702 | hint_choices.erase(hint3_id) | ||
| 703 | var hint4_id = _pickRandom(hint_choices) | ||
| 704 | _setPanel(panel1_path, hint1_id, answer_id) | ||
| 705 | _setPanel(panel2_path, hint2_id, answer_id) | ||
| 706 | _setPanel(panel3_path, hint3_id, answer_id) | ||
| 707 | _setPanel(panel4_path, hint4_id, answer_id) | ||
| 708 | |||
| 709 | |||
| 710 | func _gPaired(panel1_path, panel2_path, puzzle_type): | ||
| 711 | _cur_panel = panel1_path | ||
| 712 | var needed_type = puzzle_type | ||
| 713 | if puzzle_type == kWhiteMiddle: | ||
| 714 | needed_type = kBlackBottom | ||
| 715 | var puzzle_choices = _filterBestPuzzles(_answers_by_type[needed_type]) | ||
| 716 | if puzzle_choices.empty(): | ||
| 717 | print("No possible puzzles for panel %s" % panel1_path) | ||
| 718 | else: | ||
| 719 | var answer_id = _pickRandom(puzzle_choices) | ||
| 720 | var hint_choices = _puzzle_by_id[answer_id][1][needed_type] | ||
| 721 | var hint_id = _pickRandom(hint_choices) | ||
| 722 | if puzzle_type == kWhiteMiddle: | ||
| 723 | _setPanel(panel1_path, hint_id, hint_id) | ||
| 724 | _setPanel(panel2_path, answer_id, answer_id) | ||
| 725 | else: | ||
| 726 | _setPanel(panel1_path, hint_id, answer_id) | ||
| 727 | _setPanel(panel2_path, answer_id, hint_id) | ||
| 728 | |||
| 729 | |||
| 730 | func _gStack2(panel1_path, puzzle_type1, panel2_path, puzzle_type2): | ||
| 731 | _cur_panel = panel1_path | ||
| 732 | if puzzle_type1 == kWhiteMiddle or puzzle_type2 == kWhiteMiddle: | ||
| 733 | if puzzle_type1 == kWhiteMiddle: | ||
| 734 | _gSingle(panel2_path, puzzle_type2) | ||
| 735 | _gCopyAnswer(panel2_path, panel1_path) | ||
| 736 | else: | ||
| 737 | _gSingle(panel1_path, puzzle_type1) | ||
| 738 | _gCopyAnswer(panel1_path, panel2_path) | ||
| 739 | else: | ||
| 740 | var pre_choices = _filterBestPuzzles(_answers_by_type[puzzle_type1]) | ||
| 741 | var puzzle_choices = [] | ||
| 742 | for word_id in pre_choices: | ||
| 743 | if _puzzle_by_id[word_id][1].has(puzzle_type2): | ||
| 744 | puzzle_choices.append(word_id) | ||
| 745 | if puzzle_choices.empty(): | ||
| 746 | print("No possible puzzles for panel %s" % panel1_path) | ||
| 747 | else: | ||
| 748 | var answer_id = _pickRandom(puzzle_choices) | ||
| 749 | var hint1_choices = _puzzle_by_id[answer_id][1][puzzle_type1] | ||
| 750 | var hint1_id = _pickRandom(hint1_choices) | ||
| 751 | var hint2_choices = _puzzle_by_id[answer_id][1][puzzle_type2] | ||
| 752 | var hint2_id = _pickRandom(hint2_choices) | ||
| 753 | _setPanel(panel1_path, hint1_id, answer_id) | ||
| 754 | if panel2_path != "": | ||
| 755 | _setPanel(panel2_path, hint2_id, answer_id) | ||
| 756 | |||
| 757 | |||
| 758 | func _gChain(panel_path, puzzle_types): | ||
| 759 | _cur_panel = panel_path | ||
| 760 | var just_answers = [] | ||
| 761 | var hints_by_answer = {} | ||
| 762 | puzzle_types.invert() | ||
| 763 | |||
| 764 | if _chain_cache.has(puzzle_types): | ||
| 765 | just_answers = _chain_cache[puzzle_types][0] | ||
| 766 | hints_by_answer = _chain_cache[puzzle_types][1] | ||
| 767 | else: | ||
| 768 | var remaining = [] | ||
| 769 | for ptype in puzzle_types: | ||
| 770 | if remaining.empty(): | ||
| 771 | for answer in _answers_by_type[ptype]: | ||
| 772 | for choice in _puzzle_by_id[answer][1][ptype]: | ||
| 773 | remaining.append([choice, answer]) | ||
| 774 | elif ptype == kOrangeMiddle: | ||
| 775 | var newrem = [] | ||
| 776 | for puzzle in remaining: | ||
| 777 | if _gen_wanderlust.has(puzzle[0]): | ||
| 778 | newrem.append(puzzle) | ||
| 779 | if newrem.empty(): | ||
| 780 | print("No possible puzzles for panel %s" % panel_path) | ||
| 781 | return | ||
| 782 | remaining = newrem | ||
| 783 | else: | ||
| 784 | var newrem = [] | ||
| 785 | for puzzle in remaining: | ||
| 786 | if _puzzle_by_id[puzzle[0]][1].has(ptype): | ||
| 787 | for choice in _puzzle_by_id[puzzle[0]][1][ptype]: | ||
| 788 | newrem.append([choice, puzzle[1]]) | ||
| 789 | if newrem.empty(): | ||
| 790 | print("No possible puzzles for panel %s" % panel_path) | ||
| 791 | return | ||
| 792 | remaining = newrem | ||
| 793 | for puzzle in remaining: | ||
| 794 | if !just_answers.has(puzzle[1]): | ||
| 795 | just_answers.append(puzzle[1]) | ||
| 796 | hints_by_answer[puzzle[1]] = [puzzle[0]] | ||
| 797 | else: | ||
| 798 | hints_by_answer[puzzle[1]].append(puzzle[0]) | ||
| 799 | _chain_cache[puzzle_types] = [just_answers, hints_by_answer] | ||
| 800 | var puzzle_choices = _filterBestPuzzles(just_answers) | ||
| 801 | if puzzle_choices.empty(): | ||
| 802 | print("No possible puzzles for panel %s" % panel_path) | ||
| 803 | else: | ||
| 804 | var answer_id = _pickRandom(puzzle_choices) | ||
| 805 | var hint_choices = hints_by_answer[answer_id] | ||
| 806 | var hint_id = _pickRandom(hint_choices) | ||
| 807 | if puzzle_types[puzzle_types.size()-1] == kOrangeMiddle: | ||
| 808 | var hint = _applyCipher(_answer_by_id[hint_id]) | ||
| 809 | _writePanel(panel_path, hint, _answer_by_id[answer_id]) | ||
| 810 | else: | ||
| 811 | _setPanel(panel_path, hint_id, answer_id) | ||
| 812 | |||
| 813 | |||
| 814 | func _gCopy(panel1_path, panel2_path): | ||
| 815 | _cur_panel = panel2_path | ||
| 816 | _writePanel(panel2_path, _hint_by_path[panel1_path], _answer_by_path[panel1_path]) | ||
| 817 | |||
| 818 | |||
| 819 | func _gCopyAnswer(panel1_path, panel2_path): | ||
| 820 | _cur_panel = panel2_path | ||
| 821 | _writePanel(panel2_path, _answer_by_path[panel1_path], _answer_by_path[panel1_path]) | ||
| 822 | |||
| 823 | |||
| 824 | func _gCopyHidden(panel1_path, panel2_path): | ||
| 825 | _cur_panel = panel2_path | ||
| 826 | _writePanel(panel2_path, "?".repeat(_answer_by_path[panel1_path].length()), _answer_by_path[panel1_path]) | ||
| 827 | |||
| 828 | |||
| 829 | func _gExactLength(panel_path, puzzle_type, answer_length): | ||
| 830 | _cur_panel = panel_path | ||
| 831 | var puzzle_choices = _filterBestPuzzles(_answers_by_length[answer_length]) | ||
| 832 | if puzzle_type != kWhiteMiddle: | ||
| 833 | # TODO: Do we even need this? | ||
| 834 | pass | ||
| 835 | if puzzle_choices.empty(): | ||
| 836 | print("No possible puzzles for panel %s" % panel_path) | ||
| 837 | else: | ||
| 838 | var answer_id = _pickRandom(puzzle_choices) | ||
| 839 | if puzzle_type == kWhiteMiddle: | ||
| 840 | _setPanel(panel_path, answer_id, answer_id) | ||
| 841 | else: | ||
| 842 | var hint_choices = _puzzle_by_id[answer_id][1][puzzle_type] | ||
| 843 | var hint_id = _pickRandom(hint_choices) | ||
| 844 | _setPanel(panel_path, hint_id, answer_id) | ||
| 845 | |||
| 846 | |||
| 847 | func _gOrangeNumber(panel_path): | ||
| 848 | _cur_panel = panel_path | ||
| 849 | var word_id = _pickRandom(_gen_wanderlust) | ||
| 850 | var answer = _answer_by_id[word_id] | ||
| 851 | var hint = _applyCipher(answer) | ||
| 852 | _writePanel(panel_path, hint, answer) | ||
| 853 | |||
| 854 | |||
| 855 | func _gOrangeWord(panel_path): | ||
| 856 | _cur_panel = panel_path | ||
| 857 | var word_id = _pickRandom(_gen_wanderlust) | ||
| 858 | var hint = _answer_by_id[word_id] | ||
| 859 | var answer = _applyCipher(hint) | ||
| 860 | _writePanel(panel_path, hint, answer) | ||
| 861 | |||
| 862 | |||
| 863 | func _gOrangeAddition(panel_path): | ||
| 864 | _cur_panel = panel_path | ||
| 865 | var puzzle = _pickRandom(_gen_addition) | ||
| 866 | var word1 = _answer_by_id[puzzle[0]] | ||
| 867 | var word2 = _answer_by_id[puzzle[1]] | ||
| 868 | var solution = _answer_by_id[puzzle[2]] | ||
| 869 | _writePanel(panel_path, "%s + %s" % [word1, word2], solution) | ||
| 870 | |||
| 871 | |||
| 872 | func _gPaintingPuzzle(panel_path, painting_name): | ||
| 873 | _cur_panel = panel_path | ||
| 874 | var chosen = _pickRandom(_painting_puzzles) | ||
| 875 | _painting_puzzles.erase(chosen) | ||
| 876 | _writePanel(panel_path, "painting", chosen[1]) | ||
| 877 | painting_mapping.append([painting_name, chosen[0]]) | ||
| 878 | |||
| 879 | |||
| 880 | func _gCombo(panel_path, left_type, right_type): | ||
| 881 | _cur_panel = panel_path | ||
| 882 | var puzzles = _gen_combos[left_type][right_type] | ||
| 883 | var chosen = _pickRandom(puzzles) | ||
| 884 | var hint_text | ||
| 885 | if chosen[1] == -1: | ||
| 886 | hint_text = _answer_by_id[chosen[0]] | ||
| 887 | else: | ||
| 888 | hint_text = "%s %s" % [_answer_by_id[chosen[0]], _answer_by_id[chosen[1]]] | ||
| 889 | _writePanel(panel_path, hint_text, _answer_by_id[chosen[2]]) | ||
| 890 | |||
| 891 | |||
| 892 | func _gSteady(panel_path, puzzle_type): | ||
| 893 | _cur_panel = panel_path | ||
| 894 | var pre_choices = _filterBestPuzzles(_answers_by_type[kColorIs]) | ||
| 895 | var puzzle_choices = [] | ||
| 896 | for word_id in pre_choices: | ||
| 897 | if _puzzle_by_id[word_id][1].has(puzzle_type): | ||
| 898 | puzzle_choices.append(word_id) | ||
| 899 | if puzzle_choices.empty(): | ||
| 900 | print("No possible puzzles for panel %s" % panel_path) | ||
| 901 | else: | ||
| 902 | var answer_id = _pickRandom(puzzle_choices) | ||
| 903 | var hint_choices = _puzzle_by_id[answer_id][1][puzzle_type] | ||
| 904 | var hint_id = _pickRandom(hint_choices) | ||
| 905 | var color_choices = _puzzle_by_id[answer_id][1][kColorIs] | ||
| 906 | var color_id = _pickRandom(color_choices) | ||
| 907 | var color_word = _answer_by_id[color_id] | ||
| 908 | _setPanel(panel_path, hint_id, answer_id) | ||
| 909 | |||
| 910 | if color_word == "red": | ||
| 911 | steady_mapping.append("MeshInstance7") | ||
| 912 | elif color_word == "blue": | ||
| 913 | steady_mapping.append("MeshInstance4") | ||
| 914 | elif color_word == "green": | ||
| 915 | steady_mapping.append("MeshInstance2") | ||
| 916 | elif color_word == "black": | ||
| 917 | steady_mapping.append("MeshInstance6") | ||
| 918 | elif color_word == "white": | ||
| 919 | steady_mapping.append("MeshInstance5") | ||
| 920 | elif color_word == "brown": | ||
| 921 | steady_mapping.append("MeshInstance3") | ||
| 922 | elif color_word == "orange": | ||
| 923 | steady_mapping.append("MeshInstance10") | ||
| 924 | elif color_word == "yellow": | ||
| 925 | steady_mapping.append("MeshInstance9") | ||
| 926 | elif color_word == "purple": | ||
| 927 | steady_mapping.append("MeshInstance8") | ||
| 928 | |||
| 929 | |||
| 930 | func _applyCipher(text): | ||
| 931 | var result = text | ||
| 932 | for i in range(result.length()): | ||
| 933 | if result.substr(i,1) == "w": | ||
| 934 | result[i] = "1" | ||
| 935 | elif result.substr(i,1) == "a": | ||
| 936 | result[i] = "2" | ||
| 937 | elif result.substr(i,1) == "n": | ||
| 938 | result[i] = "3" | ||
| 939 | elif result.substr(i,1) == "d": | ||
| 940 | result[i] = "4" | ||
| 941 | elif result.substr(i,1) == "e": | ||
| 942 | result[i] = "5" | ||
| 943 | elif result.substr(i,1) == "r": | ||
| 944 | result[i] = "6" | ||
| 945 | elif result.substr(i,1) == "l": | ||
| 946 | result[i] = "7" | ||
| 947 | elif result.substr(i,1) == "u": | ||
| 948 | result[i] = "8" | ||
| 949 | elif result.substr(i,1) == "s": | ||
| 950 | result[i] = "9" | ||
| 951 | elif result.substr(i,1) == "t": | ||
| 952 | result[i] = "0" | ||
| 953 | return result | ||
| 954 | |||
| 955 | |||
| 956 | func _filterBestPuzzles(input): | ||
| 957 | var acceptable = [] | ||
| 958 | for word_id in input: | ||
| 959 | if ( | ||
| 960 | _unique_pool != "" | ||
| 961 | and _answers_by_unique_pool.has(_unique_pool) | ||
| 962 | and _answers_by_unique_pool[_unique_pool].has(word_id) | ||
| 963 | ): | ||
| 964 | continue | ||
| 965 | if _isFlag(kShortAnswer) and _answer_by_id[word_id].length() > _short_answer_length: | ||
| 966 | continue | ||
| 967 | if _isFlag(kForcePalindrome) and _answer_by_id[word_id] != _reverseString(_answer_by_id[word_id]): | ||
| 968 | continue | ||
| 969 | acceptable.append(word_id) | ||
| 970 | #if _isFlag(kMustReuseAnswer): | ||
| 971 | # var possible = [] | ||
| 972 | # for word_id in not_uniqued: | ||
| 973 | # if _puzzle_by_id[word_id][1].size() > 1: | ||
| 974 | # possible.append(word_id) | ||
| 975 | # not_uniqued = possible | ||
| 976 | var result = [] | ||
| 977 | for word_id in acceptable: | ||
| 978 | if _needs_reuse.has(word_id): | ||
| 979 | result.append(word_id) | ||
| 980 | if result.empty(): | ||
| 981 | for word_id in acceptable: | ||
| 982 | result.append(word_id) | ||
| 983 | if _possible_reuse.has(word_id): | ||
| 984 | result.append(word_id) | ||
| 985 | return result | ||
| 986 | |||
| 987 | |||
| 988 | func _setPanel(panel_path, hint_id, answer_id): | ||
| 989 | if _unique_pool != "": | ||
| 990 | _answers_by_unique_pool[_unique_pool].append(answer_id) | ||
| 991 | |||
| 992 | var hint_text = _answer_by_id[hint_id] | ||
| 993 | if _isFlag(kObscureHint): | ||
| 994 | var numToObscure = 1 | ||
| 995 | if hint_text.length()/3 > 0: | ||
| 996 | numToObscure = _rng.randi_range(1, hint_text.length()/3) | ||
| 997 | var iota = range(0, hint_text.length()) | ||
| 998 | var order = [] | ||
| 999 | while not iota.empty(): | ||
| 1000 | var i = _rng.randi_range(0, iota.size() - 1) | ||
| 1001 | order.append(iota[i]) | ||
| 1002 | iota.remove(i) | ||
| 1003 | for i in range(0, numToObscure): | ||
| 1004 | if hint_text[order[i]] != " " and hint_text[order[i]] != "-": | ||
| 1005 | hint_text[order[i]] = "?" | ||
| 1006 | |||
| 1007 | _writePanel(panel_path, hint_text, _answer_by_id[answer_id]) | ||
| 1008 | if not _isFlag(kMustReuseAnswer): | ||
| 1009 | if _needs_reuse.has(answer_id): | ||
| 1010 | _needs_reuse.erase(answer_id) | ||
| 1011 | _possible_reuse.append(answer_id) | ||
| 1012 | |||
| 1013 | |||
| 1014 | func _writePanel(panel_path, hint, answer): | ||
| 1015 | panel_mapping.append([panel_path, hint, answer]) | ||
| 1016 | _hint_by_path[panel_path] = hint | ||
| 1017 | _answer_by_path[panel_path] = answer | ||
| 1018 | _total_generated += 1 | ||
| 1019 | emit_signal("generator_status", "Generating puzzles... (%d/?)" % _total_generated) | ||
| 1020 | global._print("%s : %s -> %s" % [panel_path, hint, answer]) | ||
| 1021 | |||
| 1022 | |||
| 1023 | func _reverseString(s): | ||
| 1024 | var r = "" | ||
| 1025 | for i in range(s.length()-1, -1, -1): | ||
| 1026 | r += s[i] | ||
| 1027 | return r | ||
| diff --git a/Archipelago/load.gd b/Archipelago/load.gd index 651fc39..8559b10 100644 --- a/Archipelago/load.gd +++ b/Archipelago/load.gd | |||
| @@ -135,7 +135,7 @@ func _load(): | |||
| 135 | new_another_cdp.maxlength = (apclient._level_2_requirement - 1) | 135 | new_another_cdp.maxlength = (apclient._level_2_requirement - 1) |
| 136 | new_another_cdp.nested = true | 136 | new_another_cdp.nested = true |
| 137 | get_node("CountdownPanels").add_child(new_another_cdp) | 137 | get_node("CountdownPanels").add_child(new_another_cdp) |
| 138 | another_cdp.replace_with = "" | 138 | another_cdp.replace_with = "../CountdownPanel_level2_0" |
| 139 | another_cdp.queue_free() | 139 | another_cdp.queue_free() |
| 140 | else: | 140 | else: |
| 141 | var another_replacement = another_cdp.get_node(another_cdp.replace_with) | 141 | var another_replacement = another_cdp.get_node(another_cdp.replace_with) |
| @@ -275,7 +275,7 @@ func _load(): | |||
| 275 | clear_gridmap_tile(25.5, 1.5, 11.5) | 275 | clear_gridmap_tile(25.5, 1.5, 11.5) |
| 276 | clear_gridmap_tile(47.5, 1.5, 11.5) | 276 | clear_gridmap_tile(47.5, 1.5, 11.5) |
| 277 | 277 | ||
| 278 | if apclient._panel_shuffle == apclient.kREARRANGE_PANELS: | 278 | if apclient._panel_shuffle == apclient.kREARRANGE_PANELS or apclient._panel_shuffle == apclient.kEXPERIMENTAL_PANELS: |
| 279 | # Do the actual shuffling. | 279 | # Do the actual shuffling. |
| 280 | var panel_pools = {} | 280 | var panel_pools = {} |
| 281 | for panel in gamedata.panels: | 281 | for panel in gamedata.panels: |
| @@ -342,6 +342,9 @@ func _load(): | |||
| 342 | new_answer += " " | 342 | new_answer += " " |
| 343 | new_answer += panels_parent.get_node("Painting Room/Panel_send_use_turns").answer | 343 | new_answer += panels_parent.get_node("Painting Room/Panel_send_use_turns").answer |
| 344 | panels_parent.get_node("Painting Room/Panel_order_onepathmanyturns").answer = new_answer | 344 | panels_parent.get_node("Painting Room/Panel_order_onepathmanyturns").answer = new_answer |
| 345 | |||
| 346 | if apclient._panel_shuffle == apclient.kEXPERIMENTAL_PANELS: | ||
| 347 | apclient.get_node("Generator").apply(self) | ||
| 345 | 348 | ||
| 346 | # Handle our other static panels after panel randomization, so that the old | 349 | # Handle our other static panels after panel randomization, so that the old |
| 347 | # values can enter the pool, if necessary. | 350 | # values can enter the pool, if necessary. |
| diff --git a/Archipelago/settings_screen.gd b/Archipelago/settings_screen.gd index 2ed8594..ec3b5f1 100644 --- a/Archipelago/settings_screen.gd +++ b/Archipelago/settings_screen.gd | |||
| @@ -1,5 +1,10 @@ | |||
| 1 | extends Spatial | 1 | extends Spatial |
| 2 | 2 | ||
| 3 | var generator_thread = Thread.new() | ||
| 4 | var generator | ||
| 5 | |||
| 6 | signal finished_randomizing | ||
| 7 | |||
| 3 | 8 | ||
| 4 | func _ready(): | 9 | func _ready(): |
| 5 | # Some helpful logging. | 10 | # Some helpful logging. |
| @@ -25,6 +30,7 @@ func _ready(): | |||
| 25 | 30 | ||
| 26 | apclient_instance.SCRIPT_doorControl = load("user://maps/Archipelago/doorControl.gd") | 31 | apclient_instance.SCRIPT_doorControl = load("user://maps/Archipelago/doorControl.gd") |
| 27 | apclient_instance.SCRIPT_effects = load("user://maps/Archipelago/effects.gd") | 32 | apclient_instance.SCRIPT_effects = load("user://maps/Archipelago/effects.gd") |
| 33 | apclient_instance.SCRIPT_generator = load("user://maps/Archipelago/generator.gd") | ||
| 28 | apclient_instance.SCRIPT_location = load("user://maps/Archipelago/location.gd") | 34 | apclient_instance.SCRIPT_location = load("user://maps/Archipelago/location.gd") |
| 29 | apclient_instance.SCRIPT_multiplayer = load("user://maps/Archipelago/multiplayer.gd") | 35 | apclient_instance.SCRIPT_multiplayer = load("user://maps/Archipelago/multiplayer.gd") |
| 30 | apclient_instance.SCRIPT_mypainting = load("user://maps/Archipelago/mypainting.gd") | 36 | apclient_instance.SCRIPT_mypainting = load("user://maps/Archipelago/mypainting.gd") |
| @@ -124,6 +130,16 @@ func installScriptExtension(childScript: Resource): | |||
| 124 | childScript.take_over_path(parentScriptPath) | 130 | childScript.take_over_path(parentScriptPath) |
| 125 | 131 | ||
| 126 | 132 | ||
| 133 | func getVariantFromFile(path): | ||
| 134 | var cbin = File.new() | ||
| 135 | var err = cbin.open_compressed( | ||
| 136 | "%s\\%s" % [filename.get_base_dir(), path], File.READ, File.COMPRESSION_ZSTD | ||
| 137 | ) | ||
| 138 | if err != OK: | ||
| 139 | global._print("Error: %d" % err) | ||
| 140 | return cbin.get_var() | ||
| 141 | |||
| 142 | |||
| 127 | func connectionStatus(message): | 143 | func connectionStatus(message): |
| 128 | var popup = self.get_node("Panel/AcceptDialog") | 144 | var popup = self.get_node("Panel/AcceptDialog") |
| 129 | popup.window_title = "Connecting to Archipelago" | 145 | popup.window_title = "Connecting to Archipelago" |
| @@ -136,6 +152,36 @@ func connectionStatus(message): | |||
| 136 | func connectionSuccessful(): | 152 | func connectionSuccessful(): |
| 137 | var apclient = global.get_node("Archipelago") | 153 | var apclient = global.get_node("Archipelago") |
| 138 | 154 | ||
| 155 | if apclient._panel_shuffle == apclient.kEXPERIMENTAL_PANELS: | ||
| 156 | #connect("finished_randomizing", self, "loadLevel") | ||
| 157 | |||
| 158 | #generator_thread.start(self, "doGeneration", null, Thread.PRIORITY_HIGH) | ||
| 159 | #yield(self, "finished_randomizing") | ||
| 160 | #generator_thread.wait_to_finish() | ||
| 161 | doGeneration() | ||
| 162 | |||
| 163 | loadLevel() | ||
| 164 | else: | ||
| 165 | loadLevel() | ||
| 166 | |||
| 167 | |||
| 168 | func doGeneration(): | ||
| 169 | var apclient = global.get_node("Archipelago") | ||
| 170 | var gpv = getVariantFromFile("generated_puzzles.bin") | ||
| 171 | global._print("Forms: %d" % gpv[0].size()) | ||
| 172 | generator = apclient.SCRIPT_generator.new(gpv) | ||
| 173 | generator.name = "Generator" | ||
| 174 | apclient.add_child(generator) | ||
| 175 | |||
| 176 | generator.connect("generator_status", self, "connectionStatus") | ||
| 177 | generator.generate(str(apclient._slot_seed)) | ||
| 178 | |||
| 179 | emit_signal("finished_randomizing") | ||
| 180 | |||
| 181 | |||
| 182 | func loadLevel(): | ||
| 183 | var apclient = global.get_node("Archipelago") | ||
| 184 | |||
| 139 | # Save connection details | 185 | # Save connection details |
| 140 | var connection_details = [apclient.ap_server, apclient.ap_user, apclient.ap_pass] | 186 | var connection_details = [apclient.ap_server, apclient.ap_user, apclient.ap_pass] |
| 141 | if apclient.connection_history.has(connection_details): | 187 | if apclient.connection_history.has(connection_details): |
