about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorStar Rauchenberger <fefferburbia@gmail.com>2024-12-09 12:50:24 -0500
committerStar Rauchenberger <fefferburbia@gmail.com>2024-12-09 12:50:24 -0500
commitf834267a75c873d143e1f7f56f73faaa5e15cf2f (patch)
tree973fbcc36612266332ef31e9e10d2771e4345c60
parenteb750c48db3c3b195d585293d08b8b2ca3b0e091 (diff)
downloadlingo-archipelago-f834267a75c873d143e1f7f56f73faaa5e15cf2f.tar.gz
lingo-archipelago-f834267a75c873d143e1f7f56f73faaa5e15cf2f.tar.bz2
lingo-archipelago-f834267a75c873d143e1f7f56f73faaa5e15cf2f.zip
First pass at panel randomization
-rw-r--r--Archipelago/client.gd2
-rw-r--r--Archipelago/generator.gd1027
-rw-r--r--Archipelago/load.gd7
-rw-r--r--Archipelago/settings_screen.gd46
4 files changed, 1080 insertions, 2 deletions
diff --git a/Archipelago/client.gd b/Archipelago/client.gd index aa50069..78058ca 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd
@@ -2,6 +2,7 @@ extends Node
2 2
3var SCRIPT_doorControl 3var SCRIPT_doorControl
4var SCRIPT_effects 4var SCRIPT_effects
5var SCRIPT_generator
5var SCRIPT_location 6var SCRIPT_location
6var SCRIPT_multiplayer 7var SCRIPT_multiplayer
7var SCRIPT_mypainting 8var SCRIPT_mypainting
@@ -43,6 +44,7 @@ const kPILGRIMAGE = 3
43 44
44const kNO_PANEL_SHUFFLE = 0 45const kNO_PANEL_SHUFFLE = 0
45const kREARRANGE_PANELS = 1 46const kREARRANGE_PANELS = 1
47const kEXPERIMENTAL_PANELS = 2
46 48
47const kCLASSIFICATION_LOCAL_NORMAL = 1 49const kCLASSIFICATION_LOCAL_NORMAL = 1
48const kCLASSIFICATION_LOCAL_REDUCED = 2 50const 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 @@
1extends Node
2
3var panel_mapping = []
4var painting_mapping = []
5var steady_mapping = []
6var gen_seed
7var is_set_seed = false
8
9var _gen_forms
10var _gen_paintings
11var _gen_wanderlust
12var _gen_addition
13var _gen_walls
14var _gen_combos
15
16var _answer_by_id
17var _answers_by_type
18var _answers_by_length
19var _puzzle_by_id
20var _rng
21var _flags = 0
22var _total_generated = 0
23var _hint_by_path = {}
24var _answer_by_path = {}
25var _painting_puzzles = []
26var _chain_cache = {}
27var _short_answer_length = 4
28
29var _unique_pool = ""
30var _answers_by_unique_pool = {}
31var _needs_reuse = []
32var _possible_reuse = []
33
34var _cur_panel = ""
35
36const kOrangeMiddle = -2
37const kWhiteMiddle = -1
38const kWhiteTop = 0
39const kWhiteBottom = 1
40const kYellowTop = 2
41const kYellowMiddle = 3
42const kBlackTop = 4
43const kBlackMiddle = 5
44const kBlackBottom = 6
45const kDoubleBlackBottom = 7
46const kRedTop = 8
47const kRedMiddle = 9
48const kRedBottom = 10
49const kBlueTop = 11
50const kBlueMiddle = 12
51const kBlueBottom = 13
52const kPurpleTop = 14
53const kPurpleMiddle = 15
54const kColorIs = 16
55
56const 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
77const kMustReuseAnswer = 1
78const kObscureHint = 2
79const kShortAnswer = 4
80const kForcePalindrome = 8
81
82signal generator_status
83
84
85func _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
94func 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
550func 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
614func _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
621func _setFlag(flag):
622 _flags |= flag
623
624
625func _clearFlag(flag):
626 _flags &= ~flag
627
628
629func _isFlag(flag):
630 return (_flags & flag) > 0
631
632
633func _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
639func _clearUniquePool():
640 _unique_pool = ""
641
642
643func _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
660func _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
685func _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
710func _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
730func _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
758func _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
814func _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
819func _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
824func _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
829func _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
847func _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
855func _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
863func _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
872func _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
880func _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
892func _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
930func _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
956func _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
988func _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
1014func _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
1023func _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 931dfde..be209c3 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 6c64b15..956d966 100644 --- a/Archipelago/settings_screen.gd +++ b/Archipelago/settings_screen.gd
@@ -1,5 +1,10 @@
1extends Spatial 1extends Spatial
2 2
3var generator_thread = Thread.new()
4var generator
5
6signal finished_randomizing
7
3 8
4func _ready(): 9func _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")
@@ -123,6 +129,16 @@ func installScriptExtension(childScript: Resource):
123 childScript.take_over_path(parentScriptPath) 129 childScript.take_over_path(parentScriptPath)
124 130
125 131
132func getVariantFromFile(path):
133 var cbin = File.new()
134 var err = cbin.open_compressed(
135 "%s\\%s" % [filename.get_base_dir(), path], File.READ, File.COMPRESSION_ZSTD
136 )
137 if err != OK:
138 global._print("Error: %d" % err)
139 return cbin.get_var()
140
141
126func connectionStatus(message): 142func connectionStatus(message):
127 var popup = self.get_node("Panel/AcceptDialog") 143 var popup = self.get_node("Panel/AcceptDialog")
128 popup.window_title = "Connecting to Archipelago" 144 popup.window_title = "Connecting to Archipelago"
@@ -135,6 +151,36 @@ func connectionStatus(message):
135func connectionSuccessful(): 151func connectionSuccessful():
136 var apclient = global.get_node("Archipelago") 152 var apclient = global.get_node("Archipelago")
137 153
154 if apclient._panel_shuffle == apclient.kEXPERIMENTAL_PANELS:
155 #connect("finished_randomizing", self, "loadLevel")
156
157 #generator_thread.start(self, "doGeneration", null, Thread.PRIORITY_HIGH)
158 #yield(self, "finished_randomizing")
159 #generator_thread.wait_to_finish()
160 doGeneration()
161
162 loadLevel()
163 else:
164 loadLevel()
165
166
167func doGeneration():
168 var apclient = global.get_node("Archipelago")
169 var gpv = getVariantFromFile("generated_puzzles.bin")
170 global._print("Forms: %d" % gpv[0].size())
171 generator = apclient.SCRIPT_generator.new(gpv)
172 generator.name = "Generator"
173 apclient.add_child(generator)
174
175 generator.connect("generator_status", self, "connectionStatus")
176 generator.generate(str(apclient._slot_seed))
177
178 emit_signal("finished_randomizing")
179
180
181func loadLevel():
182 var apclient = global.get_node("Archipelago")
183
138 # Save connection details 184 # Save connection details
139 var connection_details = [apclient.ap_server, apclient.ap_user, apclient.ap_pass] 185 var connection_details = [apclient.ap_server, apclient.ap_user, apclient.ap_pass]
140 if apclient.connection_history.has(connection_details): 186 if apclient.connection_history.has(connection_details):