extends Resource class_name TerrainData const TERRAIN_IMAGE_GAME_FACTOR = 40. const DEFAULT_CONTAMINATION_CENTRAL_ZONE_MAX_SIZE = 400. const DEFAULT_CONTAMINATION_CENTRAL_ZONE_MIN_SIZE = 100. const DEFAULT_TERRAIN_SIZE = Vector2(2000,2000) @export var terrain_size : Vector2 func _init(size : Vector2 = DEFAULT_TERRAIN_SIZE): terrain_size = size generate_default_contamination() #region ------------------ Contamination ------------------ @export var contamination : Image = null func generate_default_contamination( central_zone_max_size : float = DEFAULT_CONTAMINATION_CENTRAL_ZONE_MAX_SIZE, central_zone_min_size : float = DEFAULT_CONTAMINATION_CENTRAL_ZONE_MIN_SIZE, ): var noise: Noise = FastNoiseLite.new() noise.seed = randi() noise.noise_type = FastNoiseLite.TYPE_CELLULAR noise.frequency = 0.005 * TERRAIN_IMAGE_GAME_FACTOR var imageSize = terrain_size / TERRAIN_IMAGE_GAME_FACTOR; var noise_image = noise.get_image( imageSize.x, imageSize.y, 1.0 ) ImageTools.draw_gradient( noise_image, imageSize/2, central_zone_min_size / TERRAIN_IMAGE_GAME_FACTOR ) ImageTools.draw_gradient( noise_image, imageSize/2, central_zone_max_size / TERRAIN_IMAGE_GAME_FACTOR, Color.BLACK, true ) ImageTools.flatten(noise_image, 0.5) contamination = Image.create( imageSize.x, imageSize.y, false, Image.Format.FORMAT_L8 ) contamination.copy_from(noise_image) func impact_contamination(position : Vector2, impact_radius : int, to_value : float = 1.): ImageTools.draw_circle( contamination, position / TERRAIN_IMAGE_GAME_FACTOR, impact_radius / TERRAIN_IMAGE_GAME_FACTOR, Color(1., 1., 1., to_value) ) func is_in_image(pixel_point : Vector2, image : Image): return ( pixel_point.x > 0 and pixel_point.y > 0 and pixel_point.x < image.get_width() and pixel_point.y < image.get_height()) func get_contamination(point : Vector2) -> float: var pixel_point : Vector2i = get_pixel_point(point) if (is_in_image(pixel_point, contamination)): return contamination.get_pixel( pixel_point.x, pixel_point.y ).r return 0 func get_decontamination_coverage() -> float: return ImageTools.get_color_coverage(contamination) func get_decontamination_surface() -> float: return ImageTools.get_color_pixel_count(contamination)/TERRAIN_IMAGE_GAME_FACTOR * 10 func get_pixel_point(point : Vector2) -> Vector2i: return Vector2i( Vector2(point) / float(TERRAIN_IMAGE_GAME_FACTOR) ) #endregion #region ------------------ Objectives ------------------ func generate_objective_rewards(level = 1, amount = 1) -> Array[ObjectiveReward]: var possible_objective_rewards_path : Array[ObjectiveReward] = [ IncreaseDayLimitReward.new(randi_range(level + 1, level + 3)), LootItemReward.new(load("res://common/inventory/resources/items/compost.tres")), UpgradePlayerMaxEnergyReward.new(), ] var objectives_reward : Array[ObjectiveReward] = [] var i = 0 while i < amount and len(possible_objective_rewards_path) > 0: var r = possible_objective_rewards_path.pick_random() possible_objective_rewards_path.erase(r) objectives_reward.append(r) i += 1 return objectives_reward