aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra/timer_lol.cpp
diff options
context:
space:
mode:
authorFlorian Kagerer2009-04-25 13:15:05 +0000
committerFlorian Kagerer2009-04-25 13:15:05 +0000
commitccb64ad81e6c56eaa2350197f964d470d8610ed9 (patch)
tree308379b40196a5a934c2161bdaa28673a007940f /engines/kyra/timer_lol.cpp
parentf1893d8f25b8f4fc5f6ed48e61dec0c2050bd567 (diff)
downloadscummvm-rg350-ccb64ad81e6c56eaa2350197f964d470d8610ed9.tar.gz
scummvm-rg350-ccb64ad81e6c56eaa2350197f964d470d8610ed9.tar.bz2
scummvm-rg350-ccb64ad81e6c56eaa2350197f964d470d8610ed9.zip
LOL: - Started implementing the fighting system. The damage inflicted is wrong, however (at least the damage inflicted by the monsters). I'm sowewhat clueless about that bug atm.
- added support for monsters with distance attacks (like those orcs in front of roland's house) - lots of small bug fixes - Some startup support for the pc-98 16 color version. The intro will run, but the font drawing/coloring is still wrong. svn-id: r40144
Diffstat (limited to 'engines/kyra/timer_lol.cpp')
-rw-r--r--engines/kyra/timer_lol.cpp111
1 files changed, 103 insertions, 8 deletions
diff --git a/engines/kyra/timer_lol.cpp b/engines/kyra/timer_lol.cpp
index f82687b2d5..79bb8d1c2d 100644
--- a/engines/kyra/timer_lol.cpp
+++ b/engines/kyra/timer_lol.cpp
@@ -40,12 +40,12 @@ void LoLEngine::setupTimers() {
_timer->addTimer(0x10, TimerV2(timerProcessMonsters), 6, true);
_timer->addTimer(0x11, TimerV2(timerProcessMonsters), 6, true);
_timer->setNextRun(0x11, _system->getMillis() + 3 * _tickLength);
- _timer->addTimer(3, TimerV2(timerSub3), 15, true);
+ _timer->addTimer(3, TimerV2(timerSpecialCharacterUpdate), 15, true);
_timer->addTimer(4, TimerV2(timerProcessFlyingObjects), 1, true);
_timer->addTimer(0x50, TimerV2(timerRunSceneAnimScript), 0, false);
_timer->addTimer(0x51, TimerV2(timerRunSceneAnimScript), 0, false);
_timer->addTimer(0x52, TimerV2(timerRunSceneAnimScript), 0, false);
- _timer->addTimer(8, TimerV2(timerSub6), 1200, true);
+ _timer->addTimer(8, TimerV2(timerRegeneratePoints), 1200, true);
_timer->addTimer(9, TimerV2(timerUpdatePortraitAnimations), 10, true);
_timer->addTimer(10, TimerV2(timerUpdateLampState), 360, true);
_timer->addTimer(11, TimerV2(timerFadeMessageText), 360, false);
@@ -104,22 +104,101 @@ void LoLEngine::timerProcessDoors(int timerNum) {
}
void LoLEngine::timerProcessMonsters(int timerNum) {
-// if (!_updateMonsters)
-// return;
-
for (int i = timerNum & 0x0f; i < 30; i += 2)
updateMonster(&_monsters[i]);
}
-void LoLEngine::timerSub3(int timerNum) {
+void LoLEngine::timerSpecialCharacterUpdate(int timerNum) {
+ int v = 0;
+ for (int i = 0; i < 4; i++) {
+ if (!(_characters[i].flags & 1))
+ continue;
+
+ for (int ii = 0; ii < 5; ii++) {
+ if (!(_characters[i].characterUpdateEvents[ii]))
+ continue;
+
+ if (--_characters[i].characterUpdateDelay[ii] > 0) {
+ if (_characters[i].characterUpdateDelay[ii] > v)
+ v = _characters[i].characterUpdateDelay[ii];
+ continue;
+ }
+
+ switch (_characters[i].characterUpdateEvents[ii] - 1) {
+ case 0:
+ if (_characters[i].weaponHit) {
+ _characters[i].weaponHit = 0;
+ _characters[i].characterUpdateDelay[ii] = calcMonsterSkillLevel(i, 6);
+ if (_characters[i].characterUpdateDelay[ii] > v)
+ v = _characters[i].characterUpdateDelay[ii];
+ } else {
+ _characters[i].flags &= 0xfffb;
+ }
+
+ gui_drawCharPortraitWithStats(i);
+ break;
+
+ case 1:
+ _characters[i].damageSuffered = 0;
+ gui_drawCharPortraitWithStats(i);
+ break;
+
+ case 2:
+ _characters[i].flags &= 0xffbf;
+ gui_drawCharPortraitWithStats(i);
+ break;
+
+ case 3:
+ v = _rnd.getRandomNumberRng(1, 2);
+ if (inflictDamage(i, v, 0x8000, 0, 0x80)) {
+ _txt->printMessage(2, getLangString(0x4022), _characters[i].name);
+ _characters[i].characterUpdateDelay[ii] = 10;
+ if (_characters[i].characterUpdateDelay[ii] > v)
+ v = _characters[i].characterUpdateDelay[ii];
+ }
+ break;
+
+ case 4:
+ _characters[i].flags &= 0xfeff;
+ _txt->printMessage(0, getLangString(0x4027), _characters[i].name);
+ gui_drawCharPortraitWithStats(i);
+ break;
+
+ case 5:
+ setTemporaryFaceFrame(i, 0, 0, 1);
+ break;
+
+ case 6:
+ _characters[i].flags &= 0xefff;
+ gui_drawCharPortraitWithStats(i);
+ break;
+
+ case 7:
+ level11specialUnk();
+ break;
+
+ default:
+ break;
+ }
+
+ if (_characters[i].characterUpdateDelay[ii] <= 0)
+ _characters[i].characterUpdateEvents[ii] = 0;
+ }
+ }
+ if (v) {
+ _timer->enable(3);
+ _timer3Para = v * 15;
+ } else {
+ _timer->disable(3);
+ }
}
void LoLEngine::timerProcessFlyingObjects(int timerNum) {
for (int i = 0; i < 8; i++) {
if (!_flyingObjects[i].enable)
continue;
- updateFlyingObjects(&_flyingObjects[i]);
+ updateFlyingObject(&_flyingObjects[i]);
}
}
@@ -127,8 +206,24 @@ void LoLEngine::timerRunSceneAnimScript(int timerNum) {
runLevelScript(0x401 + (timerNum & 0x0f), -1);
}
-void LoLEngine::timerSub6(int timerNum) {
+void LoLEngine::timerRegeneratePoints(int timerNum) {
+ for (int i = 0; i < 4; i++) {
+ if (!(_characters[i].flags & 1))
+ continue;
+ // check for Duble ring
+ int hInc = (_characters[i].flags & 8) ? 0 : (itemEquipped(i, 228) ? 4 : 1);
+ // check for Talba ring
+ int mInc = _drainMagic ? ((_characters[i].magicPointsMax >> 5) * -1) :
+ ((_characters[i].flags & 8) ? 0 : (itemEquipped(i, 227) ? (_characters[i].magicPointsMax / 10) : 1));
+
+ _characters[i].magicPointsCur = CLIP<int16>(_characters[i].magicPointsCur + mInc, 0, _characters[i].magicPointsMax);
+
+ if (!(_characters[i].flags & 0x80))
+ increaseCharacterHitpoints(i, hInc, false);
+
+ gui_drawCharPortraitWithStats(i);
+ }
}
void LoLEngine::timerUpdatePortraitAnimations(int skipUpdate) {