From 645e2d98b87dd93e9c8ce2f34c503e105bfee5dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Cadete?= Date: Tue, 11 Jul 2023 12:22:02 +0100 Subject: [PATCH] Allow cartpushers emptying warehouses to go offroad Fixes #767 --- src/building/warehouse.c | 2 +- src/figuretype/cartpusher.c | 31 +++++++++++++++++-------------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/building/warehouse.c b/src/building/warehouse.c index 11230e7fed..c1bee9a3bd 100644 --- a/src/building/warehouse.c +++ b/src/building/warehouse.c @@ -451,7 +451,7 @@ int building_warehouse_for_storing(int src_building_id, int x, int y, int resour int min_dist = INFINITE; int min_building_id = 0; for (building *b = building_first_of_type(BUILDING_WAREHOUSE); b; b = b->next_of_type) { - if (b->id == src_building_id || b->road_network_id != road_network_id || + if (b->id == src_building_id || (road_network_id != -1 && b->road_network_id != road_network_id) || !building_warehouse_accepts_storage(b, resource, understaffed)) { continue; } diff --git a/src/figuretype/cartpusher.c b/src/figuretype/cartpusher.c index bac161cba1..1a14cbfdab 100644 --- a/src/figuretype/cartpusher.c +++ b/src/figuretype/cartpusher.c @@ -628,21 +628,24 @@ static void determine_warehouseman_destination(figure *f, int road_network_id, i } return; } - // priority 5: resource to other warehouse - dst_building_id = building_warehouse_for_storing(f->building_id, f->x, f->y, f->resource_id, - road_network_id, 0, &dst); - - int empty_warehouse = building_storage_get(building_get(f->building_id)->storage_id)->empty_all; // deliver to another warehouse because this one is being emptied - if (dst_building_id && empty_warehouse) { - if (dst_building_id == f->building_id) { - f->state = FIGURE_STATE_DEAD; - } else { - set_destination(f, FIGURE_ACTION_51_WAREHOUSEMAN_DELIVERING_RESOURCE, dst_building_id, dst.x, dst.y); - if (remove_resources) { - remove_resource_from_warehouse(f); + + // priority 5: another warehouse to empty this one + if (building_storage_get(building_get(f->building_id)->storage_id)->empty_all) { + dst_building_id = building_warehouse_for_storing(f->building_id, f->x, f->y, f->resource_id, -1, 0, &dst); + + // deliver to another warehouse because this one is being emptied + if (dst_building_id) { + if (dst_building_id == f->building_id) { + f->state = FIGURE_STATE_DEAD; + } else { + set_destination(f, FIGURE_ACTION_51_WAREHOUSEMAN_DELIVERING_RESOURCE, dst_building_id, dst.x, dst.y); + f->terrain_usage = TERRAIN_USAGE_PREFER_ROADS_HIGHWAY; + if (remove_resources) { + remove_resource_from_warehouse(f); + } } + return; } - return; } // priority 6: raw material to well-stocked workshop dst_building_id = building_get_workshop_for_raw_material(f->x, f->y, f->resource_id, road_network_id, &dst); @@ -659,7 +662,7 @@ static void determine_warehouseman_destination(figure *f, int road_network_id, i static void warehouseman_initial_action(figure *f, int road_network_id, int remove_resources) { - if (!road_network_id) { + if (!road_network_id && f->terrain_usage == TERRAIN_USAGE_ROADS_HIGHWAY) { f->state = FIGURE_STATE_DEAD; return; }