diff options
-rw-r--r-- | engines/kyra/lol.cpp | 4 | ||||
-rw-r--r-- | engines/kyra/lol.h | 1 | ||||
-rw-r--r-- | engines/kyra/scene_lol.cpp | 25 | ||||
-rw-r--r-- | engines/kyra/screen_lol.cpp | 41 | ||||
-rw-r--r-- | engines/kyra/screen_lol.h | 2 |
5 files changed, 67 insertions, 6 deletions
diff --git a/engines/kyra/lol.cpp b/engines/kyra/lol.cpp index 6ce05b1e3d..cf42d0b2d8 100644 --- a/engines/kyra/lol.cpp +++ b/engines/kyra/lol.cpp @@ -2676,6 +2676,8 @@ int LoLEngine::processMagicFog() { } int LoLEngine::processMagicSwarm(int charNum, int damage) { + loadFxTables(); + int cp = _screen->setCurPage(2); _screen->copyPage(0, 12); snd_playSoundEffect(74, -1); @@ -2876,6 +2878,8 @@ void LoLEngine::callbackProcessMagicLightning(WSAMovie_v2 *mov, int x, int y) { } void LoLEngine::drinkBezelCup(int numUses, int charNum) { + loadFxTables(); + int cp = _screen->setCurPage(2); snd_playSoundEffect(73, -1); diff --git a/engines/kyra/lol.h b/engines/kyra/lol.h index 40dec5f712..775369b54c 100644 --- a/engines/kyra/lol.h +++ b/engines/kyra/lol.h @@ -982,6 +982,7 @@ private: void loadCmzFile(const char *file); void loadLevelShpDat(const char *shpFile, const char *datFile, bool flag); void loadLevelGraphics(const char *file, int specialColor, int weight, int vcnLen, int vmpLen, const char *palFile); + void loadFxTables(); void resetItems(int flag); void disableMonsters(); diff --git a/engines/kyra/scene_lol.cpp b/engines/kyra/scene_lol.cpp index 3dadeb91c8..bc1f11a492 100644 --- a/engines/kyra/scene_lol.cpp +++ b/engines/kyra/scene_lol.cpp @@ -440,21 +440,34 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight _loadSuppFilesFlag = 0; generateBrightnessPalette(_screen->getPalette(0), _screen->getPalette(1), _brightness, _lampEffect); - char tname[13]; - snprintf(tname, sizeof(tname), "LEVEL%.02d.TLC", _currentLevel); - Common::SeekableReadStream *s = _res->createReadStream(tname); - if (s) { + if (_flags.isTalkie) { + char tname[13]; + snprintf(tname, sizeof(tname), "LEVEL%.02d.TLC", _currentLevel); + Common::SeekableReadStream *s = _res->createReadStream(tname); s->read(_trueLightTable1, 256); s->read(_trueLightTable2, 5120); delete s; } else { - memset(_trueLightTable1, 0, 256); - memset(_trueLightTable2, 0, 5120); + loadFxTables(); } _loadSuppFilesFlag = 1; } +void LoLEngine::loadFxTables() { + if (_flags.isTalkie || _loadSuppFilesFlag) + return; + + Palette tpal(768); + _screen->loadPalette("fxpal.col", tpal); + _screen->loadBitmap("fxpal.shp", 3, 3, 0); + const uint8 *v = _screen->getCPagePtr(2) + 11; + + _screen->generateTruelightTables(v, 20, tpal, _screen->getPalette(1), _trueLightTable1, _trueLightTable2, 70); + + _loadSuppFilesFlag = 1; +} + void LoLEngine::resetItems(int flag) { for (int i = 0; i < 1024; i++) { _levelBlockProperties[i].direction = 5; diff --git a/engines/kyra/screen_lol.cpp b/engines/kyra/screen_lol.cpp index ce8a1bdaa4..6e855f7a7f 100644 --- a/engines/kyra/screen_lol.cpp +++ b/engines/kyra/screen_lol.cpp @@ -216,6 +216,47 @@ uint8 *Screen_LoL::generateLevelOverlay(const Palette &srcPal, uint8 *ovl, int o return ovl; } +void Screen_LoL::generateTruelightTables(const uint8 *shp, int a, const Palette &fxPal, const Palette &screenPal, uint8 *outTable1, uint8 *outTable2, int b) { + memset(outTable1, 0xff, 256); + + for (int i = 0; i < a; i++) + outTable1[shp[i]] = i; + + for (int i = 0; i < a; i++) { + if (shp[i]) { + uint8 tcol[3]; + uint16 fcol[3]; + uint16 scol[3]; + + int t1 = (b << 6) / 100; + int t2 = 64 - t1; + + uint8 c = shp[i]; + fcol[0] = fxPal[3 * c]; + fcol[1] = fxPal[3 * c + 1]; + fcol[2] = fxPal[3 * c + 2]; + + uint8 *o = &outTable2[i << 8]; + + for (int ii = 0; ii < 256; ii++) { + scol[0] = screenPal[3 * ii]; + scol[1] = screenPal[3 * ii + 1]; + scol[2] = screenPal[3 * ii + 2]; + + tcol[0] = CLIP(((fcol[0] * t2) >> 6) + ((scol[0] * t1) >> 6), 0, 63); + tcol[1] = CLIP(((fcol[1] * t2) >> 6) + ((scol[1] * t1) >> 6), 0, 63); + tcol[2] = CLIP(((fcol[2] * t2) >> 6) + ((scol[2] * t1) >> 6), 0, 63); + + o[ii] = findLeastDifferentColor(tcol, screenPal, 0, 255); + } + + } else { + for (int ii = 0; ii < 256; ii++) + outTable2[(i << 8) + ii] = 0; + } + } +} + void Screen_LoL::drawGridBox(int x, int y, int w, int h, int col) { if (w <= 0 || x >= 320 || h <= 0 || y >= 200) return; diff --git a/engines/kyra/screen_lol.h b/engines/kyra/screen_lol.h index 4980a89694..2c52213b29 100644 --- a/engines/kyra/screen_lol.h +++ b/engines/kyra/screen_lol.h @@ -80,6 +80,8 @@ public: uint8 *generateLevelOverlay(const Palette &Pal, uint8 *ovl, int opColor, int weight); uint8 *getLevelOverlay(int index) { return _levelOverlays[index]; } + void generateTruelightTables(const uint8 *shp, int a, const Palette &fxPal, const Palette &screenPal, uint8 *outTable1, uint8 *outTable2, int b); + void copyBlockAndApplyOverlay(int page1, int x1, int y1, int page2, int x2, int y2, int w, int h, int dim, uint8 *ovl); void applyOverlaySpecial(int page1, int x1, int y1, int page2, int x2, int y2, int w, int h, int dim, int flag, uint8 *ovl); |