/ 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