ASYLUM: Palette and gamma functions update

- Identify dead code and remove unused parameters
- Rename several gamma and palette-relted functions
- Add stubs for palette fading functions
This commit is contained in:
Julien Templier 2011-07-27 09:12:01 -04:00 committed by Eugene Sandulenko
parent f453ab6da7
commit fb8afdc6d6
No known key found for this signature in database
GPG key ID: 014D387312D34F08
23 changed files with 202 additions and 124 deletions

View file

@ -66,7 +66,7 @@ bool PuzzleBoard::init(const AsylumEvent &evt) {
_soundResourceId = 0;
getScreen()->setPalette(getWorld()->graphicResourceIds[32]);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[32], 0);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[32]);
getText()->loadFont(getWorld()->graphicResourceIds[35]);
// Prepare text to draw

View file

@ -81,7 +81,7 @@ bool PuzzleClock::init(const AsylumEvent &evt) {
updateCursor();
getScreen()->setPalette(getWorld()->graphicResourceIds[6]);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[6], 0);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[6]);
getCursor()->show();

View file

@ -74,7 +74,7 @@ bool PuzzleFisherman::init(const AsylumEvent &evt) {
_dword_45A130 = false;
getScreen()->setPalette(getWorld()->graphicResourceIds[39]);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[39], 0);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[39]);
return mouseLeftDown(evt);
}
@ -163,7 +163,7 @@ bool PuzzleFisherman::mouseLeftDown(const AsylumEvent &evt) {
bool PuzzleFisherman::mouseRightDown(const AsylumEvent &evt) {
getCursor()->hide();
getSharedData()->setFlag(kFlag1, true);
getScreen()->setupPaletteAndStartFade(0, 0, 0);
getScreen()->stopPaletteFade(0, 0, 0);
_vm->switchEventHandler(getScene());

View file

@ -120,7 +120,7 @@ bool PuzzleHiveControl::init(const AsylumEvent &evt) {
_frameIndexes[kElementLever] = (5 - _leverPosition) * (GraphicResource::getFrameCount(_vm, getWorld()->graphicResourceIds[kElementLever]) - 1) / 5;
getScreen()->setPalette(getWorld()->graphicResourceIds[29]);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[29], 0);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[29]);
getCursor()->show();

View file

@ -167,7 +167,7 @@ PuzzleHiveMachine::~PuzzleHiveMachine() {
//////////////////////////////////////////////////////////////////////////
bool PuzzleHiveMachine::init(const AsylumEvent &evt) {
getScreen()->setPalette(getWorld()->graphicResourceIds[9]);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[9], 0);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[9]);
_rectIndex = -2;
return true;

View file

@ -58,7 +58,7 @@ bool PuzzleLock::init(const AsylumEvent &evt) {
getScreen()->clear();
getScreen()->setPalette(getWorld()->graphicResourceIds[14]);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[14], 0);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[14]);
_vm->setGameFlag(kGameFlag115);

View file

@ -80,7 +80,7 @@ bool PuzzleMorgueDoor::init(const AsylumEvent &evt) {
_frameCounts[kBottomGear] = GraphicResource::getFrameCount(_vm, getWorld()->graphicResourceIds[32]);
getScreen()->setPalette(getWorld()->graphicResourceIds[20]);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[20], 0);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[20]);
return mouseLeftDown(evt);
}
@ -197,7 +197,7 @@ bool PuzzleMorgueDoor::mouseLeftDown(const AsylumEvent &evt) {
bool PuzzleMorgueDoor::mouseRightUp(const AsylumEvent &evt) {
getCursor()->hide();
getSharedData()->setFlag(kFlag1, true);
getScreen()->setupPaletteAndStartFade(0, 0, 0);
getScreen()->stopPaletteFade(0, 0, 0);
_vm->switchEventHandler(getScene());
@ -578,7 +578,7 @@ void PuzzleMorgueDoor::updateState() {
getCursor()->hide();
getSharedData()->setFlag(kFlag1, true);
getScreen()->setupPaletteAndStartFade(0, 0, 0);
getScreen()->stopPaletteFade(0, 0, 0);
_vm->switchEventHandler(getScene());
}

View file

@ -330,7 +330,7 @@ bool PuzzlePipes::init(const AsylumEvent &evt) {
getSound()->playSound(getWorld()->graphicResourceIds[41], true, Config.ambientVolume);
getScreen()->setPalette(getWorld()->graphicResourceIds[0]);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[0], 0);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[0]);
_rectIndex = -2;

View file

@ -53,7 +53,7 @@ bool Puzzle11::init(const AsylumEvent &evt) {
getPuzzleData()->timeMachineCounter = 0;
getScreen()->setPalette(getWorld()->graphicResourceIds[12]);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[12], 0);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[12]);
getCursor()->set(getWorld()->graphicResourceIds[60], -1, kCursorAnimationNone, 7);
_data_45AA34 = false;
@ -94,7 +94,7 @@ bool Puzzle11::mouseRightDown(const AsylumEvent &evt) {
bool Puzzle11::mouseLeftUp(const AsylumEvent &evt) {
getCursor()->hide();
getSharedData()->setFlag(kFlag1, true);
getScreen()->setupPaletteAndStartFade(0, 0, 0);
getScreen()->stopPaletteFade(0, 0, 0);
_vm->switchEventHandler(getScene());

View file

@ -110,7 +110,7 @@ bool PuzzleTicTacToe::init(const AsylumEvent &evt) {
_strikeOutPosition = -1;
getScreen()->setPalette(getWorld()->graphicResourceIds[3]);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[3], 0);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[3]);
getCursor()->show();
getCursor()->set(getWorld()->graphicResourceIds[12], 4, kCursorAnimationLinear, 4);

View file

@ -104,7 +104,7 @@ bool PuzzleTimeMachine::init(const AsylumEvent &evt) {
_frameCounts[5] = GraphicResource::getFrameCount(_vm, getWorld()->graphicResourceIds[40]);
getScreen()->setPalette(getWorld()->graphicResourceIds[41]);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[41], 0);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[41]);
mouseLeftDown(evt);
@ -160,7 +160,7 @@ bool PuzzleTimeMachine::update(const AsylumEvent &evt) {
if (_counter > 30 && _vm->isGameFlagSet(kGameFlag925)) {
getCursor()->hide();
getSharedData()->setFlag(kFlag1, true);
getScreen()->setupPaletteAndStartFade(0, 0, 0);
getScreen()->stopPaletteFade(0, 0, 0);
_vm->switchEventHandler(getScene());
}
@ -248,7 +248,7 @@ bool PuzzleTimeMachine::mouseLeftUp(const AsylumEvent &evt) {
bool PuzzleTimeMachine::mouseRightDown(const AsylumEvent &evt) {
getCursor()->hide();
getSharedData()->setFlag(kFlag1, true);
getScreen()->setupPaletteAndStartFade(0, 0, 0);
getScreen()->stopPaletteFade(0, 0, 0);
_vm->switchEventHandler(getScene());
return true;

View file

@ -57,7 +57,7 @@ PuzzleVCR::~PuzzleVCR() {
bool PuzzleVCR::init(const AsylumEvent &evt) {
// Load the graphics palette
getScreen()->setPalette(getWorld()->graphicResourceIds[29]);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[29], 0);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[29]);
if (_jacksState[kBlack] == kOnHand || _jacksState[kRed] == kOnHand || _jacksState[kYellow] == kOnHand) {
getCursor()->hide();

View file

@ -172,7 +172,7 @@ bool PuzzleWheel::init(const AsylumEvent &evt) {
getSpecial()->reset(false);
getScreen()->setPalette(getWorld()->graphicResourceIds[1]);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[1], 0);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[1]);
updateCursor();
getCursor()->show();

View file

@ -54,7 +54,7 @@ bool PuzzleWritings::init(const AsylumEvent &evt) {
_hasGlassMagnifier = false;
getScreen()->setPalette(getWorld()->graphicResourceIds[10]);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[10], 0);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[10]);
if (_hasGlassMagnifier) {
getCursor()->hide();
@ -71,10 +71,10 @@ bool PuzzleWritings::update(const AsylumEvent &evt) {
// Adjust palette
if (rnd(10) < 7) {
getScreen()->setPalette(getWorld()->graphicResourceIds[6]);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[6], 0);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[6]);
} else {
getScreen()->setPalette(getWorld()->graphicResourceIds[10]);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[10], 0);
getScreen()->setGammaLevel(getWorld()->graphicResourceIds[10]);
}
// Compute frame index
@ -113,7 +113,7 @@ bool PuzzleWritings::update(const AsylumEvent &evt) {
bool PuzzleWritings::mouseRightUp(const AsylumEvent &evt) {
getCursor()->hide();
getSharedData()->setFlag(kFlag1, true);
getScreen()->setupPaletteAndStartFade(0, 0, 0);
getScreen()->stopPaletteFade(0, 0, 0);
_vm->switchEventHandler(getScene());

View file

@ -2984,7 +2984,7 @@ void Actor::updateStatus21() {
if (_frameIndex == _frameCount / 2) {
getWorld()->currentPaletteId = getWorld()->graphicResourceIds[getWorld()->nextPlayer - 1];
getScreen()->setPalette(getWorld()->currentPaletteId);
getScreen()->setGammaLevel(getWorld()->currentPaletteId, 0);
getScreen()->setGammaLevel(getWorld()->currentPaletteId);
}
return;
@ -2997,7 +2997,7 @@ void Actor::updateStatus21() {
getScreen()->setPalette(getWorld()->graphicResourceIds[getWorld()->nextPlayer - 1]);
getWorld()->currentPaletteId = getWorld()->graphicResourceIds[getWorld()->nextPlayer - 1];
getScreen()->setGammaLevel(getWorld()->currentPaletteId, 0);
getScreen()->setGammaLevel(getWorld()->currentPaletteId);
return;
}
}

View file

@ -1609,7 +1609,7 @@ void Encounter::runScript() {
case 23:
if (!getSharedData()->matteBarHeight) {
getScreen()->makeGreyPalette();
getScreen()->loadPalette();
getSharedData()->matteBarHeight = 1;
getSharedData()->movieIndex = getVariableInv(entry.param2);
getSharedData()->matteVar1 = 1;

View file

@ -965,7 +965,7 @@ IMPLEMENT_OPCODE(PlayMovie)
if (!getSharedData()->matteBarHeight) {
getCursor()->hide();
getScreen()->makeGreyPalette();
getScreen()->loadPalette();
getSharedData()->matteVar1 = 1;
getSharedData()->matteBarHeight = 1;
getSharedData()->matteVar2 = 0;
@ -981,10 +981,10 @@ IMPLEMENT_OPCODE(PlayMovie)
ActionArea *area = getWorld()->actions[getScene()->getActor()->getActionIndex3()];
if (area->paletteResourceId) {
getScreen()->setPalette(area->paletteResourceId);
getScreen()->setGammaLevel(area->paletteResourceId, 0);
getScreen()->setGammaLevel(area->paletteResourceId);
} else {
getScreen()->setPalette(getWorld()->currentPaletteId);
getScreen()->setGammaLevel(getWorld()->currentPaletteId, 0);
getScreen()->setGammaLevel(getWorld()->currentPaletteId);
}
getSharedData()->matteBarHeight = 0;
@ -1128,7 +1128,7 @@ END_OPCODE
// Opcode 0x3B
IMPLEMENT_OPCODE(CreatePalette)
if (!cmd->param2) {
getScreen()->makeGreyPalette();
getScreen()->loadPalette();
cmd->param2 = 1;
}
@ -1699,7 +1699,7 @@ END_OPCODE
IMPLEMENT_OPCODE(SetResourcePalette)
getWorld()->currentPaletteId = getWorld()->graphicResourceIds[cmd->param1];
getScreen()->setPalette(getWorld()->currentPaletteId);
getScreen()->setGammaLevel(getWorld()->currentPaletteId, 0);
getScreen()->setGammaLevel(getWorld()->currentPaletteId);
END_OPCODE
//////////////////////////////////////////////////////////////////////////

View file

@ -1250,7 +1250,7 @@ void Special::setPaletteGamma(ResourceId palette1, ResourceId palette2) {
_paletteTick1 = _vm->getTick() + 5000;
} else {
getScreen()->setPalette(palette1);
getScreen()->setGammaLevel(palette1, 0);
getScreen()->setGammaLevel(palette1);
_chapter5Counter = 1;
}
}
@ -1259,19 +1259,19 @@ void Special::setPaletteGamma(ResourceId palette1, ResourceId palette2) {
case 500:
getScreen()->setPalette(palette2);
getScreen()->setGammaLevel(palette2, 0);
getScreen()->setGammaLevel(palette2);
++_chapter5Counter;
break;
case 1000:
getScreen()->setPalette(palette1);
getScreen()->setGammaLevel(palette1, 0);
getScreen()->setGammaLevel(palette1);
++_chapter5Counter;
break;
case 1500:
getScreen()->setPalette(palette2);
getScreen()->setGammaLevel(palette2, 0);
getScreen()->setGammaLevel(palette2);
_chapter5Counter = 0;
_paletteFlag = true;
_paletteTick2 = _vm->getTick() + rnd(1000) + 1000;

View file

@ -22,6 +22,8 @@
#include "asylum/system/screen.h"
#include "asylum/resources/actor.h"
#include "asylum/resources/script.h"
#include "asylum/resources/worldstats.h"
#include "asylum/system/graphics.h"
@ -46,6 +48,9 @@ Screen::Screen(AsylumEngine *vm) : _vm(vm) ,
_flag = -1;
_clipRect = Common::Rect(0, 0, 640, 480);
memset(&_currentPalette, 0, sizeof(_currentPalette));
memset(&_mainPalette, 0, sizeof(_mainPalette));
g_debugDrawRects = 0;
}
@ -235,76 +240,68 @@ void Screen::takeScreenshot() {
//////////////////////////////////////////////////////////////////////////
// Palette
//////////////////////////////////////////////////////////////////////////
byte *Screen::getPaletteData(ResourceId id) {
ResourceEntry *resource = getResource()->get(id);
// Check that resource is a valid palette
byte flag = *(resource->data + 5);
if (!(flag & 32))
error("[Screen::getPaletteData] Invalid palette resource id %d (0x%X) with flag %d", id, id, flag);
return (resource->data + resource->getData(12));
}
void Screen::loadPalette() {
// Get the current action palette
ResourceId paletteId = getWorld()->actions[getScene()->getActor()->getActionIndex3()]->paletteResourceId;
if (!paletteId)
paletteId = getWorld()->currentPaletteId;
// Get the data
byte *paletteData = getPaletteData(paletteId);
// Store data into our global palette
memcpy(&_currentPalette, paletteData, sizeof(_currentPalette));
}
void Screen::setPalette(ResourceId id) {
setPalette(getResource()->get(id)->data + 32);
byte *data = getPaletteData(id);
setupPalette(data + 4, data[2], *(uint16 *)data);
}
void Screen::setPalette(byte *rgbPalette) const {
byte palette[256 * 3];
byte *p = rgbPalette;
void Screen::setupPalette(byte *buffer, int start, int count) {
// Check parameters
if (start < 0 || start > 256)
error("[Screen::setupPalette] Invalid start parameter (was: %d, valid: [0 ; 255])", start);
// skip first color and set it to black always.
memset(palette, 0, 3);
p += 3;
if ((count + start) > 256)
error("[Screen::setupPalette] Parameters go past the palette buffer (start: %d, count: %d with sum > 256)", start, count);
for (int32 i = 1; i < 256; i++) {
palette[i * 3 + 0] = (byte)(*p++ << 2);
palette[i * 3 + 1] = (byte)(*p++ << 2);
palette[i * 3 + 2] = (byte)(*p++ << 2);
}
// TODO: Update transparent palette if needed
_vm->_system->getPaletteManager()->setPalette(palette, 0, 256);
}
// Setup our main palette
if (count > 0) {
byte *palette = (byte *)_mainPalette;
palette += 4 * start;
void Screen::setPaletteGamma(ResourceId id) {
byte *resPalette = getResource()->get(id)->data + 32;
byte rgbPalette[256 * 3];
for (int32 i = 0; i < count; i++) {
palette[0] = buffer[0] * 4;
palette[1] = buffer[1] * 4;
palette[2] = buffer[2] * 4;
_vm->_system->getPaletteManager()->grabPalette(rgbPalette, 0, 256);
for (int32 i = 1; i < 256; i++) {
int color = 0;
if (resPalette[i * 3 + 0] > 0)
color = resPalette[i * 3 + 0];
if (resPalette[i * 3 + 1] > color)
color = resPalette[i * 3 + 1];
if (resPalette[i * 3 + 2] > color)
color = resPalette[i * 3 + 2];
int gamma = color + (Config.gammaLevel * (63 - color) + 31) / 63;
if (gamma) {
if (resPalette[i * 3 + 0])
rgbPalette[i * 3 + 0] = 4 * ((color >> 1) + resPalette[i * 3 + 0] * gamma) / color;
if (resPalette[i * 3 + 1])
rgbPalette[i * 3 + 1] = 4 * ((color >> 1) + resPalette[i * 3 + 1] * gamma) / color;
if (resPalette[i * 3 + 2])
rgbPalette[i * 3 + 2] = 4 * ((color >> 1) + resPalette[i * 3 + 2] * gamma) / color;
buffer += 3;
palette += 3;
}
}
_vm->_system->getPaletteManager()->setPalette(rgbPalette, 0, 256);
}
void Screen::setupPaletteAndStartFade(uint32 red, int32 milliseconds, int32 param) {
warning("[Screen::setupPaletteAndStartFade] Not implemented!");
}
void Screen::stopFadeAndSetPalette(ResourceId id, int32 milliseconds, int32 param) {
// HACK so we have a proper screen palette
setPalette(id);
warning("[Screen::stopFadeAndSetPalette] Not implemented!");
}
void Screen::paletteFade(uint32 red, int32 milliseconds, int32 param) {
warning("[Screen::paletteFade] Not implemented!");
}
void Screen::startPaletteFade(ResourceId resourceId, int32 milliseconds, int32 param) {
warning("[Screen::startPaletteFade] Not implemented!");
// Change the system palette
_vm->_system->getPaletteManager()->setPalette(_mainPalette, 0, 256);
}
void Screen::updatePalette() {
// FIXME: This is used to replace all the inline code to setup the palette before calls to setupPalette/paletteFade
// See if all that code can really be factorized into a single function or not
error("[Screen::updatePalette] Not implemented!");
}
@ -312,24 +309,95 @@ void Screen::updatePalette(int32 param) {
error("[Screen::updatePalette] Not implemented!");
}
void Screen::makeGreyPalette() {
warning("[Screen::makeGreyPalette] Not implemented!");
void Screen::startPaletteFade(ResourceId resourceId, int32 milliseconds, int32 param) {
warning("[Screen::startPaletteFade] Not implemented!");
}
void Screen::setupPalette(byte *buffer, int start, int count) {
warning("[Screen::setupPalette] Not implemented!");
void Screen::stopPaletteFade(char red, char green, char blue) {
// Setup main palette
byte *palette = (byte *)&_mainPalette;
palette += 4;
for (uint32 i = 0; i < ARRAYSIZE(_mainPalette) - 4; i += 4) {
palette[0] = red;
palette[1] = green;
palette[2] = blue;
palette += 3;
}
stopPaletteFadeTimer();
setupPalette(0, 0, 0);
}
void Screen::stopPaletteFadeAndSet(ResourceId id, int32 milliseconds, int32 param) {
stopPaletteFadeTimer();
paletteFadeWorker(id, milliseconds, param);
}
void Screen::paletteFade(uint32 red, int32 milliseconds, int32 param) {
if (red < 0 || red > 255 || milliseconds < 0 || param <= 0)
return;
warning("[Screen::paletteFade] Not implemented!");
}
void Screen::paletteFadeWorker(ResourceId id, int32 milliseconds, int32 param) {
warning("[Screen::paletteFadeWorker] Not implemented!");
// HACK setup a proper palette
setPalette(id);
}
void Screen::stopPaletteFadeTimer() {
warning("[Screen::stopPaletteFadeTimer] Not implemented!");
}
//////////////////////////////////////////////////////////////////////////
// Gamma
//////////////////////////////////////////////////////////////////////////
void Screen::setGammaLevel(ResourceId id, int32 val) {
if (Config.gammaLevel) {
if (id)
setPaletteGamma(id);
else
warning("[Screen::setGammaLevel] Palette creation without a valid resource Id not implemented");
void Screen::setPaletteGamma(ResourceId id) {
setPaletteGamma(getPaletteData(id));
}
void Screen::setPaletteGamma(byte *data, byte *target) {
if (target == NULL)
target = (byte *)&_mainPalette;
// Skip first entry
data += 4;
for (int32 i = 1; i < 256; i++) {
int color = 0;
if (data[i * 3 + 0] > 0)
color = data[i * 3 + 0];
if (data[i * 3 + 1] > color)
color = data[i * 3 + 1];
if (data[i * 3 + 2] > color)
color = data[i * 3 + 2];
int gamma = color + (Config.gammaLevel * (63 - color) + 31) / 63;
if (gamma) {
if (data[i * 3 + 0])
target[i * 3 + 0] = 4 * ((color >> 1) + data[i * 3 + 0] * gamma) / color;
if (data[i * 3 + 1])
target[i * 3 + 1] = 4 * ((color >> 1) + data[i * 3 + 1] * gamma) / color;
if (data[i * 3 + 2])
target[i * 3 + 2] = 4 * ((color >> 1) + data[i * 3 + 2] * gamma) / color;
}
}
}
void Screen::setGammaLevel(ResourceId id) {
if (!Config.gammaLevel)
return;
if (!id)
error("[Screen::setGammaLevel] Resource Id is invalid");
setPaletteGamma(getPaletteData(id));
setupPalette(0, 0, 0);
}
//////////////////////////////////////////////////////////////////////////

View file

@ -91,20 +91,20 @@ public:
void takeScreenshot();
// Palette
void setPalette(byte *rgbPalette) const;
void setPalette(ResourceId id);
void setPaletteGamma(ResourceId id);
void setupPaletteAndStartFade(uint32 red, int32 milliseconds, int32 param);
void stopFadeAndSetPalette(ResourceId id, int32 milliseconds, int32 param);
void paletteFade(uint32 red, int32 milliseconds, int32 param);
void startPaletteFade(ResourceId resourceId, int32 milliseconds, int32 param);
void loadPalette();
void updatePalette();
void updatePalette(int32 param);
void makeGreyPalette();
void setupPalette(byte *buffer, int start, int count);
void stopPaletteFade(char red, char green, char blue);
void stopPaletteFadeAndSet(ResourceId id, int32 milliseconds, int32 param);
void paletteFade(uint32 red, int32 milliseconds, int32 param);
void startPaletteFade(ResourceId resourceId, int32 milliseconds, int32 param);
// Gamma
void setGammaLevel(ResourceId id, int32 val);
void setPaletteGamma(ResourceId id);
void setGammaLevel(ResourceId id);
// Transparency tables
void setupTransTable(ResourceId resourceId);
@ -144,6 +144,16 @@ private:
byte *_transTableBuffer;
void clearTransTables();
// Palette
byte _currentPalette[256 * 4];
byte _mainPalette[256 * 4];
byte *getPaletteData(ResourceId id);
void setPaletteGamma(byte *data, byte *target = NULL);
void paletteFadeWorker(ResourceId id, int32 milliseconds, int32 param);
void stopPaletteFadeTimer();
// Graphic queue
void graphicsSelectionSort();
void swapGraphicItem(int32 item1, int32 item2);

View file

@ -114,7 +114,7 @@ void Menu::setup() {
if (_vm->isGameFlagSet(kGameFlagFinishGame)) {
getText()->loadFont(MAKE_RESOURCE(kResourcePackShared, 32));
getScreen()->setPalette(MAKE_RESOURCE(kResourcePackShared, 31));
getScreen()->setGammaLevel(MAKE_RESOURCE(kResourcePackShared, 31), 0);
getScreen()->setGammaLevel(MAKE_RESOURCE(kResourcePackShared, 31));
getScreen()->setupTransTables(4, MAKE_RESOURCE(kResourcePackShared, 34),
MAKE_RESOURCE(kResourcePackShared, 35),
MAKE_RESOURCE(kResourcePackShared, 36),
@ -128,7 +128,7 @@ void Menu::setup() {
} else {
getText()->loadFont(MAKE_RESOURCE(kResourcePackShared, 25));
getScreen()->setPalette(MAKE_RESOURCE(kResourcePackShared, 26));
getScreen()->setGammaLevel(MAKE_RESOURCE(kResourcePackShared, 26), 0);
getScreen()->setGammaLevel(MAKE_RESOURCE(kResourcePackShared, 26));
getScreen()->setupTransTables(4, MAKE_RESOURCE(kResourcePackShared, 27),
MAKE_RESOURCE(kResourcePackShared, 28),
MAKE_RESOURCE(kResourcePackShared, 29),
@ -159,7 +159,7 @@ void Menu::closeCredits() {
getText()->loadFont(kFontYellow);
getScreen()->setPalette(MAKE_RESOURCE(kResourcePackShared, 17));
getScreen()->setGammaLevel(MAKE_RESOURCE(kResourcePackShared, 17), 0);
getScreen()->setGammaLevel(MAKE_RESOURCE(kResourcePackShared, 17));
getScreen()->setupTransTables(4, MAKE_RESOURCE(kResourcePackShared, 18),
MAKE_RESOURCE(kResourcePackShared, 19),
MAKE_RESOURCE(kResourcePackShared, 20),
@ -388,7 +388,7 @@ bool Menu::init() {
getScreen()->clear();
getText()->loadFont(kFontYellow);
getScreen()->setPalette(MAKE_RESOURCE(kResourcePackShared, 17));
getScreen()->setGammaLevel(MAKE_RESOURCE(kResourcePackShared, 17), 0);
getScreen()->setGammaLevel(MAKE_RESOURCE(kResourcePackShared, 17));
getScreen()->setupTransTables(4, MAKE_RESOURCE(kResourcePackShared, 18),
MAKE_RESOURCE(kResourcePackShared, 19),
MAKE_RESOURCE(kResourcePackShared, 20),
@ -2178,7 +2178,7 @@ void Menu::clickSettings() {
return;
Config.gammaLevel -= 1;
getScreen()->setGammaLevel(MAKE_RESOURCE(kResourcePackShared, 17), 0);
getScreen()->setGammaLevel(MAKE_RESOURCE(kResourcePackShared, 17));
return;
}
@ -2191,7 +2191,7 @@ void Menu::clickSettings() {
Config.gammaLevel += 1;
getScreen()->setGammaLevel(MAKE_RESOURCE(kResourcePackShared, 17), 0);
getScreen()->setGammaLevel(MAKE_RESOURCE(kResourcePackShared, 17));
return;
}

View file

@ -357,8 +357,8 @@ bool Scene::init() {
paletteResource = _ws->currentPaletteId;
getScreen()->setPalette(paletteResource);
getScreen()->setGammaLevel(paletteResource, 0);
getScreen()->makeGreyPalette();
getScreen()->setGammaLevel(paletteResource);
getScreen()->loadPalette();
getScreen()->setupTransTables(3, _ws->cellShadeMask1, _ws->cellShadeMask2, _ws->cellShadeMask3);
getScreen()->selectTransTable(1);
@ -624,12 +624,12 @@ bool Scene::updateScreen() {
if (getSharedData()->getFlag(kFlagScene1)) {
getScreen()->clear();
getScreen()->setupPaletteAndStartFade(0, 0, 0);
getScreen()->stopPaletteFade(0, 0, 0);
updateScene();
drawScene();
getScreen()->copyBackBufferToScreen();
getScreen()->stopFadeAndSetPalette(getWorld()->currentPaletteId, 100, 10);
getScreen()->stopPaletteFadeAndSet(getWorld()->currentPaletteId, 100, 10);
drawScene();
getScreen()->copyBackBufferToScreen();
@ -1781,7 +1781,7 @@ void Scene::playIntroSpeech() {
}
getScreen()->clear();
getScreen()->setupPaletteAndStartFade(0, 0, 0);
getScreen()->stopPaletteFade(0, 0, 0);
do {
// Poll events (this ensure we don't freeze the screen)
@ -2218,7 +2218,7 @@ void Scene::changePlayer(ActorIndex index) {
getScreen()->setPalette(_ws->graphicResourceIds[0]);
_ws->currentPaletteId = _ws->graphicResourceIds[0];
getScreen()->setGammaLevel(_ws->graphicResourceIds[0], 0);
getScreen()->setGammaLevel(_ws->graphicResourceIds[0]);
_vm->setGameFlag(kGameFlag635);
_vm->clearGameFlag(kGameFlag636);
_vm->clearGameFlag(kGameFlag637);
@ -2235,7 +2235,7 @@ void Scene::changePlayer(ActorIndex index) {
getScreen()->setPalette(_ws->graphicResourceIds[1]);
_ws->currentPaletteId = _ws->graphicResourceIds[1];
getScreen()->setGammaLevel(_ws->graphicResourceIds[1], 0);
getScreen()->setGammaLevel(_ws->graphicResourceIds[1]);
_vm->setGameFlag(kGameFlag636);
_vm->clearGameFlag(kGameFlag635);
_vm->clearGameFlag(kGameFlag637);
@ -2252,7 +2252,7 @@ void Scene::changePlayer(ActorIndex index) {
getScreen()->setPalette(_ws->graphicResourceIds[2]);
_ws->currentPaletteId = _ws->graphicResourceIds[2];
getScreen()->setGammaLevel(_ws->graphicResourceIds[2], 0);
getScreen()->setGammaLevel(_ws->graphicResourceIds[2]);
_vm->setGameFlag(kGameFlag637);
_vm->clearGameFlag(kGameFlag635);
_vm->clearGameFlag(kGameFlag636);

View file

@ -50,7 +50,7 @@ void SceneTitle::load() {
getScreen()->clear();
getScreen()->setPalette(getWorld()->sceneTitlePaletteResourceId);
getScreen()->paletteFade(0, 1, 1);
getScreen()->setGammaLevel(getWorld()->sceneTitlePaletteResourceId, 0);
getScreen()->setGammaLevel(getWorld()->sceneTitlePaletteResourceId);
getText()->loadFont(MAKE_RESOURCE(kResourcePackSound, 18));