From 89ad35bdf9438d84da60a492c8a3e921d361419c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Klupie=C4=87?= Date: Sun, 9 May 2021 16:36:28 +0200 Subject: [PATCH 01/10] Add tile cost --- assets/atlas.png | Bin 10657 -> 14024 bytes survival/tile.py | 10 +++------- survival/tile_generator.py | 19 +++++++++++++++++++ survival/tile_layer.py | 4 ++-- 4 files changed, 24 insertions(+), 9 deletions(-) create mode 100644 survival/tile_generator.py diff --git a/assets/atlas.png b/assets/atlas.png index 07f1d2d33d90cce83aa9be71cc6c332f15934b33..506bb7f1f1dee8e5961f6fe8b833ef4965f0f72d 100644 GIT binary patch literal 14024 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 Date: Sun, 9 May 2021 16:36:47 +0200 Subject: [PATCH 02/10] Update stevenson.png rgb --- assets/stevenson.png | Bin 2021 -> 2051 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/stevenson.png b/assets/stevenson.png index 9caa64f8681cdd60eb01d22c0b109253cade59f5..90c91bd698afdd07f97286e00313d8cd3233dcb3 100644 GIT binary patch delta 2037 zcmVH{G_Un;dAq#%$GtwKvBP!&o`tdfA`kkZ7- zu08u>nweS8u4(?Ol}4kT^S}Rl&pr3tvwwFKd_qcDzy9lw?vtvf zqN1Pxo)Ea6L`am6Kl`3vlc8}p^Z(_C_W?*cON_XZ(sKGFpZEB z6ePWez5uFV`r=QJ5`+k2EgXa=XryZ;e@%b&147D{@z>^|kP_i}P1_6Q07&RN{6#dQ z6Y0A2J@9#oqkk`eyz`@*fqOr5hQ-1-rHemqY*Nek*Yjwag6qka@NYyh@Zd9aCHAkq zdGb@f?1gdwO^3Y?e}&0Q=a9C|y~jr=jlR$jfTBfW-w6QXkDey`$L9dhH9%_(zqUcI zDZue>M8Ev#>og8OdKx{pt==br?S*;hp|8G&qA29Y|9^ngDkzGwCP#=GHNL`?*ILH8 zo_{?|vqj#&4z>)};a z5DG0@gQalr?8Q}nm*ml};dm8h8j`}u`JH8kANxU7|MFZ_e+zJG`V`MUUck^|IOTaX zT}L=JQaF71l^y_6Lqopp`F4PjvlpZk6049WlYiQWuIuQUisO2?ZW7yZu&nbkc_oRa zs{H&*$0O;IC%^q`J(JqU!tx3W^9y($^lsaWX&PA5r{b?bISO81`p^GLCX>h8jt%tqz_?bhD_cVJ+E#drr3H?x>A zlit)Ww)Jdhets^W$z-6qEA^EL`gQ=zDp0AcAcTiyO<~45P-`9FI@pymLQ0CoJZ5b3 zv-7hf$0UFd9R^baJe3Et8@-Q37#F$|Nw9Vt3{w*xT0xI#}?hi`kn z9bhV-$1bk`l42o`8H?8oGPM~1P=6>`7-l?xq@a+@7PBlA^BjHTF>Kpm{2%YKwAdXX z=ho3*%ufN}t}L+sqlYm~gSY?mI^A}%`UAyaw&dTQ{|GQR$a2M|Xyr&Glf=#H3;?hl zmz9c5(VDEz05jqUFpxpjV$}#>+w=|XA{LKRv?e3t+$#D9k|_Wx93Y(@ z!f`$FmPI<9LQ^$r{q1=I+kbJ%TT`S`L+DyG+o1IDPCai~&fs7IMbUZx`VBnCWgxYi zuI_H~)>I_Cur>4pq|zAx78kZLF>w>k(CHc6MKYB})l{gCspHpPfCx}hK%yHah2r#@ z*(Rk#3W08#6pPb}qK2w4-w`u2GmdVU%-*`ieDOLe8p3m!Gdt)@?|(%%qnmkKK|jFE z%nSgtlkX$!6;#bY;9+)j0?^;T!}s7rkO(l8s9ztmz6TNx96Sub*yVRYg>%Z&q>_U{ z_+5w~xEYB{nGQSjQ z1@43RYiJjLJM}km$|epYhIRnmG|=KYAnPU3Rzh#sYqyKPoqzfpIrS#$4ow~5P*otp zEzefRhe3aHuG{*^w;`lxQ$yOQf3q|<=KzYbdNTel#fLzDlMcX^i306_=eqy*`kOn( zDV6qx-*sqLJ6g@V*?dh!08Ld}_AFG^*_|Ij)iu)B#+lr+ z|IQC>61L3X18(a2S9RJ1DI}SRD}kR2V>)h^r zE#dqiG!|iAe(r2r+R!lYl7KO(=~p?T{15(4$V^;mixd2pvj;eVv)KqU>l^VOeZgY| TJgWYA00000NkvXXu0mjfrDOh7 delta 2007 zcmV;|2PpW15akb$B!8?)L_t(|oaI|vY+Oef{^s0v?fMqm>%H1(8x-Fxr4Vqc+vT-fQe4N1uG#Yn6dOlti08qA36PBPxVPb z8o_*lfMVpx7XZP<%Eh1XGS>}KTQD%e?R4GbZ|ZOS0WPIo<8O{b#_2jv$Mpqr0H%8M z=ocZ%{h+pu(SQ3s5987=czHK)*QcIAMV~|Q;*Z;#)HVL?JfcW=1n36;P85mzpTI!! z(5;21KjEpqKn@^Ez<~$9g2LtJK}{2Pot#0DIe_O0r86WCp5o8PA3lrxU!H0R5n02! z!!Pb&H75P!H^QI(q-`1}A3h5yHr%p_@A`r~^uSl&27e(0+T5Q(#X7%l&k@2#lTW|; zV%Ip^!T7gBQM%;)+tBR%o!aCDLXd|xUaLTx{UanX22qY9fAQBSzqE$6Kiu3iVY|Wk z4~6>{IDZsKp7_?gSa&Mx2AB<)EtpN(UtST&0am5oqmc%=JPl&bSCpR(no;=1(%LUk zwEx8U?|=UEGm#j6>eSP%`^?Gj!rCZxy$wt|vjMXOvq}5QD}t>8Tnmm>1*Ik&+ksQx zgiE?N2XlV2vc+#Bb^L3voH|z9lETpWttuuT`9VW}b*-Vl3plfK22Ve#Ll$GOYGsI$ z1lKZoo4)+Q5N|*xo%Y-i&kiti?gFJQg{o`FWq%Grk|ao?0Lyk@+bNiq1ywyyQ&&@b zefsk+oeae!kA3^M660U5ZeqQ>4z>~+89o3-k)f`fiN65U!r=9!|NL)gDiyANmivDH z@)4M(g_~<@5Jg~cXbgk>IRMM7KW#sid3FFzH{iMsUwbYUR0yKDm3UBIZd(o;8qf^` zqJI!xC~zHTeE!-3%Ed)I@Uf4hUbiqedkOtRNyhI>ydU(6ex^~=3{=ZH4ox3JEGFZP zS6{|ZVhW-xj>XbO&f)!Jjv#gl#Mv%=?sqJqEXMZ1oMkaFzY79CV%e4z~BJm56uCh*53v@kw~Bt@591k9!gBX zNM=8VhxVadUej_p770MS?uvMJ09DmdXLG&lKvkEa#QGpK4PaX^>ovYRWf&Ti*xqO7 ztn=BG@s|u0)r~UlKYjwWx`nG(E}>Ex;rwACYW+>Pt_w{qz^vTF!NbQ8kIA_B`hNvD zwOeLB&xY_70jjk+wB;ovQyKKd6bM3NJTRn`VuV5 z#7J@ycMJ@0{;<$1`V+}Ug12$UAg<^0kYxp)e5h_qB(#(J@U;}4$V5n%T6CBz2y z1>O#QzvyRJ(HlvAy>bK7M~*cjz+Yd4>sSEcs}Ii!ApAH$Hk;;iou;bDW;1-L)3i6s zg4rn0)MaEcX-Hx?%b@J!lz*hDsx>i@1R)aMnZFLlvXRKJRlp$U4-37ZpCOawSw1T3 z!&q2YgeXfGn%Iw2CJS~(VXIFqul4ze07b$ai+Q(htlTo%*gQyG7m}jDFjfc=0_`xr zCstQiEyiEEaRX&z9s)$}`D;oaMzaSve^}@R{b<;LUrU8|;F_BdM1L7B94LMLynK9o z%yZ|%R|H5WTlXi_@9`irefTKslw6FRC9SM8< z?97gHOx1dn{O&uC`G0Ca5ZuoEkDr~vE^~aVKY#VjpL(hmvBk|^tSvzi*a6s_S1oN|v%C@N4%}}1O+>{XrT%tK+QDJOzz!g>z3{li zqmd9|(z6?X6H)O;slT05>R{iYqaz%=4IwUhdL17G{hhgP_kSbbj^OifB*f9sVh=TU z<^Y6jos7Rt@d41^p#$_z6o>-sINJMNe`m)yDTyxpZbMY<=r-?O^K}#f_=%Wkj>Gqi z<3**v9i7-Ba0JL+n?ru;Ll7j9-xuyazrYeUk@r0M_9Q zlZ$UPwulL7l~9F^uYc|#n%m-7y7OQU82N0{HizZaPB pD4gJ3&hFy`&R!$PsBZzl{{Vf#V+A$pOppKo002ovPDHLkV1k2o Date: Sun, 9 May 2021 18:11:25 +0200 Subject: [PATCH 03/10] Add A* to graph search --- survival/game_map.py | 3 + survival/graph_search.py | 81 ++++++++++++------- .../systems/pathfinding_movement_system.py | 1 - survival/tile_layer.py | 3 + 4 files changed, 59 insertions(+), 29 deletions(-) diff --git a/survival/game_map.py b/survival/game_map.py index b8563be..f8dca9e 100644 --- a/survival/game_map.py +++ b/survival/game_map.py @@ -24,3 +24,6 @@ class GameMap: def is_colliding(self, pos): return pos[0] < 0 or pos[0] >= self.width or pos[1] < 0 or pos[1] >= self.height or self.entity_layer.is_colliding(pos) + + def get_cost(self, pos): + return self.tile_layer.get_cost(pos) diff --git a/survival/graph_search.py b/survival/graph_search.py index 92054e7..77b4138 100644 --- a/survival/graph_search.py +++ b/survival/graph_search.py @@ -1,4 +1,5 @@ from enum import Enum +from queue import PriorityQueue from survival import GameMap from survival.components.position_component import PositionComponent @@ -12,67 +13,84 @@ class Action(Enum): class State: - def __init__(self, position, direction): + def __init__(self, position: tuple[int, int], direction: Direction): self.position = position self.direction = direction class Node: - def __init__(self, state: State, parent=None, action=None): + def __init__(self, state: State, parent=None, action=None, cost=None): self.state = state self.parent = parent self.action = action + self.cost = cost + + def __lt__(self, other): + return self.cost < other.cost + + def __eq__(self, other): + return self.cost == other.cost -def get_moved_position(position, direction): +def get_moved_position(position: tuple[int, int], direction: Direction): vector = Direction.get_vector(direction) return position[0] + vector[0], position[1] + vector[1] -def get_states(state: State, game_map: GameMap): +def get_states(state: State, game_map: GameMap) -> list[tuple[Action, State, int]]: states = list() - states.append((Action.ROTATE_LEFT, State(state.position, state.direction.rotate_left(state.direction)))) - states.append((Action.ROTATE_RIGHT, State(state.position, state.direction.rotate_right(state.direction)))) + states.append((Action.ROTATE_LEFT, State(state.position, state.direction.rotate_left(state.direction)), 1)) + states.append((Action.ROTATE_RIGHT, State(state.position, state.direction.rotate_right(state.direction)), 1)) - target_state = get_moved_position(state.position, state.direction) - if not game_map.is_colliding(target_state): - states.append((Action.MOVE, State(target_state, state.direction))) + target_position = get_moved_position(state.position, state.direction) + if not game_map.is_colliding(target_position): + states.append((Action.MOVE, State(target_position, state.direction), game_map.get_cost(target_position))) return states +def build_path(node: Node): + actions = [node.action] + parent = node.parent + + while parent is not None: + if parent.action is not None: + actions.append(parent.action) + parent = parent.parent + + actions.reverse() + return actions + + +def heuristic(new_node: Node, goal: tuple[int, int]): + return abs(new_node.state.position[0] - goal[0]) + abs(new_node.state.position[1] - goal[1]) + + def graph_search(game_map: GameMap, start: PositionComponent, goal: tuple): - fringe = list() + fringe = PriorityQueue() explored = list() explored_states = set() - fringe_states = set() + fringe_states = set() # Stores positions and directions of states start = State(start.grid_position, start.direction) - fringe.append(Node(start)) + fringe.put((0, Node(start, cost=0))) fringe_states.add((tuple(start.position), start.direction)) while True: # No solutions found - if not any(fringe): + if fringe.empty(): return [] - node = fringe.pop(0) + node = fringe.get() + node_priority = node[0] + node = node[1] fringe_states.remove((tuple(node.state.position), node.state.direction)) # Check goal if node.state.position == goal: - actions = [node.action] - parent = node.parent - - while parent is not None: - if parent.action is not None: - actions.append(parent.action) - parent = parent.parent - - actions.reverse() - return actions + return build_path(node) explored.append(node) explored_states.add((tuple(node.state.position), node.state.direction)) @@ -80,9 +98,16 @@ def graph_search(game_map: GameMap, start: PositionComponent, goal: tuple): # Get all possible states for state in get_states(node.state, game_map): sub_state = (tuple(state[1].position), state[1].direction) + new_node = Node(state=state[1], + parent=node, + action=state[0], + cost=(state[2] + node.cost)) + + priority = new_node.cost + heuristic(new_node, goal) if sub_state not in fringe_states and sub_state not in explored_states: - new_node = Node(state=state[1], - parent=node, - action=state[0]) - fringe.append(new_node) + fringe.put((priority, new_node)) + fringe_states.add((tuple(new_node.state.position), new_node.state.direction)) + elif sub_state in fringe_states and node.cost > new_node.cost: + fringe.get(node) + fringe.put((priority, new_node)) fringe_states.add((tuple(new_node.state.position), new_node.state.direction)) diff --git a/survival/systems/pathfinding_movement_system.py b/survival/systems/pathfinding_movement_system.py index 551abd4..c9d6078 100644 --- a/survival/systems/pathfinding_movement_system.py +++ b/survival/systems/pathfinding_movement_system.py @@ -5,7 +5,6 @@ from survival.components.moving_component import MovingComponent from survival.components.position_component import PositionComponent from survival.enums import Direction from survival.graph_search import graph_search, Action -from survival.pathfinding import breadth_first_search from survival.systems.input_system import PathfindingComponent diff --git a/survival/tile_layer.py b/survival/tile_layer.py index bd7797e..abbfb65 100644 --- a/survival/tile_layer.py +++ b/survival/tile_layer.py @@ -18,3 +18,6 @@ class TileLayer: self.image.pos = (x * 32, y * 32) self.image.origin = self.tiles[y][x].origin camera.draw(self.image) + + def get_cost(self, pos): + return self.tiles[pos[1]][pos[0]].cost From c3a8704b7940878be9c7b17a7886de8e45920f57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Klupie=C4=87?= Date: Sun, 9 May 2021 18:12:18 +0200 Subject: [PATCH 04/10] Increase some tiles cost to make cost-based pathfinding more visible --- survival/tile_generator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/survival/tile_generator.py b/survival/tile_generator.py index a8470ca..5479e79 100644 --- a/survival/tile_generator.py +++ b/survival/tile_generator.py @@ -9,8 +9,8 @@ class TileGenerator: [(32, 0), 1], # Grass 2 [(64, 0), 1], # Grass 3 [(96, 0), 1], # Grass 4 - [(64, 64), 2], # Sand - [(96, 64), 2], # Poddle + [(64, 64), 20], # Sand + [(96, 64), 20], # Puddle ] @staticmethod From e7f119849952f252e18ebe0dffd7783c3bfcade9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Klupie=C4=87?= Date: Mon, 10 May 2021 11:02:36 +0200 Subject: [PATCH 05/10] Move generators to separate directory --- survival/__init__.py | 6 +++--- survival/{ => generators}/building_generator.py | 0 survival/{ => generators}/player_generator.py | 0 survival/{ => generators}/resource_generator.py | 0 survival/{ => generators}/tile_generator.py | 0 survival/{ => generators}/world_generator.py | 0 survival/tile_layer.py | 2 +- 7 files changed, 4 insertions(+), 4 deletions(-) rename survival/{ => generators}/building_generator.py (100%) rename survival/{ => generators}/player_generator.py (100%) rename survival/{ => generators}/resource_generator.py (100%) rename survival/{ => generators}/tile_generator.py (100%) rename survival/{ => generators}/world_generator.py (100%) diff --git a/survival/__init__.py b/survival/__init__.py index b0e66dc..6a9abf7 100644 --- a/survival/__init__.py +++ b/survival/__init__.py @@ -3,9 +3,9 @@ import pygame from settings import SCREEN_WIDTH, SCREEN_HEIGHT from survival.camera import Camera from survival.game_map import GameMap -from survival.player_generator import PlayerGenerator -from survival.resource_generator import ResourceGenerator -from survival.world_generator import WorldGenerator +from survival.generators.player_generator import PlayerGenerator +from survival.generators.resource_generator import ResourceGenerator +from survival.generators.world_generator import WorldGenerator if __name__ == '__main__': pygame.init() diff --git a/survival/building_generator.py b/survival/generators/building_generator.py similarity index 100% rename from survival/building_generator.py rename to survival/generators/building_generator.py diff --git a/survival/player_generator.py b/survival/generators/player_generator.py similarity index 100% rename from survival/player_generator.py rename to survival/generators/player_generator.py diff --git a/survival/resource_generator.py b/survival/generators/resource_generator.py similarity index 100% rename from survival/resource_generator.py rename to survival/generators/resource_generator.py diff --git a/survival/tile_generator.py b/survival/generators/tile_generator.py similarity index 100% rename from survival/tile_generator.py rename to survival/generators/tile_generator.py diff --git a/survival/world_generator.py b/survival/generators/world_generator.py similarity index 100% rename from survival/world_generator.py rename to survival/generators/world_generator.py diff --git a/survival/tile_layer.py b/survival/tile_layer.py index abbfb65..64d2b45 100644 --- a/survival/tile_layer.py +++ b/survival/tile_layer.py @@ -1,5 +1,5 @@ from survival.image import Image -from survival.tile_generator import TileGenerator +from survival.generators.tile_generator import TileGenerator class TileLayer: From e83d5323a6e2e8bb2253d6abf9ea8c55734f9055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Klupie=C4=87?= Date: Mon, 10 May 2021 12:56:08 +0200 Subject: [PATCH 06/10] Add biomes generation --- survival/biomes/biome_data.py | 9 ++++ survival/biomes/biome_preset.py | 22 +++++++++ survival/biomes/noise.py | 6 +++ survival/generators/tile_generator.py | 69 +++++++++++++++++++++++---- survival/tile.py | 3 +- survival/tile_layer.py | 4 +- 6 files changed, 102 insertions(+), 11 deletions(-) create mode 100644 survival/biomes/biome_data.py create mode 100644 survival/biomes/biome_preset.py create mode 100644 survival/biomes/noise.py diff --git a/survival/biomes/biome_data.py b/survival/biomes/biome_data.py new file mode 100644 index 0000000..eae1966 --- /dev/null +++ b/survival/biomes/biome_data.py @@ -0,0 +1,9 @@ +from survival.biomes.biome_preset import BiomePreset + + +class BiomeData: + def __init__(self, preset: BiomePreset): + self.biome = preset + + def get_diff_value(self, height: float, moisture: float, heat: float): + return (height - self.biome.min_height) + (moisture - self.biome.min_moisture) + (heat - self.biome.min_heat) diff --git a/survival/biomes/biome_preset.py b/survival/biomes/biome_preset.py new file mode 100644 index 0000000..b11cd3c --- /dev/null +++ b/survival/biomes/biome_preset.py @@ -0,0 +1,22 @@ +import random + +from survival.tile import Tile + + +class BiomePreset: + def __init__(self, name, min_height: float, min_moisture: float, min_heat: float, tiles: list[Tile]): + self.name = name + self.min_height = min_height + self.min_moisture = min_moisture + self.min_heat = min_heat + self.tiles = tiles + + def get_new_tile(self): + tile = random.choice(self.tiles) + return Tile(origin=tile.origin, cost=tile.cost, biome=self) + + def get_tile_sprite(self): + pass + + def match_conditions(self, height, moisture, heat): + return height >= self.min_height and moisture >= self.min_moisture and heat >= self.min_heat diff --git a/survival/biomes/noise.py b/survival/biomes/noise.py new file mode 100644 index 0000000..7635935 --- /dev/null +++ b/survival/biomes/noise.py @@ -0,0 +1,6 @@ +from perlin_noise import PerlinNoise + + +def generate_noise(width: int, height: int, octaves, seed): + noise_map = PerlinNoise(octaves=octaves, seed=seed) + return [[noise_map([x / width, y / height]) for y in range(width)] for x in range(height)] diff --git a/survival/generators/tile_generator.py b/survival/generators/tile_generator.py index 5479e79..22555cb 100644 --- a/survival/generators/tile_generator.py +++ b/survival/generators/tile_generator.py @@ -1,19 +1,70 @@ import random +from survival.biomes.biome_data import BiomeData +from survival.biomes.biome_preset import BiomePreset +from survival.biomes.noise import generate_noise from survival.tile import Tile class TileGenerator: - templates = [ - [(0, 0), 1], # Grass 1 - [(32, 0), 1], # Grass 2 - [(64, 0), 1], # Grass 3 - [(96, 0), 1], # Grass 4 - [(64, 64), 20], # Sand - [(96, 64), 20], # Puddle + Tiles = { + "Grass1": Tile(origin=(0, 0), cost=1), + "Grass2": Tile(origin=(32, 0), cost=1), + "Grass3": Tile(origin=(64, 0), cost=1), + "Grass4": Tile(origin=(96, 0), cost=1), + "Sand": Tile(origin=(64, 64), cost=20), + "Puddle": Tile(origin=(96, 64), cost=20), + } + + TilesValues = list(Tiles.values()) + + Biomes = [ + BiomePreset("Desert", min_height=0.2, min_moisture=0, min_heat=0.5, tiles=[Tiles["Grass1"], Tiles["Grass2"], + Tiles["Grass3"], Tiles["Grass4"]]), + BiomePreset("Grassland", min_height=0.2, min_moisture=0.5, min_heat=0.3, tiles=[Tiles["Sand"]]), + BiomePreset("Marsh", min_height=0.1, min_moisture=0.6, min_heat=0.2, tiles=[Tiles["Puddle"]]) ] @staticmethod def get_random_tile(): - template = random.choice(TileGenerator.templates) - return Tile(template[0], template[1]) + tile = random.choice(TileGenerator.TilesValues) + return Tile(origin=tile.origin, cost=tile.cost) + + @staticmethod + def generate_random_tiles(width: int, height: int) -> list[list[Tile]]: + return [[TileGenerator.get_random_tile() for _ in range(width)] for _ in range(height)] + + @staticmethod + def generate_biome_tiles(width: int, height: int): + seed = random.randint(0, 9999999) + octaves = 10 + height_map = generate_noise(width, height, octaves, seed) + moisture_map = generate_noise(width, height, octaves, seed) + heat_map = generate_noise(width, height, octaves, seed) + + return [[TileGenerator.get_biome(height_map[y][x], moisture_map[y][x], heat_map[y][x]).get_new_tile() for x in + range(width)] for y in range(height)] + + @staticmethod + def get_biome(height, moisture, heat) -> BiomePreset: + matching_biomes = list() + + for biome in TileGenerator.Biomes: + if biome.match_conditions(height, moisture, heat): + matching_biomes.append(BiomeData(biome)) + + current_value = 0 + found_biome = None + + for biome in matching_biomes: + if found_biome is None: + found_biome = biome.biome + current_value = biome.get_diff_value(height, moisture, heat) + elif biome.get_diff_value(height, moisture, heat) < current_value: + found_biome = biome.biome + current_value = biome.get_diff_value(height, moisture, heat) + + if found_biome is None: + found_biome = TileGenerator.Biomes[0] + + return found_biome diff --git a/survival/tile.py b/survival/tile.py index 6c23f22..00aa7fc 100644 --- a/survival/tile.py +++ b/survival/tile.py @@ -1,5 +1,6 @@ class Tile: - def __init__(self, origin, cost): + def __init__(self, origin: tuple = (0, 0), cost: int = 1, biome=None): self.origin = origin self.cost = cost + self.biome = biome self.image = None diff --git a/survival/tile_layer.py b/survival/tile_layer.py index 64d2b45..78ac9e0 100644 --- a/survival/tile_layer.py +++ b/survival/tile_layer.py @@ -1,12 +1,14 @@ from survival.image import Image from survival.generators.tile_generator import TileGenerator +from survival.tile import Tile class TileLayer: def __init__(self, width, height): self.width = width self.height = height - self.tiles = [[TileGenerator.get_random_tile() for x in range(self.width)] for y in range(self.height)] + self.tiles: list[list[Tile]] = TileGenerator.generate_biome_tiles(width, height) + # self.tiles: list[list[Tile]] = TileGenerator.generate_random_tiles(width, height) self.image = Image('atlas.png') def draw(self, camera, visible_area): From acc34031a2e96c21102ae06e3bb9afaa9fa3cae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Klupie=C4=87?= Date: Mon, 10 May 2021 13:04:11 +0200 Subject: [PATCH 07/10] Add more biomes for variety --- survival/generators/tile_generator.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/survival/generators/tile_generator.py b/survival/generators/tile_generator.py index 22555cb..3fc133d 100644 --- a/survival/generators/tile_generator.py +++ b/survival/generators/tile_generator.py @@ -21,8 +21,11 @@ class TileGenerator: Biomes = [ BiomePreset("Desert", min_height=0.2, min_moisture=0, min_heat=0.5, tiles=[Tiles["Grass1"], Tiles["Grass2"], Tiles["Grass3"], Tiles["Grass4"]]), + BiomePreset("Forest", min_height=0.2, min_moisture=0.4, min_heat=0.4, tiles=[Tiles["Sand"]]), BiomePreset("Grassland", min_height=0.2, min_moisture=0.5, min_heat=0.3, tiles=[Tiles["Sand"]]), - BiomePreset("Marsh", min_height=0.1, min_moisture=0.6, min_heat=0.2, tiles=[Tiles["Puddle"]]) + BiomePreset("Marsh", min_height=0.3, min_moisture=0.5, min_heat=0.62, tiles=[Tiles["Puddle"]]), + BiomePreset("Ocean", min_height=0, min_moisture=0, min_heat=0, tiles=[Tiles["Sand"]]), + BiomePreset("Tundra", min_height=0.2, min_moisture=0, min_heat=0, tiles=[Tiles["Puddle"]]) ] @staticmethod From ba1f6f6f781a5d201972279074ced6497cb40f1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Klupie=C4=87?= Date: Mon, 10 May 2021 13:06:29 +0200 Subject: [PATCH 08/10] Optimize imports --- assets/srgb_profile_fix.py | 1 + survival/esper.py | 8 +++----- survival/quad_tree.py | 1 - survival/tile_layer.py | 2 +- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/assets/srgb_profile_fix.py b/assets/srgb_profile_fix.py index 8869722..72c4d16 100644 --- a/assets/srgb_profile_fix.py +++ b/assets/srgb_profile_fix.py @@ -1,4 +1,5 @@ import os + import pygame as pg for i in os.listdir('.'): diff --git a/survival/esper.py b/survival/esper.py index 04f5d52..ed92a64 100644 --- a/survival/esper.py +++ b/survival/esper.py @@ -1,13 +1,11 @@ import time as _time - from functools import lru_cache as _lru_cache +from typing import Any as _Any +from typing import Iterable as _Iterable from typing import List as _List +from typing import Tuple as _Tuple from typing import Type as _Type from typing import TypeVar as _TypeVar -from typing import Any as _Any -from typing import Tuple as _Tuple -from typing import Iterable as _Iterable - version = '1.3' diff --git a/survival/quad_tree.py b/survival/quad_tree.py index 44a35ce..e36efd6 100644 --- a/survival/quad_tree.py +++ b/survival/quad_tree.py @@ -1,4 +1,3 @@ -import pygame from pygame.rect import Rect diff --git a/survival/tile_layer.py b/survival/tile_layer.py index 78ac9e0..f53d1e2 100644 --- a/survival/tile_layer.py +++ b/survival/tile_layer.py @@ -1,5 +1,5 @@ -from survival.image import Image from survival.generators.tile_generator import TileGenerator +from survival.image import Image from survival.tile import Tile From fe9ef781fb5b7ad371a25e9c7992dcd38b723597 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Klupie=C4=87?= Date: Mon, 10 May 2021 13:17:26 +0200 Subject: [PATCH 09/10] Update atlas.png --- assets/atlas.png | Bin 14024 -> 20010 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/atlas.png b/assets/atlas.png index 506bb7f1f1dee8e5961f6fe8b833ef4965f0f72d..46a2db2673e20396319541e4dc6060511946d7be 100644 GIT binary patch literal 20010 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 FV1lQOe98a- literal 14024 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 jqMZJJwvYSm4_H;p>=pEV&a=-y)S%?0Rix@A%) Date: Mon, 10 May 2021 14:31:26 +0200 Subject: [PATCH 10/10] Remove redundant code --- survival/systems/movement_system.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/survival/systems/movement_system.py b/survival/systems/movement_system.py index 5f0d868..47a5ad1 100644 --- a/survival/systems/movement_system.py +++ b/survival/systems/movement_system.py @@ -21,14 +21,3 @@ class MovementSystem(esper.Processor): pos.position[1] - moving.target[1] * 32) < 0.1 * mov.speed: pos.position = [moving.target[0] * 32, moving.target[1] * 32] self.world.remove_component(ent, MovingComponent) - - # if moving.direction[0] != 0: - # pos.position[0] += moving.direction[0] * mov.speed * dt / 100 - # if abs(moving.movement_target[0] * 32 - pos.position[0]) < 0.1 * mov.speed: - # pos.position = [moving.movement_target[0] * 32, moving.movement_target[1] * 32] - # self.world.remove_component(ent, MovingComponent) - # else: - # pos.position[1] += moving.direction[1] * mov.speed * dt / 100 - # if abs(pos.position[1] - moving.movement_target[1] * 32) < 0.1 * mov.speed: - # pos.position = [moving.movement_target[0] * 32, moving.movement_target[1] * 32] - # self.world.remove_component(ent, MovingComponent)