From e9c27990f1b98312dd7d521b39427c5648894700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filips=20Kalni=C5=86=C5=A1?= Date: Wed, 11 Feb 2026 07:51:10 +0000 Subject: [PATCH] Update world.py --- world.py | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 5 deletions(-) diff --git a/world.py b/world.py index 201a012..3b25162 100644 --- a/world.py +++ b/world.py @@ -1,6 +1,7 @@ import pygame import random from settings import * +from tiles import get_tile class World: @@ -20,6 +21,7 @@ class World: # WORLD GENERATION # ========================================================== def generate_world(self): + # First generate terrain for x in range(self.width): # Simple terrain height variation @@ -39,6 +41,10 @@ class World: else: self.grid[y][x] = STONE + # Then add trees + ores + self.generate_trees() + self.generate_ores() + # ========================================================== # DRAW # ========================================================== @@ -57,7 +63,7 @@ class World: tile_id = self.grid[y][x] if tile_id != AIR: - color = TILE_PROPERTIES[tile_id]["color"] + color = get_tile(tile_id).color # FIXED: no more KeyError world_rect = pygame.Rect( x * TILE_SIZE, @@ -98,7 +104,7 @@ class World: tiles.append({ "rect": tile_rect, - "solid": TILE_PROPERTIES[tile_id]["solid"], + "solid": get_tile(tile_id).collidable, "id": tile_id, "x": x, "y": y @@ -109,14 +115,18 @@ class World: # ========================================================== # BLOCK BREAKING # ========================================================== - def break_block(self, mouse_pos, camera): + def break_block(self, mouse_pos, camera, inventory): world_x, world_y = camera.screen_to_world(mouse_pos) - tile_x = int(world_x // TILE_SIZE) tile_y = int(world_y // TILE_SIZE) if self.in_bounds(tile_x, tile_y): - if self.grid[tile_y][tile_x] != AIR: + tile_id = self.grid[tile_y][tile_x] + tile = get_tile(tile_id) + + if tile_id != AIR: + if tile.drop: + inventory.add_item(tile.drop, 1) self.grid[tile_y][tile_x] = AIR # ========================================================== @@ -137,3 +147,57 @@ class World: # ========================================================== def in_bounds(self, x, y): return 0 <= x < self.width and 0 <= y < self.height + + # ========================================================== + # NEW: Get surface height for player spawn + # ========================================================== + def get_surface_height(self, x): + for y in range(self.height): + if self.grid[y][x] != AIR: + return y + return self.height - 1 + + # ========================================================== + # TREE GENERATION + # ========================================================== + def generate_trees(self): + for x in range(0, self.width, 6): + if random.random() < 0.25: # 25% chance + # find surface + for y in range(self.height): + if self.grid[y][x] == GRASS: + self.spawn_tree(x, y) + break + + def spawn_tree(self, x, surface_y): + # trunk height + height = random.randint(4, 7) + for i in range(height): + self.grid[surface_y - 1 - i][x] = WOOD + + # leaves + leaf_start = surface_y - height - 1 + for y in range(leaf_start, leaf_start - 4, -1): + for lx in range(x - 2, x + 3): + if 0 <= lx < self.width and 0 <= y < self.height: + if random.random() > 0.25: + self.grid[y][lx] = LEAVES + + # ========================================================== + # ORE GENERATION + # ========================================================== + def generate_ores(self): + for _ in range(250): + x = random.randint(0, self.width - 1) + y = random.randint(SURFACE_LEVEL + 5, self.height - 1) + + if self.grid[y][x] == STONE: + r = random.random() + if r < 0.5: + self.grid[y][x] = COAL_ORE + elif r < 0.75: + self.grid[y][x] = COPPER_ORE + elif r < 0.9: + self.grid[y][x] = IRON_ORE + else: + self.grid[y][x] = GOLD_ORE