File diff r542:6d2403a77bf9 → r543:efdb197f91ad
misc.c
Show inline comments
 
@@ -5,6 +5,7 @@
 
#include "gfx.h"
 
#include "assert.h"
 
#include "saveload.h"
 
#include "network.h"
 

	
 
extern void StartupEconomy();
 
extern void InitNewsItemStructs();
 
@@ -16,21 +17,24 @@ static inline uint32 ROR(uint32 x, int n
 
	return (x >> n) + (x << ((sizeof(x)*8)-n));
 
}
 

	
 
// For multiplayer, we introduced this new way of random-seeds
 
//  It is player-based, so 2 clients can do 2 commands at the same time
 
//  without the game desyncing.
 
// It is not used for non-multiplayer games
 
#ifdef ENABLE_NETWORK
 
	#define PLAYER_SEED_RANDOM
 
/* XXX - Player-seeds don't seem to be used anymore.. which is a good thing
 
     so I just disabled them for now. If there are no problems, we can remove
 
     it completely! -- TrueLight */
 
#undef PLAYER_SEED_RANDOM
 

	
 
#ifdef RANDOM_DEBUG
 
#include "network_data.h"
 

	
 
uint32 DoRandom(uint line, char *file)
 
#else
 
	#undef PLAYER_SEED_RANDOM
 
uint32 Random()
 
#endif
 
{
 
#ifdef RANDOM_DEBUG
 
	if (_networking && (DEREF_CLIENT(0)->status != STATUS_INACTIVE || !_network_server))
 
		printf("Random [%d/%d] %s:%d\n",_frame_counter, _current_player, file, line);
 
#endif
 

	
 
// its for now not used at all because it is still desyncing :(
 
#undef PLAYER_SEED_RANDOM
 

	
 
uint32 Random()
 
{
 
#ifdef PLAYER_SEED_RANDOM
 
	if (_current_player>=MAX_PLAYERS || !_networking) {
 
		uint32 s = _random_seeds[0][0];
 
@@ -41,6 +45,7 @@ uint32 Random()
 
		uint32 s = _player_seeds[_current_player][0];
 
		uint32 t = _player_seeds[_current_player][1];
 
		_player_seeds[_current_player][0] = s + ROR(t ^ 0x1234567F, 7);
 
		DEBUG(net, 1)("[NET-Seeds] Player seed called!");
 
		return _player_seeds[_current_player][1] = ROR(s, 3);
 
	}
 
#else
 
@@ -51,10 +56,17 @@ uint32 Random()
 
#endif
 
}
 

	
 
#ifdef RANDOM_DEBUG
 
uint DoRandomRange(uint max, uint line, char *file)
 
{
 
	return (uint16)DoRandom(line, file) * max >> 16;
 
}
 
#else
 
uint RandomRange(uint max)
 
{
 
	return (uint16)Random() * max >> 16;
 
}
 
#endif
 

	
 
uint32 InteractiveRandom()
 
{
 
@@ -75,7 +87,7 @@ void InitPlayerRandoms()
 
	for (i=0; i<MAX_PLAYERS; i++) {
 
		_player_seeds[i][0]=InteractiveRandom();
 
		_player_seeds[i][1]=InteractiveRandom();
 
		}
 
	}
 
}
 

	
 
void SetDate(uint date)
 
@@ -86,6 +98,51 @@ void SetDate(uint date)
 
	_cur_month = ymd.month;
 
}
 

	
 

	
 
// multi os compatible sleep function
 

	
 
#if defined(__AMIGA__)
 
// usleep() implementation
 
#	include <devices/timer.h>
 
#	include <dos/dos.h>
 

	
 
	static struct Device      *TimerBase    = NULL;
 
	static struct MsgPort     *TimerPort    = NULL;
 
	static struct timerequest *TimerRequest = NULL;
 
#endif // __AMIGA__
 

	
 
void CSleep(int milliseconds)
 
{
 
	#if defined(WIN32)
 
		Sleep(milliseconds);
 
	#endif
 
	#if defined(UNIX)
 
		#if !defined(__BEOS__) && !defined(__AMIGAOS__)
 
			usleep(milliseconds * 1000);
 
		#endif
 
		#ifdef __BEOS__
 
			snooze(milliseconds * 1000);
 
		#endif
 
		#if defined(__AMIGAOS__) && !defined(__MORPHOS__)
 
		{
 
			ULONG signals;
 
			ULONG TimerSigBit = 1 << TimerPort->mp_SigBit;
 

	
 
			// send IORequest
 
			TimerRequest->tr_node.io_Command = TR_ADDREQUEST;
 
			TimerRequest->tr_time.tv_secs    = (milliseconds * 1000) / 1000000;
 
			TimerRequest->tr_time.tv_micro   = (milliseconds * 1000) % 1000000;
 
			SendIO((struct IORequest *)TimerRequest);
 

	
 
			if (!((signals = Wait(TimerSigBit | SIGBREAKF_CTRL_C)) & TimerSigBit) ) {
 
				AbortIO((struct IORequest *)TimerRequest);
 
			}
 
			WaitIO((struct IORequest *)TimerRequest);
 
		}
 
		#endif // __AMIGAOS__ && !__MORPHOS__
 
	#endif
 
}
 

	
 
void InitializeClearLand();
 
void InitializeRail();
 
void InitializeRailGui();
 
@@ -160,6 +217,7 @@ void InitializeGame()
 
	InitializeCheats();
 

	
 
	InitTextEffects();
 
	InitTextMessage();
 
	InitializeAnimatedTiles();
 

	
 
	InitializeLandscapeVariables(false);
 
@@ -171,6 +229,9 @@ void GenerateWorld(int mode)
 
{
 
	int i;
 

	
 
	// Make sure everything is done via OWNER_NONE
 
	_current_player = OWNER_NONE;
 

	
 
	_generating_world = true;
 
	InitializeGame();
 
	SetObjectToPlace(1, 0, 0, 0);
 
@@ -252,7 +313,7 @@ static void InitializeNameMgr()
 
	memset(_name_array, 0, sizeof(_name_array));
 
}
 

	
 
StringID AllocateName(const byte *name, byte skip)
 
StringID RealAllocateName(const byte *name, byte skip, bool check_double)
 
{
 
	int free_item = -1;
 
	const byte *names;
 
@@ -266,7 +327,7 @@ StringID AllocateName(const byte *name, 
 
			if (free_item == -1)
 
				free_item = i;
 
		} else {
 
			if (str_eq(names, name)) {
 
			if (check_double && str_eq(names, name)) {
 
				_error_message = STR_0132_CHOSEN_NAME_IN_USE_ALREADY;
 
				return 0;
 
			}
 
@@ -575,9 +636,9 @@ void IncreaseDate()
 
	/* yeah, increse day counter and call various daily loops */
 
	_date++;
 

	
 
	NetworkGameChangeDate(_date);
 
	_vehicle_id_ctr_day = 0;
 

	
 
	_vehicle_id_ctr_day = 0;
 
	TextMessageDailyLoop();
 

	
 
	DisasterDailyLoop();
 
	WaypointsDailyLoop();
 
@@ -593,8 +654,6 @@ void IncreaseDate()
 
		return;
 
	_cur_month = ymd.month;
 

	
 
//	printf("Month %d, %X\n", ymd.month, _random_seeds[0][0]);
 

	
 
	/* yes, call various monthly loops */
 
	if (_game_mode != GM_MENU) {
 
		if (HASBIT(_autosave_months[_opt.autosave], _cur_month)) {