mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-16 06:39:17 +00:00
290 lines
8.3 KiB
C++
290 lines
8.3 KiB
C++
/* 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.
|
|
*
|
|
*/
|
|
|
|
#include "common/config-manager.h"
|
|
|
|
#include "agos/intern.h"
|
|
#include "agos/agos.h"
|
|
|
|
namespace AGOS {
|
|
|
|
AGOSEngine_PN::AGOSEngine_PN(OSystem *system, const AGOSGameDescription *gd)
|
|
: AGOSEngine(system, gd) {
|
|
|
|
_stackbase = 0;
|
|
_tagOfActiveDoline = 0;
|
|
_dolineReturnVal = 0;
|
|
|
|
_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 = false;
|
|
_inputting = false;
|
|
_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;
|
|
}
|
|
|
|
AGOSEngine_PN::~AGOSEngine_PN() {
|
|
free(_dataBase);
|
|
free(_textBase);
|
|
|
|
}
|
|
|
|
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 (getFeatures() & GF_EGA) {
|
|
// Set EGA Palette
|
|
memcpy(_displayPalette, egaPalette, sizeof(egaPalette));
|
|
_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() {
|
|
setqptrs();
|
|
|
|
_tagOfActiveDoline = 0;
|
|
int q = 0;
|
|
do {
|
|
assert(_tagOfActiveDoline == 0);
|
|
_dolineReturnVal = 0;
|
|
|
|
_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);
|
|
|
|
// q indicates the process to run and is 0 the first time,
|
|
// but 1 later on (i.e., when we are "called" from badload()).
|
|
setposition(0, 0);
|
|
q = doline(0);
|
|
} while (q);
|
|
}
|
|
|
|
void AGOSEngine_PN::setqptrs() {
|
|
for (int i = 0; i < 11; ++i) {
|
|
_quickptr[i] = getlong(3 * i);
|
|
}
|
|
_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
|