aboutsummaryrefslogtreecommitdiff
path: root/engines/zvision/script_manager.h
blob: 7924eee4c08a9bfcadbfd0e2ca4ab5a03bd9012a (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
/* 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 ZVISION_SCRIPT_MANAGER_H
#define ZVISION_SCRIPT_MANAGER_H

#include "common/str.h"
#include "common/stream.h"
#include "common/hashmap.h"
#include "common/stack.h"

#include "zvision/puzzle.h"
#include "zvision/control.h"

namespace ZVision {

class ZVision;
class ActionNode;

class ScriptManager {
public:
	ScriptManager(ZVision *engine);

private:
	ZVision *_engine;
	/** 
	 * Holds the global state variable. Do NOT directly modify this. Use the accessors and 
	 * mutators getStateValue() and setStateValue(). This ensures that Puzzles that reference a 
	 * particular state key are checked after the key is modified.
	 */
	Common::HashMap<uint32, byte> _globalState;
	/** Holds the currently active ActionNodes */
	Common::List<ActionNode *> _activeNodes;
	/** References _globalState keys to Puzzles */
	Common::HashMap<uint32, Common::Array<Puzzle *> > _referenceTable;
	/** Holds the Puzzles that should be checked this frame */
	Common::Stack<Puzzle *> _puzzlesToCheck;
	/** Holds the currently active puzzles */
	Common::List<Puzzle> _activePuzzles;
	/** Holds the currently active controls */
	Common::List<Control> _activeControls;

public:
	
	void initialize();
	void updateNodes(uint32 deltaTimeMillis);
	void checkPuzzleCriteria();

	byte getStateValue(uint32 key);
	void setStateValue(uint32 key, byte value);
	void addToStateValue(uint32 key, byte valueToAdd);

	void addActionNode(ActionNode *node);

private:
	void createReferenceTable();

	/**
	 * Parses a script file into triggers and events
	 *
	 * @param fileName		Name of the .scr file
	 */
	void parseScrFile(Common::String fileName);

	/**
	 * Parses the stream into a Puzzle object
	 * Helper method for parseScrFile. 
	 *
	 * @param puzzle    The object to store what is parsed
	 * @param stream    Scr file stream
	 */
	void parsePuzzle(Puzzle &puzzle, Common::SeekableReadStream &stream);

	/**
	 * Parses the stream into a Criteria object
	 * Helper method for parsePuzzle. 
	 *
	 * @param stream    Scr file stream
	 * @return          Created Criteria object
	 */
	Criteria parseCriteria(Common::SeekableReadStream &stream) const;

	/**
	 * Parses the stream into a Results object
	 * Helper method for parsePuzzle. 
	 *
	 * @param stream    Scr file stream
	 * @return          Created Results object
	 */
	void parseResult(Common::SeekableReadStream &stream, Common::List<ResultAction *> &actionList) const;

	/**
	 * Helper method for parsePuzzle. Parses the stream into a bitwise or of the StateFlags enum
	 *
	 * @param stream    Scr file stream
	 * @return          Bitwise or of all the flags set within the puzzle
	 */
	byte parseFlags(Common::SeekableReadStream &stream) const;

	/**
	 * Helper method for parseScrFile. Parses the stream into a Control object
	 *
	 * @param control    The object to store what is parsed
	 * @param stream     Scr file stream
	 */
	void parseControl(Control &control, Common::SeekableReadStream &stream);
};


} // End of namespace ZVision

#endif