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

250 lines
5.0 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 SHERLOCK_SCALPEL_TSAGE_LOGO_H
#define SHERLOCK_SCALPEL_TSAGE_LOGO_H
#include "common/scummsys.h"
#include "common/array.h"
#include "common/file.h"
#include "common/list.h"
#include "common/str.h"
#include "common/str-array.h"
#include "common/util.h"
#include "graphics/surface.h"
#include "sherlock/scalpel/tsage/resources.h"
#include "sherlock/screen.h"
namespace Sherlock {
namespace Scalpel {
class ScalpelEngine;
namespace TsAGE {
class ObjectSurface : public Surface {
public:
Common::Point _centroid;
public:
ObjectSurface() : Surface() {}
~ObjectSurface() override {}
};
class Visage {
private:
Common::SeekableReadStream *_stream;
/**
* Translates a raw image resource into a graphics surface
*/
void surfaceFromRes(ObjectSurface &s);
public:
static TLib *_tLib;
int _resNum;
int _rlbNum;
public:
Visage();
~Visage();
/**
* Set the visage number
*/
void setVisage(int resNum, int rlbNum = 9999);
/**
* Clear the visage
*/
void clear();
/**
* Get a frame from the visage
*/
void getFrame(ObjectSurface &s, int frameNum);
/**
* Return the number of frames
*/
int getFrameCount() const;
/**
* Returns whether the visage is loaded
*/
bool isLoaded() const;
};
class Object {
private:
Visage _visage;
uint32 _updateStartFrame;
bool _isAnimating;
bool _finished;
uint32 _walkStartFrame;
int _angle;
int _changeCtr;
int _majorDiff, _minorDiff;
Common::Point _moveDelta;
Common::Point _moveSign;
/**
* Return the next frame when the object is animating
*/
int changeFrame();
/**
* Gets the next frame in the sequence
*/
int getNewFrame();
/**
* Calculate the angle between the current position and a designated destination
*/
void calculateMoveAngle();
/**
* Handle any object movement
*/
void move();
/**
* Returns whether not to make any movement
*/
bool dontMove() const;
/**
* Ends any current movement
*/
void endMove();
public:
static ScalpelEngine *_vm;
Common::Point _position;
Common::Point _destination;
Common::Rect _oldBounds;
int _frame;
int _numFrames;
int _frameChange;
public:
Object();
/**
* Load the data for the object
*/
void setVisage(int visage, int strip);
/**
* Sets whether the object is animating
*/
void setAnimMode(bool isAnimating);
/**
* Starts an object moving to a given destination
*/
void setDestination(const Common::Point &pt);
/**
* Returns true if an animation is ended
*/
bool isAnimEnded() const;
/**
* Return true if object is moving
*/
bool isMoving() const;
/**
* Erase the area the object was previously drawn at, by restoring the background
*/
void erase();
/**
* Update the frame
*/
void update();
/**
* Remove an object from being displayed
*/
void remove() { _visage.clear(); }
};
struct AnimationFrame {
int frame;
int x;
int y;
};
class Logo {
private:
ScalpelEngine *_vm;
TLib _lib;
int _counter, _frameCounter;
bool _finished;
byte _originalPalette[Graphics::PALETTE_SIZE];
byte _palette1[Graphics::PALETTE_SIZE];
byte _palette2[Graphics::PALETTE_SIZE];
byte _palette3[Graphics::PALETTE_SIZE];
Object _objects[4];
uint _waitFrames;
uint32 _waitStartFrame;
int _animateObject;
uint32 _animateStartFrame;
uint _animateFrameDelay;
const AnimationFrame *_animateFrames;
uint _animateFrame;
Logo(ScalpelEngine *vm);
~Logo();
void nextFrame();
bool finished() const;
/**
* Wait for a number of frames. Note that the frame count in _events is
* not the same as the number of calls to nextFrame().
*/
void waitFrames(uint frames);
/**
* Start an animation sequence. Used for sequences that are described
* one frame at a time because they do unusual things, or run at
* unusual rates.
*/
void startAnimation(uint object, uint frameDelay, const AnimationFrame *frames);
/**
* Load the background for the scene
*/
void loadBackground();
/**
* Fade from the current palette to a new one
*/
void fade(const byte palette[Graphics::PALETTE_SIZE], int step = 6);
public:
static bool show(ScalpelEngine *vm);
};
} // end of namespace TsAGE
} // end of namespace Scalpel
} // end of namespace Sherlock
#endif