135 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			135 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | import itertools | ||
|  | import time | ||
|  | from typing import Dict, List | ||
|  | 
 | ||
|  | from worlds.shapez.data.strings import SHAPESANITY, REGIONS | ||
|  | 
 | ||
|  | shapesanity_simple: Dict[str, str] = {} | ||
|  | shapesanity_1_4: Dict[str, str] = {} | ||
|  | shapesanity_two_sided: Dict[str, str] = {} | ||
|  | shapesanity_three_parts: Dict[str, str] = {} | ||
|  | shapesanity_four_parts: Dict[str, str] = {} | ||
|  | subshape_names = [SHAPESANITY.circle, SHAPESANITY.square, SHAPESANITY.star, SHAPESANITY.windmill] | ||
|  | color_names = [SHAPESANITY.red, SHAPESANITY.blue, SHAPESANITY.green, SHAPESANITY.yellow, SHAPESANITY.purple, | ||
|  |                SHAPESANITY.cyan, SHAPESANITY.white, SHAPESANITY.uncolored] | ||
|  | short_subshapes = ["C", "R", "S", "W"] | ||
|  | short_colors = ["b", "c", "g", "p", "r", "u", "w", "y"] | ||
|  | 
 | ||
|  | 
 | ||
|  | def color_to_needed_building(color_list: List[str]) -> str: | ||
|  |     for next_color in color_list: | ||
|  |         if next_color in [SHAPESANITY.yellow, SHAPESANITY.purple, SHAPESANITY.cyan, SHAPESANITY.white, | ||
|  |                           "y", "p", "c", "w"]: | ||
|  |             return REGIONS.mixed | ||
|  |     for next_color in color_list: | ||
|  |         if next_color not in [SHAPESANITY.uncolored, "u"]: | ||
|  |             return REGIONS.painted | ||
|  |     return REGIONS.uncol | ||
|  | 
 | ||
|  | 
 | ||
|  | def generate_shapesanity_pool() -> None: | ||
|  |     # same shapes && same color | ||
|  |     for color in color_names: | ||
|  |         color_region = color_to_needed_building([color]) | ||
|  |         shapesanity_simple[SHAPESANITY.full(color, SHAPESANITY.circle)] = REGIONS.sanity(REGIONS.full, color_region) | ||
|  |         shapesanity_simple[SHAPESANITY.full(color, SHAPESANITY.square)] = REGIONS.sanity(REGIONS.full, color_region) | ||
|  |         shapesanity_simple[SHAPESANITY.full(color, SHAPESANITY.star)] = REGIONS.sanity(REGIONS.full, color_region) | ||
|  |         shapesanity_simple[SHAPESANITY.full(color, SHAPESANITY.windmill)] = REGIONS.sanity(REGIONS.east_wind, color_region) | ||
|  |     for shape in subshape_names: | ||
|  |         for color in color_names: | ||
|  |             color_region = color_to_needed_building([color]) | ||
|  |             shapesanity_simple[SHAPESANITY.half(color, shape)] = REGIONS.sanity(REGIONS.half, color_region) | ||
|  |             shapesanity_simple[SHAPESANITY.piece(color, shape)] = REGIONS.sanity(REGIONS.piece, color_region) | ||
|  |             shapesanity_simple[SHAPESANITY.cutout(color, shape)] = REGIONS.sanity(REGIONS.stitched, color_region) | ||
|  |             shapesanity_simple[SHAPESANITY.cornered(color, shape)] = REGIONS.sanity(REGIONS.stitched, color_region) | ||
|  | 
 | ||
|  |     # one color && 4 shapes (including empty) | ||
|  |     for first_color, second_color, third_color, fourth_color in itertools.combinations(short_colors+["-"], 4): | ||
|  |         colors = [first_color, second_color, third_color, fourth_color] | ||
|  |         color_region = color_to_needed_building(colors) | ||
|  |         shape_regions = [REGIONS.stitched, REGIONS.stitched] if fourth_color == "-" else [REGIONS.col_full, REGIONS.col_east_wind] | ||
|  |         color_code = ''.join(colors) | ||
|  |         shapesanity_1_4[SHAPESANITY.full(color_code, SHAPESANITY.circle)] = REGIONS.sanity(shape_regions[0], color_region) | ||
|  |         shapesanity_1_4[SHAPESANITY.full(color_code, SHAPESANITY.square)] = REGIONS.sanity(shape_regions[0], color_region) | ||
|  |         shapesanity_1_4[SHAPESANITY.full(color_code, SHAPESANITY.star)] = REGIONS.sanity(shape_regions[0], color_region) | ||
|  |         shapesanity_1_4[SHAPESANITY.full(color_code, SHAPESANITY.windmill)] = REGIONS.sanity(shape_regions[1], color_region) | ||
|  | 
 | ||
|  |     # one shape && 4 colors (including empty) | ||
|  |     for first_shape, second_shape, third_shape, fourth_shape in itertools.combinations(short_subshapes+["-"], 4): | ||
|  |         for color in color_names: | ||
|  |             shapesanity_1_4[SHAPESANITY.full(color, ''.join([first_shape, second_shape, third_shape, fourth_shape]))] \ | ||
|  |                 = REGIONS.sanity(REGIONS.stitched, color_to_needed_building([color])) | ||
|  | 
 | ||
|  |     combos = [shape + color for shape in short_subshapes for color in short_colors] | ||
|  |     for first_combo, second_combo in itertools.permutations(combos, 2): | ||
|  |         # 2-sided shapes | ||
|  |         color_region = color_to_needed_building([first_combo[1], second_combo[1]]) | ||
|  |         ordered_combo = " ".join(sorted([first_combo, second_combo])) | ||
|  |         shape_regions = (([REGIONS.east_wind, REGIONS.east_wind, REGIONS.col_half] | ||
|  |                           if first_combo[0] == "W" else [REGIONS.col_full, REGIONS.col_full, REGIONS.col_half]) | ||
|  |                          if first_combo[0] == second_combo[0] else [REGIONS.stitched, REGIONS.half_half, REGIONS.stitched]) | ||
|  |         shapesanity_two_sided[SHAPESANITY.three_one(first_combo, second_combo)] = REGIONS.sanity(shape_regions[0], color_region) | ||
|  |         shapesanity_two_sided[SHAPESANITY.halfhalf(ordered_combo)] = REGIONS.sanity(shape_regions[1], color_region) | ||
|  |         shapesanity_two_sided[SHAPESANITY.checkered(ordered_combo)] = REGIONS.sanity(shape_regions[0], color_region) | ||
|  |         shapesanity_two_sided[SHAPESANITY.singles(ordered_combo, SHAPESANITY.adjacent_pos)] = REGIONS.sanity(shape_regions[2], color_region) | ||
|  |         shapesanity_two_sided[SHAPESANITY.singles(ordered_combo, SHAPESANITY.cornered_pos)] = REGIONS.sanity(REGIONS.stitched, color_region) | ||
|  |         shapesanity_two_sided[SHAPESANITY.two_one(first_combo, second_combo, SHAPESANITY.adjacent_pos)] = REGIONS.sanity(REGIONS.stitched, color_region) | ||
|  |         shapesanity_two_sided[SHAPESANITY.two_one(first_combo, second_combo, SHAPESANITY.cornered_pos)] = REGIONS.sanity(REGIONS.stitched, color_region) | ||
|  |         for third_combo in combos: | ||
|  |             if third_combo in [first_combo, second_combo]: | ||
|  |                 continue | ||
|  |             # 3-part shapes | ||
|  |             colors = [first_combo[1], second_combo[1], third_combo[1]] | ||
|  |             color_region = color_to_needed_building(colors) | ||
|  |             ordered_two = " ".join(sorted([second_combo, third_combo])) | ||
|  |             if not (first_combo[1] == second_combo[1] == third_combo[1] or | ||
|  |                     first_combo[0] == second_combo[0] == third_combo[0]): | ||
|  |                 ordered_all = " ".join(sorted([first_combo, second_combo, third_combo])) | ||
|  |                 shapesanity_three_parts[SHAPESANITY.singles(ordered_all)] = REGIONS.sanity(REGIONS.stitched, color_region) | ||
|  |             shape_regions = ([REGIONS.stitched, REGIONS.stitched] if not second_combo[0] == third_combo[0] | ||
|  |                              else (([REGIONS.east_wind, REGIONS.east_wind] if first_combo[0] == "W" | ||
|  |                                     else [REGIONS.col_full, REGIONS.col_full]) | ||
|  |                                    if first_combo[0] == second_combo[0] else [REGIONS.col_half_half, REGIONS.stitched])) | ||
|  |             shapesanity_three_parts[SHAPESANITY.two_one_one(first_combo, ordered_two, SHAPESANITY.adjacent_pos)] \ | ||
|  |                 = REGIONS.sanity(shape_regions[0], color_region) | ||
|  |             shapesanity_three_parts[SHAPESANITY.two_one_one(first_combo, ordered_two, SHAPESANITY.cornered_pos)] \ | ||
|  |                 = REGIONS.sanity(shape_regions[1], color_region) | ||
|  |             for fourth_combo in combos: | ||
|  |                 if fourth_combo in [first_combo, second_combo, third_combo]: | ||
|  |                     continue | ||
|  |                 if (first_combo[1] == second_combo[1] == third_combo[1] == fourth_combo[1] or | ||
|  |                     first_combo[0] == second_combo[0] == third_combo[0] == fourth_combo[0]): | ||
|  |                     continue | ||
|  |                 colors = [first_combo[1], second_combo[1], third_combo[1], fourth_combo[1]] | ||
|  |                 color_region = color_to_needed_building(colors) | ||
|  |                 ordered_all = " ".join(sorted([first_combo, second_combo, third_combo, fourth_combo])) | ||
|  |                 if ((first_combo[0] == second_combo[0] and third_combo[0] == fourth_combo[0]) or | ||
|  |                     (first_combo[0] == third_combo[0] and second_combo[0] == fourth_combo[0]) or | ||
|  |                     (first_combo[0] == fourth_combo[0] and third_combo[0] == second_combo[0])): | ||
|  |                     shapesanity_four_parts[SHAPESANITY.singles(ordered_all)] = REGIONS.sanity(REGIONS.col_half_half, color_region) | ||
|  |                 else: | ||
|  |                     shapesanity_four_parts[SHAPESANITY.singles(ordered_all)] = REGIONS.sanity(REGIONS.stitched, color_region) | ||
|  | 
 | ||
|  | 
 | ||
|  | if __name__ == "__main__": | ||
|  |     start = time.time() | ||
|  |     generate_shapesanity_pool() | ||
|  |     print(time.time() - start) | ||
|  |     with open("shapesanity_pool.py", "w") as outfile: | ||
|  |         outfile.writelines(["shapesanity_simple = {\n"] | ||
|  |                            + [f"    \"{name}\": \"{shapesanity_simple[name]}\",\n" | ||
|  |                               for name in shapesanity_simple] | ||
|  |                            + ["}\n\nshapesanity_1_4 = {\n"] | ||
|  |                            + [f"    \"{name}\": \"{shapesanity_1_4[name]}\",\n" | ||
|  |                               for name in shapesanity_1_4] | ||
|  |                            + ["}\n\nshapesanity_two_sided = {\n"] | ||
|  |                            + [f"    \"{name}\": \"{shapesanity_two_sided[name]}\",\n" | ||
|  |                               for name in shapesanity_two_sided] | ||
|  |                            + ["}\n\nshapesanity_three_parts = {\n"] | ||
|  |                            + [f"    \"{name}\": \"{shapesanity_three_parts[name]}\",\n" | ||
|  |                               for name in shapesanity_three_parts] | ||
|  |                            + ["}\n\nshapesanity_four_parts = {\n"] | ||
|  |                            + [f"    \"{name}\": \"{shapesanity_four_parts[name]}\",\n" | ||
|  |                               for name in shapesanity_four_parts] | ||
|  |                            + ["}\n"]) |