diff --git a/plugins/buildingplan/buildingplan_cycle.cpp b/plugins/buildingplan/buildingplan_cycle.cpp index c8cd018e4..f401c90a8 100644 --- a/plugins/buildingplan/buildingplan_cycle.cpp +++ b/plugins/buildingplan/buildingplan_cycle.cpp @@ -11,6 +11,7 @@ #include "df/building_design.h" #include "df/item.h" #include "df/job.h" +#include "df/map_block.h" #include "df/world.h" #include @@ -154,17 +155,18 @@ static df::building * popInvalidTasks(color_ostream &out, Bucket &task_queue, // This is tricky. we want to choose an item that can be brought to the job site, but that's not // necessarily the same as job->pos. it could be many tiles off in any direction (e.g. for bridges), or -// up or down (e.g. for stairs). -static bool isAccessibleFrom(df::item *item, df::job *job) { - // stub this out for now until we have a good algorithm. - // df::coord item_pos = Items::getPosition(item); - // const df::coord &job_pos = job->pos; - // return Maps::canWalkBetween(item_pos, job_pos) || - // Maps::canWalkBetween(item_pos, df::coord{job_pos.x-1, job_pos.y, job_pos.z}) || - // Maps::canWalkBetween(item_pos, df::coord{job_pos.x+1, job_pos.y, job_pos.z}) || - // Maps::canWalkBetween(item_pos, df::coord{job_pos.x, job_pos.y-1, job_pos.z}) || - // Maps::canWalkBetween(item_pos, df::coord{job_pos.x, job_pos.y+1, job_pos.z}); - return true; +// up or down (e.g. for stairs). For now, just return if the item is on a walkable tile. +static bool isAccessibleFrom(color_ostream &out, df::item *item, df::job *job) { + df::coord item_pos = Items::getPosition(item); + df::map_block *block = Maps::getTileBlock(item_pos); + bool is_walkable = false; + if (block) { + uint16_t walkability_group = index_tile(block->walkable, item_pos); + is_walkable = walkability_group != 0; + TRACE(cycle,out).print("item %d in walkability_group %u at (%d,%d,%d) is %saccessible from job site\n", + item->id, walkability_group, item_pos.x, item_pos.y, item_pos.z, is_walkable ? "" : "not "); + } + return is_walkable; } static void doVector(color_ostream &out, df::job_item_vector_id vector_id, @@ -198,7 +200,7 @@ static void doVector(color_ostream &out, df::job_item_vector_id vector_id, auto job = bld->jobs[0]; auto filter_idx = task.second; auto &pb = planned_buildings.at(id); - if (isAccessibleFrom(item, job) + if (isAccessibleFrom(out, item, job) && matchesFilters(item, job->job_items[filter_idx], pb.heat_safety, pb.item_filters[filter_idx]) && Job::attachJobItem(job, item,