diff options
Diffstat (limited to 'engines/agos/pn.cpp')
-rw-r--r-- | engines/agos/pn.cpp | 293 |
1 files changed, 293 insertions, 0 deletions
diff --git a/engines/agos/pn.cpp b/engines/agos/pn.cpp new file mode 100644 index 0000000000..66ff6c9c18 --- /dev/null +++ b/engines/agos/pn.cpp @@ -0,0 +1,293 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * 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$ + * + */ + +#include "common/config-manager.h" + +#include "agos/intern.h" +#include "agos/agos.h" + +namespace AGOS { + +AGOSEngine_PN::AGOSEngine_PN(OSystem *system) + : AGOSEngine(system) { + + _dataBase = 0; + _dataBaseSize = 0; + _textBase = 0; + _textBaseSize = 0; + + memset(_buffer, 0, sizeof(_buffer)); + memset(_inputline, 0, sizeof(_inputline)); + memset(_saveFile, 0, sizeof(_saveFile)); + memset(_sb, 0, sizeof(_sb)); + memset(_wordcp, 0, sizeof(_wordcp)); + + memset(_objectName1, 0, sizeof(_objectName1)); + memset(_objectName2, 0, sizeof(_objectName2)); + + _dragStore = 0; + _hitCalled = 0; + _inputReady = 0; + _inputting = 0; + _intputCounter = 0; + _inputMax = 0; + _mousePrintFG = 0; + _mouseString = 0; + _mouseString1 = 0; + memset(_inMessage, 0, sizeof(_inMessage)); + memset(_placeMessage, 0, sizeof(_placeMessage)); + + memset(_quickptr, 0, sizeof(_quickptr)); + memset(_quickshort, 0, sizeof(_quickshort)); + + _noScanFlag = false; + memset(_keyboardBuffer, 0, sizeof(_keyboardBuffer)); + + _objects = 0; + _objectCountS = 0; + + _bp = 0; + _xofs = 0; + _havinit = 0; + _seed = 0; + + _curwrdptr = 0; + _inpp = 0; + _fnst = 0; + _linembr = 0; + _linct = 0; + _procnum = 0; + + _linebase = 0; + _workptr = 0; + + _cjmpbuff = NULL; +} + +AGOSEngine_PN::~AGOSEngine_PN() { + free(_dataBase); + free(_textBase); + + free(_cjmpbuff); + free(_stackbase); +} + +const byte egaPalette[48] = { + 0, 0, 0, + 0, 0, 170, + 0, 170, 0, + 0, 170, 170, + 170, 0, 0, + 170, 0, 170, + 170, 85, 0, + 170, 170, 170, + 85, 85, 85, + 85, 85, 255, + 85, 255, 85, + 85, 255, 255, + 255, 85, 85, + 255, 85, 255, + 255, 255, 85, + 255, 255, 255 +}; + +Common::Error AGOSEngine_PN::go() { + loadGamePcFile(); + + if (getFileName(GAME_ICONFILE) != NULL) { + loadIconFile(); + } + + setupBoxes(); + + vc34_setMouseOff(); + + addVgaEvent(_frameCount, ANIMATE_INT, NULL, 0, 0); + + if (getPlatform() == Common::kPlatformPC) { + // Set EGA Palette + for (int i = 0; i < 16; i++) { + _displayPalette[i * 4 + 0] = egaPalette[i * 3 + 0]; + _displayPalette[i * 4 + 1] = egaPalette[i * 3 + 1]; + _displayPalette[i * 4 + 2] = egaPalette[i * 3 + 2]; + _displayPalette[i * 4 + 3] = 0; + } + _paletteFlag = 1; + } + + _inputWindow = _windowArray[2] = openWindow(0, 192, 40, 1, 1, 0, 15); + _textWindow = _windowArray[0] = openWindow(1, 136, 38, 6, 1, 0, 15); + + if (getFeatures() & GF_DEMO) { + demoSeq(); + } else { + introSeq(); + processor(); + } + + return Common::kNoError; +} + +void AGOSEngine_PN::demoSeq() { + while (!shouldQuit()) { + loadZone(0); + setWindowImage(3, 0); + while (!shouldQuit() && _variableArray[228] != 1) + delay(1); + + loadZone(1); + setWindowImage(0, 0); + while (!shouldQuit() && _variableArray[228] != 2) + delay(1); + + loadZone(2); + setWindowImage(0, 0); + while (!shouldQuit() && _variableArray[228] != 3) + delay(1); + } +} + +void AGOSEngine_PN::introSeq() { + loadZone(25); // Zone 'I' + setWindowImage(3, 0); + + _exitCutscene = false; + while (!shouldQuit() && !_exitCutscene && _variableArray[228] != 1) { + processSpecialKeys(); + delay(1); + } + + setWindowImage(3, 3); + delay(100); + + loadZone(27); // Zone 'K' + setWindowImage(3, 0); + + _exitCutscene = false; + while (!shouldQuit() && !_exitCutscene && _variableArray[228] != 2) { + processSpecialKeys(); + delay(1); + } +} + +void AGOSEngine_PN::setupBoxes() { + _hitAreaList = _invHitAreas; + // Inventory box + defineBox( 0, 11, 68, 16, 26, 25, 0, kOBFDraggable | kOBFUseEmptyLine | kOBFInventoryBox | kOBFNoShowName); + // Room Box + defineBox( 1, 11, 103, 16, 26, 26, 0, kOBFDraggable | kOBFUseEmptyLine | kOBFRoomBox | kOBFNoShowName); + // Exit box + defineBox( 2, 48, 2, 8, 28, 27, 0, kOBFUseEmptyLine | kOBFNoShowName); + // More box + defineBox( 3, 80, 2, 8, 26, 28, 0, kOBFUseEmptyLine | kOBFMoreBox | kOBFNoShowName); + // Close box + defineBox( 4, 110, 2, 8, 28, 29, 0, kOBFUseEmptyLine | kOBFNoShowName); + + // Icon boxes + uint8 num = 5; + for (uint8 r = 0; r < 5; r++) { + for (uint8 i = 0; i < 7; i++) { + defineBox(num, 96 + i * 24, 12 + r * 24, 24, 24, 0, 3, kOBFObject | kOBFDraggable); + num++; + } + } + + // Mark the end of inventory boxes + HitArea *ha = _hitAreaList + num; + ha->id = 0xFFFF; + + _hitAreaList = _hitAreas; + defineBox( 0, 0, 0, 200, 320, 0, 0, kOBFBoxDisabled | kOBFNoShowName); + defineBox( 1, 273, 4, 5, 45, 1, 0, kOBFUseEmptyLine | kOBFNoShowName | kOBFInvertTouch); + defineBox( 2, 273, 12, 5, 45, 2, 0, kOBFUseEmptyLine | kOBFNoShowName | kOBFInvertTouch); + defineBox( 3, 273, 20, 5, 45, 3, 0, kOBFUseEmptyLine | kOBFNoShowName | kOBFInvertTouch); + defineBox( 4, 273, 28, 5, 45, 4, 0, kOBFUseEmptyLine | kOBFNoShowName | kOBFInvertTouch); + defineBox( 5, 273, 36, 5, 45, 5, 0, kOBFUseEmptyLine | kOBFNoShowName | kOBFInvertTouch); + defineBox( 6, 273, 44, 5, 45, 6, 0, kOBFUseEmptyLine | kOBFNoShowName | kOBFInvertTouch); + defineBox( 7, 273, 52, 5, 45, 7, 0, kOBFUseEmptyLine | kOBFNoShowName | kOBFInvertTouch); + defineBox( 8, 273, 60, 5, 45, 8, 0, kOBFUseEmptyLine | kOBFNoShowName | kOBFInvertTouch); + defineBox( 9, 273, 68, 5, 45, 9, 0, kOBFUseEmptyLine | kOBFNoShowName | kOBFInvertTouch); + defineBox(10, 273, 76, 5, 45, 10, 0, kOBFUseEmptyLine | kOBFNoShowName | kOBFInvertTouch); + defineBox(11, 273, 84, 5, 45, 11, 0, kOBFUseEmptyLine | kOBFNoShowName | kOBFInvertTouch); + defineBox(12, 273, 92, 5, 45, 12, 0, kOBFUseEmptyLine | kOBFNoShowName | kOBFInvertTouch); + defineBox(13, 273, 100, 5, 45, 13, 0, kOBFUseEmptyLine | kOBFBoxDisabled | kOBFNoShowName); + defineBox(14, 273, 107, 5, 45, 14, 0, kOBFUseEmptyLine | kOBFNoShowName | kOBFInvertTouch); + defineBox(15, 273, 115, 5, 45, 15, 0, kOBFUseEmptyLine | kOBFNoShowName | kOBFInvertTouch); + defineBox(16, 273, 123, 5, 45, 16, 0, kOBFUseEmptyLine | kOBFBoxDisabled | kOBFNoShowName); + defineBox(17, 20, 5, 7, 7, 17, 0, kOBFUseEmptyLine | kOBFNoShowName); + defineBox(18, 28, 11, 7, 13, 18, 0, kOBFUseEmptyLine | kOBFNoShowName); + defineBox(19, 36, 21, 7, 7, 19, 0, kOBFUseEmptyLine | kOBFNoShowName); + defineBox(20, 27, 31, 7, 13, 20, 0, kOBFUseEmptyLine | kOBFNoShowName); + defineBox(21, 20, 37, 7, 7, 21, 0, kOBFUseEmptyLine | kOBFNoShowName); + defineBox(22, 5, 31, 7, 13, 22, 0, kOBFUseEmptyLine | kOBFNoShowName); + defineBox(23, 4, 21, 7, 7, 23, 0, kOBFUseEmptyLine | kOBFNoShowName); + defineBox(24, 5, 11, 7, 13, 24, 0, kOBFUseEmptyLine | kOBFNoShowName); + defineBox(25, 11, 68, 16, 26, 25, 0, kOBFDraggable | kOBFUseEmptyLine | kOBFInventoryBox | kOBFNoShowName); + defineBox(26, 11, 103, 16, 26, 26, 0, kOBFDraggable | kOBFUseEmptyLine | kOBFRoomBox | kOBFNoShowName); +} + +void AGOSEngine_PN::processor() { + int q; + + setqptrs(); + q = setjmp(_loadfail); + + _variableArray[6] = 0; + + if (getPlatform() == Common::kPlatformAtariST) { + _variableArray[21] = 2; + } else if (getPlatform() == Common::kPlatformAmiga) { + _variableArray[21] = 0; + } else { + _variableArray[21] = 1; + } + + _variableArray[16] = _quickshort[6]; + _variableArray[17] = _quickshort[7]; + _variableArray[19] = getptr(55L); + setposition(q, 0); + doline(0); +} + +void AGOSEngine_PN::setqptrs() { + int a = 0; + + while (a < 11) { + _quickptr[a] = getlong(3L * a); + a++; + } + _quickptr[11] = getlong(58L); + _quickptr[12] = getlong(61L); + _quickshort[0] = getptr(35L); + _quickshort[1] = getptr(37L); + _quickshort[2] = getptr(39L); + _quickshort[3] = getptr(41L); + _quickshort[4] = getptr(43L); + _quickshort[5] = getptr(45L); + _quickshort[6] = getptr(51L); + _quickshort[7] = getptr(53L); +} + +} // End of namespace AGOS |