From e619b9a6df049a90cc49753c18ce0d9a26ad6a54 Mon Sep 17 00:00:00 2001 From: Antti Hakkarainen Date: Fri, 17 Feb 2023 22:52:42 +0200 Subject: [PATCH] implement primitive parcel drawing --- scenes/Main.tscn | 7 +++++- scripts/Camera.gd | 3 +++ scripts/EventBus.gd | 8 +++++-- scripts/Globals.gd | 45 +++++++++++++++++++++++++-------------- scripts/InfoLayer.gd | 23 ++++++++++++++++++++ scripts/Minimap.gd | 7 +++--- scripts/UILayer.gd | 6 +++++- scripts/WorldGenerator.gd | 39 +++++++++++++++++++++++++++++++-- 8 files changed, 112 insertions(+), 26 deletions(-) create mode 100644 scripts/InfoLayer.gd diff --git a/scenes/Main.tscn b/scenes/Main.tscn index 90dcc8f..eb72337 100644 --- a/scenes/Main.tscn +++ b/scenes/Main.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=14 format=3 uid="uid://c5deq5s55q0ii"] +[gd_scene load_steps=15 format=3 uid="uid://c5deq5s55q0ii"] [ext_resource type="Script" path="res://scripts/Main.gd" id="1_ysxum"] [ext_resource type="Script" path="res://scripts/EventBus.gd" id="2_0j1ud"] @@ -13,6 +13,7 @@ [ext_resource type="Script" path="res://scripts/CameraMarker.gd" id="7_6krn1"] [ext_resource type="Script" path="res://scripts/MapBackground.gd" id="8_ron2j"] [ext_resource type="Script" path="res://scripts/UILayer.gd" id="9_ebec0"] +[ext_resource type="Script" path="res://scripts/InfoLayer.gd" id="14_hbedy"] [node name="Main" type="Node"] script = ExtResource("1_ysxum") @@ -45,6 +46,10 @@ script = ExtResource("8_ron2j") [node name="MainMenu" parent="EventBus" instance=ExtResource("2_wfpe2")] +[node name="InfoLayer" type="Node2D" parent="EventBus"] +visible = false +script = ExtResource("14_hbedy") + [node name="UILayer" type="CanvasLayer" parent="EventBus"] process_mode = 1 visible = false diff --git a/scripts/Camera.gd b/scripts/Camera.gd index 714309a..3e3089a 100644 --- a/scripts/Camera.gd +++ b/scripts/Camera.gd @@ -41,6 +41,9 @@ func set_camera_position(pos: Vector2) -> void: func set_camera_limits() -> void: + if Globals.map_size < Globals.MAP_MIN_WIDTH: + push_error("Camera: implausible map size '" + str(Globals.map_size) + "' while setting camera limits:") + # set camera bounds to map size, with chunk_in_px room to go over self.set_limit(SIDE_LEFT, -chunk_in_px.x) self.set_limit(SIDE_RIGHT, Globals.map_size*Globals.TILE_SIZE_X + chunk_in_px.x) diff --git a/scripts/EventBus.gd b/scripts/EventBus.gd index 8d5d518..81a42d1 100644 --- a/scripts/EventBus.gd +++ b/scripts/EventBus.gd @@ -16,7 +16,7 @@ var map_filenames:Array = [ "res://maps/tampere_256px.png", "res://maps/tampere_10x10km_4096px.png" ] -var map_filename:String = map_filenames[3] +var map_filename:String = map_filenames[1] var _world_generator:WorldGenerator @@ -78,7 +78,7 @@ func _unhandled_input(event) -> void: node_camera.camera_reset_rotation() if event.is_action_pressed("take_screenshot"): - node_camera.take_screenshot() + node_camera.camera_take_screenshot() if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT: if !node_camera.get_camera_panning() and event.pressed: @@ -153,6 +153,10 @@ func start_new_game(): node_game.set_visible(true) node_uilayer.set_visible(true) + var node_infolayer:InfoLayer + node_infolayer = find_child("InfoLayer") + node_infolayer.set_visible(true) + # set camera to center of the map node_camera.camera_reset_rotation() node_camera.set_camera_position( diff --git a/scripts/Globals.gd b/scripts/Globals.gd index 97d6b8d..accc4bf 100644 --- a/scripts/Globals.gd +++ b/scripts/Globals.gd @@ -5,6 +5,29 @@ extends Node var chunks_loaded:int = 0 +################################### +# VARIABLE GAME DATA, saved # +################################### + +# map size is based on input image x*y pixel size +@export var map_size:int + +# store terrain type (water, land, forest etc. for every map cell) +@export var map_terrain_data:Array[PackedInt32Array] = [[]] + +# preprocess and store exact tile for every map cell to speed up setting tiles +@export var map_tile_data:Array[Array] = [[]] + +# list of parcels the map is divided to +@export var map_parcel_data:Array[Array] = [[]] + +# current camera zoom level +@export var CAMERA_ZOOM_LEVEL:float +@export var CAMERA_POSITION:Vector2i + +# minimap texture, used also as save game's imagetexture +@export var minimap_texture:ImageTexture = null + ################################### # FILE PATHS # @@ -20,9 +43,9 @@ const SCRIPT_PATH:String = "res://scripts" ################################### var minimap_colors:Dictionary = { - Globals.TILE_WATER : Color8(42, 31, 255), + Globals.TILE_WATER : Color8(42, 31, 255), Globals.TILE_TERRAIN: Color8(148, 113, 71), - Globals.TILE_FOREST: Color8(0,123,19), + Globals.TILE_FOREST : Color8(0,123,19), "default": Color8(255,0,255), } @@ -37,34 +60,24 @@ const CHUNK_SIZE:Vector2i = Vector2i(32,32) # tilemap tile types enum {TILE_WATER, TILE_TERRAIN, TILE_FOREST, TILE_BOG} +# parcel owner types +enum {PARCEL_CITY, PARCEL_STATE, PARCEL_PRIVATE} + # tilemap layers enum {LAYER_TERRAIN, LAYER_BUILDINGS} const TILESET_TERRAIN:TileSet = preload("res://scenes/Chunk.tres") -# map size is based on input image x*y pixel size -var map_size:int = 0 - -# store terrain type (water, land, forest etc. for every map cell) -var map_terrain_data:Array[PackedInt32Array] = [[]] - -# preprocess and store exact tile for every map cell to speed up setting tiles -var map_tile_data:Array[Array] = [[]] - - ################################### # CAMERA SETTINGS # ################################### +# minimap camera marker sprite var camera_marker:Sprite2D # GAME WINDOW DEFAULT SIZE const DEFAULT_X_RES:int = 1920 const DEFAULT_Y_RES:int = 1080 -# current camera zoom level -var CAMERA_ZOOM_LEVEL: float = 1.0 -var CAMERA_POSITION:Vector2i - # camera movement settings const CAMERA_MIN_ZOOM_LEVEL: float = 0.1 const CAMERA_MAX_ZOOM_LEVEL: float = 2.0 diff --git a/scripts/InfoLayer.gd b/scripts/InfoLayer.gd new file mode 100644 index 0000000..687f157 --- /dev/null +++ b/scripts/InfoLayer.gd @@ -0,0 +1,23 @@ +class_name InfoLayer +extends Node2D + +# displays various info layers of the game + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + + + +func _draw(): + for y in 16: + for x in 64: + draw_rect(Rect2(x*16*16, y*64*16, 16*16, 64*16), Color8(200,25,25,220), false, 4.0) + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(_delta): + self.position = Vector2(0,0) + + + diff --git a/scripts/Minimap.gd b/scripts/Minimap.gd index e9fe817..a8e72f3 100644 --- a/scripts/Minimap.gd +++ b/scripts/Minimap.gd @@ -4,7 +4,6 @@ extends Control signal set_camera_position(pos:Vector2) signal set_map_background_texture(texture, scaling) -@onready var minimap_texture:ImageTexture = null @onready var sprite:Sprite2D @onready var is_mouse_inside_minimap:bool = false @onready var position_multiplier:float @@ -15,7 +14,7 @@ var observe_mouse_inside_minimap:bool = false # Called when the node enters the scene tree for the first time. func _ready(): - self.minimap_texture = ImageTexture.new() + Globals.minimap_texture = ImageTexture.new() func _draw(): @@ -69,7 +68,7 @@ func generate_minimap() -> void: image.set_pixel(x, y, color) - minimap_texture = ImageTexture.create_from_image(image) + Globals.minimap_texture = ImageTexture.create_from_image(image) func set_camera_marker() -> void: @@ -79,7 +78,7 @@ func set_camera_marker() -> void: func set_minimap() -> void: self.sprite = self.find_child("MinimapSprite") - self.sprite.texture = minimap_texture + self.sprite.texture = Globals.minimap_texture # The size of a sprite is determined from its texture var texture_size = sprite.texture.get_size() diff --git a/scripts/UILayer.gd b/scripts/UILayer.gd index 724d18d..0df4d76 100644 --- a/scripts/UILayer.gd +++ b/scripts/UILayer.gd @@ -3,8 +3,12 @@ extends CanvasLayer @onready var node_minimap:Minimap + func _ready() -> void: node_minimap = find_child("Minimap") - + + func set_ready() -> void: node_minimap.set_ready() + + diff --git a/scripts/WorldGenerator.gd b/scripts/WorldGenerator.gd index 7f13956..b299626 100644 --- a/scripts/WorldGenerator.gd +++ b/scripts/WorldGenerator.gd @@ -93,11 +93,46 @@ func generate_biomes() -> void: Globals.map_terrain_data[y][x] = Globals.TILE_FOREST # can add other tresholds here for other biomes +# TODO move to globals later +var parcel_width = 16 +var parcel_height = 64 + +# forests are not generated yet so can just compare water and terrain +func is_filled_with_water(coords:Vector2i) -> bool: + var terrain_tile_count:int = 0 + + for y in range(coords.y, coords.y + parcel_height): + for x in range(coords.x, coords.x + parcel_width): + if Globals.map_terrain_data[y][x] == Globals.TILE_TERRAIN: + terrain_tile_count += 1 + + # parcel is ok if it has at least one land + if terrain_tile_count > 0: + return false + return true func generate_parcels() -> void: # divide the land area Cadastres / Parcels - #print("generating parcels") - pass + # TODO better solution, this is something my skills were able to handle at proto stage + # should replace with a real/better algo when I am skilled enough to do it + Globals.map_parcel_data.resize(Globals.map_size / parcel_height) + + for y in Globals.map_size / parcel_height: + Globals.map_parcel_data[y].resize(Globals.map_size / parcel_width) + for x in Globals.map_size / parcel_width: + # ignore parcels full fo water + if !is_filled_with_water(Vector2i(y,x)): + # 0 = top left corner, 1 = bottom right corner, 2 = owner + Globals.map_parcel_data[y][x] = [ + Vector2i(y * parcel_height, x * parcel_width), + Vector2i(y * parcel_height + parcel_height, x * parcel_width + parcel_width), + Globals.PARCEL_STATE + ] + + #for row in Globals.map_parcel_data: +# print(row) + #for col in row: + # print(Globals.map_parcel_data[row][col]) func generate_world(filename) -> bool: