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
|
/* 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.
*
* Additional copyright for this file:
* Copyright (C) 1995-1997 Presto Studios, Inc.
*
* 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 PEGASUS_INTERACTION_H
#define PEGASUS_INTERACTION_H
#include "pegasus/input.h"
#include "pegasus/util.h"
namespace Pegasus {
static const tInteractionID kNoInteractionID = -1;
class Neighborhood;
class GameInteraction : public IDObject, public InputHandler {
public:
GameInteraction(const tInteractionID id, Neighborhood *nextHandler) : IDObject(id), InputHandler((InputHandler *)nextHandler) {
_isInteracting = false;
_savedHandler = 0;
_owner = nextHandler;
}
// If the interaction is open (_isInteracting == true), it's too late to do anything
// about it here.
virtual ~GameInteraction() {}
// startInteraction and stopInteraction are called by the outside world to
// start and stop the interaction sequence.
// isInteracting returns a bool indicating whether or not the interaction
// is going.
void startInteraction() {
if (!isInteracting()) {
openInteraction();
initInteraction();
_isInteracting = true;
_savedHandler = InputHandler::setInputHandler(this);
}
}
void stopInteraction() {
if (isInteracting()) {
closeInteraction();
_isInteracting = false;
if (InputHandler::_inputHandler == this)
InputHandler::setInputHandler(_savedHandler);
}
}
void startOverInteraction() {
if (isInteracting())
resetInteraction();
}
bool isInteracting() const { return _isInteracting; }
Neighborhood *getOwner() const { return _owner; }
virtual Common::String getBriefingMovie() { return ""; }
virtual Common::String getEnvScanMovie() { return ""; }
virtual long getNumHints() { return 0; }
virtual Common::String getHintMovie(uint) { return ""; }
virtual bool canSolve() { return false; }
virtual void setSoundFXLevel(const uint16) {}
virtual void setAmbienceLevel(const uint16) {}
virtual void doSolve() {}
protected:
// Subclasses override openInteraction and closeInteraction to perform
// specific initialization and cleanup. Override resetInteraction to
// "start the interaction over." resetInteraction is called only when
// the interaction is already open.
// These functions are only called in pairs, never two opens or closes
// in a row.
virtual void openInteraction() {}
virtual void initInteraction() {}
virtual void closeInteraction() {}
virtual void resetInteraction() {}
InputHandler *_savedHandler;
Neighborhood *_owner;
private:
// Private so that only StartInteraction and StopInteraction can touch it.
bool _isInteracting;
};
} // End of namespace Pegasus
#endif
|