SCI: saving/restoring script created windows now
fixes "GfxPorts::kernelSetActive" error based on code by [md5] svn-id: r54012
This commit is contained in:
parent
9a350f4398
commit
eefa151d70
5 changed files with 426 additions and 334 deletions
|
@ -40,6 +40,7 @@
|
|||
#include "sci/engine/selector.h"
|
||||
#include "sci/engine/vm_types.h"
|
||||
#include "sci/engine/script.h" // for SCI_OBJ_EXPORTS and SCI_OBJ_SYNONYMS
|
||||
#include "sci/graphics/helpers.h"
|
||||
#include "sci/graphics/palette.h"
|
||||
#include "sci/graphics/ports.h"
|
||||
#include "sci/sound/audio.h"
|
||||
|
@ -175,9 +176,6 @@ void syncWithSerializer(Common::Serializer &s, Class &obj) {
|
|||
}
|
||||
|
||||
static void sync_SavegameMetadata(Common::Serializer &s, SavegameMetadata &obj) {
|
||||
// TODO: It would be a good idea to store a magic number & a header size here,
|
||||
// so that we can implement backward compatibility if the savegame format changes.
|
||||
|
||||
s.syncString(obj.name);
|
||||
s.syncVersion(CURRENT_SAVEGAME_VERSION);
|
||||
obj.version = s.getVersion();
|
||||
|
@ -605,6 +603,61 @@ void GfxPalette::saveLoadWithSerializer(Common::Serializer &s) {
|
|||
}
|
||||
}
|
||||
|
||||
void GfxPorts::saveLoadWithSerializer(Common::Serializer &s) {
|
||||
if (s.isLoading())
|
||||
reset(); // remove all script generated windows
|
||||
|
||||
if (s.getVersion() >= 27) {
|
||||
uint windowCount = 0;
|
||||
uint id = PORTS_FIRSTSCRIPTWINDOWID;
|
||||
if (s.isSaving()) {
|
||||
while (id < _windowsById.size()) {
|
||||
if (_windowsById[id])
|
||||
windowCount++;
|
||||
id++;
|
||||
}
|
||||
}
|
||||
// Save/Restore window count
|
||||
s.syncAsUint32LE(windowCount);
|
||||
|
||||
if (s.isSaving()) {
|
||||
id = PORTS_FIRSTSCRIPTWINDOWID;
|
||||
while (id < _windowsById.size()) {
|
||||
if (_windowsById[id]) {
|
||||
Window *window = (Window *)_windowsById[id];
|
||||
window->saveLoadWithSerializer(s);
|
||||
}
|
||||
id++;
|
||||
}
|
||||
} else {
|
||||
id = PORTS_FIRSTSCRIPTWINDOWID;
|
||||
while (windowCount) {
|
||||
Window *window = new Window(0);
|
||||
window->saveLoadWithSerializer(s);
|
||||
|
||||
// add enough entries inside _windowsById as needed
|
||||
while (id <= window->id) {
|
||||
_windowsById.push_back(0);
|
||||
id++;
|
||||
}
|
||||
_windowsById[window->id] = window;
|
||||
// _windowList may not be 100% correct using that way of restoring
|
||||
// saving/restoring ports won't work perfectly anyway, because the contents
|
||||
// of the window can only get repainted by the scripts and they dont do that
|
||||
// so we will get empty, transparent windows instead. So perfect window order
|
||||
// shouldn't really matter
|
||||
if (window->wndStyle & SCI_WINDOWMGR_STYLE_TOPMOST)
|
||||
_windowList.push_front(window);
|
||||
else
|
||||
_windowList.push_back(window);
|
||||
|
||||
windowCount--;
|
||||
id++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SegManager::reconstructStack(EngineState *s) {
|
||||
DataStack *stack = (DataStack *)(_heap[findSegmentByType(SEG_TYPE_STACK)]);
|
||||
s->stack_base = stack->_entries;
|
||||
|
@ -711,6 +764,8 @@ bool gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savenam
|
|||
sync_SavegameMetadata(ser, meta);
|
||||
Graphics::saveThumbnail(*fh);
|
||||
s->saveLoadWithSerializer(ser); // FIXME: Error handling?
|
||||
if (g_sci->_gfxPorts)
|
||||
g_sci->_gfxPorts->saveLoadWithSerializer(ser);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -761,6 +816,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
|
|||
s->reset(true);
|
||||
s->saveLoadWithSerializer(ser); // FIXME: Error handling?
|
||||
|
||||
|
||||
// Now copy all current state information
|
||||
|
||||
s->_segMan->reconstructStack(s);
|
||||
|
@ -775,8 +831,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
|
|||
g_engine->setTotalPlayTime(meta.playTime * 1000);
|
||||
|
||||
if (g_sci->_gfxPorts)
|
||||
g_sci->_gfxPorts->reset();
|
||||
|
||||
g_sci->_gfxPorts->saveLoadWithSerializer(ser);
|
||||
g_sci->_soundCmd->reconstructPlayList();
|
||||
|
||||
// Message state:
|
||||
|
|
|
@ -1,80 +1,80 @@
|
|||
/* 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.
|
||||
*
|
||||
/* 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$
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SCI_ENGINE_SAVEGAME_H
|
||||
#define SCI_ENGINE_SAVEGAME_H
|
||||
|
||||
#include "common/scummsys.h"
|
||||
#include "common/str.h"
|
||||
|
||||
#include "sci/sci.h"
|
||||
|
||||
namespace Sci {
|
||||
|
||||
struct EngineState;
|
||||
|
||||
enum {
|
||||
CURRENT_SAVEGAME_VERSION = 26,
|
||||
MINIMUM_SAVEGAME_VERSION = 14
|
||||
};
|
||||
|
||||
// Savegame metadata
|
||||
struct SavegameMetadata {
|
||||
Common::String name;
|
||||
int version;
|
||||
Common::String gameVersion;
|
||||
int saveDate;
|
||||
int saveTime;
|
||||
uint32 playTime;
|
||||
uint16 gameObjectOffset;
|
||||
uint16 script0Size;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Saves a game state to the hard disk in a portable way.
|
||||
* @param s The state to save
|
||||
* @param save The stream to save to
|
||||
* @param savename The description of the savegame
|
||||
* @return 0 on success, 1 otherwise
|
||||
*/
|
||||
bool gamestate_save(EngineState *s, Common::WriteStream *save, const char *savename, const char *version);
|
||||
|
||||
/**
|
||||
* Restores a game state from a directory.
|
||||
* @param s An older state from the same game
|
||||
* @param dirname The subdirectory to restore from
|
||||
*/
|
||||
void gamestate_restore(EngineState *s, Common::SeekableReadStream *save);
|
||||
|
||||
/**
|
||||
* Read the header from a savegame.
|
||||
*/
|
||||
bool get_savegame_metadata(Common::SeekableReadStream* stream, SavegameMetadata* meta);
|
||||
|
||||
|
||||
} // End of namespace Sci
|
||||
|
||||
#endif // SCI_ENGINE_SAVEGAME_H
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SCI_ENGINE_SAVEGAME_H
|
||||
#define SCI_ENGINE_SAVEGAME_H
|
||||
|
||||
#include "common/scummsys.h"
|
||||
#include "common/str.h"
|
||||
|
||||
#include "sci/sci.h"
|
||||
|
||||
namespace Sci {
|
||||
|
||||
struct EngineState;
|
||||
|
||||
enum {
|
||||
CURRENT_SAVEGAME_VERSION = 27,
|
||||
MINIMUM_SAVEGAME_VERSION = 14
|
||||
};
|
||||
|
||||
// Savegame metadata
|
||||
struct SavegameMetadata {
|
||||
Common::String name;
|
||||
int version;
|
||||
Common::String gameVersion;
|
||||
int saveDate;
|
||||
int saveTime;
|
||||
uint32 playTime;
|
||||
uint16 gameObjectOffset;
|
||||
uint16 script0Size;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Saves a game state to the hard disk in a portable way.
|
||||
* @param s The state to save
|
||||
* @param save The stream to save to
|
||||
* @param savename The description of the savegame
|
||||
* @return 0 on success, 1 otherwise
|
||||
*/
|
||||
bool gamestate_save(EngineState *s, Common::WriteStream *save, const char *savename, const char *version);
|
||||
|
||||
/**
|
||||
* Restores a game state from a directory.
|
||||
* @param s An older state from the same game
|
||||
* @param dirname The subdirectory to restore from
|
||||
*/
|
||||
void gamestate_restore(EngineState *s, Common::SeekableReadStream *save);
|
||||
|
||||
/**
|
||||
* Read the header from a savegame.
|
||||
*/
|
||||
bool get_savegame_metadata(Common::SeekableReadStream* stream, SavegameMetadata* meta);
|
||||
|
||||
|
||||
} // End of namespace Sci
|
||||
|
||||
#endif // SCI_ENGINE_SAVEGAME_H
|
||||
|
|
|
@ -1,111 +1,145 @@
|
|||
/* 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.
|
||||
*
|
||||
/* 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$
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SCI_GRAPHICS_HELPERS_H
|
||||
#define SCI_GRAPHICS_HELPERS_H
|
||||
|
||||
#include "common/endian.h" // for READ_LE_UINT16
|
||||
#include "common/rect.h"
|
||||
#include "common/serializer.h"
|
||||
#include "sci/engine/vm_types.h"
|
||||
|
||||
namespace Sci {
|
||||
|
||||
// Cache limits
|
||||
#define MAX_CACHED_CURSORS 10
|
||||
#define MAX_CACHED_FONTS 20
|
||||
#define MAX_CACHED_VIEWS 50
|
||||
|
||||
#define SCI_SHAKE_DIRECTION_VERTICAL 1
|
||||
#define SCI_SHAKE_DIRECTION_HORIZONTAL 2
|
||||
|
||||
typedef int GuiResourceId; // is a resource-number and -1 means no parameter given
|
||||
|
||||
typedef int16 TextAlignment;
|
||||
|
||||
struct Port {
|
||||
uint16 id;
|
||||
int16 top, left;
|
||||
Common::Rect rect;
|
||||
int16 curTop, curLeft;
|
||||
int16 fontHeight;
|
||||
GuiResourceId fontId;
|
||||
bool greyedOutput;
|
||||
int16 penClr, backClr;
|
||||
int16 penMode;
|
||||
uint16 counterTillFree;
|
||||
|
||||
Port(uint16 theId) : id(theId), top(0), left(0),
|
||||
curTop(0), curLeft(0),
|
||||
fontHeight(0), fontId(0), greyedOutput(false),
|
||||
penClr(0), backClr(0xFF), penMode(0), counterTillFree(0) {
|
||||
}
|
||||
};
|
||||
|
||||
struct Window : public Port {
|
||||
Common::Rect dims; // client area of window
|
||||
Common::Rect restoreRect; // total area of window including borders
|
||||
uint16 wndStyle;
|
||||
uint16 saveScreenMask;
|
||||
reg_t hSaved1;
|
||||
reg_t hSaved2;
|
||||
Common::String title;
|
||||
bool bDrawn;
|
||||
|
||||
Window(uint16 theId) : Port(theId),
|
||||
wndStyle(0), saveScreenMask(0),
|
||||
hSaved1(NULL_REG), hSaved2(NULL_REG),
|
||||
bDrawn(false) {
|
||||
}
|
||||
};
|
||||
|
||||
struct Color {
|
||||
byte used;
|
||||
byte r, g, b;
|
||||
};
|
||||
|
||||
struct Palette {
|
||||
byte mapping[256];
|
||||
uint32 timestamp;
|
||||
Color colors[256];
|
||||
byte intensity[256];
|
||||
};
|
||||
|
||||
struct PalSchedule {
|
||||
byte from;
|
||||
uint32 schedule;
|
||||
};
|
||||
|
||||
enum ViewType {
|
||||
kViewUnknown,
|
||||
kViewEga,
|
||||
kViewVga,
|
||||
kViewVga11,
|
||||
kViewAmiga
|
||||
};
|
||||
|
||||
} // End of namespace Sci
|
||||
|
||||
#endif
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SCI_GRAPHICS_HELPERS_H
|
||||
#define SCI_GRAPHICS_HELPERS_H
|
||||
|
||||
#include "common/endian.h" // for READ_LE_UINT16
|
||||
#include "common/rect.h"
|
||||
#include "common/serializer.h"
|
||||
#include "sci/engine/vm_types.h"
|
||||
|
||||
namespace Sci {
|
||||
|
||||
// Cache limits
|
||||
#define MAX_CACHED_CURSORS 10
|
||||
#define MAX_CACHED_FONTS 20
|
||||
#define MAX_CACHED_VIEWS 50
|
||||
|
||||
#define SCI_SHAKE_DIRECTION_VERTICAL 1
|
||||
#define SCI_SHAKE_DIRECTION_HORIZONTAL 2
|
||||
|
||||
typedef int GuiResourceId; // is a resource-number and -1 means no parameter given
|
||||
|
||||
typedef int16 TextAlignment;
|
||||
|
||||
struct Port {
|
||||
uint16 id;
|
||||
int16 top, left;
|
||||
Common::Rect rect;
|
||||
int16 curTop, curLeft;
|
||||
int16 fontHeight;
|
||||
GuiResourceId fontId;
|
||||
bool greyedOutput;
|
||||
int16 penClr, backClr;
|
||||
int16 penMode;
|
||||
uint16 counterTillFree;
|
||||
|
||||
Port(uint16 theId) : id(theId), top(0), left(0),
|
||||
curTop(0), curLeft(0),
|
||||
fontHeight(0), fontId(0), greyedOutput(false),
|
||||
penClr(0), backClr(0xFF), penMode(0), counterTillFree(0) {
|
||||
}
|
||||
};
|
||||
|
||||
struct Window : public Port, public Common::Serializable {
|
||||
Common::Rect dims; // client area of window
|
||||
Common::Rect restoreRect; // total area of window including borders
|
||||
uint16 wndStyle;
|
||||
uint16 saveScreenMask;
|
||||
reg_t hSaved1;
|
||||
reg_t hSaved2;
|
||||
Common::String title;
|
||||
bool bDrawn;
|
||||
|
||||
Window(uint16 theId) : Port(theId),
|
||||
wndStyle(0), saveScreenMask(0),
|
||||
hSaved1(NULL_REG), hSaved2(NULL_REG),
|
||||
bDrawn(false) {
|
||||
}
|
||||
|
||||
void syncRect(Common::Serializer &ser, Common::Rect targetRect) {
|
||||
ser.syncAsSint16LE(targetRect.top);
|
||||
ser.syncAsSint16LE(targetRect.left);
|
||||
ser.syncAsSint16LE(targetRect.bottom);
|
||||
ser.syncAsSint16LE(targetRect.right);
|
||||
}
|
||||
|
||||
virtual void saveLoadWithSerializer(Common::Serializer &ser) {
|
||||
ser.syncAsUint16LE(id);
|
||||
ser.syncAsSint16LE(top);
|
||||
ser.syncAsSint16LE(left);
|
||||
syncRect(ser, rect);
|
||||
ser.syncAsSint16LE(curTop);
|
||||
ser.syncAsSint16LE(curLeft);
|
||||
ser.syncAsSint16LE(fontHeight);
|
||||
ser.syncAsSint32LE(fontId);
|
||||
ser.syncAsByte(greyedOutput);
|
||||
ser.syncAsSint16LE(penClr);
|
||||
ser.syncAsSint16LE(backClr);
|
||||
ser.syncAsSint16LE(penMode);
|
||||
ser.syncAsUint16LE(counterTillFree);
|
||||
syncRect(ser, dims);
|
||||
syncRect(ser, restoreRect);
|
||||
ser.syncAsUint16LE(wndStyle);
|
||||
ser.syncAsUint16LE(saveScreenMask);
|
||||
if (ser.isLoading()) {
|
||||
// The hunk table isn't saved, so we just set both pointers to NULL
|
||||
hSaved1 = NULL_REG;
|
||||
hSaved2 = NULL_REG;
|
||||
}
|
||||
ser.syncString(title);
|
||||
ser.syncAsByte(bDrawn);
|
||||
}
|
||||
};
|
||||
|
||||
struct Color {
|
||||
byte used;
|
||||
byte r, g, b;
|
||||
};
|
||||
|
||||
struct Palette {
|
||||
byte mapping[256];
|
||||
uint32 timestamp;
|
||||
Color colors[256];
|
||||
byte intensity[256];
|
||||
};
|
||||
|
||||
struct PalSchedule {
|
||||
byte from;
|
||||
uint32 schedule;
|
||||
};
|
||||
|
||||
enum ViewType {
|
||||
kViewUnknown,
|
||||
kViewEga,
|
||||
kViewVga,
|
||||
kViewVga11,
|
||||
kViewAmiga
|
||||
};
|
||||
|
||||
} // End of namespace Sci
|
||||
|
||||
#endif
|
||||
|
|
|
@ -38,15 +38,6 @@
|
|||
|
||||
namespace Sci {
|
||||
|
||||
// window styles
|
||||
enum {
|
||||
SCI_WINDOWMGR_STYLE_TRANSPARENT = (1 << 0),
|
||||
SCI_WINDOWMGR_STYLE_NOFRAME = (1 << 1),
|
||||
SCI_WINDOWMGR_STYLE_TITLE = (1 << 2),
|
||||
SCI_WINDOWMGR_STYLE_TOPMOST = (1 << 3),
|
||||
SCI_WINDOWMGR_STYLE_USER = (1 << 7)
|
||||
};
|
||||
|
||||
GfxPorts::GfxPorts(SegManager *segMan, GfxScreen *screen)
|
||||
: _segMan(segMan), _screen(screen) {
|
||||
}
|
||||
|
|
|
@ -1,136 +1,148 @@
|
|||
/* 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.
|
||||
*
|
||||
/* 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$
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SCI_GRAPHICS_PORTS_H
|
||||
#define SCI_GRAPHICS_PORTS_H
|
||||
|
||||
#include "common/list.h"
|
||||
#include "common/array.h"
|
||||
|
||||
namespace Sci {
|
||||
|
||||
class SciGui;
|
||||
class GfxPaint16;
|
||||
class GfxScreen;
|
||||
class GfxText16;
|
||||
|
||||
#define PORTS_FIRSTWINDOWID 2
|
||||
#define PORTS_FIRSTSCRIPTWINDOWID 3
|
||||
|
||||
/**
|
||||
* Ports class, includes all port managment for SCI0->SCI1.1 games. Ports are some sort of windows in SCI
|
||||
* this class also handles adjusting coordinates to a specific port
|
||||
*/
|
||||
class GfxPorts {
|
||||
public:
|
||||
GfxPorts(SegManager *segMan, GfxScreen *screen);
|
||||
~GfxPorts();
|
||||
|
||||
void init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *text16);
|
||||
void reset();
|
||||
|
||||
void kernelSetActive(uint16 portId);
|
||||
Common::Rect kernelGetPicWindow(int16 &picTop, int16 &picLeft);
|
||||
void kernelSetPicWindow(Common::Rect rect, int16 picTop, int16 picLeft, bool initPriorityBandsFlag);
|
||||
reg_t kernelGetActive();
|
||||
reg_t kernelNewWindow(Common::Rect dims, Common::Rect restoreRect, uint16 style, int16 priority, int16 colorPen, int16 colorBack, const char *title);
|
||||
void kernelDisposeWindow(uint16 windowId, bool reanimate);
|
||||
|
||||
int16 isFrontWindow(Window *wnd);
|
||||
void beginUpdate(Window *wnd);
|
||||
void endUpdate(Window *wnd);
|
||||
Window *addWindow(const Common::Rect &dims, const Common::Rect *restoreRect, const char *title, uint16 style, int16 priority, bool draw);
|
||||
void drawWindow(Window *wnd);
|
||||
void removeWindow(Window *pWnd, bool reanimate);
|
||||
void freeWindow(Window *pWnd);
|
||||
void updateWindow(Window *wnd);
|
||||
|
||||
Port *getPortById(uint16 id);
|
||||
|
||||
Port *setPort(Port *newPort);
|
||||
Port *getPort();
|
||||
void setOrigin(int16 left, int16 top);
|
||||
void moveTo(int16 left, int16 top);
|
||||
void move(int16 left, int16 top);
|
||||
void openPort(Port *port);
|
||||
void penColor(int16 color);
|
||||
void backColor(int16 color);
|
||||
void penMode(int16 mode);
|
||||
void textGreyedOutput(bool state);
|
||||
int16 getPointSize();
|
||||
|
||||
void offsetRect(Common::Rect &r);
|
||||
void offsetLine(Common::Point &start, Common::Point &end);
|
||||
void clipLine(Common::Point &start, Common::Point &end);
|
||||
|
||||
void priorityBandsInit(int16 bandCount, int16 top, int16 bottom);
|
||||
void priorityBandsInit(byte *data);
|
||||
void priorityBandsInitSci11(byte *data);
|
||||
|
||||
void kernelInitPriorityBands();
|
||||
void kernelGraphAdjustPriority(int top, int bottom);
|
||||
byte kernelCoordinateToPriority(int16 y);
|
||||
int16 kernelPriorityToCoordinate(byte priority);
|
||||
|
||||
Port *_wmgrPort;
|
||||
Window *_picWind;
|
||||
|
||||
Port *_menuPort;
|
||||
Common::Rect _menuBarRect;
|
||||
Common::Rect _menuRect;
|
||||
Common::Rect _menuLine;
|
||||
Port *_curPort;
|
||||
|
||||
private:
|
||||
typedef Common::List<Port *> PortList;
|
||||
|
||||
SegManager *_segMan;
|
||||
GfxPaint16 *_paint16;
|
||||
GfxScreen *_screen;
|
||||
GfxText16 *_text16;
|
||||
|
||||
bool _usesOldGfxFunctions;
|
||||
|
||||
uint16 _styleUser;
|
||||
|
||||
// counts windows that got disposed but are not freed yet
|
||||
uint16 _freeCounter;
|
||||
|
||||
/** The list of open 'windows' (and ports), in visual order. */
|
||||
PortList _windowList;
|
||||
|
||||
/** The list of all open 'windows' (and ports), ordered by their id. */
|
||||
Common::Array<Port *> _windowsById;
|
||||
|
||||
Common::Rect _bounds;
|
||||
|
||||
// Priority Bands related variables
|
||||
int16 _priorityTop, _priorityBottom, _priorityBandCount;
|
||||
byte _priorityBands[200];
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SCI_GRAPHICS_PORTS_H
|
||||
#define SCI_GRAPHICS_PORTS_H
|
||||
|
||||
#include "common/serializer.h"
|
||||
#include "common/list.h"
|
||||
#include "common/array.h"
|
||||
|
||||
namespace Sci {
|
||||
|
||||
class SciGui;
|
||||
class GfxPaint16;
|
||||
class GfxScreen;
|
||||
class GfxText16;
|
||||
|
||||
#define PORTS_FIRSTWINDOWID 2
|
||||
#define PORTS_FIRSTSCRIPTWINDOWID 3
|
||||
|
||||
// window styles
|
||||
enum {
|
||||
SCI_WINDOWMGR_STYLE_TRANSPARENT = (1 << 0),
|
||||
SCI_WINDOWMGR_STYLE_NOFRAME = (1 << 1),
|
||||
SCI_WINDOWMGR_STYLE_TITLE = (1 << 2),
|
||||
SCI_WINDOWMGR_STYLE_TOPMOST = (1 << 3),
|
||||
SCI_WINDOWMGR_STYLE_USER = (1 << 7)
|
||||
};
|
||||
|
||||
} // End of namespace Sci
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Ports class, includes all port managment for SCI0->SCI1.1 games. Ports are some sort of windows in SCI
|
||||
* this class also handles adjusting coordinates to a specific port
|
||||
*/
|
||||
class GfxPorts : public Common::Serializable {
|
||||
public:
|
||||
GfxPorts(SegManager *segMan, GfxScreen *screen);
|
||||
~GfxPorts();
|
||||
|
||||
void init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *text16);
|
||||
void reset();
|
||||
|
||||
void kernelSetActive(uint16 portId);
|
||||
Common::Rect kernelGetPicWindow(int16 &picTop, int16 &picLeft);
|
||||
void kernelSetPicWindow(Common::Rect rect, int16 picTop, int16 picLeft, bool initPriorityBandsFlag);
|
||||
reg_t kernelGetActive();
|
||||
reg_t kernelNewWindow(Common::Rect dims, Common::Rect restoreRect, uint16 style, int16 priority, int16 colorPen, int16 colorBack, const char *title);
|
||||
void kernelDisposeWindow(uint16 windowId, bool reanimate);
|
||||
|
||||
int16 isFrontWindow(Window *wnd);
|
||||
void beginUpdate(Window *wnd);
|
||||
void endUpdate(Window *wnd);
|
||||
Window *addWindow(const Common::Rect &dims, const Common::Rect *restoreRect, const char *title, uint16 style, int16 priority, bool draw);
|
||||
void drawWindow(Window *wnd);
|
||||
void removeWindow(Window *pWnd, bool reanimate);
|
||||
void freeWindow(Window *pWnd);
|
||||
void updateWindow(Window *wnd);
|
||||
|
||||
Port *getPortById(uint16 id);
|
||||
|
||||
Port *setPort(Port *newPort);
|
||||
Port *getPort();
|
||||
void setOrigin(int16 left, int16 top);
|
||||
void moveTo(int16 left, int16 top);
|
||||
void move(int16 left, int16 top);
|
||||
void openPort(Port *port);
|
||||
void penColor(int16 color);
|
||||
void backColor(int16 color);
|
||||
void penMode(int16 mode);
|
||||
void textGreyedOutput(bool state);
|
||||
int16 getPointSize();
|
||||
|
||||
void offsetRect(Common::Rect &r);
|
||||
void offsetLine(Common::Point &start, Common::Point &end);
|
||||
void clipLine(Common::Point &start, Common::Point &end);
|
||||
|
||||
void priorityBandsInit(int16 bandCount, int16 top, int16 bottom);
|
||||
void priorityBandsInit(byte *data);
|
||||
void priorityBandsInitSci11(byte *data);
|
||||
|
||||
void kernelInitPriorityBands();
|
||||
void kernelGraphAdjustPriority(int top, int bottom);
|
||||
byte kernelCoordinateToPriority(int16 y);
|
||||
int16 kernelPriorityToCoordinate(byte priority);
|
||||
|
||||
Port *_wmgrPort;
|
||||
Window *_picWind;
|
||||
|
||||
Port *_menuPort;
|
||||
Common::Rect _menuBarRect;
|
||||
Common::Rect _menuRect;
|
||||
Common::Rect _menuLine;
|
||||
Port *_curPort;
|
||||
|
||||
virtual void saveLoadWithSerializer(Common::Serializer &ser);
|
||||
|
||||
private:
|
||||
typedef Common::List<Port *> PortList;
|
||||
|
||||
SegManager *_segMan;
|
||||
GfxPaint16 *_paint16;
|
||||
GfxScreen *_screen;
|
||||
GfxText16 *_text16;
|
||||
|
||||
bool _usesOldGfxFunctions;
|
||||
|
||||
uint16 _styleUser;
|
||||
|
||||
// counts windows that got disposed but are not freed yet
|
||||
uint16 _freeCounter;
|
||||
|
||||
/** The list of open 'windows' (and ports), in visual order. */
|
||||
PortList _windowList;
|
||||
|
||||
/** The list of all open 'windows' (and ports), ordered by their id. */
|
||||
Common::Array<Port *> _windowsById;
|
||||
|
||||
Common::Rect _bounds;
|
||||
|
||||
// Priority Bands related variables
|
||||
int16 _priorityTop, _priorityBottom, _priorityBandCount;
|
||||
byte _priorityBands[200];
|
||||
};
|
||||
|
||||
} // End of namespace Sci
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue