1043
if(new_slope == RESTORE_SLOPE) {
1035
if( new_slope == RESTORE_SLOPE ) {
1044
1036
// prissi: special action: set to natural slope
1046
1038
new_slope = welt->recalc_natural_slope(pos.get_2d(),min_hgt);
1047
1039
new_pos = koord3d(pos.get_2d(), min_hgt);
1048
1040
DBG_MESSAGE("natural_slope","%i",new_slope);
1050
else if(new_slope == ALL_DOWN_SLOPE) {
1042
else if( new_slope == ALL_DOWN_SLOPE ) {
1051
1043
new_slope = hang_t::flach;
1052
1044
// is more intuitive: if there is a slope, first downgrade it
1053
if (gr1->get_grund_hang()==0 ) {
1045
if( gr1->get_grund_hang()==0 ) {
1054
1046
new_pos.z -= Z_TILE_STEP;
1057
else if(new_slope == ALL_UP_SLOPE) {
1049
else if( new_slope == ALL_UP_SLOPE ) {
1058
1050
new_slope = hang_t::flach;
1059
1051
new_pos.z += Z_TILE_STEP;
1669
1683
// elevated track?
1670
1684
if(besch->get_styp()==1 && besch->get_wtyp()!=air_wt) {
1671
bautyp = (wegbauer_t::bautyp_t)((int)bautyp|(int)wegbauer_t::elevated_flag);
1685
bautyp |= wegbauer_t::elevated_flag;
1674
1688
bauigel.route_fuer(bautyp, besch);
1675
if(is_ctrl_pressed()) {
1689
if( is_ctrl_pressed() ) {
1690
bauigel.set_keep_existing_ways( false );
1693
bauigel.set_keep_existing_faster_ways( true );
1695
if( umgebung_t::straight_way_without_control || is_ctrl_pressed() ) {
1676
1696
DBG_MESSAGE("wkz_wegebau()", "try straight route");
1677
bauigel.set_keep_existing_ways(false);
1678
1697
bauigel.calc_straight_route(start,end);
1681
bauigel.set_keep_existing_faster_ways(true);
1682
1700
bauigel.calc_route(start,end);
1684
1702
DBG_MESSAGE("wkz_wegebau()", "builder found route with %d sqaures length.", bauigel.get_count());
3310
3329
msg = wkz_station_t::wkz_station_building_aux(welt, sp, true, pos, besch, rotation );
3313
case haus_besch_t::generic_stop:
3332
case haus_besch_t::generic_stop: {
3333
settings_t const& s = welt->get_settings();
3314
3334
switch(besch->get_extra()) {
3316
msg = wkz_station_t::wkz_station_aux(welt, sp, pos, besch, road_wt, welt->get_einstellungen()->cst_multiply_roadstop, "H");
3336
msg = wkz_station_t::wkz_station_aux(welt, sp, pos, besch, road_wt, s.cst_multiply_roadstop, "H");
3319
3339
case monorail_wt:
3320
3340
case maglev_wt:
3321
3341
case narrowgauge_wt:
3323
msg = wkz_station_t::wkz_station_aux(welt, sp, pos, besch, (waytype_t)besch->get_extra(), welt->get_einstellungen()->cst_multiply_station, "BF");
3343
msg = wkz_station_t::wkz_station_aux(welt, sp, pos, besch, (waytype_t)besch->get_extra(), s.cst_multiply_station, "BF");
3326
msg = wkz_station_t::wkz_station_aux(welt, sp, pos, besch, water_wt, welt->get_einstellungen()->cst_multiply_dock, "Dock");
3346
msg = wkz_station_t::wkz_station_aux(welt, sp, pos, besch, water_wt, s.cst_multiply_dock, "Dock");
3329
msg = wkz_station_t::wkz_station_aux(welt, sp, pos, besch, air_wt, welt->get_einstellungen()->cst_multiply_airterminal, "Airport");
3349
msg = wkz_station_t::wkz_station_aux(welt, sp, pos, besch, air_wt, s.cst_multiply_airterminal, "Airport");
3335
3356
dbg->fatal("wkz_station_t::work()","tool called for illegal besch \"%\"", default_param );
3870
3899
if(sp==welt->get_spieler(1)) {
3871
3900
// no depots for player 1
3875
const haus_besch_t *besch = hausbauer_t::find_tile(default_param,0)->get_besch();
3904
haus_besch_t const* const besch = hausbauer_t::find_tile(default_param,0)->get_besch();
3905
settings_t const& s = welt->get_settings();
3876
3906
switch(besch->get_extra()) {
3878
return wkz_depot_t::wkz_depot_aux( welt, sp, k, besch, road_wt, welt->get_einstellungen()->cst_depot_road );
3908
return wkz_depot_t::wkz_depot_aux(welt, sp, k, besch, road_wt, s.cst_depot_road);
3880
return wkz_depot_t::wkz_depot_aux( welt, sp, k, besch, track_wt, welt->get_einstellungen()->cst_depot_rail );
3910
return wkz_depot_t::wkz_depot_aux(welt, sp, k, besch, track_wt, s.cst_depot_rail);
3881
3911
case monorail_wt:
3883
3913
// since it needs also a foundation, this is slightly more complex ...
3884
const char *err = wkz_depot_t::wkz_depot_aux( welt, sp, k, besch, monorail_wt, welt->get_einstellungen()->cst_depot_rail );
3914
char const* const err = wkz_depot_t::wkz_depot_aux(welt, sp, k, besch, monorail_wt, s.cst_depot_rail);
3885
3915
if(err==NULL) {
3886
3916
grund_t *bd = welt->lookup_kartenboden(k.get_2d());
3887
3917
if(hausbauer_t::elevated_foundation_besch && k.z-bd->get_pos().z==1 && bd->ist_natur()) {
3894
return wkz_depot_t::wkz_depot_aux( welt, sp, k, besch, track_wt, welt->get_einstellungen()->cst_depot_rail );
3924
return wkz_depot_t::wkz_depot_aux(welt, sp, k, besch, track_wt, s.cst_depot_rail);
3896
return wkz_depot_t::wkz_depot_aux( welt, sp, k, besch, water_wt, welt->get_einstellungen()->cst_depot_ship );
3926
return wkz_depot_t::wkz_depot_aux(welt, sp, k, besch, water_wt, s.cst_depot_ship);
3898
return wkz_depot_t::wkz_depot_aux( welt, sp, k, besch, air_wt, welt->get_einstellungen()->cst_depot_air );
3928
return wkz_depot_t::wkz_depot_aux(welt, sp, k, besch, air_wt, s.cst_depot_air);
3899
3929
case maglev_wt:
3900
return wkz_depot_t::wkz_depot_aux( welt, sp, k, besch, maglev_wt, welt->get_einstellungen()->cst_depot_rail );
3930
return wkz_depot_t::wkz_depot_aux(welt, sp, k, besch, maglev_wt, s.cst_depot_rail);
3901
3931
case narrowgauge_wt:
3902
return wkz_depot_t::wkz_depot_aux( welt, sp, k, besch, narrowgauge_wt, welt->get_einstellungen()->cst_depot_rail );
3932
return wkz_depot_t::wkz_depot_aux(welt, sp, k, besch, narrowgauge_wt, s.cst_depot_rail);
3904
3934
dbg->fatal("wkz_depot()","called with unknown besch %s",besch->get_name() );
4296
4324
/* builds company headquarter
4297
4325
* @author prissi
4299
const haus_besch_t *wkz_headquarter_t::next_level( spieler_t *sp )
4327
const haus_besch_t *wkz_headquarter_t::next_level( const spieler_t *sp ) const
4301
4329
return hausbauer_t::get_headquarter(sp->get_headquarter_level(), sp->get_welt()->get_timeline_year_month());
4304
const char *wkz_headquarter_t::get_tooltip( spieler_t *sp )
4332
const char* wkz_headquarter_t::get_tooltip(const spieler_t *sp) const
4306
const haus_besch_t* besch = next_level(sp);
4308
return tooltip_with_price_maintenance( sp->get_welt(), sp->get_headquarter_level()==0 ? "build HQ" : "upgrade HQ", sp->get_welt()->get_einstellungen()->cst_multiply_headquarter*besch->get_level()*besch->get_b()*besch->get_h(), sp->get_welt()->get_einstellungen()->maint_building*besch->get_level()*besch->get_groesse().x*besch->get_groesse().y );
4334
if (haus_besch_t const* const besch = next_level(sp)) {
4335
settings_t const& s = sp->get_welt()->get_settings();
4336
char const* const tip = sp->get_headquarter_level() == 0 ? "build HQ" : "upgrade HQ";
4337
sint64 const factor = (sint64)besch->get_level() * besch->get_b() * besch->get_h();
4338
return tooltip_with_price_maintenance(sp->get_welt(), tip, factor * s.cst_multiply_headquarter, factor * s.maint_building);
4350
// remove previous one
4381
gebaeude_t *hq = NULL;
4382
// check for current head quarter
4351
4383
koord previous = sp->get_headquarter_pos();
4352
4384
if(previous!=koord::invalid) {
4353
grund_t *gr = welt->lookup_kartenboden(previous);
4354
gebaeude_t *prev_hq = gr->find<gebaeude_t>();
4355
sp->add_headquarter( prev_hq->get_tile()->get_besch()->get_extra(), koord::invalid );
4356
hausbauer_t::remove( welt, sp, prev_hq );
4363
if(welt->ist_platz_frei(pos.get_2d(), size.x, size.y, NULL, besch->get_allowed_climate_bits())) {
4366
if(!ok && besch->get_all_layouts()>1 && size.y != size.x && welt->ist_platz_frei(pos.get_2d(), size.y, size.x, NULL, besch->get_allowed_climate_bits())) {
4373
gebaeude_t *hq = hausbauer_t::baue(welt, sp, welt->lookup_kartenboden(pos.get_2d())->get_pos(), rotate, besch, NULL);
4374
stadt_t *city = welt->suche_naechste_stadt( pos.get_2d() );
4376
city->add_gebaeude_to_stadt( hq );
4385
grund_t *gr_hq = welt->lookup_kartenboden(previous);
4386
gebaeude_t *prev_hq = gr_hq->find<gebaeude_t>();
4387
// check if upgrade should be built at same place as current one
4388
gebaeude_t *gb = gr->find<gebaeude_t>();
4389
if (gb && gb->get_besitzer()==sp && prev_hq->get_tile()->get_besch()==gb->get_tile()->get_besch()) {
4390
const haus_besch_t* prev_besch = prev_hq->get_tile()->get_besch();
4391
// check if sizes fit
4392
uint8 prev_layout = prev_hq->get_tile()->get_layout();
4393
uint8 layout = prev_layout % besch->get_all_layouts();
4394
koord size = besch->get_groesse(layout);
4395
if (prev_besch->get_groesse(prev_layout) == size) {
4396
// check for same tile structure
4398
for (sint16 x=0; x<size.x && ok; x++) {
4399
for (sint16 y=0; y<size.y && ok; y++) {
4400
ok = (prev_besch->get_tile(prev_layout, x, y)==NULL)==(besch->get_tile(layout, x, y)==NULL);
4405
// upgrade the tiles
4406
koord pos_hq = pos.get_2d() - gb->get_tile()->get_offset();
4407
for (sint16 x=0; x<size.x; x++) {
4408
for (sint16 y=0; y<size.y; y++) {
4409
if (const haus_tile_besch_t *tile = besch->get_tile(layout, x, y)) {
4410
if (grund_t *gr = welt->lookup_kartenboden(pos_hq + koord(x,y))) {
4411
if (gebaeude_t *gb = gr->find<gebaeude_t>()) {
4412
if (gb && gb->get_besitzer()==sp && prev_besch==gb->get_tile()->get_besch()) {
4413
gb->set_tile( tile );
4425
// did not upgrade old one, need to remove it
4427
sp->add_headquarter( prev_hq->get_tile()->get_besch()->get_extra(), koord::invalid );
4428
// remove previous one
4429
hausbauer_t::remove( welt, sp, prev_hq );
4440
if(welt->ist_platz_frei(pos.get_2d(), size.x, size.y, NULL, besch->get_allowed_climate_bits())) {
4443
if(!ok && besch->get_all_layouts()>1 && size.y != size.x && welt->ist_platz_frei(pos.get_2d(), size.y, size.x, NULL, besch->get_allowed_climate_bits())) {
4450
hq = hausbauer_t::baue(welt, sp, welt->lookup_kartenboden(pos.get_2d())->get_pos(), rotate, besch, NULL);
4451
stadt_t *city = welt->suche_naechste_stadt( pos.get_2d() );
4453
city->add_gebaeude_to_stadt( hq );
4458
return "No suitable ground!";
4378
4464
// sometimes those are not correct after rotation ...
4379
sp->add_headquarter( besch->get_extra()+1, hq->get_pos().get_2d()-hq->get_tile()->get_offset() );
4465
sp->add_headquarter(besch->get_extra()+1, hq->get_pos().get_2d()-hq->get_tile()->get_offset() );
4380
4466
sp->buche( cost, pos.get_2d(), COST_CONSTRUCTION);
4381
4467
// tell the world of it ...
4383
4469
buf.printf( translator::translate("%s s\nheadquarter now\nat (%i,%i)."), sp->get_name(), pos.x, pos.y );
4384
4470
welt->get_message()->add_message( buf, pos.get_2d(), message_t::ai, PLAYER_FLAG|sp->get_player_nr(), hq->get_tile()->get_hintergrund(0,0,0) );
4385
4471
// reset to query tool, since costly relocations should be avoided
4386
4472
if(is_local_execution() && sp == welt->get_active_player()) {
4387
4473
welt->set_werkzeug( werkzeug_t::general_tool[WKZ_ABFRAGE], sp );
4474
welt->get_zeiger()->set_area( koord(1,1), false );
4392
return "No suitable ground!";
4398
4482
const char *wkz_lock_game_t::work( karte_t *welt, spieler_t *, koord3d )
4400
if( welt->get_spieler(1)->is_locked() || !welt->get_einstellungen()->get_allow_player_change() ) {
4484
if (welt->get_spieler(1)->is_locked() || !welt->get_settings().get_allow_player_change()) {
4401
4485
return "Only public player can lock games!";
4403
4487
welt->clear_player_password_hashes();
4404
4488
if( !welt->get_spieler(1)->is_locked() ) {
4405
4489
return "In order to lock the game, you have to protect the public player by password!";
4407
welt->access_einstellungen()->set_allow_player_change( false );
4491
welt->get_settings().set_allow_player_change(false);
4408
4492
destroy_all_win( true );
4409
4493
welt->switch_active_player( 0, true );
4410
4494
welt->set_werkzeug( general_tool[WKZ_ABFRAGE], welt->get_spieler(0) );
4751
4837
sint64 costs = halt->calc_maintenance();
4752
4838
// set only tooltip if it costs (us)
4754
win_set_static_tooltip( tooltip_with_price("Building costs estimates", -((costs*60)<<(welt->ticks_per_world_month_shift-18)) ) );
4840
win_set_static_tooltip( tooltip_with_price("Building costs estimates", costs*60 ) );
4843
else if( const grund_t *gr = welt->lookup(p) ) {
4844
if( gr->get_typ()==grund_t::brueckenboden || gr->get_grund_hang()!=hang_t::flach ) {
4845
// not making ways public on bridges or slopes
4846
return "No suitable ground!";
4848
weg_t *w = gr->get_weg_nr(0);
4849
// no need for action if already player(1) => XOR ...
4850
if( !(w && ( (w->get_besitzer()==sp) ^ (sp==welt->get_spieler(1)) )) ) {
4851
w = gr->get_weg_nr(1);
4852
if( !(w && ( (w->get_besitzer()==sp) ^ (sp==welt->get_spieler(1)) )) ) {
4857
// no public way with signs
4858
if( w->has_sign() ) {
4859
return "No suitable ground!";
4861
sint64 costs = w->get_besch()->get_wartung();
4862
if( gr->ist_im_tunnel() ) {
4863
tunnel_t *t = gr->find<tunnel_t>();
4864
costs = t->get_besch()->get_wartung();
4866
// set only tooltip if it costs (us)
4868
win_set_static_tooltip( tooltip_with_price("Building costs estimates", -costs*60 ) );
4761
4881
const char *wkz_make_stop_public_t::work( karte_t *welt, spieler_t *sp, koord3d p )
4763
4883
const planquadrat_t *pl = welt->lookup(p.get_2d());
4764
if(!pl || !pl->get_halt().is_bound()) {
4765
return "No stop here!";
4884
if( !pl || !pl->get_halt().is_bound() || pl->get_halt()->get_besitzer()==welt->get_spieler(1) ) {
4886
//convert a way here, if there is no halt or already public halt
4887
if( const grund_t *gr = welt->lookup(p) ) {
4888
if( gr->get_typ()==grund_t::brueckenboden || gr->get_grund_hang()!=hang_t::flach ) {
4889
// not making ways public on bridges or slopes
4890
return "No suitable ground!";
4892
w = gr->get_weg_nr(0);
4893
// no need for action if already player(1) => XOR ...
4894
if( !(w && ( (w->get_besitzer()==sp) ^ (sp==welt->get_spieler(1)) )) ) {
4895
w = gr->get_weg_nr(1);
4896
if( !(w && ( (w->get_besitzer()==sp) ^ (sp==welt->get_spieler(1)) )) ) {
4901
// no public way with signs
4902
if( w->has_sign() ) {
4903
return "No suitable ground!";
4905
// change maintenance and ownership
4906
sint64 costs = w->get_besch()->get_wartung();
4907
if( gr->ist_im_tunnel() ) {
4908
tunnel_t *t = gr->find<tunnel_t>();
4909
costs = t->get_besch()->get_wartung();
4910
t->set_besitzer( welt->get_spieler(1) );
4912
spieler_t::add_maintenance( w->get_besitzer(), -costs );
4913
spieler_t::accounting( w->get_besitzer(), -costs*60, gr->get_pos().get_2d(), COST_CONSTRUCTION);
4914
w->set_besitzer( welt->get_spieler(1) );
4915
w->set_flag(ding_t::dirty);
4916
spieler_t::add_maintenance( welt->get_spieler(1), costs );
4917
// now search for wayobjects
4918
for( uint8 i=1; i<gr->get_top(); i++ ) {
4919
if( wayobj_t *wo = ding_cast<wayobj_t>(gr->obj_bei(i)) ) {
4920
costs = wo->get_besch()->get_wartung();
4921
spieler_t::add_maintenance( wo->get_besitzer(), -costs );
4922
spieler_t::accounting( wo->get_besitzer(), -costs*60, gr->get_pos().get_2d(), COST_CONSTRUCTION);
4923
wo->set_besitzer( welt->get_spieler(1) );
4924
wo->set_flag(ding_t::dirty);
4925
spieler_t::add_maintenance( welt->get_spieler(1), costs );
4929
if( sp->get_player_nr()!=1 && umgebung_t::networkmode ) {
4931
buf.printf( translator::translate("(%s) now public way."), w->get_pos().get_str() );
4932
welt->get_message()->add_message( buf, w->get_pos().get_2d(), message_t::ai, PLAYER_FLAG|sp->get_player_nr(), IMG_LEER );
4937
return "No stop here!";
4768
4941
halthandle_t halt = pl->get_halt();