Implemented some palette code differences for Amiga version.

svn-id: r26281
This commit is contained in:
Johannes Schickel 2007-03-23 16:24:28 +00:00
parent 32c7ee7748
commit 661944a0f9
7 changed files with 147 additions and 66 deletions

View file

@ -1438,6 +1438,9 @@ void KyraEngine::gui_redrawHighlight(Menu menu) {
}
void KyraEngine::gui_fadePalette() {
if (_flags.platform == Common::kPlatformAmiga)
return;
static int16 menuPalIndexes[] = {248, 249, 250, 251, 252, 253, 254, -1};
int index = 0;
@ -1456,6 +1459,9 @@ void KyraEngine::gui_fadePalette() {
}
void KyraEngine::gui_restorePalette() {
if (_flags.platform == Common::kPlatformAmiga)
return;
memcpy(_screen->_currentPalette, _screen->getPalette(2), 768);
_screen->fadePalette(_screen->_currentPalette, 2);
}

View file

@ -450,7 +450,7 @@ void KyraEngine::startSceneScript(int brandonAlive) {
strcat(fileNameBuffer, ".CPS");
_screen->clearPage(3);
// FIXME: check this hack for amiga version
_screen->loadBitmap(fileNameBuffer, 3, 3, (_flags.platform == Common::kPlatformAmiga ? _screen->getPalette(1) : 0));
_screen->loadBitmap(fileNameBuffer, 3, 3, (_flags.platform == Common::kPlatformAmiga ? _screen->getPalette(0) : 0));
_sprites->loadSceneShapes();
_exitListPtr = 0;
@ -824,35 +824,55 @@ void KyraEngine::initSceneObjectList(int brandonAlive) {
}
void KyraEngine::initSceneScreen(int brandonAlive) {
if (_unkScreenVar1 && !queryGameFlag(0xA0)) {
for (int i = 0; i < 60; ++i) {
uint16 col = _screen->getPalette(0)[684+i];
col += _screen->getPalette(1)[684+i] << 1;
col >>= 2;
_screen->getPalette(0)[684+i] = col;
}
_screen->setScreenPalette(_screen->getPalette(0));
}
if (_unkScreenVar2 == 1) {
_screen->shuffleScreen(8, 8, 304, 128, 2, 0, _unkScreenVar3, false);
} else {
_screen->copyRegion(8, 8, 8, 8, 304, 128, 2, 0);
}
if (_unkScreenVar1 && _paletteChanged) {
if (!queryGameFlag(0xA0)) {
memcpy(_screen->getPalette(0) + 684, _screen->getPalette(1) + 684, 60);
_screen->setScreenPalette(_screen->getPalette(0));
} else {
memset(_screen->getPalette(0), 0, 768);
}
}
// FIXME: hack to get the room palette working
if (_flags.platform == Common::kPlatformAmiga) {
memcpy(_screen->getPalette(0), _screen->getPalette(1), 32*3);
_screen->setScreenPalette(_screen->getPalette(0));
if (_unkScreenVar1 && !queryGameFlag(0xF0)) {
memset(_screen->getPalette(2), 0, 32*3);
if (_currentCharacter->sceneId != 117 || !queryGameFlag(0xB3)) {
_screen->setScreenPalette(_screen->getPalette(2));
}
}
if (_unkScreenVar2 == 1)
_screen->shuffleScreen(8, 8, 304, 128, 2, 0, _unkScreenVar3, false);
else
_screen->copyRegion(8, 8, 8, 8, 304, 128, 2, 0);
if (_unkScreenVar1 && !queryGameFlag(0xA0)) {
if (_currentCharacter->sceneId == 45 && _paletteChanged) {
memcpy(_screen->getPalette(0) + 12*3, _screen->getPalette(4) + 12*3, 2);
}
if (_currentCharacter->sceneId >= 229 && _currentCharacter->sceneId <= 245 && (_brandonStatusBit & 1)) {
memcpy(_screen->getPalette(0), _screen->getPalette(0) + 320*3, 64);
}
_screen->setScreenPalette(_screen->getPalette(0));
}
} else {
if (_unkScreenVar1 && !queryGameFlag(0xA0)) {
for (int i = 0; i < 60; ++i) {
uint16 col = _screen->getPalette(0)[684+i];
col += _screen->getPalette(1)[684+i] << 1;
col >>= 2;
_screen->getPalette(0)[684+i] = col;
}
_screen->setScreenPalette(_screen->getPalette(0));
}
if (_unkScreenVar2 == 1) {
_screen->shuffleScreen(8, 8, 304, 128, 2, 0, _unkScreenVar3, false);
} else {
_screen->copyRegion(8, 8, 8, 8, 304, 128, 2, 0);
}
if (_unkScreenVar1 && _paletteChanged) {
if (!queryGameFlag(0xA0)) {
memcpy(_screen->getPalette(0) + 684, _screen->getPalette(1) + 684, 60);
_screen->setScreenPalette(_screen->getPalette(0));
} else {
memset(_screen->getPalette(0), 0, 768);
}
}
}
// really call this here?

View file

@ -54,9 +54,13 @@ Screen::~Screen() {
delete [] _screenPalette;
delete [] _decodeShapeBuffer;
delete [] _animBlockPtr;
for (int i = 0; i < ARRAYSIZE(_palettes); ++i) {
delete [] _palettes[i];
if (_vm->gameFlags().platform != Common::kPlatformAmiga) {
for (int i = 0; i < ARRAYSIZE(_palettes); ++i) {
delete [] _palettes[i];
}
}
delete [] _bitBlitRects;
for (int i = 0; i < ARRAYSIZE(_saveLoadPage); ++i) {
delete [] _saveLoadPage[i];
@ -120,17 +124,31 @@ bool Screen::init() {
_pagePtrs[pageNum] = _pagePtrs[pageNum + 1] = pagePtr;
}
memset(_shapePages, 0, sizeof(_shapePages));
_currentPalette = new uint8[768];
assert(_currentPalette);
memset(_currentPalette, 0, 768);
memset(_palettes, 0, sizeof(_palettes));
_screenPalette = new uint8[768];
assert(_screenPalette);
memset(_screenPalette, 0, 768);
for (int i = 0; i < ARRAYSIZE(_palettes); ++i) {
_palettes[i] = new uint8[768];
assert(_palettes[i]);
memset(_palettes[i], 0, 768);
if (_vm->gameFlags().platform == Common::kPlatformAmiga) {
_currentPalette = new uint8[1248];
assert(_currentPalette);
memset(_currentPalette, 0, 1248);
for (int i = 0; i < 6; ++i) {
_palettes[i] = _currentPalette + (i+1)*96;
}
} else {
_currentPalette = new uint8[768];
assert(_currentPalette);
memset(_currentPalette, 0, 768);
for (int i = 0; i < 3; ++i) {
_palettes[i] = new uint8[768];
assert(_palettes[i]);
memset(_palettes[i], 0, 768);
}
}
setScreenPalette(_currentPalette);
_curDim = &_screenDimTable[0];
_charWidth = 0;
@ -416,18 +434,19 @@ void Screen::setPaletteIndex(uint8 index, uint8 red, uint8 green, uint8 blue) {
void Screen::setScreenPalette(const uint8 *palData) {
debugC(9, kDebugLevelScreen, "Screen::setScreenPalette(%p)", (const void *)palData);
int colors = (_vm->gameFlags().platform == Common::kPlatformAmiga ? 32 : 256);
if (palData != _screenPalette)
memcpy(_screenPalette, palData, 768);
memcpy(_screenPalette, palData, colors*3);
uint8 screenPal[256 * 4];
for (int i = 0; i < 256; ++i) {
for (int i = 0; i < colors; ++i) {
screenPal[4 * i + 0] = (palData[0] << 2) | (palData[0] & 3);
screenPal[4 * i + 1] = (palData[1] << 2) | (palData[1] & 3);
screenPal[4 * i + 2] = (palData[2] << 2) | (palData[2] & 3);
screenPal[4 * i + 3] = 0;
palData += 3;
}
_system->setPalette(screenPal, 0, 256);
_system->setPalette(screenPal, 0, colors);
}
void Screen::copyToPage0(int y, int h, uint8 page, uint8 *seqBuf) {
@ -2304,7 +2323,7 @@ void Screen::copyScreenToRect(int x, int y, int w, int h, uint8 *ptr) {
uint8 *Screen::getPalette(int num) {
debugC(9, kDebugLevelScreen, "Screen::getPalette(%d)", num);
assert(num >= 0 && num < ARRAYSIZE(_palettes)+1);
assert(num >= 0 && num < (_vm->gameFlags().platform == Common::kPlatformAmiga ? 6 : 4));
if (num == 0) {
return _currentPalette;
}

View file

@ -288,7 +288,7 @@ private:
uint8 *_saveLoadPage[8];
uint8 *_screenPalette;
uint8 *_palettes[3];
uint8 *_palettes[6];
Font _fonts[FID_NUM];
uint8 _textColorsMap[16];

View file

@ -268,8 +268,20 @@ int KyraEngine::o1_runSceneAnimUntilDone(ScriptState *script) {
}
int KyraEngine::o1_fadeSpecialPalette(ScriptState *script) {
debugC(3, kDebugLevelScriptFuncs, "o1_fadeSpecialPalette(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
_screen->fadeSpecialPalette(stackPos(0), stackPos(1), stackPos(2), stackPos(3));
if (_flags.platform == Common::kPlatformAmiga) {
debugC(3, kDebugLevelScriptFuncs, "o1_fadeSpecialPalette(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
if (_currentCharacter->sceneId != 45) {
if (stackPos(0) == 13) {
memcpy(_screen->getPalette(0), _screen->getPalette(0) + 384*3, 32*3);
_screen->setScreenPalette(_screen->getPalette(0));
}
} else {
warning("o1_fadeSpecialPalette not implemented");
}
} else {
debugC(3, kDebugLevelScriptFuncs, "o1_fadeSpecialPalette(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
_screen->fadeSpecialPalette(stackPos(0), stackPos(1), stackPos(2), stackPos(3));
}
return 0;
}
@ -1549,21 +1561,36 @@ int KyraEngine::o1_fadeEntirePalette(ScriptState *script) {
debugC(3, kDebugLevelScriptFuncs, "o1_fadeEntirePalette(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
int cmd = stackPos(0);
uint8 *fadePal = 0;
if (cmd == 0) {
fadePal = _screen->getPalette(2);
uint8 *screenPal = _screen->getPalette(0);
uint8 *backUpPal = _screen->getPalette(3);
if (_flags.platform == Common::kPlatformAmiga) {
if (cmd == 0) {
fadePal = _screen->getPalette(2);
memset(fadePal, 0, 32*3);
memcpy(_screen->getPalette(4), _screen->getPalette(0), 32*3);
} else if (cmd == 1) {
fadePal = _screen->getPalette(0);
memcpy(_screen->getPalette(0), _screen->getPalette(4), 32*3);
} else if (cmd == 2) {
fadePal = _screen->getPalette(0);
memset(_screen->getPalette(2), 0, 32*3);
}
} else {
if (cmd == 0) {
fadePal = _screen->getPalette(2);
uint8 *screenPal = _screen->getPalette(0);
uint8 *backUpPal = _screen->getPalette(3);
memcpy(backUpPal, screenPal, sizeof(uint8)*768);
memset(fadePal, 0, sizeof(uint8)*768);
} else if (cmd == 1) {
//fadePal = _screen->getPalette(3);
warning("unimplemented o1_fadeEntirePalette function");
return 0;
} else if (cmd == 2) {
memset(_screen->getPalette(2), 0, 768);
memcpy(_screen->getPalette(0), _screen->getPalette(1), 768);
fadePal = _screen->getPalette(0);
memcpy(backUpPal, screenPal, sizeof(uint8)*768);
memset(fadePal, 0, sizeof(uint8)*768);
} else if (cmd == 1) {
//fadePal = _screen->getPalette(3);
warning("unimplemented o1_fadeEntirePalette function");
return 0;
} else if (cmd == 2) {
memset(_screen->getPalette(2), 0, 768);
memcpy(_screen->getPalette(0), _screen->getPalette(1), 768);
fadePal = _screen->getPalette(0);
}
}
_screen->fadePalette(fadePal, stackPos(1));

View file

@ -415,14 +415,20 @@ void Sprites::loadDat(const char *filename, SceneExits &exits) {
if (_engine->_northExitHeight & 1)
_engine->_northExitHeight += 1;
if (_engine->queryGameFlag(0xA0)) {
memcpy(_screen->getPalette(1), _screen->getPalette(3), 768);
} else {
memcpy(_screen->getPalette(1), _screen->getPalette(0), 768);
}
// XXX
_engine->_paletteChanged = 1;
if (_engine->gameFlags().platform != Common::kPlatformAmiga) {
if (_engine->gameFlags().platform == Common::kPlatformAmiga) {
if (_engine->queryGameFlag(0xA0))
memcpy(_screen->getPalette(3), _screen->getPalette(4), 32*3);
else
memcpy(_screen->getPalette(3), _screen->getPalette(0), 32*3);
} else {
if (_engine->queryGameFlag(0xA0))
memcpy(_screen->getPalette(1), _screen->getPalette(3), 768);
else
memcpy(_screen->getPalette(1), _screen->getPalette(0), 768);
_screen->loadPalette(_dat + 0x17, _screen->getPalette(1) + 684, 60);
}
uint8 *data = _dat + 0x6B;

View file

@ -843,7 +843,7 @@ void KyraEngine::loadMainScreen(int page) {
_screen->clearPage(page);
if (_flags.lang == Common::EN_ANY && !_flags.isTalkie && (_flags.platform == Common::kPlatformPC || _flags.platform == Common::kPlatformAmiga))
_screen->loadBitmap("MAIN15.CPS", page, page, 0);
_screen->loadBitmap("MAIN15.CPS", page, page, _screen->getPalette(0));
else if (_flags.lang == Common::EN_ANY || _flags.lang == Common::JA_JPN)
_screen->loadBitmap("MAIN_ENG.CPS", page, page, 0);
else if (_flags.lang == Common::FR_FRA)
@ -857,6 +857,9 @@ void KyraEngine::loadMainScreen(int page) {
else
warning("no main graphics file found");
if (_flags.platform == Common::kPlatformAmiga)
memcpy(_screen->getPalette(1), _screen->getPalette(0), 32*3);
_screen->copyRegion(0, 0, 0, 0, 320, 200, page, 0);
}