Files
2026-02-02 04:50:13 +01:00

588 lines
18 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 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/>.
*
*/
#ifndef BAGEL_BAGLIB_STORAGE_DEV_WIN_H
#define BAGEL_BAGLIB_STORAGE_DEV_WIN_H
#include "bagel/spacebar/boflib/gui/dialog.h"
#include "bagel/spacebar/boflib/list.h"
#include "bagel/spacebar/baglib/object.h"
#include "bagel/spacebar/baglib/save_game_file.h"
namespace Bagel {
namespace SpaceBar {
#define SDEV_UNDEF 00
#define SDEV_WND 11
#define SDEV_DLG 22
#define SDEV_BMP 33
#define SDEV_PDA 44
#define SDEV_WIELD 55
#define SDEV_CLOSEP 66
#define SDEV_GAMEWIN 77
#define SDEV_ZOOMPDA 88
/**
* CResource is an encapsulation of resources.
*/
class CResource {
private:
const char *_lpszResourceName;
uint32 _nResId;
public:
CResource() {
_lpszResourceName = nullptr;
_nResId = 0;
}
void setResource(const char *lpszResourceName) {
_lpszResourceName = lpszResourceName;
}
void setResource(uint32 nResId) {
_nResId = nResId;
}
const char *getResourceName() const {
return _lpszResourceName;
}
uint32 getResourceId() const {
return _nResId;
}
};
// Filter function function prototype.
typedef bool (*FilterFunction)(uint16 nFilterId, CBofBitmap *, CBofRect *);
/**
* CBagPanWindow is a window that contains a slide bitmap object. It has specialize
* functions for handling slide bitmaps and slide objects.
*/
class CBagStorageDev : public CBagParseObject {
public:
enum MouseActivity {
kMouseNONE = 0x0000, kMouseDRAGGING = 0x0001
};
private:
CBofString _sName; // Name of this storage device
CBofString _sBackgroundName; // Name of this storage devices background
CBofString _sPrevSDev; // Name of the previous storage device
CBofRect _cDestRect; // Position of storage device
CBofPoint _xPrevLocation; // Previous view location in bmp.
CBagObject *_pLActiveObject; // The last object selected on mouse down
// CBagObject *_pRActiveObject; // The last object selected on mouse down
CBofList<CBagObject *> *_pObjectList; // Objects to be painted to the pan
CBofList<CBagExpression *> *_pExpressionList; // Condition for painting to the pan
CBofWindow *_pAssociateWnd; // Sounds need a window
MouseActivity _nCurrMouseActivity; // What is up with the mouse currently
uint16 _nExitOnEdge; // Non zero if SDev should be closed when an outside edge is clicked on, and and prev sdev is set, _nExitOnEdge is the thickness of the edge
uint16 _nFilterId; // Filter id number 0 for normal view
uint16 _nFadeId; // Fade id number 0 for no fade in
uint16 _nDiskID;
protected:
uint16 _xSDevType; // Type of storage device
static CBofPoint *_xCursorLocation; // Current cursor location in bmp.
static CBofRect *gRepaintRect;
static bool _bHandledUpEvent; // Hack to stop
static bool _hidePdaFl;
FilterFunction _pBitmapFilter; // Pointer to the bitmap filter.
bool _bForeignList : true; // True if setObjectList has been called
bool _bCloseOnOpen : true; // True if other SDev should be closed when this is opened
bool _bCloseup : true; // true if is a closeup (includes CIC, or CHAT)
bool _bCIC : true; // true if is a CIC
bool _bCustom : true; // true if is a hand coded closeup
bool _bFirstPaint : true; // run object stuff
static bool _bPanPreFiltered; // Let pda know if screens been prefiltered
static bool _bDirtyAllObjects; // Dirty all objects in prefilter?
static bool _bPreFilter;
int _nFloatPages; // The number of pages required to display all floating objects
public:
CBagStorageDev();
virtual ~CBagStorageDev();
virtual ErrorCode preFilter(CBofBitmap *pBmp, CBofRect *pRect, CBofList<CBagObject *> *pList = nullptr);
static void initialize();
static void shutdown();
/**
* Make all the objects in a list dirty
*/
void makeListDirty(CBofList<CBagObject *> *pList);
void setDiskID(uint16 nDiskID) {
_nDiskID = nDiskID;
}
uint16 getDiskID() const {
return _nDiskID;
}
virtual ErrorCode setloadFilePos(const CBofPoint) {
return ERR_NONE;
}
bool isCloseup() const {
return _bCloseup;
}
void setCloseup(bool b = true) {
_bCloseup = b;
}
// Set true if sdef is "AS CIC"
bool isCIC();
void setCIC(bool b = true) {
_bCIC = b;
}
// Set to true if this is a hand coded closeup
bool isCustom() const {
return _bCustom;
}
void setCustom(bool b = true) {
_bCustom = b;
}
int getDeviceType() const {
return _xSDevType;
}
int getObjectCount();
CBagObject *getObjectByPos(int nIndex);
CBagObject *getObject(int nRefId, bool bActiveOnly = false);
CBagObject *getObject(const CBofPoint &xPoint, bool bActiveOnly = false);
CBagObject *getObject(const CBofString &sName, bool bActiveOnly = false);
CBagObject *getObjectByType(const CBofString &sType, bool bActiveOnly = false);
static CBofPoint &getLastCursorLocation() {
return *_xCursorLocation;
}
CBofList<CBagObject *> *getObjectList() const {
return _pObjectList;
}
void setObjectList(CBofList<CBagObject *> *pOList, CBofList<CBagExpression *> *pEList = nullptr);
bool contains(CBagObject *pObj, bool bActive = true);
// virtual CBofRect getLocation() { return CBofRect(); }
virtual CBofRect getRect() {
return _cDestRect;
}
virtual void setRect(const CBofRect &xRect) {
_cDestRect = xRect;
}
virtual CBofPoint getPosition() {
return _cDestRect.topLeft();
}
virtual void setPosition(const CBofPoint &pos);
virtual ErrorCode addObject(CBagObject *pObj, int nPos = 0); // Add a new object
virtual ErrorCode activateLocalObject(CBagObject *pObj);
virtual ErrorCode activateLocalObject(const CBofString &sName);
virtual ErrorCode attachActiveObjects();
virtual ErrorCode removeObject(CBagObject *pRObj);
virtual ErrorCode deactivateLocalObject(CBagObject *pObj);
virtual ErrorCode deactivateLocalObject(const CBofString &sName);
virtual ErrorCode detachActiveObjects();
virtual void setHelpFilename(const CBofString &) {
}
const CBofString &getName() const {
return _sName;
}
void setName(const CBofString &str) {
_sName = str;
}
void setFilterId(uint16 nId) {
_nFilterId = nId;
}
uint16 getFilterId() const {
return _nFilterId;
}
void setFadeId(uint16 nId) {
_nFadeId = nId;
}
uint16 getFadeId() const {
return _nFadeId;
}
const CBofString &getPrevSDev() const {
return _sPrevSDev;
}
const CBofPoint getPrevLoc() const {
return _xPrevLocation;
}
void setPrevSDev(const CBofString &str) {
_sPrevSDev = str;
}
bool getCloseOnOpen() const {
return _bCloseOnOpen;
}
void setCloseOnOpen(bool bVal) {
_bCloseOnOpen = bVal;
}
uint16 getExitOnEdge() const {
return _nExitOnEdge;
}
void setExitOnEdge(uint16 nVal) {
_nExitOnEdge = nVal;
}
CBagObject *getLActiveObject() const {
return _pLActiveObject;
}
// CBagObject* GetRActiveObject() { return _pRActiveObject; }
ErrorCode setLActiveObject(CBagObject *pObj) {
_pLActiveObject = pObj;
return ERR_NONE;
}
virtual ErrorCode onLActiveObject(uint32 /*nFlags*/, CBofPoint */*xPoint*/, void * = nullptr);
MouseActivity getLActivity() const {
return _nCurrMouseActivity;
}
void setLActivity(MouseActivity ma) {
_nCurrMouseActivity = ma;
}
ErrorCode paintStorageDevice(CBofWindow *pWnd, CBofBitmap *pBmp = nullptr, CBofRect * = nullptr);
// The associated window describes which window to get screen information from and
// where to paint objects and most importantly what info to send to the callbacks
virtual void setAssociateWnd(CBofWindow *pWnd) {
_pAssociateWnd = pWnd;
}
virtual CBofWindow *getAssociateWnd() {
return _pAssociateWnd;
}
ParseCodes setInfo(CBagIfstream &fpInput) override; // This function call the pure virt set background
virtual ErrorCode setBackground(CBofBitmap *pBmp) = 0; // This could be eliminated but is kept in to insure good class usage
virtual CBofBitmap *getBackground() = 0; // Think about it, you can figure this out
const CBofString &getBackgroundName() const {
return _sBackgroundName;
}
ErrorCode attach() override; // This function attaches the background and necessary bitmaps
ErrorCode detach() override; // This function attaches the background and necessary bitmaps
virtual ErrorCode close();
virtual ErrorCode loadObjects();
virtual ErrorCode releaseObjects();
virtual ErrorCode noObjectsUnderMouse();
virtual const CBofPoint devPtToViewPort(const CBofPoint &xPoint) {
return xPoint;
}
virtual const CBofPoint viewPortToDevPt(const CBofPoint &xPoint) {
return xPoint;
}
virtual ErrorCode loadFile(const CBofString &sWldName);
virtual ErrorCode loadFileFromStream(CBagIfstream &fpInput, const CBofString &sWldName, bool bAttach = true);
virtual void onMouseMove(uint32 /*nFlags*/, CBofPoint */*xPoint*/, void * = nullptr);
virtual ErrorCode onMouseOver(uint32 /*nFlags*/, CBofPoint */*xPoint*/, void * = nullptr);
virtual void onLButtonDown(uint32 /*nFlags*/, CBofPoint */*xPoint*/, void * = nullptr);
virtual void onLButtonUp(uint32 /*nFlags*/, CBofPoint */*xPoint*/, void * = nullptr);
virtual ErrorCode onCursorUpdate(int /*nCurrObj*/) {
return ERR_NONE;
}
virtual CBagObject *onNewSpriteObject(const CBofString &sInit);
virtual CBagObject *onNewBitmapObject(const CBofString &sInit);
virtual CBagObject *onNewTextObject(const CBofString &sInit);
virtual CBagObject *onNewLinkObject(const CBofString &sInit);
virtual CBagObject *onNewRPObject(const CBofString &sInit);
virtual CBagObject *onNewEDObject(const CBofString &sInit);
virtual CBagObject *onNewDosObject(const CBofString &sInit);
virtual CBagObject *onNewSoundObject(const CBofString &sInit);
virtual CBagObject *onNewButtonObject(const CBofString &sInit);
virtual CBagObject *onNewCharacterObject(const CBofString &sInit);
virtual CBagObject *onNewMovieObject(const CBofString &);
virtual CBagObject *onNewCommandObject(const CBofString &sInit);
virtual CBagObject *onNewAreaObject(const CBofString &sInit);
virtual CBagObject *onNewExpressionObject(const CBofString &sInit);
virtual CBagObject *onNewVariableObject(const CBofString &sInit);
virtual CBagObject *onNewUserObject(const CBofString &sInit);
virtual CBagObject *onNewThingObject(const CBofString &sInit);
// Call to arrange floating object, override to customize layout
virtual CBofPoint arrangeFloater(CBofPoint &nPos, CBagObject *pObj);
// Set and Get the number of pages required to display all floating objects
int getNumFloatPages() const {
return _nFloatPages;
}
void setNumFloatPages(int nFloatPages) {
_nFloatPages = nFloatPages;
}
// Correctly set the filter function for the storage device.
//
void onSetFilter(bool (*filterFunction)(uint16 nFilterId, CBofBitmap *, CBofRect *));
// Get a pointer to the filter function
//
FilterFunction getFilter();
// Predicate to test if this storage device is filtered.
//
bool isFiltered() const {
return _nFilterId != 0;
}
// Provide a method to get at the above vars
static void setDirtyAllObjects(bool b) {
_bDirtyAllObjects = b;
}
static bool getDirtyAllObjects() {
return _bDirtyAllObjects;
}
// Provide a method to let PDA know that it should update everything
static void setPreFiltered(bool b = true) {
_bPanPreFiltered = b;
}
static bool getPreFiltered() {
return _bPanPreFiltered;
}
// We won't always call the prefilter, just when explicitly instructed to.
static bool preFilterPan() {
return _bPreFilter;
}
static void setPreFilterPan(bool b = true) {
_bPreFilter = b;
_bDirtyAllObjects = b;
}
};
class CBagEventSDev;
//
// CBagStorageDevWnd -
// CBagPanWindow is a window that contains a slide bitmap object. It has specialize
// functions for handling slide bitmaps and slide objects.
//
class CBagStorageDevWnd : public CBofWindow, public CBagStorageDev {
private:
//bool _bMadeSelection;
bool _bOnUpdate;
CBofBitmap *_pWorkBmp;
CBofString _sHelpFileName; // Name of the help file for this device
public:
static CBagEventSDev *_pEvtSDev; // Pointer to the Event Storage Device
CBagStorageDevWnd();
virtual ~CBagStorageDevWnd();
static void initialize() {
_pEvtSDev = nullptr;
}
ErrorCode attach() override; // This function attaches the background and necessary bitmaps
ErrorCode detach() override; // This function attaches the background and necessary bitmaps
ErrorCode close() override;
virtual ErrorCode runModal(CBagObject *pObj);
void onTimer(uint32 nEventID) override;
void setOnUpdate(bool bVal = true) {
_bOnUpdate = bVal;
}
bool getOnUpdate() const {
return _bOnUpdate;
}
virtual ErrorCode paintScreen(CBofRect *pRect = nullptr);
virtual ErrorCode paintObjects(CBofList<CBagObject *> *list, CBofBitmap *pBmp,
CBofRect &viewOffsetRect, CBofList<CBofRect> * = nullptr, bool tempVar = true);
virtual CBofRect getLocation() {
return getWindowRect();
}
ErrorCode setBackground(CBofBitmap *pBmp) override;
CBofBitmap *getBackground() override {
return getBackdrop();
}
virtual CBofBitmap *getWorkBmp() {
return _pWorkBmp;
}
ErrorCode loadFile(const CBofString &sFile) override;
virtual const CBofString &getHelpFilename() {
return _sHelpFileName;
}
void setHelpFilename(const CBofString &s) override {
_sHelpFileName = s;
}
virtual ErrorCode onRender(CBofBitmap *pBmp, CBofRect *pRect = nullptr);
void onPaint(CBofRect *) override;
void onMainLoop() override;
void onClose() override;
void onMouseMove(uint32 nFlags, CBofPoint *, void * = nullptr) override;
void onLButtonDown(uint32 nFlags, CBofPoint *point, void * = nullptr) override;
void onLButtonUp(uint32 nFlags, CBofPoint *point, void * = nullptr) override;
void onKeyHit(uint32 lKey, uint32 nRepCount) override;
protected:
virtual ErrorCode setWorkBmp();
virtual ErrorCode killWorkBmp();
};
/**
* CBagStorageDevDlg is a window that contains a slide bitmap object.
* It has specialize functions for handling slide bitmaps and slide objects.
*/
class CBagStorageDevDlg : public CBofDialog, public CBagStorageDev {
private:
//bool _bMadeSelection;
CBofString _sHelpFileName; // Name of the help file for this device
public:
CBagStorageDevDlg();
virtual ErrorCode paintScreen(CBofRect *pRect = nullptr);
ErrorCode paintObjects(CBofList<CBagObject *> *list, CBofBitmap *pBmp,
CBofRect &viewOffsetRect, CBofList<CBofRect> * = nullptr, bool tempVar = true);
ErrorCode paintObjects(CBofList<CBagObject *> *list, CBofBitmap *pBmp) {
CBofRect emptyRect;
return paintObjects(list, pBmp, emptyRect);
}
virtual CBofRect getLocation() {
return getWindowRect();
}
ErrorCode setBackground(CBofBitmap *pBmp) override {
if (pBmp)
return setBackdrop(pBmp);
killBackdrop();
return ERR_NONE;
}
CBofBitmap *getBackground() override {
return getBackdrop();
}
ErrorCode loadFile(const CBofString &sFile) override;
ErrorCode create(const char *pszName, CBofRect *pRect, CBofWindow *pParent, uint32 nControlID = 0) override;
ErrorCode attach() override; // This function attaches the background and necessary bitmaps
ErrorCode close() override;
virtual const CBofString &getHelpFilename() {
return _sHelpFileName;
}
void setHelpFilename(const CBofString &s) override {
_sHelpFileName = s;
}
void onMainLoop() override;
virtual ErrorCode onRender(CBofBitmap *pBmp, CBofRect *pRect = nullptr);
void onPaint(CBofRect *) override;
void onClose() override;
void onMouseMove(uint32 nFlags, CBofPoint *, void * = nullptr) override;
void onLButtonDown(uint32 nFlags, CBofPoint *point, void * = nullptr) override;
void onLButtonUp(uint32 nFlags, CBofPoint *point, void * = nullptr) override;
};
/**
* Tracks all the storage devices
*/
class CBagStorageDevManager : public CBofObject {
private:
static int nSDevMngrs;
CBofList<CBagStorageDev *> _xStorageDeviceList;
public:
CBagStorageDevManager();
~CBagStorageDevManager();
ErrorCode registerStorageDev(CBagStorageDev *pSDev);
ErrorCode unregisterStorageDev(CBagStorageDev *pSDev);
ErrorCode releaseStorageDevices();
int getObjectValue(const CBofString &sObject, const CBofString &sProperty);
void setObjectValue(const CBofString &sObject, const CBofString &sProperty, int nValue);
int getNumStorageDevices() const {
return _xStorageDeviceList.getCount();
}
CBagStorageDev *getStorageDevice(int nIndex) {
return _xStorageDeviceList[nIndex];
}
CBagStorageDev *getStorageDeviceContaining(const CBofString &sName);
CBagStorageDev *getStorageDeviceContaining(CBagObject *pObj);
CBagStorageDev *getStorageDevice(const CBofString &sName);
bool moveObject(const CBofString &sDstName, const CBofString &sSrcName, const CBofString &sObjName);
bool addObject(const CBofString &sDstName, const CBofString &sObjName);
bool removeObject(const CBofString &sSrcName, const CBofString &sObjName);
void saveObjList(StObj *pObjList, int nNumEntries);
void restoreObjList(StObj *pObjList, int nNumEntries);
};
extern bool g_allowPaintFl;
extern CBagStorageDevWnd *g_lastWindow;
} // namespace SpaceBar
} // namespace Bagel
#endif