Natural resources on 2D randomly generated map?

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By paseuda

Hello. With the beginning of 2020 I start a project of small 2D game in Godot 3.1. I set a tilemap and randomly generate 2D map. I would like to know how to add different variables to tiles. For examle I would like to mine iron from Tile01 and cut trees in Tile02 and mine gold in Tile03. Can you help me? I would like to know how to add such statistics to specific tiles and then use them as tileset to randomly generate 2D map.

When you create tiles you can assign a name and godot automatically assigns each tile created starting from scratch. Through gdscript you can access each tile through its name or ID. Here are some examples:

extends Node2D
    onready var tilemap=$TileMap #the child tilemap 
    onready var tileset= tilemap.tile_set #the tileset of tilemap
    
    var tile_types = {}
    var resources = {}
    
    func _ready():
    	randomize()
    	#save the tiles ids and names in a dictionary, see the function declaration
    	tile_types= make_dic_tiles()
    	
    	for i in tile_types:
    		print("Tile dictionary keys: ", i) #print keys
    	for i in tile_types.values():
    		print("Tile dictionary values: ", i) #...values
    		
    	#print array of all tiles id:		
    	print("Tile IDs: ", tileset.get_tiles_ids()) 
    	
    	 #print id for name tile (-1 if no exist):
    	print("Name tile if exist: ", tileset.find_tile_by_name("castle"))
    	
    	#print all names your tiles:
    	for i in tileset.get_tiles_ids():
    		print("Tiles names: ", tileset.tile_get_name(i)) 
    		
    	#print total tiles
    	var total_tiles=tileset.get_tiles_ids().size()
    	print("Total tiles: ", total_tiles)
    	
    	#print size tiles: 16x16, 16x32, etc:
    	for i in tileset.get_tiles_ids():
    		print(tileset.tile_get_region(i).size)
    		print (region_to_tiles(tileset.tile_get_region(i).size))	
    	
    	#example:
    	random_fill(25,25,20,20,tile_types)
    
    
    func _process(delta):
    	#example: delete tiles using mouse. Using (world_to_map) convert global position to tile position
    	if Input.is_mouse_button_pressed(BUTTON_LEFT):
    		var x_t=tilemap.world_to_map (get_local_mouse_position()).x
    		var y_t=tilemap.world_to_map (get_local_mouse_position()).y
    		# -1 no tile:
    		tilemap.set_cell( x_t, y_t, -1) 
    		
    	#example: get tile id whit the mouse position:	
    	if Input.is_mouse_button_pressed(BUTTON_RIGHT):
    	#if Input.is_action_just_pressed("right_mouse_click"):
    		var tilepos=tilemap.world_to_map (get_local_mouse_position())
    		print(tilepos)
    		print(tilemap.get_cell(tilepos.x, tilepos.y)) 		
    
    
    func make_dic_tiles(): #return dictionary all tiles {tileID, tileName}
    	var temp_dict={}
    	for i in tileset.get_tiles_ids().size():
    		temp_dict[tileset.get_tiles_ids()[i]] = tileset.tile_get_name(i)
    	return temp_dict
    
    	
    #x and y= count tiles to start (no real position): (Alternative: use world_to_map)
    #the tiles can measure more than cell size, this function does not take that into account:
    func random_fill(x, y, width:int, heigth:int, tiles:Dictionary) -> void:
    	for i in width:
    		for j in heigth:
    			#random int number...0 to total tiles id 
    			var rnd=randi() % tiles.size()
    			tilemap.set_cell(i, j, tiles.keys()[rnd])
    	pass	
    
    # if tile is 16x16 return 1,1, 32x16 return 1,2, etc:
    func region_to_tiles(tile_size):
    		return Vector2(1 / tilemap.cell_size.x * tile_size.x, 1 / tilemap.cell_size.y * tile_size.y)
    	
    	
    
    
    func make_sector(resource):
    	#...
    	pass
    	
    func make_chunk(size):
    	#...
    	pass
    	
    #etc

You can also create dictionaries or array of properties according to the name or id of the tile. I also saw that a script can be assigned directly to each tile, but I don’t know how it is handled. There are several things to learn …

estebanmolca | 2020-01-12 22:14

:bust_in_silhouette: Reply From: null_digital

Aside from the map of tiles you’ve generated, you could generate additional layers of maps over it, each containing different data for each tile. In this case, you’d generate a map containing the resources for the tiles.

Ok. If I can add additional layer of generated map and add constants and variables to it why can’t I add consatnts and variables to the first and existing generated 2D tilemap and every single tile? Why I need another layer? Wouldn’t it be the same map twice?

paseuda | 2020-01-12 17:45

Maybe my question is wrong. I would like to know how to add constatnts and variables to every single tile from tilemap.

e.g.
Tile01 = 1 stone
Tile02 = 2 wood
Tile03 = 3 gold

TileN = n resources

paseuda | 2020-01-12 17:55

Can I do this using Visual Scripting ar I need do this with GdScript?

paseuda | 2020-01-12 17:56

Only now I’ve realized you’re using Godot’s TileMap. I don’t know if it’s possible to associate data with TileMap.

null_digital | 2020-01-13 23:56