本文整理汇总了C++中mapextras::MapCache::WriteAll方法的典型用法代码示例。如果您正苦于以下问题:C++ MapCache::WriteAll方法的具体用法?C++ MapCache::WriteAll怎么用?C++ MapCache::WriteAll使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类mapextras::MapCache
的用法示例。
在下文中一共展示了MapCache::WriteAll方法的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: vdig
//.........这里部分代码省略.........
if(!DFHack::isWallTerrain(tt))
continue;
if(vmat2!=veinmat)
continue;
// found a good tile, dig+unset material
DFHack::t_designation des = MCache->designationAt(current);
DFHack::t_designation des_minus;
DFHack::t_designation des_plus;
des_plus.whole = des_minus.whole = 0;
int16_t vmat_minus = -1;
int16_t vmat_plus = -1;
bool below = 0;
bool above = 0;
if(updown)
{
if(MCache->testCoord(current-1))
{
below = 1;
des_minus = MCache->designationAt(current-1);
vmat_minus = MCache->veinMaterialAt(current-1);
}
if(MCache->testCoord(current+1))
{
above = 1;
des_plus = MCache->designationAt(current+1);
vmat_plus = MCache->veinMaterialAt(current+1);
}
}
if(MCache->testCoord(current))
{
MCache->clearMaterialAt(current);
if(current.x < tx_max - 2)
{
flood.push(DFHack::DFCoord(current.x + 1, current.y, current.z));
if(current.y < ty_max - 2)
{
flood.push(DFHack::DFCoord(current.x + 1, current.y + 1,current.z));
flood.push(DFHack::DFCoord(current.x, current.y + 1,current.z));
}
if(current.y > 1)
{
flood.push(DFHack::DFCoord(current.x + 1, current.y - 1,current.z));
flood.push(DFHack::DFCoord(current.x, current.y - 1,current.z));
}
}
if(current.x > 1)
{
flood.push(DFHack::DFCoord(current.x - 1, current.y,current.z));
if(current.y < ty_max - 2)
{
flood.push(DFHack::DFCoord(current.x - 1, current.y + 1,current.z));
flood.push(DFHack::DFCoord(current.x, current.y + 1,current.z));
}
if(current.y > 1)
{
flood.push(DFHack::DFCoord(current.x - 1, current.y - 1,current.z));
flood.push(DFHack::DFCoord(current.x, current.y - 1,current.z));
}
}
if(updown)
{
if(current.z > 0 && below && vmat_minus == vmat2)
{
flood.push(current-1);
if(des_minus.bits.dig == DFHack::designation_d_stair)
des_minus.bits.dig = DFHack::designation_ud_stair;
else
des_minus.bits.dig = DFHack::designation_u_stair;
MCache->setDesignationAt(current-1,des_minus);
des.bits.dig = DFHack::designation_d_stair;
}
if(current.z < z_max - 1 && above && vmat_plus == vmat2)
{
flood.push(current+ 1);
if(des_plus.bits.dig == DFHack::designation_u_stair)
des_plus.bits.dig = DFHack::designation_ud_stair;
else
des_plus.bits.dig = DFHack::designation_d_stair;
MCache->setDesignationAt(current+1,des_plus);
if(des.bits.dig == DFHack::designation_d_stair)
des.bits.dig = DFHack::designation_ud_stair;
else
des.bits.dig = DFHack::designation_u_stair;
}
}
if(des.bits.dig == DFHack::designation_no)
des.bits.dig = DFHack::designation_default;
MCache->setDesignationAt(current,des);
}
}
MCache->WriteAll();
c->Resume();
return CR_OK;
}
示例2: expdig
//.........这里部分代码省略.........
int x = 0,mx = 16;
if(bx == 0)
x = 1;
if(bx == x_max - 1)
mx = 15;
for(; x < mx; x++)
{
int y = 0,my = 16;
if(by == 0)
y = 1;
if(by == y_max - 1)
my = 15;
for(; y < my; y++)
{
naked_designation & des = bl->designation[x][y].bits;
short unsigned int tt = bl->tiletype[x][y];
// could be potentially used to locate hidden constructions?
if(tileMaterial(tt) == CONSTRUCTED && !des.hidden)
continue;
if(!isWallTerrain(tt) && !des.hidden)
continue;
if(how == EXPLO_CLEAR)
{
des.dig = designation_no;
continue;
}
if(dm[y][x])
{
if(what == EXPLO_ALL
|| des.dig == designation_default && what == EXPLO_DESIGNATED
|| des.hidden && what == EXPLO_HIDDEN)
{
des.dig = designation_default;
}
}
else if(what == EXPLO_DESIGNATED)
{
des.dig = designation_no;
}
}
}
bl->flags.set(BLOCK_DESIGNATED);
return true;
};
if(how == EXPLO_DIAG5)
{
int which;
for(uint32_t x = 0; x < x_max; x++)
{
for(int32_t y = 0 ; y < y_max; y++)
{
which = (4*x + y) % 5;
apply(x,y_max - 1 - y,diag5[which]);
}
}
}
else if(how == EXPLO_LADDER)
{
int which;
for(uint32_t x = 0; x < x_max; x++)
{
which = x % 3;
for(int32_t y = 0 ; y < y_max; y++)
{
apply(x,y,ladder[which]);
}
}
}
else if(how == EXPLO_CROSS)
{
// middle + recentering for the image
int xmid = x_max * 8 - 8;
int ymid = y_max * 8 - 8;
MapExtras::MapCache mx (maps);
for(int x = 0; x < 16; x++)
for(int y = 0; y < 16; y++)
{
DFCoord pos(xmid+x,ymid+y,z_level);
short unsigned int tt = mx.tiletypeAt(pos);
if(tt == 0)
continue;
t_designation des = mx.designationAt(pos);
if(tileMaterial(tt) == CONSTRUCTED && !des.bits.hidden)
continue;
if(!isWallTerrain(tt) && !des.bits.hidden)
continue;
if(cross[y][x])
{
des.bits.dig = designation_default;
mx.setDesignationAt(pos,des);
}
}
mx.WriteAll();
}
else for(uint32_t x = 0; x < x_max; x++)
for(int32_t y = 0 ; y < y_max; y++)
apply(x,y,all_tiles);
c->Resume();
return CR_OK;
}
示例3: digcircle
//.........这里部分代码省略.........
if(des.bits.dig == designation_no)
{
des.bits.dig = type;
}
else
{
des.bits.dig = designation_no;
}
break;
}
std::cerr << "allowing tt" << tt << "\n";
MCache.setDesignationAt(at,des);
return true;
};
auto lineX = [&](int32_t y1, int32_t y2, int32_t x, int32_t z) -> bool
{
for(int32_t y = y1; y <= y2; y++)
{
dig(x,y,z);
}
return true;
};
auto lineY = [&](int32_t x1, int32_t x2, int32_t y, int32_t z) -> bool
{
for(int32_t x = x1; x <= x2; x++)
{
dig(x,y,z);
}
return true;
};
int r = diameter / 2;
int iter;
bool adjust;
if(diameter % 2)
{
// paint center
if(filled)
{
lineY(cx - r, cx + r, cy, cz);
}
else
{
dig(cx - r, cy, cz);
dig(cx + r, cy, cz);
}
adjust = false;
iter = 2;
}
else
{
adjust = true;
iter = 1;
}
int lastwhole = r;
for(; iter <= diameter - 1; iter +=2)
{
// top, bottom coords
int top = cy - ((iter + 1) / 2) + adjust;
int bottom = cy + ((iter + 1) / 2);
// see where the current 'line' intersects the circle
double val = std::sqrt(double(diameter*diameter - iter*iter));
// adjust for circles with odd diameter
if(!adjust)
val -= 1;
// map the found value to the DF grid
double whole;
double fraction = std::modf(val / 2.0, & whole);
if (fraction > 0.5)
whole += 1.0;
int right = cx + whole;
int left = cx - whole + adjust;
int diff = lastwhole - whole;
// paint
if(filled || iter == diameter - 1)
{
lineY(left, right, top , cz);
lineY(left, right, bottom , cz);
}
else
{
dig(left, top, cz);
dig(left, bottom, cz);
dig(right, top, cz);
dig(right, bottom, cz);
}
if(!filled && diff > 1)
{
int lright = cx + lastwhole;
int lleft = cx - lastwhole + adjust;
lineY(lleft + 1, left - 1, top + 1 , cz);
lineY(right + 1, lright - 1, top + 1 , cz);
lineY(lleft + 1, left - 1, bottom - 1 , cz);
lineY(right + 1, lright - 1, bottom - 1 , cz);
}
lastwhole = whole;
}
MCache.WriteAll();
c->Resume();
return CR_OK;
}
示例4: tiletraffic
DFhackCExport command_result tiletraffic(DFHack::Core * c, std::vector<std::string> & params)
{
//Target traffic types.
e_traffic target = traffic_normal;
//!!! Options Later !!!
//Loop through parameters
for(int i = 0; i < params.size();i++)
{
if(params[i] == "help" || params[i] == "?")
{
c->con.print("Set traffic types for all tiles on the map.\n"
"Traffic Type Codes:\n"
" H: High Traffic\n"
" N: Normal Traffic\n"
" L: Low Traffic\n"
" R: Restricted Traffic\n"
);
return CR_OK;
}
switch (toupper(params[i][0]))
{
case 'H':
target = traffic_high; break;
case 'N':
target = traffic_normal; break;
case 'L':
target = traffic_low; break;
case 'R':
target = traffic_restricted; break;
}
}
//Initialization.
c->Suspend();
DFHack::Maps * Maps = c->getMaps();
DFHack::Gui * Gui = c->getGui();
// init the map
if(!Maps->Start())
{
c->con.printerr("Can't init map. Make sure you have a map loaded in DF.\n");
c->Resume();
return CR_FAILURE;
}
//Maximum map size.
uint32_t x_max,y_max,z_max;
Maps->getSize(x_max,y_max,z_max);
uint32_t tx_max = x_max * 16;
uint32_t ty_max = y_max * 16;
MapExtras::MapCache * MCache = new MapExtras::MapCache(Maps);
c->con.print("Entire map ... FILLING!\n");
//Loop through every single tile
for(uint32_t x = 0; x <= tx_max; x++)
{
for(uint32_t y = 0; y <= ty_max; y++)
{
for(uint32_t z = 0; z <= z_max; z++)
{
DFHack::DFCoord tile = DFHack::DFCoord(x, y, z);
DFHack::t_designation des = MCache->designationAt(tile);
des.bits.traffic = target;
MCache->setDesignationAt(tile, des);
}
}
}
MCache->WriteAll();
c->Resume();
return CR_OK;
}
示例5: filltraffic
//.........这里部分代码省略.........
source = des.bits.traffic;
if(source == target)
{
c->con.printerr("This tile is already set to the target traffic type.\n");
delete MCache;
c->Resume();
return CR_FAILURE;
}
if(DFHack::isWallTerrain(tt))
{
c->con.printerr("This tile is a wall. Please select a passable tile.\n");
delete MCache;
c->Resume();
return CR_FAILURE;
}
if(checkpit && DFHack::isOpenTerrain(tt))
{
c->con.printerr("This tile is a hole. Please select a passable tile.\n");
delete MCache;
c->Resume();
return CR_FAILURE;
}
if(checkbuilding && oc.bits.building)
{
c->con.printerr("This tile contains a building. Please select an empty tile.\n");
delete MCache;
c->Resume();
return CR_FAILURE;
}
c->con.print("%d/%d/%d ... FILLING!\n", cx,cy,cz);
//Naive four-way or six-way flood fill with possible tiles on a stack.
stack <DFHack::DFCoord> flood;
flood.push(xy);
while(!flood.empty())
{
xy = flood.top();
flood.pop();
des = MCache->designationAt(xy);
if (des.bits.traffic != source) continue;
tt = MCache->tiletypeAt(xy);
if(DFHack::isWallTerrain(tt)) continue;
if(checkpit && DFHack::isOpenTerrain(tt)) continue;
if (checkbuilding)
{
oc = MCache->occupancyAt(xy);
if(oc.bits.building) continue;
}
//This tile is ready. Set its traffic level and add surrounding tiles.
if (MCache->testCoord(xy))
{
des.bits.traffic = target;
MCache->setDesignationAt(xy,des);
if (xy.x > 0)
{
flood.push(DFHack::DFCoord(xy.x - 1, xy.y, xy.z));
}
if (xy.x < tx_max - 1)
{
flood.push(DFHack::DFCoord(xy.x + 1, xy.y, xy.z));
}
if (xy.y > 0)
{
flood.push(DFHack::DFCoord(xy.x, xy.y - 1, xy.z));
}
if (xy.y < ty_max - 1)
{
flood.push(DFHack::DFCoord(xy.x, xy.y + 1, xy.z));
}
if (updown)
{
if (xy.z > 0 && DFHack::LowPassable(tt))
{
flood.push(DFHack::DFCoord(xy.x, xy.y, xy.z - 1));
}
if (xy.z < z_max && DFHack::HighPassable(tt))
{
flood.push(DFHack::DFCoord(xy.x, xy.y, xy.z + 1));
}
}
}
}
MCache->WriteAll();
c->Resume();
return CR_OK;
}
示例6: expdig
//.........这里部分代码省略.........
if (!Maps::IsValid())
{
c->con.printerr("Map is not available!\n");
return CR_FAILURE;
}
Maps::getSize(x_max,y_max,z_max);
int32_t xzzz,yzzz,z_level;
if(!Gui::getViewCoords(xzzz,yzzz,z_level))
{
c->con.printerr("Can't get view coords...\n");
return CR_FAILURE;
}
if(how == EXPLO_DIAG5)
{
int which;
for(uint32_t x = 0; x < x_max; x++)
{
for(int32_t y = 0 ; y < y_max; y++)
{
which = (4*x + y) % 5;
stamp_pattern(x,y_max - 1 - y, z_level, diag5[which],
how, what, x_max, y_max);
}
}
}
else if(how == EXPLO_DIAG5R)
{
int which;
for(uint32_t x = 0; x < x_max; x++)
{
for(int32_t y = 0 ; y < y_max; y++)
{
which = (4*x + 1000-y) % 5;
stamp_pattern(x,y_max - 1 - y, z_level, diag5r[which],
how, what, x_max, y_max);
}
}
}
else if(how == EXPLO_LADDER)
{
int which;
for(uint32_t x = 0; x < x_max; x++)
{
which = x % 3;
for(int32_t y = 0 ; y < y_max; y++)
{
stamp_pattern(x, y, z_level, ladder[which],
how, what, x_max, y_max);
}
}
}
else if(how == EXPLO_LADDERR)
{
int which;
for(int32_t y = 0 ; y < y_max; y++)
{
which = y % 3;
for(uint32_t x = 0; x < x_max; x++)
{
stamp_pattern(x, y, z_level, ladderr[which],
how, what, x_max, y_max);
}
}
}
else if(how == EXPLO_CROSS)
{
// middle + recentering for the image
int xmid = x_max * 8 - 8;
int ymid = y_max * 8 - 8;
MapExtras::MapCache mx;
for(int x = 0; x < 16; x++)
for(int y = 0; y < 16; y++)
{
DFCoord pos(xmid+x,ymid+y,z_level);
df::tiletype tt = mx.tiletypeAt(pos);
if(tt == tiletype::Void)
continue;
df::tile_designation des = mx.designationAt(pos);
if(tileMaterial(tt) == tiletype_material::CONSTRUCTION && !des.bits.hidden)
continue;
if(!isWallTerrain(tt) && !des.bits.hidden)
continue;
if(cross[y][x])
{
des.bits.dig = tile_dig_designation::Default;
mx.setDesignationAt(pos,des);
}
}
mx.WriteAll();
}
else for(uint32_t x = 0; x < x_max; x++)
{
for(int32_t y = 0 ; y < y_max; y++)
{
stamp_pattern(x, y, z_level, all_tiles,
how, what, x_max, y_max);
}
}
return CR_OK;
}
示例7: vdig
//.........这里部分代码省略.........
tt = MCache->tiletypeAt(current);
if(!DFHack::isWallTerrain(tt))
continue;
if(vmat2!=veinmat)
continue;
// found a good tile, dig+unset material
df::tile_designation des = MCache->designationAt(current);
df::tile_designation des_minus;
df::tile_designation des_plus;
des_plus.whole = des_minus.whole = 0;
int16_t vmat_minus = -1;
int16_t vmat_plus = -1;
bool below = 0;
bool above = 0;
if(updown)
{
if(MCache->testCoord(current-1))
{
below = 1;
des_minus = MCache->designationAt(current-1);
vmat_minus = MCache->veinMaterialAt(current-1);
}
if(MCache->testCoord(current+1))
{
above = 1;
des_plus = MCache->designationAt(current+1);
vmat_plus = MCache->veinMaterialAt(current+1);
}
}
if(MCache->testCoord(current))
{
MCache->clearMaterialAt(current);
if(current.x < tx_max - 2)
{
flood.push(DFHack::DFCoord(current.x + 1, current.y, current.z));
if(current.y < ty_max - 2)
{
flood.push(DFHack::DFCoord(current.x + 1, current.y + 1,current.z));
flood.push(DFHack::DFCoord(current.x, current.y + 1,current.z));
}
if(current.y > 1)
{
flood.push(DFHack::DFCoord(current.x + 1, current.y - 1,current.z));
flood.push(DFHack::DFCoord(current.x, current.y - 1,current.z));
}
}
if(current.x > 1)
{
flood.push(DFHack::DFCoord(current.x - 1, current.y,current.z));
if(current.y < ty_max - 2)
{
flood.push(DFHack::DFCoord(current.x - 1, current.y + 1,current.z));
flood.push(DFHack::DFCoord(current.x, current.y + 1,current.z));
}
if(current.y > 1)
{
flood.push(DFHack::DFCoord(current.x - 1, current.y - 1,current.z));
flood.push(DFHack::DFCoord(current.x, current.y - 1,current.z));
}
}
if(updown)
{
if(current.z > 0 && below && vmat_minus == vmat2)
{
flood.push(current-1);
if(des_minus.bits.dig == tile_dig_designation::DownStair)
des_minus.bits.dig = tile_dig_designation::UpDownStair;
else
des_minus.bits.dig = tile_dig_designation::UpStair;
MCache->setDesignationAt(current-1,des_minus);
des.bits.dig = tile_dig_designation::DownStair;
}
if(current.z < z_max - 1 && above && vmat_plus == vmat2)
{
flood.push(current+ 1);
if(des_plus.bits.dig == tile_dig_designation::UpStair)
des_plus.bits.dig = tile_dig_designation::UpDownStair;
else
des_plus.bits.dig = tile_dig_designation::DownStair;
MCache->setDesignationAt(current+1,des_plus);
if(des.bits.dig == tile_dig_designation::DownStair)
des.bits.dig = tile_dig_designation::UpDownStair;
else
des.bits.dig = tile_dig_designation::UpStair;
}
}
if(des.bits.dig == tile_dig_designation::No)
des.bits.dig = tile_dig_designation::Default;
MCache->setDesignationAt(current,des);
}
}
MCache->WriteAll();
return CR_OK;
}
示例8: digcircle
//.........这里部分代码省略.........
" ustair = staircase up\n"
" dstair = staircase down\n"
" xstair = staircase up/down\n"
" chan = dig channel\n"
"\n"
" # = diameter in tiles (default = 0)\n"
"\n"
"After you have set the options, the command called with no options\n"
"repeats with the last selected parameters:\n"
"'digcircle filled 3' = Dig a filled circle with radius = 3.\n"
"'digcircle' = Do it again.\n"
);
return CR_OK;
}
int32_t cx, cy, cz;
CoreSuspender suspend(c);
if (!Maps::IsValid())
{
c->con.printerr("Map is not available!\n");
return CR_FAILURE;
}
uint32_t x_max, y_max, z_max;
Maps::getSize(x_max,y_max,z_max);
MapExtras::MapCache MCache;
if(!Gui::getCursorCoords(cx,cy,cz) || cx == -30000)
{
c->con.printerr("Can't get the cursor coords...\n");
return CR_FAILURE;
}
int r = diameter / 2;
int iter;
bool adjust;
if(diameter % 2)
{
// paint center
if(filled)
{
lineY(MCache,what,type, cx - r, cx + r, cy, cz,x_max,y_max);
}
else
{
dig(MCache, what, type,cx - r, cy, cz,x_max,y_max);
dig(MCache, what, type,cx + r, cy, cz,x_max,y_max);
}
adjust = false;
iter = 2;
}
else
{
adjust = true;
iter = 1;
}
int lastwhole = r;
for(; iter <= diameter - 1; iter +=2)
{
// top, bottom coords
int top = cy - ((iter + 1) / 2) + adjust;
int bottom = cy + ((iter + 1) / 2);
// see where the current 'line' intersects the circle
double val = std::sqrt(double(diameter*diameter - iter*iter));
// adjust for circles with odd diameter
if(!adjust)
val -= 1;
// map the found value to the DF grid
double whole;
double fraction = std::modf(val / 2.0, & whole);
if (fraction > 0.5)
whole += 1.0;
int right = cx + whole;
int left = cx - whole + adjust;
int diff = lastwhole - whole;
// paint
if(filled || iter == diameter - 1)
{
lineY(MCache,what,type, left, right, top , cz,x_max,y_max);
lineY(MCache,what,type, left, right, bottom , cz,x_max,y_max);
}
else
{
dig(MCache, what, type,left, top, cz,x_max,y_max);
dig(MCache, what, type,left, bottom, cz,x_max,y_max);
dig(MCache, what, type,right, top, cz,x_max,y_max);
dig(MCache, what, type,right, bottom, cz,x_max,y_max);
}
if(!filled && diff > 1)
{
int lright = cx + lastwhole;
int lleft = cx - lastwhole + adjust;
lineY(MCache,what,type, lleft + 1, left - 1, top + 1 , cz,x_max,y_max);
lineY(MCache,what,type, right + 1, lright - 1, top + 1 , cz,x_max,y_max);
lineY(MCache,what,type, lleft + 1, left - 1, bottom - 1 , cz,x_max,y_max);
lineY(MCache,what,type, right + 1, lright - 1, bottom - 1 , cz,x_max,y_max);
}
lastwhole = whole;
}
MCache.WriteAll();
return CR_OK;
}
示例9: setAllMatching
//Helper function for writing new functions that check every tile on the map.
//newTraffic is the traffic designation to set.
//check takes a coordinate and the map cache as arguments, and returns true if the criteria is met.
//minCoord and maxCoord can be used to specify a bounding cube.
DFhackCExport command_result setAllMatching(DFHack::Core * c, checkTile checkProc,
DFHack::DFCoord minCoord, DFHack::DFCoord maxCoord)
{
//Initialization.
c->Suspend();
DFHack::Maps * Maps = c->getMaps();
DFHack::Gui * Gui = c->getGui();
// init the map
if(!Maps->Start())
{
c->con.printerr("Can't init map. Make sure you have a map loaded in DF.\n");
c->Resume();
return CR_FAILURE;
}
//Maximum map size.
uint32_t x_max,y_max,z_max;
Maps->getSize(x_max,y_max,z_max);
uint32_t tx_max = x_max * 16;
uint32_t ty_max = y_max * 16;
//Ensure maximum coordinate is within map. Truncate to map edge.
maxCoord.x = std::min((uint32_t) maxCoord.x, tx_max);
maxCoord.y = std::min((uint32_t) maxCoord.y, ty_max);
maxCoord.z = std::min(maxCoord.z, z_max);
//Check minimum co-ordinates against maximum map size
if (minCoord.x > maxCoord.x)
{
c->con.printerr("Minimum x coordinate is greater than maximum x coordinate.\n");
c->Resume();
return CR_FAILURE;
}
if (minCoord.y > maxCoord.y)
{
c->con.printerr("Minimum y coordinate is greater than maximum y coordinate.\n");
c->Resume();
return CR_FAILURE;
}
if (minCoord.z > maxCoord.y)
{
c->con.printerr("Minimum z coordinate is greater than maximum z coordinate.\n");
c->Resume();
return CR_FAILURE;
}
MapExtras::MapCache * MCache = new MapExtras::MapCache(Maps);
c->con.print("Setting traffic...\n");
//Loop through every single tile
for(uint32_t x = minCoord.x; x <= maxCoord.x; x++)
{
for(uint32_t y = minCoord.y; y <= maxCoord.y; y++)
{
for(uint32_t z = minCoord.z; z <= maxCoord.z; z++)
{
DFHack::DFCoord tile = DFHack::DFCoord(x, y, z);
checkProc(tile, MCache);
}
}
}
MCache->WriteAll();
c->con.print("Complete!\n");
c->Resume();
return CR_OK;
}
示例10: writeFlag
command_result writeFlag (Core * c, vector <string> & parameters)
{
if (parameters.size() == 0)
{
c->con.print("No value specified\n");
return CR_FAILURE;
}
if (parameters[0] == "help" || parameters[0] == "?")
{
c->con.print("Set the building occupancy flag.\n"
"Value must be between 0 and 7, inclusive.\n");
return CR_OK;
}
char value;
switch (parameters[0][0])
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
value = parameters[0][0] - '0';
break;
default:
c->con.print("Invalid value specified\n");
return CR_FAILURE;
break; //Redundant.
}
c->Suspend();
// init the map
if(!Maps::IsValid())
{
c->con.printerr("Can't init map. Make sure you have a map loaded in DF.\n");
c->Resume();
return CR_FAILURE;
}
int32_t cx, cy, cz;
if(!Gui::getCursorCoords(cx,cy,cz))
{
c->con.printerr("Cursor is not active.\n");
c->Resume();
return CR_FAILURE;
}
DFCoord cursor = DFCoord(cx,cy,cz);
MapExtras::MapCache * MCache = new MapExtras::MapCache();
t_occupancy oc = MCache->occupancyAt(cursor);
oc.bits.building = value;
MCache->setOccupancyAt(cursor, oc);
MCache->WriteAll();
c->Resume();
return CR_OK;
}
示例11: filltraffic
//.........这里部分代码省略.........
MapExtras::MapCache MCache;
df::tile_designation des = MCache.designationAt(xy);
df::tiletype tt = MCache.tiletypeAt(xy);
df::tile_occupancy oc;
if (checkbuilding)
oc = MCache.occupancyAt(xy);
source = (df::tile_traffic)des.bits.traffic;
if(source == target)
{
out.printerr("This tile is already set to the target traffic type.\n");
return CR_FAILURE;
}
if(isWallTerrain(tt))
{
out.printerr("This tile is a wall. Please select a passable tile.\n");
return CR_FAILURE;
}
if(checkpit && isOpenTerrain(tt))
{
out.printerr("This tile is a hole. Please select a passable tile.\n");
return CR_FAILURE;
}
if(checkbuilding && oc.bits.building)
{
out.printerr("This tile contains a building. Please select an empty tile.\n");
return CR_FAILURE;
}
out.print("%d/%d/%d ... FILLING!\n", cx,cy,cz);
//Naive four-way or six-way flood fill with possible tiles on a stack.
stack <DFCoord> flood;
flood.push(xy);
while(!flood.empty())
{
xy = flood.top();
flood.pop();
des = MCache.designationAt(xy);
if (des.bits.traffic != source) continue;
tt = MCache.tiletypeAt(xy);
if(isWallTerrain(tt)) continue;
if(checkpit && isOpenTerrain(tt)) continue;
if (checkbuilding)
{
oc = MCache.occupancyAt(xy);
if(oc.bits.building) continue;
}
//This tile is ready. Set its traffic level and add surrounding tiles.
if (MCache.testCoord(xy))
{
des.bits.traffic = target;
MCache.setDesignationAt(xy,des);
if (xy.x > 0)
{
flood.push(DFCoord(xy.x - 1, xy.y, xy.z));
}
if (xy.x < int32_t(tx_max) - 1)
{
flood.push(DFCoord(xy.x + 1, xy.y, xy.z));
}
if (xy.y > 0)
{
flood.push(DFCoord(xy.x, xy.y - 1, xy.z));
}
if (xy.y < int32_t(ty_max) - 1)
{
flood.push(DFCoord(xy.x, xy.y + 1, xy.z));
}
if (updown)
{
if (xy.z > 0 && LowPassable(tt))
{
flood.push(DFCoord(xy.x, xy.y, xy.z - 1));
}
if (xy.z < int32_t(z_max) && HighPassable(tt))
{
flood.push(DFCoord(xy.x, xy.y, xy.z + 1));
}
}
}
}
MCache.WriteAll();
return CR_OK;
}
示例12: setAllMatching
//Helper function for writing new functions that check every tile on the map.
//newTraffic is the traffic designation to set.
//check takes a coordinate and the map cache as arguments, and returns true if the criteria is met.
//minCoord and maxCoord can be used to specify a bounding cube.
command_result setAllMatching(color_ostream &out, checkTile checkProc,
DFCoord minCoord, DFCoord maxCoord)
{
//Initialization.
CoreSuspender suspend;
if (!Maps::IsValid())
{
out.printerr("Map is not available!\n");
return CR_FAILURE;
}
//Maximum map size.
uint32_t x_max,y_max,z_max;
Maps::getSize(x_max,y_max,z_max);
uint32_t tx_max = x_max * 16;
uint32_t ty_max = y_max * 16;
//Ensure maximum coordinate is within map. Truncate to map edge.
maxCoord.x = std::min((uint32_t) maxCoord.x, tx_max);
maxCoord.y = std::min((uint32_t) maxCoord.y, ty_max);
maxCoord.z = std::min((uint32_t) maxCoord.z, z_max);
//Check minimum co-ordinates against maximum map size
if (minCoord.x > maxCoord.x)
{
out.printerr("Minimum x coordinate is greater than maximum x coordinate.\n");
return CR_FAILURE;
}
if (minCoord.y > maxCoord.y)
{
out.printerr("Minimum y coordinate is greater than maximum y coordinate.\n");
return CR_FAILURE;
}
if (minCoord.z > maxCoord.y)
{
out.printerr("Minimum z coordinate is greater than maximum z coordinate.\n");
return CR_FAILURE;
}
MapExtras::MapCache MCache;
out.print("Setting traffic...\n");
//Loop through every single tile
for(int32_t x = minCoord.x; x <= maxCoord.x; x++)
{
for(int32_t y = minCoord.y; y <= maxCoord.y; y++)
{
for(int32_t z = minCoord.z; z <= maxCoord.z; z++)
{
DFCoord tile = DFCoord(x, y, z);
checkProc(tile, MCache);
}
}
}
MCache.WriteAll();
out.print("Complete!\n");
return CR_OK;
}