-
Notifications
You must be signed in to change notification settings - Fork 0
/
worldgen.py
119 lines (85 loc) · 2.95 KB
/
worldgen.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
from enum import Enum
from math import floor
from math import pi
from random import randint
from pygame import Color
# CONSTANTS: CHANGE IF YOU WANT TO MODIFY WORLDGEN
ELEV_OCTAVE = 8 # How large / detailed you want the world. POSITIVE INTEGER, DEFAULT=4
ELEV_POWER = 1.5 # Higher values give higher peaks, lower valleys. POSITIVE FLOAT, DEFAULT=2.0
MOIST_OCTAVE = 4 # Same as above but for moisture.
MOIST_POWER = 2.0
POLE = 0.1 # Areas closer to the poles are colder, this changes the size of them
EQUATOR = -0.1 # Changes the size of the hotter equator region
WATER = 16
SEED = [randint(0, 999999) for i in range(6)] # Randomly generated seeds array. Size 6.
# END CONSTANTS
def biome(elevation: float, moisture: float):
if elevation < 10: return Biome.DEEP_OCEAN
if elevation < 16: return Biome.OCEAN
if elevation < 20: return Biome.BEACH
if elevation > 80:
if moisture < 10: return Biome.ASHEN
if moisture < 20: return Biome.DRY_DESERT
if moisture < 50: return Biome.TUNDRA
return Biome.SNOW
if elevation > 60:
if moisture < 33: return Biome.TEMPERATE_DESERT
if moisture < 66: return Biome.OUTBACK
return Biome.TAIGA
if elevation > 40:
if moisture < 16: return Biome.TEMPERATE_DESERT
if moisture < 66: return Biome.PLAINS
if moisture < 85: return Biome.WOODLAND
return Biome.JUNGLE
if elevation > 20:
if moisture < 16: return Biome.DESERT
if moisture < 33: return Biome.PLAINS
return Biome.TROPICAL
class Biome(Enum):
# Hex-codes correspond to each biome and are used in the code for maps etc
DEEP_OCEAN = 0x100
OCEAN = 0x200
BEACH = 0x300
ASHEN = 0x003
DRY_DESERT = 0x013
TUNDRA = 0x023
SNOW = 0x033
TEMPERATE_DESERT = 0x012
OUTBACK = 0x022
TAIGA = 0x032
PLAINS = 0x011
WOODLAND = 0x021
JUNGLE = 0x031
DESERT = 0x010
TROPICAL = 0x020
colorMap = {
Biome.DEEP_OCEAN: 0x50C45,
Biome.OCEAN: 0x0D1EA8,
Biome.BEACH: 0xDECC9b,
Biome.ASHEN: 0x898580,
Biome.DRY_DESERT: 0xA29F78,
Biome.TUNDRA: 0xB9D79F,
Biome.SNOW: 0xBCD7C4,
Biome.TEMPERATE_DESERT: 0x9EA959,
Biome.OUTBACK: 0x89A45A,
Biome.TAIGA: 0x69843A,
Biome.PLAINS: 0x73A86A,
Biome.WOODLAND: 0x4A6E44,
Biome.JUNGLE: 0x006226,
Biome.DESERT: 0xCEC079,
Biome.TROPICAL: 0xADC767
}
class Terrain:
def __init__(self, e: float, m: float):
"""
e is perlin elevation
m is perlin moisture
"""
if e > 1.0: e = 1.0
elif e < 0.0: e = 0.0
# Weird solution, might refactor later.
# We want to multiply the perlin value by 100 and take the floor to get its integer equivalent.
# The while loop checks if the "heat value" that corresponds with the perlin val exists, and
# tries to find the next closest down if not.
biomeKey = floor(e * 100.0)
self.biome = biome(biomeKey)