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:
parent
f453ab6da7
commit
fb8afdc6d6
23 changed files with 202 additions and 124 deletions
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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());
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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());
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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());
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue