|
|
@ -34,25 +34,6 @@ int vec_count(vector<uint16_t>& vec, uint16_t t)
|
|
|
|
return count;
|
|
|
|
return count;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//// manhattan distance
|
|
|
|
|
|
|
|
//int source_distance(int sx, int sy, int sz,
|
|
|
|
|
|
|
|
// int x, int y, int z, int i)
|
|
|
|
|
|
|
|
//{
|
|
|
|
|
|
|
|
// // TODO changing x and y seems to be optimized away (?)
|
|
|
|
|
|
|
|
// cout << x << " " << i << " " << i%16 << " " << x+(i%16) << endl;
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// // handle the fact that x,y,z refers to a 16x16 grid
|
|
|
|
|
|
|
|
// //x += i%16;
|
|
|
|
|
|
|
|
// //y += i/16;
|
|
|
|
|
|
|
|
// int dx = i%16;
|
|
|
|
|
|
|
|
// int dy = i/16;
|
|
|
|
|
|
|
|
// //x *= 16;
|
|
|
|
|
|
|
|
// //y *= 16;
|
|
|
|
|
|
|
|
// //x += dx;
|
|
|
|
|
|
|
|
// //y += dy;
|
|
|
|
|
|
|
|
// return abs(sx-(x+(i%16)))+abs(sy-(y+(i/16)))+abs(sz-z);
|
|
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int manhattan_distance(int x, int y, int z, int xx, int yy, int zz)
|
|
|
|
int manhattan_distance(int x, int y, int z, int xx, int yy, int zz)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return abs(x-xx)+abs(y-yy)+abs(z-zz);
|
|
|
|
return abs(x-xx)+abs(y-yy)+abs(z-zz);
|
|
|
@ -60,7 +41,6 @@ int manhattan_distance(int x, int y, int z, int xx, int yy, int zz)
|
|
|
|
|
|
|
|
|
|
|
|
struct DigTarget
|
|
|
|
struct DigTarget
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//public:
|
|
|
|
|
|
|
|
DigTarget() :
|
|
|
|
DigTarget() :
|
|
|
|
source_distance(0),
|
|
|
|
source_distance(0),
|
|
|
|
grid_x(0), grid_y(0),
|
|
|
|
grid_x(0), grid_y(0),
|
|
|
@ -72,8 +52,6 @@ struct DigTarget
|
|
|
|
DigTarget(
|
|
|
|
DigTarget(
|
|
|
|
int realx, int realy, int _z,
|
|
|
|
int realx, int realy, int _z,
|
|
|
|
int sourcex, int sourcey, int sourcez) :
|
|
|
|
int sourcex, int sourcey, int sourcez) :
|
|
|
|
//grid_x(realx/16), grid_y(realy/16),
|
|
|
|
|
|
|
|
//local_x(realx%16), local_y(realy%16),
|
|
|
|
|
|
|
|
real_x(realx), real_y(realy), z(_z)
|
|
|
|
real_x(realx), real_y(realy), z(_z)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
grid_x = realx/16;
|
|
|
|
grid_x = realx/16;
|
|
|
@ -91,13 +69,9 @@ struct DigTarget
|
|
|
|
int gridx, int gridy, int _z,
|
|
|
|
int gridx, int gridy, int _z,
|
|
|
|
int localx, int localy,
|
|
|
|
int localx, int localy,
|
|
|
|
int sourcex, int sourcey, int sourcez) :
|
|
|
|
int sourcex, int sourcey, int sourcez) :
|
|
|
|
//source_distance(manhattan_distance(
|
|
|
|
|
|
|
|
// realx, realy, realz,
|
|
|
|
|
|
|
|
// sourcex, sourcey, sourcez)),
|
|
|
|
|
|
|
|
grid_x(gridx), grid_y(gridy),
|
|
|
|
grid_x(gridx), grid_y(gridy),
|
|
|
|
local_x(localx), local_y(localy),
|
|
|
|
local_x(localx), local_y(localy),
|
|
|
|
z(_z)
|
|
|
|
z(_z)
|
|
|
|
//real_x(realx), real_y(realy), real_z(realz)
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
real_x = (grid_x*16)+local_x;
|
|
|
|
real_x = (grid_x*16)+local_x;
|
|
|
|
real_y = (grid_y*16)+local_y;
|
|
|
|
real_y = (grid_y*16)+local_y;
|
|
|
@ -108,21 +82,13 @@ struct DigTarget
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int source_distance; // the distance to the source coords, used for sorting
|
|
|
|
int source_distance; // the distance to the source coords, used for sorting
|
|
|
|
//int source_distance() const { return _source_distance; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int grid_x, grid_y;
|
|
|
|
int grid_x, grid_y;
|
|
|
|
int local_x, local_y;
|
|
|
|
int local_x, local_y;
|
|
|
|
int real_x, real_y;
|
|
|
|
int real_x, real_y;
|
|
|
|
int z;
|
|
|
|
int z;
|
|
|
|
//int index;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//const bool valid;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool operator<(const DigTarget& o) const { return source_distance < o.source_distance; }
|
|
|
|
bool operator<(const DigTarget& o) const { return source_distance < o.source_distance; }
|
|
|
|
|
|
|
|
|
|
|
|
//private:
|
|
|
|
|
|
|
|
// int source_x, source_y, source_z;
|
|
|
|
|
|
|
|
// int _source_distance;
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
int dig(DFHack::API& DF,
|
|
|
|
int dig(DFHack::API& DF,
|
|
|
@ -138,17 +104,13 @@ int dig(DFHack::API& DF,
|
|
|
|
uint32_t x_max,y_max,z_max;
|
|
|
|
uint32_t x_max,y_max,z_max;
|
|
|
|
DFHack::t_designation designations[16][16];
|
|
|
|
DFHack::t_designation designations[16][16];
|
|
|
|
uint16_t tiles[16][16];
|
|
|
|
uint16_t tiles[16][16];
|
|
|
|
//uint32_t count = 0;
|
|
|
|
|
|
|
|
DF.getSize(x_max,y_max,z_max);
|
|
|
|
DF.getSize(x_max,y_max,z_max);
|
|
|
|
|
|
|
|
|
|
|
|
// every tile found, will later be sorted by distance to source
|
|
|
|
// every tile found, will later be sorted by distance to source
|
|
|
|
vector<DigTarget> candidates;
|
|
|
|
vector<DigTarget> candidates;
|
|
|
|
|
|
|
|
|
|
|
|
cout << "============================" << endl;
|
|
|
|
//cout << "============================" << endl;
|
|
|
|
cout << "source is " << x_source << " " << y_source << " " << z_source << endl;
|
|
|
|
//cout << "source is " << x_source << " " << y_source << " " << z_source << endl;
|
|
|
|
|
|
|
|
|
|
|
|
//int debugmaxx = 0;
|
|
|
|
|
|
|
|
//int debugmaxy = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// walk the map
|
|
|
|
// walk the map
|
|
|
|
for(uint32_t x = 0; x < x_max; x++)
|
|
|
|
for(uint32_t x = 0; x < x_max; x++)
|
|
|
@ -157,9 +119,6 @@ int dig(DFHack::API& DF,
|
|
|
|
{
|
|
|
|
{
|
|
|
|
for(uint32_t z = 0; z < z_max; z++)
|
|
|
|
for(uint32_t z = 0; z < z_max; z++)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (z != z_source)
|
|
|
|
|
|
|
|
continue; // hack to cut down on targets
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(DF.isValidBlock(x,y,z))
|
|
|
|
if(DF.isValidBlock(x,y,z))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// read block designations and tiletype
|
|
|
|
// read block designations and tiletype
|
|
|
@ -176,15 +135,6 @@ int dig(DFHack::API& DF,
|
|
|
|
designations[lx][ly].bits.dig == 0 &&
|
|
|
|
designations[lx][ly].bits.dig == 0 &&
|
|
|
|
vec_count(targets, DFHack::tileTypeTable[tiles[lx][ly]].c) > 0)
|
|
|
|
vec_count(targets, DFHack::tileTypeTable[tiles[lx][ly]].c) > 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//cout << "target found at: ";
|
|
|
|
|
|
|
|
//cout << x << "," << y << "," << z << "," << i << endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//designations[i].bits.dig = DFHack::designation_default;
|
|
|
|
|
|
|
|
//++count;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//int realx = (x*16)+lx;
|
|
|
|
|
|
|
|
//int realy = (y*16)+ly;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
candidates.push_back(DigTarget(
|
|
|
|
candidates.push_back(DigTarget(
|
|
|
|
x, y, z,
|
|
|
|
x, y, z,
|
|
|
|
lx, ly,
|
|
|
|
lx, ly,
|
|
|
@ -192,11 +142,6 @@ int dig(DFHack::API& DF,
|
|
|
|
|
|
|
|
|
|
|
|
//cout << "target found at " << world_x << " " << world_y << " " << z;
|
|
|
|
//cout << "target found at " << world_x << " " << world_y << " " << z;
|
|
|
|
//cout << ", " << dt->source_distance << " tiles to source" << endl;
|
|
|
|
//cout << ", " << dt->source_distance << " tiles to source" << endl;
|
|
|
|
|
|
|
|
|
|
|
|
//if (world_x > debugmaxx)
|
|
|
|
|
|
|
|
// debugmaxx = world_x;
|
|
|
|
|
|
|
|
//if (world_y > debugmaxy)
|
|
|
|
|
|
|
|
// debugmaxy = world_y;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} // local y
|
|
|
|
} // local y
|
|
|
|
} // local x
|
|
|
|
} // local x
|
|
|
@ -204,9 +149,6 @@ int dig(DFHack::API& DF,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TODO the following routine doesnt check if the tile is already marked for digging
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// if we found more tiles than was requested, sort them by distance to source,
|
|
|
|
// if we found more tiles than was requested, sort them by distance to source,
|
|
|
|
// keep the front 'num' elements and drop the rest
|
|
|
|
// keep the front 'num' elements and drop the rest
|
|
|
|
if (num != -1 && candidates.size() > (unsigned int)num)
|
|
|
|
if (num != -1 && candidates.size() > (unsigned int)num)
|
|
|
@ -216,21 +158,14 @@ int dig(DFHack::API& DF,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
num = candidates.size();
|
|
|
|
num = candidates.size();
|
|
|
|
|
|
|
|
|
|
|
|
cout << "============================" << endl;
|
|
|
|
//cout << "============================" << endl;
|
|
|
|
cout << "source is " << x_source << " " << y_source << " " << z_source << endl;
|
|
|
|
//cout << "source is " << x_source << " " << y_source << " " << z_source << endl;
|
|
|
|
|
|
|
|
|
|
|
|
// mark the tiles for actual digging
|
|
|
|
// mark the tiles for actual digging
|
|
|
|
for (vector<DigTarget>::const_iterator i = candidates.begin(); i != candidates.end(); ++i)
|
|
|
|
for (vector<DigTarget>::const_iterator i = candidates.begin(); i != candidates.end(); ++i)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//int grid_x = (*i).x/16;
|
|
|
|
//cout << "designating at " << (*i).real_x << " " << (*i).real_y << " " << (*i).z;
|
|
|
|
//int grid_y = (*i).y/16;
|
|
|
|
//cout << ", " << (*i).source_distance << " tiles to source" << endl;
|
|
|
|
//int z = (*i).z;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//int local_x = (*i).x%grid_x;
|
|
|
|
|
|
|
|
//int local_y = (*i).y%grid_y;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cout << "designating at " << (*i).real_x << " " << (*i).real_y << " " << (*i).z;
|
|
|
|
|
|
|
|
cout << ", " << (*i).source_distance << " tiles to source" << endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO this could probably be made much better, theres a big chance the trees are on the same grid
|
|
|
|
// TODO this could probably be made much better, theres a big chance the trees are on the same grid
|
|
|
|
// TODO move into function in DigTarget
|
|
|
|
// TODO move into function in DigTarget
|
|
|
@ -239,18 +174,11 @@ int dig(DFHack::API& DF,
|
|
|
|
DF.WriteDesignations((*i).grid_x, (*i).grid_y, (*i).z, (uint32_t *) designations);
|
|
|
|
DF.WriteDesignations((*i).grid_x, (*i).grid_y, (*i).z, (uint32_t *) designations);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//cout << debugmaxx << " " << debugmaxy << endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return num;
|
|
|
|
return num;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void test()
|
|
|
|
void test()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
DigTarget dt;
|
|
|
|
|
|
|
|
//assert(!dt.valid);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
DigTarget dt(
|
|
|
|
DigTarget dt(
|
|
|
|
20, 35, 16,
|
|
|
|
20, 35, 16,
|
|
|
@ -267,7 +195,6 @@ void test()
|
|
|
|
|
|
|
|
|
|
|
|
assert(dt.z == 16);
|
|
|
|
assert(dt.z == 16);
|
|
|
|
assert(dt.source_distance == 35);
|
|
|
|
assert(dt.source_distance == 35);
|
|
|
|
//assert(dt.valid);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -287,25 +214,7 @@ void test()
|
|
|
|
|
|
|
|
|
|
|
|
assert(dt.z == 16);
|
|
|
|
assert(dt.z == 16);
|
|
|
|
assert(dt.source_distance == 91);
|
|
|
|
assert(dt.source_distance == 91);
|
|
|
|
//assert(dt.valid);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//{ // sorting
|
|
|
|
|
|
|
|
// DigTarget a(
|
|
|
|
|
|
|
|
// 20, 35, 16,
|
|
|
|
|
|
|
|
// 10, 12, 14);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// DigTarget b(
|
|
|
|
|
|
|
|
// 2, 4, 16,
|
|
|
|
|
|
|
|
// 5, 10,
|
|
|
|
|
|
|
|
// 10, 12, 14);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// vector<DigTarget> v;
|
|
|
|
|
|
|
|
// v.push_back(b);
|
|
|
|
|
|
|
|
// v.push_back(a);
|
|
|
|
|
|
|
|
// sort(v.begin(), v.end());
|
|
|
|
|
|
|
|
// assert(*(v.begin()) == a);
|
|
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int main (int argc, const char* argv[])
|
|
|
|
int main (int argc, const char* argv[])
|
|
|
|