PRIVATE: better detection tables + fixes
This commit is contained in:
parent
f602fa6d56
commit
fd0facc23d
4 changed files with 98 additions and 23 deletions
|
@ -10,34 +10,56 @@ static const PlainGameDescriptor privateGames[] = {
|
||||||
|
|
||||||
static const ADGameDescription gameDescriptions[] = {
|
static const ADGameDescription gameDescriptions[] = {
|
||||||
{
|
{
|
||||||
"private-eye", // Full game
|
"private-eye", // US release
|
||||||
0,
|
0,
|
||||||
AD_ENTRY1s("ASSETS.Z", "3a7532349cda8126e96dd5e49884af3a", 40232),
|
AD_ENTRY1s("ASSETS.Z", "3a7532349cda8126e96dd5e49884af3a", 40232),
|
||||||
Common::EN_ANY,
|
Common::EN_USA,
|
||||||
Common::kPlatformWindows,
|
Common::kPlatformWindows,
|
||||||
ADGF_NO_FLAGS,
|
ADGF_NO_FLAGS,
|
||||||
GUIO1(GUIO_NOMIDI)
|
GUIO1(GUIO_NOMIDI)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"private-eye", // EU release
|
||||||
|
0,
|
||||||
|
AD_ENTRY1s("ASSETS.Z", "73874f969026d6fd21a4e9834ce4a1a7", 17695),
|
||||||
|
Common::EN_GRB,
|
||||||
|
Common::kPlatformWindows,
|
||||||
|
ADGF_UNSUPPORTED,
|
||||||
|
GUIO1(GUIO_NOMIDI)
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"private-eye", // Demo from archive.org
|
"private-eye", // Demo from archive.org
|
||||||
"Demo",
|
"Demo",
|
||||||
AD_ENTRY1s("ASSETS.Z", "854e141bb67535359620a1833fcc1566", 5955),
|
AD_ENTRY1s("ASSETS.Z", "854e141bb67535359620a1833fcc1566", 5955),
|
||||||
Common::EN_ANY,
|
Common::EN_USA,
|
||||||
Common::kPlatformWindows,
|
Common::kPlatformWindows,
|
||||||
ADGF_DEMO,
|
ADGF_DEMO,
|
||||||
GUIO1(GUIO_NOMIDI)
|
GUIO1(GUIO_NOMIDI)
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"private-eye", // Demo from the full game CDROM
|
"private-eye", // Demo from the US release
|
||||||
"Demo",
|
"Demo",
|
||||||
AD_ENTRY1s("ASSETS.Z", "045766e39f44d6ee3bf92f0d4521587c", 5961),
|
AD_ENTRY1s("ASSETS.Z", "045766e39f44d6ee3bf92f0d4521587c", 5961),
|
||||||
Common::EN_ANY,
|
Common::EN_USA,
|
||||||
Common::kPlatformWindows,
|
Common::kPlatformWindows,
|
||||||
ADGF_DEMO,
|
ADGF_DEMO,
|
||||||
GUIO1(GUIO_NOMIDI)
|
GUIO1(GUIO_NOMIDI)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
"private-eye", // Demo from the EU release
|
||||||
|
"Demo",
|
||||||
|
AD_ENTRY1s("ASSETS.Z", "15e10e8fbb1e9aac4d32c5d8215e7c86", 2299),
|
||||||
|
Common::EN_GRB,
|
||||||
|
Common::kPlatformWindows,
|
||||||
|
ADGF_DEMO | ADGF_UNSUPPORTED,
|
||||||
|
GUIO1(GUIO_NOMIDI)
|
||||||
|
},
|
||||||
|
|
||||||
AD_TABLE_END_MARKER
|
AD_TABLE_END_MARKER
|
||||||
};
|
};
|
||||||
} // End of namespace Private
|
} // End of namespace Private
|
||||||
|
|
|
@ -70,7 +70,8 @@ void LoadGame(ArgArray args) {
|
||||||
m->surf = g_private->loadMask(*s, 0, 0, true);
|
m->surf = g_private->loadMask(*s, 0, 0, true);
|
||||||
m->cursor = args[2].u.sym->name;
|
m->cursor = args[2].u.sym->name;
|
||||||
m->nextSetting = NULL;
|
m->nextSetting = NULL;
|
||||||
m->flag = NULL;
|
m->flag1 = NULL;
|
||||||
|
m->flag2 = NULL;
|
||||||
g_private->_loadGameMask = m;
|
g_private->_loadGameMask = m;
|
||||||
g_private->_masks.push_front(*m);
|
g_private->_masks.push_front(*m);
|
||||||
}
|
}
|
||||||
|
@ -83,7 +84,8 @@ void SaveGame(ArgArray args) {
|
||||||
m->surf = g_private->loadMask(*s, 0, 0, true);
|
m->surf = g_private->loadMask(*s, 0, 0, true);
|
||||||
m->cursor = args[1].u.sym->name;
|
m->cursor = args[1].u.sym->name;
|
||||||
m->nextSetting = NULL;
|
m->nextSetting = NULL;
|
||||||
m->flag = NULL;
|
m->flag1 = NULL;
|
||||||
|
m->flag2 = NULL;
|
||||||
g_private->_saveGameMask = m;
|
g_private->_saveGameMask = m;
|
||||||
g_private->_masks.push_front(*m);
|
g_private->_masks.push_front(*m);
|
||||||
}
|
}
|
||||||
|
@ -117,6 +119,8 @@ void Inventory(ArgArray args) {
|
||||||
Datum v2 = args[2];
|
Datum v2 = args[2];
|
||||||
Datum e = args[3];
|
Datum e = args[3];
|
||||||
|
|
||||||
|
Datum c = args[5];
|
||||||
|
|
||||||
Datum snd = args[8];
|
Datum snd = args[8];
|
||||||
|
|
||||||
assert(v1.type == STRING || v1.type == NAME);
|
assert(v1.type == STRING || v1.type == NAME);
|
||||||
|
@ -142,18 +146,31 @@ void Inventory(ArgArray args) {
|
||||||
|
|
||||||
m->cursor = new Common::String("kInventory");
|
m->cursor = new Common::String("kInventory");
|
||||||
m->point = new Common::Point(0,0);
|
m->point = new Common::Point(0,0);
|
||||||
if (v2.type == NAME)
|
|
||||||
m->flag = v2.u.sym;
|
if (v1.type == NAME)
|
||||||
|
m->flag1 = v1.u.sym;
|
||||||
else
|
else
|
||||||
m->flag = NULL;
|
m->flag1 = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
if (v2.type == NAME)
|
||||||
|
m->flag2 = v2.u.sym;
|
||||||
|
else
|
||||||
|
m->flag2 = NULL;
|
||||||
|
|
||||||
g_private->_masks.push_front(*m);
|
g_private->_masks.push_front(*m);
|
||||||
g_private->_toTake = true;
|
g_private->_toTake = true;
|
||||||
}
|
} else {
|
||||||
|
|
||||||
if (v1.type == NAME)
|
if (v1.type == NAME)
|
||||||
|
if (strcmp(c.u.str, "\"REMOVE\"") == 0)
|
||||||
|
v1.u.sym->u.val = 0;
|
||||||
|
else
|
||||||
v1.u.sym->u.val = 1;
|
v1.u.sym->u.val = 1;
|
||||||
|
|
||||||
|
if (v2.type == NAME)
|
||||||
|
v2.u.sym->u.val = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (strcmp(snd.u.str, "\"\"") != 0) {
|
if (strcmp(snd.u.str, "\"\"") != 0) {
|
||||||
Common::String *s = new Common::String(snd.u.str);
|
Common::String *s = new Common::String(snd.u.str);
|
||||||
g_private->playSound(*s, 1);
|
g_private->playSound(*s, 1);
|
||||||
|
@ -247,6 +264,17 @@ void Transition(ArgArray args) {
|
||||||
g_private->_nextSetting = new Common::String(args[1].u.str);
|
g_private->_nextSetting = new Common::String(args[1].u.str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Resume(ArgArray args) {
|
||||||
|
// assert types
|
||||||
|
debug("Resume(%d)", args[0].u.val); // this value is always 1
|
||||||
|
g_private->_nextSetting = g_private->_pausedSetting;
|
||||||
|
g_private->_pausedSetting = NULL;
|
||||||
|
g_private->_mode = 1;
|
||||||
|
g_private->_origin->x = 64; // use a constant
|
||||||
|
g_private->_origin->y = 48;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void Movie(ArgArray args) {
|
void Movie(ArgArray args) {
|
||||||
// assert types
|
// assert types
|
||||||
debug("Movie(%s, %s)", args[0].u.str, args[1].u.str);
|
debug("Movie(%s, %s)", args[0].u.str, args[1].u.str);
|
||||||
|
@ -331,7 +359,8 @@ void _Mask(ArgArray args, bool drawn) {
|
||||||
m->surf = g_private->loadMask(*s, x, y, drawn);
|
m->surf = g_private->loadMask(*s, x, y, drawn);
|
||||||
m->nextSetting = new Common::String(e);
|
m->nextSetting = new Common::String(e);
|
||||||
m->cursor = c;
|
m->cursor = c;
|
||||||
m->flag = NULL;
|
m->flag1 = NULL;
|
||||||
|
m->flag2 = NULL;
|
||||||
m->point = new Common::Point(x,y);
|
m->point = new Common::Point(x,y);
|
||||||
g_private->_masks.push_front(*m);
|
g_private->_masks.push_front(*m);
|
||||||
|
|
||||||
|
@ -407,7 +436,8 @@ void SoundArea(ArgArray args) {
|
||||||
m->surf = g_private->loadMask(*s, 0, 0, true);
|
m->surf = g_private->loadMask(*s, 0, 0, true);
|
||||||
m->cursor = args[2].u.sym->name;
|
m->cursor = args[2].u.sym->name;
|
||||||
m->nextSetting = NULL;
|
m->nextSetting = NULL;
|
||||||
m->flag = NULL;
|
m->flag1 = NULL;
|
||||||
|
m->flag2 = NULL;
|
||||||
g_private->_AMRadioArea = m;
|
g_private->_AMRadioArea = m;
|
||||||
g_private->_masks.push_front(*m);
|
g_private->_masks.push_front(*m);
|
||||||
} else if (strcmp(n, "kPoliceRadio") == 0) {
|
} else if (strcmp(n, "kPoliceRadio") == 0) {
|
||||||
|
@ -416,7 +446,8 @@ void SoundArea(ArgArray args) {
|
||||||
m->surf = g_private->loadMask(*s, 0, 0, true);
|
m->surf = g_private->loadMask(*s, 0, 0, true);
|
||||||
m->cursor = args[2].u.sym->name;
|
m->cursor = args[2].u.sym->name;
|
||||||
m->nextSetting = NULL;
|
m->nextSetting = NULL;
|
||||||
m->flag = NULL;
|
m->flag1 = NULL;
|
||||||
|
m->flag2 = NULL;
|
||||||
g_private->_policeRadioArea = m;
|
g_private->_policeRadioArea = m;
|
||||||
g_private->_masks.push_front(*m);
|
g_private->_masks.push_front(*m);
|
||||||
} else if (strcmp(n, "kPhone") == 0) {
|
} else if (strcmp(n, "kPhone") == 0) {
|
||||||
|
@ -425,7 +456,8 @@ void SoundArea(ArgArray args) {
|
||||||
m->surf = g_private->loadMask(*s, 0, 0, true);
|
m->surf = g_private->loadMask(*s, 0, 0, true);
|
||||||
m->cursor = args[2].u.sym->name;
|
m->cursor = args[2].u.sym->name;
|
||||||
m->nextSetting = NULL;
|
m->nextSetting = NULL;
|
||||||
m->flag = NULL;
|
m->flag1 = NULL;
|
||||||
|
m->flag2 = NULL;
|
||||||
g_private->_phoneArea = m;
|
g_private->_phoneArea = m;
|
||||||
g_private->_masks.push_front(*m);
|
g_private->_masks.push_front(*m);
|
||||||
}
|
}
|
||||||
|
@ -457,6 +489,7 @@ static struct FuncTable {
|
||||||
} funcTable[] = {
|
} funcTable[] = {
|
||||||
|
|
||||||
{ ChgMode, "ChgMode"},
|
{ ChgMode, "ChgMode"},
|
||||||
|
{ Resume, "Resume"},
|
||||||
{ Goto, "goto"},
|
{ Goto, "goto"},
|
||||||
{ SetFlag, "SetFlag"},
|
{ SetFlag, "SetFlag"},
|
||||||
{ Timer, "Timer"},
|
{ Timer, "Timer"},
|
||||||
|
|
|
@ -56,6 +56,7 @@ PrivateEngine::PrivateEngine(OSystem *syst)
|
||||||
_loadGameMask = NULL;
|
_loadGameMask = NULL;
|
||||||
|
|
||||||
_nextSetting = NULL;
|
_nextSetting = NULL;
|
||||||
|
_currentSetting = NULL;
|
||||||
_nextMovie = NULL;
|
_nextMovie = NULL;
|
||||||
_nextVS = NULL;
|
_nextVS = NULL;
|
||||||
_modified = false;
|
_modified = false;
|
||||||
|
@ -63,6 +64,7 @@ PrivateEngine::PrivateEngine(OSystem *syst)
|
||||||
_toTake = false;
|
_toTake = false;
|
||||||
_frame = new Common::String("inface/general/inface2.bmp");
|
_frame = new Common::String("inface/general/inface2.bmp");
|
||||||
_repeatedMovieExit = new Common::String("");
|
_repeatedMovieExit = new Common::String("");
|
||||||
|
_pausedSetting = NULL;
|
||||||
|
|
||||||
_paperShuffleSound = new Common::String("global/audio/glsfx0");
|
_paperShuffleSound = new Common::String("global/audio/glsfx0");
|
||||||
_takeSound = new Common::String("global/audio/took");
|
_takeSound = new Common::String("global/audio/took");
|
||||||
|
@ -166,6 +168,12 @@ Common::Error PrivateEngine::run() {
|
||||||
case Common::EVENT_KEYDOWN:
|
case Common::EVENT_KEYDOWN:
|
||||||
if (event.kbd.keycode == Common::KEYCODE_ESCAPE && _videoDecoder)
|
if (event.kbd.keycode == Common::KEYCODE_ESCAPE && _videoDecoder)
|
||||||
skipVideo();
|
skipVideo();
|
||||||
|
else if (event.kbd.keycode == Common::KEYCODE_m) {
|
||||||
|
if ( _pausedSetting == NULL) {
|
||||||
|
_pausedSetting = _currentSetting;
|
||||||
|
_nextSetting = new Common::String("kPauseMovie");
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Common::EVENT_QUIT:
|
case Common::EVENT_QUIT:
|
||||||
|
@ -233,7 +241,7 @@ Common::Error PrivateEngine::run() {
|
||||||
_policeRadioArea = NULL;
|
_policeRadioArea = NULL;
|
||||||
_AMRadioArea = NULL;
|
_AMRadioArea = NULL;
|
||||||
_phoneArea = NULL;
|
_phoneArea = NULL;
|
||||||
|
_currentSetting = _nextSetting;
|
||||||
loadSetting(_nextSetting);
|
loadSetting(_nextSetting);
|
||||||
_nextSetting = NULL;
|
_nextSetting = NULL;
|
||||||
execute(prog);
|
execute(prog);
|
||||||
|
@ -365,8 +373,9 @@ void PrivateEngine::selectMask(Common::Point mousePos) {
|
||||||
ns = m.nextSetting;
|
ns = m.nextSetting;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m.flag != NULL) { // TODO: check this
|
if (m.flag1 != NULL) { // TODO: check this
|
||||||
setSymbol(m.flag, 1);
|
setSymbol(m.flag1, 1);
|
||||||
|
debug("!!!!!!!!!!!!!! setting %s to 1 !!!!!!!!!!!!!!!!!!1", m.flag1->name->c_str());
|
||||||
// an item was taken
|
// an item was taken
|
||||||
if (_toTake) {
|
if (_toTake) {
|
||||||
playSound(*getTakeSound(), 1);
|
playSound(*getTakeSound(), 1);
|
||||||
|
@ -374,6 +383,10 @@ void PrivateEngine::selectMask(Common::Point mousePos) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m.flag2 != NULL) {
|
||||||
|
setSymbol(m.flag2, 1);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -687,7 +700,8 @@ void PrivateEngine::drawScreenFrame(Graphics::Surface *screen) {
|
||||||
Common::File file;
|
Common::File file;
|
||||||
assert(file.open(path));
|
assert(file.open(path));
|
||||||
_image->loadStream(file);
|
_image->loadStream(file);
|
||||||
screen->copyRectToSurface(*_image->getSurface()->convertTo(_pixelFormat, _image->getPalette()), 0, 0, Common::Rect(0, 0, _screenW, _screenH));
|
Graphics::Surface *frame = _image->getSurface()->convertTo(_pixelFormat, _image->getPalette());
|
||||||
|
screen->copyRectToSurface(*frame, 0, 0, Common::Rect(0, 0, _screenW, _screenH));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -722,7 +736,10 @@ void PrivateEngine::drawScreen() {
|
||||||
frame->create(_screenW, _screenH, _pixelFormat);
|
frame->create(_screenW, _screenH, _pixelFormat);
|
||||||
frame->copyFrom(*_videoDecoder->decodeNextFrame());
|
frame->copyFrom(*_videoDecoder->decodeNextFrame());
|
||||||
const Common::Point o(_origin->x, _origin->y);
|
const Common::Point o(_origin->x, _origin->y);
|
||||||
surface->transBlitFrom(*frame->convertTo(_pixelFormat, _videoDecoder->getPalette()), o);
|
Graphics::Surface *cframe = frame->convertTo(_pixelFormat, _videoDecoder->getPalette());
|
||||||
|
surface->transBlitFrom(*cframe, o);
|
||||||
|
delete frame;
|
||||||
|
delete cframe;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(w == _screenW && h == _screenH);
|
assert(w == _screenW && h == _screenH);
|
||||||
|
|
|
@ -47,7 +47,8 @@ typedef struct MaskInfo {
|
||||||
Graphics::ManagedSurface *surf;
|
Graphics::ManagedSurface *surf;
|
||||||
Common::String *nextSetting;
|
Common::String *nextSetting;
|
||||||
Common::Point *point;
|
Common::Point *point;
|
||||||
Symbol *flag;
|
Symbol *flag1;
|
||||||
|
Symbol *flag2;
|
||||||
Common::String *cursor;
|
Common::String *cursor;
|
||||||
} MaskInfo;
|
} MaskInfo;
|
||||||
|
|
||||||
|
@ -150,6 +151,8 @@ public:
|
||||||
PlayedMediaTable _playedMovies;
|
PlayedMediaTable _playedMovies;
|
||||||
PlayedMediaTable _playedPhoneClips;
|
PlayedMediaTable _playedPhoneClips;
|
||||||
Common::String *_repeatedMovieExit;
|
Common::String *_repeatedMovieExit;
|
||||||
|
Common::String *_pausedSetting;
|
||||||
|
|
||||||
ExitList _exits;
|
ExitList _exits;
|
||||||
MaskList _masks;
|
MaskList _masks;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue