mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-23 02:11:38 +00:00
58dc309969
ScummVM's "Rect" data type in the mouse list. The benefit of this is that we can then use the contains() function in checkMouseList(), which makes the code a bit less eye-watering. svn-id: r16961
240 lines
5.5 KiB
C++
240 lines
5.5 KiB
C++
/* Copyright (C) 1994-1998 Revolution Software Ltd.
|
|
* Copyright (C) 2003-2005 The ScummVM project
|
|
*
|
|
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*
|
|
* $Header$
|
|
*/
|
|
|
|
#ifndef MOUSE_H
|
|
#define MOUSE_H
|
|
|
|
#define TOTAL_mouse_list 50
|
|
|
|
namespace Sword2 {
|
|
|
|
struct ObjectMouse;
|
|
struct BuildUnit;
|
|
|
|
// Menubar defines.
|
|
|
|
#define RDMENU_TOP 0
|
|
#define RDMENU_BOTTOM 1
|
|
|
|
enum {
|
|
MOUSE_normal = 0, // normal in game
|
|
MOUSE_menu = 1, // menu chooser
|
|
MOUSE_drag = 2, // dragging luggage
|
|
MOUSE_system_menu = 3, // system menu chooser
|
|
MOUSE_holding = 4 // special
|
|
};
|
|
|
|
enum {
|
|
RDMOUSE_NOFLASH,
|
|
RDMOUSE_FLASH
|
|
};
|
|
|
|
enum {
|
|
RDMENU_HIDDEN,
|
|
RDMENU_SHOWN,
|
|
RDMENU_OPENING,
|
|
RDMENU_CLOSING,
|
|
RDMENU_ALMOST_HIDDEN
|
|
};
|
|
|
|
#define RDMENU_ICONWIDE 35
|
|
#define RDMENU_ICONDEEP 30
|
|
#define RDMENU_ICONSTART 24
|
|
#define RDMENU_ICONSPACING 5
|
|
#define RDMENU_MAXPOCKETS 15
|
|
|
|
#if !defined(__GNUC__)
|
|
#pragma START_PACK_STRUCTS
|
|
#endif
|
|
|
|
struct MouseAnim {
|
|
uint8 runTimeComp; // type of runtime compression used for the
|
|
// frame data
|
|
uint8 noAnimFrames; // number of frames in the anim
|
|
int8 xHotSpot;
|
|
int8 yHotSpot;
|
|
uint8 mousew;
|
|
uint8 mouseh;
|
|
} GCC_PACK;
|
|
|
|
#if !defined(__GNUC__)
|
|
#pragma END_PACK_STRUCTS
|
|
#endif
|
|
|
|
// The MOUSE_holding mode is entered when the conversation menu is closed, and
|
|
// exited when the mouse cursor moves off that menu area. I don't know why yet.
|
|
|
|
// mouse unit - like ObjectMouse, but with anim resource & pc (needed if
|
|
// sprite is to act as mouse detection mask)
|
|
|
|
struct MouseUnit {
|
|
// Basically the same information as in ObjectMouse, except the
|
|
// coordinates are adjusted to conform to standard ScummVM usage.
|
|
|
|
Common::Rect rect;
|
|
int32 priority;
|
|
int32 pointer;
|
|
|
|
// In addition, we need an id when checking the mouse list, and a
|
|
// text id for mouse-overs.
|
|
|
|
int32 id;
|
|
int32 pointer_text;
|
|
};
|
|
|
|
class Mouse {
|
|
private:
|
|
Sword2Engine *_vm;
|
|
|
|
Common::Point _pos;
|
|
|
|
MouseUnit _mouseList[TOTAL_mouse_list];
|
|
uint32 _curMouse;
|
|
|
|
MenuObject _tempList[TOTAL_engine_pockets];
|
|
uint32 _totalTemp;
|
|
|
|
MenuObject _masterMenuList[TOTAL_engine_pockets];
|
|
uint32 _totalMasters;
|
|
|
|
uint8 _menuStatus[2];
|
|
byte *_icons[2][RDMENU_MAXPOCKETS];
|
|
uint8 _pocketStatus[2][RDMENU_MAXPOCKETS];
|
|
|
|
uint8 _iconCount;
|
|
|
|
// If it's NORMAL_MOUSE_ID (ie. normal pointer) then it's over a floor
|
|
// area (or hidden hot-zone)
|
|
|
|
uint32 _mousePointerRes;
|
|
|
|
struct MouseAnim *_mouseAnim;
|
|
struct MouseAnim *_luggageAnim;
|
|
|
|
uint8 _mouseFrame;
|
|
byte *_mouseSprite;
|
|
int32 *_mouseOffsets;
|
|
int32 *_luggageOffset;
|
|
|
|
uint32 _mouseMode;
|
|
|
|
bool _mouseStatus; // Human 0 on/1 off
|
|
bool _mouseModeLocked; // 0 not !0 mode cannot be changed from
|
|
// normal mouse to top menu (i.e. when
|
|
// carrying big objects)
|
|
uint32 _realLuggageItem; // Last minute for pause mode
|
|
uint32 _currentLuggageResource;
|
|
uint32 _oldButton; // For the re-click stuff - must be
|
|
// the same button you see
|
|
uint32 _buttonClick;
|
|
uint32 _pointerTextBlocNo;
|
|
uint32 _playerActivityDelay; // Player activity delay counter
|
|
|
|
bool _examiningMenuIcon;
|
|
|
|
// Set by checkMouseList()
|
|
uint32 _mouseTouching;
|
|
uint32 _oldMouseTouching;
|
|
|
|
bool _objectLabels;
|
|
|
|
uint32 _menuSelectedPos;
|
|
|
|
void decompressMouse(byte *decomp, byte *comp, int width, int height, int pitch, int xOff = 0, int yOff = 0);
|
|
|
|
int32 setMouseAnim(byte *ma, int32 size, int32 mouseFlash);
|
|
int32 setLuggageAnim(byte *la, int32 size);
|
|
|
|
void clearIconArea(int menu, int pocket, Common::Rect *r);
|
|
|
|
public:
|
|
Mouse(Sword2Engine *vm);
|
|
~Mouse();
|
|
|
|
void getPos(int &x, int &y);
|
|
void setPos(int x, int y);
|
|
|
|
bool getObjectLabels() { return _objectLabels; }
|
|
void setObjectLabels(bool b) { _objectLabels = b; }
|
|
|
|
bool getMouseStatus() { return _mouseStatus; }
|
|
uint32 getMouseTouching() { return _mouseTouching; }
|
|
void setMouseTouching(uint32 touching) { _mouseTouching = touching; }
|
|
|
|
void pauseGame();
|
|
void unpauseGame();
|
|
|
|
void setMouse(uint32 res);
|
|
void setLuggage(uint32 res);
|
|
|
|
void setObjectHeld(uint32 res);
|
|
|
|
void resetMouseList();
|
|
|
|
void registerMouse(ObjectMouse *ob_mouse, BuildUnit *build_unit);
|
|
void registerPointerText(int32 text_id);
|
|
|
|
void createPointerText(uint32 text_id, uint32 pointer_res);
|
|
void clearPointerText();
|
|
|
|
void drawMouse();
|
|
int32 animateMouse();
|
|
|
|
void processMenu();
|
|
|
|
void addMenuObject(MenuObject *obj);
|
|
void buildMenu();
|
|
void buildSystemMenu();
|
|
|
|
int32 showMenu(uint8 menu);
|
|
int32 hideMenu(uint8 menu);
|
|
int32 setMenuIcon(uint8 menu, uint8 pocket, byte *icon);
|
|
|
|
void closeMenuImmediately();
|
|
|
|
void refreshInventory();
|
|
|
|
void startConversation();
|
|
void endConversation();
|
|
|
|
void hideMouse();
|
|
void noHuman();
|
|
void addHuman();
|
|
|
|
void resetPlayerActivityDelay() { _playerActivityDelay = 0; }
|
|
void monitorPlayerActivity();
|
|
void checkPlayerActivity(uint32 seconds);
|
|
|
|
void mouseOnOff();
|
|
uint32 checkMouseList();
|
|
void mouseEngine();
|
|
|
|
void normalMouse();
|
|
void menuMouse();
|
|
void dragMouse();
|
|
void systemMenuMouse();
|
|
|
|
int menuClick(int menu_items);
|
|
};
|
|
|
|
} // End of namespace Sword2
|
|
|
|
#endif
|