|
|
@ -234,7 +234,7 @@ struct workshop_hook : df::building_workshopst {
|
|
|
|
|
|
|
|
|
|
|
|
// Find liquids to consume below the engine.
|
|
|
|
// Find liquids to consume below the engine.
|
|
|
|
|
|
|
|
|
|
|
|
bool find_liquids(df::coord *pwater, df::coord *pmagma, bool is_magma, bool any_level)
|
|
|
|
bool find_liquids(df::coord *pwater, df::coord *pmagma, bool is_magma, int min_level)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!is_magma)
|
|
|
|
if (!is_magma)
|
|
|
|
pmagma = NULL;
|
|
|
|
pmagma = NULL;
|
|
|
@ -252,23 +252,18 @@ struct workshop_hook : df::building_workshopst {
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
auto pldes = Maps::getTileDesignation(x,y,z-1);
|
|
|
|
auto pldes = Maps::getTileDesignation(x,y,z-1);
|
|
|
|
if (!pldes || pldes->bits.flow_size == 0)
|
|
|
|
if (!pldes || pldes->bits.flow_size < min_level)
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
if (pldes->bits.liquid_type == tile_liquid::Magma)
|
|
|
|
if (pldes->bits.liquid_type == tile_liquid::Magma)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!pmagma || (!any_level && pldes->bits.flow_size < 4))
|
|
|
|
if (pmagma)
|
|
|
|
continue;
|
|
|
|
*pmagma = df::coord(x,y,z-1);
|
|
|
|
|
|
|
|
|
|
|
|
*pmagma = df::coord(x,y,z-1);
|
|
|
|
|
|
|
|
if (pwater->isValid())
|
|
|
|
if (pwater->isValid())
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!any_level && pldes->bits.flow_size < 3)
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*pwater = df::coord(x,y,z-1);
|
|
|
|
*pwater = df::coord(x,y,z-1);
|
|
|
|
if (!pmagma || pmagma->isValid())
|
|
|
|
if (!pmagma || pmagma->isValid())
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
@ -286,7 +281,7 @@ struct workshop_hook : df::building_workshopst {
|
|
|
|
// Consume liquid inputs
|
|
|
|
// Consume liquid inputs
|
|
|
|
df::coord water, magma;
|
|
|
|
df::coord water, magma;
|
|
|
|
|
|
|
|
|
|
|
|
if (!find_liquids(&water, &magma, engine->is_magma, true))
|
|
|
|
if (!find_liquids(&water, &magma, engine->is_magma, 1))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// Destroy the item with enormous wear amount.
|
|
|
|
// Destroy the item with enormous wear amount.
|
|
|
|
liquid->addWear(WEAR_TICKS*5, true, false);
|
|
|
|
liquid->addWear(WEAR_TICKS*5, true, false);
|
|
|
@ -626,7 +621,7 @@ struct workshop_hook : df::building_workshopst {
|
|
|
|
if (auto engine = get_steam_engine())
|
|
|
|
if (auto engine = get_steam_engine())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
df::coord water, magma;
|
|
|
|
df::coord water, magma;
|
|
|
|
return !find_liquids(&water, &magma, engine->is_magma, false);
|
|
|
|
return !find_liquids(&water, &magma, engine->is_magma, 3);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return INTERPOSE_NEXT(isUnpowered)();
|
|
|
|
return INTERPOSE_NEXT(isUnpowered)();
|
|
|
@ -681,12 +676,24 @@ struct workshop_hook : df::building_workshopst {
|
|
|
|
if (engine->water_tile.isValid() || engine->magma_tile.isValid())
|
|
|
|
if (engine->water_tile.isValid() || engine->magma_tile.isValid())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
df::coord water, magma;
|
|
|
|
df::coord water, magma;
|
|
|
|
find_liquids(&water, &magma, engine->is_magma, false);
|
|
|
|
find_liquids(&water, &magma, engine->is_magma, 3);
|
|
|
|
|
|
|
|
df::coord dwater, dmagma;
|
|
|
|
|
|
|
|
find_liquids(&dwater, &dmagma, engine->is_magma, 5);
|
|
|
|
|
|
|
|
|
|
|
|
if (engine->water_tile.isValid() && !water.isValid())
|
|
|
|
if (engine->water_tile.isValid())
|
|
|
|
db->fore[engine->water_tile.x][engine->water_tile.y] = 0;
|
|
|
|
{
|
|
|
|
if (engine->magma_tile.isValid() && engine->is_magma && !magma.isValid())
|
|
|
|
if (!water.isValid())
|
|
|
|
db->fore[engine->magma_tile.x][engine->magma_tile.y] = 0;
|
|
|
|
db->fore[engine->water_tile.x][engine->water_tile.y] = 0;
|
|
|
|
|
|
|
|
else if (!dwater.isValid())
|
|
|
|
|
|
|
|
db->bright[engine->water_tile.x][engine->water_tile.y] = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (engine->magma_tile.isValid() && engine->is_magma)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (!magma.isValid())
|
|
|
|
|
|
|
|
db->fore[engine->magma_tile.x][engine->magma_tile.y] = 0;
|
|
|
|
|
|
|
|
else if (!dmagma.isValid())
|
|
|
|
|
|
|
|
db->bright[engine->magma_tile.x][engine->magma_tile.y] = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|