aboutsummaryrefslogtreecommitdiff
path: root/engines/neverhood/gamevars.h
blob: 3aec4d1da455913c5e80dec14bd23eb7755faf39 (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
183
184
185
186
187
188
189
190
191
192
193
194
195
/* 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 NEVERHOOD_GAMEVARS_H
#define NEVERHOOD_GAMEVARS_H

#include "common/array.h"
#include "common/savefile.h"
#include "neverhood/neverhood.h"

namespace Neverhood {

enum {
	// Misc
	V_MODULE_NAME				= 0x91080831,			// Currently active module name hash
	V_CURRENT_SCENE				= 0x108A4870,			// Current scene in the current module
	V_CURRENT_SCENE_WHICH		= 0x82C80875,
	V_DEBUG						= 0xA4014072,			// Original debug-flag, can probably be removed
	V_SMACKER_CAN_ABORT			= 0x06C02850,			// Not set anywhere (yet), seems like a debug flag
	V_KEY3_LOCATION				= 0x13382860,			// Location of the third key
	V_TEXT_FLAG1				= 0x8440001F,
	V_TEXT_INDEX				= 0x01830201,
	V_TEXT_COUNTING_INDEX1		= 0x29408F00,
	V_TEXT_COUNTING_INDEX2		= 0x8A140C21,
	V_TALK_COUNTING_INDEX		= 0xA0808898,
	V_FRUIT_COUNTING_INDEX		= 0x40040831,
	V_NOISY_SYMBOL_INDEX		= 0x2414C2F2,
	V_COLUMN_BACK_NAME			= 0x4CE79018,
	V_COLUMN_TEXT_NAME			= 0xC8C28808,
	V_CLICKED_COLUMN_INDEX		= 0x48A68852,
	V_CLICKED_COLUMN_ROW		= 0x49C40058,
	// Klaymen
	V_KLAYMEN_SMALL				= 0x1860C990,			// Is Klaymen small?
	V_KLAYMEN_FRAMEINDEX		= 0x18288913,
	V_KLAYMEN_IS_DELTA_X		= 0xC0418A02,
	V_KLAYMEN_SAVED_X			= 0x00D30138,
	V_CAR_DELTA_X				= 0x21E60190,
	// Flags
	V_CRYSTAL_COLORS_INIT		= 0xDE2EC914,
	V_TV_JOKE_TOLD				= 0x92603A79,
	V_NOTES_DOOR_UNLOCKED		= 0x0045D021,
	V_WATER_RUNNING				= 0x4E0BE910,
	V_CREATURE_ANGRY			= 0x0A310817,			// After having played with the music box
	V_BEEN_SHRINKING_ROOM		= 0x1C1B8A9A,
	V_BEEN_STATUE_ROOM			= 0xCB45DE03,
	V_MOUSE_PUZZLE_SOLVED		= 0x70A1189C,
	V_NOTES_PUZZLE_SOLVED		= 0x86615030,
	V_TILE_PUZZLE_SOLVED		= 0x404290D5,
	V_STAIRS_PUZZLE_SOLVED		= 0xA9035F60,
	V_CODE_SYMBOLS_SOLVED		= 0x2C531AF8,
	V_SPIKES_RETRACTED			= 0x18890C91,
	V_LARGE_DOOR_NUMBER			= 0x9A500914,			// Number of the currently "large" door
	V_LIGHTS_ON					= 0x4D080E54,
	V_SHRINK_LIGHTS_ON			= 0x190A1D18,			// Lights on in the room with the shrinking device
	V_STAIRS_DOWN_ONCE			= 0x2050861A,			// Stairs have been down once before
	V_STAIRS_DOWN				= 0x09221A62,
	V_LADDER_DOWN				= 0x0018CA22,			// Is the ladder in the statue room down?
	V_LADDER_DOWN_ACTION		= 0x00188211,
	V_WALL_BROKEN				= 0x10938830,
	V_BOLT_DOOR_OPEN			= 0x01BA1A52,
	V_BOLT_DOOR_UNLOCKED		= 0x00040153,
	V_SEEN_SYMBOLS_NO_LIGHT		= 0x81890D14,
	V_FELL_DOWN_HOLE			= 0xE7498218,
	V_DOOR_PASSED				= 0x2090590C,			// Auto-closing door was passed
	V_ENTRANCE_OPEN				= 0xD0A14D10,			// Is the entrance to Module1300 open (after the robot got his teddy)
	V_WINDOW_OPEN				= 0x03C698DA,
	V_DOOR_STATUS				= 0x52371C95,
	V_DOOR_BUSTED				= 0xD217189D,
	V_WORLDS_JOINED				= 0x98109F12,			// Are the worlds joined?
	V_KEYDOOR_UNLOCKED			= 0x80455A41,			// Is the keyboard-door unlocked?
	V_MOUSE_SUCKED_IN			= 0x01023818,			// Are mouse/cheese in Scene1308?
	V_BALLOON_POPPED			= 0xAC00C0D0,			// Has the balloon with the key been popped?
	V_TNT_DUMMY_BUILT			= 0x000CF819,			// Are all TNT parts on the dummy?
	V_TNT_DUMMY_FUSE_LIT		= 0x20A0C516,
	V_RADIO_ENABLED				= 0x4DE80AC0,
	V_SEEN_CREATURE_EXPLODE_VID	= 0x2A02C07B,
	V_CREATURE_EXPLODED			= 0x0A18CA33,
	V_UNUSED					= 0x89C669AA,			// Seems to be unused, confirmed by checking the exe for this constant value (still left in atm)
	// Radio
	V_RADIO_ROOM_LEFT_DOOR		= 0x09880D40,
	V_RADIO_ROOM_RIGHT_DOOR		= 0x08180ABC,
	V_CURR_RADIO_MUSIC_INDEX	= 0x08CC0828,
	V_GOOD_RADIO_MUSIC_INDEX	= 0x88880915,
	V_GOOD_RADIO_MUSIC_NAME		= 0x89A82A15,
	V_RADIO_MOVE_DISH_VIDEO		= 0x28D8C940,
	// Match
	V_MATCH_STATUS				= 0x0112090A,
	// Venus fly trap
	V_FLYTRAP_RING_EATEN		= 0x2B514304,
	V_FLYTRAP_RING_DOOR			= 0x8306F218,
	V_FLYTRAP_RING_FENCE		= 0x80101B1E,
	V_FLYTRAP_RING_BRIDGE		= 0x13206309,
	V_FLYTRAP_POSITION_1		= 0x1B144052,
	V_FLYTRAP_POSITION_2		= 0x86341E88,
	// Navigation
	V_NAVIGATION_INDEX			= 0x4200189E,			// Navigation scene: Current navigation index
	// Cannon
	V_CANNON_RAISED				= 0x000809C2,			// Is the cannon raised?
	V_CANNON_TURNED				= 0x9040018A,			// Is the cannon turned?
	V_ROBOT_HIT					= 0x0C0288F4,			// Was the robot hit by the cannon?
	V_ROBOT_TARGET				= 0x610210B7,			// Is the robot at the cannon target position? (teddy)
	V_CANNON_SMACKER_NAME		= 0xF0402B0A,
	V_CANNON_TARGET_STATUS		= 0x20580A86,
	// Projector
	V_PROJECTOR_SLOT			= 0x04A10F33,			// Projector x slot index
	V_PROJECTOR_LOCATION		= 0x04A105B3,			// Projector scene location
	V_PROJECTOR_ACTIVE			= 0x12A10DB3,			// Is the projecor projecting?
	// Teleporter
	V_TELEPORTER_CURR_LOCATION	= 0x0152899A,
	V_TELEPORTER_WHICH			= 0x60826830,
	V_TELEPORTER_DEST_AVAILABLE	= 0x2C145A98,
	// Inventory
	V_HAS_NEEDLE				= 0x31C63C51,			// Has Klaymen the needle?
	V_HAS_FINAL_KEY				= 0xC0780812,			// Has Klaymen the key from the diskplayer?
	V_HAS_TEST_TUBE				= 0x45080C38,
	// Arrays
	// NOTE "GOOD" means the solution, "CURR" is the current setup of the puzzle variables
	VA_IS_PUZZLE_INIT			= 0x40050052,
	VA_SMACKER_PLAYED			= 0x00800410,
	VA_CURR_CRYSTAL_COLORS		= 0xE11A1929,
	VA_GOOD_CRYSTAL_COLORS		= 0xD4B2089C,
	VA_GOOD_TEST_TUBES_LEVEL_1	= 0x0C601058,
	VA_GOOD_TEST_TUBES_LEVEL_2	= 0x40005834,
	VA_CURR_CANNON_SYMBOLS		= 0x00000914,
	VA_GOOD_CANNON_SYMBOLS_1	= 0x00504B86,
	VA_GOOD_CANNON_SYMBOLS_2	= 0x0A4C0A9A,
	VA_CURR_WATER_PIPES_LEVEL	= 0x0800547C,
	VA_GOOD_WATER_PIPES_LEVEL	= 0x90405038,
	VA_CURR_DICE_NUMBERS		= 0x61084036,
	VA_GOOD_DICE_NUMBERS		= 0x7500993A,
	VA_CURR_KEY_SLOT_NUMBERS	= 0xA010B810,
	VA_GOOD_KEY_SLOT_NUMBERS	= 0x0C10A000,
	VA_CUBE_POSITIONS			= 0x484498D0,
	VA_CODE_SYMBOLS				= 0x04909A50,
	VA_TILE_SYMBOLS				= 0x0C65F80B,
	VA_IS_TILE_MATCH			= 0xCCE0280F,
	VA_TNT_POSITIONS			= 0x10055D14,
	VA_DICE_MEMORY_SYMBOLS		= 0x13100631,
	VA_HAS_TAPE					= 0x02038314,
	VA_IS_TAPE_INSERTED			= 0x02720344,
	VA_HAS_KEY					= 0x0090EA95,
	VA_IS_KEY_INSERTED			= 0x08D0AB11,
	VA_LOCKS_DISABLED			= 0x14800353,
	V_END_
};

struct GameVar {
	uint32 nameHash;
	uint32 value;
	int16 firstIndex, nextIndex;
};

class Console;

class GameVars {
public:
	GameVars();
	void clear();
	void loadState(Common::InSaveFile *in);
	void saveState(Common::OutSaveFile *out);
	uint32 getGlobalVar(uint32 nameHash);
	void setGlobalVar(uint32 nameHash, uint32 value);
	uint32 getSubVar(uint32 nameHash, uint32 subNameHash);
	void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value);
	void dumpVars(Console *con);
protected:
	Common::Array<GameVar> _vars;
	int16 addVar(uint32 nameHash, uint32 value);
	int16 findSubVarIndex(int16 varIndex, uint32 subNameHash);
	int16 addSubVar(int16 varIndex, uint32 subNameHash, uint32 value);
	int16 getSubVarIndex(int16 varIndex, uint32 subNameHash);
};

} // End of namespace Neverhood

#endif /* NEVERHOOD_GAMEVARS_H */