aboutsummaryrefslogtreecommitdiff
path: root/engines/mads/sequence.h
blob: 1b9aefe29495ff2d05b748af1c3b896698fa717f (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
/* 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 MADS_SEQUENCE_H
#define MADS_SEQUENCE_H

#include "common/scummsys.h"
#include "common/array.h"
#include "common/rect.h"
#include "mads/action.h"

namespace MADS {

class SpriteSlot;

enum SequenceSubEntryMode { SM_0 = 0, SM_1 = 1, SM_FRAME_INDEX = 2 };

enum SpriteAnimType { ANIMTYPE_NONE = 0, ANIMTYPE_CYCLED = 1, ANIMTYPE_REVERSIBLE = 2 };

#define TIMER_ENTRY_SUBSET_MAX 5

struct SequenceSubEntries {
	int _count;
	SequenceSubEntryMode _mode[TIMER_ENTRY_SUBSET_MAX];
	int _frameIndex[TIMER_ENTRY_SUBSET_MAX];
	int8 _abortVal[TIMER_ENTRY_SUBSET_MAX];
};

struct SequenceEntry {
	bool _active;
	int8 _spritesIndex;
	bool _flipped;

	int _frameIndex;
	int _frameStart;
	int _numSprites;

	SpriteAnimType _animType;
	int _frameInc;

	int _depth;
	int _scale;
	int _dynamicHotspotIndex;

	bool _nonFixed;
	int _field13;

	Common::Point _msgPos;
	int _triggerCountdown;
	bool _doneFlag;
	SequenceSubEntries _entries;
	AbortTimerMode _abortMode;

	uint16 _actionNouns[3];
	int _numTicks;
	int _extraTicks;
	uint32 _timeout;

	SequenceEntry();
};

class MADSEngine;

class SequenceList {
private:
	MADSEngine *_vm;
	Common::Array<SequenceEntry> _entries;
	int _actionNouns[3];
public:
	SequenceList(MADSEngine *vm);

	SequenceEntry &operator[](int index) { return _entries[index]; }
	void clear();
	bool addSubEntry(int index, SequenceSubEntryMode mode, int frameIndex, int abortVal);
	int add(int spriteListIndex, bool flipped, int frameIndex, int triggerCountdown, int delayTicks,
		int extraTicks, int numTicks, int msgX, int msgY, bool nonFixed, char scale, uint8 depth,
		int frameInc, SpriteAnimType animType, int numSprites, int frameStart);
	void remove(int seqIndex);
	void setSpriteSlot(int seqIndex, SpriteSlot &spriteSlot);
	bool loadSprites(int seqIndex);
	void tick();
	void delay(uint32 v1, uint32 v2);
	void setAnimRange(int seqIndex, int startVal, int endVal);
	void scan();
	void setDepth(int seqIndex, int depth);
};

} // End of namespace MADS

#endif /* MADS_SEQUENCE_H */