From c8a23cc401ecef6deac468766aba185bf8633db7 Mon Sep 17 00:00:00 2001 From: Thanasis Antoniou Date: Mon, 29 Jul 2019 13:56:47 +0300 Subject: BLADERUNNER: Fix unsorted args for getRandomNumberRng Fix for bug #11034 --- engines/bladerunner/actor.cpp | 19 +++++++++------- engines/bladerunner/ambient_sounds.cpp | 34 +++++++++++++++++++++++++++++ engines/bladerunner/ui/kia_section_pogo.cpp | 4 +++- 3 files changed, 48 insertions(+), 9 deletions(-) (limited to 'engines') diff --git a/engines/bladerunner/actor.cpp b/engines/bladerunner/actor.cpp index e52cebf2b7..4f91218a50 100644 --- a/engines/bladerunner/actor.cpp +++ b/engines/bladerunner/actor.cpp @@ -976,7 +976,7 @@ void Actor::modifyFriendlinessToOther(int otherActorId, signed int change) { } void Actor::setFriendlinessToOther(int otherActorId, int friendliness) { - _friendlinessToOther[otherActorId] = friendliness; + _friendlinessToOther[otherActorId] = CLIP(friendliness, 0, 100); } bool Actor::checkFriendlinessAndHonesty(int otherActorId) { @@ -995,19 +995,19 @@ bool Actor::checkFriendlinessAndHonesty(int otherActorId) { } void Actor::setHonesty(int honesty) { - _honesty = honesty; + _honesty = CLIP(honesty, 0, 100); } void Actor::setIntelligence(int intelligence) { - _intelligence = intelligence; + _intelligence = CLIP(intelligence, 0, 100); } void Actor::setStability(int stability) { - _stability = stability; + _stability = CLIP(stability, 0, 100); } void Actor::setCombatAggressiveness(int combatAggressiveness) { - _combatAggressiveness = combatAggressiveness; + _combatAggressiveness = CLIP(combatAggressiveness, 0, 100); } void Actor::setInvisible(bool isInvisible) { @@ -1064,15 +1064,18 @@ void Actor::setTarget(bool target) { } void Actor::setCurrentHP(int hp) { - _currentHP = hp; + _currentHP = CLIP(hp, 0, 100); if (hp > 0) { retire(false, 0, 0, -1); } } void Actor::setHealth(int hp, int maxHp) { - _currentHP = hp; - _maxHP = maxHp; + if (hp > maxHp) { + hp = maxHp; + } + _currentHP = CLIP(hp, 0, 100); + _maxHP = CLIP(maxHp, 0, 100); if (hp > 0) { retire(false, 0, 0, -1); } diff --git a/engines/bladerunner/ambient_sounds.cpp b/engines/bladerunner/ambient_sounds.cpp index 8fe7a1c16a..4825a70278 100644 --- a/engines/bladerunner/ambient_sounds.cpp +++ b/engines/bladerunner/ambient_sounds.cpp @@ -65,6 +65,14 @@ static inline void sort(int &a, int &b) { } } +static inline void sort(uint &a, uint &b) { + if (a > b) { + uint t = a; + a = b; + b = t; + } +} + void AmbientSounds::addSound( int sfxId, uint32 timeMin, uint32 timeMax, @@ -73,6 +81,10 @@ void AmbientSounds::addSound( int panEndMin, int panEndMax, int priority, int unk) { +#if BLADERUNNER_ORIGINAL_BUGS +#else + sort(timeMin, timeMax); +#endif // BLADERUNNER_ORIGINAL_BUGS sort(volumeMin, volumeMax); sort(panStartMin, panStartMax); sort(panEndMin, panEndMax); @@ -102,6 +114,10 @@ void AmbientSounds::removeAllNonLoopingSounds(bool stopPlaying) { } 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) { +#if BLADERUNNER_ORIGINAL_BUGS +#else + sort(timeMin, timeMax); +#endif // BLADERUNNER_ORIGINAL_BUGS sort(volumeMin, volumeMax); sort(panStartMin, panStartMax); sort(panEndMin, panEndMax); @@ -315,6 +331,14 @@ void AmbientSounds::addSoundByName( uint32 now = _vm->_time->current(); +#if BLADERUNNER_ORIGINAL_BUGS +#else + sort(timeMin, timeMax); + sort(volumeMin, volumeMax); + sort(panStartMin, panStartMax); + sort(panEndMin, panEndMax); +#endif // BLADERUNNER_ORIGINAL_BUGS + track.isActive = true; track.name = name; track.hash = MIXArchive::getHash(name); @@ -416,6 +440,10 @@ void AmbientSounds::load(SaveFileReadStream &f) { track.timeMax = (uint32)f.readInt(); f.skip(4); // track.nextPlayTime is not used after load track.nextPlayTimeStart = now; +#if BLADERUNNER_ORIGINAL_BUGS +#else + sort(track.timeMin, track.timeMax); +#endif // BLADERUNNER_ORIGINAL_BUGS track.nextPlayTimeDiff = _vm->_rnd.getRandomNumberRng(track.timeMin, track.timeMax); track.volumeMin = f.readInt(); track.volumeMax = f.readInt(); @@ -424,6 +452,12 @@ void AmbientSounds::load(SaveFileReadStream &f) { track.panStartMax = f.readInt(); track.panEndMin = f.readInt(); track.panEndMax = f.readInt(); +#if BLADERUNNER_ORIGINAL_BUGS +#else + sort(track.volumeMin, track.volumeMax); + sort(track.panStartMin, track.panStartMax); + sort(track.panEndMin, track.panEndMax); +#endif // BLADERUNNER_ORIGINAL_BUGS track.priority = f.readInt(); f.skip(4); // field_45 } diff --git a/engines/bladerunner/ui/kia_section_pogo.cpp b/engines/bladerunner/ui/kia_section_pogo.cpp index cd0bb27efb..967ed37cbb 100644 --- a/engines/bladerunner/ui/kia_section_pogo.cpp +++ b/engines/bladerunner/ui/kia_section_pogo.cpp @@ -263,6 +263,7 @@ void KIASectionPogo::draw(Graphics::Surface &surface) { _vm->_mainFont->drawString(&surface, title, 313 - _vm->_mainFont->getStringWidth(title) / 2, 143, surface.w, surface.format.RGBToColor(240, 232, 192)); int y = 158; + int lineTextWidth; for (int i = 0; i < kLineCount; ++i) { if (updateTimeout) { if (_lineTimeouts[i] > 0) { @@ -270,7 +271,8 @@ void KIASectionPogo::draw(Graphics::Surface &surface) { } else { _lineTexts[i] = _strings[_stringIndex]; _lineTimeouts[i] = 63; - _lineOffsets[i] = _vm->_rnd.getRandomNumberRng(0, 306 - _vm->_mainFont->getStringWidth(_lineTexts[i])) + 155; + lineTextWidth = _vm->_mainFont->getStringWidth(_lineTexts[i]); + _lineOffsets[i] = _vm->_rnd.getRandomNumberRng(0, (306 - lineTextWidth) > 0 ? (306 - lineTextWidth) : 0) + 155; _stringIndex = (_stringIndex + 1) % kStringCount; } -- cgit v1.2.3