mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r261) -Workaround: unplayeable network-game on busy maps because of wrong setup of _current_player. This is only a workaround that can cause desyncs too but not that often
This commit is contained in:
parent
eaeca76e5a
commit
9dcf10eb6c
13
misc.c
13
misc.c
|
@ -15,9 +15,14 @@ static INLINE uint32 ROR(uint32 x, int n)
|
||||||
return (x >> n) + (x << ((sizeof(x)*8)-n));
|
return (x >> n) + (x << ((sizeof(x)*8)-n));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Fuck bitch code, most probably one of the loops (tileloop, vehicleloop, etc.)
|
||||||
|
* doesn't set up/reset _current_player so the normal random below fails #$%@$#!
|
||||||
|
* The old code below is prune to desyncs because randoms interfere.
|
||||||
|
* SO FIND THE OFFENDING LOOP AND FIX IT ONCE AND FOR ALL */
|
||||||
|
#undef NORMAL_RANDOM // unuseable game, desyncs way too fast
|
||||||
uint32 Random()
|
uint32 Random()
|
||||||
{
|
{
|
||||||
|
#ifdef NORMAL_RANDOM
|
||||||
if (_current_player>=MAX_PLAYERS) {
|
if (_current_player>=MAX_PLAYERS) {
|
||||||
uint32 s = _random_seeds[0][0];
|
uint32 s = _random_seeds[0][0];
|
||||||
uint32 t = _random_seeds[0][1];
|
uint32 t = _random_seeds[0][1];
|
||||||
|
@ -29,6 +34,12 @@ uint32 Random()
|
||||||
_player_seeds[_current_player][0] = s + ROR(t ^ 0x1234567F, 7);
|
_player_seeds[_current_player][0] = s + ROR(t ^ 0x1234567F, 7);
|
||||||
return _player_seeds[_current_player][1] = ROR(s, 3);
|
return _player_seeds[_current_player][1] = ROR(s, 3);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
uint32 s = _random_seeds[0][0];
|
||||||
|
uint32 t = _random_seeds[0][1];
|
||||||
|
_random_seeds[0][0] = s + ROR(t ^ 0x1234567F, 7);
|
||||||
|
return _random_seeds[0][1] = ROR(s, 3);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
uint RandomRange(uint max)
|
uint RandomRange(uint max)
|
||||||
|
|
|
@ -353,7 +353,7 @@ static int GetNextSyncFrame()
|
||||||
{
|
{
|
||||||
uint32 newframe;
|
uint32 newframe;
|
||||||
if (_frame_fsync_last == 0) return -5;
|
if (_frame_fsync_last == 0) return -5;
|
||||||
newframe = (_frame_fsync_last + 16);
|
newframe = (_frame_fsync_last + 10); // do not use a multiple of 4 since that screws up sync-packets
|
||||||
if ( (newframe + 4) > _frame_counter_max) return -5;
|
if ( (newframe + 4) > _frame_counter_max) return -5;
|
||||||
return (_frame_counter_max - newframe);
|
return (_frame_counter_max - newframe);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue