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_statesp_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