Restructured forced crossed/noncrossed to share code
This commit is contained in:
@@ -444,6 +444,23 @@ def link_overworld(world, player):
|
|||||||
connected_edge_cache = connected_edges.copy()
|
connected_edge_cache = connected_edges.copy()
|
||||||
groups_cache = copy.deepcopy(groups)
|
groups_cache = copy.deepcopy(groups)
|
||||||
while not valid_layout and tries > 0:
|
while not valid_layout and tries > 0:
|
||||||
|
def remove_connected(forward_sets, back_sets):
|
||||||
|
deleted_edges = []
|
||||||
|
def remove_from_sets(sets):
|
||||||
|
s = 0
|
||||||
|
while s < len(sets):
|
||||||
|
if sets[s][0] in connected_edges:
|
||||||
|
deleted_edges.extend(sets[s])
|
||||||
|
del sets[s]
|
||||||
|
continue
|
||||||
|
s += 1
|
||||||
|
remove_from_sets(forward_sets)
|
||||||
|
remove_from_sets(back_sets)
|
||||||
|
if len(forward_sets) != len(back_sets):
|
||||||
|
x=', '.join(deleted_edges)
|
||||||
|
x=0
|
||||||
|
assert len(forward_sets) == len(back_sets), "OW edge pool is uneven due to prior connections: " + ', '.join(deleted_edges)
|
||||||
|
|
||||||
def connect_set(forward_set, back_set, connected_edges):
|
def connect_set(forward_set, back_set, connected_edges):
|
||||||
if forward_set is not None and back_set is not None:
|
if forward_set is not None and back_set is not None:
|
||||||
assert len(forward_set) == len(back_set)
|
assert len(forward_set) == len(back_set)
|
||||||
@@ -468,32 +485,10 @@ def link_overworld(world, player):
|
|||||||
for key in groupKeys:
|
for key in groupKeys:
|
||||||
(mode, wrld, dir, terrain, parallel, count, _) = key
|
(mode, wrld, dir, terrain, parallel, count, _) = key
|
||||||
(forward_edge_sets, back_edge_sets) = groups[key]
|
(forward_edge_sets, back_edge_sets) = groups[key]
|
||||||
def remove_connected():
|
|
||||||
deleted_edges = []
|
|
||||||
s = 0
|
|
||||||
while s < len(forward_edge_sets):
|
|
||||||
forward_set = forward_edge_sets[s]
|
|
||||||
if forward_set[0] in connected_edges:
|
|
||||||
deleted_edges.extend(forward_edge_sets[s])
|
|
||||||
del forward_edge_sets[s]
|
|
||||||
continue
|
|
||||||
s += 1
|
|
||||||
s = 0
|
|
||||||
while s < len(back_edge_sets):
|
|
||||||
back_set = back_edge_sets[s]
|
|
||||||
if back_set[0] in connected_edges:
|
|
||||||
deleted_edges.extend(back_edge_sets[s])
|
|
||||||
del back_edge_sets[s]
|
|
||||||
continue
|
|
||||||
s += 1
|
|
||||||
if len(forward_edge_sets) != len(back_edge_sets):
|
|
||||||
x=', '.join(deleted_edges)
|
|
||||||
x=0
|
|
||||||
assert len(forward_edge_sets) == len(back_edge_sets), "OW edge pool is uneven due to prior connections: " + ', '.join(deleted_edges)
|
|
||||||
|
|
||||||
remove_connected()
|
remove_connected()
|
||||||
random.shuffle(forward_edge_sets)
|
random.shuffle(forward_edge_sets)
|
||||||
random.shuffle(back_edge_sets)
|
random.shuffle(back_edge_sets)
|
||||||
|
|
||||||
if wrld is None and len(force_crossed) + len(force_noncrossed) > 0:
|
if wrld is None and len(force_crossed) + len(force_noncrossed) > 0:
|
||||||
# divide forward/back sets into LW/DW
|
# divide forward/back sets into LW/DW
|
||||||
forward_lw_sets, forward_dw_sets = [], []
|
forward_lw_sets, forward_dw_sets = [], []
|
||||||
@@ -501,24 +496,20 @@ def link_overworld(world, player):
|
|||||||
forward_parallel_lw_sets, forward_parallel_dw_sets = [], []
|
forward_parallel_lw_sets, forward_parallel_dw_sets = [], []
|
||||||
back_parallel_lw_sets, back_parallel_dw_sets = [], []
|
back_parallel_lw_sets, back_parallel_dw_sets = [], []
|
||||||
|
|
||||||
|
def add_edgeset_to_worldsets(edge_set, sets, parallel_sets):
|
||||||
|
sets.append(edge_set)
|
||||||
|
if parallel == IsParallel.Yes:
|
||||||
|
parallel_sets.append([parallel_links_new[e] for e in edge_set])
|
||||||
for edge_set in forward_edge_sets:
|
for edge_set in forward_edge_sets:
|
||||||
if world.get_owedge(edge_set[0], player).is_lw(world):
|
if world.get_owedge(edge_set[0], player).is_lw(world):
|
||||||
forward_lw_sets.append(edge_set)
|
add_edgeset_to_worldsets(edge_set, forward_lw_sets, forward_parallel_lw_sets)
|
||||||
if parallel == IsParallel.Yes:
|
|
||||||
forward_parallel_lw_sets.append([parallel_links_new[e] for e in edge_set])
|
|
||||||
else:
|
else:
|
||||||
forward_dw_sets.append(edge_set)
|
add_edgeset_to_worldsets(edge_set, forward_dw_sets, forward_parallel_dw_sets)
|
||||||
if parallel == IsParallel.Yes:
|
|
||||||
forward_parallel_dw_sets.append([parallel_links_new[e] for e in edge_set])
|
|
||||||
for edge_set in back_edge_sets:
|
for edge_set in back_edge_sets:
|
||||||
if world.get_owedge(edge_set[0], player).is_lw(world):
|
if world.get_owedge(edge_set[0], player).is_lw(world):
|
||||||
back_lw_sets.append(edge_set)
|
add_edgeset_to_worldsets(edge_set, back_lw_sets, back_parallel_lw_sets)
|
||||||
if parallel == IsParallel.Yes:
|
|
||||||
back_parallel_lw_sets.append([parallel_links_new[e] for e in edge_set])
|
|
||||||
else:
|
else:
|
||||||
back_dw_sets.append(edge_set)
|
add_edgeset_to_worldsets(edge_set, back_dw_sets, back_parallel_dw_sets)
|
||||||
if parallel == IsParallel.Yes:
|
|
||||||
back_parallel_dw_sets.append([parallel_links_new[e] for e in edge_set])
|
|
||||||
|
|
||||||
crossed_sets = []
|
crossed_sets = []
|
||||||
noncrossed_sets = []
|
noncrossed_sets = []
|
||||||
@@ -527,7 +518,7 @@ def link_overworld(world, player):
|
|||||||
affected_edges = set(sets[i]+(parallel_sets[i] if parallel == IsParallel.Yes else []))
|
affected_edges = set(sets[i]+(parallel_sets[i] if parallel == IsParallel.Yes else []))
|
||||||
if sets[i] not in crossed_sets and len(set.intersection(set(force_crossed), affected_edges)) > 0:
|
if sets[i] not in crossed_sets and len(set.intersection(set(force_crossed), affected_edges)) > 0:
|
||||||
crossed_sets.append(sets[i])
|
crossed_sets.append(sets[i])
|
||||||
if sets not in noncrossed_sets and len(set.intersection(set(force_noncrossed), affected_edges)) > 0:
|
if sets[i] not in noncrossed_sets and len(set.intersection(set(force_noncrossed), affected_edges)) > 0:
|
||||||
noncrossed_sets.append(sets[i])
|
noncrossed_sets.append(sets[i])
|
||||||
if sets[i] in crossed_sets and sets[i] in noncrossed_sets:
|
if sets[i] in crossed_sets and sets[i] in noncrossed_sets:
|
||||||
raise GenerationException('Conflict in force crossed/non-crossed definition')
|
raise GenerationException('Conflict in force crossed/non-crossed definition')
|
||||||
@@ -537,50 +528,33 @@ def link_overworld(world, player):
|
|||||||
add_to_crossed_sets(back_dw_sets, back_parallel_dw_sets)
|
add_to_crossed_sets(back_dw_sets, back_parallel_dw_sets)
|
||||||
|
|
||||||
# random connect forced crossed/noncrossed
|
# random connect forced crossed/noncrossed
|
||||||
c = 0
|
def connect_forced(forced_sets, is_crossed, opposite_sets=[]):
|
||||||
while c < len(noncrossed_sets):
|
c = 0
|
||||||
if noncrossed_sets[c] in forward_edge_sets:
|
while c < len(forced_sets):
|
||||||
forward_set = noncrossed_sets[c]
|
if forced_sets[c] in forward_edge_sets:
|
||||||
if forward_set in forward_lw_sets:
|
forward_set = forced_sets[c]
|
||||||
back_set = next(s for s in back_lw_sets if s in back_edge_sets and s not in crossed_sets)
|
if (forward_set in forward_lw_sets) != is_crossed:
|
||||||
|
back_set = next(s for s in back_lw_sets if s in back_edge_sets and s not in opposite_sets)
|
||||||
|
else:
|
||||||
|
back_set = next(s for s in back_dw_sets if s in back_edge_sets and s not in opposite_sets)
|
||||||
|
elif forced_sets[c] in back_edge_sets:
|
||||||
|
back_set = forced_sets[c]
|
||||||
|
if (back_set in back_lw_sets) != is_crossed:
|
||||||
|
forward_set = next(s for s in forward_lw_sets if s in forward_edge_sets and s not in opposite_sets)
|
||||||
|
else:
|
||||||
|
forward_set = next(s for s in forward_dw_sets if s in forward_edge_sets and s not in opposite_sets)
|
||||||
else:
|
else:
|
||||||
back_set = next(s for s in back_dw_sets if s in back_edge_sets and s not in crossed_sets)
|
c = c + 1
|
||||||
elif noncrossed_sets[c] in back_edge_sets:
|
continue
|
||||||
back_set = noncrossed_sets[c]
|
connect_set(forward_set, back_set, connected_edges)
|
||||||
if back_set in back_lw_sets:
|
remove_connected(forward_edge_sets, back_edge_sets)
|
||||||
forward_set = next(s for s in forward_lw_sets if s in forward_edge_sets and s not in crossed_sets)
|
|
||||||
else:
|
|
||||||
forward_set = next(s for s in forward_dw_sets if s in forward_edge_sets and s not in crossed_sets)
|
|
||||||
else:
|
|
||||||
c = c + 1
|
c = c + 1
|
||||||
continue
|
connect_forced(noncrossed_sets, False, crossed_sets)
|
||||||
connect_set(forward_set, back_set, connected_edges)
|
connect_forced(crossed_sets, True)
|
||||||
remove_connected()
|
|
||||||
c = c + 1
|
|
||||||
c = 0
|
|
||||||
while c < len(crossed_sets):
|
|
||||||
if crossed_sets[c] in forward_edge_sets:
|
|
||||||
forward_set = crossed_sets[c]
|
|
||||||
if forward_set in forward_lw_sets:
|
|
||||||
back_set = next(s for s in back_dw_sets if s in back_edge_sets)
|
|
||||||
else:
|
|
||||||
back_set = next(s for s in back_lw_sets if s in back_edge_sets)
|
|
||||||
elif crossed_sets[c] in back_edge_sets:
|
|
||||||
back_set = crossed_sets[c]
|
|
||||||
if back_set in back_lw_sets:
|
|
||||||
forward_set = next(s for s in forward_dw_sets if s in forward_edge_sets)
|
|
||||||
else:
|
|
||||||
forward_set = next(s for s in forward_lw_sets if s in forward_edge_sets)
|
|
||||||
else:
|
|
||||||
c = c + 1
|
|
||||||
continue
|
|
||||||
connect_set(forward_set, back_set, connected_edges)
|
|
||||||
remove_connected()
|
|
||||||
c = c + 1
|
|
||||||
|
|
||||||
while len(forward_edge_sets) > 0 and len(back_edge_sets) > 0:
|
while len(forward_edge_sets) > 0 and len(back_edge_sets) > 0:
|
||||||
connect_set(forward_edge_sets[0], back_edge_sets[0], connected_edges)
|
connect_set(forward_edge_sets[0], back_edge_sets[0], connected_edges)
|
||||||
remove_connected()
|
remove_connected(forward_edge_sets, back_edge_sets)
|
||||||
assert len(connected_edges) == len(default_connections) * 2, connected_edges
|
assert len(connected_edges) == len(default_connections) * 2, connected_edges
|
||||||
|
|
||||||
world.owsectors[player] = build_sectors(world, player)
|
world.owsectors[player] = build_sectors(world, player)
|
||||||
|
|||||||
Reference in New Issue
Block a user