|
1 | 1 | from ..generic.Rules import add_rule
|
2 |
| -from .Regions import connect_regions, sm64courses, sm64paintings, sm64secrets, sm64entrances |
3 |
| - |
4 |
| -def fix_reg(entrance_ids, reg, invalidspot, swaplist, world): |
5 |
| - if entrance_ids.index(reg) == invalidspot: # Unlucky :C |
6 |
| - swaplist.remove(invalidspot) |
7 |
| - rand = world.random.choice(swaplist) |
8 |
| - entrance_ids[invalidspot], entrance_ids[rand] = entrance_ids[rand], entrance_ids[invalidspot] |
9 |
| - swaplist.append(invalidspot) |
10 |
| - swaplist.remove(rand) |
11 |
| - |
12 |
| -def set_rules(world, player: int, area_connections): |
13 |
| - destination_regions = list(range(13)) + [12,13,14] + list(range(15,15+len(sm64secrets))) # Two instances of Destination Course THI. Past normal course idx are secret regions |
14 |
| - secret_entrance_ids = list(range(len(sm64paintings), len(sm64paintings) + len(sm64secrets))) |
15 |
| - course_entrance_ids = list(range(len(sm64paintings))) |
16 |
| - if world.AreaRandomizer[player].value >= 1: # Some randomization is happening, randomize Courses |
17 |
| - world.random.shuffle(course_entrance_ids) |
| 2 | +from .Regions import connect_regions, sm64_level_to_paintings, sm64_paintings_to_level, sm64_level_to_secrets, sm64_entrances_to_level, sm64_level_to_entrances |
| 3 | + |
| 4 | +def shuffle_dict_keys(world, obj: dict) -> dict: |
| 5 | + keys = list(obj.keys()) |
| 6 | + values = list(obj.values()) |
| 7 | + world.random.shuffle(keys) |
| 8 | + return dict(zip(keys,values)) |
| 9 | + |
| 10 | +def fix_reg(entrance_ids, entrance, destination, swapdict, world): |
| 11 | + if entrance_ids[entrance] == destination: # Unlucky :C |
| 12 | + rand = world.random.choice(swapdict.keys()) |
| 13 | + entrance_ids[entrance], entrance_ids[swapdict[rand]] = rand, entrance_ids[entrance] |
| 14 | + swapdict[rand] = entrance_ids[entrance] |
| 15 | + swapdict.pop(entrance) |
| 16 | + |
| 17 | +def set_rules(world, player: int, area_connections: dict): |
| 18 | + randomized_level_to_paintings = sm64_level_to_paintings.copy() |
| 19 | + randomized_level_to_secrets = sm64_level_to_secrets.copy() |
| 20 | + if world.AreaRandomizer[player].value == 1: # Some randomization is happening, randomize Courses |
| 21 | + randomized_level_to_paintings = shuffle_dict_keys(world,sm64_level_to_paintings) |
18 | 22 | if world.AreaRandomizer[player].value == 2: # Randomize Secrets as well
|
19 |
| - world.random.shuffle(secret_entrance_ids) |
20 |
| - entrance_ids = course_entrance_ids + secret_entrance_ids |
| 23 | + randomized_level_to_secrets = shuffle_dict_keys(world,sm64_level_to_secrets) |
| 24 | + randomized_entrances = { **randomized_level_to_paintings, **randomized_level_to_secrets } |
21 | 25 | if world.AreaRandomizer[player].value == 3: # Randomize Courses and Secrets in one pool
|
22 |
| - world.random.shuffle(entrance_ids) |
| 26 | + randomized_entrances = shuffle_dict_keys(world,randomized_entrances) |
23 | 27 | # Guarantee first entrance is a course
|
24 |
| - swaplist = list(range(len(entrance_ids))) |
25 |
| - if entrance_ids.index(0) > 15: # Unlucky :C |
26 |
| - rand = world.random.randint(0,15) |
27 |
| - entrance_ids[entrance_ids.index(0)], entrance_ids[rand] = entrance_ids[rand], entrance_ids[entrance_ids.index(0)] |
28 |
| - swaplist.remove(entrance_ids.index(0)) |
| 28 | + swapdict = { entrance: level for (level,entrance) in randomized_entrances } |
| 29 | + if randomized_entrances[91] not in sm64_paintings_to_level.keys(): # Unlucky :C (91 -> BoB Entrance) |
| 30 | + rand = world.random.choice(sm64_paintings_to_level.values()) |
| 31 | + randomized_entrances[91], randomized_entrances[swapdict[rand]] = rand, randomized_entrances[91] |
| 32 | + swapdict[rand] = randomized_entrances[91] |
| 33 | + swapdict.pop("Bob-omb Battlefield") |
29 | 34 | # Guarantee COTMC is not mapped to HMC, cuz thats impossible
|
30 |
| - fix_reg(entrance_ids, 20, 5, swaplist, world) |
| 35 | + fix_reg(randomized_entrances, "Cavern of the Metal Cap", "Hazy Maze Cave", swapdict, world) |
31 | 36 | # Guarantee BITFS is not mapped to DDD
|
32 |
| - fix_reg(entrance_ids, 22, 8, swaplist, world) |
33 |
| - if entrance_ids.index(22) == 5: # If BITFS is mapped to HMC... |
34 |
| - fix_reg(entrance_ids, 20, 8, swaplist, world) # ... then dont allow COTMC to be mapped to DDD |
35 |
| - temp_assign = dict(zip(entrance_ids,destination_regions)) # Used for Rules only |
| 37 | + fix_reg(randomized_entrances, "Bowser in the Fire Sea", "Dire, Dire Docks", swapdict, world) |
| 38 | + if randomized_entrances[191] == "Hazy Maze Cave": # If BITFS is mapped to HMC... |
| 39 | + fix_reg(randomized_entrances, "Cavern of the Metal Cap", "Dire, Dire Docks", swapdict, world) # ... then dont allow COTMC to be mapped to DDD |
36 | 40 |
|
37 | 41 | # Destination Format: LVL | AREA with LVL = LEVEL_x, AREA = Area as used in sm64 code
|
38 |
| - area_connections.update({sm64entrances[entrance]: destination for entrance, destination in zip(entrance_ids,sm64entrances)}) |
| 42 | + area_connections.update({entrance_lvl: sm64_entrances_to_level[destination] for (entrance_lvl,destination) in randomized_entrances.items()}) |
| 43 | + randomized_entrances_s = {sm64_level_to_entrances[entrance_lvl]: destination for (entrance_lvl,destination) in randomized_entrances.items()} |
39 | 44 |
|
40 |
| - connect_regions(world, player, "Menu", sm64courses[temp_assign[0]]) # BOB |
41 |
| - connect_regions(world, player, "Menu", sm64courses[temp_assign[1]], lambda state: state.has("Power Star", player, 1)) # WF |
42 |
| - connect_regions(world, player, "Menu", sm64courses[temp_assign[2]], lambda state: state.has("Power Star", player, 3)) # JRB |
43 |
| - connect_regions(world, player, "Menu", sm64courses[temp_assign[3]], lambda state: state.has("Power Star", player, 3)) # CCM |
44 |
| - connect_regions(world, player, "Menu", sm64courses[temp_assign[4]], lambda state: state.has("Power Star", player, 12)) # BBH |
45 |
| - connect_regions(world, player, "Menu", sm64courses[temp_assign[16]], lambda state: state.has("Power Star", player, 1)) # PSS |
46 |
| - connect_regions(world, player, "Menu", sm64courses[temp_assign[17]], lambda state: state.has("Power Star", player, 3)) # SA |
47 |
| - connect_regions(world, player, "Menu", sm64courses[temp_assign[19]], lambda state: state.has("Power Star", player, 10)) # TOTWC |
48 |
| - connect_regions(world, player, "Menu", sm64courses[temp_assign[18]], lambda state: state.has("Power Star", player, world.FirstBowserStarDoorCost[player].value)) # BITDW |
| 45 | + connect_regions(world, player, "Menu", randomized_entrances_s["Bob-omb Battlefield"]) |
| 46 | + connect_regions(world, player, "Menu", randomized_entrances_s["Whomp's Fortress"], lambda state: state.has("Power Star", player, 1)) |
| 47 | + connect_regions(world, player, "Menu", randomized_entrances_s["Jolly Roger Bay"], lambda state: state.has("Power Star", player, 3)) |
| 48 | + connect_regions(world, player, "Menu", randomized_entrances_s["Cool, Cool Mountain"], lambda state: state.has("Power Star", player, 3)) |
| 49 | + connect_regions(world, player, "Menu", randomized_entrances_s["Big Boo's Haunt"], lambda state: state.has("Power Star", player, 12)) |
| 50 | + connect_regions(world, player, "Menu", randomized_entrances_s["The Princess's Secret Slide"], lambda state: state.has("Power Star", player, 1)) |
| 51 | + connect_regions(world, player, "Menu", randomized_entrances_s["The Secret Aquarium"], lambda state: state.has("Power Star", player, 3)) |
| 52 | + connect_regions(world, player, "Menu", randomized_entrances_s["Tower of the Wing Cap"], lambda state: state.has("Power Star", player, 10)) |
| 53 | + connect_regions(world, player, "Menu", randomized_entrances_s["Bowser in the Dark World"], lambda state: state.has("Power Star", player, world.FirstBowserStarDoorCost[player].value)) |
49 | 54 |
|
50 | 55 | connect_regions(world, player, "Menu", "Basement", lambda state: state.has("Basement Key", player) or state.has("Progressive Key", player, 1))
|
51 | 56 |
|
52 |
| - connect_regions(world, player, "Basement", sm64courses[temp_assign[5]]) # HMC |
53 |
| - connect_regions(world, player, "Basement", sm64courses[temp_assign[6]]) # LLL |
54 |
| - connect_regions(world, player, "Basement", sm64courses[temp_assign[7]]) # SSL |
55 |
| - connect_regions(world, player, "Basement", sm64courses[temp_assign[8]], lambda state: state.has("Power Star", player, world.BasementStarDoorCost[player].value)) # DDD |
56 |
| - connect_regions(world, player, "Hazy Maze Cave", sm64courses[temp_assign[20]]) # COTMC |
57 |
| - connect_regions(world, player, "Basement", sm64courses[temp_assign[21]]) # VCUTM |
58 |
| - connect_regions(world, player, "Basement", sm64courses[temp_assign[22]], lambda state: state.has("Power Star", player, world.BasementStarDoorCost[player].value) and |
59 |
| - state.can_reach("DDD: Board Bowser's Sub", 'Location', player)) # BITFS |
| 57 | + connect_regions(world, player, "Basement", randomized_entrances_s["Hazy Maze Cave"]) |
| 58 | + connect_regions(world, player, "Basement", randomized_entrances_s["Lethal Lava Land"]) |
| 59 | + connect_regions(world, player, "Basement", randomized_entrances_s["Shifting Sand Land"]) |
| 60 | + connect_regions(world, player, "Basement", randomized_entrances_s["Dire, Dire Docks"], lambda state: state.has("Power Star", player, world.BasementStarDoorCost[player].value)) |
| 61 | + connect_regions(world, player, "Hazy Maze Cave", randomized_entrances_s["Cavern of the Metal Cap"]) |
| 62 | + connect_regions(world, player, "Basement", randomized_entrances_s["Vanish Cap under the Moat"]) |
| 63 | + connect_regions(world, player, "Basement", randomized_entrances_s["Bowser in the Fire Sea"], lambda state: state.has("Power Star", player, world.BasementStarDoorCost[player].value) and |
| 64 | + state.can_reach("DDD: Board Bowser's Sub", 'Location', player)) |
60 | 65 |
|
61 | 66 | connect_regions(world, player, "Menu", "Second Floor", lambda state: state.has("Second Floor Key", player) or state.has("Progressive Key", player, 2))
|
62 | 67 |
|
63 |
| - connect_regions(world, player, "Second Floor", sm64courses[temp_assign[9]]) # SL |
64 |
| - connect_regions(world, player, "Second Floor", sm64courses[temp_assign[10]]) # WDW |
65 |
| - connect_regions(world, player, "Second Floor", sm64courses[temp_assign[11]]) # TTM |
66 |
| - connect_regions(world, player, "Second Floor", sm64courses[temp_assign[12]]) # THI Tiny |
67 |
| - connect_regions(world, player, "Second Floor", sm64courses[temp_assign[13]]) # THI Huge |
| 68 | + connect_regions(world, player, "Second Floor", randomized_entrances_s["Snowman's Land"]) |
| 69 | + connect_regions(world, player, "Second Floor", randomized_entrances_s["Wet-Dry World"]) |
| 70 | + connect_regions(world, player, "Second Floor", randomized_entrances_s["Tall, Tall Mountain"]) |
| 71 | + connect_regions(world, player, "Second Floor", randomized_entrances_s["Tiny-Huge Island (Tiny)"]) |
| 72 | + connect_regions(world, player, "Second Floor", randomized_entrances_s["Tiny-Huge Island (Huge)"]) |
| 73 | + connect_regions(world, player, "Tiny-Huge Island (Tiny)", "Tiny-Huge Island (Huge)") |
| 74 | + connect_regions(world, player, "Tiny-Huge Island (Huge)", "Tiny-Huge Island (Tiny)") |
68 | 75 |
|
69 | 76 | connect_regions(world, player, "Second Floor", "Third Floor", lambda state: state.has("Power Star", player, world.SecondFloorStarDoorCost[player].value))
|
70 | 77 |
|
71 |
| - connect_regions(world, player, "Third Floor", sm64courses[temp_assign[14]]) # TTC |
72 |
| - connect_regions(world, player, "Third Floor", sm64courses[temp_assign[15]]) # RR |
73 |
| - connect_regions(world, player, "Third Floor", sm64courses[temp_assign[23]]) # WMOTR |
74 |
| - connect_regions(world, player, "Third Floor", "Bowser in the Sky", lambda state: state.has("Power Star", player, world.StarsToFinish[player].value)) # BITS |
| 78 | + connect_regions(world, player, "Third Floor", randomized_entrances_s["Tick Tock Clock"]) |
| 79 | + connect_regions(world, player, "Third Floor", randomized_entrances_s["Rainbow Ride"]) |
| 80 | + connect_regions(world, player, "Third Floor", randomized_entrances_s["Wing Mario over the Rainbow"]) |
| 81 | + connect_regions(world, player, "Third Floor", "Bowser in the Sky", lambda state: state.has("Power Star", player, world.StarsToFinish[player].value)) |
75 | 82 |
|
76 | 83 | #Special Rules for some Locations
|
77 | 84 | add_rule(world.get_location("BoB: Mario Wings to the Sky", player), lambda state: state.has("Cannon Unlock BoB", player))
|
|
0 commit comments