scummvm/engines/fullpipe/statics.h

265 lines
6.5 KiB
C
Raw Normal View History

2013-06-21 22:04:17 -04:00
/* 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.
*
2013-06-21 22:04:17 -04:00
* 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.
*
2013-06-21 22:04:17 -04:00
* 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.
*
*/
#ifndef FULLPIPE_STATICS_H
#define FULLPIPE_STATICS_H
#include "fullpipe/gfx.h"
2013-06-21 22:04:17 -04:00
namespace Fullpipe {
class ExCommand;
2013-09-18 19:21:51 +04:00
class StepArray : public CObject {
2013-06-21 22:04:17 -04:00
int _currPointIndex;
PointList _points;
bool _isEos;
public:
2013-09-18 19:21:51 +04:00
StepArray();
void clear();
int getCurrPointIndex() const { return _currPointIndex; }
int getPointsCount() const { return _points.size(); }
Common::Point getCurrPoint() const;
Common::Point getPoint(int index, int offset) const;
bool gotoNextPoint();
void insertPoints(const PointList &points);
2013-06-21 22:04:17 -04:00
};
class StaticPhase : public Picture {
public:
2013-06-21 22:04:17 -04:00
int16 _initialCountdown;
int16 _countdown;
int16 _field_68;
int16 _field_6A;
Common::ScopedPtr<ExCommand> _exCommand;
public:
StaticPhase();
virtual bool load(MfcArchive &file);
ExCommand *getExCommand() { return _exCommand.get(); }
2013-06-21 22:04:17 -04:00
};
class DynamicPhase : public StaticPhase {
public:
int _someX;
int _someY;
Common::Rect _rect;
2013-06-21 22:04:17 -04:00
int16 _field_7C;
int16 _field_7E;
int _dynFlags;
public:
DynamicPhase();
DynamicPhase(DynamicPhase *src, bool reverse);
virtual bool load(MfcArchive &file);
int getDynFlags() { return _dynFlags; }
2013-06-21 22:04:17 -04:00
};
class Statics : public DynamicPhase {
public:
2013-06-21 22:04:17 -04:00
int16 _staticsId;
Common::String _staticsName;
Picture _picture;
public:
Statics();
Statics(Statics *src, bool reverse);
virtual bool load(MfcArchive &file);
2014-05-02 12:40:06 +03:00
virtual void init();
Statics *getStaticsById(int itemId);
2013-07-26 00:14:47 +03:00
Common::Point getSomeXY() const;
Common::Point getCenter() const;
2013-06-21 22:04:17 -04:00
};
class StaticANIObject;
2013-06-21 22:04:17 -04:00
class Movement : public GameObject {
public:
Common::Point _somePoint;
2013-06-21 22:04:17 -04:00
int _lastFrameSpecialFlag;
int _flipFlag;
int _updateFlag1;
Statics *_staticsObj1;
Statics *_staticsObj2;
int _mx;
int _my;
int _m2x;
int _m2y;
int _field_50;
int _counterMax;
int _counter;
/** a confusing mix of owned and unowned items */
Common::Array<DynamicPhase *> _dynamicPhases;
2013-06-21 22:04:17 -04:00
int _field_78;
PointList _framePosOffsets;
Movement *_currMovement;
2013-06-21 22:04:17 -04:00
int _field_84;
DynamicPhase *_currDynamicPhase;
int _field_8C;
int _currDynamicPhaseIndex;
int _field_94;
public:
Movement();
2014-01-08 18:48:34 +02:00
virtual ~Movement();
Movement(Movement *src, StaticANIObject *ani);
Movement(Movement *src, int *flag1, int flag2, StaticANIObject *ani);
virtual bool load(MfcArchive &file);
bool load(MfcArchive &file, StaticANIObject *ani);
Common::Point getCurrDynamicPhaseXY() const;
Common::Point getCenter() const;
Dims getDimensionsOfPhase(int phaseIndex) const;
Common::Point calcSomeXY(int idx, int dynidx);
void initStatics(StaticANIObject *ani);
void updateCurrDynamicPhase();
void setAlpha(int alpha);
void setDynamicPhaseIndex(int index);
DynamicPhase *getDynamicPhaseByIndex(int idx);
int calcDuration();
int countPhasesWithFlag(int maxidx, int flag);
void removeFirstPhase();
bool gotoNextFrame(void (*_callback1)(int, Common::Point *point, int, int), void (*callback2)(int *));
bool gotoPrevFrame();
void gotoFirstFrame();
void gotoLastFrame();
void loadPixelData();
void freePixelData();
2013-07-26 00:14:47 +03:00
void draw(bool flipFlag, int angle);
2013-06-21 22:04:17 -04:00
};
class StaticANIObject : public GameObject {
public:
2013-07-26 00:14:47 +03:00
Movement *_movement;
Statics *_statics;
2013-06-21 22:04:17 -04:00
int _shadowsOn;
int16 _field_30;
int16 _field_32;
int _field_34;
int _initialCounter;
void (*_callback1)(int, Common::Point *point, int, int);
void (*_callback2)(int *);
/** items in list are owned */
Common::Array<Movement *> _movements;
/** items in list are owned */
Common::Array<Statics *> _staticsList;
2013-09-18 19:21:51 +04:00
StepArray _stepArray;
2013-06-21 22:04:17 -04:00
int16 _field_96;
int _messageQueueId;
int _messageNum;
int _animExFlag;
int _counter;
int _someDynamicPhaseIndex;
2014-01-08 18:48:34 +02:00
public:
2013-06-21 22:04:17 -04:00
int16 _sceneId;
2014-01-08 18:48:34 +02:00
public:
StaticANIObject();
2014-01-08 18:48:34 +02:00
virtual ~StaticANIObject();
StaticANIObject(StaticANIObject *src);
virtual bool load(MfcArchive &file);
void setOXY(int x, int y);
Statics *getStaticsById(int id);
Statics *getStaticsByName(const Common::String &name);
Movement *getMovementById(int id);
int getMovementIdById(int itemId) const;
Movement *getMovementByName(const Common::String &name);
Common::Point getCurrDimensions() const;
Common::Point getSomeXY() const;
void clearFlags();
void setFlags40(bool state);
bool isIdle();
void setAlpha(int alpha);
void deleteFromGlobalMessageQueue();
bool queueMessageQueue(MessageQueue *msg);
void restartMessageQueue(MessageQueue *msg);
MessageQueue *getMessageQueue();
bool trySetMessageQueue(int msgNum, int qId);
2014-01-05 01:06:42 +02:00
void startMQIfIdle(int qId, int flag);
void initMovements();
void loadMovementsPixelData();
2014-03-02 21:02:23 +02:00
void freeMovementsPixelData();
2014-01-10 21:25:56 +02:00
void preloadMovements(MovTable *mt);
void setSomeDynamicPhaseIndex(int val) { _someDynamicPhaseIndex = val; }
void adjustSomeXY();
bool startAnim(int movementId, int messageQueueId, int dynPhaseIdx);
bool startAnimEx(int movid, int parId, int flag1, int flag2);
void startAnimSteps(int movementId, int messageQueueId, int x, int y, const PointList &points, int someDynamicPhaseIndex);
void hide();
void show1(int x, int y, int movementId, int mqId);
void show2(int x, int y, int movementId, int mqId);
void playIdle();
void update(int counterdiff);
Statics *addReverseStatics(Statics *ani);
2013-07-12 22:35:51 +03:00
void draw();
void draw2();
2013-07-28 14:54:25 +03:00
/** ownership of returned object is transferred to caller */
2013-07-28 14:54:25 +03:00
MovTable *countMovements();
Common::Point *calcStepLen(Common::Point *p);
2013-07-28 14:54:25 +03:00
void setSpeed(int speed);
void updateStepPos();
void stopAnim_maybe();
Common::Point *calcNextStep(Common::Point *point);
MessageQueue *changeStatics1(int msgNum);
void changeStatics2(int objId);
2013-08-28 10:50:03 +03:00
bool getPixelAtPos(int x, int y, uint32 *pixel, bool hitOnly = false);
bool isPixelHitAtPos(int x, int y);
2013-07-28 14:54:25 +03:00
};
2013-06-21 22:04:17 -04:00
} // End of namespace Fullpipe
#endif /* FULLPIPE_STATICS_H */