def buildRiver(self, siteOneID, siteTwoID, river, allRivers): oldRiverPiece = river[-1][2] saiteL = self.worldSites[siteOneID] saiteR = self.worldSites[siteTwoID] borderLeft = 0 borderRight = 0 leftReversed = False rightReversed = False for bordrderL in saiteL.borders: if oldRiverPiece.end == bordrderL.start and oldRiverPiece.start != bordrderL.end: break elif oldRiverPiece.end == bordrderL.end and oldRiverPiece.start != bordrderL.start: leftReversed = True break borderLeft += 1 for bordrderR in saiteR.borders: if oldRiverPiece.end == bordrderR.start and oldRiverPiece.start != bordrderR.end: break elif oldRiverPiece.end == bordrderR.end and oldRiverPiece.start != bordrderR.start: rightReversed = True break borderRight += 1 if ( borderLeft < len(saiteL.borders) and borderRight < len(saiteR.borders) and saiteL.borders[borderLeft].elevation > saiteR.borders[borderRight].elevation and saiteL.borders[borderLeft].elevation >= oldRiverPiece.elevation ): #generate left if leftReversed: reversedBorder = Border(saiteL.borders[borderLeft].end, saiteL.borders[borderLeft].start) reversedBorder.elevation = saiteL.borders[borderLeft].elevation river.append((siteOneID, borderLeft, reversedBorder)) else: river.append((siteOneID, borderLeft, saiteL.borders[borderLeft])) self.buildRiver(siteTwoID, saiteL.neighbours[borderLeft], river, allRivers) elif borderRight < len(saiteR.borders) and saiteR.borders[borderRight].elevation >= oldRiverPiece.elevation: #generate right if rightReversed: reversedBorder = Border(saiteR.borders[borderRight].end, saiteR.borders[borderRight].start) reversedBorder.elevation = saiteR.borders[borderRight].elevation river.append((siteTwoID, borderRight, reversedBorder)) else: river.append((siteTwoID, borderRight, saiteR.borders[borderRight])) self.buildRiver(siteTwoID, saiteR.neighbours[borderRight], river, allRivers)
def generateRivers(self): self.rivers = [] self.markOceans() self.calcBorderElevation() for site in self.worldSites.items(): if site[1].elevation in range(3): neighbouringWater = None idx = 0 for neighbour in site[1].neighbours: if self.worldSites[neighbour].elevation < 0 and neighbouringWater == None: neighbouringWater = neighbour break if neighbouringWater != None: for neighbour in site[1].neighbours: if self.worldSites[neighbour].hasNeighbour(neighbouringWater) and self.worldSites[neighbour].elevation >= 0: newRiver = [] isReversed = False for edge in self.worldSites[neighbouringWater].borders: if edge.start == site[1].borders[idx].end or edge.end == site[1].borders[idx].end: isReversed = True break if isReversed: reversedBorder = Border(site[1].borders[idx].end, site[1].borders[idx].start) reversedBorder.elevation = site[1].borders[idx].elevation newRiver.append((site[0], idx, reversedBorder)) else: newRiver.append((site[0], idx, site[1].borders[idx])) self.rivers.append(newRiver) self.buildRiver(site[0], neighbour, newRiver, self.rivers) break idx += 1 filteredRivers = [river for river in self.rivers if len(river) > 9 and abs(river[-1][2].elevation - river[0][2].elevation) > 5] self.rivers = [] for filteredRiver in filteredRivers: hasHits = False for part in filteredRiver: for river in self.rivers: for riverPart in river: if (part[2].start == riverPart[2].start or part[2].end == riverPart[2].start or part[2].start == riverPart[2].end or part[2].end == riverPart[2].end): hasHits = True break if hasHits: break if hasHits: break if not hasHits: self.rivers.append(filteredRiver) for river in self.rivers: step = int(len(river)/8) width = 8 idx = 0 for part in river: self.worldSites[part[0]].borders[part[1]].isRiver = True self.worldSites[part[0]].borders[part[1]].riverWidth = width idx += 1 if idx == step: idx = 0 width -= 1 print("Result:") print("Rivers: ", len(self.rivers))