aboutsummaryrefslogtreecommitdiff
path: root/engines/lastexpress/game/inventory.h
blob: f3ab94ccabbb01edeb4c296a346850138ef2090f (plain)
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
/* 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 LASTEXPRESS_INVENTORY_H
#define LASTEXPRESS_INVENTORY_H

/*
	Inventory entry (32 entries)
	----------------------------

	    byte {1}        - Item ID (set to 0 for "undefined" items)
	    byte {1}        - Scene ID
	    byte {1}        - ??
	    byte {1}        - Selectable (1 if item is selectable, 0 otherwise)
	    byte {1}        - Is item in inventory (set to 1 for telegram and article)
	    byte {1}        - Auto selection (1 for no auto selection, 0 otherwise)
	    byte {1}        - Location

*/

#include "lastexpress/shared.h"

#include "lastexpress/eventhandler.h"

#include "common/events.h"
#include "common/serializer.h"

namespace LastExpress {

class LastExpressEngine;
class Scene;

class Inventory : Common::Serializable, public EventHandler {
public:

	// Entry
	struct InventoryEntry : Common::Serializable {
		CursorStyle cursor;
		SceneIndex scene;
		byte usable;
		bool isSelectable;
		bool inPocket;
		bool floating;
		ObjectLocation location;

		InventoryEntry() {
			cursor = kCursorNormal;
			scene = kSceneNone;
			usable = 0;
			isSelectable = false;
			inPocket = false;
			floating = true;
			location = kObjectLocationNone;
		}

		Common::String toString() {
			return Common::String::format("{ %d - %d - %d - %d - %d - %d - %d }", cursor, scene, usable, isSelectable, inPocket, floating, location);
		}

		void saveLoadWithSerializer(Common::Serializer &s) {
			s.syncAsByte(cursor);
			s.syncAsByte(scene);
			s.syncAsByte(usable);
			s.syncAsByte(isSelectable);
			s.syncAsByte(inPocket);
			s.syncAsByte(floating);
			s.syncAsByte(location);
		}
	};

	Inventory(LastExpressEngine *engine);
	~Inventory();

	// Inventory contents
	void addItem(InventoryItem item);
	void removeItem(InventoryItem item, ObjectLocation newLocation = kObjectLocationNone);
	bool hasItem(InventoryItem item);
	void selectItem(InventoryItem item);
	void unselectItem();
	InventoryItem getSelectedItem() { return _selectedItem; }

	InventoryEntry *get(InventoryItem item);
	InventoryEntry *getSelectedEntry() { return get(_selectedItem); }

	InventoryItem getFirstExaminableItem() const;
	void setLocationAndProcess(InventoryItem item, ObjectLocation location);

	// UI Control
	void show();
	void showHourGlass() const;
	void setPortrait(InventoryItem item) const;
	void drawEgg() const;
	void drawBlinkingEgg(uint ticks = 1);

	// Handle inventory UI events.
	void handleMouseEvent(const Common::Event &ev);

	// State
	bool isMagnifierInUse() { return _useMagnifier; }
	bool isPortraitHighlighted() { return _portraitHighlighted; }
	bool isOpened() { return _isOpened; }
	bool isEggHighlighted() { return _eggHightlighted; }

	// Serializable
	void saveLoadWithSerializer(Common::Serializer &s);
	void saveSelectedItem(Common::Serializer &s);

	/**
	 * Convert this object into a string representation.
	 *
	 * @return A string representation of this object.
	 */
	Common::String toString();

private:
	LastExpressEngine *_engine;

	InventoryEntry _entries[32];
	InventoryItem _selectedItem;
	uint32 _highlightedItemIndex;

	uint32 _itemsShown;

	bool _showingHourGlass;
	int16  _blinkingDirection;
	uint16 _blinkingBrightness;

	// Flags
	bool _useMagnifier;
	bool _portraitHighlighted;
	bool _isOpened;
	bool _eggHightlighted;

	Scene *_itemScene;

	Common::Rect _menuEggRect;
	Common::Rect _selectedItemRect;

	void init();

	void open();
	void close();
	void examine(InventoryItem item);
	void drawHighlight(uint32 currentIndex, bool reset);
	uint32 getItemIndex(uint32 currentIndex) const;

	bool isItemSceneParameter(InventoryItem item) const;

	void drawItem(CursorStyle id, uint16 x, uint16 y, int16 brighnessIndex = -1) const;
	void blinkEgg();

	void drawSelectedItem();
	void clearSelectedItem() const;
};

} // End of namespace LastExpress

#endif // LASTEXPRESS_INVENTORY_H