Initial commit
This commit is contained in:
290
engines/agos/pn.cpp
Normal file
290
engines/agos/pn.cpp
Normal file
@@ -0,0 +1,290 @@
|
||||
/* 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#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 = nullptr;
|
||||
_tagOfActiveDoline = 0;
|
||||
_dolineReturnVal = 0;
|
||||
|
||||
_dataBase = nullptr;
|
||||
_dataBaseSize = 0;
|
||||
_textBase = nullptr;
|
||||
_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 = nullptr;
|
||||
_hitCalled = 0;
|
||||
_inputReady = false;
|
||||
_inputting = false;
|
||||
_intputCounter = 0;
|
||||
_inputMax = 0;
|
||||
_mousePrintFG = 0;
|
||||
_mouseString = nullptr;
|
||||
_mouseString1 = nullptr;
|
||||
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 = nullptr;
|
||||
_inpp = nullptr;
|
||||
_fnst = 0;
|
||||
_linembr = 0;
|
||||
_linct = 0;
|
||||
_procnum = 0;
|
||||
|
||||
_linebase = nullptr;
|
||||
_workptr = nullptr;
|
||||
|
||||
_keymapEnabled = true;
|
||||
}
|
||||
|
||||
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) != nullptr) {
|
||||
loadIconFile();
|
||||
}
|
||||
|
||||
setupBoxes();
|
||||
|
||||
vc34_setMouseOff();
|
||||
|
||||
addVgaEvent(_frameCount, ANIMATE_INT, nullptr, 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
|
||||
Reference in New Issue
Block a user