From 78312544a612a3ff339a96ae00eeb15363e031e3 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Mon, 9 Jul 2012 15:46:41 +0100 Subject: DEVTOOLS: Fix create_teenagent to use dialog string tables. This removes the extended data segment blob and replaces it with a set of dialog string tables. Have checked that the teenagent.dat output file produced is identical. --- devtools/create_teenagent/create_teenagent.cpp | 104 ++++++++----------------- 1 file changed, 31 insertions(+), 73 deletions(-) (limited to 'devtools/create_teenagent/create_teenagent.cpp') diff --git a/devtools/create_teenagent/create_teenagent.cpp b/devtools/create_teenagent/create_teenagent.cpp index ee0e9ca0dc..40241eee7e 100644 --- a/devtools/create_teenagent/create_teenagent.cpp +++ b/devtools/create_teenagent/create_teenagent.cpp @@ -36,7 +36,6 @@ #include "static_tables.h" int main(int argc, char *argv[]) { -/* const char *dat_name = "teenagent.dat"; FILE *fout = fopen(dat_name, "wb"); @@ -55,85 +54,44 @@ int main(int argc, char *argv[]) { exit(1); } - if (fwrite(eseg, ESEG_SIZE, 1, fout) != 1) { - perror("Writing second data segment"); - exit(1); - } - - fclose(fout); - - fprintf(stderr, "please run \"gzip -n %s\"\n", dat_name); -*/ - - printf("#define ANIM_WAIT \"\\xff\"\n"); - printf("#define NEW_LINE \"\\n\"\n"); - printf("#define DISPLAY_MESSAGE \"\\n\\n\"\n"); - printf("#define CHANGE_CHARACTER \"\\n\\n\\n\"\n"); - printf("#define END_DIALOG \"\\n\\n\\n\\n\"\n"); - printf("\n"); - int dialog_num = 0; - printf("const static char* dialog_%d[] = {\n", dialog_num); - int n = 0; - uint8 last = 0xff; - for (int i = 0; i < ESEG_SIZE; i++) { - if ((eseg[i] != 0x00 && last == 0x00) || n == 4) { - switch (n) { - case 1: - printf("\tNEW_LINE,\n"); - break; - case 2: - printf("\tDISPLAY_MESSAGE,\n"); - break; - case 3: - printf("\tCHANGE_CHARACTER,\n"); - break; - case 4: - dialog_num++; - printf("\tEND_DIALOG\n};\n\n"); - printf("const static char* dialog_%d[] = {\n", dialog_num); - break; - default: - fprintf(stderr, "ERROR: %d is too many nulls\n", n); - break; + // Write out dialog string block + static const char nulls[6] = "\0\0\0\0\0"; + for (uint i = 0; i < (sizeof(dialogs)/sizeof(char**)); i++) { + //printf("Writing Dialog #%d\n", i); + bool dialogEnd = false; + uint j = 0; + while (!dialogEnd) { + uint nullCount = 0; + if (strcmp(dialogs[i][j], NEW_LINE) == 0) { + nullCount = 1; + } else if (strcmp(dialogs[i][j], DISPLAY_MESSAGE) == 0) { + nullCount = 2; + } else if (strcmp(dialogs[i][j], CHANGE_CHARACTER) == 0) { + nullCount = 3; + } else if (strcmp(dialogs[i][j], END_DIALOG) == 0) { + nullCount = 4; + dialogEnd = true; + } else { // Deals with normal dialogue and ANIM_WAIT cases + if (fwrite(dialogs[i][j], 1, strlen(dialogs[i][j]), fout) != strlen(dialogs[i][j])) { + perror("Writing dialog string"); + exit(1); + } } - n = 0; - } - switch (eseg[i]) { - case 0x00: - n++; - if (!(last == 0x00 || last == 0xff)) - printf("\",\n"); - break; - case 0xff: - if (!(last == 0x00 || last == 0xff)) - printf("\",\n"); - printf("\tANIM_WAIT,\n"); - break; - default: - if ((last == 0x00 || last == 0xff)) - printf("\t\""); + if (nullCount != 0 && nullCount < 5) { + if (fwrite(nulls, 1, nullCount, fout) != nullCount) { + perror("Writing dialog string nulls"); + exit(1); + } + } - if (eseg[i] >= 32 && eseg[i] <= 126) { - if (eseg[i] == '\"') - printf("\\"); - printf("%c", eseg[i]); - } else fprintf(stderr, "ERROR: eseg[%d]:0x%02x is outside range\n", i, eseg[i]); - break; + j++; } - - last = eseg[i]; } - if (n == 4) { - dialog_num++; - printf("\tEND_DIALOG\n};\n"); - } else fprintf(stderr, "ERROR: premature end of data\n"); + fclose(fout); - printf("\nconst static char** dialogs[] = {\n"); - for (int i = 0; i < dialog_num; i++) - printf("\tdialog_%d%s\n", i, (i == dialog_num-1) ? "" : ","); - printf("};\n"); + fprintf(stderr, "please run \"gzip -n %s\"\n", dat_name); return 0; } -- cgit v1.2.3