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 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
|
/* 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) 1994-1998 Revolution Software Ltd.
*
* 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 SWORD2_HEADER_H
#define SWORD2_HEADER_H
#include "common/endian.h"
namespace Sword2 {
//----------------------------------------------------------
// SYSTEM FILE & FRAME HEADERS
//----------------------------------------------------------
//----------------------------------------------------------
// ALL FILES
//----------------------------------------------------------
// Standard File Header
#define NAME_LEN 34
struct ResHeader {
uint8 fileType; // Byte to define file type (see below)
uint8 compType; // Type of file compression used ie.
// on whole file (see below)
uint32 compSize; // Length of compressed file (ie.
// length on disk)
uint32 decompSize; // Length of decompressed file held in
// memory (NB. frames still held
// compressed)
byte name[NAME_LEN]; // Name of object
static int size() {
return 44;
}
void read(byte *addr);
void write(byte *addr);
};
// fileType
enum {
// 0 something's wrong!
ANIMATION_FILE = 1, // All normal animations & sprites
// including mega-sets & font files
// which are the same format (but all
// frames always uncompressed)
SCREEN_FILE = 2, // Each contains background, palette,
// layer sprites, parallax layers &
// shading mask
GAME_OBJECT = 3, // Each contains object hub +
// structures + script data
WALK_GRID_FILE = 4, // Walk-grid data
GLOBAL_VAR_FILE = 5, // All the global script variables in
// one file; "there can be only one"
PARALLAX_FILE_null = 6, // NOT USED
RUN_LIST = 7, // Each contains a list of object
// resource id's
TEXT_FILE = 8, // Each contains all the lines of text
// for a location or a character's
// conversation script
SCREEN_MANAGER = 9, // One for each location; this contains
// special startup scripts
MOUSE_FILE = 10, // Mouse pointers and luggage icons
// (sprites in General / Mouse pointers
// & Luggage icons)
WAV_FILE = 11, // WAV file
ICON_FILE = 12, // Menu icon (sprites in General / Menu
// icons)
PALETTE_FILE = 13 // separate palette file (see also
// _paletteHeader)
};
// compType
enum {
NO_COMPRESSION = 0,
FILE_COMPRESSION = 1 // standard whole-file compression
// (not yet devised!)
};
//----------------------------------------------------------
// (1) ANIMATION FILES
//----------------------------------------------------------
// an animation file consists of:
//
// standard file header
// animation header
// a string of CDT entries (one per frame of the anim)
// a 16-byte color table ONLY if (runTimeComp==RLE16)
// a string of groups of (frame header + frame data)
// Animation Header
struct AnimHeader {
uint8 runTimeComp; // Type of runtime compression used for the
// frame data (see below)
uint16 noAnimFrames; // Number of frames in the anim (ie. no. of
// CDT entries)
uint16 feetStartX; // Start coords for mega to walk to, before
uint16 feetStartY; // running anim
uint8 feetStartDir; // Direction to start in before running anim
uint16 feetEndX; // End coords for mega to stand at after
uint16 feetEndY; // running anim (vital if anim starts from an
// off-screen position, or ends in a different
// place from the start)
uint8 feetEndDir; // Direction to start in after running anim
uint16 blend;
static int size() {
return 15;
}
void read(byte *addr);
void write(byte *addr);
};
// runtimeComp - compression used on each frame of the anim
enum {
NONE = 0, // No frame compression
RLE256 = 1, // James's RLE for 256-color sprites
RLE16 = 2 // James's RLE for 16- or 17-color sprites
// (raw blocks have max 16 colors for 2 pixels
// per byte, so '0's are encoded only as FLAT
// for 17-color sprites eg. George's mega-set)
};
// CDT Entry
struct CdtEntry {
int16 x; // sprite x-coord OR offset to add to mega's
// feet x-coord to calc sprite y-coord
int16 y; // sprite y-coord OR offset to add to mega's
// feet y-coord to calc sprite y-coord
uint32 frameOffset; // points to start of frame header (from start
// of file header)
uint8 frameType; // 0 = print sprite normally with top-left
// corner at (x,y), otherwise see below...
static int size();
void read(byte *addr);
void write(byte *addr);
};
// 'frameType' bit values
enum {
FRAME_OFFSET = 1, // Print at (feetX + x, feetY + y), with
// scaling according to feetY
FRAME_FLIPPED = 2, // Print the frame flipped Left->Right
FRAME_256_FAST = 4 // Frame has been compressed using Pauls fast
// RLE 256 compression.
};
// Frame Header
struct FrameHeader {
uint32 compSize; // Compressed size of frame - NB. compression
// type is now in Anim Header
uint16 width; // Dimensions of frame
uint16 height;
static int size() {
return 8;
}
void read(byte *addr);
void write(byte *addr);
};
//----------------------------------------------------------
// (2) SCREEN FILES
//----------------------------------------------------------
// a screen file consists of:
//
// standard file header
// multi screen header
// 4 * 256 bytes of palette data
// 256k palette match table
// 2 background parallax layers
// 1 background layer with screen header
// 2 foreground parallax layers
// a string of layer headers
// a string of layer masks
// Multi screen header
// Goes at the beginning of a screen file after the standard header.
// Gives offsets from start of table of each of the components
struct MultiScreenHeader {
uint32 palette;
uint32 bg_parallax[2];
uint32 screen;
uint32 fg_parallax[2];
uint32 layers;
uint32 paletteTable;
uint32 maskOffset;
static int size() {
return 36;
}
void read(byte *addr);
void write(byte *addr);
};
// Screen Header
struct ScreenHeader {
uint16 width; // dimensions of the background screen
uint16 height;
uint16 noLayers; // number of layer areas
static int size() {
return 6;
}
void read(byte *addr);
void write(byte *addr);
};
// Layer Header
// Note that all the layer headers are kept together, rather than being placed
// before each layer mask, in order to simplify the sort routine.
struct LayerHeader {
uint16 x; // coordinates of top-left pixel of area
uint16 y;
uint16 width;
uint16 height;
uint32 maskSize;
uint32 offset; // where to find mask data (from start of
// standard file header)
static int size() {
return 16;
}
void read(byte *addr);
void write(byte *addr);
};
//----------------------------------------------------------
// (3) SCRIPT OBJECT FILES
//----------------------------------------------------------
// a script object file consists of:
//
// standard file header
// script object header
// script object data
//----------------------------------------------------------
// (5) PALETTE FILES
//----------------------------------------------------------
// a palette file consists of:
//
// standard file header
// 4 * 256 bytes of palette data
// 256k palette match table
// an object hub - which represents all that remains of the compact concept
class ObjectHub {
// int32 type; // type of object
// uint32 logic_level; // what level?
// uint32 logic[3] // NOT USED
// uint32 script_id[3] // need this if script
// uint32 script_pc[3] // need this also
private:
byte *_addr;
public:
ObjectHub() {
_addr = NULL;
}
static int size() {
return 44;
}
byte *data() {
return _addr;
}
void setAddress(byte *addr) {
_addr = addr;
}
byte *getScriptPcPtr(int level) {
return _addr + 32 + 4 * level;
}
uint32 getLogicLevel() {
return READ_LE_UINT32(_addr + 4);
}
uint32 getScriptId(int level) {
return READ_LE_UINT32(_addr + 20 + 4 * level);
}
uint32 getScriptPc(int level) {
return READ_LE_UINT32(_addr + 32 + 4 * level);
}
void setLogicLevel(uint32 x) {
WRITE_LE_UINT32(_addr + 4, x);
}
void setScriptId(int level, uint32 x) {
WRITE_LE_UINT32(_addr + 20 + 4 * level, x);
}
void setScriptPc(int level, uint32 x) {
WRITE_LE_UINT32(_addr + 32 + 4 * level, x);
}
};
// (6) text module header
struct TextHeader {
uint32 noOfLines; // how many lines of text are there in this
// module
static int size() {
return 4;
}
void read(byte *addr);
void write(byte *addr);
};
// a text file has:
//
// ResHeader
// TextHeader
// look up table, to
// line of text,0
// line of text,0
//----------------------------------------------------------
// SCREENS.CLU file
//----------------------------------------------------------
// This file is present in PSX version of the game only.
// It keeps parallax and background images, aligned at 1024 bytes
// for faster access by the psx cd drive.
//
// SCREENS.CLU structure:
// In first 2048 Bytes there's an offset table. Each entry is an
// 32bit offset for a background/parallax group. If entry is 0, screen
// does not exist.
// To find matching screen for the location, you must count LOCATION_NO
// words and then go to the corresponding offset indicated by last 32bit
// word.
// Each screen then begins with a PSXScreensEntry entry:
struct PSXScreensEntry {
uint16 fgPlxXres; // If these values are 0, subsequent fgPlx* values must be
uint16 fgPlxYres; // ignored, as this means foreground parallax is not present.
uint32 fgPlxOffset; // This offset is relative, counting from the beginning of Resource Header
uint32 fgPlxSize; // Size of parallax, the size is aligned at 1024 bytes.
// fgPlxSize/1024 gives number of sector the parallax is divided into.
uint16 bgXres;
uint16 bgYres;
uint32 bgOffset; // relative
uint32 bgSize;
uint16 bgPlxXres; // same considerations for fg parallaxes apply
uint16 bgPlxYres;
uint32 bgPlxOffset; // relative
uint32 bgPlxSize;
static int size() {
return 36;
}
void read(byte *addr);
void write(byte *addr);
};
// PSXFontEntry is present in font resource file, it is used
// to address a single char in the character atlas image.
struct PSXFontEntry {
uint16 offset;
uint16 skipLines;
uint16 charWidth;
uint16 charHeight;
static int size() {
return 8;
}
void read(byte *addr);
void write(byte *addr);
};
} // End of namespace Sword2
#endif
|