diff --git dataobj/settings.cc dataobj/settings.cc index ddccff1ec3..3f4d1295fe 100644 --- dataobj/settings.cc +++ dataobj/settings.cc @@ -745,8 +745,12 @@ void settings_t::rdwr(loadsave_t *file) } if(file->is_version_atleast(102, 3)) { // network stuff - random_counter = get_random_seed( ); - file->rdwr_long( random_counter ); + // Superseded by simrand_rdwr in newer versions + if (file->is_version_less(122, 1)) { + random_counter = get_random_seed( ); + file->rdwr_long( random_counter ); + } + if( !env_t::networkmode || env_t::server ) { frames_per_second = clamp(env_t::fps, 5u, 100u); // update it on the server to the current setting frames_per_step = env_t::network_frames_per_step; diff --git player/ai_passenger.cc player/ai_passenger.cc index 6ed724c2c6..162bb18aa2 100644 --- player/ai_passenger.cc +++ player/ai_passenger.cc @@ -1436,8 +1436,15 @@ void ai_passenger_t::rdwr(loadsave_t *file) k3d.rdwr(file); ziel = fabrik_t::get_fab(k3d.get_2d() ); } -} + if (file->is_version_atleast(122, 1)) { + plainstring road_vehicle_name = road_vehicle ? road_vehicle->get_name() : ""; + file->rdwr_str(road_vehicle_name); + if (file->is_loading() && road_vehicle_name != "") { + road_vehicle = vehicle_builder_t::get_info(road_vehicle_name); + } + } +} /** @@ -1458,7 +1465,11 @@ void ai_passenger_t::report_vehicle_problem(convoihandle_t cnv,const koord3d zie void ai_passenger_t::finish_rd() { - road_vehicle = vehikel_search( road_wt, 50, 80, goods_manager_t::passengers, false); + if (!road_vehicle) { + dbg->warning("ai_passenger_t::finish_rd", "Default road vehicle could not be loaded, searching for one..."); + road_vehicle = vehikel_search( road_wt, 50, 80, goods_manager_t::passengers, false); + } + if (road_vehicle == NULL) { // reset state end_stadt = NULL; diff --git simworld.cc simworld.cc index bfcfd089e3..ab0ffbb674 100644 --- simworld.cc +++ simworld.cc @@ -4780,11 +4780,17 @@ DBG_MESSAGE("karte_t::save(loadsave_t *file)", "start"); settings.set_player_type(i, player_t::EMPTY); } } + settings.rdwr(file); + for( int i=0; iis_version_atleast(122, 1)) { + simrand_rdwr(file); + } + file->rdwr_long(ticks); file->rdwr_long(last_month); file->rdwr_long(last_year); @@ -5352,14 +5358,24 @@ void karte_t::load(loadsave_t *file) dbg->warning("karte_t::load", "Fileversion: %u", file->get_version_int()); settings = env_t::default_settings; settings.rdwr(file); + loaded_rotation = settings.get_rotation(); // some functions (finish_rd) need to know what version was loaded load_version = file->get_version_int(); + if (file->is_version_atleast(122, 1)) { + // rdwr the entire RNG sate + simrand_rdwr(file); + } + if( env_t::networkmode ) { - // to have games synchronized, transfer random counter too - setsimrand(settings.get_random_counter(), 0xFFFFFFFFu ); + // To have games synchronized, transfer random counter too + // Superseded by simrand_rdwr in newer versions + if (file->is_version_less(122, 1)) { + setsimrand(settings.get_random_counter(), 0xFFFFFFFFu ); + } + translator::init_custom_names(settings.get_name_language_id()); } diff --git utils/simrandom.cc utils/simrandom.cc index e9cea538fa..939a621c8b 100644 --- utils/simrandom.cc +++ utils/simrandom.cc @@ -8,6 +8,8 @@ #include #include "simrandom.h" #include "../sys/simsys.h" +#include "../dataobj/loadsave.h" + /* This is the mersenne random generator: More random and faster! */ @@ -18,8 +20,8 @@ #define UPPER_MASK 0x80000000UL /* most significant w-r bits */ #define LOWER_MASK 0x7fffffffUL /* least significant r bits */ -static unsigned long mersenne_twister[MERSENNE_TWISTER_N]; // the array for the state vector -static int mersenne_twister_index = MERSENNE_TWISTER_N + 1; // mersenne_twister_index==N+1 means mersenne_twister[N] is not initialized +static uint32 mersenne_twister[MERSENNE_TWISTER_N]; // the array for the state vector +static uint32 mersenne_twister_index = MERSENNE_TWISTER_N + 1; // mersenne_twister_index==N+1 means mersenne_twister[N] is not initialized static uint8 random_origin = 0; @@ -87,7 +89,7 @@ uint32 simrand_plain() /* Tempering */ y ^= (y >> 11); - y ^= (y << 7) & 0x9d2c5680UL; + y ^= (y << 7) & 0x9d2c5680UL; y ^= (y << 15) & 0xefc60000UL; y ^= (y >> 18); @@ -107,6 +109,20 @@ uint32 simrand(const uint32 max) } +void simrand_rdwr(loadsave_t *file) +{ + xml_tag_t t(file, "simrand"); + + // rdwr index + file->rdwr_long(mersenne_twister_index); + + // rdwr state vector + for (uint32 i=0; irdwr_long(mersenne_twister[i]); + } +} + + void clear_random_mode( uint16 mode ) { random_origin &= ~mode; diff --git utils/simrandom.h utils/simrandom.h index e7ecd2cf60..97bf076a7d 100644 --- utils/simrandom.h +++ utils/simrandom.h @@ -7,9 +7,13 @@ #define UTILS_SIMRANDOM_H -#include #include "../simtypes.h" +#include + + +class loadsave_t; + uint32 get_random_seed(); @@ -27,6 +31,9 @@ uint32 simrand(const uint32 max); /* generates a random number on [0,0xFFFFFFFFu]-interval */ uint32 simrand_plain(); +/// reads/writes the sate of the random number generator +void simrand_rdwr(loadsave_t *file); + double perlin_noise_2D(const double x, const double y, const double persistence); // for network debugging, i.e. finding hidden simrands in wrong places