diff --git a/dataobj/settings.cc b/dataobj/settings.cc index dab6bd226..60e4a49b8 100644 --- a/dataobj/settings.cc +++ b/dataobj/settings.cc @@ -185,6 +185,11 @@ settings_t::settings_t() : */ pak_diagonal_multiplier = 724; + /* offset value for road vehicles on diagonals + * 0 = center, 16 = edge, but clipped to 255 anyway + */ + pak_road_diagonal_offset = 0; + // read default from env_t // should be set in simmain.cc (taken from pak-set simuconf.tab way_height_clearance = env_t::default_settings.get_way_height_clearance(); @@ -526,13 +531,14 @@ void settings_t::rdwr(loadsave_t *file) // vehicle may need realignment afterwards! if(file->is_version_less(99, 19)) { - vehicle_base_t::set_diagonal_multiplier( pak_diagonal_multiplier, 1024 ); + vehicle_base_t::set_diagonal_multiplier( pak_diagonal_multiplier, 1024, 5 ); } else { uint16 old_multiplier = pak_diagonal_multiplier; file->rdwr_short( old_multiplier ); - vehicle_base_t::set_diagonal_multiplier( pak_diagonal_multiplier, old_multiplier ); + vehicle_base_t::set_diagonal_multiplier( pak_diagonal_multiplier, old_multiplier, pak_road_diagonal_offset ); // since vehicle will need realignment afterwards! + //ADD Road offset } if(file->is_version_atleast(101, 0)) { @@ -1409,6 +1415,8 @@ void settings_t::parse_simuconf( tabfile_t& simuconf, sint16& disp_width, sint16 // these are pak specific; the diagonal length affect travelling time (is game critical) pak_diagonal_multiplier = contents.get_int("diagonal_multiplier", pak_diagonal_multiplier ); + // the road diagonal offset shortens the inner curve and lengthens the outer curve for road vehicles [0-16] + pak_road_diagonal_offset = contents.get_int("road_diagonal_offset", pak_road_diagonal_offset ); // the height in z-direction will only cause pixel errors but not a different behaviour env_t::pak_tile_height_step = contents.get_int("tile_height", env_t::pak_tile_height_step ); // new height for old slopes after conversion - 1=single height, 2=double height diff --git a/dataobj/settings.h b/dataobj/settings.h index 4fd76f279..9255e51a5 100644 --- a/dataobj/settings.h +++ b/dataobj/settings.h @@ -247,6 +247,11 @@ private: */ uint16 pak_diagonal_multiplier; + /* offset value for road vehicles on diagonals + * 0 = center, 16 = edge, but clipped to 255 anyway + */ + uint8 pak_road_diagonal_offset; + // names of the stations ... char language_code_names[4]; @@ -489,6 +494,9 @@ public: void set_pak_diagonal_multiplier(uint16 n) { pak_diagonal_multiplier = n; } uint16 get_pak_diagonal_multiplier() const { return pak_diagonal_multiplier; } + void set_pak_road_diagonal_offset(uint8 n) { pak_road_diagonal_offset = n;} + uint8 get_pak_road_diagonal_offset() const { return pak_road_diagonal_offset; } + int get_name_language_id() const; void set_name_language_iso( const char *iso ) { language_code_names[0] = iso[0]; diff --git a/gui/components/gui_timeinput.h b/gui/components/gui_timeinput.h index 35ce00cf9..21a041711 100644 --- a/gui/components/gui_timeinput.h +++ b/gui/components/gui_timeinput.h @@ -27,7 +27,7 @@ private: // the input field gui_label_t time_out; - // entry displayed for + // entry displayed for const char *null_text; char textbuffer[64]; diff --git a/gui/extend_edit.cc b/gui/extend_edit.cc index 5e123234d..9d0490849 100644 --- a/gui/extend_edit.cc +++ b/gui/extend_edit.cc @@ -174,7 +174,7 @@ extend_edit_gui_t::extend_edit_gui_t(const char *name, player_t* player_) : cont_options.add_component(&bt_climates); //setting scrollable content box - scrolly.set_visible(true); + scrolly.set_visible(true); scrolly.set_min_width( (D_DEFAULT_WIDTH-D_MARGIN_LEFT-D_MARGIN_RIGHT-2*D_H_SPACE)/2 ); } diff --git a/simmain.cc b/simmain.cc index 7cc3a2fce..a5c1f8370 100644 --- a/simmain.cc +++ b/simmain.cc @@ -574,6 +574,7 @@ int simu_main(int argc, char** argv) // only the specified pak conf should override this! uint16 pak_diagonal_multiplier = env_t::default_settings.get_pak_diagonal_multiplier(); + uint8 pak_road_diagonal_offset = env_t::default_settings.get_pak_road_diagonal_offset(); sint8 pak_tile_height = TILE_HEIGHT_STEP; sint8 pak_height_conversion_factor = env_t::pak_height_conversion_factor; @@ -1002,6 +1003,7 @@ int simu_main(int argc, char** argv) env_t::default_settings.parse_simuconf( simuconf, idummy, idummy, idummy, dummy ); env_t::default_settings.parse_colours( simuconf ); pak_diagonal_multiplier = env_t::default_settings.get_pak_diagonal_multiplier(); + pak_road_diagonal_offset = env_t::default_settings.get_pak_road_diagonal_offset(); pak_height_conversion_factor = env_t::pak_height_conversion_factor; pak_tile_height = TILE_HEIGHT_STEP; if( env_t::default_settings.get_way_height_clearance() == 0 ) { @@ -1054,7 +1056,8 @@ int simu_main(int argc, char** argv) // now (re)set the correct length and other pak set only settings env_t::default_settings.set_pak_diagonal_multiplier( pak_diagonal_multiplier ); - vehicle_base_t::set_diagonal_multiplier( pak_diagonal_multiplier, pak_diagonal_multiplier ); + env_t::default_settings.set_pak_road_diagonal_offset( pak_road_diagonal_offset ); + vehicle_base_t::set_diagonal_multiplier( pak_diagonal_multiplier, pak_diagonal_multiplier, pak_road_diagonal_offset); env_t::pak_height_conversion_factor = pak_height_conversion_factor; TILE_HEIGHT_STEP = pak_tile_height; diff --git a/utils/int_math.h b/utils/int_math.h index c2591cbf4..67a7f59fc 100644 --- a/utils/int_math.h +++ b/utils/int_math.h @@ -3,8 +3,9 @@ * (see LICENSE.txt) */ -#ifndef UTILS_MATH_H -#define UTILS_MATH_H +#ifndef UTILS_INT_MATH_H +#define UTILS_INT_MATH_H + #include "../simtypes.h" diff --git a/vehicle/vehicle_base.cc b/vehicle/vehicle_base.cc index c6c2b6511..834a907b4 100644 --- a/vehicle/vehicle_base.cc +++ b/vehicle/vehicle_base.cc @@ -37,14 +37,16 @@ sint8 vehicle_base_t::dxdy[ 8*2 ] = { uint8 vehicle_base_t::old_diagonal_vehicle_steps_per_tile = 128; uint8 vehicle_base_t::diagonal_vehicle_steps_per_tile = 181; uint16 vehicle_base_t::diagonal_multiplier = 724; +uint8 vehicle_base_t::step_offset = 0; // set only once, before loading! -void vehicle_base_t::set_diagonal_multiplier( uint32 multiplier, uint32 old_diagonal_multiplier ) +void vehicle_base_t::set_diagonal_multiplier( uint32 multiplier, uint32 old_diagonal_multiplier, uint8 road_diagonal_offset ) { diagonal_multiplier = (uint16)multiplier; diagonal_vehicle_steps_per_tile = (uint8)(130560u/diagonal_multiplier) + 1; old_diagonal_vehicle_steps_per_tile = (uint8)(130560u/old_diagonal_multiplier) + 1; + step_offset = (uint8) min(VEHICLE_STEPS_PER_TILE-diagonal_vehicle_steps_per_tile-1, (diagonal_vehicle_steps_per_tile * road_diagonal_offset)>>4); } @@ -323,8 +325,12 @@ uint32 vehicle_base_t::do_drive(uint32 distance) // to make smaller steps than the tile granularity, we have to use this trick void vehicle_base_t::get_screen_offset( int &xoff, int &yoff, const sint16 raster_width ) const { + sint32 steps_=(sint32)steps; + if(get_waytype()==road_wt && step_offset!=0 && (ribi_t::is_bend(direction))){ + steps_ = (is_diag_long_side^ welt->get_settings().is_drive_left() ) ? steps_ - (step_offset>>1) : steps_ + (step_offset>>1); + } // vehicles needs finer steps to appear smoother - sint32 display_steps = (uint32)steps*(uint16)raster_width; + sint32 display_steps = steps_*(uint16)raster_width; if(dx && dy) { display_steps &= 0xFFFFFC00; } @@ -339,10 +345,11 @@ void vehicle_base_t::get_screen_offset( int &xoff, int &yoff, const sint16 raste // calcs new direction and applies it to the vehicles ribi_t::ribi vehicle_base_t::calc_set_direction(const koord3d& start, const koord3d& ende) { - ribi_t::ribi direction = ribi_t::none; + //ribi_t::ribi direction = ribi_t::none; const sint8 di = ende.x - start.x; const sint8 dj = ende.y - start.y; + uint8 diag = diagonal_vehicle_steps_per_tile; if(dj < 0 && di == 0) { direction = ribi_t::north; @@ -364,26 +371,78 @@ ribi_t::ribi vehicle_base_t::calc_set_direction(const koord3d& start, const koor dx = 2; dy = 1; steps_next = VEHICLE_STEPS_PER_TILE - 1; - } else if(di > 0 && dj > 0) { - direction = ribi_t::southeast; - dx = 0; - dy = 2; - steps_next = diagonal_vehicle_steps_per_tile - 1; - } else if(di < 0 && dj < 0) { - direction = ribi_t::northwest; - dx = 0; - dy = -2; - steps_next = diagonal_vehicle_steps_per_tile - 1; - } else if(di > 0 && dj < 0) { - direction = ribi_t::northeast; - dx = 4; - dy = 0; - steps_next = diagonal_vehicle_steps_per_tile - 1; + } else if(get_waytype()==road_wt && step_offset!=0) { + if(di > 0 && dj > 0) { + switch(direction){ + case ribi_t::south: + case ribi_t::southwest: is_diag_long_side = true; break; + case ribi_t::southeast: is_diag_long_side ^= 1; break; + case ribi_t::east: + case ribi_t::northeast: is_diag_long_side = false; break; + } + direction = ribi_t::southeast; + dx = 0; + dy = 2; + steps_next = (is_diag_long_side^welt->get_settings().is_drive_left()) ? diag+step_offset : diag-step_offset; + } else if(di < 0 && dj < 0) { + switch(direction){ + case ribi_t::north: + case ribi_t::northeast: is_diag_long_side = true; break; + case ribi_t::northwest: is_diag_long_side ^= 1; break; + case ribi_t::west: + case ribi_t::southwest: is_diag_long_side = false; break; + } + direction = ribi_t::northwest; + dx = 0; + dy = -2; + steps_next = (is_diag_long_side^welt->get_settings().is_drive_left()) ? diag+step_offset : diag-step_offset; + } else if(di > 0 && dj < 0) { + switch(direction){ + case ribi_t::east: + case ribi_t::northwest: is_diag_long_side = true; break; + case ribi_t::northeast: is_diag_long_side ^= 1; break; + case ribi_t::north: + case ribi_t::southeast: is_diag_long_side = false; break; + } + direction = ribi_t::northeast; + dx = 4; + dy = 0; + steps_next = (is_diag_long_side^welt->get_settings().is_drive_left()) ? diag+step_offset : diag-step_offset; + } else { + switch(direction){ + case ribi_t::west: + case ribi_t::southeast: is_diag_long_side = true; break; + case ribi_t::southwest: is_diag_long_side ^= 1; break; + case ribi_t::south: + case ribi_t::northwest: is_diag_long_side = false; break; + } + direction = ribi_t::southwest; + dx = -4; + dy = 0; + steps_next = (is_diag_long_side^welt->get_settings().is_drive_left()) ? diag+step_offset : diag-step_offset; + } } else { - direction = ribi_t::southwest; - dx = -4; - dy = 0; - steps_next = diagonal_vehicle_steps_per_tile - 1; + if(di > 0 && dj > 0) { + direction = ribi_t::southeast; + dx = 0; + dy = 2; + steps_next = diagonal_vehicle_steps_per_tile - 1; + } else if(di < 0 && dj < 0) { + direction = ribi_t::northwest; + dx = 0; + dy = -2; + steps_next = diagonal_vehicle_steps_per_tile - 1; + } else if(di > 0 && dj < 0) { + direction = ribi_t::northeast; + dx = 4; + dy = 0; + steps_next = diagonal_vehicle_steps_per_tile - 1; + } else { + direction = ribi_t::southwest; + dx = -4; + dy = 0; + steps_next = diagonal_vehicle_steps_per_tile - 1; + } } // we could artificially make diagonals shorter: but this would break existing game behaviour return direction; diff --git a/vehicle/vehicle_base.h b/vehicle/vehicle_base.h index b511f499f..00d2000df 100644 --- a/vehicle/vehicle_base.h +++ b/vehicle/vehicle_base.h @@ -35,6 +35,12 @@ protected: static sint8 driveleft_base_offsets[8][2]; static sint8 overtaking_base_offsets[8][2]; + // difference in steplength on diagonal roads (inner shorter/outer longer) + static uint8 step_offset; + // whether or not we are on the 'longer' side of diagonals + // this assumes driving on right side of road + bool is_diag_long_side = false; + /** * Actual travel direction in screen coordinates */ @@ -98,7 +104,7 @@ protected: public: // only called during load time: set some offsets - static void set_diagonal_multiplier( uint32 multiplier, uint32 old_multiplier ); + static void set_diagonal_multiplier( uint32 multiplier, uint32 old_multiplier, uint8 road_diagonal_offset ); static uint16 get_diagonal_multiplier() { return diagonal_multiplier; } static uint8 get_diagonal_vehicle_steps_per_tile() { return diagonal_vehicle_steps_per_tile; }