1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
|
/* 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_USER_INTERFACE_H
#define MADS_USER_INTERFACE_H
#include "common/scummsys.h"
#include "common/rect.h"
#include "common/str.h"
#include "mads/msurface.h"
#include "mads/screen.h"
namespace MADS {
enum { IMG_SPINNING_OBJECT = 200, IMG_TEXT_UPDATE = 201 };
enum ScrollbarActive {
SCROLLBAR_NONE = 0, // No state
SCROLLBAR_UP = 1, // Up butotn
SCROLLBAR_DOWN = 2, // Down button
SCROLLBAR_ELEVATOR = 3, // Elevator bar
SCROLLBAR_THUMB = 4 // Scrollbar thumb
};
class AnimFrameEntry;
class MADSEngine;
class UISlot {
public:
int _flags;
int _segmentId;
int _spritesIndex;
int _frameNumber;
Common::Point _position;
// Only used for IMG_OVERPRINT
int _width;
int _height;
UISlot();
};
/**
* Sprite list for the user interface
*/
class UISlots : public Common::Array<UISlot> {
private:
MADSEngine *_vm;
public:
/**
* Constructor
*/
UISlots(MADSEngine *vm) : _vm(vm) {}
/**
* Add an overprint (text) entry to the list
*/
void add(const Common::Rect &bounds);
/**
* Loads the data from an aimation frame entry
*/
void add(const AnimFrameEntry &frameEntry);
/**
* Adds a special entry for full refresh of the user interface
*/
void fullRefresh();
/**
* Draw all the sprites in the list on the user interface.
* @param updateFlag Flag drawn areas to be updated on physical screen
* @param delFlag Controls how used slots are deleted after drawing
*/
void draw(bool updateFlag, bool delFlag);
};
class Conversation {
private:
static MADSEngine *_vm;
public:
static void init(MADSEngine *vm);
public:
int _globalId;
Common::Array<int> _quotes;
/**
* Set up a conversation sequence
*/
void setup(int globalId, ...);
/**
* Activates the passed set of quotes in the given conversation node
*/
void set(int quoteId, ...);
/**
* Returns the bit for a given quote to indicate whether it's active or not or,
* if 0 is passed, returns the number of currently active quotes
*/
int read(int quoteId);
/**
* Activates or deactivates the specified quote in the given conversation node
*/
void write(int quoteId, bool flag);
/**
* Starts the conversation
*/
void start();
};
class UserInterface : public MSurface {
friend class UISlots;
private:
MADSEngine *_vm;
int _invSpritesIndex;
int _invFrameNumber;
uint32 _scrollMilli;
bool _scrollFlag;
int _noSegmentsActive;
int _someSegmentsActive;
/**
* Loads the elements of the user interface
*/
void loadElements();
/**
* Returns the area within the user interface a given element falls
*/
bool getBounds(ScrCategory category, int invIndex, Common::Rect &bounds);
/**
* Reposition a bounding rectangle to physical co-ordinates
*/
void moveRect(Common::Rect &bounds);
/**
* Draw options during a conversation.
*/
void drawConversationList();
/**
* Draw the action list
*/
void drawActions();
/**
* Draw the inventory list
*/
void drawInventoryList();
/**
* Draw the inventory item vocab list
*/
void drawItemVocabList();
/**
* Draw the inventory scroller
*/
void drawScroller();
/**
* Called when the inventory scrollbar has changed
*/
void scrollbarChanged();
/**
* Draw a UI textual element
*/
void writeVocab(ScrCategory category, int id);
public:
MSurface _surface;
UISlots _uiSlots;
DirtyAreas _dirtyAreas;
ScrCategory _category;
Common::Rect *_rectP;
int _inventoryTopIndex;
int _selectedInvIndex;
int _selectedActionIndex;
int _selectedItemVocabIdx;
ScrollbarActive _scrollbarActive, _scrollbarOldActive;
int _highlightedCommandIndex;
int _highlightedInvIndex;
int _highlightedItemVocabIndex;
bool _inventoryChanged;
int _categoryIndexes[8];
Common::StringArray _talkStrings;
Common::Array<int> _talkIds;
bool _scrollbarQuickly;
uint32 _scrollbarMilliTime;
int _scrollbarElevator, _scrollbarOldElevator;
ScrollbarActive _scrollbarStrokeType;
public:
/**
* Constructor
*/
UserInterface(MADSEngine *vm);
/**
* Loads an interface from a specified resource
*/
void load(const Common::String &resName) override;
/**
* Set up the interface
*/
void setup(InputMode inputMode);
void drawTextElements();
/**
* Merges a sub-section of another surface into the user interface without
* destroying any on-screen text
* @param src Source surface
* @param srcBounds Area to copy/merge from
* @param destPos Destination position to draw in current surface
* @param transparencyIndex Transparency color
*/
void mergeFrom(BaseSurface *src, const Common::Rect &srcBounds, const Common::Point &destPos,
int transparencyIndex = -1);
/**
* Loads the animation sprite data for a given inventory object
*/
void loadInventoryAnim(int objectId);
/**
* Resets the inventory animation when no inventory item is selected
*/
void noInventoryAnim();
/**
* Handles any animation that occurs in the background of the user interface
*/
void doBackgroundAnimation();
/**
* Handles queuing a new frame of an inventory animation for drawing
*/
void inventoryAnim();
void categoryChanged();
/**
* Select an item from the inventory list
* @param invIndex Index in the inventory list of the item to select
*/
void selectObject(int invIndex);
void updateSelection(ScrCategory category, int newIndex, int *idx);
/**
* Updates the current top visible item of the scrollbar
*/
void changeScrollBar();
void scrollerChanged();
void scrollInventory();
/**
* Checks for the mouse being on the user interface inventory scroller,
* and update the scroller highlight and selected inventory object as necessary
*/
void updateInventoryScroller();
/**
* Empties the current conversation talk list
*/
void emptyConversationList();
/**
* Add a msesage to the list of conversation items to select from
*/
void addConversationMessage(int vocabId, const Common::String &msg);
/**
* Synchronize the data
*/
void synchronize(Common::Serializer &s);
void refresh();
};
} // End of namespace MADS
#endif /* MADS_USER_INTERFACE_H */
|