/ WorldState.gd
WorldState.gd
  1  extends Node
  2  
  3  @onready var grid_manager = $GridManager
  4  @onready var event_bus = get_node("/root/MainGame/EventBus")
  5  @onready var message_bus = get_node("/root/MainGame/NetworkLayer/RPC/MessageBus")
  6  @onready var resource_manager = $ResourceManager
  7  @onready var pathfinding_service = get_node("/root/MainGame/Simulation/PathfindingService")
  8  @onready var task_master = get_node("/root/MainGame/Simulation/TaskMaster")
  9  @onready var actor_factory = get_node("/root/MainGame/ViewLayer/ActorFactory")
 10  
 11  var starting_colonists = 3
 12  var map_size = 75
 13  var noise_frequency: float = 0.05
 14  var tree_noise_frequency: float = 0.02
 15  
 16  const Colonist = preload("res://scenes/colonist.tscn")
 17  
 18  func _ready():
 19  	if not multiplayer.is_server():
 20  		set_process(false)
 21  		set_physics_process(false)
 22  	else:
 23  		pass
 24  	if multiplayer.is_server():
 25  		generate_world()
 26  		setup_world()
 27  		Lib.auto_wire_events(self)
 28  	
 29  
 30  
 31  func _on_client_joined(id: int):
 32  	tLogger.info("Client %d joined. Sending world state..." % id)
 33  	var terrain_data = grid_manager.get_grid_terrain_data()
 34  	var item_data = grid_manager.get_grid_item_data()
 35  	var item_amount_data = grid_manager.get_grid_item_amount_data()
 36  	var object_data = grid_manager.get_grid_object_data()
 37  	var structure_data = grid_manager.get_grid_structure_data()
 38  	message_bus.sync_entire_tile_layer.rpc_id(id, terrain_data)
 39  	message_bus.sync_entire_item_layer.rpc_id(id, item_data, item_amount_data)
 40  	message_bus.sync_entire_object_layer.rpc_id(id, object_data)
 41  	message_bus.sync_entire_structure_layer.rpc_id(id, structure_data)
 42  
 43  func _on_request_place_floor(type: String, pos: Vector2i):
 44  	tLogger.info("WorldState received request to build floor")
 45  	if grid_manager.is_tile_empty(pos):
 46  		message_bus.sync_tile_changed.rpc(type, pos)
 47  	else:
 48  		tLogger.warn("empty check failed. something already exists here")
 49  		
 50  func _on_request_place_structure(type: String, pos: Vector2i):
 51  	tLogger.info("WorldState received request to build wall")
 52  	if grid_manager.is_tile_empty(pos):
 53  		message_bus.sync_structure_changed.rpc(type, pos)
 54  	else:
 55  		tLogger.warn("empty check failed. something already exists here")
 56  
 57  func generate_world():
 58  	if grid_manager and pathfinding_service:
 59  		grid_manager.init_grid(map_size, map_size)
 60  		pathfinding_service.init_astar(map_size, map_size)
 61  		tLogger.info("Grid and Pathfinder Astar2d Generation Complete")
 62  	else:
 63  		tLogger.error("Failed to generate Grid and Pathfinder Astar2d: GridManager or PathfindingService is null")
 64  		
 65  	var noise = FastNoiseLite.new()
 66  	noise.seed = 1 # Change to randi() later for random maps test
 67  	noise.frequency = noise_frequency
 68  	noise.noise_type = FastNoiseLite.TYPE_PERLIN
 69  	tLogger.info("Generating map...")
 70  	for x in range(map_size):
 71  		for y in range(map_size):
 72  			var pos = Vector2i(x, y)
 73  			var val = noise.get_noise_2d(x, y)
 74  			if val > 0.0 and val < 0.3:
 75  				message_bus.sync_tile_changed.rpc("tile_dict_dirt", pos)
 76  			elif val > 0.2:
 77  				message_bus.sync_tile_changed.rpc("tile_dict_dirt", pos)
 78  				message_bus.sync_structure_changed.rpc("structure_dict_mountain", pos)
 79  				task_master.add_job("job_dict_rock", pos)
 80  			else:
 81  				message_bus.sync_tile_changed.rpc("tile_dict_grass", pos)
 82  	event_bus.emit_map_generated()
 83  	tLogger.info("Map generation complete!")
 84  	gen_vegetation()
 85  	
 86  func gen_vegetation():
 87  	print("Generating vegetation layer...")
 88  	var noise = FastNoiseLite.new()
 89  	noise.seed = 2 
 90  	noise.noise_type = FastNoiseLite.TYPE_SIMPLEX
 91  	noise.frequency = tree_noise_frequency
 92  	for x in range(map_size):
 93  		for y in range(map_size):
 94  			var posGrid = Vector2i(x, y)
 95  			var pos = posGrid
 96  			var val = noise.get_noise_2d(x, y)
 97  			var rand = randi() % 10
 98  			if grid_manager.get_tile_at(posGrid) == "tile_dict_grass" and grid_manager.is_tile_empty(posGrid) and val > 0.1 and val < 0.3:
 99  				if rand > 7:
100  					message_bus.sync_structure_changed.rpc("structure_dict_tree", pos)
101  					task_master.add_job("job_dict_tree", pos)
102  				
103  	print("Vegetation generation complete!")
104  
105  	
106  func setup_world():
107  	tLogger.info("Setting up world")
108  	var colonist_instance = Colonist.instantiate()
109  	colonist_instance.global_position = Vector2i(50,50)
110  	colonist_instance.name = "colonist1"
111  	colonist_instance.first_name = "thomas"
112  	colonist_instance.last_name = "Beau"
113  	actor_factory.add_child(colonist_instance)
114  	grid_manager.set_object_at(Vector2i(50,50), colonist_instance)
115  	
116  	colonist_instance = Colonist.instantiate()
117  	colonist_instance.global_position = Vector2i(250,250)
118  	colonist_instance.name = "colonist2"
119  	colonist_instance.first_name = "Snape"
120  	colonist_instance.last_name = "Severus"
121  	actor_factory.add_child(colonist_instance)
122  	grid_manager.set_object_at(Vector2i(250,250), colonist_instance)
123