From f1accee70239fe3ca0d83007099bf45f27e700c2 Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Fri, 27 Oct 2006 12:55:48 +0000 Subject: Cleanup svn-id: r24531 --- engines/agos/vga_e2.cpp | 241 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 engines/agos/vga_e2.cpp (limited to 'engines/agos/vga_e2.cpp') diff --git a/engines/agos/vga_e2.cpp b/engines/agos/vga_e2.cpp new file mode 100644 index 0000000000..4474dc4c3e --- /dev/null +++ b/engines/agos/vga_e2.cpp @@ -0,0 +1,241 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * Copyright (C) 2001-2006 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +// Video script opcodes for Simon1/Simon2 +#include "common/stdafx.h" + +#include "agos/agos.h" +#include "agos/intern.h" + +#include "common/system.h" + +namespace AGOS { + +void AGOSEngine::setupElvira2VideoOpcodes(VgaOpcodeProc *op) { + setupCommonVideoOpcodes(op); + + op[11] = &AGOSEngine::vc11_onStop; + op[17] = &AGOSEngine::vc17_waitEnd; + op[19] = &AGOSEngine::vc19_loop; + op[22] = &AGOSEngine::vc22_setPaletteOld; + op[28] = &AGOSEngine::vc28_playSFX; + op[32] = &AGOSEngine::vc32_saveScreen; + op[37] = &AGOSEngine::vc37_pokePalette; + op[45] = &AGOSEngine::vc45_setWindowPalette; + op[46] = &AGOSEngine::vc46_setPaletteSlot1; + op[47] = &AGOSEngine::vc47_setPaletteSlot2; + op[48] = &AGOSEngine::vc48_setPaletteSlot3; + op[53] = &AGOSEngine::vc53_dissolveIn; + op[54] = &AGOSEngine::vc54_dissolveOut; + op[57] = &AGOSEngine::vc57_blackPalette; + op[56] = &AGOSEngine::vc56_fullScreen; + op[58] = &AGOSEngine::vc58_checkCodeWheel; + op[59] = &AGOSEngine::vc59_ifEGA; +} + +void AGOSEngine::vc43_ifBitSet() { + if (!getBitFlag(vcReadNextWord())) { + vcSkipNextInstruction(); + } +} + +void AGOSEngine::vc44_ifBitClear() { + if (getBitFlag(vcReadNextWord())) { + vcSkipNextInstruction(); + } +} + +void AGOSEngine::vc45_setWindowPalette() { + uint num = vcReadNextWord(); + uint color = vcReadNextWord(); + + const uint16 *vlut = &_videoWindows[num * 4]; + uint16 *dst = (uint16 *)getBackBuf() + vlut[0] * 8 + vlut[1] * _dxSurfacePitch / 2; + + for (uint h = 0; h < vlut[3]; h++) { + uint width = vlut[2] * 8; + for (uint w = 0; w < width; w++) { + dst[w] &= 0xF0F; + dst[w] |= color * 16; + } + dst += _dxSurfacePitch / 2; + } +} + +void AGOSEngine::setPaletteSlot(uint srcOffs, uint dstOffs) { + byte *offs, *palptr, *src; + uint16 num; + + palptr = _displayPalette + dstOffs * 64; + offs = _curVgaFile1 + READ_BE_UINT16(_curVgaFile1 + 6); + src = offs + srcOffs * 32; + num = 16; + + do { + uint16 color = READ_BE_UINT16(src); + palptr[0] = ((color & 0xf00) >> 8) * 32; + palptr[1] = ((color & 0x0f0) >> 4) * 32; + palptr[2] = ((color & 0x00f) >> 0) * 32; + palptr[3] = 0; + + palptr += 4; + src += 2; + } while (--num); + + _paletteFlag = 2; +} + +void AGOSEngine::vc46_setPaletteSlot1() { + uint srcOffs = vcReadNextWord(); + setPaletteSlot(srcOffs, 1); +} + +void AGOSEngine::vc47_setPaletteSlot2() { + uint srcOffs = vcReadNextWord(); + setPaletteSlot(srcOffs, 2); +} + +void AGOSEngine::vc48_setPaletteSlot3() { + uint srcOffs = vcReadNextWord(); + setPaletteSlot(srcOffs, 3); +} + +void AGOSEngine::vc49_setBit() { + uint16 bit = vcReadNextWord(); + if (getGameType() == GType_FF && bit == 82) { + _variableArrayPtr = _variableArray2; + } + setBitFlag(bit, true); +} + +void AGOSEngine::vc50_clearBit() { + uint16 bit = vcReadNextWord(); + if (getGameType() == GType_FF && bit == 82) { + _variableArrayPtr = _variableArray; + } + setBitFlag(bit, false); +} + +void AGOSEngine::vc51_enableBox() { + enableBox(vcReadNextWord()); +} + +void AGOSEngine::vc52_playSound() { + bool ambient = false; + + uint16 sound = vcReadNextWord(); + if (sound >= 0x8000) { + ambient = true; + sound = -sound; + } + + if (getGameType() == GType_FF || getGameType() == GType_PP) { + int16 pan = vcReadNextWord(); + int16 vol = vcReadNextWord(); + + if (ambient) + loadSound(sound, pan, vol, 2); + else + loadSound(sound, pan, vol, 1); + } else if (getGameType() == GType_SIMON2) { + if (ambient) + _sound->playAmbient(sound); + else + _sound->playEffects(sound); + } else if (getFeatures() & GF_TALKIE) { + _sound->playEffects(sound); + } else if (getGameId() == GID_SIMON1DOS) { + playSting(sound); + } +} + +void AGOSEngine::vc53_dissolveIn() { + // TODO + uint num = vcReadNextWord(); + uint speed = vcReadNextWord(); + debug(0, "vc53_dissolveIn: stub (%d, %d)", num, speed); +} + +void AGOSEngine::vc54_dissolveOut() { + // TODO + uint num = vcReadNextWord(); + uint color = vcReadNextWord(); + uint speed = vcReadNextWord(); + debug(0, "vc54_dissolveOut: stub (%d, %d, %d)", num, color, speed); +} + +void AGOSEngine::vc55_moveBox() { + HitArea *ha = _hitAreas; + uint count = ARRAYSIZE(_hitAreas); + uint16 id = vcReadNextWord(); + int16 x = vcReadNextWord(); + int16 y = vcReadNextWord(); + + for (;;) { + if (ha->id == id) { + ha->x += x; + ha->y += y; + break; + } + ha++; + if (!--count) + break; + } + + _needHitAreaRecalc++; +} + +void AGOSEngine::vc56_fullScreen() { + byte *src = _curVgaFile2 + 32; + byte *dst = getBackBuf(); + + memcpy(dst, src + 768, _screenHeight * _screenWidth); + //fullFade(); + + uint8 palette[1024]; + for (int i = 0; i < 256; i++) { + palette[i * 4 + 0] = *src++ * 4; + palette[i * 4 + 1] = *src++ * 4; + palette[i * 4 + 2] = *src++ * 4; + palette[i * 4 + 3] = 0; + } + + _system->setPalette(palette, 0, 256); +} + +void AGOSEngine::vc57_blackPalette() { + uint8 palette[1024]; + memset(palette, 0, sizeof(palette)); + _system->setPalette(palette, 0, 256); +} + +void AGOSEngine::vc58_checkCodeWheel() { + _variableArray[0] = 0; +} + +void AGOSEngine::vc59_ifEGA() { + // Skip if not EGA + vcSkipNextInstruction(); +} + +} // End of namespace AGOS -- cgit v1.2.3