Skip to content

Commit 20ba795

Browse files
committed
Try even harder to renovate buildings into multitile and merge orientation routines
git-svn-id: svn://tron.homeunix.org/simutrans/simutrans/trunk@11700 8aca7d54-2c30-db11-9de9-000461428c89
1 parent 4a64f1f commit 20ba795

File tree

3 files changed

+73
-62
lines changed

3 files changed

+73
-62
lines changed

src/simutrans/builder/hausbauer.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -549,14 +549,13 @@ gebaeude_t* hausbauer_t::build(player_t* player, koord pos, int org_layout, cons
549549
for( uint8 i = 0; i < gr->obj_count(); i++ ) {
550550
obj_t *const obj = gr->obj_bei(i);
551551
obj_t::typ const objtype = obj->get_typ();
552-
if( objtype == obj_t::leitung || objtype == obj_t::pillar ) {
552+
if( objtype == obj_t::leitung || objtype == obj_t::pillar || objtype==obj_t::air_vehicle ) {
553553
keptobjs.append(obj);
554554
}
555555
}
556556
for( size_t i = 0; i < keptobjs.get_count(); i++ ) {
557557
gr->obj_remove(keptobjs[i]);
558558
}
559-
560559
// delete everything except vehicles
561560
gr->obj_loesche_alle(player);
562561
}

src/simutrans/world/simcity.cc

Lines changed: 69 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -9,50 +9,55 @@
99
#include <string.h>
1010
#include <math.h>
1111

12-
#include "../ground/grund.h"
13-
#include "../ground/boden.h"
14-
#include "../gui/simwin.h"
15-
#include "simworld.h"
16-
#include "../simware.h"
17-
#include "../player/simplay.h"
18-
#include "simplan.h"
19-
#include "../display/simimg.h"
20-
#include "../simhalt.h"
21-
#include "../simfab.h"
2212
#include "simcity.h"
23-
#include "../simmesg.h"
24-
#include "../simcolor.h"
13+
#include "simplan.h"
14+
#include "simworld.h"
2515

26-
#include "../gui/minimap.h"
27-
#include "../gui/city_info.h"
16+
#include "../builder/brueckenbauer.h"
17+
#include "../builder/fabrikbauer.h"
18+
#include "../builder/hausbauer.h"
19+
#include "../builder/wegbauer.h"
20+
21+
#include "../dataobj/environment.h"
22+
#include "../dataobj/loadsave.h"
23+
#include "../dataobj/settings.h"
24+
#include "../dataobj/tabfile.h"
25+
#include "../dataobj/translator.h"
2826

2927
#include "../descriptor/building_desc.h"
3028

31-
#include "../simintr.h"
32-
#include "../simdebug.h"
29+
#include "../display/simimg.h"
30+
31+
#include "../ground/boden.h"
32+
#include "../ground/fundament.h"
33+
#include "../ground/grund.h"
34+
35+
#include "../gui/city_info.h"
36+
#include "../gui/minimap.h"
37+
#include "../gui/simwin.h"
3338

3439
#include "../obj/gebaeude.h"
3540
#include "../obj/way/strasse.h"
3641

37-
#include "../vehicle/pedestrian.h"
38-
#include "../vehicle/simroadtraffic.h"
39-
40-
#include "../dataobj/translator.h"
41-
#include "../dataobj/settings.h"
42-
#include "../dataobj/loadsave.h"
43-
#include "../dataobj/tabfile.h"
44-
#include "../dataobj/environment.h"
42+
#include "../player/simplay.h"
4543

46-
#include "building_placefinder.h"
47-
#include "../builder/wegbauer.h"
48-
#include "../builder/brueckenbauer.h"
49-
#include "../builder/hausbauer.h"
50-
#include "../builder/fabrikbauer.h"
44+
#include "../simcolor.h"
45+
#include "../simdebug.h"
46+
#include "../simfab.h"
47+
#include "../simhalt.h"
48+
#include "../simintr.h"
49+
#include "../simmesg.h"
50+
#include "../simware.h"
5151

5252
#include "../utils/cbuffer.h"
5353
#include "../utils/simrandom.h"
5454
#include "../utils/simstring.h"
5555

56+
#include "../vehicle/pedestrian.h"
57+
#include "../vehicle/simroadtraffic.h"
58+
59+
#include "building_placefinder.h"
60+
5661

5762
#define PACKET_SIZE (7)
5863

@@ -2873,9 +2878,9 @@ int stadt_t::orient_city_building(const koord k, const building_desc_t *h, koord
28732878
int streetdir = 0;
28742879
for( int i = 0; i < 4; i++ ) {
28752880
// Neighbors goes through these in 'preferred' order, orthogonal first
2876-
koord offset = (i < 2) ? neighbors[i] + h->get_size(i) - koord(1, 1) : neighbors[i];
2877-
gr = welt->lookup_kartenboden(k + offset);
2878-
if( gr && gr->hat_weg(road_wt) ){
2881+
koord offset = ((neighbors[i] + koord(1, 1)) / 2) * (h->get_x(0)-1); // symmetric building
2882+
gr = welt->lookup_kartenboden(k + offset + neighbors[i]);
2883+
if( gr && gr->get_weg_hang() == gr->get_grund_hang() && gr->hat_weg(road_wt) ){
28792884
streetdir += (1 << i);
28802885
}
28812886
}
@@ -3339,6 +3344,7 @@ void stadt_t::renovate_city_building(gebaeude_t *gb)
33393344
return;
33403345
}
33413346

3347+
const koord3d base_pos = gb->get_pos();
33423348
const koord k = gb->get_pos().get_2d();
33433349
const koord gb_size = gb_desc->get_size(gb->get_tile()->get_layout());
33443350

@@ -3361,7 +3367,6 @@ void stadt_t::renovate_city_building(gebaeude_t *gb)
33613367
// Run through orthogonal neighbors (only), and oneself looking for which cluster to build
33623368
// This is a bitmap -- up to 32 clustering types are allowed.
33633369
uint32 neighbor_building_clusters = gb_desc->get_clusters();
3364-
sint8 zpos = gb->get_pos().z;
33653370
// since we handle buildings larger than (1x1) we test all periphery
33663371
minivec_tpl<koord> testkoord(18);
33673372
for (sint16 x = k.x-1; x <=k.x+ gb_size.x; x++) {
@@ -3402,21 +3407,19 @@ void stadt_t::renovate_city_building(gebaeude_t *gb)
34023407
// since only citybuilds are unowned and we cannot renovated an owned building, test is fast
34033408
if(player_t::check_owner(testgb->get_owner(), NULL)) {
34043409
const building_desc_t* neighbor_building = testgb->get_tile()->get_desc();
3405-
if( testgb->get_pos().z == zpos && neighbor_building->get_x()*neighbor_building->get_y() == 1 ) {
3410+
if( testgb->get_pos().z == base_pos.z && neighbor_building->get_x()*neighbor_building->get_y() == 1 ) {
34063411
// also in right height and citybuilding
34073412
maxsize = area3x3[ area_level ] + koord( 1, 1 );
34083413
continue;
34093414
}
34103415
}
34113416
}
3412-
#if 0
3413-
/* since we only replace tiles, natur is not allowed for the moment, but could be easily changed */
3414-
else if( gr->ist_natur() && gr->get_pos().z+slope_t::max_diff(gr->get_grund_hang())==zpos ) {
3417+
else if( gr->ist_natur() && gr->get_pos().z+slope_t::max_diff(gr->get_grund_hang())==base_pos.z ) {
3418+
assert(gr->get_leitung() == NULL);
34153419
// we can of course also build on nature
34163420
maxsize = area3x3[area_level]+koord(1,1);
34173421
continue;
34183422
}
3419-
#endif
34203423
}
34213424
// we only reach here upon unsuitable ground
34223425
break;
@@ -3480,10 +3483,8 @@ void stadt_t::renovate_city_building(gebaeude_t *gb)
34803483

34813484
// good enough replacement to renovate?
34823485
if( sum > 0 ) {
3483-
// DBG_MESSAGE("stadt_t::renovate_city_building()", "renovation at %i,%i (%i level) of typ %i to typ %i with desire %i", k.x, k.y, alt_typ, want_to_have, sum);
3484-
3485-
//int rotation = orient_city_building(k, h, maxsize);
3486-
3486+
int rotation = orient_city_building(k, h, maxsize);
3487+
#if 0
34873488
// no renovation for now, if new is smaller
34883489
int rotation = 0;
34893490
if( h->get_all_layouts()>1 ) {
@@ -3561,20 +3562,18 @@ void stadt_t::renovate_city_building(gebaeude_t *gb)
35613562
}
35623563
}
35633564
}
3565+
#endif
35643566

3565-
// we only renovate, if there is not an identical building (unless its a cluster)
3567+
// we only renovate, if there is not an identical building around (unless its a cluster)
35663568
if( !h->get_clusters() ) {
35673569
for( int i = 0; i < 8; i++ ) {
3568-
koord p = k;
3569-
p.x += neighbors[i].x > 0 ? h->get_x( rotation ) : neighbors[i].x;
3570-
p.y += neighbors[i].y > 0 ? h->get_y( rotation ) : neighbors[i].y;
3571-
grund_t *gr = welt->lookup_kartenboden(p);
3572-
if( gr && gr->get_typ() == grund_t::fundament ) {
3573-
if( gebaeude_t *gb = gr->find<gebaeude_t>() ) {
3574-
if( gb->get_tile()->get_desc() == h ) {
3575-
// same building => do not renovate
3576-
return;
3577-
}
3570+
koord offset = koord(((neighbors[i].x + 1) / 2) * h->get_x(rotation), ((neighbors[i].y + 1) / 2) * h->get_y(rotation)) - koord(1,1);
3571+
grund_t *gr = welt->lookup_kartenboden(k+offset);
3572+
assert(gr);
3573+
if( gebaeude_t *gb = gr->find<gebaeude_t>() ) {
3574+
if( gb->get_tile()->get_desc() == h ) {
3575+
// same building => do not renovate
3576+
return;
35783577
}
35793578
}
35803579
}
@@ -3585,18 +3584,29 @@ void stadt_t::renovate_city_building(gebaeude_t *gb)
35853584
for( int y=0; y<h->get_y(rotation); y++ ) {
35863585
koord kpos = k+koord(x,y);
35873586
grund_t *gr = welt->lookup_kartenboden(kpos);
3588-
gebaeude_t *oldgb = gr->find<gebaeude_t>();
3589-
switch(oldgb->get_tile()->get_desc()->get_type()) {
3587+
if (gebaeude_t* oldgb = gr->find<gebaeude_t>()) {
3588+
switch (oldgb->get_tile()->get_desc()->get_type()) {
35903589
case building_desc_t::city_res: won -= level * 10; break;
35913590
case building_desc_t::city_com: arb -= level * 20; break;
35923591
case building_desc_t::city_ind: arb -= level * 20; break;
35933592
default: break;
3593+
}
3594+
// exchange building; try to face it to street in front
3595+
oldgb->mark_images_dirty();
3596+
oldgb->set_tile(h->get_tile(rotation, x, y), true);
3597+
update_gebaeude_from_stadt(oldgb);
3598+
}
3599+
else {
3600+
// nature here
3601+
koord3d new_pos = base_pos + koord(x, y);
3602+
gebaeude_t* gb = new gebaeude_t(new_pos, NULL, h->get_tile(rotation, x, y));
3603+
gr->obj_loesche_alle(welt->get_public_player());
3604+
grund_t* gr2 = new fundament_t(new_pos, slope_t::flat);
3605+
welt->access(kpos)->boden_ersetzen(gr, gr2);
3606+
add_gebaeude_to_stadt(gb);
3607+
gr2->obj_add(gb);
35943608
}
3595-
// exchange building; try to face it to street in front
3596-
oldgb->mark_images_dirty();
3597-
oldgb->set_tile( h->get_tile(rotation, x, y), true );
35983609
welt->lookup_kartenboden(kpos)->calc_image();
3599-
update_gebaeude_from_stadt(oldgb);
36003610
update_city_street(kpos);
36013611
switch(h->get_type()) {
36023612
case building_desc_t::city_res: won += h->get_level() * 10; break;

src/simutrans/world/simplan.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,9 @@ void planquadrat_t::boden_ersetzen(grund_t *alt, grund_t *neu)
228228
}
229229
// transfer all objects
230230
while( alt->obj_count()>0 ) {
231-
neu->obj_add( alt->obj_remove_top() );
231+
obj_t* obj = alt->obj_remove_top();
232+
obj->set_pos(neu->get_pos());
233+
neu->obj_add(obj);
232234
}
233235
// transfer way flags
234236
if(alt->get_flag(grund_t::has_way1)) {

0 commit comments

Comments
 (0)