diff options
author | Star Rauchenberger <fefferburbia@gmail.com> | 2024-12-09 12:50:24 -0500 |
---|---|---|
committer | Star Rauchenberger <fefferburbia@gmail.com> | 2024-12-09 12:50:24 -0500 |
commit | f834267a75c873d143e1f7f56f73faaa5e15cf2f (patch) | |
tree | 973fbcc36612266332ef31e9e10d2771e4345c60 | |
parent | eb750c48db3c3b195d585293d08b8b2ca3b0e091 (diff) | |
download | lingo-archipelago-f834267a75c873d143e1f7f56f73faaa5e15cf2f.tar.gz lingo-archipelago-f834267a75c873d143e1f7f56f73faaa5e15cf2f.tar.bz2 lingo-archipelago-f834267a75c873d143e1f7f56f73faaa5e15cf2f.zip |
First pass at panel randomization
-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 aa50069..78058ca 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 |
@@ -43,6 +44,7 @@ const kPILGRIMAGE = 3 | |||
43 | 44 | ||
44 | const kNO_PANEL_SHUFFLE = 0 | 45 | const kNO_PANEL_SHUFFLE = 0 |
45 | const kREARRANGE_PANELS = 1 | 46 | const kREARRANGE_PANELS = 1 |
47 | const kEXPERIMENTAL_PANELS = 2 | ||
46 | 48 | ||
47 | const kCLASSIFICATION_LOCAL_NORMAL = 1 | 49 | const kCLASSIFICATION_LOCAL_NORMAL = 1 |
48 | const kCLASSIFICATION_LOCAL_REDUCED = 2 | 50 | 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 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 @@ | |||
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") |
@@ -123,6 +129,16 @@ func installScriptExtension(childScript: Resource): | |||
123 | childScript.take_over_path(parentScriptPath) | 129 | childScript.take_over_path(parentScriptPath) |
124 | 130 | ||
125 | 131 | ||
132 | func 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 | |||
126 | func connectionStatus(message): | 142 | func 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): | |||
135 | func connectionSuccessful(): | 151 | func 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 | |||
167 | func 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 | |||
181 | func 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): |