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 ;
0 commit comments