From 660ce505427a9bb5fed83a7e4018b9e91a608b5a Mon Sep 17 00:00:00 2001 From: Japa Date: Sat, 6 Apr 2013 02:42:51 +0530 Subject: [PATCH] Floors are loaded one level below solid blocks. --- plugins/isoworld | 2 +- plugins/isoworldremote.cpp | 160 ++++++++++++++++++++----------------- 2 files changed, 89 insertions(+), 73 deletions(-) diff --git a/plugins/isoworld b/plugins/isoworld index 3b06d1cf2..c53ade8b9 160000 --- a/plugins/isoworld +++ b/plugins/isoworld @@ -1 +1 @@ -Subproject commit 3b06d1cf27a9d74010731492186f3d2b2cfbd88f +Subproject commit c53ade8b997afbe33783aaa4aadfd39c9786fc51 diff --git a/plugins/isoworldremote.cpp b/plugins/isoworldremote.cpp index 4ccbf39dd..6c6e8893b 100644 --- a/plugins/isoworldremote.cpp +++ b/plugins/isoworldremote.cpp @@ -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); }