Skip to content

Commit

Permalink
Merge branch 'extended-terraforming-refactor' of https://github.com/c…
Browse files Browse the repository at this point in the history
  • Loading branch information
jamespetts committed May 5, 2023
2 parents f1c0de6 + 63d8fd2 commit 4e882c0
Show file tree
Hide file tree
Showing 18 changed files with 943 additions and 832 deletions.
1 change: 1 addition & 0 deletions Makefile
Expand Up @@ -617,6 +617,7 @@ SOURCES += vehicle/road_vehicle.cc
SOURCES += vehicle/simroadtraffic.cc
SOURCES += vehicle/vehicle.cc
SOURCES += vehicle/water_vehicle.cc
SOURCES += world/terraformer.cc
SOURCES += simunits.cc
SOURCES += convoy.cc
SOURCES += utils/float32e8_t.cc
Expand Down
2 changes: 1 addition & 1 deletion bauer/hausbauer.cc
Expand Up @@ -534,7 +534,7 @@ void hausbauer_t::remove( player_t *player, const gebaeude_t *gb, bool map_gener
gr->calc_image();
}
}
welt->set_grid_hgt( newk, new_hgt+corner_nw(new_slope) );
welt->set_grid_hgt_nocheck( newk, new_hgt+corner_nw(new_slope) );
}
}
else if (wasser_t* sea = dynamic_cast<wasser_t*>(gr)) {
Expand Down
52 changes: 30 additions & 22 deletions bauer/tunnelbauer.cc
Expand Up @@ -36,6 +36,7 @@
#include "wegbauer.h"
#include "../tpl/stringhashtable_tpl.h"
#include "../tpl/vector_tpl.h"
#include "../world/terraformer.h"


karte_ptr_t tunnel_builder_t::welt;
Expand Down Expand Up @@ -167,16 +168,15 @@ koord3d tunnel_builder_t::find_end_pos(player_t *player, koord3d pos, koord zv,
sint8 hse = pos.z + corner_se(new_slope);
sint8 hne = pos.z + corner_ne(new_slope);
sint8 hnw = pos.z + corner_nw(new_slope);
karte_t::terraformer_t raise(welt);
raise.add_raise_node(pos.x, pos.y, hsw, hse, hne, hnw);
raise.iterate(true);
if (raise.can_raise_all(player, player->is_public_service())) {
// returned true therefore error reported
return koord3d::invalid;
}

terraformer_t raise(terraformer_t::raise, welt);
raise.add_node(pos.x, pos.y, hsw, hse, hne, hnw);
raise.generate_affected_tile_list();

// if we can adjust height here we can build an entrance so don't need checks below
return pos;
}

if( gr->get_hoehe() < pos.z ){
return koord3d::invalid;
}
Expand Down Expand Up @@ -226,15 +226,21 @@ koord3d tunnel_builder_t::find_end_pos(player_t *player, koord3d pos, koord zv,
sint8 hse = pos.z + corner_se(new_slope);
sint8 hne = pos.z + corner_ne(new_slope);
sint8 hnw = pos.z + corner_nw(new_slope);
karte_t::terraformer_t raise(welt), lower(welt);
raise.add_raise_node(pos.x, pos.y, hsw, hse, hne, hnw);
raise.iterate(false);
lower.add_lower_node(pos.x, pos.y, hsw, hse, hne, hnw);
lower.iterate(false);
if (!player || (raise.can_lower_all(player, player->is_public_service()) || lower.can_lower_all(player, player->is_public_service()))) {
// returned true therefore error reported

terraformer_t raise(terraformer_t::raise, welt);
terraformer_t lower(terraformer_t::lower, welt);

raise.add_node(pos.x, pos.y, hsw, hse, hne, hnw);
lower.add_node(pos.x, pos.y, hsw, hse, hne, hnw);

raise.generate_affected_tile_list();
lower.generate_affected_tile_list();

if (!player || raise.can_raise_all(player, player->is_public_service())!= NULL || lower.can_lower_all(player, player->is_public_service())!=NULL) {
// returned non-null therefore error reported
return koord3d::invalid;
}

// if we can adjust height here we can build an entrance so don't need checks below
return pos;
}
Expand Down Expand Up @@ -397,18 +403,20 @@ const char *tunnel_builder_t::build( player_t *player, koord pos, const tunnel_d

int n = 0;

karte_t::terraformer_t raise(welt),lower(welt);
raise.add_raise_node(end.x, end.y, hsw, hse, hne, hnw);
lower.add_lower_node(end.x, end.y, hsw, hse, hne, hnw);
raise.iterate(true);
lower.iterate(false);
err = raise.can_raise_all(player, player ? player->is_public_service() : false);
if (!err) err = lower.can_lower_all(player, player->is_public_service());
terraformer_t raise(terraformer_t::raise, welt);
terraformer_t lower(terraformer_t::lower, welt);

raise.add_node(end.x, end.y, hsw, hse, hne, hnw);
lower.add_node(end.x, end.y, hsw, hse, hne, hnw);

raise.generate_affected_tile_list();
lower.generate_affected_tile_list();

if (err) return 0;

// TODO: this is rather hackish as 4 seems to come from nowhere but works most of the time
// feel free to change if you have a better idea!
n = (raise.raise_all()+lower.lower_all())/4;
n = (raise.apply() + lower.apply()) / 4;
player_t::book_construction_costs(player, welt->get_settings().cst_alter_land * n, end.get_2d(), desc->get_waytype());
}

Expand Down
4 changes: 3 additions & 1 deletion bauer/vehikelbauer.cc
Expand Up @@ -215,7 +215,9 @@ static int compare_freight(const vehicle_desc_t* a, const vehicle_desc_t* b)
}
static int compare_capacity(const vehicle_desc_t* a, const vehicle_desc_t* b) { return a->get_capacity() - b->get_capacity(); }
static int compare_engine(const vehicle_desc_t* a, const vehicle_desc_t* b) {
return (a->get_capacity() + a->get_power() == 0 ? (uint8)vehicle_desc_t::steam : a->get_engine_type()) - (b->get_capacity() + b->get_power() == 0 ? (uint8)vehicle_desc_t::steam : b->get_engine_type());
const vehicle_desc_t::engine_t a_engine = (a->get_capacity() + a->get_power() == 0) ? vehicle_desc_t::steam : a->get_engine_type();
const vehicle_desc_t::engine_t b_engine = (b->get_capacity() + b->get_power() == 0) ? vehicle_desc_t::steam : b->get_engine_type();
return (int)a_engine - (int)b_engine;
}
static int compare_price(const vehicle_desc_t* a, const vehicle_desc_t* b) { return a->get_base_price() - b->get_base_price(); }
static int compare_topspeed(const vehicle_desc_t* a, const vehicle_desc_t* b) { return a->get_topspeed() - b->get_topspeed(); }
Expand Down
10 changes: 5 additions & 5 deletions boden/grund.cc
Expand Up @@ -282,7 +282,7 @@ void grund_t::rdwr(loadsave_t *file)
else {
z_southeast += corner_se(slope);
}
welt->set_grid_hgt( k + koord(1,1), z_southeast );
welt->set_grid_hgt_nocheck( k + koord(1,1), z_southeast );
}
if( pos.x == welt->get_size().x-1 ) {
sint8 z_east = z;
Expand All @@ -292,7 +292,7 @@ void grund_t::rdwr(loadsave_t *file)
else {
z_east += corner_ne(slope);
}
welt->set_grid_hgt( k + koord(1,0), z_east );
welt->set_grid_hgt_nocheck( k + koord(1,0), z_east );
}
if( pos.y == welt->get_size().y-1 ) {
sint8 z_south = z;
Expand All @@ -302,7 +302,7 @@ void grund_t::rdwr(loadsave_t *file)
else {
z_south += corner_sw(slope);
}
welt->set_grid_hgt( k + koord(0,1), z_south );
welt->set_grid_hgt_nocheck( k + koord(0,1), z_south );
}

if( get_typ() == grund_t::wasser && z > z_w ) {
Expand All @@ -311,8 +311,8 @@ void grund_t::rdwr(loadsave_t *file)
else {
z += corner_nw(slope);
}
welt->set_grid_hgt( k, z );
welt->set_water_hgt( k, z_w );
welt->set_grid_hgt_nocheck( k, z );
welt->set_water_hgt_nocheck( k, z_w );
}

// loading ways from here on
Expand Down
1 change: 1 addition & 0 deletions cmake/SimutransSourceList.cmake
Expand Up @@ -369,4 +369,5 @@ target_sources(simutrans-extended PRIVATE
vehicle/rail_vehicle.cc
vehicle/road_vehicle.cc
vehicle/water_vehicle.cc
world/terraformer.cc
)
8 changes: 4 additions & 4 deletions gui/replace_frame.cc
Expand Up @@ -45,10 +45,10 @@ replace_frame_t::replace_frame_t(convoihandle_t cnv) :
gui_frame_t("", NULL),
replace_mode(only_this_convoy), depot(false),
state(state_replace), replaced_so_far(0),
txt_line_replacing(&buf_line_help),
current_convoi(&current_convoi_pics),
scrollx_convoi(&current_convoi, true, false),
convoy_assembler(this)
convoy_assembler(this),
txt_line_replacing(&buf_line_help)
{
this->cnv = cnv;
target_line=linehandle_t();
Expand All @@ -61,10 +61,10 @@ replace_frame_t::replace_frame_t(linehandle_t line) :
gui_frame_t("", NULL),
replace_mode(all_convoys_of_this_line), depot(false),
state(state_replace), replaced_so_far(0),
txt_line_replacing(&buf_line_help),
current_convoi(&current_convoi_pics),
scrollx_convoi(&current_convoi, true, false),
convoy_assembler(this)
convoy_assembler(this),
txt_line_replacing(&buf_line_help)
{
target_line = line;
cnv=convoihandle_t();
Expand Down
2 changes: 1 addition & 1 deletion gui/schedule_list.cc
Expand Up @@ -251,8 +251,8 @@ schedule_list_gui_t::schedule_list_gui_t(player_t *player_) :
player(player_),
lc_preview(0),
cont_by_accommo(linehandle_t()),
cont_line_network(linehandle_t()),
cont_haltlist(linehandle_t()),
cont_line_network(linehandle_t()),
cont_line_capacity_by_catg(linehandle_t(), convoihandle_t()),
scrolly_convois(&cont),
scroll_halt_waiting(&cont_tab_haltlist, true, true),
Expand Down
4 changes: 2 additions & 2 deletions player/ai.cc
Expand Up @@ -491,13 +491,13 @@ bool ai_t::create_simple_road_transport(koord platz1, koord size1, koord platz2,
// ensure is land
grund_t* bd = welt->lookup_kartenboden(platz1);
if (bd->get_typ() == grund_t::wasser) {
welt->set_water_hgt(platz1, bd->get_hoehe()-1);
welt->set_water_hgt_nocheck(platz1, bd->get_hoehe()-1);
welt->access(platz1)->correct_water();
welt->set_climate(platz1, c1, true);
}
bd = welt->lookup_kartenboden(platz2);
if (bd->get_typ() == grund_t::wasser) {
welt->set_water_hgt(platz2, bd->get_hoehe()-1);
welt->set_water_hgt_nocheck(platz2, bd->get_hoehe()-1);
welt->access(platz2)->correct_water();
welt->set_climate(platz2, c2, true);
}
Expand Down
4 changes: 2 additions & 2 deletions player/ai_goods.cc
Expand Up @@ -659,7 +659,7 @@ bool ai_goods_t::create_simple_rail_transport()
// ensure is land
grund_t* bd = welt->lookup_kartenboden(k);
if (bd->get_typ() == grund_t::wasser) {
welt->set_water_hgt(k, bd->get_hoehe()-1);
welt->set_water_hgt_nocheck(k, bd->get_hoehe()-1);
welt->access(k)->correct_water();
welt->set_climate(k, c, true);
}
Expand All @@ -679,7 +679,7 @@ bool ai_goods_t::create_simple_rail_transport()
// ensure is land
grund_t* bd = welt->lookup_kartenboden(k);
if (bd->get_typ() == grund_t::wasser) {
welt->set_water_hgt(k, bd->get_hoehe()-1);
welt->set_water_hgt_nocheck(k, bd->get_hoehe()-1);
welt->access(k)->correct_water();
welt->set_climate(k, c, true);
}
Expand Down
2 changes: 1 addition & 1 deletion player/ai_passenger.cc
Expand Up @@ -493,7 +493,7 @@ halthandle_t ai_passenger_t::build_airport(const stadt_t* city, koord pos, int r
// ensure is land
grund_t* bd = welt->lookup_kartenboden(pos+koord(j,i));
if (bd->get_typ() == grund_t::wasser) {
welt->set_water_hgt(pos+koord(j,i), bd->get_hoehe()-1);
welt->set_water_hgt_nocheck(pos+koord(j,i), bd->get_hoehe()-1);
welt->access(pos+koord(j,i))->correct_water();
welt->set_climate(pos+koord(j,i), c, true);
}
Expand Down
2 changes: 1 addition & 1 deletion simcity.cc
Expand Up @@ -5182,7 +5182,7 @@ bool stadt_t::build_road(const koord k, player_t* player_, bool forced, bool map
// kartenboden may have changed - also ensure is land
bd = welt->lookup_kartenboden(k);
if (bd->get_typ() == grund_t::wasser) {
welt->set_water_hgt(k, bd->get_hoehe()-1);
welt->set_water_hgt_nocheck(k, bd->get_hoehe()-1);
welt->access(k)->correct_water();
welt->set_climate(k, c, true);
bd = welt->lookup_kartenboden(k);
Expand Down
2 changes: 1 addition & 1 deletion simplan.cc
Expand Up @@ -314,7 +314,7 @@ void planquadrat_t::rdwr(loadsave_t *file, koord pos )
else {
// other ground must not reset the height
boden_hinzufuegen(gr);
welt->set_grid_hgt( pos, hgt );
welt->set_grid_hgt_nocheck( pos, hgt );
}
}
} while(gr != NULL);
Expand Down
14 changes: 7 additions & 7 deletions simtool.cc
Expand Up @@ -1674,7 +1674,7 @@ const char *tool_setslope_t::tool_set_slope_work( player_t *player, koord3d pos,
// do not lower tiles when it will be below water level
return NOTICE_TILE_FULL;
}
welt->set_water_hgt( k, water_table );
welt->set_water_hgt_nocheck( k, water_table );
water_hgt = water_table;
}
else if( new_slope == ALL_UP_SLOPE ) {
Expand Down Expand Up @@ -1770,7 +1770,7 @@ const char *tool_setslope_t::tool_set_slope_work( player_t *player, koord3d pos,
gr1->obj_loesche_alle(player);
welt->access(k)->kartenboden_setzen( new boden_t(new_pos,new_slope) );
gr1 = welt->lookup_kartenboden(k);
welt->set_water_hgt(k, welt->get_groundwater()-4);
welt->set_water_hgt_nocheck(k, welt->get_groundwater()-4);
}
else {
gr1->set_grund_hang(new_slope);
Expand Down Expand Up @@ -1832,10 +1832,10 @@ const char *tool_setslope_t::tool_set_slope_work( player_t *player, koord3d pos,
// correct the grid height
if( gr1->is_water() ) {
sint8 grid_hgt = min( water_hgt, welt->lookup_hgt( k ) );
welt->set_grid_hgt(k, grid_hgt );
welt->set_grid_hgt_nocheck(k, grid_hgt );
}
else {
welt->set_grid_hgt(k, gr1->get_hoehe()+ corner_nw(gr1->get_grund_hang()) );
welt->set_grid_hgt_nocheck(k, gr1->get_hoehe()+ corner_nw(gr1->get_grund_hang()) );
}
minimap_t::get_instance()->calc_map_pixel(k);

Expand Down Expand Up @@ -2350,7 +2350,7 @@ const char *tool_set_climate_t::do_work( player_t *player, const koord3d &start,
}
if( ok ) {
gr->obj_loesche_alle( NULL );
welt->set_water_hgt( k, hgt - 1 );
welt->set_water_hgt_nocheck( k, hgt - 1 );
welt->access(k)->correct_water();
}
}
Expand All @@ -2370,7 +2370,7 @@ const char *tool_set_climate_t::do_work( player_t *player, const koord3d &start,
}
if( ok ) {
gr->obj_loesche_alle( NULL );
welt->set_water_hgt( k, gr->get_pos().z );
welt->set_water_hgt_nocheck( k, gr->get_pos().z );
welt->access(k)->correct_water();
welt->set_climate( k, water_climate, true );
minimap_t::get_instance()->calc_map_pixel( k );
Expand Down Expand Up @@ -2596,7 +2596,7 @@ const char *tool_change_water_height_t::work( player_t *, koord3d pos )
const uint8 sneu = (hneu_sw - hneu > 2 ? 2 : hneu_sw - hneu) + ((hneu_se - hneu > 2 ? 2 : hneu_se-hneu) * 3) + ((hneu_ne - hneu > 2 ? 2 : hneu_ne - hneu) * 9) + ((hneu_nw - hneu > 2 ? 2 : hneu_nw - hneu) * 27);
gr2->set_grund_hang( sneu );

welt->set_water_hgt(x, y, new_water_height );
welt->set_water_hgt_nocheck(x, y, new_water_height );
welt->access(x, y)->correct_water();
welt->calc_climate( koord( x, y ), true );
}
Expand Down

0 comments on commit 4e882c0

Please sign in to comment.