diff options
author | johndoe123 | 2014-04-14 15:49:11 +0200 |
---|---|---|
committer | Eugene Sandulenko | 2018-07-20 06:43:33 +0000 |
commit | e9a443fcd94bdfa10149596d668dafb660ed60e0 (patch) | |
tree | 06cfdcb1a3b447d196110fb7b0c891d0621d97bd | |
parent | 097d130e7dd5de95050e800419f4d07aabb7562b (diff) | |
download | scummvm-rg350-e9a443fcd94bdfa10149596d668dafb660ed60e0.tar.gz scummvm-rg350-e9a443fcd94bdfa10149596d668dafb660ed60e0.tar.bz2 scummvm-rg350-e9a443fcd94bdfa10149596d668dafb660ed60e0.zip |
ILLUSIONS: Implement palette shifting and color shadow table
-rw-r--r-- | engines/illusions/illusions_duckman.cpp | 2 | ||||
-rw-r--r-- | engines/illusions/screen.cpp | 89 | ||||
-rw-r--r-- | engines/illusions/screen.h | 3 | ||||
-rw-r--r-- | engines/illusions/scriptopcodes_duckman.cpp | 17 | ||||
-rw-r--r-- | engines/illusions/scriptopcodes_duckman.h | 2 | ||||
-rw-r--r-- | engines/illusions/sequenceopcodes.cpp | 8 | ||||
-rw-r--r-- | engines/illusions/sequenceopcodes.h | 1 |
7 files changed, 103 insertions, 19 deletions
diff --git a/engines/illusions/illusions_duckman.cpp b/engines/illusions/illusions_duckman.cpp index e36cd354f6..135bd0b8c7 100644 --- a/engines/illusions/illusions_duckman.cpp +++ b/engines/illusions/illusions_duckman.cpp @@ -232,7 +232,7 @@ Common::Point IllusionsEngine_Duckman::getNamedPointPosition(uint32 namedPointId } } else { // TODO - //debug("getNamedPointPosition(%08X) UNKNOWN", namedPointId); + debug("getNamedPointPosition(%08X) UNKNOWN", namedPointId); return Common::Point(0, 0); } } diff --git a/engines/illusions/screen.cpp b/engines/illusions/screen.cpp index 57989e738f..35e8b59271 100644 --- a/engines/illusions/screen.cpp +++ b/engines/illusions/screen.cpp @@ -312,7 +312,7 @@ void Screen::setPalette(byte *colors, uint start, uint count) { *dstPal++ = *colors++; ++colors; } - // TODO Build colorTransTbl + buildColorTransTbl(); _needRefreshPalette = true; } @@ -334,6 +334,42 @@ void Screen::getPalette(byte *colors) { } } +void Screen::shiftPalette(int16 fromIndex, int16 toIndex) { + //debug("shiftPalette(%d, %d)", fromIndex, toIndex); + byte r, g, b; + if (toIndex > fromIndex) { + r = _mainPalette[3 * toIndex + 0]; + g = _mainPalette[3 * toIndex + 1]; + b = _mainPalette[3 * toIndex + 2]; + for (int16 i = toIndex; i > fromIndex; --i) { + byte *dst = &_mainPalette[3 * i]; + byte *src = &_mainPalette[3 * (i - 1)]; + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + } + _mainPalette[3 * fromIndex + 0] = r; + _mainPalette[3 * fromIndex + 1] = g; + _mainPalette[3 * fromIndex + 2] = b; + } else { + r = _mainPalette[3 * toIndex + 0]; + g = _mainPalette[3 * toIndex + 1]; + b = _mainPalette[3 * toIndex + 2]; + for (int16 i = toIndex + 1; i < fromIndex; +i) { + byte *dst = &_mainPalette[3 * i]; + byte *src = &_mainPalette[3 * (i + 1)]; + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + } + _mainPalette[3 * fromIndex + 0] = r; + _mainPalette[3 * fromIndex + 1] = g; + _mainPalette[3 * fromIndex + 2] = b; + } + // TODO Refresh colorTransTbl + _needRefreshPalette = true; +} + void Screen::updatePalette() { if (_needRefreshPalette) { // TODO Update fader palette @@ -342,6 +378,30 @@ void Screen::updatePalette() { } } +void Screen::buildColorTransTbl() { + const int cr = _mainPalette[3 * 1 + 0]; + const int cg = _mainPalette[3 * 1 + 1]; + const int cb = _mainPalette[3 * 1 + 2]; + for (int index1 = 0; index1 < 256; ++index1) { + const int dr = (cr + _mainPalette[3 * index1 + 0]) / 2; + const int dg = (cg + _mainPalette[3 * index1 + 1]) / 2; + const int db = (cb + _mainPalette[3 * index1 + 2]) / 2; + int minDistance = 766; + int minIndex2 = 2; + for (int index2 = 2; index2 < 256; ++index2) { + int distance = + ABS(dr - _mainPalette[3 * index2 + 0]) + + ABS(dg - _mainPalette[3 * index2 + 1]) + + ABS(db - _mainPalette[3 * index2 + 2]); + if (distance < minDistance) { + minDistance = distance; + minIndex2 = index2; + } + } + _colorTransTbl[index1] = minIndex2; + } +} + void Screen::drawText(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count) { for (uint i = 0; i < count; ++i) x += font->_widthC + drawChar(font, surface, x, y, *text++); @@ -456,9 +516,13 @@ void Screen::drawSurface81(int16 destX, int16 destY, Graphics::Surface *surface, byte *src = (byte*)surface->getBasePtr(srcRect.left, srcRect.top + yc); byte *dst = (byte*)_backSurface->getBasePtr(destX, destY + yc); for (int16 xc = 0; xc < w; ++xc) { - byte pixel = *src++; - if (pixel != 0) - *dst = pixel; + const byte pixel = *src++; + if (pixel != 0) { + if (pixel == 1) + *dst = _colorTransTbl[*dst]; + else + *dst = pixel; + } ++dst; } } @@ -485,9 +549,12 @@ void Screen::drawSurface82(Common::Rect &dstRect, Graphics::Surface *surface, Co byte *src = (byte*)surface->getBasePtr(srcRect.left, srcY); byte *dstRow = dst; while (w-- > 0) { - byte pixel = *src; + const byte pixel = *src; if (pixel != 0) { - *dstRow = pixel; + if (pixel == 1) + *dstRow = _colorTransTbl[*dstRow]; + else + *dstRow = pixel; } ++dstRow; src += errXStart; @@ -498,9 +565,13 @@ void Screen::drawSurface82(Common::Rect &dstRect, Graphics::Surface *surface, Co } } while (skipX-- > 0) { - byte pixel = *src; - if (pixel != 0) - *dstRow = pixel; + const byte pixel = *src; + if (pixel != 0) { + if (pixel == 1) + *dstRow = _colorTransTbl[*dstRow]; + else + *dstRow = pixel; + } ++src; ++dstRow; } diff --git a/engines/illusions/screen.h b/engines/illusions/screen.h index 91750cfba5..bdecda48a5 100644 --- a/engines/illusions/screen.h +++ b/engines/illusions/screen.h @@ -114,6 +114,7 @@ public: void setPalette(byte *colors, uint start, uint count); void setPaletteEntry(int16 index, byte r, byte g, byte b); void getPalette(byte *colors); + void shiftPalette(int16 fromIndex, int16 toIndex); void updatePalette(); void drawText(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count); int16 drawChar(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 c); @@ -130,8 +131,10 @@ public: bool _needRefreshPalette; byte _mainPalette[768]; + byte _colorTransTbl[256]; void setSystemPalette(byte *palette); + void buildColorTransTbl(); void decompressSprite8(SpriteDecompressQueueItem *item); void drawSurface8(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, int16 scale, uint32 flags); diff --git a/engines/illusions/scriptopcodes_duckman.cpp b/engines/illusions/scriptopcodes_duckman.cpp index 0312172c5f..b932037f00 100644 --- a/engines/illusions/scriptopcodes_duckman.cpp +++ b/engines/illusions/scriptopcodes_duckman.cpp @@ -71,6 +71,7 @@ void ScriptOpcodes_Duckman::initOpcodes() { OPCODE(23, opExitModalScene); OPCODE(24, opEnterScene24); OPCODE(25, opLeaveScene24); + OPCODE(32, opPanCenterObject); OPCODE(33, opPanTrackObject); OPCODE(34, opPanToObject); OPCODE(36, opPanToPoint); @@ -133,7 +134,6 @@ void ScriptOpcodes_Duckman::initOpcodes() { OPCODE(20, opEnterScene); OPCODE(30, opEnterCloseUpScene); OPCODE(31, opExitCloseUpScene); - OPCODE(32, opPanCenterObject); OPCODE(35, opPanToNamedPoint); OPCODE(53, opSetActorToNamedPoint); OPCODE(63, opSetSelectSfx); @@ -252,7 +252,8 @@ void ScriptOpcodes_Duckman::opEnterScene18(ScriptThread *scriptThread, OpCall &o //static uint dsceneId = 0x0001002D, dthreadId = 0x00020141; //static uint dsceneId = 0x0001004B, dthreadId = 0x0002029B; //static uint dsceneId = 0x00010021, dthreadId = 0x00020113; -static uint dsceneId = 0x0001000A, dthreadId = 0x00020043; +//static uint dsceneId = 0x0001000A, dthreadId = 0x00020043;//Home front +static uint dsceneId = 0x0001000E, dthreadId = 0x0002007C; void ScriptOpcodes_Duckman::opChangeScene(ScriptThread *scriptThread, OpCall &opCall) { ARG_SKIP(2); @@ -315,6 +316,12 @@ void ScriptOpcodes_Duckman::opLeaveScene24(ScriptThread *scriptThread, OpCall &o _vm->leavePause(_vm->getCurrentScene(), opCall._callerThreadId); } +void ScriptOpcodes_Duckman::opPanCenterObject(ScriptThread *scriptThread, OpCall &opCall) { + ARG_INT16(speed); + ARG_UINT32(objectId); + _vm->_camera->panCenterObject(objectId, speed); +} + void ScriptOpcodes_Duckman::opPanTrackObject(ScriptThread *scriptThread, OpCall &opCall) { ARG_SKIP(2); ARG_UINT32(objectId); @@ -787,12 +794,6 @@ void ScriptOpcodes_Duckman::opExitCloseUpScene(ScriptThread *scriptThread, OpCal opCall._result = kTSYield; } -void ScriptOpcodes_Duckman::opPanCenterObject(ScriptThread *scriptThread, OpCall &opCall) { - ARG_INT16(speed); - ARG_UINT32(objectId); - _vm->_camera->panCenterObject(objectId, speed); -} - void ScriptOpcodes_Duckman::opPanToNamedPoint(ScriptThread *scriptThread, OpCall &opCall) { ARG_INT16(speed); ARG_UINT32(namedPointId); diff --git a/engines/illusions/scriptopcodes_duckman.h b/engines/illusions/scriptopcodes_duckman.h index be093c488a..4c66d346d9 100644 --- a/engines/illusions/scriptopcodes_duckman.h +++ b/engines/illusions/scriptopcodes_duckman.h @@ -58,6 +58,7 @@ protected: void opExitModalScene(ScriptThread *scriptThread, OpCall &opCall); void opEnterScene24(ScriptThread *scriptThread, OpCall &opCall); void opLeaveScene24(ScriptThread *scriptThread, OpCall &opCall); + void opPanCenterObject(ScriptThread *scriptThread, OpCall &opCall); void opPanTrackObject(ScriptThread *scriptThread, OpCall &opCall); void opPanToObject(ScriptThread *scriptThread, OpCall &opCall); void opPanToPoint(ScriptThread *scriptThread, OpCall &opCall); @@ -120,7 +121,6 @@ protected: void opEnterScene(ScriptThread *scriptThread, OpCall &opCall); void opEnterCloseUpScene(ScriptThread *scriptThread, OpCall &opCall); void opExitCloseUpScene(ScriptThread *scriptThread, OpCall &opCall); - void opPanCenterObject(ScriptThread *scriptThread, OpCall &opCall); void opPanToNamedPoint(ScriptThread *scriptThread, OpCall &opCall); void opSetActorToNamedPoint(ScriptThread *scriptThread, OpCall &opCall); void opSetSelectSfx(ScriptThread *scriptThread, OpCall &opCall); diff --git a/engines/illusions/sequenceopcodes.cpp b/engines/illusions/sequenceopcodes.cpp index 868a565170..92b4e128d6 100644 --- a/engines/illusions/sequenceopcodes.cpp +++ b/engines/illusions/sequenceopcodes.cpp @@ -25,6 +25,7 @@ #include "illusions/actor.h" #include "illusions/actorresource.h" #include "illusions/dictionary.h" +#include "illusions/screen.h" #include "illusions/scriptman.h" #include "illusions/scriptopcodes.h" @@ -88,6 +89,7 @@ void SequenceOpcodes::initOpcodes() { OPCODE(40, opSetPriorityLayer); OPCODE(41, opDisableAutoRegionLayer); OPCODE(42, opSetRegionLayer); + OPCODE(49, opShiftPalette); OPCODE(50, opPlaySound); OPCODE(51, opStopSound); OPCODE(52, opStartScriptThread); @@ -335,6 +337,12 @@ void SequenceOpcodes::opSetRegionLayer(Control *control, OpCall &opCall) { control->_actor->_regionLayer = bgRes->getRegionLayer(regionLayerIndex - 1); } +void SequenceOpcodes::opShiftPalette(Control *control, OpCall &opCall) { + ARG_INT16(fromIndex); + ARG_INT16(toIndex); + _vm->_screen->shiftPalette(fromIndex, toIndex); +} + void SequenceOpcodes::opPlaySound(Control *control, OpCall &opCall) { ARG_INT16(flags); ARG_INT16(volume); diff --git a/engines/illusions/sequenceopcodes.h b/engines/illusions/sequenceopcodes.h index f423d07b10..384507e0fa 100644 --- a/engines/illusions/sequenceopcodes.h +++ b/engines/illusions/sequenceopcodes.h @@ -77,6 +77,7 @@ protected: void opSetPriorityLayer(Control *control, OpCall &opCall); void opDisableAutoRegionLayer(Control *control, OpCall &opCall); void opSetRegionLayer(Control *control, OpCall &opCall); + void opShiftPalette(Control *control, OpCall &opCall); void opPlaySound(Control *control, OpCall &opCall); void opStopSound(Control *control, OpCall &opCall); void opStartScriptThread(Control *control, OpCall &opCall); |