aboutsummaryrefslogtreecommitdiff
path: root/engines/glk/alan2/types.h
blob: 7da9e1dc58f15a86b45fb3645fb24c564568d287 (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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
/* 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 GLK_ALAN2_TYPES
#define GLK_ALAN2_TYPES

#include "glk/alan2/acode.h"

namespace Glk {
namespace Alan2 {

// CONSTANTS

#define ACTMIN (_vm->header->actmin)
#define ACTMAX (_vm->header->actmax)
#define OBJMIN (_vm->header->objmin)
#define OBJMAX (_vm->header->objmax)
#define LOCMIN (_vm->header->locmin)
#define LOCMAX (_vm->header->locmax)
#define CNTMIN (_vm->header->cntmin)
#define CNTMAX (_vm->header->cntmax)
#define LITMIN (_vm->header->locmax + 1)
#define LITMAX (_vm->header->locmax + 1 + litCount)
#define EVTMIN (_vm->header->evtmin)
#define EVTMAX (_vm->header->evtmax)

#define HERO ACTMIN


#define addrTo(x) (&_vm->memory[x])

// The word classes are represented as numbers but in the dictonary they are generated as bits
#define isVerb(word) (word < dictsize && (dict[word].wordClass&((Aword)1L<<WRD_VRB))!=0)
#define isConj(word) (word < dictsize && (dict[word].wordClass&((Aword)1L<<WRD_CONJ))!=0)
#define isBut(word) (word < dictsize && (dict[word].wordClass&((Aword)1L<<WRD_BUT))!=0)
#define isThem(word) (word < dictsize && (dict[word].wordClass&((Aword)1L<<WRD_THEM))!=0)
#define isIt(word) (word < dictsize && (dict[word].wordClass&((Aword)1L<<WRD_IT))!=0)
#define isNoun(word) (word < dictsize && (dict[word].wordClass&((Aword)1L<<WRD_NOUN))!=0)
#define isAdj(word) (word < dictsize && (dict[word].wordClass&((Aword)1L<<WRD_ADJ))!=0)
#define isPrep(word) (word < dictsize && (dict[word].wordClass&((Aword)1L<<WRD_PREP))!=0)
#define isAll(word) (word < dictsize && (dict[word].wordClass&((Aword)1L<<WRD_ALL))!=0)
#define isDir(word) (word < dictsize && (dict[word].wordClass&((Aword)1L<<WRD_DIR))!=0)
#define isNoise(word) (word < dictsize && (dict[word].wordClass&((Aword)1L<<WRD_NOISE))!=0)
#define isLiteral(word) (word >= dictsize)


// TYPES

// Amachine variables 
struct CurVars {
	int vrb;
	int obj;
	int loc;
	int act;
	int tick;
	int score;
	int visits;
};

// The various tables 
struct WrdElem {			// Dictionary 
	Aaddr wrd;				// ACODE address to string 
	Aword wordClass;		// Word class 
	Aword code;
	Aaddr adjrefs;			// Address to reference list 
	Aaddr nounrefs;			// Address to reference list 
};

struct ActElem {			// ACTOR TABLE 
	Aword loc;				// Location 
	Abool describe;			// Description flag 
	Aaddr nam;				// Address to name printing code 
	Aaddr atrs;				// Address to attribute list 
	Aword cont;				// Code for the container props if any 
	Aword script;			// Which script is he using 
	Aaddr scradr;			// Address to script table 
	Aword step;
	Aword count;
	Aaddr vrbs;
	Aaddr dscr;				// Address of description code 
};

struct ScrElem {			// SCRIPT TABLE 
	Aword code;				// Script number 
	Aaddr dscr;				// Optional description statements 
	Aaddr steps;			// Address to steps 
};

struct StepElem {			// STEP TABLE 
	Aword after;			// After how many ticks? 
	Aaddr exp;				// Address to expression saying when 
	Aaddr stm;				// Address to the actual code 
};

struct LocElem {			// LOCATION TABLE 
	Aaddr nams;				// Address of name printing code 
	Aaddr dscr;				// Address of description code 
	Aaddr does;				// Address of does code 
	Aword describe;			// Description flag & counter 
	Aaddr atrs;				// Address of attribute list 
	Aaddr exts;				// Address of exit list 
	Aaddr vrbs;				// Address of local verb list 
};

struct ExtElem {			// EXIT TABLE structure 
	Abool done;				// Flag for reverse/convert process 
	Aword code;				// Direction code 
	Aaddr checks;			// Address of check table 
	Aaddr action;			// Address of action code 
	Aword next;				// Number of next location 
};

struct ChkElem {			// CHECK TABLE 
	Aaddr exp;				// ACODE address to expression code 
	Aaddr stms;				// ACODE address to statement code 
};

struct VrbElem {			// VERB TABLE 
	Aword code;				// Code for the verb 
	Aaddr alts;				// Address to alternatives 
};

struct StxElem {			// SYNTAX TABLE 
	Aword code;				// Code for verb word 
	Aaddr elms;				// Address to element tables 
};

struct ElmElem26 {			// ELEMENT TABLES 
	Aword code;				// Code for this element, 0 -> parameter 
	Abool multiple;			// May be multiple (if parameter) 
	Aaddr next;				// Address to next element table ... 
							// ... or class check if EOS 
};

struct ElmElem {			// ELEMENT TABLES 
	Aword code;				// Code for this element, 0 -> parameter 
	Aword flags;			// Flags for multiple/omni (if parameter) 
							// CHANGED: v2.7 from Abool for multiple 
	Aaddr next;				// Address to next element table ... 
							// ... or class check if EOS 
};

struct ClaElem {			// CLASS DEFINITION TABLE 
	Aword code;				// Parameter number 
	Aword classes;			// Parameter classes 
	Aaddr stms;				// Exception statements 
};

struct AltElem {			// VERB ALTERNATIVE TABLE 
	Abool done;				// Flag for patching (reverse/convert) process 
	Aword param;			// Parameter number 
	Aword qual;				// Verb execution qualifier 
	Aaddr checks;			// Address of the check table 
	Aaddr action;			// Address of the action code 
};

struct AtrElem {			// ATTRIBUTE LIST 
	Aword val;				// Its value 
	Aaddr stradr;			// Address to the name 
};

struct ObjElem25 {			// OBJECT TABLE of 2.5 format
	Aword loc;				// Current location 
	Abool describe;			// Describe flag 
	Aaddr atrs;				// Address of attribute list 
	Aword cont;				// Index to container properties if any 
	Aaddr vrbs;				// Address to local verb table 
	Aaddr dscr1;			// Address to Aword description code 
	Aaddr dscr2;			// Address to short description code 
};

struct ObjElem {			// OBJECT TABLE 
	Aword loc;				// Current location 
	Abool describe;			// Describe flag 
	Aaddr atrs;				// Address of attribute list 
	Aword cont;				// Index to container properties if any 
	Aaddr vrbs;				// Address to local verb table 
	Aaddr dscr1;			// Address to Aword description code 
	Aaddr art;				// Article printing code? Else use default 
							// INTRODUCED: v2.6 
	Aaddr dscr2;			// Address to short description code 
};

struct CntElem {			// CONTAINER TABLE 
	Aaddr lims;				// Address to limit check code 
	Aaddr header;			// Address to header code 
	Aaddr empty;			// Address to empty code 
	Aword parent;			// Object or actor index 
	Aaddr nam;				// Address to statement printing name 
};

struct LimElem {			// LIMIT Type 
	Aword atr;				// Attribute that limits 
	Aword val;				// And the limiting value 
	Aaddr stms;				// Statements if fail 
};

struct RulElem {			// RULE TABLE 
	Abool run;				// Is rule already run? 
	Aaddr exp;				// Address to expression code 
	Aaddr stms;				// Address to run 
};

struct EvtElem {			// EVENT TABLE 
	Aaddr stradr;			// Address to name string 
	Aaddr code;				// Address of code to run 
};

struct EvtqElem {			// EVENT QUEUE ELEMENT 
	int time;
	int event;
	int where;
};

struct IniElem {			// STRING INITIALISATION TABLE 
	Aword fpos;				// File position 
	Aword len;				// Length 
	Aword adr;				// Where to store the string 
};

struct MsgElem26 {			// MESSAGE TABLE 
	Aword fpos;				// File position 
	Aword len;				// Length of message 
};

struct MsgElem {			// MESSAGE TABLE 
	Aaddr stms;				// Address to statements
							// Changed v2.7 from fpos+len in .dat 
};

struct ParamElem {			// PARAMETER 
	Aword code;				// Code for this parameter (0=multiple) 
	Aword firstWord;		// Index to first word used by player 
	Aword lastWord;			// d:o to last 
};

enum Type {
	TYPNUM,
	TYPSTR
};

struct LitElem {			// LITERAL 
	Type type;
	Aptr value;
};

#define MAXPARAMS 9
#define MAXENTITY (_vm->header->actmax)

} // End of namespace Alan2
} // End of namespace Glk

#endif