renamed fadeToBlackEffect to fadeOut; renamed screenEffect to fadeIn; implemented oldRoomEffect (fixes room transitions in MonkeyVGA and Indy3)

svn-id: r4536
This commit is contained in:
Max Horn 2002-07-13 14:07:37 +00:00
parent 1861053d33
commit dc60238196
6 changed files with 78 additions and 65 deletions

81
gfx.cpp
View file

@ -552,7 +552,44 @@ void Scumm::moveMemInPalRes(int start, int end, byte direction)
}
}
void Scumm::fadeToBlackEffect(int a)
void Scumm::fadeIn(int effect)
{
switch (effect) {
case 1:
case 2:
case 3:
transitionEffect(effect - 1);
break;
case 128:
unkScreenEffect6();
break;
case 130:
unkScreenEffect1();
break;
case 131:
unkScreenEffect2();
break;
case 132:
unkScreenEffect3();
break;
case 133:
unkScreenEffect4();
break;
case 134:
unkScreenEffect5(0);
break;
case 135:
unkScreenEffect5(1);
break;
case 129:
break;
default:
warning("Unknown screen effect, %d", effect);
}
_screenEffectFlag = true;
}
void Scumm::fadeOut(int a)
{
VirtScreen *vs;
@ -594,7 +631,7 @@ void Scumm::fadeToBlackEffect(int a)
unkScreenEffect5(1);
break;
default:
warning("fadeToBlackEffect: default case %d", a);
warning("fadeOut: default case %d", a);
}
}
@ -2164,43 +2201,6 @@ void Scumm::swapPalColors(int a, int b)
setDirtyColors(a, b);
}
void Scumm::screenEffect(int effect)
{
switch (effect) {
case 1:
case 2:
case 3:
transitionEffect(effect - 1);
break;
case 128:
unkScreenEffect6();
break;
case 130:
unkScreenEffect1();
break;
case 131:
unkScreenEffect2();
break;
case 132:
unkScreenEffect3();
break;
case 133:
unkScreenEffect4();
break;
case 134:
unkScreenEffect5(0);
break;
case 135:
unkScreenEffect5(1);
break;
case 129:
break;
default:
warning("Unknown screen effect, %d", effect);
}
_screenEffectFlag = true;
}
void Gdi::resetBackground(int top, int bottom, int strip)
{
VirtScreen *vs = &_vm->virtscr[0];
@ -2219,7 +2219,8 @@ void Gdi::resetBackground(int top, int bottom, int strip)
_numLinesToProcess = bottom - top;
if (_numLinesToProcess) {
if (1 /*_vm->_vars[VAR_V5_DRAWFLAGS]&2*/ ) {
if ((_vm->_features & GF_AFTER_V7) || (_vm->_vars[_vm->VAR_CURRENT_LIGHTS] & LIGHTMODE_screen)) {
// if (1 /*_vm->_vars[VAR_V5_DRAWFLAGS]&2*/ ) {
if (_vm->hasCharsetMask(strip << 3, top, (strip + 1) << 3, bottom))
draw8ColWithMasking();
else

View file

@ -134,7 +134,7 @@ bool Scumm::loadState(int slot, bool compat)
// Force a fade to black
int old_screenEffectFlag = _screenEffectFlag;
_screenEffectFlag = true;
fadeToBlackEffect(129);
fadeOut(129);
_screenEffectFlag = old_screenEffectFlag;
initScreens(0, sb, 320, sh);

View file

@ -1547,11 +1547,14 @@ void Scumm::o5_lights()
b = fetchScriptByte();
c = fetchScriptByte();
/* if (c==0)
_vars[VAR_V5_DRAWFLAGS] = a;
else if (c==1) {*/
warning("o5_lights: lights not implemented");
// }
warning("o5_lights(%d,%d,%d): lights not implemented", a, b, c);
if (c==0)
_vars[VAR_CURRENT_LIGHTS] = a;
else if (c==1) {
//LightDx = a;
//LightDy = b;
}
_fullRedraw = 1;
}
@ -1967,10 +1970,10 @@ void Scumm::o5_roomOps()
case 10: /* ? */
a = getVarOrDirectWord(0x80);
if (a) {
_switchRoomEffect = (byte)(a);
_switchRoomEffect = (byte)a;
_switchRoomEffect2 = (byte)(a >> 8);
} else {
screenEffect(_newEffect);
fadeIn(_newEffect);
}
break;
case 11: /* ? */
@ -2754,13 +2757,11 @@ void Scumm::o5_oldRoomEffect()
_opcode = fetchScriptByte();
if ((_opcode & 0x1F) == 3) {
a = getVarOrDirectWord(0x80);
switch (a) {
case 4:
_fullRedraw = true;
break;
default:
warning("Unsupported oldRoomEffect %d", a);
break;
if (a) {
_switchRoomEffect = (byte)a;
_switchRoomEffect2 = (byte)(a >> 8);
} else {
fadeIn(_newEffect);
}
}
}

View file

@ -1843,7 +1843,7 @@ void Scumm::o6_roomOps()
_switchRoomEffect = (byte)(a);
_switchRoomEffect2 = (byte)(a >> 8);
} else {
screenEffect(_newEffect);
fadeIn(_newEffect);
}
break;
@ -2785,7 +2785,7 @@ void Scumm::o6_miscOps()
grabCursor(args[1], args[2], args[3], args[4]);
break;
case 5:
fadeToBlackEffect(args[1]);
fadeOut(args[1]);
break;
case 6:
_fullRedraw = 1;
@ -2793,7 +2793,7 @@ void Scumm::o6_miscOps()
for (i = 0; i < NUM_ACTORS; i++)
derefActor(i)->needRedraw = true;
processActors();
screenEffect(args[1]);
fadeIn(args[1]);
break;
case 8:
startManiac();

12
scumm.h
View file

@ -254,6 +254,14 @@ enum ResTypes {
rtNumTypes = 18
};
enum {
LIGHTMODE_dark = 0,
LIGHTMODE_actor_base = 1,
LIGHTMODE_screen = 2,
LIGHTMODE_flashlight = 4,
LIGHTMODE_actor_color = 8
};
enum {
OF_OWNER_MASK = 0x0F,
OF_STATE_MASK = 0xF0,
@ -1112,10 +1120,10 @@ public:
void updateDirtyScreen(int slot);
VirtScreen *findVirtScreen(int y);
void fadeToBlackEffect(int a);
void fadeOut(int a);
static void setVirtscreenDirty(VirtScreen *vs, int left, int top, int right, int bottom);
void screenEffect(int effect);
void fadeIn(int effect);
void unkScreenEffect1();
void unkScreenEffect2();
void unkScreenEffect3();

View file

@ -119,6 +119,8 @@ void Scumm::scummInit()
if (!(_features & GF_AFTER_V7)) {
_vars[VAR_V5_DRAWFLAGS] = 11;
_vars[VAR_59] = 3;
_vars[VAR_CURRENT_LIGHTS] = LIGHTMODE_actor_base | LIGHTMODE_actor_color | LIGHTMODE_screen;
}
mouse.x = 104;
@ -330,9 +332,10 @@ int Scumm::scummLoop(int delta)
setActorRedrawFlags();
resetActorBgs();
// if (!(_vars[VAR_V5_DRAWFLAGS]&2) && _vars[VAR_V5_DRAWFLAGS]&4) {
// error("Flashlight not implemented in this version");
// }
if (!(_vars[VAR_CURRENT_LIGHTS] & LIGHTMODE_screen) &&
_vars[VAR_CURRENT_LIGHTS] & LIGHTMODE_flashlight) {
error("Flashlight not implemented in this version");
}
processActors();
clear_fullRedraw();
@ -341,7 +344,7 @@ int Scumm::scummLoop(int delta)
if (_doEffect) {
_doEffect = false;
screenEffect(_newEffect);
fadeIn(_newEffect);
clearClickedStatus();
}
@ -383,7 +386,7 @@ void Scumm::startScene(int room, Actor * a, int objectNr)
clearMsgQueue();
fadeToBlackEffect(_switchRoomEffect2);
fadeOut(_switchRoomEffect2);
_newEffect = _switchRoomEffect;
if (_currentScript != 0xFF) {