|
|
|
@ -218,93 +218,109 @@ static command_result GetEmbarkInfo(color_ostream &stream, const MapRequest *in,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int coord_to_index_48(int x, int y) {
|
|
|
|
|
return y*48+x;
|
|
|
|
|
return y*48+x;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool gather_embark_tile(int EmbX, int EmbY, EmbarkTile * tile, MapExtras::MapCache * MP) {
|
|
|
|
|
tile->set_is_valid(false);
|
|
|
|
|
tile->set_world_x(df::global::world->map.region_x + (EmbX/3)); //fixme: verify.
|
|
|
|
|
tile->set_world_y(df::global::world->map.region_y + (EmbY/3)); //fixme: verify.
|
|
|
|
|
tile->set_world_z(df::global::world->map.region_z); //fixme: verify.
|
|
|
|
|
tile->set_world_x(df::global::world->map.region_x + (EmbX/3));
|
|
|
|
|
tile->set_world_y(df::global::world->map.region_y + (EmbY/3));
|
|
|
|
|
tile->set_world_z(df::global::world->map.region_z + 1); //adding one because floors get shifted one downwards.
|
|
|
|
|
tile->set_current_year(*df::global::cur_year);
|
|
|
|
|
tile->set_current_season(*df::global::cur_season);
|
|
|
|
|
int num_valid_layers = 0;
|
|
|
|
|
for(int z = 0; z < MP->maxZ(); z++)
|
|
|
|
|
{
|
|
|
|
|
EmbarkTileLayer * tile_layer = tile->add_tile_layer();
|
|
|
|
|
num_valid_layers += gather_embark_tile_layer(EmbX, EmbY, z, tile_layer, MP);
|
|
|
|
|
}
|
|
|
|
|
for(int z = 0; z < MP->maxZ(); z++)
|
|
|
|
|
{
|
|
|
|
|
EmbarkTileLayer * tile_layer = tile->add_tile_layer();
|
|
|
|
|
num_valid_layers += gather_embark_tile_layer(EmbX, EmbY, z, tile_layer, MP);
|
|
|
|
|
}
|
|
|
|
|
if(num_valid_layers > 0)
|
|
|
|
|
tile->set_is_valid(true);
|
|
|
|
|
return 1;
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool gather_embark_tile_layer(int EmbX, int EmbY, int EmbZ, EmbarkTileLayer * tile, MapExtras::MapCache * MP)
|
|
|
|
|
{
|
|
|
|
|
for(int i = tile->mat_type_table_size(); i < 2304; i++) { //This is needed so we have a full array to work with, otherwise the size isn't updated correctly.
|
|
|
|
|
tile->add_mat_type_table(AIR);
|
|
|
|
|
tile->add_mat_subtype_table(0);
|
|
|
|
|
}
|
|
|
|
|
for(int i = tile->mat_type_table_size(); i < 2304; i++) { //This is needed so we have a full array to work with, otherwise the size isn't updated correctly.
|
|
|
|
|
tile->add_mat_type_table(AIR);
|
|
|
|
|
tile->add_mat_subtype_table(0);
|
|
|
|
|
}
|
|
|
|
|
int num_valid_blocks = 0;
|
|
|
|
|
for(int yy = 0; yy < 3; yy++) {
|
|
|
|
|
for(int xx = 0; xx < 3; xx++) {
|
|
|
|
|
DFCoord current_coord;
|
|
|
|
|
current_coord.x = EmbX+xx;
|
|
|
|
|
current_coord.y = EmbY+yy;
|
|
|
|
|
current_coord.z = EmbZ;
|
|
|
|
|
MapExtras::Block * b = MP->BlockAt(current_coord);
|
|
|
|
|
if(b && b->getRaw()) {
|
|
|
|
|
for(int block_y=0; block_y<16; block_y++) {
|
|
|
|
|
for(int block_x=0; block_x<16; block_x++) {
|
|
|
|
|
df::coord2d block_coord;
|
|
|
|
|
block_coord.x = block_x;
|
|
|
|
|
block_coord.y = block_y;
|
|
|
|
|
DFHack::t_matpair actual_mat = b->staticMaterialAt(block_coord);
|
|
|
|
|
df::tiletype tile_type = b->tiletypeAt(block_coord);
|
|
|
|
|
df::tile_designation designation = b->DesignationAt(block_coord);
|
|
|
|
|
unsigned int array_index = coord_to_index_48(xx*16+block_x, yy*16+block_y);
|
|
|
|
|
//make a new fake material at the given index
|
|
|
|
|
if(tileMaterial(tile_type) == tiletype_material::FROZEN_LIQUID) { //Ice.
|
|
|
|
|
tile->set_mat_type_table(array_index, BasicMaterial::LIQUID); //Ice is totally a liquid, shut up.
|
|
|
|
|
tile->set_mat_subtype_table(array_index, LiquidType::ICE);
|
|
|
|
|
num_valid_blocks++;
|
|
|
|
|
}
|
|
|
|
|
else if(designation.bits.flow_size) { //Contains either water or lava.
|
|
|
|
|
tile->set_mat_type_table(array_index, BasicMaterial::LIQUID);
|
|
|
|
|
if(designation.bits.liquid_type) //Magma
|
|
|
|
|
tile->set_mat_subtype_table(array_index, LiquidType::MAGMA);
|
|
|
|
|
else //water
|
|
|
|
|
tile->set_mat_subtype_table(array_index, LiquidType::WATER);
|
|
|
|
|
for(int yy = 0; yy < 3; yy++) {
|
|
|
|
|
for(int xx = 0; xx < 3; xx++) {
|
|
|
|
|
DFCoord current_coord, upper_coord;
|
|
|
|
|
current_coord.x = EmbX+xx;
|
|
|
|
|
current_coord.y = EmbY+yy;
|
|
|
|
|
current_coord.z = EmbZ;
|
|
|
|
|
upper_coord = current_coord;
|
|
|
|
|
upper_coord.z += 1;
|
|
|
|
|
MapExtras::Block * b = MP->BlockAt(current_coord);
|
|
|
|
|
MapExtras::Block * b_upper = MP->BlockAt(upper_coord);
|
|
|
|
|
if(b && b->getRaw()) {
|
|
|
|
|
for(int block_y=0; block_y<16; block_y++) {
|
|
|
|
|
for(int block_x=0; block_x<16; block_x++) {
|
|
|
|
|
df::coord2d block_coord;
|
|
|
|
|
block_coord.x = block_x;
|
|
|
|
|
block_coord.y = block_y;
|
|
|
|
|
df::tiletype tile_type = b->tiletypeAt(block_coord);
|
|
|
|
|
df::tiletype upper_tile = df::tiletype::Void;
|
|
|
|
|
if(b_upper && b_upper->getRaw()) {
|
|
|
|
|
upper_tile = b_upper->tiletypeAt(block_coord);
|
|
|
|
|
}
|
|
|
|
|
df::tile_designation designation = b->DesignationAt(block_coord);
|
|
|
|
|
DFHack::t_matpair actual_mat;
|
|
|
|
|
if(tileShapeBasic(tileShape(upper_tile)) == tiletype_shape_basic::Floor) { //if the upper tile is a floor, use that material instead.
|
|
|
|
|
actual_mat = b_upper->staticMaterialAt(block_coord);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
actual_mat = b->staticMaterialAt(block_coord);
|
|
|
|
|
}
|
|
|
|
|
unsigned int array_index = coord_to_index_48(xx*16+block_x, yy*16+block_y);
|
|
|
|
|
//make a new fake material at the given index
|
|
|
|
|
if(tileMaterial(tile_type) == tiletype_material::FROZEN_LIQUID && (tileShapeBasic(tileShape(upper_tile)) != tiletype_shape_basic::Floor)) { //Ice.
|
|
|
|
|
tile->set_mat_type_table(array_index, BasicMaterial::LIQUID); //Ice is totally a liquid, shut up.
|
|
|
|
|
tile->set_mat_subtype_table(array_index, LiquidType::ICE);
|
|
|
|
|
num_valid_blocks++;
|
|
|
|
|
}
|
|
|
|
|
else if(tileShapeBasic(tileShape(tile_type)) != tiletype_shape_basic::Open) {
|
|
|
|
|
if(actual_mat.mat_type == builtin_mats::INORGANIC) { //inorganic
|
|
|
|
|
tile->set_mat_type_table(array_index, BasicMaterial::INORGANIC);
|
|
|
|
|
tile->set_mat_subtype_table(array_index, actual_mat.mat_index);
|
|
|
|
|
}
|
|
|
|
|
else if(actual_mat.mat_type == 419) { //Growing plants
|
|
|
|
|
tile->set_mat_type_table(array_index, BasicMaterial::PLANT);
|
|
|
|
|
tile->set_mat_subtype_table(array_index, actual_mat.mat_index);
|
|
|
|
|
}
|
|
|
|
|
else if(actual_mat.mat_type >= 420) { //Wooden constructions. Different from growing plants.
|
|
|
|
|
tile->set_mat_type_table(array_index, BasicMaterial::WOOD);
|
|
|
|
|
tile->set_mat_subtype_table(array_index, actual_mat.mat_index);
|
|
|
|
|
}
|
|
|
|
|
else { //Unknown and unsupported stuff. Will just be drawn as grey.
|
|
|
|
|
tile->set_mat_type_table(array_index, BasicMaterial::OTHER);
|
|
|
|
|
tile->set_mat_subtype_table(array_index, actual_mat.mat_type);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if(designation.bits.flow_size && (tileShapeBasic(tileShape(upper_tile)) != tiletype_shape_basic::Floor)) { //Contains either water or lava.
|
|
|
|
|
tile->set_mat_type_table(array_index, BasicMaterial::LIQUID);
|
|
|
|
|
if(designation.bits.liquid_type) //Magma
|
|
|
|
|
tile->set_mat_subtype_table(array_index, LiquidType::MAGMA);
|
|
|
|
|
else //water
|
|
|
|
|
tile->set_mat_subtype_table(array_index, LiquidType::WATER);
|
|
|
|
|
num_valid_blocks++;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
tile->set_mat_type_table(array_index, BasicMaterial::AIR);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if(((tileShapeBasic(tileShape(tile_type)) != tiletype_shape_basic::Open) ||
|
|
|
|
|
(tileShapeBasic(tileShape(upper_tile)) == tiletype_shape_basic::Floor)) &&
|
|
|
|
|
((tileShapeBasic(tileShape(tile_type)) != tiletype_shape_basic::Floor) ||
|
|
|
|
|
(tileShapeBasic(tileShape(upper_tile)) == tiletype_shape_basic::Floor))) { //if the upper tile is a floor, we don't skip, otherwise we do.
|
|
|
|
|
if(actual_mat.mat_type == builtin_mats::INORGANIC) { //inorganic
|
|
|
|
|
tile->set_mat_type_table(array_index, BasicMaterial::INORGANIC);
|
|
|
|
|
tile->set_mat_subtype_table(array_index, actual_mat.mat_index);
|
|
|
|
|
}
|
|
|
|
|
else if(actual_mat.mat_type == 419) { //Growing plants
|
|
|
|
|
tile->set_mat_type_table(array_index, BasicMaterial::PLANT);
|
|
|
|
|
tile->set_mat_subtype_table(array_index, actual_mat.mat_index);
|
|
|
|
|
}
|
|
|
|
|
else if(actual_mat.mat_type >= 420) { //Wooden constructions. Different from growing plants.
|
|
|
|
|
tile->set_mat_type_table(array_index, BasicMaterial::WOOD);
|
|
|
|
|
tile->set_mat_subtype_table(array_index, actual_mat.mat_index);
|
|
|
|
|
}
|
|
|
|
|
else { //Unknown and unsupported stuff. Will just be drawn as grey.
|
|
|
|
|
tile->set_mat_type_table(array_index, BasicMaterial::OTHER);
|
|
|
|
|
tile->set_mat_subtype_table(array_index, actual_mat.mat_type);
|
|
|
|
|
}
|
|
|
|
|
num_valid_blocks++;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
tile->set_mat_type_table(array_index, BasicMaterial::AIR);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return (num_valid_blocks >0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -337,8 +353,8 @@ static command_result GetRawNames(color_ostream &stream, const MapRequest *in, R
|
|
|
|
|
out->set_available(false);
|
|
|
|
|
return CR_OK;
|
|
|
|
|
}
|
|
|
|
|
out->set_available(true);
|
|
|
|
|
for(int i = 0; i < df::global::world->raws.inorganics.size(); i++){
|
|
|
|
|
out->set_available(true);
|
|
|
|
|
for(int i = 0; i < df::global::world->raws.inorganics.size(); i++){
|
|
|
|
|
out->add_inorganic(df::global::world->raws.inorganics[i]->id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|