2013-08-24 01:47:12 -05: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 .
2014-02-18 02:34:27 +01:00
*
2013-08-24 01:47:12 -05: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 .
2014-02-18 02:34:27 +01:00
*
2013-08-24 01:47:12 -05: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 .
*
*/
2013-08-28 09:17:23 -05:00
# ifndef ZVISION_LEVER_CONTROL_H
# define ZVISION_LEVER_CONTROL_H
2013-08-24 01:47:12 -05:00
2013-11-01 00:58:43 -05:00
# include "zvision/scripting/control.h"
2013-08-24 01:47:12 -05:00
# include "common/list.h"
2013-08-26 14:06:46 -05:00
# include "common/rect.h"
2013-08-24 01:47:12 -05:00
namespace ZVision {
class ZorkAVIDecoder ;
2014-01-17 16:56:49 +07:00
class MetaAnimation ;
2013-08-24 01:47:12 -05:00
2013-08-26 14:06:46 -05:00
class LeverControl : public Control {
2013-08-24 01:47:12 -05:00
public :
LeverControl ( ZVision * engine , uint32 key , Common : : SeekableReadStream & stream ) ;
~ LeverControl ( ) ;
private :
struct Direction {
2013-09-22 15:02:58 -05:00
Direction ( uint a , uint t ) : angle ( a ) , toFrame ( t ) { }
2013-08-24 01:47:12 -05:00
uint angle ;
uint toFrame ;
} ;
struct FrameInfo {
Common : : Rect hotspot ;
Common : : List < Direction > directions ;
Common : : List < uint > returnRoute ;
} ;
enum {
2014-02-24 20:37:58 +07:00
ANGLE_DELTA = 30 , // How far off a mouse angle can be and still be considered valid. This is in both directions, so the total buffer zone is (2 * ANGLE_DELTA)
ANIMATION_FRAME_TIME = 30 // In millis
2013-08-24 01:47:12 -05:00
} ;
private :
2014-01-17 16:56:49 +07:00
MetaAnimation * _animation ;
2013-08-24 01:47:12 -05:00
Common : : String _cursorName ;
Common : : Rect _animationCoords ;
bool _mirrored ;
uint _frameCount ;
uint _startFrame ;
Common : : Point _hotspotDelta ;
FrameInfo * _frameInfo ;
uint _currentFrame ;
2013-08-28 09:14:32 -05:00
uint _lastRenderedFrame ;
2013-08-24 01:47:12 -05:00
bool _mouseIsCaptured ;
bool _isReturning ;
Common : : Point _lastMousePos ;
Common : : List < uint > : : iterator _returnRoutesCurrentProgress ;
2013-08-31 17:54:34 -05:00
uint _returnRoutesCurrentFrame ;
uint32 _accumulatedTime ;
2013-08-24 01:47:12 -05:00
public :
2013-11-15 18:10:27 +00:00
bool onMouseDown ( const Common : : Point & screenSpacePos , const Common : : Point & backgroundImageSpacePos ) ;
bool onMouseUp ( const Common : : Point & screenSpacePos , const Common : : Point & backgroundImageSpacePos ) ;
2013-08-26 14:06:46 -05:00
bool onMouseMove ( const Common : : Point & screenSpacePos , const Common : : Point & backgroundImageSpacePos ) ;
2013-08-24 01:47:12 -05:00
bool process ( uint32 deltaTimeInMillis ) ;
private :
void parseLevFile ( const Common : : String & fileName ) ;
/**
* Calculates the angle a vector makes with the negative y - axis
*
* 90
* pointTwo * ^
* \ |
* \ |
* \ |
* \ |
* angle ( \ | pointOne
* 180 < - - - - - - - - - - - * - - - - - - - - - - - > 0
* |
* |
* |
* |
* |
* ^
* 270
*
* @ param pointOne The origin of the vector
* @ param pointTwo The end of the vector
* @ return The angle the vector makes with the negative y - axis
*/
static int calculateVectorAngle ( const Common : : Point & pointOne , const Common : : Point & pointTwo ) ;
void renderFrame ( uint frameNumber ) ;
} ;
} // End of namespace ZVision
# endif