/* 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. * * $URL$ * $Id$ * */ #ifndef __CREATELURE_DAT__ #define __CREATELURE_DAT__ #include "common/endian.h" #include "common/util.h" #define VERSION_MAJOR 1 #define VERSION_MINOR 28 #define DIALOG_SIZE 0x150 #define TALK_DIALOG_SIZE 0x30 #define PALETTE_OFFSET 0xc0a7 #define PALETTE_SIZE 0x300 #define ROOM_NUM_ENTRIES 51 #define HOTSPOT_OVERRIDE_OFFSET 0x2A01 #define SCRIPT_SEGMENT_SIZE 0x2c57 #define SCRIPT2_SEGMENT_SIZE 0x2800 #define FIGHT_SEGMENT_SIZE 0x1850 #define HOTSPOT_SCRIPT_SIZE 0x30 #define MAX_NUM_ANIM_RECORDS 0x200 #define MAX_NUM_ACTION_RECORDS 0x100 #define NUM_ROOM_EXITS 50 #define MESSAGES_SEGMENT_SIZE 0x490 #define MAX_HOTSPOTS 0x100 #define MAX_DATA_SIZE 0x4000 #define PATHFIND_SIZE (120 * ROOM_NUM_ENTRIES) #define EXIT_COORDINATES_OFFSET 0x1929 #define EXIT_COORDINATES_NUM_ROOMS 49 #define TABLED_ACTIONS_OFFSET 0x1380 #define NUM_TABLED_ACTION_BLOCKS 33 #define RANDOM_ROOM_NUM_ENTRIES 41 #define SOUND_DESCS_SIZE 265 #include "common/pack-start.h" // START STRUCT PACKING // FIXME: Add PACKED_STRUCT to all structs which actually need packing, // for increased portability // Rect currently copied from common/rect.h - if I try directly including it, // the link complains about an unresolved external token Common.String.__dtor struct Rect { int16 top, left; //!< The point at the top left of the rectangle (part of the rect). int16 bottom, right; //!< The point at the bottom right of the rectangle (not part of the rect). }; struct FileEntry { uint16 id; byte unused; byte sizeExtension; uint16 size; uint16 offset; }; struct RoomHeaderEntry { uint16 offset; uint16 roomNumber; uint16 descId; uint16 unused; byte hdrFlags; }; struct HotspotHeaderEntry { uint16 offset; uint16 resourceId; uint16 descId, descId2; byte hdrFlags; }; struct HotspotResource { uint32 actions; uint16 actionsOffset; uint16 roomNumber; byte scriptLoadFlag; uint16 loadOffset; uint16 unused; uint16 startX; uint16 startY; uint16 width; uint16 height; byte layer; byte flags; uint16 tickProcOffset; uint16 widthCopy; uint16 heightCopy; uint16 yCorrection; uint16 tickTimeout; uint16 animOffset; byte colourOffset; uint16 hotspotScriptOffset; byte unused1[7]; uint16 talkScriptOffset; byte unused2[6]; int8 talkX; int8 talkY; byte unused3[11]; uint16 delayCtr; uint8 characterMode; uint16 tickSequenceOffset; }; struct CurrentActionInput { uint8 action; uint16 dataOffset; uint16 roomNumber; }; struct HotspotResourceOutput { uint16 hotspotId; uint16 nameId; uint16 descId; uint16 descId2; uint32 actions; uint16 actionsOffset; uint16 roomNumber; byte layer; byte scriptLoadFlag; uint16 loadOffset; uint16 startX; uint16 startY; uint16 width; uint16 height; uint16 widthCopy; uint16 heightCopy; uint16 yCorrection; int16 walkX; uint16 walkY; int8 talkX; int8 talkY; uint16 colourOffset; uint16 animRecordId; uint16 hotspotScriptOffset; uint16 talkScriptOffset; uint16 tickProcId; uint16 tickTimeout; uint16 tickSequenceOffset; uint16 npcSchedule; uint16 characterMode; uint16 delayCtr; byte flags; byte hdrFlags; }; struct RoomResource { uint32 actions; uint16 unknown1; uint16 pixelListOffset; byte numLayers; uint16 layers[4]; uint16 sequenceOffset; uint32 exitTime; uint8 areaFlag; uint8 walkBoundsIndex; int16 clippingXStart; int16 clippingXEnd; }; struct RoomRectIn { uint16 xs, xe; uint16 ys, ye; }; struct RoomRectOut { int16 xs, xe; int16 ys, ye; }; struct RoomResourceOutput { uint16 roomNumber; uint8 hdrFlags; uint8 unused; uint32 actions; uint16 descId; uint16 numLayers; uint16 layers[4]; uint16 sequenceOffset; int16 clippingXStart; int16 clippingXEnd; uint8 areaFlag; uint8 numExits; uint32 exitTime; RoomRectOut walkBounds; }; struct RoomResourceExit1 { int16 xs, xe, ys, ye; uint16 sequenceOffset; }; struct RoomResourceExit2 { uint8 newRoom; uint8 direction; int16 newRoomX, newRoomY; }; struct HotspotOverride { uint16 hotspotId; uint16 xs, xe, ys, ye; }; struct AnimRecord { uint16 animId; uint8 flags; uint8 unused[6]; uint16 upOffset; uint16 downOffset; uint16 leftOffset; uint16 rightOffset; uint8 upFrame; uint8 downFrame; uint8 leftFrame; uint8 rightFrame; }; struct AnimRecordOutput { uint16 animRecordId; uint16 animId; uint16 flags; uint16 upOffset; uint16 downOffset; uint16 leftOffset; uint16 rightOffset; uint8 upFrame; uint8 downFrame; uint8 leftFrame; uint8 rightFrame; }; struct MovementRecord { uint16 frameNumber; int16 xChange; int16 yChange; }; struct RoomExitHotspotRecord { int16 xs, xe; int16 ys, ye; uint16 cursorNum; uint16 hotspotId; uint16 destRoomNumber; }; struct RoomExitHotspotOutputRecord { uint16 hotspotId; int16 xs, xe; int16 ys, ye; uint16 cursorNum; uint16 destRoomNumber; }; struct RoomExitHotspotJoinRecord { uint16 hotspot1Id; byte h1CurrentFrame; byte h1DestFrame; byte h1OpenSound; byte h1CloseSound; uint16 hotspot2Id; byte h2CurrentFrame; byte h2DestFrame; byte h2OpenSound; byte h2CloseSound; byte blocked; }; struct HotspotActionSequenceRecord { byte actionNumber; uint16 sequenceOffset; }; struct HotspotActionsRecord { uint16 recordId; uint16 offset; }; struct RoomExitCoordinateResource { int16 x; int16 y; uint16 roomNumber; }; struct HotspotWalkToRecord { uint16 hotspotId; int16 x; uint16 y; }; struct RoomExitIndexedHotspotResource { uint8 roomNumber; uint8 hotspotIndex; uint16 hotspotId; }; #define ROOM_EXIT_COORDINATES_NUM_ENTRIES 6 #define ROOM_EXIT_COORDINATES_ENTRY_NUM_ROOMS 52 struct RoomExitCoordinateEntryInputResource { RoomExitCoordinateResource entries[ROOM_EXIT_COORDINATES_NUM_ENTRIES]; uint8 roomIndex[ROOM_EXIT_COORDINATES_ENTRY_NUM_ROOMS]; }; struct RoomExitCoordinateEntryOutputResource { uint8 roomIndex[ROOM_EXIT_COORDINATES_ENTRY_NUM_ROOMS]; RoomExitCoordinateResource entries[ROOM_EXIT_COORDINATES_NUM_ENTRIES]; }; enum CurrentAction {NO_ACTION, START_WALKING, DISPATCH_ACTION, EXEC_HOTSPOT_SCRIPT, PROCESSING_PATH, WALKING}; extern void read_action_sequence(byte *&data, uint16 &totalSize); extern uint16 get_sequence_index(uint16 offset, int supportIndex = -1); #include "common/pack-end.h" // END STRUCT PACKING enum AccessMode { kFileReadMode = 1, kFileWriteMode = 2 }; class File { private: FILE *f; public: bool open(const char *filename, AccessMode mode = kFileReadMode) { f = fopen(filename, (mode == kFileReadMode) ? "rb" : "wb"); return (f != NULL); } void close() { fclose(f); f = NULL; } int seek(int32 offset, int whence = SEEK_SET) { return fseek(f, offset, whence); } long read(void *buffer, int len) { return fread(buffer, 1, len, f); } void write(const void *buffer, int len) { fwrite(buffer, 1, len, f); } byte readByte() { byte v; read(&v, sizeof(byte)); return v; } uint16 readWord() { uint16 v; read(&v, sizeof(uint16)); return FROM_LE_16(v); } uint16 readLong() { uint32 v; read(&v, sizeof(uint32)); return FROM_LE_32(v); } void writeByte(byte v) { write(&v, sizeof(byte)); } void writeWord(uint16 v) { uint16 vTemp = TO_LE_16(v); write(&vTemp, sizeof(uint16)); } void writeLong(uint32 v) { uint32 vTemp = TO_LE_32(v); write(&vTemp, sizeof(uint32)); } uint32 pos() { return ftell(f); } }; extern File lureExe; extern void add_talk_offset(uint16 offset); extern Common::Language language; extern uint16 dataSegment; extern void errorExit(const char *msg); #endif