From 089de5f422bc3c080c6d6e8d1a45af1788fa7797 Mon Sep 17 00:00:00 2001 From: myk002 Date: Sun, 3 Oct 2021 07:36:52 -0700 Subject: [PATCH] support non-rectangular extent-based buildings --- .../test/ecosystem/in/allbuildings-spec.csv | 5 ++++- plugins/blueprint.cpp | 16 +++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/data/blueprints/library/test/ecosystem/in/allbuildings-spec.csv b/data/blueprints/library/test/ecosystem/in/allbuildings-spec.csv index d48f891ba..cd3d09b9a 100644 --- a/data/blueprints/library/test/ecosystem/in/allbuildings-spec.csv +++ b/data/blueprints/library/test/ecosystem/in/allbuildings-spec.csv @@ -1,5 +1,8 @@ #notes -description=all the buildings +description=all the underground buildings width=24 height=37 depth=2 +#ignore +does not include (p) farm plots or (oO) dirt/paved roads, since they are built +on dirt and the ecosystem harness only chooses rock areas. diff --git a/plugins/blueprint.cpp b/plugins/blueprint.cpp index 71c33735b..4ee889e81 100644 --- a/plugins/blueprint.cpp +++ b/plugins/blueprint.cpp @@ -213,6 +213,16 @@ static const char * do_block_building(const tile_context &ctx, const char *s, return s; } +static const char * do_extent_building(const tile_context &ctx, const char *s, + bool at_target_pos, + bool *add_size = NULL) { + // use expansion syntax for rectangular or one-tile buildings + if (is_rectangular(ctx)) + return do_block_building(ctx, s, at_target_pos, add_size); + + return s; +} + static const char * get_bridge_str(df::building *b) { df::building_bridgest *bridge = virtual_cast(b); if (!bridge) @@ -473,7 +483,7 @@ static const char * get_build_keys(const df::coord &pos, case building_type::Box: return "h"; case building_type::FarmPlot: - return do_block_building(ctx, "p", at_nw_corner, &add_size); + return do_extent_building(ctx, "p", at_nw_corner, &add_size); case building_type::Weaponrack: return "r"; case building_type::Statue: @@ -483,9 +493,9 @@ static const char * get_build_keys(const df::coord &pos, case building_type::Coffin: return "n"; case building_type::RoadPaved: - return do_block_building(ctx, "o", at_nw_corner, &add_size); + return do_extent_building(ctx, "o", at_nw_corner, &add_size); case building_type::RoadDirt: - return do_block_building(ctx, "O", at_nw_corner, &add_size); + return do_extent_building(ctx, "O", at_nw_corner, &add_size); case building_type::Bridge: return do_block_building(ctx, get_bridge_str(ctx.b), at_nw_corner, &add_size);