Implemented some palette code differences for Amiga version.
svn-id: r26281
This commit is contained in:
parent
32c7ee7748
commit
661944a0f9
7 changed files with 147 additions and 66 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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?
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -288,7 +288,7 @@ private:
|
|||
uint8 *_saveLoadPage[8];
|
||||
|
||||
uint8 *_screenPalette;
|
||||
uint8 *_palettes[3];
|
||||
uint8 *_palettes[6];
|
||||
|
||||
Font _fonts[FID_NUM];
|
||||
uint8 _textColorsMap[16];
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue