mirror of
https://github.com/scummvm/scummvm.git
synced 2025-04-02 10:52:32 -04:00
363 lines
9.4 KiB
C++
363 lines
9.4 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_OBJECT_H
|
|
#define BAGEL_BAGLIB_OBJECT_H
|
|
|
|
#include "bagel/baglib/expression.h"
|
|
#include "bagel/baglib/res.h"
|
|
#include "bagel/boflib/gfx/bitmap.h"
|
|
#include "bagel/boflib/string.h"
|
|
#include "bagel/baglib/parse_object.h"
|
|
|
|
namespace Bagel {
|
|
|
|
class CBagObject;
|
|
typedef void *(*BagFuncPtr)(int, void *);
|
|
|
|
enum BagObjectType {
|
|
BASE_OBJ = 0x0000,
|
|
BMP_OBJ = BOF_BMP_OBJ,
|
|
SPRITE_OBJ = BOF_SPRITE_OBJ,
|
|
BUTTON_OBJ = BOF_BUTTON_OBJ,
|
|
SOUND_OBJ = BOF_SOUND_OBJ,
|
|
LINK_OBJ = BOF_LINK_OBJ,
|
|
TEXT_OBJ = BOF_TEXT_OBJ,
|
|
CHAR_OBJ = BOF_CHAR_OBJ,
|
|
VAR_OBJ = BOF_VAR_OBJ,
|
|
AREA_OBJ = BOF_AREA_OBJ,
|
|
EXPRESS_OBJ = BOF_EXPRESS_OBJ,
|
|
COMMAND_OBJ = BOF_COMM_OBJ,
|
|
MOVIE_OBJ = BOF_MOVIE_OBJ,
|
|
THING_OBJ = BOF_THING_OBJ,
|
|
RESPRNT_OBJ = BOF_RESPRNT_OBJ,
|
|
DOSSIER_OBJ = BOF_DOSSIER_OBJ,
|
|
USER_OBJ = 0x1000
|
|
};
|
|
|
|
enum BAG_OBJECT_PROPERTIES {
|
|
NONE = 0x0000,
|
|
MOVABLE = 0x0001,
|
|
MODAL = 0x0002,
|
|
VISIBLE = 0x0004,
|
|
HIGHLIGHT = 0x0008,
|
|
ACTIVE = 0x0010,
|
|
TRANSPAR = 0x0020,
|
|
HIDEONCLK = 0x0040,
|
|
IMRUN = 0x0080,
|
|
LOCAL = 0x0100,
|
|
NEGATIVE = 0x0200,
|
|
CONUPDATE = 0x0400,
|
|
STRETCH = 0x0800,
|
|
TIMELESS = 0x1000,
|
|
FLOATING = 0x2000,
|
|
PRELOAD = 0x4000,
|
|
FOREGROUND = 0x8000
|
|
};
|
|
|
|
class CBagMenu;
|
|
class CBagStorageDev;
|
|
|
|
CBofString getStringTypeOfObject(BagObjectType n);
|
|
|
|
/**
|
|
* CBofBagObject is an object that can be place within the slide window.
|
|
*/
|
|
class CBagObject : public CBagParseObject, public CBofObject, public CBofError {
|
|
private:
|
|
CBofString _sFileName; // File name contain object look/feel data
|
|
CBofString *_psName = nullptr; // Name of this object, needed by movable objects only, it equals file name unless specified.
|
|
CBagMenu *_pMenu = nullptr; // Menu for the object
|
|
CBagExpression *_pEvalExpr = nullptr; // Pointer to expression to be evaluated by
|
|
CBofString _emptyString;
|
|
|
|
int16 _nState = 0; // Current state of the object
|
|
uint16 _nId = 0; // Ref Id for an object
|
|
|
|
protected:
|
|
uint16 _xObjType = AREA_OBJ;
|
|
|
|
private:
|
|
uint16 _nProperties = 0; // Properties of object
|
|
|
|
int16 _nX = 0; // Replaces _xPosition
|
|
int16 _nY = 0;
|
|
|
|
byte _nOverCursor = 0; // Ref Id for the objects over cursor
|
|
byte _bDirty : 1; // Object needs redrawing or not?
|
|
byte _bMsgWaiting : 1; // Event needing to be played?
|
|
byte _bAlwaysUpdate : 1; // For message light
|
|
byte _bNoMenu : 1; // Used by AS NOMENU
|
|
|
|
protected:
|
|
byte _bInteractive = 0;
|
|
|
|
// Object property functionality
|
|
bool isProperty(BAG_OBJECT_PROPERTIES xProp) {
|
|
return _nProperties & xProp;
|
|
}
|
|
|
|
void setProperty(BAG_OBJECT_PROPERTIES xProp, bool bVal);
|
|
|
|
public:
|
|
CBagObject();
|
|
virtual ~CBagObject();
|
|
|
|
bool isInteractive() {
|
|
return _bInteractive;
|
|
}
|
|
void setInteractive(bool b) {
|
|
_bInteractive = (byte)b;
|
|
}
|
|
|
|
// Callback function functionality - probably can be phased out
|
|
virtual bool runCallBack() {
|
|
return false;
|
|
}
|
|
|
|
virtual BagFuncPtr getCallBack() {
|
|
return nullptr;
|
|
}
|
|
|
|
// Run Object is called when there is no callback and the item was selected
|
|
virtual bool runObject();
|
|
|
|
void setExpression(CBagExpression *pExpr) {
|
|
_pEvalExpr = pExpr;
|
|
}
|
|
CBagExpression *getExpression() const {
|
|
return _pEvalExpr;
|
|
}
|
|
|
|
// Return true if the Object had members that are properly initialized/de-initialized
|
|
ErrorCode attach() override;
|
|
ErrorCode detach() override;
|
|
|
|
BagObjectType getType() {
|
|
return (BagObjectType)_xObjType;
|
|
}
|
|
void setType(BagObjectType nType) {
|
|
_xObjType = (uint16)nType;
|
|
}
|
|
|
|
// Object can be moved within a screen
|
|
virtual bool isInside(const CBofPoint &xPoint) {
|
|
return getRect().ptInRect(xPoint);
|
|
}
|
|
|
|
// Object can be moved within a screen
|
|
bool isMovable() {
|
|
return isProperty(MOVABLE);
|
|
}
|
|
void setMovable(bool b = true) {
|
|
setProperty(MOVABLE, b);
|
|
}
|
|
// Object can be stretched within a screen
|
|
bool isStretchable() {
|
|
return isProperty(STRETCH);
|
|
}
|
|
void setStretchable(bool b = true) {
|
|
setProperty(STRETCH, b);
|
|
}
|
|
// Object has exclusive updates to a screen
|
|
bool isModal() {
|
|
return isProperty(MODAL);
|
|
}
|
|
void setModal(bool b = true) {
|
|
setProperty(MODAL, b);
|
|
}
|
|
virtual bool isModalDone() {
|
|
return true;
|
|
}
|
|
// Is object visible within scene
|
|
bool isVisible() {
|
|
return isProperty(VISIBLE);
|
|
}
|
|
void setVisible(bool b = true) {
|
|
setProperty(VISIBLE, b);
|
|
}
|
|
// Should object be highlighted when the mouse is over
|
|
bool isHighlight() {
|
|
return isProperty(HIGHLIGHT);
|
|
}
|
|
void setHighlight(bool b = true) {
|
|
setProperty(HIGHLIGHT, b);
|
|
}
|
|
// Is the object active in this world
|
|
bool isActive() {
|
|
return isProperty(ACTIVE);
|
|
}
|
|
void setActive(bool b = true) {
|
|
setProperty(ACTIVE, b);
|
|
}
|
|
// Is the object has a transparent background
|
|
bool isTransparent() {
|
|
return isProperty(TRANSPAR);
|
|
}
|
|
|
|
virtual void setTransparent(bool b = true) {
|
|
setProperty(TRANSPAR, b);
|
|
}
|
|
// Should the object be hidden when clicked on
|
|
bool isHideOnClick() {
|
|
return isProperty(HIDEONCLK);
|
|
}
|
|
void setHideOnClick(bool b = true) {
|
|
setProperty(HIDEONCLK, b);
|
|
}
|
|
// Should the object run and then be destroyed after the attach
|
|
bool isImmediateRun() {
|
|
return isProperty(IMRUN);
|
|
}
|
|
void setImmediateRun(bool b = true) {
|
|
setProperty(IMRUN, b);
|
|
}
|
|
// Is the object currently local to the object
|
|
bool isLocal() {
|
|
return isProperty(LOCAL);
|
|
}
|
|
void setLocal(bool b = true) {
|
|
setProperty(LOCAL, b);
|
|
}
|
|
// Is the object expression negative
|
|
bool isNegative() {
|
|
return isProperty(NEGATIVE);
|
|
}
|
|
void setNegative(bool b = true) {
|
|
setProperty(NEGATIVE, b);
|
|
}
|
|
// Should the object be constantly updated, even when not on screen
|
|
bool isConstantUpdate() {
|
|
return isProperty(CONUPDATE);
|
|
}
|
|
void setConstantUpdate(bool b = true) {
|
|
setProperty(CONUPDATE, b);
|
|
}
|
|
// Does this objects action take up time
|
|
bool isTimeless() {
|
|
return isProperty(TIMELESS);
|
|
}
|
|
|
|
void setTimeless(bool b = true);
|
|
// Does this objects have a set position/or should the sdev provide one when it is attached
|
|
bool isFloating() {
|
|
return isProperty(FLOATING);
|
|
}
|
|
void setFloating(bool b = true) {
|
|
setProperty(FLOATING, b);
|
|
}
|
|
// Does this objects have a set position/or should the sdev provide one when it is attached
|
|
bool isPreload() {
|
|
return isProperty(PRELOAD);
|
|
}
|
|
void setPreload(bool b = true) {
|
|
setProperty(PRELOAD, b);
|
|
}
|
|
// Does this objects have a set position/or should the sdev provide one when it is attached
|
|
bool isForeGround();
|
|
void setForeGround(bool b = true);
|
|
int getProperties();
|
|
void setProperties(int nProperties);
|
|
|
|
// Init variables
|
|
virtual const CBofString *getInitInfo() const;
|
|
virtual void setInitInfo(const CBofString &) {}
|
|
virtual int getProperty(const CBofString &sProp);
|
|
virtual void setProperty(const CBofString &, int nVal);
|
|
|
|
bool isDirty() {
|
|
return _bDirty != 0;
|
|
}
|
|
|
|
void setDirty(bool b = true) {
|
|
_bDirty = (byte)b;
|
|
}
|
|
|
|
// If this thing is getting purged but is awaiting playback, then mark it as such.
|
|
bool isMsgWaiting() {
|
|
return _bMsgWaiting != 0;
|
|
}
|
|
|
|
void setMsgWaiting(bool b = true) {
|
|
_bMsgWaiting = (byte)b;
|
|
}
|
|
|
|
bool isAlwaysUpdate() {
|
|
return _bAlwaysUpdate != 0;
|
|
}
|
|
|
|
void setAlwaysUpdate(bool b = true) {
|
|
_bAlwaysUpdate = (byte)b;
|
|
}
|
|
|
|
bool isNoMenu() {
|
|
return _bNoMenu;
|
|
}
|
|
|
|
void setNoMenu(bool b = true) {
|
|
_bNoMenu = (byte)b;
|
|
}
|
|
|
|
virtual CBofPoint getPosition();
|
|
virtual int getRefId();
|
|
virtual int getOverCursor();
|
|
virtual int getState();
|
|
virtual CBofRect getRect();
|
|
virtual const CBofString &getFileName();
|
|
CBagMenu *getMenuPtr();
|
|
virtual const CBofString &getRefName();
|
|
virtual void setRefName(const CBofString &s);
|
|
virtual void setFileName(const CBofString &s);
|
|
virtual void setSize(const CBofSize &) {}
|
|
virtual void setRefId(int id);
|
|
virtual void setOverCursor(int curs);
|
|
virtual void setState(int state);
|
|
virtual void setMenuPtr(CBagMenu *pm);
|
|
virtual void setPosition(const CBofPoint &pos);
|
|
|
|
/**
|
|
* Takes in info and then removes the relative information and returns
|
|
* UNKNOWN_TOKEN if nothing has changed
|
|
* UPDATED_OBJECT if something has changed
|
|
* PARSING_DONE if done processing
|
|
*/
|
|
ParseCodes setInfo(CBagIfstream &istr) override;
|
|
|
|
virtual ErrorCode update(CBofBitmap *pBmp, CBofPoint pt, CBofRect *pSrcRect = nullptr, int /*nMaskColor*/ = -1);
|
|
virtual bool onObjInteraction(CBagObject * /*pObj*/, CBagStorageDev * /*pSDev*/);
|
|
virtual void onLButtonDown(uint32 /*nFlags*/, CBofPoint * /*xPoint*/, void * = nullptr) {}
|
|
virtual void onLButtonUp(uint32 /*nFlags*/, CBofPoint * /*xPoint*/, void * = nullptr); // run menu if available
|
|
virtual bool onMouseMove(uint32 /*nFlags*/, CBofPoint /*xPoint*/, void * = nullptr);
|
|
virtual bool onMouseOver(uint32 /*nFlags*/, CBofPoint /*xPoint*/, void * = nullptr);
|
|
};
|
|
|
|
inline void CBagObject::setFileName(const CBofString &s) {
|
|
_sFileName = s;
|
|
}
|
|
|
|
inline void CBagObject::setMenuPtr(CBagMenu *pm) {
|
|
_pMenu = pm;
|
|
}
|
|
|
|
} // namespace Bagel
|
|
|
|
#endif
|