[Scummvm-git-logs] scummvm master -> caa4578add35021bfbb00b5f81359592402096a3

antoniou79 antoniou at cti.gr
Wed Jul 17 18:19:30 CEST 2019


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
d1ff73cbb3 BLADERUNNER: Replace difficulty values with proper enum
caa4578add BLADERUNNER: Use unsigned 32bit diff for time durations


Commit: d1ff73cbb381db1876e2dbdf0457c9efc76fcd1a
    https://github.com/scummvm/scummvm/commit/d1ff73cbb381db1876e2dbdf0457c9efc76fcd1a
Author: Thanasis Antoniou (a.antoniou79 at gmail.com)
Date: 2019-07-17T19:09:13+03:00

Commit Message:
BLADERUNNER: Replace difficulty values with proper enum

Changed paths:
    engines/bladerunner/settings.cpp


diff --git a/engines/bladerunner/settings.cpp b/engines/bladerunner/settings.cpp
index f86536e..b4a0022 100644
--- a/engines/bladerunner/settings.cpp
+++ b/engines/bladerunner/settings.cpp
@@ -39,8 +39,8 @@ namespace BladeRunner {
 Settings::Settings(BladeRunnerEngine *vm) {
 	_vm = vm;
 
-	_difficulty = 1;
-	_playerAgenda = 1;
+	_difficulty = kGameDifficultyMedium;
+	_playerAgenda = kPlayerAgendaNormal;
 
 	_chapter = 1;
 	_scene = -1;
@@ -65,6 +65,7 @@ Settings::Settings(BladeRunnerEngine *vm) {
 	_fullHDFrames = true;
 	_mst3k = false;
 
+	// TODO: A bug? why is this set again here?
 	_ammoType = 0;
 	_ammoAmounts[0] = 0;
 	_ammoAmounts[1] = 0;
@@ -174,7 +175,7 @@ void Settings::addAmmo(int ammoType, int ammo) {
 }
 
 void Settings::decreaseAmmo() {
-	if (_difficulty == 0 || _ammoType == 0) {
+	if (_difficulty == kGameDifficultyEasy || _ammoType == 0) {
 		return;
 	}
 


Commit: caa4578add35021bfbb00b5f81359592402096a3
    https://github.com/scummvm/scummvm/commit/caa4578add35021bfbb00b5f81359592402096a3
Author: Thanasis Antoniou (a.antoniou79 at gmail.com)
Date: 2019-07-17T19:09:15+03:00

Commit Message:
BLADERUNNER: Use unsigned 32bit diff for time durations

Changed paths:
    engines/bladerunner/actor.cpp
    engines/bladerunner/actor.h
    engines/bladerunner/actor_dialogue_queue.cpp
    engines/bladerunner/actor_dialogue_queue.h
    engines/bladerunner/ambient_sounds.cpp
    engines/bladerunner/ambient_sounds.h
    engines/bladerunner/audio_mixer.cpp
    engines/bladerunner/audio_mixer.h
    engines/bladerunner/audio_player.cpp
    engines/bladerunner/audio_player.h
    engines/bladerunner/bladerunner.cpp
    engines/bladerunner/bladerunner.h
    engines/bladerunner/debugger.cpp
    engines/bladerunner/item_pickup.cpp
    engines/bladerunner/item_pickup.h
    engines/bladerunner/movement_track.cpp
    engines/bladerunner/movement_track.h
    engines/bladerunner/music.cpp
    engines/bladerunner/music.h
    engines/bladerunner/savefile.cpp
    engines/bladerunner/savefile.h
    engines/bladerunner/script/police_maze.cpp
    engines/bladerunner/script/script.cpp
    engines/bladerunner/script/script.h
    engines/bladerunner/script/vk_script.cpp
    engines/bladerunner/time.cpp
    engines/bladerunner/time.h
    engines/bladerunner/ui/elevator.cpp
    engines/bladerunner/ui/elevator.h
    engines/bladerunner/ui/end_credits.cpp
    engines/bladerunner/ui/esper.cpp
    engines/bladerunner/ui/esper.h
    engines/bladerunner/ui/kia.cpp
    engines/bladerunner/ui/kia.h
    engines/bladerunner/ui/kia_section_diagnostic.cpp
    engines/bladerunner/ui/kia_section_diagnostic.h
    engines/bladerunner/ui/kia_section_load.cpp
    engines/bladerunner/ui/kia_section_pogo.cpp
    engines/bladerunner/ui/kia_section_pogo.h
    engines/bladerunner/ui/kia_section_save.cpp
    engines/bladerunner/ui/spinner.cpp
    engines/bladerunner/ui/spinner.h
    engines/bladerunner/ui/ui_check_box.cpp
    engines/bladerunner/ui/ui_check_box.h
    engines/bladerunner/ui/ui_image_picker.cpp
    engines/bladerunner/ui/ui_image_picker.h
    engines/bladerunner/ui/ui_input_box.h
    engines/bladerunner/ui/ui_scroll_box.cpp
    engines/bladerunner/ui/ui_scroll_box.h
    engines/bladerunner/ui/vk.cpp
    engines/bladerunner/ui/vk.h


diff --git a/engines/bladerunner/actor.cpp b/engines/bladerunner/actor.cpp
index 84febcc..df78b00 100644
--- a/engines/bladerunner/actor.cpp
+++ b/engines/bladerunner/actor.cpp
@@ -70,63 +70,63 @@ Actor::~Actor() {
 }
 
 void Actor::setup(int actorId) {
-	_id    = actorId;
-	_setId = -1;
+	_id             = actorId;
+	_setId          = -1;
 
-	_position     = Vector3(0.0, 0.0, 0.0);
-	_facing       = 512;
-	_targetFacing = -1;
-	_walkboxId    = -1;
+	_position       = Vector3(0.0, 0.0, 0.0);
+	_facing         = 512;
+	_targetFacing   = -1;
+	_walkboxId      = -1;
 
 	_animationId    = 0;
 	_animationFrame = 0;
 	_fps            = 15;
-	_frameMs       = 1000 / _fps;
+	_frameMs        = 1000 / _fps;
 
 	_mustReachWalkDestination = false;	// Original's _inWalkLoop. Moved here from our constructor, since it's here in the original's init()
-	_isMoving            = false;
-	_isTarget            = false;
-	_inCombat            = false;
-	_isInvisible         = false;
-	_isImmuneToObstacles = false;
-	_isRetired           = false;
+	_isMoving                 = false;
+	_isTarget                 = false;
+	_inCombat                 = false;
+	_isInvisible              = false;
+	_isImmuneToObstacles      = false;
+	_isRetired                = false;
 
-	_width         = 0;
-	_height        = 0;
-	_retiredWidth  = 0;
-	_retiredHeight = 0;
-	_scale         = 1.0f;
+	_width                    = 0;
+	_height                   = 0;
+	_retiredWidth             = 0;
+	_retiredHeight            = 0;
+	_scale                    = 1.0f;
 
-	_timer4RemainDefault = 60000;
+	_timer4RemainDefault      = 60000u;
 
 	_movementTrackWalkingToWaypointId = -1;
-	_movementTrackDelayOnNextWaypoint = -1;
+	_movementTrackDelayOnNextWaypoint = (uint32)(-1); // original was -1, int
 
 	for (int i = 0; i != kActorTimers; ++i) {
-		_timersLeft[i] = 0;
+		_timersLeft[i] = 0u;
 		_timersLast[i] = _vm->_time->current();
 	}
 	_timersLeft[kActorTimerClueExchange] = _timer4RemainDefault; // This was in original code. We need to init this timer in order to kick off periodic updates for acquireCluesByRelations
 
-	_honesty              = 50;
-	_intelligence         = 50;
-	_combatAggressiveness = 50;
-	_stability            = 50;
+	_honesty                     = 50;
+	_intelligence                = 50;
+	_combatAggressiveness        = 50;
+	_stability                   = 50;
 
-	_currentHP  = 50;
-	_maxHP      = 50;
+	_currentHP                   = 50;
+	_maxHP                       = 50;
 
-	_damageAnimIfMoving       = true;	// Set to true (like in original). And moved here from our constructor, since it's here in the original's init().
+	_damageAnimIfMoving          = true; // Set to true (like in original). And moved here from our constructor, since it's here in the original's init().
 
-	_goalNumber = -1;
+	_goalNumber                  = -1;
 
 	_movementTrackPaused         = false;
 	_movementTrackNextWaypointId = -1;
-	_movementTrackNextDelay      = -1;
+	_movementTrackNextDelay      = (uint32)(-1); // original was -1, int
 	_movementTrackNextAngle      = -1;
 	_movementTrackNextRunning    = false;
 
-	_animationMode   = -1;
+	_animationMode               = -1;
 	_screenRectangle = Common::Rect(-1, -1, -1, -1);
 
 	_animationModeCombatIdle = kAnimationModeCombatIdle;
@@ -220,18 +220,21 @@ void Actor::increaseFPS() {
 	setFPS(fps);
 }
 
-void Actor::timerStart(int timerId, int interval) {
+void Actor::timerStart(int timerId, uint32 interval) {
 	assert(timerId >= 0 && timerId < kActorTimers);
+	if ((int32)interval == -1 ) {
+		interval = 0u;
+	}
 	_timersLeft[timerId] = interval;
 	_timersLast[timerId] = _vm->_time->current();
 }
 
 void Actor::timerReset(int timerId) {
 	assert(timerId >= 0 && timerId < kActorTimers);
-	_timersLeft[timerId] = 0;
+	_timersLeft[timerId] = 0u;
 }
 
-int Actor::timerLeft(int timerId) {
+uint32 Actor::timerLeft(int timerId) {
 	assert(timerId >= 0 && timerId < kActorTimers);
 	return _timersLeft[timerId];
 }
@@ -243,16 +246,21 @@ void Actor::timersUpdate() {
 }
 
 void Actor::timerUpdate(int timerId) {
-	if (_timersLeft[timerId] == 0) {
+	if (_timersLeft[timerId] == 0u) {
 		return;
 	}
 
 	uint32 timeNow = _vm->_time->current();
-	int timeDiff = timeNow - _timersLast[timerId];
+	uint32 timeDiff = timeNow - _timersLast[timerId]; // unsigned difference is intentional
 	_timersLast[timerId] = timeNow;
-	_timersLeft[timerId] -= timeDiff;
+	// new check is safe-guard against old saves, _timersLeft should never have very big value anyway
+	if ((int32)_timersLeft[timerId] < 0 ) {
+		// this will make it 0u in the next command below
+		_timersLeft[timerId] = 0u;
+	}
+	_timersLeft[timerId] = (_timersLeft[timerId] < timeDiff) ? 0u : (_timersLeft[timerId] - timeDiff);
 
-	if (_timersLeft[timerId] <= 0) {
+	if (_timersLeft[timerId] == 0u) { // original check was <= 0
 		switch (timerId) {
 		case kActorTimerAIScriptCustomTask0:
 			// fall through
@@ -261,15 +269,15 @@ void Actor::timerUpdate(int timerId) {
 		case kActorTimerAIScriptCustomTask2:
 			if (!_vm->_aiScripts->isInsideScript() && !_vm->_sceneScript->isInsideScript()) {
 				_vm->_aiScripts->timerExpired(_id, timerId);
-				_timersLeft[timerId] = 0;
+				_timersLeft[timerId] = 0u;
 			} else {
-				_timersLeft[timerId] = 1;
+				_timersLeft[timerId] = 1u;
 			}
 			break;
 		case kActorTimerMovementTrack:
-			_timersLeft[kActorTimerMovementTrack] = 0;
+			_timersLeft[kActorTimerMovementTrack] = 0u;
 			if (_movementTrack->isPaused()) {
-				_timersLeft[kActorTimerMovementTrack] = 1;
+				_timersLeft[kActorTimerMovementTrack] = 1u;
 			} else {
 				movementTrackNext(false);
 			}
@@ -292,7 +300,7 @@ void Actor::timerUpdate(int timerId) {
 					setFPS(newFps);
 				}
 			}
-			_timersLeft[kActorTimerRunningStaminaFPS] = 200;
+			_timersLeft[kActorTimerRunningStaminaFPS] = 200u;
 			break;
 		}
 	}
@@ -302,7 +310,7 @@ void Actor::movementTrackNext(bool omitAiScript) {
 	bool hasNextMovement;
 	bool running;
 	int angle;
-	int delay;
+	uint32 delay;
 	int waypointId;
 	Vector3 waypointPosition;
 	bool arrived;
@@ -332,9 +340,9 @@ void Actor::movementTrackNext(bool omitAiScript) {
 			setAtXYZ(waypointPosition, angle, true, false, false);
 
 			if (!delay) {
-				delay = 1;
+				delay = 1u;
 			}
-			if (delay > 1) {
+			if ((int32)delay != -1 && delay > 1u) {
 				changeAnimationMode(kAnimationModeIdle, false);
 			}
 			timerStart(kActorTimerMovementTrack, delay);
@@ -372,13 +380,13 @@ void Actor::movementTrackUnpause() {
 
 void Actor::movementTrackWaypointReached() {
 	if (!_movementTrack->isPaused() && _id != kActorMcCoy) {
-		if (_movementTrackWalkingToWaypointId >= 0 && _movementTrackDelayOnNextWaypoint >= 0) {
+		if (_movementTrackWalkingToWaypointId >= 0 && (int32)(_movementTrackDelayOnNextWaypoint) != -1) { // original was _movementTrackDelayOnNextWaypoint >= 0u
 			if (!_movementTrackDelayOnNextWaypoint) {
-				_movementTrackDelayOnNextWaypoint = 1;
+				_movementTrackDelayOnNextWaypoint = 1u;
 			}
 			if (_vm->_aiScripts->reachedMovementTrackWaypoint(_id, _movementTrackWalkingToWaypointId)) {
-				int delay = _movementTrackDelayOnNextWaypoint;
-				if (delay > 1) {
+				uint32 delay = _movementTrackDelayOnNextWaypoint;
+				if (delay > 1u) {
 					changeAnimationMode(kAnimationModeIdle, false);
 					delay = _movementTrackDelayOnNextWaypoint; // todo: analyze if movement is changed in some aiscript->ChangeAnimationMode?
 				}
@@ -386,7 +394,7 @@ void Actor::movementTrackWaypointReached() {
 			}
 		}
 		_movementTrackWalkingToWaypointId = -1;
-		_movementTrackDelayOnNextWaypoint = 0;
+		_movementTrackDelayOnNextWaypoint = 0u;
 	}
 }
 
@@ -604,17 +612,17 @@ void Actor::run() {
 }
 
 bool Actor::tick(bool forceDraw, Common::Rect *screenRect) {
-	int timeLeft = 0;
+	uint32 timeLeft = 0u;
 	bool needsUpdate = false;
 	if (_fps > 0) {
 		timerUpdate(kActorTimerAnimationFrame);
 		timeLeft = timerLeft(kActorTimerAnimationFrame);
-		needsUpdate = timeLeft <= 0;
+		needsUpdate = (timeLeft == 0); // original was <= 0, with timeLeft int
 	} else if (_fps == 0) {
 		needsUpdate = false;
 	} else if (forceDraw) {
 		needsUpdate = true;
-		timeLeft = 0;
+		timeLeft = 0u;
 	}
 
 	if (needsUpdate) {
@@ -722,11 +730,11 @@ bool Actor::tick(bool forceDraw, Common::Rect *screenRect) {
 	}
 
 	if (needsUpdate) {
-		int nextFrameTime = timeLeft + _frameMs;
+		int nextFrameTime = (int)(timeLeft + _frameMs); // Should be ok
 		if (nextFrameTime <= 0) {
 			nextFrameTime = 1;
 		}
-		timerStart(kActorTimerAnimationFrame, nextFrameTime);
+		timerStart(kActorTimerAnimationFrame, (uint32)nextFrameTime);
 	}
 	if (_targetFacing >= 0) {
 		if (_targetFacing == _facing) {
@@ -1417,7 +1425,7 @@ void Actor::save(SaveFileWriteStream &f) {
 	uint32 now = _vm->_time->getPauseStart();
 	for (int i = 0; i < kActorTimers; ++i) {
 		// this effectively stores the next timeDiff to be applied to timer i (in timerUpdate)
-		f.writeInt(now - _timersLast[i]);
+		f.writeInt(now - _timersLast[i]); // Unsigned difference is intentional
 	}
 
 	int actorCount = _vm->_gameInfo->getActorCount();
@@ -1446,7 +1454,7 @@ void Actor::load(SaveFileReadStream &f) {
 	_position = f.readVector3();
 	_facing = f.readInt();
 	_targetFacing = f.readInt();
-	_timer4RemainDefault = f.readInt();
+	_timer4RemainDefault = (uint32)f.readInt();
 
 	_honesty = f.readInt();
 	_intelligence = f.readInt();
@@ -1460,7 +1468,7 @@ void Actor::load(SaveFileReadStream &f) {
 
 	_movementTrackPaused = f.readBool();
 	_movementTrackNextWaypointId = f.readInt();
-	_movementTrackNextDelay = f.readInt();
+	_movementTrackNextDelay = (uint32)f.readInt();
 	_movementTrackNextAngle = f.readInt();
 	_movementTrackNextRunning = f.readBool();
 
@@ -1480,7 +1488,7 @@ void Actor::load(SaveFileReadStream &f) {
 	_animationFrame = f.readInt();
 
 	_movementTrackWalkingToWaypointId = f.readInt();
-	_movementTrackDelayOnNextWaypoint = f.readInt();
+	_movementTrackDelayOnNextWaypoint = (uint32)f.readInt();
 
 	_screenRectangle = f.readRect();
 	_retiredWidth = f.readInt();
@@ -1491,17 +1499,17 @@ void Actor::load(SaveFileReadStream &f) {
 	_scale = f.readFloat();
 
 	for (int i = 0; i < kActorTimers; ++i) {
-		_timersLeft[i] = f.readInt();
+		_timersLeft[i] = (uint32)f.readInt();
 	}
 	// Bugfix: Special initialization case for timer 4 (kActorTimerClueExchange) when its value is restored as 0
 	// This should be harmless, but will remedy any broken save-games where the timer 4 was saved as 0.
-	if (_timersLeft[kActorTimerClueExchange] == 0) {
+	if (_timersLeft[kActorTimerClueExchange] == 0u) {
 		_timersLeft[kActorTimerClueExchange] = _timer4RemainDefault;
 	}
 
 	uint32 now = _vm->_time->getPauseStart();
 	for (int i = 0; i < kActorTimers; ++i) {
-		_timersLast[i] = now - f.readInt();
+		_timersLast[i] = now - (uint32)(f.readInt()); // we require an unsigned difference here, since _timersLast is essentially keeping time
 	}
 
 	int actorCount = _vm->_gameInfo->getActorCount();
diff --git a/engines/bladerunner/actor.h b/engines/bladerunner/actor.h
index 5f4884f..a7336b7 100644
--- a/engines/bladerunner/actor.h
+++ b/engines/bladerunner/actor.h
@@ -73,7 +73,7 @@ private:
 	int     _walkboxId;
 
 	int     _cluesLimit;
-	int     _timer4RemainDefault;
+	uint32  _timer4RemainDefault;
 
 	// Flags
 	bool _isTarget;
@@ -86,14 +86,14 @@ private:
 	bool _damageAnimIfMoving;
 
 	// Movement
-	bool _movementTrackPaused;
-	int  _movementTrackNextWaypointId;
-	int  _movementTrackNextDelay; // probably not used
-	int  _movementTrackNextAngle; // probably not used
-	bool _movementTrackNextRunning;
+	bool   _movementTrackPaused;
+	int    _movementTrackNextWaypointId;
+	uint32 _movementTrackNextDelay; // probably not used
+	int    _movementTrackNextAngle; // probably not used
+	bool   _movementTrackNextRunning;
 
-	int _movementTrackWalkingToWaypointId;
-	int _movementTrackDelayOnNextWaypoint;
+	int    _movementTrackWalkingToWaypointId;
+	uint32 _movementTrackDelayOnNextWaypoint;
 
 	// Animation
 	int _width;
@@ -110,8 +110,8 @@ private:
 	int _retiredWidth;
 	int _retiredHeight;
 
-	int _timersLeft[kActorTimers];
-	int _timersLast[kActorTimers];
+	uint32 _timersLeft[kActorTimers]; // this keeps time difference, and it is stored during save() (saveInt actually saves a uint32)
+	uint32 _timersLast[kActorTimers]; // this keeps actual time, and is not stored during save(), so it can be a uint32
 
 	float _scale;
 
@@ -143,11 +143,11 @@ public:
 	void setFPS(int fps);
 	void increaseFPS();
 
-	void timerStart(int timerId, int interval);
-	void timerReset(int timerId);
-	int  timerLeft(int timerId);
-	void timersUpdate();
-	void timerUpdate(int timerId);
+	void   timerStart(int timerId, uint32 interval);
+	void   timerReset(int timerId);
+	uint32 timerLeft(int timerId);
+	void   timersUpdate();
+	void   timerUpdate(int timerId);
 
 	void movementTrackNext(bool omitAiScript);
 	void movementTrackPause();
diff --git a/engines/bladerunner/actor_dialogue_queue.cpp b/engines/bladerunner/actor_dialogue_queue.cpp
index 627b0b1..31cb9ad 100644
--- a/engines/bladerunner/actor_dialogue_queue.cpp
+++ b/engines/bladerunner/actor_dialogue_queue.cpp
@@ -38,7 +38,7 @@ ActorDialogueQueue::Entry::Entry() {
 	isNotPause = false;
 	isPause = false;
 	actorId = -1;
-	delay = -1;
+	delay = (uint32)(-1);  // original was -1, int
 	sentenceId = -1;
 	animationMode = -1;
 }
@@ -62,13 +62,13 @@ void ActorDialogueQueue::add(int actorId, int sentenceId, int animationMode) {
 		entry.actorId = actorId;
 		entry.sentenceId = sentenceId;
 		entry.animationMode = animationMode;
-		entry.delay = -1;
+		entry.delay = (uint32)(-1);  // original was -1, int
 
 		_entries.push_back(entry);
 	}
 }
 
-void ActorDialogueQueue::addPause(int delay) {
+void ActorDialogueQueue::addPause(uint32 delay) {
 	if (_entries.size() < kMaxEntries) {
 		Entry entry;
 		entry.isNotPause = false;
@@ -96,8 +96,8 @@ void ActorDialogueQueue::flush(int a1, bool callScript) {
 	}
 	if (_isPause) {
 		_isPause = false;
-		_delay = 0;
-		_timeLast = 0;
+		_delay = 0u;
+		_timeLast = 0u;
 	}
 	clear();
 	if (callScript) {
@@ -116,23 +116,23 @@ bool ActorDialogueQueue::isEmpty() {
 	        && _sentenceId == -1 \
 	        && _animationMode == -1 \
 	        && _animationModePrevious == -1 \
-	        && _delay == 0 \
-	        && _timeLast == 0;
+	        && _delay == 0u \
+	        && _timeLast == 0u;
 }
 
 void ActorDialogueQueue::tick() {
 	if (!_vm->_audioSpeech->isPlaying()) {
 		if (_isPause) {
-			int time = _vm->_time->current();
-			int timeDiff = time - _timeLast;
+			uint32 time = _vm->_time->current();
+			uint32 timeDiff = time - _timeLast; // unsigned difference is intentional
 			_timeLast = time;
-			_delay -= timeDiff;
-			if (_delay > 0) {
+			_delay = ((int32)_delay == -1 || (_delay < timeDiff) ) ? 0u : (_delay - timeDiff);
+			if (_delay > 0u) {
 				return;
 			}
 			_isPause = false;
-			_delay = 0;
-			_timeLast = 0;
+			_delay = 0u;
+			_timeLast = 0u;
 			if (_entries.empty()) {
 				flush(0, true);
 			}
@@ -212,7 +212,7 @@ void ActorDialogueQueue::load(SaveFileReadStream &f) {
 		e.actorId = f.readInt();
 		e.sentenceId = f.readInt();
 		e.animationMode = f.readInt();
-		e.delay = f.readInt();
+		e.delay = (uint32)f.readInt();
 	}
 
 	f.skip((kMaxEntries - count) * 24);
@@ -223,9 +223,8 @@ void ActorDialogueQueue::load(SaveFileReadStream &f) {
 	_animationMode = f.readInt();
 	_animationModePrevious = f.readInt();
 	_isPause = f.readBool();
-	_delay = f.readInt();
-
-	_timeLast = 0;
+	_delay = (uint32)f.readInt();
+	_timeLast = 0u;
 }
 
 void ActorDialogueQueue::clear() {
@@ -236,8 +235,8 @@ void ActorDialogueQueue::clear() {
 	_animationMode = -1;
 	_animationModePrevious = -1;
 	_isPause = false;
-	_delay = 0;
-	_timeLast = 0;
+	_delay = 0u;
+	_timeLast = 0u;
 }
 
 } // End of namespace BladeRunner
diff --git a/engines/bladerunner/actor_dialogue_queue.h b/engines/bladerunner/actor_dialogue_queue.h
index bba900d..8ae3a0a 100644
--- a/engines/bladerunner/actor_dialogue_queue.h
+++ b/engines/bladerunner/actor_dialogue_queue.h
@@ -35,12 +35,12 @@ class ActorDialogueQueue {
 	static const uint kMaxEntries = 25;
 
 	struct Entry {
-		bool isNotPause;
-		bool isPause;
-		int actorId;
-		int sentenceId;
-		int animationMode;
-		int delay;
+		bool   isNotPause;
+		bool   isPause;
+		int    actorId;
+		int    sentenceId;
+		int    animationMode;
+		uint32 delay;
 
 		Entry();
 	};
@@ -54,15 +54,15 @@ class ActorDialogueQueue {
 	int                  _animationMode;
 	int                  _animationModePrevious;
 	bool                 _isPause;
-	int                  _delay;
-	int                  _timeLast;
+	uint32               _delay;
+	uint32               _timeLast;
 
 public:
 	ActorDialogueQueue(BladeRunnerEngine *vm);
 	~ActorDialogueQueue();
 
 	void add(int actorId, int sentenceId, int animationMode);
-	void addPause(int delay);
+	void addPause(uint32 delay);
 	void flush(int a1, bool callScript);
 	bool isEmpty();
 	void tick();
diff --git a/engines/bladerunner/ambient_sounds.cpp b/engines/bladerunner/ambient_sounds.cpp
index 7d0db47..8fe7a1c 100644
--- a/engines/bladerunner/ambient_sounds.cpp
+++ b/engines/bladerunner/ambient_sounds.cpp
@@ -67,7 +67,7 @@ static inline void sort(int &a, int &b) {
 
 void AmbientSounds::addSound(
 	int sfxId,
-	int timeMin, int timeMax,
+	uint32 timeMin, uint32 timeMax,
 	int volumeMin, int volumeMax,
 	int panStartMin, int panStartMax,
 	int panEndMin, int panEndMax,
@@ -101,7 +101,7 @@ void AmbientSounds::removeAllNonLoopingSounds(bool stopPlaying) {
 	}
 }
 
-void AmbientSounds::addSpeech(int actorId, int sentenceId, int timeMin, int timeMax, int volumeMin, int volumeMax, int panStartMin, int panStartMax, int panEndMin, int panEndMax, int priority, int unk) {
+void AmbientSounds::addSpeech(int actorId, int sentenceId, uint32 timeMin, uint32 timeMax, int volumeMin, int volumeMax, int panStartMin, int panStartMax, int panEndMin, int panEndMax, int priority, int unk) {
 	sort(volumeMin, volumeMax);
 	sort(panStartMin, panStartMax);
 	sort(panEndMin, panEndMax);
@@ -124,7 +124,7 @@ void AmbientSounds::playSpeech(int actorId, int sentenceId, int volume, int panS
 	_vm->_audioPlayer->playAud(name, volume * _ambientVolume / 100, panStart, panEnd, priority, kAudioPlayerOverrideVolume, Audio::Mixer::kSpeechSoundType);
 }
 
-void AmbientSounds::addLoopingSound(int sfxId, int volume, int pan, int delay) {
+void AmbientSounds::addLoopingSound(int sfxId, int volume, int pan, uint32 delay) {
 	const Common::String &name = _vm->_gameInfo->getSfxTrack(sfxId);
 	int32 hash = MIXArchive::getHash(name);
 
@@ -147,7 +147,7 @@ void AmbientSounds::addLoopingSound(int sfxId, int volume, int pan, int delay) {
 	int actualVolumeStart = volume * _ambientVolume / 100;
 	int actualVolumeEnd = actualVolumeStart;
 
-	if (delay > 0) {
+	if (delay > 0u) {
 		actualVolumeStart = 0;
 	}
 
@@ -162,7 +162,7 @@ void AmbientSounds::addLoopingSound(int sfxId, int volume, int pan, int delay) {
 	}
 }
 
-void AmbientSounds::adjustLoopingSound(int sfxId, int volume, int pan, int delay) {
+void AmbientSounds::adjustLoopingSound(int sfxId, int volume, int pan, uint32 delay) {
 	int32 hash = MIXArchive::getHash(_vm->_gameInfo->getSfxTrack(sfxId));
 	int index = findLoopingTrackByHash(hash);
 
@@ -178,7 +178,7 @@ void AmbientSounds::adjustLoopingSound(int sfxId, int volume, int pan, int delay
 	}
 }
 
-void AmbientSounds::removeLoopingSound(int sfxId, int delay) {
+void AmbientSounds::removeLoopingSound(int sfxId, uint32 delay) {
 	int32 hash = MIXArchive::getHash(_vm->_gameInfo->getSfxTrack(sfxId));
 	int index = findLoopingTrackByHash(hash);
 	if (index >= 0) {
@@ -186,7 +186,7 @@ void AmbientSounds::removeLoopingSound(int sfxId, int delay) {
 	}
 }
 
-void AmbientSounds::removeAllLoopingSounds(int delay) {
+void AmbientSounds::removeAllLoopingSounds(uint32 delay) {
 	for (int i = 0; i < kLoopingSounds; i++) {
 		removeLoopingSoundByIndex(i, delay);
 	}
@@ -198,7 +198,8 @@ void AmbientSounds::tick() {
 	for (int i = 0; i != kNonLoopingSounds; ++i) {
 		NonLoopingSound &track = _nonLoopingSounds[i];
 
-		if (!track.isActive || track.nextPlayTime > now) {
+		// unsigned difference is intentional
+		if (!track.isActive || now - track.nextPlayTimeStart < track.nextPlayTimeDiff) {
 			continue;
 		}
 
@@ -219,7 +220,8 @@ void AmbientSounds::tick() {
 															track.priority,
 															kAudioPlayerOverrideVolume);
 
-		track.nextPlayTime = now + _vm->_rnd.getRandomNumberRng(track.timeMin, track.timeMax);
+		track.nextPlayTimeStart = now;
+		track.nextPlayTimeDiff  = _vm->_rnd.getRandomNumberRng(track.timeMin, track.timeMax);
 	}
 }
 
@@ -229,13 +231,13 @@ void AmbientSounds::setVolume(int volume) {
 			if (_loopingSounds[i].isActive && _loopingSounds[i].audioPlayerTrack != -1) {
 				int newVolume = _loopingSounds[i].volume * volume / 100;
 				if (_vm->_audioPlayer->isActive(_loopingSounds[i].audioPlayerTrack)) {
-					_vm->_audioPlayer->adjustVolume(_loopingSounds[i].audioPlayerTrack, newVolume, 1, false);
+					_vm->_audioPlayer->adjustVolume(_loopingSounds[i].audioPlayerTrack, newVolume, 1u, false);
 				} else {
 					_loopingSounds[i].audioPlayerTrack = _vm->_audioPlayer->playAud(_loopingSounds[i].name, 1, _loopingSounds[i].pan, _loopingSounds[i].pan, 99, kAudioPlayerLoop | kAudioPlayerOverrideVolume);
 					if (_loopingSounds[i].audioPlayerTrack == -1) {
 						removeLoopingSound(i, 0);
 					} else {
-						_vm->_audioPlayer->adjustVolume(_loopingSounds[i].audioPlayerTrack, newVolume, 1, false);
+						_vm->_audioPlayer->adjustVolume(_loopingSounds[i].audioPlayerTrack, newVolume, 1u, false);
 					}
 				}
 			}
@@ -298,7 +300,7 @@ int AmbientSounds::findLoopingTrackByHash(int32 hash) const {
 
 void AmbientSounds::addSoundByName(
 	const Common::String &name,
-	int timeMin, int timeMax,
+	uint32 timeMin, uint32 timeMax,
 	int volumeMin, int volumeMax,
 	int panStartMin, int panStartMax,
 	int panEndMin, int panEndMax,
@@ -316,9 +318,10 @@ void AmbientSounds::addSoundByName(
 	track.isActive = true;
 	track.name = name;
 	track.hash = MIXArchive::getHash(name);
-	track.timeMin = 1000 * timeMin;
-	track.timeMax = 1000 * timeMax;
-	track.nextPlayTime = now + _vm->_rnd.getRandomNumberRng(track.timeMin, track.timeMax);
+	track.timeMin = 1000u * timeMin;
+	track.timeMax = 1000u * timeMax;
+	track.nextPlayTimeStart = now;
+	track.nextPlayTimeDiff  = _vm->_rnd.getRandomNumberRng(track.timeMin, track.timeMax);
 	track.volumeMin = volumeMin;
 	track.volumeMax = volumeMax;
 	track.volume = 0;
@@ -341,10 +344,10 @@ void AmbientSounds::removeNonLoopingSoundByIndex(int index, bool stopPlaying) {
 	//	track.field_45 = 0;
 }
 
-void AmbientSounds::removeLoopingSoundByIndex(int index, int delay) {
+void AmbientSounds::removeLoopingSoundByIndex(int index, uint32 delay) {
 	LoopingSound &track = _loopingSounds[index];
 	if (track.isActive && track.audioPlayerTrack != -1 && _vm->_audioPlayer->isActive(track.audioPlayerTrack)) {
-		if (delay > 0) {
+		if (delay > 0u) {
 			_vm->_audioPlayer->adjustVolume(track.audioPlayerTrack, 0, delay, false);
 		} else {
 			_vm->_audioPlayer->stop(track.audioPlayerTrack, false);
@@ -409,10 +412,11 @@ void AmbientSounds::load(SaveFileReadStream &f) {
 		track.hash = f.readSint32LE();
 		f.skip(4); // track.audioPlayerTrack is not used after load
 		track.audioPlayerTrack = -1;
-		track.timeMin = f.readInt();
-		track.timeMax = f.readInt();
+		track.timeMin = (uint32)f.readInt();
+		track.timeMax = (uint32)f.readInt();
 		f.skip(4); // track.nextPlayTime is not used after load
-		track.nextPlayTime = now + _vm->_rnd.getRandomNumberRng(track.timeMin, track.timeMax);
+		track.nextPlayTimeStart = now;
+		track.nextPlayTimeDiff  = _vm->_rnd.getRandomNumberRng(track.timeMin, track.timeMax);
 		track.volumeMin = f.readInt();
 		track.volumeMax = f.readInt();
 		track.volume = f.readInt();
@@ -442,7 +446,7 @@ void AmbientSounds::load(SaveFileReadStream &f) {
 			if (track.audioPlayerTrack == -1) {
 				removeLoopingSoundByIndex(i, 0);
 			} else {
-				_vm->_audioPlayer->adjustVolume(track.audioPlayerTrack, _ambientVolume * track.volume / 100, 2, false);
+				_vm->_audioPlayer->adjustVolume(track.audioPlayerTrack, _ambientVolume * track.volume / 100, 2u, false);
 			}
 		}
 	}
diff --git a/engines/bladerunner/ambient_sounds.h b/engines/bladerunner/ambient_sounds.h
index 06144d6..73b8e75 100644
--- a/engines/bladerunner/ambient_sounds.h
+++ b/engines/bladerunner/ambient_sounds.h
@@ -42,9 +42,10 @@ class AmbientSounds {
 		Common::String name;
 		int32          hash;
 		int            audioPlayerTrack;
-		int            timeMin;
-		int            timeMax;
-		uint32         nextPlayTime;
+		uint32         timeMin;
+		uint32         timeMax;
+		uint32         nextPlayTimeStart;
+		uint32         nextPlayTimeDiff;
 		int            volumeMin;
 		int            volumeMax;
 		int            volume;
@@ -76,7 +77,7 @@ public:
 
 	void addSound(
 		int sfxId,
-		int timeMin, int timeMax,
+		uint32 timeMin, uint32 timeMax,
 		int volumeMin, int volumeMax,
 		int panStartMin, int panStartMax,
 		int panEndMin, int panEndMax,
@@ -87,7 +88,7 @@ public:
 
 	void addSpeech(
 		int actorId, int sentenceId,
-		int timeMin, int timeMax,
+		uint32 timeMin, uint32 timeMax,
 		int volumeMin, int volumeMax,
 		int panStartMin, int panStartMax,
 		int panEndMin, int panEndMax,
@@ -95,12 +96,12 @@ public:
 	void playSound(int sfxId, int volume, int panStart, int panEnd, int priority);
 	void playSpeech(int actorId, int sentenceId, int volume, int panStart, int panEnd, int priority);
 
-	void addLoopingSound(int sfxId, int volume, int pan, int delay);
-	void adjustLoopingSound(int sfxId, int volume, int pan, int delay);
+	void addLoopingSound(int sfxId, int volume, int pan, uint32 delay);
+	void adjustLoopingSound(int sfxId, int volume, int pan, uint32 delay);
 	// it seems there is little confusion in original code about delay parameter,
 	// sometimes it is used as boolean in same way as stopPlaying from non looping
-	void removeLoopingSound(int sfxId, int delay);
-	void removeAllLoopingSounds(int delay);
+	void removeLoopingSound(int sfxId, uint32 delay);
+	void removeAllLoopingSounds(uint32 delay);
 
 	void tick();
 
@@ -120,14 +121,14 @@ private:
 
 	void addSoundByName(
 		const Common::String &name,
-		int timeMin, int timeMax,
+		uint32 timeMin, uint32 timeMax,
 		int volumeMin, int volumeMax,
 		int panStartMin, int panStartMax,
 		int panEndMin, int panEndMax,
 		int priority, int unk);
 
 	void removeNonLoopingSoundByIndex(int index, bool stopPlaying);
-	void removeLoopingSoundByIndex(int index, int delay);
+	void removeLoopingSoundByIndex(int index, uint32 delay);
 };
 
 } // End of namespace BladeRunner
diff --git a/engines/bladerunner/audio_mixer.cpp b/engines/bladerunner/audio_mixer.cpp
index df3a361..c31ade8 100644
--- a/engines/bladerunner/audio_mixer.cpp
+++ b/engines/bladerunner/audio_mixer.cpp
@@ -28,7 +28,6 @@
 #include "audio/mixer.h"
 
 #include "common/timer.h"
-//#include "common/debug.h"
 
 namespace BladeRunner {
 
@@ -37,7 +36,7 @@ AudioMixer::AudioMixer(BladeRunnerEngine *vm) {
 	for (int i = 0; i < kChannels; i++) {
 		_channels[i].isPresent = false;
 	}
-	_vm->getTimerManager()->installTimerProc(timerCallback, (1000 / kUpdatesPerSecond) * 1000 , this, "BladeRunnerAudioMixerTimer");
+	_vm->getTimerManager()->installTimerProc(timerCallback, (1000 / kUpdatesPerSecond) * 1000, this, "BladeRunnerAudioMixerTimer");
 }
 
 AudioMixer::~AudioMixer() {
@@ -82,7 +81,7 @@ int AudioMixer::playMusic(Audio::RewindableAudioStream *stream, int volume, void
 	return playInChannel(kMusicChannel, Audio::Mixer::kMusicSoundType, stream, 100, false, volume, 0, endCallback, callbackData);
 }
 
-void AudioMixer::stop(int channel, int time) {
+void AudioMixer::stop(int channel, uint32 time) {
 	Common::StackLock lock(_mutex);
 
 	if (_channels[channel].isPresent) {
@@ -139,7 +138,7 @@ void AudioMixer::timerCallback(void *self) {
 	((AudioMixer *)self)->tick();
 }
 
-void AudioMixer::adjustVolume(int channel, int newVolume, int time) {
+void AudioMixer::adjustVolume(int channel, int newVolume, uint32 time) {
 	Common::StackLock lock(_mutex);
 
 	if (_channels[channel].isPresent) {
@@ -148,7 +147,7 @@ void AudioMixer::adjustVolume(int channel, int newVolume, int time) {
 	}
 }
 
-void AudioMixer::adjustPan(int channel, int newPan, int time) {
+void AudioMixer::adjustPan(int channel, int newPan, uint32 time) {
 	Common::StackLock lock(_mutex);
 
 	if (_channels[channel].isPresent) {
diff --git a/engines/bladerunner/audio_mixer.h b/engines/bladerunner/audio_mixer.h
index bb43d57..46467c6 100644
--- a/engines/bladerunner/audio_mixer.h
+++ b/engines/bladerunner/audio_mixer.h
@@ -71,13 +71,13 @@ public:
 
 	int play(Audio::Mixer::SoundType type, Audio::RewindableAudioStream *stream, int priority, bool loop, int volume, int pan, void(*endCallback)(int, void *), void *callbackData);
 	int playMusic(Audio::RewindableAudioStream *stream, int volume, void(*endCallback)(int, void *), void *callbackData);
-	void stop(int channel, int delay);
+	void stop(int channel, uint32 delay);
 
-	void adjustVolume(int channel, int newVolume, int time);
-	void adjustPan(int channel, int newPan, int time);
+	void adjustVolume(int channel, int newVolume, uint32 time);
+	void adjustPan(int channel, int newPan, uint32 time);
 
-	void resume(int channel, int delay);
-	void pause(int channel, int delay);
+	void resume(int channel, uint32 delay);
+	void pause(int channel, uint32 delay);
 
 private:
 	int playInChannel(int channel, Audio::Mixer::SoundType type, Audio::RewindableAudioStream *stream, int priority, bool loop, int volume, int pan, void(*endCallback)(int, void *), void *callbackData);
diff --git a/engines/bladerunner/audio_player.cpp b/engines/bladerunner/audio_player.cpp
index 4fb2fef..e5045f0 100644
--- a/engines/bladerunner/audio_player.cpp
+++ b/engines/bladerunner/audio_player.cpp
@@ -66,7 +66,7 @@ void AudioPlayer::stopAll() {
 	}
 }
 
-void AudioPlayer::adjustVolume(int track, int volume, int delay, bool overrideVolume) {
+void AudioPlayer::adjustVolume(int track, int volume, uint32 delay, bool overrideVolume) {
 	if (track < 0 || track >= kTracks || !_tracks[track].isActive || _tracks[track].channel == -1) {
 		return;
 	}
@@ -77,16 +77,16 @@ void AudioPlayer::adjustVolume(int track, int volume, int delay, bool overrideVo
 	}
 
 	_tracks[track].volume = actualVolume;
-	_vm->_audioMixer->adjustVolume(_tracks[track].channel, actualVolume, 60 * delay);
+	_vm->_audioMixer->adjustVolume(_tracks[track].channel, actualVolume, 60u * delay);
 }
 
-void AudioPlayer::adjustPan(int track, int pan, int delay) {
+void AudioPlayer::adjustPan(int track, int pan, uint32 delay) {
 	if (track < 0 || track >= kTracks || !_tracks[track].isActive || _tracks[track].channel == -1) {
 		return;
 	}
 
 	_tracks[track].pan = pan;
-	_vm->_audioMixer->adjustPan(_tracks[track].channel, pan, 60 * delay);
+	_vm->_audioMixer->adjustPan(_tracks[track].channel, pan, 60u * delay);
 }
 
 void AudioPlayer::setVolume(int volume) {
diff --git a/engines/bladerunner/audio_player.h b/engines/bladerunner/audio_player.h
index a1823b7..bb6f3f3 100644
--- a/engines/bladerunner/audio_player.h
+++ b/engines/bladerunner/audio_player.h
@@ -70,8 +70,8 @@ public:
 	bool isActive(int track) const;
 	void stop(int track, bool immediately);
 	void stopAll();
-	void adjustVolume(int track, int volume, int delay, bool overrideVolume);
-	void adjustPan(int track, int pan, int delay);
+	void adjustVolume(int track, int volume, uint32 delay, bool overrideVolume);
+	void adjustPan(int track, int pan, uint32 delay);
 
 	void setVolume(int volume);
 	int getVolume() const;
diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp
index 412ef1d..094d27e 100644
--- a/engines/bladerunner/bladerunner.cpp
+++ b/engines/bladerunner/bladerunner.cpp
@@ -584,7 +584,7 @@ bool BladeRunnerEngine::startup(bool hasSavegames) {
 	_playerActor = _actors[_gameInfo->getPlayerId()];
 
 	_playerActor->setFPS(15);
-	_playerActor->timerStart(kActorTimerRunningStaminaFPS, 200);
+	_playerActor->timerStart(kActorTimerRunningStaminaFPS, 200u);
 
 	_policeMaze = new PoliceMaze(this);
 
@@ -1108,7 +1108,7 @@ void BladeRunnerEngine::gameTick() {
 void BladeRunnerEngine::actorsUpdate() {
 #if BLADERUNNER_ORIGINAL_BUGS
 #else
-	int timeNow = _time->current();
+	uint32 timeNow = _time->current();
 	// Don't update actors more than 60 times per second
 	if (timeNow - _actorUpdateTimeLast < 1000 / 60) {
 		return;
@@ -1321,9 +1321,10 @@ void BladeRunnerEngine::handleMouseAction(int x, int y, bool mainButton, bool bu
 	x = CLIP(x, 0, 639);
 	y = CLIP(y, 0, 479);
 
-	int timeNow = _time->current();
+	uint32 timeNow = _time->current();
 
 	if (buttonDown) {
+		// unsigned difference is intentional
 		_mouseClickTimeDiff = timeNow - _mouseClickTimeLast;
 		_mouseClickTimeLast = timeNow;
 	}
@@ -1964,8 +1965,9 @@ void BladeRunnerEngine::playerDied() {
 	_audioSpeech->stopSpeech();
 #endif // BLADERUNNER_ORIGINAL_BUGS
 
-	int timeWaitEnd = _time->current() + 5000;
-	while (_time->current() < timeWaitEnd) {
+	uint32 timeWaitStart = _time->current();
+	// unsigned difference is intentional
+	while (_time->current() - timeWaitStart < 5000u) {
 		gameTick();
 	}
 
diff --git a/engines/bladerunner/bladerunner.h b/engines/bladerunner/bladerunner.h
index ceff3d7..3293741 100644
--- a/engines/bladerunner/bladerunner.h
+++ b/engines/bladerunner/bladerunner.h
@@ -36,9 +36,9 @@
 #include "graphics/surface.h"
 
 //TODO: change this to debugflag
-#define BLADERUNNER_DEBUG_CONSOLE 0
+#define BLADERUNNER_DEBUG_CONSOLE     0
 #define BLADERUNNER_ORIGINAL_SETTINGS 0
-#define BLADERUNNER_ORIGINAL_BUGS 0
+#define BLADERUNNER_ORIGINAL_BUGS     0
 
 namespace Common {
 struct Event;
@@ -108,13 +108,16 @@ class ZBuffer;
 class BladeRunnerEngine : public Engine {
 public:
 	static const int kArchiveCount = 12; // +2 to original value (10) to accommodate for SUBTITLES.MIX and one extra resource file, to allow for capability of loading all VQAx.MIX and the MODE.MIX file (debug purposes)
-	static const int kActorCount = 100;
+	static const int kActorCount =  100;
 	static const int kActorVoiceOver = kActorCount - 1;
 	// Incremental number to keep track of significant revisions of the ScummVM bladerunner engine
 	// that could potentially introduce incompatibilities with old save files or require special actions to restore compatibility
 	// This is stored in game global variable "kVariableGameVersion"
 	// Original (classic) save game files will have version number of 0
-	static const int kBladeRunnerScummVMVersion = 1; // 1: alpha testing (since May 15, 2019)
+	// Values:
+	// 1: alpha testing (from May 15, 2019 to July 17, 2019)
+	// 2: all time code uses uint32 (since July 17 2019),
+	static const int kBladeRunnerScummVMVersion = 2;
 
 	bool _gameIsRunning;
 	bool _windowIsActive;
@@ -214,8 +217,8 @@ public:
 	int _walkSoundPan;
 	int _runningActorId;
 
-	int _mouseClickTimeLast;
-	int _mouseClickTimeDiff;
+	uint32 _mouseClickTimeLast;
+	uint32 _mouseClickTimeDiff;
 
 	int  _walkingToExitId;
 	bool _isInsideScriptExit;
@@ -232,8 +235,8 @@ public:
 	int  _walkingToActorId;
 	bool _isInsideScriptActor;
 
-	int _actorUpdateCounter;
-	int _actorUpdateTimeLast;
+	int    _actorUpdateCounter;
+	uint32 _actorUpdateTimeLast;
 
 private:
 	MIXArchive _archives[kArchiveCount];
diff --git a/engines/bladerunner/debugger.cpp b/engines/bladerunner/debugger.cpp
index cd34aff..0951e4c 100644
--- a/engines/bladerunner/debugger.cpp
+++ b/engines/bladerunner/debugger.cpp
@@ -858,12 +858,12 @@ bool Debugger::cmdTimer(int argc, const char **argv) {
 		if (value == 0) {
 			actor->timerReset(timer);
 		} else {
-			actor->timerStart(timer, value);
+			actor->timerStart(timer, (uint32)value);
 		}
 	}
 
 	for (int i = 0; i < 7; ++i) {
-		debugPrintf("actorTimer(%i, %i) = %i ms\n", actorId, i, actor->timerLeft(i));
+		debugPrintf("actorTimer(%i, %i) = %u ms\n", actorId, i, actor->timerLeft(i));
 	}
 
 	return true;
diff --git a/engines/bladerunner/item_pickup.cpp b/engines/bladerunner/item_pickup.cpp
index 797fc7c..cf1ade0 100644
--- a/engines/bladerunner/item_pickup.cpp
+++ b/engines/bladerunner/item_pickup.cpp
@@ -46,7 +46,7 @@ void ItemPickup::setup(int animationId, int screenX, int screenY) {
 	_animationId = animationId;
 	_animationFrame = 0;
 	_facing = 0.0;
-	_timeLeft = 3000;
+	_timeLeft = 3000u;
 	_scale = 0;
 	_screenX = CLIP(screenX, 40, 600);
 	_screenY = CLIP(screenY, 40, 440);
@@ -68,24 +68,25 @@ void ItemPickup::reset() {
 	_facing = 0.0f;
 	_scale = 1.0f;
 	_animationFrame = 0;
-	_timeLeft = 0;
-	_timeLast = 0;
+	_timeLeft = 0u;
+	_timeLast = 0u;
 }
 
 void ItemPickup::tick() {
-	if (_timeLeft == 0) {
+	if (_timeLeft == 0u) {
 		return;
 	}
 
-	int timeNow = _vm->_time->currentSystem();
-	int timeDiff = timeNow - _timeLast;
+	uint32 timeNow = _vm->_time->currentSystem();
+	// unsigned difference is intentional
+	uint32 timeDiff = timeNow - _timeLast;
 	_timeLast = timeNow;
-	timeDiff = MIN(MIN(timeDiff, 67), _timeLeft);
-	_timeLeft -= timeDiff;
+	timeDiff = MIN(MIN(timeDiff, 67u), _timeLeft);
+	_timeLeft = (_timeLeft < timeDiff) ? 0 : (_timeLeft - timeDiff);
 
-	if (_timeLeft >= 2000) {
+	if (_timeLeft >= 2000u) {
 		_scale = 1.0f - (((2000.0f - _timeLeft) / 1000.0f) * ((2000.0f - _timeLeft) / 1000.0f));
-	} else if (_timeLeft < 1000) {
+	} else if (_timeLeft < 1000u) {
 		_scale = 1.0f - (((1000.0f - _timeLeft) / 1000.0f) * ((1000.0f - _timeLeft) / 1000.0f));
 	} else {
 		_scale = 1.0f;
@@ -101,7 +102,7 @@ void ItemPickup::tick() {
 }
 
 void ItemPickup::draw() {
-	if (_timeLeft == 0) {
+	if (_timeLeft == 0u) {
 		return;
 	}
 
diff --git a/engines/bladerunner/item_pickup.h b/engines/bladerunner/item_pickup.h
index 0328bf4..3a7595e 100644
--- a/engines/bladerunner/item_pickup.h
+++ b/engines/bladerunner/item_pickup.h
@@ -40,8 +40,8 @@ class ItemPickup {
 	float        _facing;
 	float        _scale;
 	int          _animationFrame;
-	int          _timeLeft;
-	int          _timeLast;
+	uint32       _timeLeft;
+	uint32       _timeLast;
 	Common::Rect _screenRect;
 
 public:
diff --git a/engines/bladerunner/movement_track.cpp b/engines/bladerunner/movement_track.cpp
index 322d92e..e5ccd2f 100644
--- a/engines/bladerunner/movement_track.cpp
+++ b/engines/bladerunner/movement_track.cpp
@@ -41,17 +41,17 @@ void MovementTrack::reset() {
 	_paused = false;
 	for (int i = 0; i < kSize; i++) {
 		_entries[i].waypointId = -1;
-		_entries[i].delay = -1;
+		_entries[i].delay = (uint32)(-1);  // original was -1, int
 		_entries[i].angle = -1;
 		_entries[i].run = false;
 	}
 }
 
-int MovementTrack::append(int waypointId, int delay, bool run) {
+int MovementTrack::append(int waypointId, uint32 delay, bool run) {
 	return append(waypointId, delay, -1, run);
 }
 
-int MovementTrack::append(int waypointId, int delay, int angle, bool run) {
+int MovementTrack::append(int waypointId, uint32 delay, int angle, bool run) {
 	if (_lastIndex >= kSize) {
 		return 0;
 	}
@@ -92,7 +92,7 @@ bool MovementTrack::hasNext() const {
 	return _hasNext;
 }
 
-bool MovementTrack::next(int *waypointId, int *delay, int *angle, bool *run) {
+bool MovementTrack::next(int *waypointId, uint32 *delay, int *angle, bool *run) {
 	if (_currentIndex < _lastIndex && _hasNext) {
 		*waypointId = _entries[_currentIndex].waypointId;
 		*delay = _entries[_currentIndex].delay;
@@ -101,7 +101,7 @@ bool MovementTrack::next(int *waypointId, int *delay, int *angle, bool *run) {
 		return true;
 	} else {
 		*waypointId = -1;
-		*delay = -1;
+		*delay = (uint32)(-1); // original was -1, int
 		*angle = -1;
 		*run = false;
 		_hasNext = false;
@@ -131,7 +131,7 @@ void MovementTrack::load(SaveFileReadStream &f) {
 	for (int i = 0; i < kSize; ++i) {
 		Entry &e = _entries[i];
 		e.waypointId = f.readInt();
-		e.delay = f.readInt();
+		e.delay = (uint32)f.readInt();
 		e.angle = f.readInt();
 		e.run = f.readBool();
 	}
diff --git a/engines/bladerunner/movement_track.h b/engines/bladerunner/movement_track.h
index 2eab4cd..4dd20f6 100644
--- a/engines/bladerunner/movement_track.h
+++ b/engines/bladerunner/movement_track.h
@@ -36,10 +36,10 @@ class MovementTrack {
 	static const int kSize = 100;
 
 	struct Entry {
-		int  waypointId;
-		int  delay;
-		int  angle;
-		bool run;
+		int     waypointId;
+		uint32  delay;
+		int     angle;
+		bool    run;
 	};
 
 	int   _currentIndex;
@@ -51,15 +51,15 @@ class MovementTrack {
 public:
 	MovementTrack();
 	~MovementTrack();
-	int append(int waypointId, int delay, bool run);
-	int append(int waypointId, int delay, int angle, bool run);
+	int append(int waypointId, uint32 delay, bool run);
+	int append(int waypointId, uint32 delay, int angle, bool run);
 	void flush();
 	void repeat();
 	void pause();
 	void unpause();
 	bool isPaused() const;
 	bool hasNext() const;
-	bool next(int *waypointId, int *delay, int *angle, bool *run);
+	bool next(int *waypointId, uint32 *delay, int *angle, bool *run);
 
 	void save(SaveFileWriteStream &f);
 	void load(SaveFileReadStream &f);
diff --git a/engines/bladerunner/music.cpp b/engines/bladerunner/music.cpp
index 081d9c1..59a4e5e 100644
--- a/engines/bladerunner/music.cpp
+++ b/engines/bladerunner/music.cpp
@@ -30,7 +30,6 @@
 #include "bladerunner/game_constants.h"
 
 #include "common/timer.h"
-
 namespace BladeRunner {
 
 Music::Music(BladeRunnerEngine *vm) {
@@ -55,7 +54,7 @@ Music::~Music() {
 	_vm->getTimerManager()->removeTimerProc(timerCallbackNext);
 }
 
-bool Music::play(const Common::String &trackName, int volume, int pan, int timeFadeIn, int timePlay, int loop, int timeFadeOut) {
+bool Music::play(const Common::String &trackName, int volume, int pan, uint32 timeFadeIn, uint32 timePlay, int loop, uint32 timeFadeOut) {
 	//Common::StackLock lock(_mutex);
 
 	if (_musicVolume <= 0) {
@@ -64,7 +63,7 @@ bool Music::play(const Common::String &trackName, int volume, int pan, int timeF
 
 	int volumeAdjusted = volume * _musicVolume / 100;
 	int volumeStart = volumeAdjusted;
-	if (timeFadeIn > 0) {
+	if ((int32)timeFadeIn != -1 && timeFadeIn > 0u) {
 		volumeStart = 1;
 	}
 
@@ -105,14 +104,14 @@ bool Music::play(const Common::String &trackName, int volume, int pan, int timeF
 
 		return false;
 	}
-	if (timeFadeIn > 0) {
+	if ((int32)timeFadeIn != -1 && timeFadeIn > 0u) {
 		adjustVolume(volumeAdjusted, timeFadeIn);
 	}
 	_current.name = trackName;
-	if (timePlay > 0) {
+	if ((int32)timePlay != -1 && timePlay > 0u) {
 		_vm->getTimerManager()->removeTimerProc(timerCallbackFadeOut);
 		_vm->getTimerManager()->installTimerProc(timerCallbackFadeOut, timePlay * 1000 * 1000, this, "BladeRunnerMusicFadeoutTimer");
-	} else if (timeFadeOut > 0) {
+	} else if ((int32)timeFadeOut != -1 && timeFadeOut > 0u) {
 		_vm->getTimerManager()->removeTimerProc(timerCallbackFadeOut);
 		_vm->getTimerManager()->installTimerProc(timerCallbackFadeOut, (_stream->getLength() - timeFadeOut * 1000) * 1000, this, "BladeRunnerMusicFadeoutTimer");
 	}
@@ -126,7 +125,7 @@ bool Music::play(const Common::String &trackName, int volume, int pan, int timeF
 	return true;
 }
 
-void Music::stop(int delay) {
+void Music::stop(uint32 delay) {
 	Common::StackLock lock(_mutex);
 
 	if (_channel < 0) {
@@ -139,10 +138,10 @@ void Music::stop(int delay) {
 #endif
 
 	_current.loop = false;
-	_vm->_audioMixer->stop(_channel, 60 * delay);
+	_vm->_audioMixer->stop(_channel, 60u * delay);
 }
 
-void Music::adjust(int volume, int pan, int delay) {
+void Music::adjust(int volume, int pan, uint32 delay) {
 	if (volume != -1) {
 		adjustVolume(_musicVolume * volume/ 100, delay);
 	}
@@ -201,17 +200,17 @@ void Music::load(SaveFileReadStream &f) {
 	_current.name = f.readStringSz(13);
 	_current.volume = f.readInt();
 	_current.pan = f.readInt();
-	_current.timeFadeIn = f.readInt();
-	_current.timePlay = f.readInt();
+	_current.timeFadeIn = (uint32)f.readInt();
+	_current.timePlay = (uint32)f.readInt();
 	_current.loop = f.readInt();
-	_current.timeFadeOut = f.readInt();
+	_current.timeFadeOut = (uint32)f.readInt();
 	_next.name = f.readStringSz(13);
 	_next.volume = f.readInt();
 	_next.pan = f.readInt();
-	_next.timeFadeIn = f.readInt();
-	_next.timePlay = f.readInt();
+	_next.timeFadeIn = (uint32)f.readInt();
+	_next.timePlay = (uint32)f.readInt();
 	_next.loop = f.readInt();
-	_next.timeFadeOut = f.readInt();
+	_next.timeFadeOut = (uint32)f.readInt();
 
 	stop(2);
 	if (_isPlaying) {
@@ -236,13 +235,13 @@ void Music::load(SaveFileReadStream &f) {
 	}
 }
 
-void Music::adjustVolume(int volume, int delay) {
+void Music::adjustVolume(int volume, uint32 delay) {
 	if (_channel >= 0) {
 		_vm->_audioMixer->adjustVolume(_channel, volume, delay);
 	}
 }
 
-void Music::adjustPan(int pan, int delay) {
+void Music::adjustPan(int pan, uint32 delay) {
 	if (_channel >= 0) {
 		_vm->_audioMixer->adjustPan(_channel, pan, delay);
 	}
@@ -263,7 +262,7 @@ void Music::ended() {
 void Music::fadeOut() {
 	_vm->getTimerManager()->removeTimerProc(timerCallbackFadeOut);
 	if (_channel >= 0) {
-		_vm->_audioMixer->stop(_channel, 60 * _current.timeFadeOut);
+		_vm->_audioMixer->stop(_channel, 60u * _current.timeFadeOut);
 	}
 }
 
diff --git a/engines/bladerunner/music.h b/engines/bladerunner/music.h
index b4dc284..0717544 100644
--- a/engines/bladerunner/music.h
+++ b/engines/bladerunner/music.h
@@ -38,10 +38,10 @@ class Music {
 		Common::String name;
 		int            volume;
 		int            pan;
-		int            timeFadeIn;
-		int            timePlay;
+		uint32         timeFadeIn;
+		uint32         timePlay;
 		int            loop;
-		int            timeFadeOut;
+		uint32         timeFadeOut;
 	};
 
 	BladeRunnerEngine *_vm;
@@ -61,9 +61,9 @@ public:
 	Music(BladeRunnerEngine *vm);
 	~Music();
 
-	bool play(const Common::String &trackName, int volume, int pan, int timeFadeIn, int timePlay, int loop, int timeFadeOut);
-	void stop(int delay);
-	void adjust(int volume, int pan, int delay);
+	bool play(const Common::String &trackName, int volume, int pan, uint32 timeFadeIn, uint32 timePlay, int loop, uint32 timeFadeOut);
+	void stop(uint32 delay);
+	void adjust(int volume, int pan, uint32 delay);
 	bool isPlaying();
 
 	void setVolume(int volume);
@@ -74,8 +74,8 @@ public:
 	void load(SaveFileReadStream &f);
 
 private:
-	void adjustVolume(int volume, int delay);
-	void adjustPan(int pan, int delay);
+	void adjustVolume(int volume, uint32 delay);
+	void adjustPan(int pan, uint32 delay);
 
 	void ended();
 	void fadeOut();
diff --git a/engines/bladerunner/savefile.cpp b/engines/bladerunner/savefile.cpp
index 3caf3bd..cf55cb0 100644
--- a/engines/bladerunner/savefile.cpp
+++ b/engines/bladerunner/savefile.cpp
@@ -190,7 +190,7 @@ void SaveFileWriteStream::padBytes(int count) {
 	}
 }
 
-void SaveFileWriteStream::writeInt(int v) {
+void SaveFileWriteStream::writeInt(int32 v) {
 	writeUint32LE(v);
 }
 
@@ -248,7 +248,7 @@ void SaveFileWriteStream::writeBoundingBox(const BoundingBox &v, bool serialized
 
 SaveFileReadStream::SaveFileReadStream(Common::SeekableReadStream &s) : _s(s) {}
 
-int SaveFileReadStream::readInt() {
+int32 SaveFileReadStream::readInt() {
 	return readUint32LE();
 }
 
diff --git a/engines/bladerunner/savefile.h b/engines/bladerunner/savefile.h
index b3a5f25..de5ca4b 100644
--- a/engines/bladerunner/savefile.h
+++ b/engines/bladerunner/savefile.h
@@ -94,7 +94,7 @@ public:
 
 	void padBytes(int count);
 
-	void writeInt(int v);
+	void writeInt(int v); // this writes a 4 byte int (uses writeUint32LE)
 	void writeFloat(float v);
 	void writeBool(bool v);
 	void writeStringSz(const Common::String &s, uint sz);
diff --git a/engines/bladerunner/script/police_maze.cpp b/engines/bladerunner/script/police_maze.cpp
index 68e2b67..028eca0 100644
--- a/engines/bladerunner/script/police_maze.cpp
+++ b/engines/bladerunner/script/police_maze.cpp
@@ -120,10 +120,10 @@ void PoliceMaze::setPauseState(bool state) {
 	warning("PAUSE: %d", state);
 	_isPaused = state;
 
-	uint32 t = _vm->_time->current();
+	uint32 timeNow = _vm->_time->current();
 
 	for (int i = 0; i < kNumMazeTracks; i++) {
-		_tracks[i]->setTime(t);
+		_tracks[i]->setTime(timeNow);
 	}
 }
 
@@ -256,8 +256,8 @@ bool PoliceMazeTargetTrack::tick() {
 
 	uint32 oldTime = _time;
 	_time = _vm->_time->current();
-	int32 timeDiff = _time - oldTime;
-	_timeLeftUpdate -= timeDiff;
+	uint32 timeDiff = _time - oldTime;  // unsigned difference is intentional
+	_timeLeftUpdate = _timeLeftUpdate - (int32)timeDiff; // should be ok
 
 	if (_timeLeftUpdate > 0) {
 		return false;
@@ -265,8 +265,9 @@ bool PoliceMazeTargetTrack::tick() {
 
 #if BLADERUNNER_ORIGINAL_BUGS
 #else
+	// here _timeLeftUpdate is <= 0
 	if (_vm->_settings->getDifficulty() > kGameDifficultyEasy) {
-		timeDiff = 0 - _timeLeftUpdate;
+		timeDiff = abs(_timeLeftUpdate);
 	}
 #endif // BLADERUNNER_ORIGINAL_BUGS
 	_timeLeftUpdate = 66; // update the target track 15 times per second
@@ -282,7 +283,7 @@ bool PoliceMazeTargetTrack::tick() {
 		if (_vm->_settings->getDifficulty() == kGameDifficultyEasy) {
 			_timeLeftWait -= timeDiff; // original behavior
 		} else {
-			_timeLeftWait -= (timeDiff + _timeLeftUpdate); // this deducts an amount >= 66
+			_timeLeftWait = _timeLeftWait - (int32)(timeDiff + _timeLeftUpdate); // this deducts an amount >= 66 // should be ok
 		}
 #endif // BLADERUNNER_ORIGINAL_BUGS
 		if (_timeLeftWait > 0) {
diff --git a/engines/bladerunner/script/script.cpp b/engines/bladerunner/script/script.cpp
index a0c27ae..d0355d3 100644
--- a/engines/bladerunner/script/script.cpp
+++ b/engines/bladerunner/script/script.cpp
@@ -343,7 +343,7 @@ void ScriptBase::Actor_Says_With_Pause(int actorId, int sentenceId, float pause,
 	}
 
 	if (pause > 0.0f && !_vm->_actorSpeakStopIsRequested) {
-		Delay(pause * 1000);
+		Delay(pause * 1000u);
 	}
 
 	Player_Gains_Control();
@@ -929,11 +929,12 @@ int ScriptBase::Animation_Skip_To_Frame() {
 	return 0;
 }
 
-void ScriptBase::Delay(int miliseconds) {
-	debugC(kDebugScript, "Delay(%d)", miliseconds);
+void ScriptBase::Delay(uint32 miliseconds) {
+	debugC(kDebugScript, "Delay(%u)", miliseconds);
 	Player_Loses_Control();
-	int endTime = _vm->_time->current() + miliseconds;
-	while (_vm->_gameIsRunning && (_vm->_time->current() < endTime)) {
+	uint32 startTime = _vm->_time->current();
+	// unsigned difference is intentional
+	while (_vm->_gameIsRunning && (_vm->_time->current() - startTime < miliseconds)) {
 		_vm->gameTick();
 	}
 	Player_Gains_Control();
@@ -1138,18 +1139,18 @@ void ScriptBase::Footstep_Sound_Override_Off() {
 	_vm->_scene->_set->resetFoodstepSoundOverride();
 }
 
-bool ScriptBase::Music_Play(int musicId, int volume, int pan, int timeFadeIn, int timePlay, int loop, int timeFadeOut) {
-	debugC(kDebugScript, "Music_Play(%d, %d, %d, %d, %d, %d, %d)", musicId, volume, pan, timeFadeIn, timePlay, loop, timeFadeOut);
+bool ScriptBase::Music_Play(int musicId, int volume, int pan, uint32 timeFadeIn, uint32 timePlay, int loop, uint32 timeFadeOut) {
+	debugC(kDebugScript, "Music_Play(%d, %d, %d, %u, %u, %d, %u)", musicId, volume, pan, timeFadeIn, timePlay, loop, timeFadeOut);
 	return _vm->_music->play(_vm->_gameInfo->getMusicTrack(musicId), volume, pan, timeFadeIn, timePlay, loop, timeFadeOut);
 }
 
-void ScriptBase::Music_Adjust(int volume, int pan, int delay) {
-	debugC(kDebugScript, "Music_Adjust(%d, %d, %d)", volume, pan, delay);
+void ScriptBase::Music_Adjust(int volume, int pan, uint32 delay) {
+	debugC(kDebugScript, "Music_Adjust(%d, %d, %u)", volume, pan, delay);
 	_vm->_music->adjust(volume, pan, delay);
 }
 
-void ScriptBase::Music_Stop(int delay) {
-	debugC(kDebugScript, "Music_Stop(%d)", delay);
+void ScriptBase::Music_Stop(uint32 delay) {
+	debugC(kDebugScript, "Music_Stop(%u)", delay);
 	_vm->_music->stop(delay);
 }
 
@@ -1189,8 +1190,8 @@ void ScriptBase::Outtake_Play(int id, int noLocalization, int container) {
 	_vm->outtakePlay(id, noLocalization, container);
 }
 
-void ScriptBase::Ambient_Sounds_Add_Sound(int sfxId, int timeMin, int timeMax, int volumeMin, int volumeMax, int panStartMin, int panStartMax, int panEndMin, int panEndMax, int priority, int unk) {
-	debugC(kDebugScript, "Ambient_Sounds_Add_Sound(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d)", sfxId, timeMin, timeMax, volumeMin, volumeMax, panStartMin, panStartMax, panEndMin, panEndMax, priority, unk);
+void ScriptBase::Ambient_Sounds_Add_Sound(int sfxId, uint32 timeMin, uint32 timeMax, int volumeMin, int volumeMax, int panStartMin, int panStartMax, int panEndMin, int panEndMax, int priority, int unk) {
+	debugC(kDebugScript, "Ambient_Sounds_Add_Sound(%d, %u, %u, %d, %d, %d, %d, %d, %d, %d, %d)", sfxId, timeMin, timeMax, volumeMin, volumeMax, panStartMin, panStartMax, panEndMin, panEndMax, priority, unk);
 	_vm->_ambientSounds->addSound(sfxId, timeMin, timeMax, volumeMin, volumeMax, panStartMin, panStartMax, panEndMin, panEndMax, priority, unk);
 }
 
@@ -1199,8 +1200,8 @@ void  ScriptBase::Ambient_Sounds_Remove_Sound(int sfxId, bool stopPlaying) {
 	_vm->_ambientSounds->removeNonLoopingSound(sfxId,  stopPlaying);
 }
 
-void ScriptBase::Ambient_Sounds_Add_Speech_Sound(int actorId, int sentenceId, int timeMin, int timeMax, int volumeMin, int volumeMax, int panStartMin, int panStartMax, int panEndMin, int panEndMax, int priority, int unk) {
-	debugC(kDebugScript, "Ambient_Sounds_Add_Speech_Sound(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d)", actorId, sentenceId, timeMin, timeMax, volumeMin, volumeMax, panStartMin, panStartMax, panEndMin, panEndMax, priority, unk);
+void ScriptBase::Ambient_Sounds_Add_Speech_Sound(int actorId, int sentenceId, uint32 timeMin, uint32 timeMax, int volumeMin, int volumeMax, int panStartMin, int panStartMax, int panEndMin, int panEndMax, int priority, int unk) {
+	debugC(kDebugScript, "Ambient_Sounds_Add_Speech_Sound(%d, %d, %u, %u, %d, %d, %d, %d, %d, %d, %d, %d)", actorId, sentenceId, timeMin, timeMax, volumeMin, volumeMax, panStartMin, panStartMax, panEndMin, panEndMax, priority, unk);
 	_vm->_ambientSounds->addSpeech(actorId, sentenceId, timeMin, timeMax, volumeMin, volumeMax, panStartMin, panStartMax, panEndMin, panEndMax, priority, unk);
 }
 
@@ -1221,23 +1222,23 @@ void ScriptBase::Ambient_Sounds_Remove_All_Non_Looping_Sounds(bool stopPlaying)
 	_vm->_ambientSounds->removeAllNonLoopingSounds(stopPlaying);
 }
 
-void ScriptBase::Ambient_Sounds_Add_Looping_Sound(int sfxId, int volume, int pan, int delay) {
-	debugC(kDebugScript, "Ambient_Sounds_Add_Looping_Sound(%d, %d, %d, %d)", sfxId, volume, pan, delay);
+void ScriptBase::Ambient_Sounds_Add_Looping_Sound(int sfxId, int volume, int pan, uint32 delay) {
+	debugC(kDebugScript, "Ambient_Sounds_Add_Looping_Sound(%d, %d, %d, %u)", sfxId, volume, pan, delay);
 	_vm->_ambientSounds->addLoopingSound(sfxId, volume, pan, delay);
 }
 
-void ScriptBase::Ambient_Sounds_Adjust_Looping_Sound(int sfxId, int volume, int pan, int delay) {
-	debugC(kDebugScript, "Ambient_Sounds_Adjust_Looping_Sound(%d, %d, %d, %d)", sfxId, volume, pan, delay);
+void ScriptBase::Ambient_Sounds_Adjust_Looping_Sound(int sfxId, int volume, int pan, uint32 delay) {
+	debugC(kDebugScript, "Ambient_Sounds_Adjust_Looping_Sound(%d, %d, %d, %u)", sfxId, volume, pan, delay);
 	_vm->_ambientSounds->adjustLoopingSound(sfxId, volume, pan, delay);
 }
 
-void ScriptBase::Ambient_Sounds_Remove_Looping_Sound(int sfxId, int delay) {
-	debugC(kDebugScript, "Ambient_Sounds_Remove_Looping_Sound(%d, %d)", sfxId, delay);
+void ScriptBase::Ambient_Sounds_Remove_Looping_Sound(int sfxId, uint32 delay) {
+	debugC(kDebugScript, "Ambient_Sounds_Remove_Looping_Sound(%d, %u)", sfxId, delay);
 	_vm->_ambientSounds->removeLoopingSound(sfxId, delay);
 }
 
-void ScriptBase::Ambient_Sounds_Remove_All_Looping_Sounds(int delay) {
-	debugC(kDebugScript, "Ambient_Sounds_Remove_All_Looping_Sounds(%d)", delay);
+void ScriptBase::Ambient_Sounds_Remove_All_Looping_Sounds(uint32 delay) {
+	debugC(kDebugScript, "Ambient_Sounds_Remove_All_Looping_Sounds(%u)", delay);
 	_vm->_ambientSounds->removeAllLoopingSounds(delay);
 }
 
@@ -1656,8 +1657,8 @@ void ScriptBase::ADQ_Add(int actorId, int sentenceId, int animationMode) {
 	_vm->_actorDialogueQueue->add(actorId, sentenceId, animationMode);
 }
 
-void ScriptBase::ADQ_Add_Pause(int delay) {
-	debugC(kDebugScript, "ADQ_Add_Pause(%d)", delay);
+void ScriptBase::ADQ_Add_Pause(uint32 delay) {
+	debugC(kDebugScript, "ADQ_Add_Pause(%u)", delay);
 	_vm->_actorDialogueQueue->addPause(delay);
 }
 
@@ -1683,10 +1684,10 @@ void ScriptBase::I_Sez(const char *str) {
 	_vm->ISez(str);
 }
 
-void ScriptBase::AI_Countdown_Timer_Start(int actorId, signed int timer, int seconds) {
-	debugC(kDebugScript, "AI_Countdown_Timer_Start(%d, %d, %d)", actorId, timer, seconds);
+void ScriptBase::AI_Countdown_Timer_Start(int actorId, signed int timer, uint32 seconds) {
+	debugC(kDebugScript, "AI_Countdown_Timer_Start(%d, %d, %u)", actorId, timer, seconds);
 	if (timer >= 0 && timer <= 2) {
-		_vm->_actors[actorId]->timerStart(timer, 1000 * seconds);
+		_vm->_actors[actorId]->timerStart(timer, 1000u * seconds);
 	}
 }
 
@@ -1713,24 +1714,24 @@ void ScriptBase::AI_Movement_Track_Repeat(int actorId) {
 	_vm->_actors[actorId]->movementTrackNext(true);
 }
 
-void ScriptBase::AI_Movement_Track_Append_Run_With_Facing(int actorId, int waypointId, int delay, int angle) {
-	debugC(kDebugScript, "AI_Movement_Track_Append_Run_With_Facing(%d, %d, %d, %d)", actorId, waypointId, delay, angle);
-	_vm->_actors[actorId]->_movementTrack->append(waypointId, delay * 1000, angle, true);
+void ScriptBase::AI_Movement_Track_Append_Run_With_Facing(int actorId, int waypointId, uint32 delay, int angle) {
+	debugC(kDebugScript, "AI_Movement_Track_Append_Run_With_Facing(%d, %d, %u, %d)", actorId, waypointId, delay, angle);
+	_vm->_actors[actorId]->_movementTrack->append(waypointId, delay * 1000u, angle, true);
 }
 
-void ScriptBase::AI_Movement_Track_Append_With_Facing(int actorId, int waypointId, int delay, int angle) {
-	debugC(kDebugScript, "AI_Movement_Track_Append_With_Facing(%d, %d, %d, %d)", actorId, waypointId, delay, angle);
-	_vm->_actors[actorId]->_movementTrack->append(waypointId, delay * 1000, angle, false);
+void ScriptBase::AI_Movement_Track_Append_With_Facing(int actorId, int waypointId, uint32 delay, int angle) {
+	debugC(kDebugScript, "AI_Movement_Track_Append_With_Facing(%d, %d, %u, %d)", actorId, waypointId, delay, angle);
+	_vm->_actors[actorId]->_movementTrack->append(waypointId, delay * 1000u, angle, false);
 }
 
-void ScriptBase::AI_Movement_Track_Append_Run(int actorId, int waypointId, int delay) {
-	debugC(kDebugScript, "AI_Movement_Track_Append_Run(%d, %d, %d)", actorId, waypointId, delay);
-	_vm->_actors[actorId]->_movementTrack->append(waypointId, delay * 1000, true);
+void ScriptBase::AI_Movement_Track_Append_Run(int actorId, int waypointId, uint32 delay) {
+	debugC(kDebugScript, "AI_Movement_Track_Append_Run(%d, %d, %u)", actorId, waypointId, delay);
+	_vm->_actors[actorId]->_movementTrack->append(waypointId, delay * 1000u, true);
 }
 
-void ScriptBase::AI_Movement_Track_Append(int actorId, int waypointId, int delay) {
-	debugC(kDebugScript, "AI_Movement_Track_Append(%d, %d, %d)", actorId, waypointId, delay);
-	_vm->_actors[actorId]->_movementTrack->append(waypointId, delay * 1000, false);
+void ScriptBase::AI_Movement_Track_Append(int actorId, int waypointId, uint32 delay) {
+	debugC(kDebugScript, "AI_Movement_Track_Append(%d, %d, %u)", actorId, waypointId, delay);
+	_vm->_actors[actorId]->_movementTrack->append(waypointId, delay * 1000u, false);
 }
 
 void ScriptBase::AI_Movement_Track_Flush(int actorId) {
diff --git a/engines/bladerunner/script/script.h b/engines/bladerunner/script/script.h
index 3a31e49..ac88458 100644
--- a/engines/bladerunner/script/script.h
+++ b/engines/bladerunner/script/script.h
@@ -140,7 +140,7 @@ protected:
 	int Animation_Start();
 	int Animation_Stop();
 	int Animation_Skip_To_Frame();
-	void Delay(int miliseconds);
+	void Delay(uint32 miliseconds);
 	void Player_Loses_Control();
 	void Player_Gains_Control();
 	void Player_Set_Combat_Mode(bool activate);
@@ -172,26 +172,26 @@ protected:
 	void Footstep_Sounds_Set(int index, int value);
 	void Footstep_Sound_Override_On(int footstepSoundOverride);
 	void Footstep_Sound_Override_Off();
-	bool Music_Play(int musicId, int volume, int pan, int timeFadeIn, int timePlay, int loop, int timeFadeOut);
-	void Music_Adjust(int volume, int pan, int delay);
-	void Music_Stop(int delay);
+	bool Music_Play(int musicId, int volume, int pan, uint32 timeFadeIn, uint32 timePlay, int loop, uint32 timeFadeOut);
+	void Music_Adjust(int volume, int pan, uint32 delay);
+	void Music_Stop(uint32 delay);
 	bool Music_Is_Playing();
 	void Overlay_Play(const char *overlay, int loopId, bool loopForever, bool startNow, int a5);
 	void Overlay_Remove(const char *overlay);
 	void Scene_Loop_Set_Default(int loopId);
 	void Scene_Loop_Start_Special(int sceneLoopMode, int loopId, bool immediately);
 	void Outtake_Play(int id, int noLocalization = false, int container = -1);
-	void Ambient_Sounds_Add_Sound(int sfxId, int timeMin, int timeMax, int volumeMin, int volumeMax, int panStartMin, int panStartMax, int panEndMin, int panEndMax, int priority, int unk);
+	void Ambient_Sounds_Add_Sound(int sfxId, uint32 timeMin, uint32 timeMax, int volumeMin, int volumeMax, int panStartMin, int panStartMax, int panEndMin, int panEndMax, int priority, int unk);
 	void Ambient_Sounds_Remove_Sound(int sfxId, bool stopPlaying);
-	void Ambient_Sounds_Add_Speech_Sound(int actorId, int sentenceId, int timeMin, int timeMax, int volumeMin, int volumeMax, int panStartMin, int panStartMax, int panEndMin, int panEndMax, int priority, int unk);
+	void Ambient_Sounds_Add_Speech_Sound(int actorId, int sentenceId, uint32 timeMin, uint32 timeMax, int volumeMin, int volumeMax, int panStartMin, int panStartMax, int panEndMin, int panEndMax, int priority, int unk);
 	// Ambient_Sounds_Remove_Speech_Sound
 	void Ambient_Sounds_Play_Sound(int sfxId, int volume, int panStart, int panEnd, int priority);
 	void Ambient_Sounds_Play_Speech_Sound(int actorId, int sfxId, int volume, int panStart, int panEnd, int priority);
 	void Ambient_Sounds_Remove_All_Non_Looping_Sounds(bool stopPlaying);
-	void Ambient_Sounds_Add_Looping_Sound(int sfxId, int volume, int pan, int delay);
-	void Ambient_Sounds_Adjust_Looping_Sound(int sfxId, int volume, int pan, int delay);
-	void Ambient_Sounds_Remove_Looping_Sound(int sfxId, int delay);
-	void Ambient_Sounds_Remove_All_Looping_Sounds(int delay);
+	void Ambient_Sounds_Add_Looping_Sound(int sfxId, int volume, int pan, uint32 delay);
+	void Ambient_Sounds_Adjust_Looping_Sound(int sfxId, int volume, int pan, uint32 delay);
+	void Ambient_Sounds_Remove_Looping_Sound(int sfxId, uint32 delay);
+	void Ambient_Sounds_Remove_All_Looping_Sounds(uint32 delay);
 	void Setup_Scene_Information(float actorX, float actorY, float actorZ, int actorFacing);
 	bool Dialogue_Menu_Appear(int x, int y);
 	bool Dialogue_Menu_Disappear();
@@ -265,21 +265,21 @@ protected:
 	void Set_Fog_Density(const char *fogName, float density);
 	void ADQ_Flush();
 	void ADQ_Add(int actorId, int sentenceId, int animationMode);
-	void ADQ_Add_Pause(int delay);
+	void ADQ_Add_Pause(uint32 delay);
 	void ADQ_Wait_For_All_Queued_Dialogue();
 	bool Game_Over();
 	void Autosave_Game(int textId);
 	void I_Sez(const char *str);
 
-	void AI_Countdown_Timer_Start(int actorId, signed int timer, int seconds);
+	void AI_Countdown_Timer_Start(int actorId, signed int timer, uint32 seconds);
 	void AI_Countdown_Timer_Reset(int actorId, int timer);
 	void AI_Movement_Track_Unpause(int actorId);
 	void AI_Movement_Track_Pause(int actorId);
 	void AI_Movement_Track_Repeat(int actorId);
-	void AI_Movement_Track_Append_Run_With_Facing(int actorId, int waypointId, int delay, int angle);
-	void AI_Movement_Track_Append_With_Facing(int actorId, int waypointId, int delay, int angle);
-	void AI_Movement_Track_Append_Run(int actorId, int waypointId, int delay);
-	void AI_Movement_Track_Append(int actorId, int waypointId, int delay);
+	void AI_Movement_Track_Append_Run_With_Facing(int actorId, int waypointId, uint32 delay, int angle);
+	void AI_Movement_Track_Append_With_Facing(int actorId, int waypointId, uint32 delay, int angle);
+	void AI_Movement_Track_Append_Run(int actorId, int waypointId, uint32 delay);
+	void AI_Movement_Track_Append(int actorId, int waypointId, uint32 delay);
 	void AI_Movement_Track_Flush(int actorId);
 
 	void ESPER_Add_Photo(const char *name, int photoId, int shapeId);
diff --git a/engines/bladerunner/script/vk_script.cpp b/engines/bladerunner/script/vk_script.cpp
index 30dede7..6c4de42 100644
--- a/engines/bladerunner/script/vk_script.cpp
+++ b/engines/bladerunner/script/vk_script.cpp
@@ -1948,7 +1948,7 @@ void VKScript::askRunciter(int questionId) {
 			VK_Play_Speech_Line(kActorMcCoy, 7660, 0.5f);
 			VK_Play_Speech_Line(kActorMcCoy, 7665, 0.5f);
 			VK_Eye_Animates(1);
-			Delay(1500);
+			Delay(1500u);
 			VK_Play_Speech_Line(kActorMcCoy, 8395, 0.5f);    // M: You don't have anything to say?
 			VK_Subject_Reacts(12, 8, 1, 0);
 			VK_Play_Speech_Line(kActorRunciter, 1400, 0.5f); // R: What's the point
@@ -2312,7 +2312,7 @@ void VKScript::askBulletBob(int questionId) {
 	case 7470:                          // Low 15
 		VK_Subject_Reacts(50, -4, 0, -5);
 		if (_vm->_cutContent) {
-			Delay(2000);
+			Delay(2000u);
 			VK_Play_Speech_Line(kActorMcCoy, 8270, 0.5f);
 		}
 		VK_Play_Speech_Line(kActorBulletBob, 1240, 0.5f);
diff --git a/engines/bladerunner/time.cpp b/engines/bladerunner/time.cpp
index ff7b6a7..ac2d6ea 100644
--- a/engines/bladerunner/time.cpp
+++ b/engines/bladerunner/time.cpp
@@ -34,16 +34,16 @@ Time::Time(BladeRunnerEngine *vm) {
 
 	_start = currentSystem();
 	_pauseCount = 0;
-	_offset = 0;
-	_pauseStart = 0;
+	_offset = 0u;
+	_pauseStart = 0u;
 }
 
-int Time::currentSystem() {
+uint32 Time::currentSystem() {
 	return _vm->getTotalPlayTime();
 }
 
-int Time::current() {
-	int time = currentSystem() - _offset;
+uint32 Time::current() {
+	uint32 time = currentSystem() - _offset;
 	return time - _start;
 }
 
@@ -54,7 +54,7 @@ int Time::pause() {
 	return ++_pauseCount;
 }
 
-int Time::getPauseStart() {
+uint32 Time::getPauseStart() {
 	return _pauseStart;
 }
 
@@ -75,7 +75,7 @@ bool Time::isLocked() {
 // TODO Explore if it would make sense to only use the Engine methods for time accounting (pauseEngine, get/setTotalPlatTime)
 //      or do we need separated/independent time accounting and pausing?
 void Time::resetPauseStart() {
-	_offset = 0;
+	_offset = 0u;
 	_pauseStart = current();
 }
 
diff --git a/engines/bladerunner/time.h b/engines/bladerunner/time.h
index 48fa23a..de48a11 100644
--- a/engines/bladerunner/time.h
+++ b/engines/bladerunner/time.h
@@ -23,6 +23,8 @@
 #ifndef BLADERUNNER_TIME_H
 #define BLADERUNNER_TIME_H
 
+#include "common/types.h"
+
 namespace BladeRunner {
 
 class BladeRunnerEngine;
@@ -30,18 +32,18 @@ class BladeRunnerEngine;
 class Time {
 	BladeRunnerEngine *_vm;
 
-	int _start;
+	uint32 _start;
 	int _pauseCount;
-	int _offset;
-	int _pauseStart;
+	uint32 _offset;
+	uint32 _pauseStart;
 
 public:
 	Time(BladeRunnerEngine *vm);
 
-	int  currentSystem();
-	int  current();
+	uint32  currentSystem();
+	uint32  current();
 	int  pause();
-	int  getPauseStart();
+	uint32  getPauseStart();
 	int  resume();
 	bool isLocked();
 	void resetPauseStart();
diff --git a/engines/bladerunner/ui/elevator.cpp b/engines/bladerunner/ui/elevator.cpp
index 2f7d7e1..a3f7952 100644
--- a/engines/bladerunner/ui/elevator.cpp
+++ b/engines/bladerunner/ui/elevator.cpp
@@ -244,7 +244,7 @@ void Elevator::reset() {
 	_imagePicker = nullptr;
 	_actorId = -1;
 	_sentenceId = -1;
-	_timeSpeakDescription = 0;
+	_timeSpeakDescriptionStart = 0u;
 	_buttonClicked = false;
 }
 
@@ -283,18 +283,19 @@ void Elevator::buttonFocus(int buttonId) {
 void Elevator::setupDescription(int actorId, int sentenceId) {
 	_actorId = actorId;
 	_sentenceId = sentenceId;
-	_timeSpeakDescription = _vm->_time->current() + 600;
+	_timeSpeakDescriptionStart = _vm->_time->current();
 }
 
 void Elevator::resetDescription() {
 	_actorId = -1;
 	_sentenceId = -1;
-	_timeSpeakDescription = 0;
+	_timeSpeakDescriptionStart = 0u;
 }
 
 void Elevator::tickDescription() {
-	int now = _vm->_time->current();
-	if (_actorId <= 0 || now < _timeSpeakDescription) {
+	uint32 now = _vm->_time->current();
+	// unsigned difference is intentional
+	if (_actorId <= 0 || (now - _timeSpeakDescriptionStart < 600u)) {
 		return;
 	}
 
diff --git a/engines/bladerunner/ui/elevator.h b/engines/bladerunner/ui/elevator.h
index 9672443..6ed91ce 100644
--- a/engines/bladerunner/ui/elevator.h
+++ b/engines/bladerunner/ui/elevator.h
@@ -41,7 +41,7 @@ class Elevator {
 	UIImagePicker         *_imagePicker;
 	int                    _actorId;
 	int                    _sentenceId;
-	int                    _timeSpeakDescription;
+	uint32                 _timeSpeakDescriptionStart;
 
 public:
 	Elevator(BladeRunnerEngine *vm);
diff --git a/engines/bladerunner/ui/end_credits.cpp b/engines/bladerunner/ui/end_credits.cpp
index 08cce2e..57ea6b3 100644
--- a/engines/bladerunner/ui/end_credits.cpp
+++ b/engines/bladerunner/ui/end_credits.cpp
@@ -109,7 +109,7 @@ void EndCredits::show() {
 		}
 
 		uint32 timeNow = _vm->_time->currentSystem();
-		position += (double)(timeNow - timeLast) * 0.05f;
+		position += (double)(timeNow - timeLast) * 0.05f; // unsigned difference is intentional
 		timeLast = timeNow;
 
 		_vm->_surfaceFront.fillRect(Common::Rect(640, 480), 0);
diff --git a/engines/bladerunner/ui/esper.cpp b/engines/bladerunner/ui/esper.cpp
index 7913362..3a4e8c9 100644
--- a/engines/bladerunner/ui/esper.cpp
+++ b/engines/bladerunner/ui/esper.cpp
@@ -56,12 +56,12 @@ ESPER::ESPER(BladeRunnerEngine *vm) {
 	_regionSelectedAck  = false;
 	_isDrawingSelection = false;
 
-	_isOpen         = false;
-	_shapeButton    = nullptr;
-	_shapeThumbnail = nullptr;
-	_vqaPlayerMain  = nullptr;
-	_vqaPlayerPhoto = nullptr;
-	_script         = nullptr;
+	_isOpen             = false;
+	_shapeButton        = nullptr;
+	_shapeThumbnail     = nullptr;
+	_vqaPlayerMain      = nullptr;
+	_vqaPlayerPhoto     = nullptr;
+	_script             = nullptr;
 
 	reset();
 
@@ -363,7 +363,7 @@ void ESPER::resetData() {
 	_flash              = false;
 	_isScrolling        = false;
 
-	_timeScrollNext = 0;
+	_timeScrollNextStart = 0u;
 
 	resetPhotos();
 	resetRegions();
@@ -398,7 +398,7 @@ void ESPER::resetViewport() {
 	_zoom           = _zoomVertical;
 	_zoomMin        = _zoom;
 
-	_timeZoomOutNext = 0;
+	_timeZoomOutNextStart = 0u;
 
 	_viewportPositionX = kPhotoWidth  / 2;
 	_viewportPositionY = kPhotoHeight / 2;
@@ -416,20 +416,22 @@ void ESPER::resetSelectionRect() {
 }
 
 void ESPER::resetSelectionBlinking() {
-	_selectionBlinkingCounter  = 0;
-	_selectionBlinkingStyle    = 0;
-	_timeSelectionBlinkingNext = 0;
+	_selectionBlinkingCounter       = 0;
+	_selectionBlinkingStyle         = 0;
+	_timeSelectionBlinkingNextStart = 0u;
 }
 
 void ESPER::resetPhotoZooming() {
 	_zoomStep     = 0;
-	_timeZoomNext = 0;
+	_timeZoomNextDiff  = 0u;
+	_timeZoomNextStart = 0u;
 }
 
 void ESPER::resetPhotoOpening() {
 	_photoOpeningWidth    = _screen.left + 1;
 	_photoOpeningHeight   = _screen.top  + 1;
-	_timePhotoOpeningNext = 0;
+	_timePhotoOpeningNextDiff  = 0u;
+	_timePhotoOpeningNextStart = 0u;
 }
 
 void ESPER::updateViewport() {
@@ -523,11 +525,13 @@ void ESPER::setStatePhoto(EsperPhotoStates state) {
 	_statePhoto = state;
 }
 
-void ESPER::wait(int timeout) {
+void ESPER::wait(uint32 timeout) {
 	if (!_isWaiting) {
 		_isWaiting = true;
-		int timeEnd = timeout + _vm->_time->current();
-		while (_vm->_gameIsRunning && (_vm->_time->current() < timeEnd)) {
+//		int timeEnd = timeout + _vm->_time->current();
+		uint32  timeStart = _vm->_time->current();
+		// unsigned difference is intentional
+		while (_vm->_gameIsRunning && (_vm->_time->current() - timeStart < timeout)) {
 			_vm->gameTick();
 		}
 		_isWaiting = false;
@@ -645,16 +649,17 @@ void ESPER::draw(Graphics::Surface &surface) {
 
 void ESPER::drawPhotoOpening(Graphics::Surface &surface) {
 	bool needMoreZooming = true;
-	int timeNow = _vm->_time->current();
-	if (timeNow >= _timePhotoOpeningNext) {
+	uint32 timeNow = _vm->_time->current();
+	// unsigned difference is intentional
+	if (timeNow - _timePhotoOpeningNextStart >= _timePhotoOpeningNextDiff) {
 		_photoOpeningWidth  = MIN(_photoOpeningWidth  + 8, _screen.right  - 1);
 		_photoOpeningHeight = MIN(_photoOpeningHeight + 7, _screen.bottom - 1);
 
 		if (_photoOpeningWidth == _screen.right - 1 && _photoOpeningHeight == _screen.bottom - 1) {
 			needMoreZooming = false;
 		}
-
-		_timePhotoOpeningNext = timeNow + 20;
+		_timePhotoOpeningNextDiff  = 20u;
+		_timePhotoOpeningNextStart = timeNow;
 	}
 	copyImageScale(&_surfacePhoto, _viewport, &surface, Common::Rect(_screen.left, _screen.top, _photoOpeningWidth, _photoOpeningHeight));
 
@@ -675,15 +680,16 @@ void ESPER::drawPhotoOpening(Graphics::Surface &surface) {
 bool ESPER::drawSelectionZooming(Graphics::Surface &surface) {
 	bool zooming = false;
 	bool needMoreZooming = true;
-	int timeNow = _vm->_time->current();
-	if (timeNow > _timeSelectionZoomNext) {
+	uint32 timeNow = _vm->_time->current();
+	// unsigned difference is intentional
+	if (timeNow - _timeSelectionZoomNextStart > 150u) {
 		zooming = true;
 		_selection.left   += _selectionDelta.left;
 		_selection.top    += _selectionDelta.top;
 		_selection.right  += _selectionDelta.right;
 		_selection.bottom += _selectionDelta.bottom;
 		++_selectionZoomStep;
-		_timeSelectionZoomNext = timeNow + 150;
+		_timeSelectionZoomNextStart = timeNow;
 		if (_selectionZoomStep > kSelectionZoomSteps) {
 			needMoreZooming = false;
 			_selection.left   = _selectionTarget.left;
@@ -706,9 +712,10 @@ bool ESPER::drawSelectionZooming(Graphics::Surface &surface) {
 
 bool ESPER::drawSelectionBlinking(Graphics::Surface &surface) {
 	bool needMoreBlinking = true;
-	int timeNow = _vm->_time->current();
-	if (timeNow > _timeSelectionBlinkingNext) {
-		_timeSelectionBlinkingNext = timeNow + 100;
+	uint32 timeNow = _vm->_time->current();
+	// unsigned difference is intentional
+	if (timeNow - _timeSelectionBlinkingNextStart > 100u) {
+		_timeSelectionBlinkingNextStart = timeNow;
 		_selectionBlinkingStyle ^= 1;
 		++_selectionBlinkingCounter;
 		if (_selectionBlinkingCounter > 10) {
@@ -724,8 +731,9 @@ bool ESPER::drawSelectionBlinking(Graphics::Surface &surface) {
 }
 
 void ESPER::drawPhotoZooming(Graphics::Surface &surface) {
-	int timeNow = _vm->_time->current();
-	if ((timeNow > _timeZoomNext) && (_zoomStep < _zoomSteps)) {
+	uint32 timeNow = _vm->_time->current();
+	// unsigned difference is intentional
+	if ((timeNow - _timeZoomNextStart > _timeZoomNextDiff) && (_zoomStep < _zoomSteps)) {
 		_flash = true;
 
 		_viewportPositionXCurrent += _viewportPositionXDelta;
@@ -754,7 +762,8 @@ void ESPER::drawPhotoZooming(Graphics::Surface &surface) {
 			_viewportPositionY = _viewportPositionYTarget;
 		}
 		updateViewport();
-		_timeZoomNext = timeNow + 300;
+		_timeZoomNextDiff  = 300u;
+		_timeZoomNextStart = timeNow;
 	}
 
 	if (_zoomDelta >= 0.0f) {
@@ -764,7 +773,8 @@ void ESPER::drawPhotoZooming(Graphics::Surface &surface) {
 	}
 	drawGrid(surface);
 
-	if ((timeNow > _timeZoomNext) && (_zoomStep >= _zoomSteps)) {
+	// unsigned difference is intentional
+	if ((timeNow - _timeZoomNextStart > _timeZoomNextDiff) && (_zoomStep >= _zoomSteps)) {
 		if (_regionSelectedAck) {
 			if (!_regions[_regionSelected].name.empty()) {
 				if (_zoomDelta < 0.0f) {
@@ -772,7 +782,7 @@ void ESPER::drawPhotoZooming(Graphics::Surface &surface) {
 					_zoomDelta = (_zoom * 1.5f - _zoom) / (float)_zoomSteps; // 0.5f * _zoom ???
 				}
 				setStatePhoto(kEsperPhotoStateVideoZooming);
-				_timeZoomNext += 300;
+				_timeZoomNextDiff += 300u;
 			} else {
 				_regionSelectedAck = false;
 				_selection.left   = viewportXToScreenX(_regions[_regionSelected].rectInner.left);
@@ -792,9 +802,10 @@ void ESPER::drawPhotoZooming(Graphics::Surface &surface) {
 }
 
 void ESPER::drawPhotoSharpening(Graphics::Surface &surface) {
-	int timeNow = _vm->_time->current();
+	uint32 timeNow = _vm->_time->current();
 	bool needMoreSharpening = true;
-	if (timeNow >= _timePhotoOpeningNext) {
+	// unsigned difference is intentional
+	if (timeNow - _timePhotoOpeningNextStart >= _timePhotoOpeningNextDiff) {
 		_photoOpeningWidth  = MIN(_photoOpeningWidth  + 8, _screen.right  - 1);
 		_photoOpeningHeight = MIN(_photoOpeningHeight + 7, _screen.bottom - 1);
 
@@ -802,7 +813,8 @@ void ESPER::drawPhotoSharpening(Graphics::Surface &surface) {
 			needMoreSharpening = false;
 		}
 
-		_timePhotoOpeningNext = timeNow + 50;
+		_timePhotoOpeningNextDiff  = 50u;
+		_timePhotoOpeningNextStart = timeNow;
 	}
 
 	if (_regionSelectedAck && !_regions[_regionSelected].name.empty()) {
@@ -833,9 +845,10 @@ void ESPER::drawPhotoSharpening(Graphics::Surface &surface) {
 }
 
 void ESPER::drawPhotoZoomOut(Graphics::Surface &surface) {
-	int timeNow = _vm->_time->current();
-	if (timeNow >= _timeZoomOutNext) {
-		_timeZoomOutNext = timeNow + 300;
+	uint32 timeNow = _vm->_time->current();
+	// unsigned difference is intentional
+	if (timeNow - _timeZoomOutNextStart >= 300u) {
+		_timeZoomOutNextStart = timeNow;
 
 		if (_zoom > _zoomMin) {
 			_zoom /= 1.3f;
@@ -870,14 +883,17 @@ void ESPER::drawVideoZooming(Graphics::Surface &surface) {
 			return;
 		}
 
-		_timeZoomNext = 0;
+		_timeZoomNextDiff  = 0u;
+		_timeZoomNextStart = 0u;
 	}
 
 	bool flash = false;
 	bool advanceFrame = false;
-	int timeNow = _vm->_time->current();
-	if (timeNow > _timeZoomNext) {
-		_timeZoomNext = timeNow + 300;
+	uint32 timeNow = _vm->_time->current();
+	// unsigned difference is intentional
+	if (timeNow - _timeZoomNextStart > _timeZoomNextDiff) {
+		_timeZoomNextDiff  = 300u;
+		_timeZoomNextStart = timeNow;
 		playSound(kSfxBR031_1P, 25);
 		flash = true;
 		advanceFrame = true;
@@ -901,9 +917,11 @@ void ESPER::drawVideoZooming(Graphics::Surface &surface) {
 void ESPER::drawVideoZoomOut(Graphics::Surface &surface) {
 	bool flash = false;
 	bool advanceFrame = false;
-	int timeNow = _vm->_time->current();
-	if (timeNow > _timeZoomNext && _vqaLastFrame > 0) {
-		_timeZoomNext = timeNow + 300;
+	uint32 timeNow = _vm->_time->current();
+	// unsigned difference is intentional
+	if (timeNow - _timeZoomNextStart > _timeZoomNextDiff && _vqaLastFrame > 0) {
+		_timeZoomNextDiff  = 300u;
+		_timeZoomNextStart = timeNow;
 		playSound(kSfxBR031_1P, 25);
 		_vqaPlayerPhoto->seekToFrame(_vqaLastFrame);
 		int nextFrame = _vqaPlayerPhoto->getFrameCount() / 4;
@@ -928,7 +946,8 @@ void ESPER::drawVideoZoomOut(Graphics::Surface &surface) {
 	}
 	copyImageBlit(&_surfaceViewport, Common::Rect(0, 0, 0, 0), &surface, _screen);
 	drawGrid(surface);
-	if (timeNow > _timeZoomNext && _vqaLastFrame <= 0) {
+	// unsigned difference is intentional
+	if (timeNow - _timeZoomNextStart > _timeZoomNextDiff && _vqaLastFrame <= 0) {
 		_vqaPlayerPhoto->close();
 		delete _vqaPlayerPhoto;
 		_vqaPlayerPhoto = nullptr;
@@ -1368,11 +1387,12 @@ void ESPER::tickSound() {
 }
 
 void ESPER::tickScroll() {
-	int timeNow = _vm->_time->current();
-	if (timeNow <= _timeScrollNext) {
+	uint32 timeNow = _vm->_time->current();
+	// unsigned difference is intentional
+	if (timeNow - _timeScrollNextStart <= 300u) {
 		return;
 	}
-	_timeScrollNext = timeNow + 300;
+	_timeScrollNextStart = timeNow;
 
 	if (_scrollingDirection == 0) {
 		scrollUp();
@@ -1610,8 +1630,8 @@ void ESPER::goBack() {
 }
 
 void ESPER::prepareZoom() {
-	_selectionZoomStep     = 0;
-	_timeSelectionZoomNext = 0;
+	_selectionZoomStep          = 0;
+	_timeSelectionZoomNextStart = 0u;
 
 	_selectionTarget = _selection;
 	resetSelectionRect();
diff --git a/engines/bladerunner/ui/esper.h b/engines/bladerunner/ui/esper.h
index 34648a3..33954cb 100644
--- a/engines/bladerunner/ui/esper.h
+++ b/engines/bladerunner/ui/esper.h
@@ -119,19 +119,20 @@ class ESPER {
 	bool _isMouseDown;
 	int  _mouseOverScroll;
 
-	float _zoomHorizontal;
-	float _zoomVertical;
-	float _zoom;
-	float _zoomMin;
-	float _zoomTarget;
-	float _zoomDelta;
-	float _blur;
-	int   _zoomSteps;
-	int   _zoomStep;
-	int   _timeZoomNext;
-
-	bool _isZoomingOut;
-	int  _timeZoomOutNext;
+	float  _zoomHorizontal;
+	float  _zoomVertical;
+	float  _zoom;
+	float  _zoomMin;
+	float  _zoomTarget;
+	float  _zoomDelta;
+	float  _blur;
+	int    _zoomSteps;
+	int    _zoomStep;
+	uint32 _timeZoomNextDiff;
+	uint32 _timeZoomNextStart;
+
+	bool   _isZoomingOut;
+	uint32 _timeZoomOutNextStart;
 
 	Common::Rect _screen;
 
@@ -159,20 +160,21 @@ class ESPER {
 	int          _selectionCrosshairX;
 	int          _selectionCrosshairY;
 
-	int _selectionBlinkingCounter;
-	int _selectionBlinkingStyle;
-	int _timeSelectionBlinkingNext;
+	int    _selectionBlinkingCounter;
+	int    _selectionBlinkingStyle;
+	uint32 _timeSelectionBlinkingNextStart;
 
-	int _selectionZoomStep;
-	int _timeSelectionZoomNext;
+	int    _selectionZoomStep;
+	uint32 _timeSelectionZoomNextStart;
 
-	int _photoOpeningWidth;
-	int _photoOpeningHeight;
-	int _timePhotoOpeningNext;
+	int    _photoOpeningWidth;
+	int    _photoOpeningHeight;
+	uint32 _timePhotoOpeningNextDiff;
+	uint32 _timePhotoOpeningNextStart;
 
-	bool _isScrolling;
-	int  _scrollingDirection;
-	int  _timeScrollNext;
+	bool   _isScrolling;
+	int    _scrollingDirection;
+	uint32 _timeScrollNextStart;
 
 	int _soundId1;
 	int _volume1;
@@ -218,7 +220,7 @@ private:
 	void setStateMain(EsperMainStates state);
 	void setStatePhoto(EsperPhotoStates state);
 
-	void wait(int timeout);
+	void wait(uint32 timeout);
 	void playSound(int soundId, int volume);
 
 	void draw(Graphics::Surface &surface);
diff --git a/engines/bladerunner/ui/kia.cpp b/engines/bladerunner/ui/kia.cpp
index 666a8bd..7ad73ce 100644
--- a/engines/bladerunner/ui/kia.cpp
+++ b/engines/bladerunner/ui/kia.cpp
@@ -227,8 +227,9 @@ void KIA::tick() {
 		return;
 	}
 
-	int timeNow = _vm->_time->currentSystem();
-	int timeDiff = timeNow - _timeLast;
+	uint32 timeNow = _vm->_time->currentSystem();
+	// unsigned difference is intentional
+	uint32 timeDiff = timeNow - _timeLast;
 
 	if (_playerActorDialogueQueueSize == _playerActorDialogueQueuePosition) {
 		_playerActorDialogueState = 0;
@@ -255,22 +256,22 @@ void KIA::tick() {
 		}
 	}
 
-	int timeDiffDiv48 = (timeNow - _playerVqaTimeLast) / 48;
-	if (timeDiffDiv48 > 0) {
+	uint32 timeDiffDiv48 = (timeNow < _playerVqaTimeLast) ? 0u : (timeNow - _playerVqaTimeLast) / 48;
+	if (timeDiffDiv48 > 0u) {
 		_playerVqaTimeLast = timeNow;
 		if (_playerActorDialogueQueueSize == _playerActorDialogueQueuePosition || _playerSliceModelId != -1 || _playerPhotographId != -1 || _playerImage.getPixels() != nullptr) {
 			if (_playerVisualizerState > 0) {
-				_playerVisualizerState = MAX(_playerVisualizerState - timeDiffDiv48, 0);
+				_playerVisualizerState = (_playerVisualizerState < timeDiffDiv48) ? 0u : MAX(_playerVisualizerState - timeDiffDiv48, 0u);
 			}
 		} else {
 			if (_playerVisualizerState < 2) {
-				_playerVisualizerState = MIN(_playerVisualizerState + timeDiffDiv48, 2);
+				_playerVisualizerState = MIN(_playerVisualizerState + timeDiffDiv48, 2u);
 			}
 		}
 
 		if ( _playerSliceModelId != -1 || _playerPhotographId != -1 || _playerImage.getPixels() != nullptr) {
 			if (_playerVqaFrame < 8) {
-				int newVqaFrame  = MIN(timeDiffDiv48 + _playerVqaFrame, 8);
+				int newVqaFrame  = MIN(timeDiffDiv48 + _playerVqaFrame, 8u);
 				if (_playerVqaFrame <= 0 && newVqaFrame > 0) {
 					_vm->_audioPlayer->playAud(_vm->_gameInfo->getSfxTrack(kSfxMECHAN1), 100, 70, 70, 50, 0);
 				}
@@ -278,7 +279,7 @@ void KIA::tick() {
 			}
 		} else {
 			if (_playerVqaFrame > 0) {
-				int newVqaFrame = MAX(_playerVqaFrame - timeDiffDiv48, 0);
+				int newVqaFrame = (_playerVqaFrame < timeDiffDiv48) ? 0 : MAX(_playerVqaFrame - timeDiffDiv48, 0u);
 				if (_playerVqaFrame >= 8 && newVqaFrame < 8) {
 					_vm->_audioPlayer->playAud(_vm->_gameInfo->getSfxTrack(kSfxMECHAN1C), 100, 70, 70, 50, 0);
 				}
diff --git a/engines/bladerunner/ui/kia.h b/engines/bladerunner/ui/kia.h
index 47ea639..5c0204b 100644
--- a/engines/bladerunner/ui/kia.h
+++ b/engines/bladerunner/ui/kia.h
@@ -78,16 +78,16 @@ class KIA {
 
 	int _transitionId;
 
-	int                _playerVqaTimeLast;
+	uint32             _playerVqaTimeLast;
 	VQAPlayer         *_playerVqaPlayer;
-	int                _playerVqaFrame;
-	int                _playerVisualizerState;
+	uint32             _playerVqaFrame;
+	uint32             _playerVisualizerState;
 	int                _playerPhotographId;
 	Shape             *_playerPhotograph;
 	int                _playerSliceModelId;
 	float              _playerSliceModelAngle;
 	Graphics::Surface  _playerImage;
-	int                _timeLast;
+	uint32             _timeLast;
 
 	ActorDialogueQueueEntry _playerActorDialogueQueue[kPlayerActorDialogueQueueCapacity];
 	int                     _playerActorDialogueQueuePosition;
diff --git a/engines/bladerunner/ui/kia_section_diagnostic.cpp b/engines/bladerunner/ui/kia_section_diagnostic.cpp
index 41ff43c..662aef3 100644
--- a/engines/bladerunner/ui/kia_section_diagnostic.cpp
+++ b/engines/bladerunner/ui/kia_section_diagnostic.cpp
@@ -71,7 +71,7 @@ void KIASectionDiagnostic::close() {
 }
 
 void KIASectionDiagnostic::draw(Graphics::Surface &surface) {
-	int timeNow = _vm->_time->currentSystem();
+	uint32 timeNow = _vm->_time->currentSystem();
 
 	for (int i = 0; i < _text->getCount(); ++i) {
 		int y = kLineHeight * i + 366 - _offset;
@@ -91,7 +91,8 @@ void KIASectionDiagnostic::draw(Graphics::Surface &surface) {
 	}
 
 	// Timing fixed for 60Hz by ScummVM team
-	if (timeNow - _timeLast > 1000 / 60) {
+	// unsigned difference is intentional
+	if (timeNow - _timeLast > (1000u / 60u)) {
 		++_offset;
 		if (_offset > kLineHeight * _text->getCount() + 366) {
 			_offset = 0;
diff --git a/engines/bladerunner/ui/kia_section_diagnostic.h b/engines/bladerunner/ui/kia_section_diagnostic.h
index 0c518f2..8236557 100644
--- a/engines/bladerunner/ui/kia_section_diagnostic.h
+++ b/engines/bladerunner/ui/kia_section_diagnostic.h
@@ -36,7 +36,7 @@ class KIASectionDiagnostic : public KIASectionBase {
 
 	TextResource *_text;
 	int           _offset;
-	int           _timeLast;
+	uint32        _timeLast;
 
 public:
 	KIASectionDiagnostic(BladeRunnerEngine *vm);
diff --git a/engines/bladerunner/ui/kia_section_load.cpp b/engines/bladerunner/ui/kia_section_load.cpp
index 42ace56..41f2e7e 100644
--- a/engines/bladerunner/ui/kia_section_load.cpp
+++ b/engines/bladerunner/ui/kia_section_load.cpp
@@ -44,8 +44,8 @@ KIASectionLoad::KIASectionLoad(BladeRunnerEngine *vm) : KIASectionBase(vm) {
 	_scrollBox   = new UIScrollBox(_vm, scrollBoxCallback, this, 1025, 0, true, Common::Rect(155, 158, 461, 346), Common::Rect(506, 160, 506, 350));
 	_uiContainer->add(_scrollBox);
 
-	_timeLast = 0;
-	_timeLeft = 0;
+	_timeLast = 0u;
+	_timeLeft = 0u;
 
 	_hoveredLineId = -1;
 	_displayingLineId = -1;
@@ -86,7 +86,7 @@ void KIASectionLoad::open() {
 
 	_hoveredLineId = -1;
 	_timeLast = _vm->_time->currentSystem();
-	_timeLeft = 800;
+	_timeLeft = 800u;
 }
 
 void KIASectionLoad::close() {
@@ -105,7 +105,7 @@ void KIASectionLoad::draw(Graphics::Surface &surface) {
 
 	if (_hoveredLineId != selectedLineId) {
 		if (selectedLineId >= 0 && selectedLineId < (int)_saveList.size() && _displayingLineId != selectedLineId) {
-			if (_timeLeft == 0) {
+			if (_timeLeft == 0u) {
 				SaveStateDescriptor desc = SaveFileManager::queryMetaInfos(_vm->getTargetName(), selectedLineId);
 				const Graphics::Surface *thumbnail = desc.getThumbnail();
 				if (thumbnail != nullptr) {
@@ -115,7 +115,7 @@ void KIASectionLoad::draw(Graphics::Surface &surface) {
 			}
 		} else {
 			_vm->_kia->playerReset();
-			_timeLeft = 800;
+			_timeLeft = 800u;
 			_displayingLineId = -1;
 		}
 		_hoveredLineId = selectedLineId;
@@ -124,7 +124,7 @@ void KIASectionLoad::draw(Graphics::Surface &surface) {
 	uint32 now = _vm->_time->currentSystem();
 	if (selectedLineId >= 0 && selectedLineId < (int)_saveList.size() && _displayingLineId != selectedLineId) {
 		if (_timeLeft) {
-			uint32 timeDiff = now - _timeLast;
+			uint32 timeDiff = now - _timeLast; // unsigned difference is intentional
 			if (timeDiff >= _timeLeft) {
 				SaveStateDescriptor desc = SaveFileManager::queryMetaInfos(_vm->getTargetName(), _saveList[selectedLineId].getSaveSlot());
 				const Graphics::Surface *thumbnail = desc.getThumbnail();
@@ -133,7 +133,7 @@ void KIASectionLoad::draw(Graphics::Surface &surface) {
 					_displayingLineId = selectedLineId;
 				}
 			} else {
-				_timeLeft -= timeDiff;
+				_timeLeft = (_timeLeft < timeDiff) ? 0u : (_timeLeft - timeDiff);
 			}
 		}
 	}
diff --git a/engines/bladerunner/ui/kia_section_pogo.cpp b/engines/bladerunner/ui/kia_section_pogo.cpp
index c5a3251..cd0bb27 100644
--- a/engines/bladerunner/ui/kia_section_pogo.cpp
+++ b/engines/bladerunner/ui/kia_section_pogo.cpp
@@ -251,9 +251,10 @@ void KIASectionPogo::open() {
 
 void KIASectionPogo::draw(Graphics::Surface &surface) {
 	// Timing fixed for 60Hz by ScummVM team
-	int timeNow = _vm->_time->currentSystem();
+	uint32 timeNow = _vm->_time->currentSystem();
 	bool updateTimeout = false;
-	if (timeNow - _timeLast > 1000 / 60) {
+	// unsigned difference is intentional
+	if (timeNow - _timeLast > (1000u / 60u)) {
 		updateTimeout = true;
 		_timeLast = timeNow;
 	}
diff --git a/engines/bladerunner/ui/kia_section_pogo.h b/engines/bladerunner/ui/kia_section_pogo.h
index 7392cde..85ca29c 100644
--- a/engines/bladerunner/ui/kia_section_pogo.h
+++ b/engines/bladerunner/ui/kia_section_pogo.h
@@ -41,7 +41,7 @@ class KIASectionPogo : public KIASectionBase {
 	int         _lineTimeouts[kLineCount];
 	int         _lineOffsets[kLineCount];
 
-	int         _timeLast;
+	uint32      _timeLast;
 
 public:
 	KIASectionPogo(BladeRunnerEngine *vm);
diff --git a/engines/bladerunner/ui/kia_section_save.cpp b/engines/bladerunner/ui/kia_section_save.cpp
index b0f35b9..e4a9190 100644
--- a/engines/bladerunner/ui/kia_section_save.cpp
+++ b/engines/bladerunner/ui/kia_section_save.cpp
@@ -55,8 +55,8 @@ KIASectionSave::KIASectionSave(BladeRunnerEngine *vm) : KIASectionBase(vm) {
 
 	_buttons = new UIImagePicker(_vm, 3);
 
-	_timeLast = 0;
-	_timeLeft = 0;
+	_timeLast = 0u;
+	_timeLeft = 0u;
 
 	_state = kStateNormal;
 
@@ -130,7 +130,7 @@ void KIASectionSave::open() {
 
 	_hoveredLineId = -1;
 	_timeLast = _vm->_time->currentSystem();
-	_timeLeft = 800;
+	_timeLeft = 800u;
 }
 
 void KIASectionSave::close() {
@@ -185,7 +185,7 @@ void KIASectionSave::draw(Graphics::Surface &surface) {
 
 	if (selectedLineId != _hoveredLineId) {
 		if (selectedLineId >= 0 && selectedLineId < (int)_saveList.size() && _displayingLineId != selectedLineId) {
-			if (_timeLeft == 0) {
+			if (_timeLeft == 0u) {
 				SaveStateDescriptor desc = SaveFileManager::queryMetaInfos(_vm->getTargetName(), selectedLineId);
 				const Graphics::Surface *thumbnail = desc.getThumbnail();
 				if (thumbnail != nullptr) {
@@ -195,7 +195,7 @@ void KIASectionSave::draw(Graphics::Surface &surface) {
 			}
 		} else {
 			_vm->_kia->playerReset();
-			_timeLeft = 800;
+			_timeLeft = 800u;
 			_displayingLineId = -1;
 		}
 		_hoveredLineId = selectedLineId;
@@ -204,7 +204,7 @@ void KIASectionSave::draw(Graphics::Surface &surface) {
 	uint32 now = _vm->_time->currentSystem();
 	if (selectedLineId >= 0 && selectedLineId < (int)_saveList.size() && _displayingLineId != selectedLineId) {
 		if (_timeLeft) {
-			uint32 timeDiff = now - _timeLast;
+			uint32 timeDiff = now - _timeLast; // unsigned difference is intentional
 			if (timeDiff >= _timeLeft) {
 				SaveStateDescriptor desc = SaveFileManager::queryMetaInfos(_vm->getTargetName(), _saveList[selectedLineId].getSaveSlot());
 				const Graphics::Surface *thumbnail = desc.getThumbnail();
@@ -213,7 +213,7 @@ void KIASectionSave::draw(Graphics::Surface &surface) {
 					_displayingLineId = selectedLineId;
 				}
 			} else {
-				_timeLeft -= timeDiff;
+				_timeLeft = (_timeLeft < timeDiff) ? 0u : (_timeLeft - timeDiff);
 			}
 		}
 	}
diff --git a/engines/bladerunner/ui/spinner.cpp b/engines/bladerunner/ui/spinner.cpp
index b6269bb..cab2d67 100644
--- a/engines/bladerunner/ui/spinner.cpp
+++ b/engines/bladerunner/ui/spinner.cpp
@@ -293,7 +293,7 @@ void Spinner::reset() {
 
 	_actorId = -1;
 	_sentenceId = -1;
-	_timeSpeakDescription = 0;
+	_timeSpeakDescriptionStart = 0u;
 
 	for (int i = 0; i != (int)_shapes.size(); ++i) {
 		delete _shapes[i];
@@ -413,20 +413,21 @@ void Spinner::destinationFocus(int destinationImage) {
 void Spinner::setupDescription(int actorId, int sentenceId) {
 	_actorId = actorId;
 	_sentenceId = sentenceId;
-	_timeSpeakDescription = _vm->_time->current() + 600;
+	_timeSpeakDescriptionStart = _vm->_time->current();
 }
 
 // copied from elevator.cpp code
 void Spinner::resetDescription() {
 	_actorId = -1;
 	_sentenceId = -1;
-	_timeSpeakDescription = 0;
+	_timeSpeakDescriptionStart = 0u;
 }
 
 // copied from elevator.cpp code
 void Spinner::tickDescription() {
-	int now = _vm->_time->current();
-	if (_actorId <= 0 || now < _timeSpeakDescription) {
+	uint32 now = _vm->_time->current();
+	// unsigned difference is intentional
+	if (_actorId <= 0 || (now - _timeSpeakDescriptionStart < 600u)) {
 		return;
 	}
 
diff --git a/engines/bladerunner/ui/spinner.h b/engines/bladerunner/ui/spinner.h
index 50a8be9..2fa0dc6 100644
--- a/engines/bladerunner/ui/spinner.h
+++ b/engines/bladerunner/ui/spinner.h
@@ -54,7 +54,7 @@ class Spinner {
 
 	int                    _actorId;
 	int                    _sentenceId;
-	int                    _timeSpeakDescription;
+	uint32                 _timeSpeakDescriptionStart;
 
 public:
 	Spinner(BladeRunnerEngine *vm);
diff --git a/engines/bladerunner/ui/ui_check_box.cpp b/engines/bladerunner/ui/ui_check_box.cpp
index 76cecd2..935c53f 100644
--- a/engines/bladerunner/ui/ui_check_box.cpp
+++ b/engines/bladerunner/ui/ui_check_box.cpp
@@ -44,9 +44,9 @@ UICheckBox::UICheckBox(BladeRunnerEngine *vm, UIComponentCallback *valueChangedC
 	_style = style;
 
 	if (isChecked) {
-		_frame = 5;
+		_frame = 5u;
 	} else {
-		_frame = 0;
+		_frame = 0u;
 	}
 
 	_timeLast = _vm->_time->currentSystem();
@@ -57,39 +57,41 @@ UICheckBox::UICheckBox(BladeRunnerEngine *vm, UIComponentCallback *valueChangedC
 
 void UICheckBox::draw(Graphics::Surface &surface) {
 	if (_rect.right > _rect.left && _rect.bottom > _rect.top) {
-		int shapeId;
+		uint32 shapeId;
 
-		uint timeNow = _vm->_time->currentSystem();
-		if (timeNow - _timeLast > 67) {
-			int frameDelta = (timeNow - _timeLast) / 67u;
+		uint32 timeNow = _vm->_time->currentSystem();
+		// unsigned difference is intentional
+		if (timeNow - _timeLast > 67u) {
+			// unsigned difference is intentional
+			uint32 frameDelta = (timeNow - _timeLast) / 67u;
 			_timeLast = timeNow;
 
 			if (_isChecked) {
-				_frame = MIN(_frame + frameDelta, 5);
+				_frame = MIN(_frame + frameDelta, 5u);
 			} else {
-				_frame = MAX(_frame - frameDelta, 0);
+				_frame = (_frame < frameDelta) ? 0 : MAX(_frame - frameDelta, 0u);
 			}
 		}
 
 		if (_style) {
 			if (_frame || (_hasFocus && !_isPressed && _isEnabled)) {
-				if (_frame != 5 || (_hasFocus && !_isPressed && _isEnabled)) {
-					shapeId = _frame + 54;
+				if (_frame != 5u || (_hasFocus && !_isPressed && _isEnabled)) {
+					shapeId = _frame + 54u;
 				} else {
-					shapeId = 53;
+					shapeId = 53u;
 				}
 			} else {
-				shapeId = 52;
+				shapeId = 52u;
 			}
 		} else {
 			if (_frame || (_hasFocus && !_isPressed && _isEnabled)) {
-				if (_frame != 5 || (_hasFocus && !_isPressed && _isEnabled)) {
-					shapeId = _frame + 62;
+				if (_frame != 5u || (_hasFocus && !_isPressed && _isEnabled)) {
+					shapeId = _frame + 62u;
 				} else {
-					shapeId = 61;
+					shapeId = 61u;
 				}
 			} else {
-				shapeId = 60;
+				shapeId = 60u;
 			}
 		}
 
diff --git a/engines/bladerunner/ui/ui_check_box.h b/engines/bladerunner/ui/ui_check_box.h
index 01ee555..9b601ed 100644
--- a/engines/bladerunner/ui/ui_check_box.h
+++ b/engines/bladerunner/ui/ui_check_box.h
@@ -36,9 +36,9 @@ class UICheckBox : public UIComponent {
 	int                  _style;
 	int                  _isEnabled;
 	Common::Rect         _rect;
-	int                  _frame;
+	uint32               _frame;
 	int                  _isPressed;
-	uint                 _timeLast;
+	uint32               _timeLast;
 	int                  _hasFocus;
 
 public:
diff --git a/engines/bladerunner/ui/ui_image_picker.cpp b/engines/bladerunner/ui/ui_image_picker.cpp
index 0b1a0dd..e23fd27 100644
--- a/engines/bladerunner/ui/ui_image_picker.cpp
+++ b/engines/bladerunner/ui/ui_image_picker.cpp
@@ -167,7 +167,7 @@ void UIImagePicker::activate(UIImagePickerCallback *mouseInCallback,
 	_mouseDownCallback   = mouseDownCallback;
 	_mouseUpCallback     = mouseUpCallback;
 	_callbackData        = callbackData;
-	_hoverStartTimestamp = 0;
+	_hoverStartTimestamp = 0u;
 	_isVisible           = true;
 	_hoveredImageIndex   = -1;
 	_pressedImageIndex   = -1;
@@ -180,7 +180,7 @@ void UIImagePicker::deactivate() {
 	_mouseDownCallback   = nullptr;
 	_mouseUpCallback     = nullptr;
 	_callbackData        = nullptr;
-	_hoverStartTimestamp = 0;
+	_hoverStartTimestamp = 0u;
 	_isVisible           = false;
 	_hoveredImageIndex   = -1;
 	_pressedImageIndex   = -1;
@@ -228,8 +228,8 @@ void UIImagePicker::drawTooltip(Graphics::Surface &surface, int x, int y) {
 		(_hoveredImageIndex == -1) ||
 		(_vm->_mouse->isDisabled()) ||
 		(!_images[_hoveredImageIndex].active) ||
-		(_vm->_time->current() < _hoverStartTimestamp + 1000)
-	) {
+		(_vm->_time->current() - _hoverStartTimestamp < 1000u)
+	) { // unsigned difference is intentional (time difference)
 		return;
 	}
 
@@ -352,7 +352,7 @@ void UIImagePicker::reset() {
 	_isVisible           = false;
 	_hoveredImageIndex   = -1;
 	_pressedImageIndex   = -1;
-	_hoverStartTimestamp = 0;
+	_hoverStartTimestamp = 0u;
 	_isButtonDown        = false;
 	_mouseInCallback     = nullptr;
 	_mouseOutCallback    = nullptr;
diff --git a/engines/bladerunner/ui/ui_image_picker.h b/engines/bladerunner/ui/ui_image_picker.h
index 3d62192..29d59ba 100644
--- a/engines/bladerunner/ui/ui_image_picker.h
+++ b/engines/bladerunner/ui/ui_image_picker.h
@@ -50,12 +50,12 @@ class UIImagePicker {
 
 	BladeRunnerEngine *_vm;
 
-	int _isVisible;
-	int _imageCount;
-	int _hoveredImageIndex;
-	int _pressedImageIndex;
-	int _hoverStartTimestamp;
-	int _isButtonDown;
+	int    _isVisible;
+	int    _imageCount;
+	int    _hoveredImageIndex;
+	int    _pressedImageIndex;
+	uint32 _hoverStartTimestamp;
+	int    _isButtonDown;
 	Common::Array<Image> _images;
 
 	UIImagePickerCallback *_mouseInCallback;
diff --git a/engines/bladerunner/ui/ui_input_box.h b/engines/bladerunner/ui/ui_input_box.h
index ac58a6e..3aa21f2 100644
--- a/engines/bladerunner/ui/ui_input_box.h
+++ b/engines/bladerunner/ui/ui_input_box.h
@@ -42,7 +42,7 @@ class UIInputBox : public UIComponent {
 
 	bool                 _cursorIsVisible;
 
-	int                  _timeLast;
+	uint32               _timeLast;
 
 public:
 	UIInputBox(BladeRunnerEngine *vm, UIComponentCallback *valueChangedCallback, void *callbackData, Common::Rect rect, int maxLength, const Common::String &text);
diff --git a/engines/bladerunner/ui/ui_scroll_box.cpp b/engines/bladerunner/ui/ui_scroll_box.cpp
index 48796a2..b24aa89 100644
--- a/engines/bladerunner/ui/ui_scroll_box.cpp
+++ b/engines/bladerunner/ui/ui_scroll_box.cpp
@@ -129,7 +129,7 @@ UIScrollBox::UIScrollBox(BladeRunnerEngine *vm, UIScrollBoxCallback *lineSelecte
 		_lines[i] = new Line();
 		_lines[i]->lineData = -1;
 		_lines[i]->flags = 0x00;
-		_lines[i]->checkboxFrame = 5;
+		_lines[i]->checkboxFrame = 5u;
 	}
 
 	_mouseOver = false;
@@ -316,7 +316,7 @@ void UIScrollBox::handleMouseDown(bool alternateButton) {
 	if (!alternateButton) {
 		if (_scrollUpButtonHover) {
 			_scrollUpButtonState = 2;
-			_timeLastScroll = _vm->_time->currentSystem() - 160;
+			_timeLastScroll = _vm->_time->currentSystem() - 160u;
 		} else {
 			_scrollUpButtonState = 1;
 		}
@@ -332,13 +332,13 @@ void UIScrollBox::handleMouseDown(bool alternateButton) {
 		}
 		if (_scrollAreaUpHover) {
 			_scrollAreaUpState = 2;
-			_timeLastScroll = _vm->_time->currentSystem() - 160;
+			_timeLastScroll = _vm->_time->currentSystem() - 160u;
 		} else {
 			_scrollAreaUpState = 1;
 		}
 		if (_scrollAreaDownHover) {
 			_scrollAreaDownState = 2;
-			_timeLastScroll = _vm->_time->currentSystem() - 160;
+			_timeLastScroll = _vm->_time->currentSystem() - 160u;
 		} else {
 			_scrollAreaDownState = 1;
 		}
@@ -380,27 +380,31 @@ int UIScrollBox::getSelectedLineData() {
 }
 
 void UIScrollBox::draw(Graphics::Surface &surface) {
-	int timeNow = _vm->_time->currentSystem();
+	uint32 timeNow = _vm->_time->currentSystem();
 
 	// update scrolling
 	if (_scrollUpButtonState == 2 && _scrollUpButtonHover) {
-		if ((timeNow - _timeLastScroll) > 160) {
+		// unsigned difference is intentional
+		if ((timeNow - _timeLastScroll) > 160u) {
 			scrollUp();
 			_timeLastScroll = timeNow;
 		}
 	} else if (_scrollDownButtonState == 2 && _scrollDownButtonHover) {
-		if ((timeNow - _timeLastScroll) > 160) {
+		// unsigned difference is intentional
+		if ((timeNow - _timeLastScroll) > 160u) {
 			scrollDown();
 			_timeLastScroll = timeNow;
 		}
 	} else if (_scrollAreaUpState == 2 && _scrollAreaUpHover) {
-		if ((timeNow - _timeLastScroll) > 160) {
+		// unsigned difference is intentional
+		if ((timeNow - _timeLastScroll) > 160u) {
 			_firstLineVisible -= _maxLinesVisible - 1;
 			_firstLineVisible = CLIP(_firstLineVisible, 0, _lineCount - _maxLinesVisible);
 			_timeLastScroll = timeNow;
 		}
 	} else if (_scrollAreaDownState == 2 && _scrollAreaDownHover) {
-		if ((timeNow - _timeLastScroll) > 160) {
+		// unsigned difference is intentional
+		if ((timeNow - _timeLastScroll) > 160u) {
 			_firstLineVisible += _maxLinesVisible - 1;
 			_firstLineVisible = CLIP(_firstLineVisible, 0, _lineCount - _maxLinesVisible);
 			_timeLastScroll = timeNow;
@@ -408,24 +412,25 @@ void UIScrollBox::draw(Graphics::Surface &surface) {
 	}
 
 	// update checkboxes
-	int timeDiffCheckBox = timeNow - _timeLastCheckbox;
-	if (timeDiffCheckBox > 67) {
+	// unsigned difference is intentional
+	uint32 timeDiffCheckBox = timeNow - _timeLastCheckbox;
+	if (timeDiffCheckBox > 67u) {
 		_timeLastCheckbox = timeNow;
 		for (int i = 0; i < _lineCount; ++i) {
 			if (_lines[i]->flags & 0x01) { // has checkbox
 				if (_lines[i]->flags & 0x02) { // checkbox checked
-					if (_lines[i]->checkboxFrame < 5) {
-						_lines[i]->checkboxFrame += timeDiffCheckBox / 67;
+					if (_lines[i]->checkboxFrame < 5u) {
+						_lines[i]->checkboxFrame += timeDiffCheckBox / 67u;
 					}
-					if (_lines[i]->checkboxFrame > 5) {
-						_lines[i]->checkboxFrame = 5;
+					if (_lines[i]->checkboxFrame > 5u) {
+						_lines[i]->checkboxFrame = 5u;
 					}
 				} else { // checkbox not checked
-					if (_lines[i]->checkboxFrame > 0) {
-						_lines[i]->checkboxFrame -= timeDiffCheckBox / 67;
+					if (_lines[i]->checkboxFrame > 0u) {
+						_lines[i]->checkboxFrame =  (_lines[i]->checkboxFrame < (timeDiffCheckBox / 67u)) ? 0u : _lines[i]->checkboxFrame - (timeDiffCheckBox / 67u);
 					}
-					if (_lines[i]->checkboxFrame < 0) {
-						_lines[i]->checkboxFrame = 0;
+					if (_lines[i]->checkboxFrame == 0u) { // original was < 0, int
+						_lines[i]->checkboxFrame = 0u;
 					}
 				}
 			}
@@ -434,7 +439,8 @@ void UIScrollBox::draw(Graphics::Surface &surface) {
 
 
 	// update highlight
-	if ((timeNow - _timeLastHighlight) > 67) {
+	// unsigned difference is intentional
+	if ((timeNow - _timeLastHighlight) > 67u) {
 		_timeLastHighlight = timeNow;
 		_highlightFrame = (_highlightFrame + 1) % 8;
 	}
@@ -497,8 +503,8 @@ void UIScrollBox::draw(Graphics::Surface &surface) {
 				int checkboxShapeId = 0;
 				if (_style == 0) {
 					if (_lines[i]->checkboxFrame || v35) {
-						if (_lines[i]->checkboxFrame != 5 || v35) {
-							checkboxShapeId = _lines[i]->checkboxFrame + 62;
+						if (_lines[i]->checkboxFrame != 5u || v35) {
+							checkboxShapeId = _lines[i]->checkboxFrame + 62u;
 						} else {
 							checkboxShapeId = 61;
 						}
@@ -506,8 +512,8 @@ void UIScrollBox::draw(Graphics::Surface &surface) {
 						checkboxShapeId = 60;
 					}
 				} else if (_lines[i]->checkboxFrame || v35) {
-					if (_lines[i]->checkboxFrame != 5 || v35) {
-						checkboxShapeId = _lines[i]->checkboxFrame + 54;
+					if (_lines[i]->checkboxFrame != 5u || v35) {
+						checkboxShapeId = _lines[i]->checkboxFrame + 54u;
 					} else {
 						checkboxShapeId = 53;
 					}
diff --git a/engines/bladerunner/ui/ui_scroll_box.h b/engines/bladerunner/ui/ui_scroll_box.h
index 1cd2913..2ac0701 100644
--- a/engines/bladerunner/ui/ui_scroll_box.h
+++ b/engines/bladerunner/ui/ui_scroll_box.h
@@ -45,9 +45,9 @@ class UIScrollBox : public UIComponent {
 
 	struct Line {
 		Common::String text;
-		int lineData;
-		int flags;
-		int checkboxFrame;
+		int    lineData;
+		int    flags;
+		uint32 checkboxFrame;
 	};
 
 	int                   _selectedLineState;
@@ -75,9 +75,9 @@ class UIScrollBox : public UIComponent {
 	int                   _style;
 	bool                  _center;
 
-	int                   _timeLastScroll;
-	int                   _timeLastCheckbox;
-	int                   _timeLastHighlight;
+	uint32                _timeLastScroll;
+	uint32                _timeLastCheckbox;
+	uint32                _timeLastHighlight;
 
 	int                   _highlightFrame;
 
diff --git a/engines/bladerunner/ui/vk.cpp b/engines/bladerunner/ui/vk.cpp
index e0b595c..1cacf31 100644
--- a/engines/bladerunner/ui/vk.cpp
+++ b/engines/bladerunner/ui/vk.cpp
@@ -213,7 +213,8 @@ void VK::tick() {
 	_vm->blitToScreen(_vm->_surfaceFront);
 	_vm->_system->delayMillis(10);
 
-	if (_isClosing && _vm->_time->current() >= _timeClose && !_script->isInsideScript()) {
+	// unsigned difference is intentional
+	if (_isClosing && (_vm->_time->current() - _timeCloseStart >= 3000u) && !_script->isInsideScript()) {
 		close();
 		_vm->_mouse->enable();
 		reset();
@@ -265,8 +266,9 @@ void VK::playSpeechLine(int actorId, int sentenceId, float duration) {
 	}
 
 	if (duration > 0.0f && !_vm->_actorSpeakStopIsRequested) {
-		int timeEnd = duration * 1000.0f + _vm->_time->current();
-		while ((timeEnd > _vm->_time->current()) && _vm->_gameIsRunning) {
+		uint32  timeStart = _vm->_time->current();
+		uint32  timeUntil = duration * 1000.0f;
+		while ((_vm->_time->current() - timeStart < timeUntil) && _vm->_gameIsRunning) {
 			_vm->gameTick();
 		}
 	}
@@ -280,13 +282,13 @@ void VK::subjectReacts(int intensity, int humanResponse, int replicantResponse,
 	humanResponse     = CLIP(humanResponse, -20, 20);
 	replicantResponse = CLIP(replicantResponse, -20, 20);
 
-	int timeNow = _vm->_time->current();
-	bool closeVK = false;
+	uint32 timeNow = _vm->_time->current();
+	bool closeVK   = false;
 
 	if (intensity > 0) {
 		_needleValueTarget = 78 * intensity / 100;
 		_needleValueDelta = (_needleValueTarget - _needleValue) / 10;
-		_timeNextNeedleStep = timeNow + 66;
+		_timeNextNeedleStepStart = timeNow;
 	}
 
 	if (humanResponse != 0) {
@@ -309,7 +311,7 @@ void VK::subjectReacts(int intensity, int humanResponse, int replicantResponse,
 
 			if (closeVK == true) {
 				_isClosing = true;
-				_timeClose = timeNow + 3000;
+				_timeCloseStart = timeNow;
 				_vm->_mouse->disable();
 			}
 		}
@@ -340,7 +342,7 @@ void VK::subjectReacts(int intensity, int humanResponse, int replicantResponse,
 
 			if (closeVK == true) {
 				_isClosing = true;
-				_timeClose = timeNow + 3000;
+				_timeCloseStart = timeNow;
 				_vm->_mouse->disable();
 			}
 		}
@@ -368,7 +370,7 @@ void VK::subjectReacts(int intensity, int humanResponse, int replicantResponse,
 
 	if (closeVK == true) {
 		_isClosing = true;
-		_timeClose = timeNow + 3000;
+		_timeCloseStart = timeNow;
 		_vm->_mouse->disable();
 	}
 }
@@ -462,46 +464,49 @@ void VK::reset() {
 	_needleValueTarget       = 0;
 	_needleValueDelta        = 0;
 	_needleValueMax          = 0;
-	_timeNextNeedleStep      = 0;
-	_timeNeedleReturn        = 0;
-	_timeNextNeedleOscillate = 0;
-
-	_humanProbability       = 0;
-	_humanGauge             = 0;
-	_humanGaugeTarget       = 0;
-	_humanGaugeDelta        = 0;
-	_timeNextHumanGaugeStep = 0;
-
-	_replicantProbability       = 0;
-	_replicantGauge             = 0;
-	_replicantGaugeTarget       = 0;
-	_replicantGaugeDelta        = 0;
-	_timeNextReplicantGaugeStep = 0;
+
+	_timeNextNeedleStepStart      = 0u;
+	_timeNeedleReturnStart        = 0u;
+	_timeNextNeedleOscillateStart = 0u;
+
+	_humanProbability                = 0;
+	_humanGauge                      = 0;
+	_humanGaugeTarget                = 0;
+	_humanGaugeDelta                 = 0;
+	_timeNextHumanGaugeStepDiff      = 0u;
+	_timeNextHumanGaugeStepStart     = 0u;
+
+	_replicantProbability            = 0;
+	_replicantGauge                  = 0;
+	_replicantGaugeTarget            = 0;
+	_replicantGaugeDelta             = 0;
+	_timeNextReplicantGaugeStepDiff  = 0u;
+	_timeNextReplicantGaugeStepStart = 0u;
 
 	_anxiety = 0;
 
-	_blinkState          = 0;
-	_timeNextBlink       = 0;
-	_timeNextGaugesBlink = 0;
-
-	_isClosing = false;
-	_timeClose = 0;
-
-	_isAdjusting             = false;
-	_adjustment              = 154;
-	_adjustmentTarget        = 154;
-	_adjustmentDelta         = 0;
-	_timeNextAdjustementStep = 0;
-
-	_eyeLineSelected      = 1;
-	_eyeLineX             = 315;
-	_eyeLineXLast         = 315;
-	_eyeLineY             = 281;
-	_eyeLineYLast         = 281;
-	_eyeLineXDelta        = 8;
-	_eyeLineYDelta        = 8;
-	_timeNextEyeLineStep  = 0;
-	_timeNextEyeLineStart = 0;
+	_blinkState               = 0;
+	_timeNextBlinkStart       = 0u;
+	_timeNextGaugesBlinkStart = 0u;
+
+	_isClosing      = false;
+	_timeCloseStart = 0u;
+
+	_isAdjusting                  = false;
+	_adjustment                   = 154;
+	_adjustmentTarget             = 154;
+	_adjustmentDelta              = 0;
+	_timeNextAdjustementStepStart = 0u;
+
+	_eyeLineSelected           = 1;
+	_eyeLineX                  = 315;
+	_eyeLineXLast              = 315;
+	_eyeLineY                  = 281;
+	_eyeLineYLast              = 281;
+	_eyeLineXDelta             = 8;
+	_eyeLineYDelta             = 8;
+	_timeNextEyeLineStepStart  = 0u;
+	_timeNextEyeLineStart      = 0u;
 
 	_soundTrackId1 = -1;
 	_soundTrackId2 = -1;
@@ -573,14 +578,15 @@ void VK::draw() {
 
 	Graphics::Surface &surface = _vm->_surfaceFront;
 
-	int timeNow = _vm->_time->current();
+	uint32 timeNow = _vm->_time->current();
 
 	if (_isAdjusting && !_testStarted && !_vm->isMouseButtonDown()) {
 		_isAdjusting = false;
 	}
 
 	if (_vqaFrameMain >= 26) {
-		if (_isClosing && timeNow >= _timeNextGaugesBlink) {
+		// unsigned difference is intentional
+		if (_isClosing && timeNow - _timeNextGaugesBlinkStart >= 600u) {
 			if (_blinkState) {
 				_buttons->setImageShapeUp(6, nullptr);
 				_buttons->setImageShapeUp(7, nullptr);
@@ -596,12 +602,13 @@ void VK::draw() {
 				}
 				_blinkState = 1;
 			}
-			_timeNextGaugesBlink = timeNow + 600;
+			_timeNextGaugesBlinkStart = timeNow;
 		}
 
 		_buttons->draw(surface);
 
-		if (_humanGaugeDelta != 0 && timeNow >= _timeNextHumanGaugeStep) {
+		// unsigned difference is intentional
+		if (_humanGaugeDelta != 0 && timeNow - _timeNextHumanGaugeStepStart >= _timeNextHumanGaugeStepDiff) {
 			_humanGauge += _humanGaugeDelta;
 
 			if ((_humanGaugeDelta > 0 && _humanGauge >= _humanGaugeTarget)
@@ -613,17 +620,20 @@ void VK::draw() {
 				if (_humanGaugeTarget != 0) {
 					_humanGaugeTarget = 0;
 					_humanGaugeDelta = -_humanGaugeDelta;
-					_timeNextHumanGaugeStep = timeNow + 500;
+					_timeNextHumanGaugeStepDiff  = 500u;
+					_timeNextHumanGaugeStepStart = timeNow;
 				} else {
 					_humanGaugeDelta = 0;
 				}
 			} else {
-				_timeNextHumanGaugeStep = timeNow + 66;
+				_timeNextHumanGaugeStepDiff  = 66u;
+				_timeNextHumanGaugeStepStart = timeNow;
 			}
 		}
 		drawHumanGauge(surface);
 
-		if (_replicantGaugeDelta != 0 && timeNow >= _timeNextReplicantGaugeStep) {
+		// unsigned difference is intentional
+		if (_replicantGaugeDelta != 0 && timeNow - _timeNextReplicantGaugeStepStart >= _timeNextReplicantGaugeStepDiff) {
 			_replicantGauge += _replicantGaugeDelta;
 
 			if ((_replicantGaugeDelta > 0 && _replicantGauge >= _replicantGaugeTarget)
@@ -635,17 +645,20 @@ void VK::draw() {
 				if (_replicantGaugeTarget != 0) {
 					_replicantGaugeTarget = 0;
 					_replicantGaugeDelta = -_replicantGaugeDelta;
-					_timeNextReplicantGaugeStep = timeNow + 500;
+					_timeNextReplicantGaugeStepDiff  = 500u;
+					_timeNextReplicantGaugeStepStart = timeNow;
 				} else {
 					_replicantGaugeDelta = 0;
 				}
 			} else {
-				_timeNextReplicantGaugeStep = timeNow + 66;
+				_timeNextReplicantGaugeStepDiff  = 66u;
+				_timeNextReplicantGaugeStepStart = timeNow;
 			}
 		}
 		drawReplicantGauge(surface);
 
-		if (!_calibrationStarted && _vqaFrameMain >= 59 && timeNow >= _timeNextBlink) {
+		// unsigned difference is intentional
+		if (!_calibrationStarted && _vqaFrameMain >= 59 && timeNow - _timeNextBlinkStart >= 600u) {
 			if (_blinkState) {
 				_buttons->setImageShapeUp(0, nullptr);
 				_blinkState = false;
@@ -654,10 +667,11 @@ void VK::draw() {
 				_vm->_audioPlayer->playAud(_vm->_gameInfo->getSfxTrack(kSfxVKBEEP1), 50, 0, 0, 50, 0);
 				_blinkState = true;
 			}
-			_timeNextBlink = timeNow + 600;
+			_timeNextBlinkStart = timeNow;
 		}
 
-		if (_adjustmentDelta != 0 && timeNow >= _timeNextAdjustementStep) {
+		// unsigned difference is intentional
+		if (_adjustmentDelta != 0 && timeNow - _timeNextAdjustementStepStart >= 50u) {
 			if (_adjustmentDelta > 0) {
 				_adjustment += 3;
 				if (_adjustment >= _adjustmentTarget) {
@@ -675,7 +689,8 @@ void VK::draw() {
 		}
 		setAdjustmentFromMouse();
 
-		if (_calibrationStarted && !_testStarted && timeNow >= _timeNextBlink) {
+		// unsigned difference is intentional
+		if (_calibrationStarted && !_testStarted && timeNow - _timeNextBlinkStart >= 600u) {
 			if (_blinkState) {
 				_buttons->setImageShapeUp(2, nullptr);
 				_buttons->setImageShapeUp(3, nullptr);
@@ -689,10 +704,11 @@ void VK::draw() {
 
 				_vm->_audioPlayer->playAud(_vm->_gameInfo->getSfxTrack(kSfxVKBEEP2), 33, 0, 0, 50, 0);
 			}
-			_timeNextBlink = timeNow + 600;
+			_timeNextBlinkStart = timeNow;
 		}
 
-		if (_needleValueDelta != 0 && timeNow >= _timeNextNeedleStep) {
+		// unsigned difference is intentional
+		if (_needleValueDelta != 0 && (timeNow - _timeNextNeedleStepStart >= 66u)) {
 			if (_needleValueDelta > 0) {
 				_needleValue += 4;
 				if (_needleValue >= _needleValueTarget) {
@@ -701,13 +717,14 @@ void VK::draw() {
 					_needleValueDelta = -_needleValueDelta;
 					_needleValueTarget = 0;
 
-					_timeNeedleReturn = timeNow + 1800;
+					_timeNeedleReturnStart = timeNow;
 
 					if (!_testStarted) {
 						animateAdjustment(_needleValueMax + 165);
 					}
 				}
-			} else if (timeNow >= _timeNeedleReturn) {
+			} else if (timeNow - _timeNeedleReturnStart >= 1800u) {
+				// unsigned difference is intentional
 				_needleValue -= 4;
 				if (_needleValue <= _needleValueTarget) {
 					_needleValue = _needleValueTarget;
@@ -715,14 +732,15 @@ void VK::draw() {
 				}
 			}
 			_vm->_audioPlayer->playAud(_vm->_gameInfo->getSfxTrack(kSfxBR027_3P), 20, 0, 0, 50, 0);
-			_timeNextNeedleStep = timeNow + 66;
+			_timeNextNeedleStepStart = timeNow;
 		}
 
 		drawNeedle(surface);
 		drawEye(surface);
 		drawEyeCrosshair(surface, timeNow);
-		if (timeNow >= _timeNextNeedleOscillate) {
-			_timeNextNeedleOscillate = timeNow + 66;
+		// unsigned difference is intentional
+		if (timeNow - _timeNextNeedleOscillateStart >= 66u) {
+			_timeNextNeedleOscillateStart = timeNow;
 		}
 		int mouseX, mouseY;
 		_vm->_mouse->getXY(&mouseX, &mouseY);
@@ -734,7 +752,8 @@ void VK::draw() {
 
 void VK::drawNeedle(Graphics::Surface &surface) {
 	int x = _needleValue + 165;
-	if ((_vm->_time->current() >= _timeNextNeedleOscillate) && (x > 165)) {
+	// unsigned difference is intentional
+	if ((_vm->_time->current() - _timeNextNeedleOscillateStart >= 66u) && (x > 165)) {
 		x = CLIP(x + (int)_vm->_rnd.getRandomNumberRng(0, 4) - 2, 165, 245);
 	}
 
@@ -759,7 +778,7 @@ void VK::drawEye(Graphics::Surface &surface) {
 	surface.copyRectToSurface(_surfaceEye, 315, 281, Common::Rect(0, 0, _surfaceEye.w, _surfaceEye.h));
 }
 
-void VK::drawEyeCrosshair(Graphics::Surface &surface, int timeNow) {
+void VK::drawEyeCrosshair(Graphics::Surface &surface, uint32 timeNow) {
 	surface.drawLine(315,                                        _eyeLineY,     486,                                        _eyeLineY,     surface.format.RGBToColor(16, 16, 64));
 	surface.drawLine(315,                                        _eyeLineY - 1, 486,                                        _eyeLineY - 1, surface.format.RGBToColor(16, 16, 64));
 	surface.drawLine(315,                                        _eyeLineY,     _vm->_rnd.getRandomNumberRng(10, 20) + 315, _eyeLineY,     surface.format.RGBToColor(16, 16, 80));
@@ -774,13 +793,15 @@ void VK::drawEyeCrosshair(Graphics::Surface &surface, int timeNow) {
 	surface.drawLine(_eyeLineX - 1, 396 - _vm->_rnd.getRandomNumberRng(10, 20), _eyeLineX - 1, 396,                                        surface.format.RGBToColor(16, 16, 80));
 	surface.drawLine(_eyeLineX - 1, 281,                                        _eyeLineX - 1, _vm->_rnd.getRandomNumberRng(10, 20) + 281, surface.format.RGBToColor(16, 16, 80));
 
-	if (timeNow >= _timeNextEyeLineStart) {
+	// unsigned difference is intentional
+	if (timeNow - _timeNextEyeLineStart >= 1000u) {
 		if (_eyeLineSelected) {
 			if (_eyeLineYLast != _eyeLineY) {
 				surface.drawLine(315, _eyeLineYLast, 486, _eyeLineYLast, surface.format.RGBToColor(16, 16, 32));
 			}
 			_eyeLineYLast = _eyeLineY;
-			if (timeNow >= _timeNextEyeLineStep) {
+			// unsigned difference is intentional
+			if (timeNow - _timeNextEyeLineStepStart >= 50u) {
 				_eyeLineY += _eyeLineYDelta;
 				if (_eyeLineYDelta > 0) {
 					if (_eyeLineY >= 396) {
@@ -791,16 +812,17 @@ void VK::drawEyeCrosshair(Graphics::Surface &surface, int timeNow) {
 					_eyeLineY = 281;
 					_eyeLineYDelta = -_eyeLineYDelta;
 					_eyeLineSelected = 0;
-					_timeNextEyeLineStart = timeNow + 1000;
+					_timeNextEyeLineStart = timeNow;
 				}
-				_timeNextEyeLineStep = timeNow + 50;
+				_timeNextEyeLineStepStart = timeNow;
 			}
 		} else {
 			if (_eyeLineXLast != _eyeLineX) {
 				surface.drawLine(_eyeLineXLast, 281, _eyeLineXLast, 396, surface.format.RGBToColor(16, 16, 32));
 			}
 			_eyeLineXLast = _eyeLineX;
-			if (timeNow >= _timeNextEyeLineStep) {
+			// unsigned difference is intentional
+			if (timeNow - _timeNextEyeLineStepStart >= 50u) {
 				_eyeLineX += _eyeLineXDelta;
 				if ( _eyeLineXDelta > 0) {
 					if (_eyeLineX >= 486) {
@@ -811,9 +833,9 @@ void VK::drawEyeCrosshair(Graphics::Surface &surface, int timeNow) {
 					_eyeLineX = 315;
 					_eyeLineXDelta = -_eyeLineXDelta;
 					_eyeLineSelected = 1;
-					_timeNextEyeLineStart = timeNow + 1000;
+					_timeNextEyeLineStart = timeNow;
 				}
-				_timeNextEyeLineStep = timeNow + 50;
+				_timeNextEyeLineStepStart = timeNow;
 			}
 		}
 	}
@@ -914,7 +936,7 @@ void VK::stopAdjustement() {
 void VK::animateAdjustment(int target) {
 	_adjustmentTarget = MAX(target - 4, 154);
 	_adjustmentDelta = (_adjustmentTarget - _adjustment) / 5;
-	_timeNextAdjustementStep = _vm->_time->current() + 50;
+	_timeNextAdjustementStepStart = _vm->_time->current();
 }
 
 void VK::setAdjustment(int x) {
@@ -1040,7 +1062,7 @@ void VK::askQuestion(int intensity) {
 	) {
 		_isClosing = true;
 		_vm->_mouse->disable();
-		_timeClose = _vm->_time->current() + 3000;
+		_timeCloseStart = _vm->_time->current();
 	}
 }
 
diff --git a/engines/bladerunner/ui/vk.h b/engines/bladerunner/ui/vk.h
index d0b7493..eeaee1b 100644
--- a/engines/bladerunner/ui/vk.h
+++ b/engines/bladerunner/ui/vk.h
@@ -55,13 +55,13 @@ class VK {
 
 	VQAPlayer *_vqaPlayerMain;
 	VQAPlayer *_vqaPlayerEye;
-	int _vqaFrameMain;
+	int  _vqaFrameMain;
 	bool _vqaLoopEnded;
 
 	Graphics::Surface _surfaceEye;
 
 	bool _isOpen;
-	int _actorId;
+	int  _actorId;
 	bool _calibrationStarted;
 	bool _testStarted;
 
@@ -77,50 +77,52 @@ class VK {
 	int _calibrationRatio;
 	int _calibrationCounter;
 
-	int _humanProbability;
-	int _humanGauge;
-	int _humanGaugeTarget;
-	int _humanGaugeDelta;
-	int _timeNextHumanGaugeStep;
-
-	int _replicantProbability;
-	int _replicantGauge;
-	int _replicantGaugeTarget;
-	int _replicantGaugeDelta;
-	int _timeNextReplicantGaugeStep;
-
-	int _anxiety;
-
-	int _needleValue;
-	int _needleValueMax;
-	int _needleValueTarget;
-	int _needleValueDelta;
-	int _timeNextNeedleStep;
-	int _timeNextNeedleOscillate;
-	int _timeNeedleReturn;
-
-	bool _isClosing;
-	int _timeClose;
-
-	int _blinkState;
-	int _timeNextBlink;
-	int _timeNextGaugesBlink;
-
-	bool _isAdjusting;
-	int _adjustment;
-	int _adjustmentTarget;
-	int _adjustmentDelta;
-	int _timeNextAdjustementStep;
-
-	int _eyeLineSelected;
-	int _eyeLineX;
-	int _eyeLineXLast;
-	int _eyeLineY;
-	int _eyeLineYLast;
-	int _eyeLineXDelta;
-	int _eyeLineYDelta;
-	int _timeNextEyeLineStep;
-	int _timeNextEyeLineStart;
+	int    _humanProbability;
+	int    _humanGauge;
+	int    _humanGaugeTarget;
+	int    _humanGaugeDelta;
+	uint32 _timeNextHumanGaugeStepDiff;
+	uint32 _timeNextHumanGaugeStepStart;
+
+	int    _replicantProbability;
+	int    _replicantGauge;
+	int    _replicantGaugeTarget;
+	int    _replicantGaugeDelta;
+	uint32 _timeNextReplicantGaugeStepDiff;
+	uint32 _timeNextReplicantGaugeStepStart;
+
+	int    _anxiety;
+
+	int    _needleValue;
+	int    _needleValueMax;
+	int    _needleValueTarget;
+	int    _needleValueDelta;
+	uint32 _timeNextNeedleStepStart;
+	uint32 _timeNextNeedleOscillateStart;
+	uint32 _timeNeedleReturnStart;
+
+	bool   _isClosing;
+	uint32 _timeCloseStart;
+
+	int    _blinkState;
+	uint32 _timeNextBlinkStart;
+	uint32 _timeNextGaugesBlinkStart;
+
+	bool   _isAdjusting;
+	int    _adjustment;
+	int    _adjustmentTarget;
+	int    _adjustmentDelta;
+	uint32 _timeNextAdjustementStepStart;
+
+	int    _eyeLineSelected;
+	int    _eyeLineX;
+	int    _eyeLineXLast;
+	int    _eyeLineY;
+	int    _eyeLineYLast;
+	int    _eyeLineXDelta;
+	int    _eyeLineYDelta;
+	uint32 _timeNextEyeLineStepStart;
+	uint32 _timeNextEyeLineStart;
 
 public:
 	VK(BladeRunnerEngine *vm);
@@ -154,7 +156,7 @@ private:
 
 	void drawNeedle(Graphics::Surface &surface);
 	void drawEye(Graphics::Surface &surface);
-	void drawEyeCrosshair(Graphics::Surface &surface, int timeNow);
+	void drawEyeCrosshair(Graphics::Surface &surface, uint32 timeNow);
 	void drawMouse(Graphics::Surface &surface);
 	void drawGauge(Graphics::Surface &surface, int value, int x, int y, int width);
 	void drawHumanGauge(Graphics::Surface &surface);





More information about the Scummvm-git-logs mailing list