diff options
Diffstat (limited to 'engines/kyra/lol.cpp')
-rw-r--r-- | engines/kyra/lol.cpp | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/engines/kyra/lol.cpp b/engines/kyra/lol.cpp index 7c4b073f29..8f00708e43 100644 --- a/engines/kyra/lol.cpp +++ b/engines/kyra/lol.cpp @@ -214,8 +214,6 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy _compassBroken = _drainMagic = 0; _dialogueField = false; - _rndSpecial = 0x12349876; - _buttonData = 0; _activeButtons = 0; gui_resetButtonList(); @@ -1082,7 +1080,7 @@ bool LoLEngine::addCharacter(int id) { loadCharFaceShapes(numChars, id); - _characters[numChars].nextAnimUpdateCountdown = (int16) _rnd.getRandomNumberRng(1, 12) + 6; + _characters[numChars].nextAnimUpdateCountdown = (int16) generateRandomNumber(1, 12) + 6; for (i = 0; i < 11; i++) { if (_characters[numChars].items[i]) { @@ -1176,7 +1174,7 @@ void LoLEngine::updatePortraitSpeechAnim() { } } - int f = _rnd.getRandomNumberRng(1, 6) - 1; + int f = generateRandomNumber(1, 6) - 1; if (f == _characters[_updateCharNum].curFaceFrame) f++; if (f > 5) @@ -1404,24 +1402,24 @@ void LoLEngine::increaseExperience(int charNum, int skill, uint32 points) { switch (skill) { case 0: _txt->printMessage(0x8003, getLangString(0x4023), _characters[charNum].name); - inc = _rnd.getRandomNumberRng(4, 6); + inc = generateRandomNumber(4, 6); _characters[charNum].hitPointsCur += inc; _characters[charNum].hitPointsMax += inc; break; case 1: _txt->printMessage(0x8003, getLangString(0x4025), _characters[charNum].name); - inc = _rnd.getRandomNumberRng(2, 6); + inc = generateRandomNumber(2, 6); _characters[charNum].hitPointsCur += inc; _characters[charNum].hitPointsMax += inc; break; case 2: _txt->printMessage(0x8003, getLangString(0x4024), _characters[charNum].name); - inc = (_characters[charNum].defaultModifiers[6] * (_rnd.getRandomNumberRng(1, 8) + 17)) >> 8; + inc = (_characters[charNum].defaultModifiers[6] * (generateRandomNumber(1, 8) + 17)) >> 8; _characters[charNum].magicPointsCur += inc; _characters[charNum].magicPointsMax += inc; - inc = _rnd.getRandomNumberRng(1, 6); + inc = generateRandomNumber(1, 6); _characters[charNum].hitPointsCur += inc; _characters[charNum].hitPointsMax += inc; break; @@ -1874,6 +1872,29 @@ void LoLEngine::delay(uint32 millis, bool doUpdate, bool) { } } +int LoLEngine::generateRandomNumber(int min, int max) { + // The output produced by this random number generator + // differs a lot from _rnd.getRandomNumberRng(). Using + // _rnd.getRandomNumberRng() instead of this function + // here will break the fighting system! + + if (min <= 0 || max <= 0) + return 0; + + int res = 0; + int d = 0; + + do { + int val = (((int)_rnd.getRandomNumber(0x7fff) * max) / 0x8000) + 1; + if (val > max) + val -= max; + res += val; + d++; + } while (d < min); + + return res; +} + void LoLEngine::updateEnvironmentalSfx(int soundId) { snd_processEnvironmentalSoundEffect(soundId, _currentBlock); } @@ -2260,7 +2281,7 @@ int LoLEngine::processMagicIce(int charNum, int spellLevel) { } else { uint16 o = _levelBlockProperties[calcNewBlockPosition(_currentBlock, _currentDirection)].assignedObjects; while (o & 0x8000) { - int might = _rnd.getRandomNumberRng(iceDamageMin[spellLevel], iceDamageMax[spellLevel]) + iceDamageAdd[spellLevel]; + int might = generateRandomNumber(iceDamageMin[spellLevel], iceDamageMax[spellLevel]) + iceDamageAdd[spellLevel]; int dmg = calcInflictableDamagePerItem(charNum, 0, might, 3, 2); MonsterInPlay *m = &_monsters[o & 0x7fff]; @@ -3192,7 +3213,7 @@ int LoLEngine::battleHitSkillTest(int16 attacker, int16 target, int skill) { evadeChanceModifier = _characters[target].defaultModifiers[3]; } - int r = _rnd.getRandomNumberRng(1, 100); + int r = generateRandomNumber(1, 100); if (r >= sk) return 2; @@ -3230,9 +3251,9 @@ int LoLEngine::inflictDamage(uint16 target, int damage, uint16 attacker, int ski m->hitPoints -= damage; m->damageReceived = 0x8000 | damage; m->flags |= 0x10; - m->hitOffsX = _rnd.getRandomNumberRng(1, 24); + m->hitOffsX = generateRandomNumber(1, 24); m->hitOffsX -= 12; - m->hitOffsY = _rnd.getRandomNumberRng(1, 24); + m->hitOffsY = generateRandomNumber(1, 24); m->hitOffsY -= 12; m->hitPoints = CLIP<int16>(m->hitPoints, 0, m->properties->hitPoints); @@ -3436,7 +3457,7 @@ void LoLEngine::checkForPartyDeath() { } void LoLEngine::applyMonsterAttackSkill(MonsterInPlay *monster, int16 target, int16 damage) { - if (_rnd.getRandomNumberRng(1, 100) > monster->properties->attackSkillChance) + if (generateRandomNumber(1, 100) > monster->properties->attackSkillChance) return; int t = 0; @@ -3506,7 +3527,7 @@ void LoLEngine::applyMonsterAttackSkill(MonsterInPlay *monster, int16 target, in } void LoLEngine::applyMonsterDefenseSkill(MonsterInPlay *monster, int16 attacker, int flags, int skill, int damage) { - if (_rnd.getRandomNumberRng(1, 100) > monster->properties->defenseSkillChance) + if (generateRandomNumber(1, 100) > monster->properties->defenseSkillChance) return; int itm = 0; @@ -3593,7 +3614,7 @@ int LoLEngine::paralyzePoisonCharacter(int charNum, int typeFlag, int immunityFl if (!(_characters[charNum].flags & 1) || (_characters[charNum].flags & immunityFlags)) return 0; - if ((int)_rnd.getRandomNumberRng(1, 100) > hitChance) + if ((int)generateRandomNumber(1, 100) > hitChance) return 0; int r = 0; @@ -3711,7 +3732,7 @@ void LoLEngine::launchMagicViper() { _screen->copyPage(12, 0); _screen->copyPage(12, 2); - int t = _rnd.getRandomNumberRng(1, 4); + int t = generateRandomNumber(1, 4); for (int i = 0; i < 4; i++) { if (!(_characters[i].flags & 1)) { |