aboutsummaryrefslogtreecommitdiff
path: root/tools/create_igortbl/create_igortbl.c
diff options
context:
space:
mode:
authorGregory Montoir2007-10-30 22:35:10 +0000
committerGregory Montoir2007-10-30 22:35:10 +0000
commit2a1c68b8a683333616a6373b01adb71b17aab8eb (patch)
treec072396765f6f40b97dc36c0768d41ca4909ceea /tools/create_igortbl/create_igortbl.c
parentbb0bbdef57265d3bbf729399f80cd00759cd82d1 (diff)
downloadscummvm-rg350-2a1c68b8a683333616a6373b01adb71b17aab8eb.tar.gz
scummvm-rg350-2a1c68b8a683333616a6373b01adb71b17aab8eb.tar.bz2
scummvm-rg350-2a1c68b8a683333616a6373b01adb71b17aab8eb.zip
- added detection of second demo version
- moved the resource entries tables to an external file (IGOR.TBL) - added tool to build IGOR.TBL svn-id: r29332
Diffstat (limited to 'tools/create_igortbl/create_igortbl.c')
-rw-r--r--tools/create_igortbl/create_igortbl.c131
1 files changed, 131 insertions, 0 deletions
diff --git a/tools/create_igortbl/create_igortbl.c b/tools/create_igortbl/create_igortbl.c
new file mode 100644
index 0000000000..41bcaa5661
--- /dev/null
+++ b/tools/create_igortbl/create_igortbl.c
@@ -0,0 +1,131 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "../../engines/igor/resource_ids.h"
+
+/*
+ uint32 : 'ITBL'
+ uint32 : version/tag
+ uint8 : number of game versions
+ repeat (number of game versions) {
+ uint32 : borland overlay size
+ uint32 : offset to resource table
+ }
+ repeat (number of game versions) {
+ repeat (number of resources tables) {
+ uint16 : number of entries
+ repeat (number of entries) {
+ uint16 : id
+ uint32 : offset
+ uint32 : length
+ }
+ }
+ }
+*/
+
+#define MAX_VERSIONS 2
+
+typedef unsigned char uint8;
+typedef unsigned short uint16;
+typedef unsigned int uint32;
+
+struct ResourceEntry {
+ int id;
+ uint32 offs;
+ uint32 size;
+};
+
+static const int _sizeOfResourceEntry = 10;
+
+static const struct ResourceEntry _resourceEntriesEngDemo100[] = {
+#include "resource_en_demo100.h"
+ { 0, 0, 0 }
+};
+
+static const struct ResourceEntry _resourceEntriesEngDemo110[] = {
+#include "resource_en_demo110.h"
+ { 0, 0, 0 }
+};
+
+struct GameVersion {
+ uint32 borlandOverlaySize;
+ const struct ResourceEntry *resourceEntries;
+};
+
+static const struct GameVersion _gameVersions[] = {
+ { 4086790, &_resourceEntriesEngDemo100[0] },
+ { 4094103, &_resourceEntriesEngDemo110[0] },
+ { 0, 0 }
+};
+
+static void writeByte(FILE *fp, uint8 b) {
+ fwrite(&b, 1, 1, fp);
+}
+
+static void writeUint16BE(FILE *fp, uint16 value) {
+ writeByte(fp, (uint8)(value >> 8));
+ writeByte(fp, (uint8)(value & 0xFF));
+}
+
+static void writeUint32BE(FILE *fp, uint32 value) {
+ writeUint16BE(fp, (uint16)(value >> 16));
+ writeUint16BE(fp, (uint16)(value & 0xFFFF));
+}
+
+static void writeResourceEntry(FILE *fp, const struct ResourceEntry *re) {
+ writeUint16BE(fp, re->id);
+ writeUint32BE(fp, re->offs);
+ writeUint32BE(fp, re->size);
+}
+
+static const uint32 ITBL_TAG = 0x4954424C;
+static const uint32 CURRENT_VERSION = 1;
+
+static void createTableFile(FILE *fp) {
+ int i, j, gameVersionsCount;
+ uint32 resourceEntriesTableSize[MAX_VERSIONS];
+ uint32 resourceEntriesTableOffs[MAX_VERSIONS];
+
+ /* get resource entries tables size */
+ for (i = 0; _gameVersions[i].resourceEntries; ++i) {
+ assert(i <= MAX_VERSIONS);
+ resourceEntriesTableSize[i] = 0;
+ for (j = 0; _gameVersions[i].resourceEntries[j].id != 0; ++j) {
+ ++resourceEntriesTableSize[i];
+ }
+ }
+ gameVersionsCount = i;
+
+ /* header */
+ writeUint32BE(fp, ITBL_TAG);
+ writeUint32BE(fp, CURRENT_VERSION);
+
+ /* game versions header */
+ writeByte(fp, gameVersionsCount);
+ resourceEntriesTableOffs[0] = 9 + gameVersionsCount * 8;
+ for (i = 1; i < gameVersionsCount; ++i) {
+ resourceEntriesTableOffs[i] = resourceEntriesTableOffs[i - 1] + 2 + resourceEntriesTableSize[i - 1] * _sizeOfResourceEntry;
+ }
+ for (i = 0; i < gameVersionsCount; ++i) {
+ writeUint32BE(fp, _gameVersions[i].borlandOverlaySize);
+ writeUint32BE(fp, resourceEntriesTableOffs[i]);
+ }
+
+ /* resource entries tables */
+ for (i = 0; _gameVersions[i].resourceEntries; ++i) {
+ writeUint16BE(fp, resourceEntriesTableSize[i]);
+ for (j = 0; _gameVersions[i].resourceEntries[j].id != 0; ++j) {
+ writeResourceEntry(fp, &_gameVersions[i].resourceEntries[j]);
+ }
+ }
+}
+
+int main(int argc, char *argv[]) {
+ FILE *fp = fopen("IGOR.TBL", "wb");
+ if (fp) {
+ createTableFile(fp);
+ fclose(fp);
+ }
+ return 0;
+}