Table of Contents

Class TerrainPlacementService

Namespace
GridPlacement.GDScript
Assembly
MoonBark.GridPlacement.GDScript.dll

Scene-free terrain placement service. Extracted from PlacementSystem (Phase 4 refactor) to make the terrain paint path directly unit-testable.\n\nHandles terrain-name → TileSet-ID resolution, plan building/gating, plan application, and signal emission (pre_terrain_paint, success/failed).\n\nUsage: var service := TerrainPlacementService.new() service.configure(building_state, building_settings) var report := service.try_place_terrain_by_name(&"dungeon_floor", cell, map, owner)

class TerrainPlacementService extends RefCounted
TerrainPlacementService

Properties

resolved_map

var resolved_map: TileMapLayer = _targeting_state.target_map if _targeting_state else null

resolved

var resolved = TerrainTilePainter.resolve_terrain_by_name(resolved_map.tile_set, p_terrain_name)

terrain_painter

var terrain_painter = TerrainTilePainter.new()

plan

var plan = terrain_painter.build_plan_multi(resolved_map, p_cells, resolved.terrain_set, resolved.terrain)

owner

var owner = _get_owner()

report

var report = PlacementReport.new(owner, p_target_map, null, PlacementEnums.Action.BUILD)

owner

var owner = _get_owner()

paint_data

var paint_data = TerrainPaintData.new(

issues

var issues = results.get_all_issues()

veto_report

var veto_report = PlacementReport.new(owner, resolved_map, null, PlacementEnums.Action.BUILD)

applied

var applied: bool = terrain_painter.apply_plan(resolved_map, plan)

report

var report = PlacementReport.new(owner, p_target_map, null, PlacementEnums.Action.BUILD)

success_report

var success_report = PlacementReport.new(owner, resolved_map, null, PlacementEnums.Action.BUILD)

resolved_map

var resolved_map: TileMapLayer = _targeting_state.target_map if _targeting_state else null

resolved

var resolved = TerrainTilePainter.resolve_terrain_by_name(resolved_map.tile_set, p_terrain_name)

brush_issues

var brush_issues: Array[String] = []

cell_issue_map

var cell_issue_map = validate_terrain_cells(p_terrain_name, p_cells, resolved_map, _targeting_state, p_entry, p_palette)

owner

var owner = _get_owner()

paint_data

var paint_data = TerrainPaintData.new(

report

var report = PlacementReport.new(owner, p_target_map, null, PlacementEnums.Action.BUILD)

terrain_painter

var terrain_painter = TerrainTilePainter.new()

plan

var plan = terrain_painter.build_plan_multi(resolved_map, p_cells, resolved.terrain_set, resolved.terrain)

report

var report = PlacementReport.new(owner, p_target_map, null, PlacementEnums.Action.BUILD)

applied

var applied: bool = terrain_painter.apply_plan(resolved_map, plan)

report

var report = PlacementReport.new(owner, p_target_map, null, PlacementEnums.Action.BUILD)

success_report

var success_report = PlacementReport.new(owner, resolved_map, null, PlacementEnums.Action.BUILD)

resolved_map

var resolved_map: TileMapLayer = _targeting_state.target_map if _targeting_state else null

owner

var owner = _get_owner()

report

var report = PlacementReport.new(owner, p_target_map, null, PlacementEnums.Action.BUILD)

tile_data

var tile_data: TileData = source.get_tile_data(source.get_tile_id(tile_idx), 0)

terrain_name

var terrain_name = &""

t_set

var t_set: int = tile_data.terrain_set

t_id

var t_id: int = tile_data.terrain

remove_data

var remove_data = TerrainPaintData.new(

resolved_map

var resolved_map: TileMapLayer = _targeting_state.target_map if _targeting_state else null

owner

var owner = _get_owner()

resolved_terrain_name

var resolved_terrain_name: StringName = &""

seen_names

var seen_names: Array[StringName] = []

td

var td = resolved_map.get_cell_tile_data(cell)

cell_name

var cell_name = resolved_map.tile_set.get_terrain_name(td.terrain_set, td.terrain)

demolish_data

var demolish_data = TerrainDemolishData.new(

out

var out: Dictionary = {}

shared

var shared: Dictionary = {}

seed_ctx

var seed_ctx = PlacementValidationContext.for_terrain(

rules

var rules = PlacementValidationPipeline.resolve_rules(

ctx

var ctx = PlacementValidationContext.for_terrain(

results

var results = PlacementValidationPipeline.validate(ctx, [], p_entry, p_palette, _building_settings)

issues

var issues = results.get_all_issues()

ctx

var ctx = PlacementValidationContext.for_terrain(

results

var results = PlacementValidationPipeline.validate(ctx, [], p_entry, p_palette, _building_settings)

owner

var owner = _get_owner()

report

var report = PlacementReport.new(owner, p_target_map, null, PlacementEnums.Action.BUILD)

polys

var polys = resolve_terrain_collision_polygons(resolved_map, p_terrain_name)

tile_set

var tile_set = resolved_map.tile_set

resolved_tile_data

var resolved_tile_data: TileData = null

source

var source = tile_set.get_source(tile_set.get_source_id(source_idx))

tile_data

var tile_data: TileData = source.get_tile_data(source.get_tile_id(tile_idx), 0)

layer_mask

var layer_mask = tile_set.get_physics_layer_collision_mask(layer_idx)

layer_col

var layer_col = tile_set.get_physics_layer_collision_layer(layer_idx)

points

var points = resolved_tile_data.get_collision_polygon_points(layer_idx, poly_idx)

world_2d

var world_2d = resolved_map.get_world_2d()

space_state

var space_state = world_2d.direct_space_state

cell_local_pos

var cell_local_pos = resolved_map.map_to_local(target_cell)

xform

var xform = resolved_map.global_transform

shape

var shape = ConvexPolygonShape2D.new()

query

var query = PhysicsShapeQueryParameters2D.new()

collider

var collider = res.get("collider")

polys

var polys = resolve_terrain_collision_polygons(resolved_map, p_terrain_name)

data

var data = PlacementActionData.new(null, p_report, p_build_type, null, p_terrain_name, p_terrain_cell, p_terrain_cell_count)

data

var data = PlacementActionData.new(null, p_report, p_build_type, null, p_terrain_name, p_terrain_cell, p_terrain_cell_count)

resolved_map

var resolved_map: TileMapLayer = _targeting_state.target_map if _targeting_state else null

resolved_map

var resolved_map: TileMapLayer = _targeting_state.target_map if _targeting_state else null

Methods

configure

func configure(p_states: PlacementStates, p_building_settings: PlacementSettings) -> void:

Parameters

p_states
p_building_settings

Returns

resolve_placement_dependencies

func resolve_placement_dependencies(p_container: PlacementContainer) -> void:

Parameters

p_container

Returns

set_targeting_state

func set_targeting_state(p_ts: GridTargetingState) -> void:

Parameters

p_ts

Returns

try_place_terrain_by_name

func try_place_terrain_by_name( p_terrain_name: StringName,

try_place_terrain_brush

func try_place_terrain_brush( p_cells: Array[Vector2i],

erase_cells

func erase_cells( p_cells: Array[Vector2i],

try_demolish_terrain

func try_demolish_terrain( p_cells: Array[Vector2i],

validate_terrain_cells

func validate_terrain_cells( p_terrain_name: StringName,

validate_terrain_cell

func validate_terrain_cell( p_terrain_name: StringName,

resolve_terrain_collision_polygons

static func resolve_terrain_collision_polygons( resolved_map: TileMapLayer,

cell_collides_with_polygons

static func cell_collides_with_polygons( resolved_map: TileMapLayer,

check_terrain_placement_collision

static func check_terrain_placement_collision( p_terrain_name: StringName,

save_terrain

func save_terrain(p_path: String) -> Error:

Parameters

p_path

Returns

load_terrain

func load_terrain(p_path: String) -> Error:

Parameters

p_path

Returns

save_all_terrain

func save_all_terrain(p_path: String) -> Error:

Parameters

p_path

Returns

load_all_terrain

func load_all_terrain(p_path: String) -> Error:

Parameters

p_path

Returns