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
|
/* 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.
*
*/
/*
* This code is based on original Hugo Trilogy source code
*
* Copyright (c) 1989-1995 David P. Gray
*
*/
#ifndef HUGO_GAME_H
#define HUGO_GAME_H
#include "common/keyboard.h"
namespace Common {
class WriteStream;
class SeekableReadStream;
}
namespace Hugo {
// Game specific equates
#define TAKE_TEXT "Picked up the %s ok."
enum {LOOK_NAME = 1, TAKE_NAME}; // Index of name used in showing takeables and in confirming take
// Definitions of 'generic' commands: Max # depends on size of gencmd in
// the Object record since each requires 1 bit. Currently up to 16
enum {LOOK = 1, TAKE = 2, DROP = 4, LOOK_S = 8};
enum TEXTCOLORS {
_TBLACK, _TBLUE, _TGREEN, _TCYAN,
_TRED, _TMAGENTA, _TBROWN, _TWHITE,
_TGRAY, _TLIGHTBLUE, _TLIGHTGREEN, _TLIGHTCYAN,
_TLIGHTRED, _TLIGHTMAGENTA, _TLIGHTYELLOW, _TBRIGHTWHITE
};
enum Uif {U_FONT5, U_FONT6, U_FONT8, UIF_IMAGES, NUM_UIF_ITEMS};
static const int kFirstFont = U_FONT5;
/**
* Enumerate ways of cycling a sequence of frames
*/
enum Cycle {kCycleInvisible, kCycleAlmostInvisible, kCycleNotCycling, kCycleForward, kCycleBackward};
/**
* Enumerate sequence index matching direction of travel
*/
enum {SEQ_RIGHT, SEQ_LEFT, SEQ_DOWN, SEQ_UP};
enum Font {LARGE_ROMAN, MED_ROMAN, NUM_GDI_FONTS, INIT_FONTS, DEL_FONTS};
/**
* Enumerate the different path types for an object
*/
enum Path {
kPathUser, // User has control of object via cursor keys
kPathAuto, // Computer has control, controlled by action lists
kPathQuiet, // Computer has control and no commands allowed
kPathChase, // Computer has control, object is chasing hero
kPathChase2, // Same as CHASE, except keeps cycling when stationary
kPathWander, // Computer has control, object is wandering randomly
kPathWander2 // Same as WANDER, except keeps cycling when stationary
};
struct hugoBoot { // Common HUGO boot file
char _checksum; // Checksum for boot structure (not exit text)
char _registered; // TRUE if registered version, else FALSE
char _pbswitch[8]; // Playback switch string
char _distrib[32]; // Distributor branding string
uint16 _exitLen; // Length of exit text (next in file)
} PACKED_STRUCT;
/**
* Game specific type definitions
*/
typedef byte *ImagePtr; // ptr to an object image (sprite)
typedef byte *SoundPtr; // ptr to sound (or music) data
/**
* Structure for initializing maze processing
*/
struct Maze {
bool _enabledFl; // TRUE when maze processing enabled
byte _size; // Size of (square) maze matrix
int _x1, _y1, _x2, _y2; // maze hotspot bounding box
int _x3, _x4; // north, south x entry coordinates
byte _firstScreenIndex; // index of first screen in maze
};
/**
* The following is a linked list of images in an animation sequence
* The image data is in 8-bit DIB format, i.e. 1 byte = 1 pixel
*/
struct Seq { // Linked list of images
byte *_imagePtr; // ptr to image
uint16 _bytesPerLine8; // bytes per line (8bits)
uint16 _lines; // lines
uint16 _x1, _x2, _y1, _y2; // Offsets from x,y: data bounding box
Seq *_nextSeqPtr; // ptr to next record
};
/**
* The following is an array of structures of above sequences
*/
struct SeqList {
uint16 _imageNbr; // Number of images in sequence
Seq *_seqPtr; // Ptr to sequence structure
};
#include "common/pack-start.h" // START STRUCT PACKING
struct SoundHdr { // Sound file lookup entry
uint16 _size; // Size of sound data in bytes
uint32 _offset; // Offset of sound data in file
} PACKED_STRUCT;
#include "common/pack-end.h" // END STRUCT PACKING
static const int kMaxSeqNumb = 4; // Number of sequences of images in object
/**
* Following is definition of object attributes
*/
struct Object {
uint16 _nounIndex; // String identifying object
uint16 _dataIndex; // String describing the object
uint16 *_stateDataIndex; // Added by Strangerke to handle the LOOK_S state-dependant descriptions
Path _pathType; // Describe path object follows
int _vxPath, _vyPath; // Delta velocities (e.g. for CHASE)
uint16 _actIndex; // Action list to do on collision with hero
byte _seqNumb; // Number of sequences in list
Seq *_currImagePtr; // Sequence image currently in use
SeqList _seqList[kMaxSeqNumb]; // Array of sequence structure ptrs and lengths
Cycle _cycling; // Whether cycling, forward or backward
byte _cycleNumb; // No. of times to cycle
byte _frameInterval; // Interval (in ticks) between frames
byte _frameTimer; // Decrementing timer for above
int8 _radius; // Defines sphere of influence by hero
byte _screenIndex; // Screen in which object resides
int _x, _y; // Current coordinates of object
int _oldx, _oldy; // Previous coordinates of object
int8 _vx, _vy; // Velocity
byte _objValue; // Value of object
int _genericCmd; // Bit mask of 'generic' commands for object
uint16 _cmdIndex; // ptr to list of cmd structures for verbs
bool _carriedFl; // TRUE if object being carried
byte _state; // state referenced in cmd list
bool _verbOnlyFl; // TRUE if verb-only cmds allowed e.g. sit,look
byte _priority; // Whether object fore, background or floating
int16 _viewx, _viewy; // Position to view object from (or 0 or -1)
int16 _direction; // Direction to view object from
byte _curSeqNum; // Save which seq number currently in use
byte _curImageNum; // Save which image of sequence currently in use
int8 _oldvx; // Previous vx (used in wandering)
int8 _oldvy; // Previous vy
};
} // End of namespace Hugo
#endif
|