diff options
Diffstat (limited to 'engines/mads/player.h')
-rw-r--r-- | engines/mads/player.h | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/engines/mads/player.h b/engines/mads/player.h new file mode 100644 index 0000000000..671ac9d16e --- /dev/null +++ b/engines/mads/player.h @@ -0,0 +1,228 @@ +/* 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. + * + */ + +#ifndef MADS_PLAYER_H +#define MADS_PLAYER_H + +#include "common/scummsys.h" +#include "common/str.h" +#include "common/serializer.h" + +namespace MADS { + +class MADSEngine; +class MADSAction; + +#define PLAYER_SPRITES_FILE_COUNT 8 +#define MAX_ROUTE_NODES 22 + +/** + * Player facings + */ +enum Facing { + FACING_NORTH = 8, FACING_SOUTH = 2, FACING_EAST = 6, FACING_WEST = 4, + FACING_NORTHEAST = 9, FACING_SOUTHEAST = 3, + FACING_SOUTHWEST = 1, FACING_NORTHWEST = 7, + FACING_NONE = 5, FACING_DUMMY = 0 +}; + +class Player { +private: + static const int _directionListIndexes[32]; +private: + MADSEngine *_vm; + bool _highSprites; + bool _spriteSetsPresent[PLAYER_SPRITES_FILE_COUNT]; + bool _mirror; + int _frameCount; + int _frameListIndex; + int _distAccum; + int _pixelAccum; + int _deltaDistance; + int _stopWalkerList[12]; + int _stopWalkerTrigger[12]; + int _totalDistance; + + void clearStopList(); + + /** + * If the player is moving, handles figuring out the correct motion + */ + void move(); + + /** + * Update the player's frame number + */ + void setFrame(); + + /** + * Get the sprite slot index for the player + */ + int getSpriteSlot(); + + /** + * Get the scale for the player at the given Y position + */ + int getScale(int yp); + + /** + * Sets the frame rate for the current sprite set + */ + void setBaseFrameRate(); + + /** + * Starts a player moving to a given destination + */ + void startMovement(); + + void changeFacing(); +public: + MADSAction *_action; + + Facing _facing; + Facing _turnToFacing; + Facing _prepareWalkFacing; + int _xDirection, _yDirection; + Facing _targetFacing; + bool _spritesLoaded; + int _spritesStart; + int _spritesIdx; + int _numSprites; + bool _stepEnabled; + bool _spritesChanged; + bool _visible; + bool _priorVisible; + bool _beenVisible; + bool _walkAnywhere; + int _frameNumber; + bool _loadsFirst; + bool _loadedFirst; + Common::Point _playerPos; + Common::Point _targetPos; + Common::Point _posChange; + Common::Point _posDiff; + Common::Point _prepareWalkPos; + bool _moving; + int _walkOffScreen, _walkOffScreenSceneId; + int _special; + int _ticksAmount; + uint32 _priorTimer; + int _velocity; + int _upcomingTrigger; + int _trigger; + bool _scalingVelocity; + bool _forceRefresh; + bool _needToWalk; + bool _readyToWalk; + int _stopWalkerIndex; + int _centerOfGravity; + int _currentDepth; + int _currentScale; + Common::String _spritesPrefix; +public: + Player(MADSEngine *vm); + + /** + * Load sprites for the player + */ + bool loadSprites(const Common::String &prefix); + + /** + * Called when the player has reached the given destination, start him + * turning to the specified facing + */ + void setFinalFacing(); + + /** + * Stops the player walking + */ + void cancelWalk(); + + /** + * Cancels any oustanding player action + */ + void cancelCommand(); + + /** + * Set up control parameters for the current active series (the + * direction which the player is facing in) */ + void selectSeries(); + + /* + * Moves to the next frame for the currently active player sprite set + */ + void updateFrame(); + + void update(); + + /** + * Handler method for when the player is not moving + */ + void idle(); + + /** + * Starts the player walking towards a given point and direction facing + * @param pos Destination location + * @param facing Direction to face once the destination is reached + */ + void startWalking(const Common::Point &pt, Facing facing); + + /** + * Used by the game scripst to make the player walk to a given destination. + * The difference from startWalking is that this contains several extra + * layers of checking that startWalking bypasses. + */ + void walk(const Common::Point &pos, Facing facing); + + /** + * If a new walk sequence is pending, and has been okayed by the preparser, + * start the actual walking + */ + void newWalk(); + + void nextFrame(); + + /** + * Add a walker to the current queue + */ + void addWalker(int walker, int trigger); + + /** + * Delete any sprites used by the player + */ + void releasePlayerSprites(); + + /** + * Serialize the data of the player + */ + void synchronize(Common::Serializer &s); + + static void preloadSequences(const Common::String &prefix, int level) { + // No implementation in ScummVM + } + + void removePlayerSprites(); +}; + +} // End of namespace MADS + +#endif /* MADS_PLAYER_H */ |