aboutsummaryrefslogtreecommitdiff
path: root/engines/lure/res.h
blob: 19fbde1aad75450b4f18b4613a697fb8854ce8f5 (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
178
179
180
181
182
/* 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 LURE_RES_H
#define LURE_RES_H

#include "lure/luredefs.h"
#include "lure/memory.h"
#include "lure/res_struct.h"
#include "lure/hotspots.h"
#include "lure/palette.h"

#include "common/array.h"
#include "common/file.h"
#include "common/list.h"
#include "common/random.h"

namespace Lure {

enum TalkState {TALK_NONE, TALK_START, TALK_SELECT, TALK_RESPOND, TALK_RESPONSE_WAIT,
	TALK_RESPOND_2, TALK_RESPOND_3};

#define MAX_TALK_SELECTIONS 4
typedef TalkEntryData *TalkSelections[MAX_TALK_SELECTIONS];

struct TalkDialogDetails {
	Common::Rect bounds;
	bool active;
};

#define NUM_GIVE_TALK_IDS 6

class Resources {
private:
	Common::RandomSource &_rnd;
	Palette *_paletteSubset;
	MemoryBlock *_cursors;
	RoomDataList _roomData;
	HotspotDataList _hotspotData;
	HotspotOverrideList _hotspotOverrides;
	HotspotAnimList _animData;
	MemoryBlock *_scriptData;
	MemoryBlock *_script2Data;
	MemoryBlock *_messagesData;
	uint16 *_hotspotScriptData;
	RoomExitJoinList _exitJoins;
	HotspotList _activeHotspots;
	ValueTableData _fieldList;
	HotspotActionSet _actionsList;
	TalkHeaderList _talkHeaders;
	TalkDataList _talkData;
	Common::Array<uint16> _giveTalkIds;
	SequenceDelayList _delayList;
	Action _currentAction;
	MemoryBlock *_talkDialogData;
	RoomExitCoordinatesList _coordinateList;
	CharacterScheduleList _charSchedules;
	RandomActionList _randomActions;
	RoomExitIndexedHotspotList _indexedRoomExitHospots;
	PausedCharacterList _pausedList;
	BarmanLists _barmanLists;
	StringList _stringList;

	int numCharOffsets;
	uint16 *_charOffsets;

	TalkData *_activeTalkData;
	TalkState _talkState;
	TalkSelections _talkSelections;
	TalkDialogDetails _talkDetails;
	int _talkSelection;
	int _talkStartEntry;
	uint16 _talkingCharacter;
	byte _cursor[CURSOR_WIDTH * CURSOR_HEIGHT];

	void reloadData();
	void freeData();
public:
	Resources();
	~Resources();
	static Resources &getReference();
	void reset();

	RoomDataList &roomData() { return _roomData; }
	RoomData *getRoom(uint16 roomNumber);
	bool checkHotspotExtent(HotspotData *hotspot);
	void insertPaletteSubset(Palette &p);
	byte *getCursor(uint8 cursorNum);
	HotspotDataList &hotspotData() { return _hotspotData; }
	HotspotOverrideList &hotspotOverrides() { return _hotspotOverrides; }
	HotspotAnimList &animRecords() { return _animData; }
	MemoryBlock *scriptData() { return _scriptData; }
	MemoryBlock *hotspotScriptData() { return _script2Data; }
	MemoryBlock *messagesData() { return _messagesData; }
	uint16 getHotspotScript(uint16 index);
	HotspotList &activeHotspots() { return _activeHotspots; }
	uint16 getRandom() { return _rnd.getRandomNumber(0xffff); }
	HotspotData *getHotspot(uint16 hotspotId);
	Hotspot *getActiveHotspot(uint16 hotspotId);
	HotspotOverrideData *getHotspotOverride(uint16 hotspotId);
	HotspotAnimData *getAnimation(uint16 animRecordId);
	int getAnimationIndex(HotspotAnimData *animData);
	RoomExitJoinList &exitJoins() { return _exitJoins; }
	RoomExitJoinData *getExitJoin(uint16 hotspotId);
	uint16 getHotspotAction(uint16 actionsOffset, Action action);
	HotspotActionList *getHotspotActions(uint16 actionsOffset);
	TalkHeaderData *getTalkHeader(uint16 hotspotId);
	ValueTableData &fieldList() { return _fieldList; }
	SequenceDelayList &delayList() { return _delayList; }
	MemoryBlock &getTalkDialogData() { return *_talkDialogData; }
	RoomExitCoordinatesList &coordinateList() { return _coordinateList; }
	CharacterScheduleList &charSchedules() { return _charSchedules; }
	RandomActionList &randomActions() { return _randomActions; }
	RoomExitIndexedHotspotList &exitHotspots() { return _indexedRoomExitHospots; }
	PausedCharacterList &pausedList() { return _pausedList; }
	BarmanLists &barmanLists() { return _barmanLists; }
	StringList &stringList() { return _stringList; }
	uint16 getCharOffset(int index) {
		if (index >= numCharOffsets)
			error("Invalid index %d passed to script engine support data offset list", index);
		if (index == 1)
			error("support data list index #1 was referenced - special handlng TODO");
		return _charOffsets[index];
	}
	void copyCursorTo(Surface *s, uint8 cursorNum, int16 x, int16 y);

	uint16 numInventoryItems();
	void setTalkData(uint16 offset);
	TalkData *getTalkData() { return _activeTalkData; }
	void setTalkState(TalkState state) { _talkState = state; }
	TalkState getTalkState() { return _talkState; }
	TalkSelections &getTalkSelections() { return _talkSelections; }
	TalkDialogDetails &getTalkDetails() { return _talkDetails; }
	void setTalkSelection(int index) { _talkSelection = index; }
	int getTalkSelection() { return _talkSelection; }
	void setTalkStartEntry(int index) { _talkStartEntry = index; }
	int getTalkStartEntry() { return _talkStartEntry; }
	uint16 getTalkingCharacter() { return _talkingCharacter; }
	void setTalkingCharacter(uint16 index);
	uint16 getGiveTalkId(uint16 index) {
		if (index >= _giveTalkIds.size())
			error("Invalid give talk id specified");
		return _giveTalkIds[index];
	}
	void setCurrentAction(Action action) { _currentAction = action; }
	Action getCurrentAction() { return _currentAction; }
	const char *getCurrentActionStr() {
		if (_currentAction > EXAMINE)
			error("Invalid current action %d", _currentAction);
		return _stringList.getString(_currentAction);
	}
	Hotspot *activateHotspot(uint16 hotspotId);
	Hotspot *addHotspot(uint16 hotspotId);
	void addHotspot(Hotspot *hotspot);
	void deactivateHotspot(uint16 hotspotId, bool isDestId = false);
	void deactivateHotspot(Hotspot *hotspot);
	void saveToStream(Common::WriteStream *stream);
	void loadFromStream(Common::ReadStream *stream);
};

} // End of namespace Lure

#endif