some cleanup/refactoring

svn-id: r4866
This commit is contained in:
Max Horn 2002-08-29 20:01:27 +00:00
parent 31853df454
commit 4b83c17b31
7 changed files with 210 additions and 191 deletions

View file

@ -2370,6 +2370,88 @@ void Scumm::setCameraAtEx(int at)
}
}
void Scumm::palManipulateInit(int start, int end, int d, int time, int e)
{
// TODO - correctly implement this function (see also bug #558245)
//
// There are two known places (both in FOA) where this function is being
// called. The fist is during the FOA extro, to change the color to match
// the sinking sun. The following three calls (with some pauses between them)
// are issued:
//
// palManipulateInit(16, 190, 32, 180, 1)
// palManipulateInit(16, 190, 32, 1, 1)
// palManipulateInit(16, 190, 32, 800, 1)
//
// The second place is in the Inner Sanctum after you used the stone discs,
// here it is used to give the scene a "lava glow".
//
// palManipulateInit(32, 65, 46, 20, 1): not implemented!
//
// The first two parameters seem to specify a palette range (as the colors
// from 16 to 190 are the ones that make up water & sky).
//
// Maybe the change has to be done over a period of time, possibly specified
// by the second last parameter - between call 1 and 2, about 17-18 seconds
// seem to pass (well using get_msecs, I measured 17155 ms, 17613 ms, 17815 ms).
//
// No clue about the third and fifth parameter right now, they just always
// are 32 and 1 - possibly finding another example of this function being
// used would help a lot. Also, I can't currently compare it with the original,
// doing that (and possibly, taking screenshots of it for analysis!) would
// help a lot.
warning("palManipulateInit(%d, %d, %d, %d, %d): not implemented", start, end, d, time, e);
// FIXME - is this right?
// It seems we already have had this "palManipulate" and "moveMemInPalRes"
// functions, only they were never used (somebody disassembled them and
// didn't disassmble the functions using them?).
//
// I
_palManipStart = start;
_palManipEnd = end;
//_palManipCounter = ?
{
int redScale = 0xFF;
int greenScale = 0xFF - d;
int blueScale = 0xFF - d;
byte *cptr;
byte *cur;
int num;
int color;
cptr = _currentPalette + start * 3;
cur = _currentPalette + start * 3;
num = end - start + 1;
do {
color = *cptr++;
if (redScale != 0xFF)
color = color * redScale / 0xFF;
if (color > 255)
color = 255;
*cur++ = color;
color = *cptr++;
if (greenScale != 0xFF)
color = color * greenScale / 0xFF;
if (color > 255)
color = 255;
*cur++ = color;
color = *cptr++;
if (blueScale != 0xFF)
color = color * blueScale / 0xFF;
if (color > 255)
color = 255;
*cur++ = color;
} while (--num);
setDirtyColors(start, end);
}
}
void Scumm::palManipulate()
{
byte *srcptr, *destptr;
@ -2378,8 +2460,12 @@ void Scumm::palManipulate()
if (!_palManipCounter)
return;
srcptr = getResourceAddress(rtTemp, 4) + _palManipStart * 6;
destptr = getResourceAddress(rtTemp, 5) + _palManipStart * 6;
if (!srcptr || !destptr)
return;
pal = _currentPalette + _palManipStart * 3;
i = _palManipStart;
@ -2402,12 +2488,72 @@ void Scumm::palManipulate()
i++;
}
setDirtyColors(_palManipStart, _palManipEnd);
if (!--_palManipCounter) {
_palManipCounter--;
if (!_palManipCounter) {
nukeResource(rtTemp, 4);
nukeResource(rtTemp, 5);
}
}
void Scumm::unkRoomFunc3(int unk1, int unk2, int rfact, int gfact, int bfact)
{
byte *pal = _currentPalette;
byte *table = _shadowPalette;
int i;
warning("unkRoomFunc3(%d,%d,%d,%d,%d): not fully implemented", unk1, unk2, rfact, gfact, bfact);
// TODO - correctly implement this function (see also patch #588501)
//
// Some "typical" examples of how this function is being invoked in real life:
//
// 1)
// unkRoomFunc3(16, 255, 200, 200, 200)
//
// FOA: Sets up the colors for the boat and submarine shadows in the
// diving scene. Are the shadows too light? Maybe unk1 is used to
// darken the colors?
//
// 2)
// unkRoomFunc3(0, 255, 700, 700, 700)
//
// FOA: Sets up the colors for the subway car headlight when it first
// goes on. This seems to work ok.
//
// 3)
// unkRoomFunc3(160, 191, 300, 300, 300)
// unkRoomFunc3(160, 191, 289, 289, 289)
// ...
// unkRoomFunc3(160, 191, 14, 14, 14)
// unkRoomFunc3(160, 191, 3, 3, 3)
//
// 4)
// FOA: Sets up the colors for the subway car headlight for the later
// half of the trip, where it fades out. This currently doesn't work
// at all. The colors are too dark to be brightened. At first I thought
// unk1 and unk2 were used to tell which color interval to manipulate,
// but as far as I can tell the colors 160-191 aren't used at all to
// draw the light, that can't be it. Apparently unk1 and/or unk2 are
// used to brighten the colors.
//
// 5)
// unkRoomFunc3(16,255,500,500,500)
//
// FOA: Used in the Inner Sanctum after you activated the machine using the
// stone discs (briefly before the Nazis arrive). No idea at all if it is
// right here; also note that palManipulateInit() is called at the same time.
//
//
for (i = 0; i <= 255; i++) {
int r = (int) (*pal++ * rfact) >> 8;
int g = (int) (*pal++ * gfact) >> 8;
int b = (int) (*pal++ * bfact) >> 8;
*table++ = remapPaletteColor(r, g, b, (uint) -1);
}
}
void Scumm::swapPalColors(int a, int b)
{
byte *ap, *bp;

View file

@ -470,8 +470,8 @@ void Scumm::loadCharset(int no)
assert(no < (int)sizeof(_charsetData) / 16);
checkRange(_maxCharsets - 1, 1, no, "Loading illegal charset %d");
// ensureResourceLoaded(6, no);
ptr = getResourceAddress(6, no);
// ensureResourceLoaded(rtCharset, no);
ptr = getResourceAddress(rtCharset, no);
for (i = 0; i < 15; i++) {
_charsetData[no][i + 1] = ptr[i + 14];
@ -537,54 +537,52 @@ int Scumm::loadResource(int type, int idx)
return 0;
}
do {
for (i = 0; i < 5; i++) {
openRoom(roomNr);
for (i = 0; i < 5; i++) {
openRoom(roomNr);
fileSeek(_fileHandle, fileOffs + _fileOffset, SEEK_SET);
fileSeek(_fileHandle, fileOffs + _fileOffset, SEEK_SET);
if (_features & GF_OLD_BUNDLE) {
size = fileReadWordLE();
} else if (_features & GF_SMALL_HEADER) {
if (!(_features & GF_SMALL_NAMES))
fileSeek(_fileHandle, 8, SEEK_CUR);
size = fileReadDwordLE();
tag = fileReadWordLE();
fileSeek(_fileHandle, -6, SEEK_CUR);
} else {
if (type == rtSound) {
fileReadDwordLE();
fileReadDwordLE();
return readSoundResource(type, idx);
}
tag = fileReadDword();
if (tag != res.tags[type]) {
error("%s %d not in room %d at %d+%d", res.name[type], type, roomNr, _fileOffset, fileOffs);
}
size = fileReadDwordBE();
fileSeek(_fileHandle, -8, SEEK_CUR);
if (_features & GF_OLD_BUNDLE) {
size = fileReadWordLE();
} else if (_features & GF_SMALL_HEADER) {
if (!(_features & GF_SMALL_NAMES))
fileSeek(_fileHandle, 8, SEEK_CUR);
size = fileReadDwordLE();
tag = fileReadWordLE();
fileSeek(_fileHandle, -6, SEEK_CUR);
} else {
if (type == rtSound) {
fileReadDwordLE();
fileReadDwordLE();
return readSoundResource(type, idx);
}
fileRead(_fileHandle, createResource(type, idx, size), size);
/* dump the resource */
tag = fileReadDword();
if (tag != res.tags[type]) {
error("%s %d not in room %d at %d+%d", res.name[type], type, roomNr, _fileOffset, fileOffs);
}
size = fileReadDwordBE();
fileSeek(_fileHandle, -8, SEEK_CUR);
}
fileRead(_fileHandle, createResource(type, idx, size), size);
/* dump the resource */
#ifdef DUMP_SCRIPTS
if (type == rtScript) {
dumpResource("script-", idx, getResourceAddress(rtScript, idx));
}
if (type == rtScript) {
dumpResource("script-", idx, getResourceAddress(rtScript, idx));
}
#endif
if (!fileReadFailed(_fileHandle)) {
return 1;
}
nukeResource(type, idx);
if (!fileReadFailed(_fileHandle)) {
return 1;
}
error("Cannot read resource");
} while (1);
nukeResource(type, idx);
}
error("Cannot read resource");
}
int Scumm::readSoundResource(int type, int idx)
@ -763,10 +761,9 @@ byte *Scumm::getResourceAddress(int type, int idx)
{
byte *ptr;
CHECK_HEAP validateResource("getResourceAddress", type, idx);
if (!res.address[type]) {
debug(9, "getResourceAddress(%s,%d) == NULL", resTypeFromId(type), idx);
debug(1, "getResourceAddress(%s,%d), res.address[type] == NULL", resTypeFromId(type), idx);
return NULL;
}
@ -774,9 +771,8 @@ byte *Scumm::getResourceAddress(int type, int idx)
ensureResourceLoaded(type, idx);
}
if (!(ptr = (byte *)res.address[type][idx])) {
debug(9, "getResourceAddress(%s,%d) == NULL", resTypeFromId(type), idx);
debug(1, "getResourceAddress(%s,%d) == NULL", resTypeFromId(type), idx);
return NULL;
}
@ -857,9 +853,8 @@ void Scumm::nukeResource(int type, int idx)
{
byte *ptr;
CHECK_HEAP if (!res.address[type])
return;
return;
assert(idx >= 0 && idx < res.num[type]);
@ -874,17 +869,14 @@ void Scumm::nukeResource(int type, int idx)
byte *Scumm::findResourceData(uint32 tag, byte *ptr)
{
if (_features & GF_SMALL_HEADER) {
if (_features & GF_SMALL_HEADER)
ptr = findResourceSmall(tag, ptr, 0);
if (ptr == NULL)
return NULL;
return ptr + 6;
}
else
ptr = findResource(tag, ptr, 0);
ptr = findResource(tag, ptr, 0);
if (ptr == NULL)
return NULL;
return ptr + 8;
return ptr + _resourceHeaderSize;
}
int Scumm::getResourceDataSize(byte *ptr)

View file

@ -337,6 +337,7 @@ void Scumm::saveOrLoad(Serializer *s)
MKLINE(Scumm, _EXCD_offs, sleUint32),
MKLINE(Scumm, _IM00_offs, sleUint32),
MKLINE(Scumm, _CLUT_offs, sleUint32),
/* XXX Remove _EPAL_offs next time format changes */
MKLINE(Scumm, _EPAL_offs, sleUint32),
MKLINE(Scumm, _PALS_offs, sleUint32),
MKLINE(Scumm, _curPalIndex, sleByte),
@ -441,6 +442,7 @@ void Scumm::saveOrLoad(Serializer *s)
MKLINE(Scumm, _EXCD_offs, sleUint32),
MKLINE(Scumm, _IM00_offs, sleUint32),
MKLINE(Scumm, _CLUT_offs, sleUint32),
/* XXX Remove _EPAL_offs next time format changes */
MKLINE(Scumm, _EPAL_offs, sleUint32),
MKLINE(Scumm, _PALS_offs, sleUint32),
MKLINE(Scumm, _curPalIndex, sleByte),

View file

@ -1899,6 +1899,7 @@ void Scumm::o5_roomOps()
}
checkRange(256, 0, a, "o5_roomOps: 2: Illegal room color slot (%d)");
_currentPalette[a] = b;
printf("palette change, %d -> %d\n", a, b);
_fullRedraw = 1;
} else {
error("room-color is no longer a valid command");
@ -1919,6 +1920,7 @@ void Scumm::o5_roomOps()
b = getVarOrDirectWord(0x40);
}
checkRange(256, 0, a, "o5_roomOps: 2: Illegal room color slot (%d)");
printf("shadow palette change, %d -> %d\n", a, b);
_shadowPalette[b] = a;
setDirtyColors(b, b);
} else {
@ -2049,7 +2051,7 @@ void Scumm::o5_roomOps()
c = getVarOrDirectByte(0x40);
_opcode = fetchScriptByte();
d = getVarOrDirectByte(0x80);
palManipulate(b, c, a, d, 1);
palManipulateInit(b, c, a, d, 1);
break;
case 16:

View file

@ -1878,7 +1878,7 @@ void Scumm::o6_roomOps()
c = pop();
b = pop();
a = pop();
palManipulate(a, b, c, d, 1);
palManipulateInit(a, b, c, d, 1);
break;
case 187: /* color cycle delay */

View file

@ -461,8 +461,6 @@ public:
byte _numObjectsInRoom;
int8 _userPut;
int _resourceHeaderSize;
void unkRoomFunc3(int a, int b, int c, int d, int e);
void palManipulate(int a, int b, int c, int d, int e);
void setScaleItem(int slot, int a, int b, int c, int d);
void clearClickedStatus();
void startManiac();
@ -796,7 +794,9 @@ public:
void swapPalColors(int a, int b);
void cyclePalette();
void stopCycle(int i);
void palManipulateInit(int a, int b, int c, int d, int e);
void palManipulate();
void unkRoomFunc3(int a, int b, int c, int d, int e);
int remapPaletteColor(int r, int g, int b, uint threshold);
void moveMemInPalRes(int start, int end, byte direction);
void setupShadowPalette(int slot, int rfact, int gfact, int bfact, int from, int to);

View file

@ -780,14 +780,13 @@ void Scumm::initRoomSubBlocks()
}
}
if (_features & GF_SMALL_HEADER)
ptr = findResourceSmall(MKID('EPAL'), roomptr);
else
ptr = findResource(MKID('EPAL'), roomptr);
if (ptr)
_EPAL_offs = ptr - roomptr;
// FIXME - we could simply always call findResourceData here, it will
// do the right thing even if GF_SMALL_HEADER is set. But then, we have
// to change setPaletteFromPtr() (easy). The problematic bit is save game
// compatibility - _CLUT_offs is stored in the save game after all.
// Of course we could just decide to not use _CLUT_offs anymore, and change
// setPaletteFromRes() to invoke findResourceData() each time
// (and also getPalettePtr()).
if (_features & GF_SMALL_HEADER)
ptr = findResourceSmall(MKID('CLUT'), roomptr);
else
@ -806,13 +805,10 @@ void Scumm::initRoomSubBlocks()
}
}
if (_features & GF_SMALL_HEADER)
ptr = findResourceData(MKID('CYCL'), roomptr);
else
ptr = findResourceData(MKID('CYCL'), roomptr);
ptr = findResourceData(MKID('CYCL'), roomptr);
if (ptr)
initCycl(findResourceData(MKID('CYCL'), roomptr));
initCycl(ptr);
ptr = findResourceData(MKID('TRNS'), roomptr);
if (ptr)
@ -897,125 +893,6 @@ int Scumm::checkKeyHit()
return a;
}
void Scumm::unkRoomFunc3(int unk1, int unk2, int rfact, int gfact, int bfact)
{
byte *pal = _currentPalette;
byte *table = _shadowPalette;
int i;
warning("unkRoomFunc3(%d,%d,%d,%d,%d): not fully implemented", unk1, unk2, rfact, gfact, bfact);
// TODO - correctly implement this function (see also patch #588501)
//
// Some "typical" examples of how this function is being invoked in real life:
//
// unkRoomFunc3(16, 255, 200, 200, 200)
//
// FOA: Sets up the colors for the boat and submarine shadows in the
// diving scene. Are the shadows too light? Maybe unk1 is used to
// darken the colors?
//
// unkRoomFunc3(0, 255, 700, 700, 700)
//
// FOA: Sets up the colors for the subway car headlight when it first
// goes on. This seems to work ok.
//
// unkRoomFunc3(160, 191, 300, 300, 300)
// unkRoomFunc3(160, 191, 289, 289, 289)
// ...
// unkRoomFunc3(160, 191, 14, 14, 14)
// unkRoomFunc3(160, 191, 3, 3, 3)
//
// FOA: Sets up the colors for the subway car headlight for the later
// half of the trip, where it fades out. This currently doesn't work
// at all. The colors are too dark to be brightened. At first I thought
// unk1 and unk2 were used to tell which color interval to manipulate,
// but as far as I can tell the colors 160-191 aren't used at all to
// draw the light, that can't be it. Apparently unk1 and/or unk2 are
// used to brighten the colors.
for (i = 0; i <= 255; i++) {
int r = (int) (*pal++ * rfact) >> 8;
int g = (int) (*pal++ * gfact) >> 8;
int b = (int) (*pal++ * bfact) >> 8;
*table++ = remapPaletteColor(r, g, b, (uint) -1);
}
}
void Scumm::palManipulate(int start, int end, int d, int time, int e)
{
// TODO - correctly implement this function (see also bug #558245)
//
// The only place I know of where this function is being called is in the
// FOA extro, to change the color to match the sinking sun. The following
// three calls (with some pauses between them) are issued:
//
// palManipulate(16, 190, 32, 180, 1)
// palManipulate(16, 190, 32, 1, 1)
// palManipulate(16, 190, 32, 800, 1)
//
// The first two parameters seem to specify a palette range (as the colors
// from 16 to 190 are the ones that make up water & sky).
//
// Maybe the change has to be done over a period of time, possibly specified
// by the second last parameter - between call 1 and 2, about 17-18 seconds
// seem to pass (well using get_msecs, I measured 17155 ms, 17613 ms, 17815 ms).
//
// No clue about the third and fifth parameter right now, they just always
// are 32 and 1 - possibly finding another example of this function being
// used would help a lot. Also, I can't currently compare it with the original,
// doing that (and possibly, taking screenshots of it for analysis!) would
// help a lot.
static int sys_time = 0;
int new_sys_time = _system->get_msecs();
warning("palManipulate(%d, %d, %d, %d, %d): not implemented", start, end, d, time, e);
if (sys_time != 0)
printf("Time since last call: %d\n", new_sys_time-sys_time);
sys_time = new_sys_time;
{
int redScale = 0xFF;
int greenScale = 0xFF - d;
int blueScale = 0xFF - d;
byte *cptr;
byte *cur;
int num;
int color;
cptr = _currentPalette + start * 3;
cur = _currentPalette + start * 3;
num = end - start + 1;
do {
color = *cptr++;
if (redScale != 0xFF)
color = color * redScale / 0xFF;
if (color > 255)
color = 255;
*cur++ = color;
color = *cptr++;
if (greenScale != 0xFF)
color = color * greenScale / 0xFF;
if (color > 255)
color = 255;
*cur++ = color;
color = *cptr++;
if (blueScale != 0xFF)
color = color * blueScale / 0xFF;
if (color > 255)
color = 255;
*cur++ = color;
} while (--num);
setDirtyColors(start, end);
}
}
void Scumm::pauseGame(bool user)
{
//_gui->pause();