// // Copyright(C) 2005-2014 Simon Howard // Copyright(C) 2014 Fabian Greffrath // // 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. // // // Parses [STRINGS] sections in BEX files // #include #include #include "deh_defs.h" #include "deh_io.h" #include "deh_main.h" #include "dstrings.h" typedef struct { char *macro; char *string; } bex_string_t; // mnemonic keys table static const bex_string_t bex_stringtable[] = { // part 1 - general initialization and prompts {"D_DEVSTR", D_DEVSTR}, {"D_CDROM", D_CDROM}, {"QUITMSG", QUITMSG}, {"LOADNET", LOADNET}, {"QLOADNET", QLOADNET}, {"QSAVESPOT", QSAVESPOT}, {"SAVEDEAD", SAVEDEAD}, {"QSPROMPT", QSPROMPT}, {"QLPROMPT", QLPROMPT}, {"NEWGAME", NEWGAME}, {"NIGHTMARE", NIGHTMARE}, {"SWSTRING", SWSTRING}, {"MSGOFF", MSGOFF}, {"MSGON", MSGON}, {"NETEND", NETEND}, {"ENDGAME", ENDGAME}, {"DETAILHI", DETAILHI}, {"DETAILLO", DETAILLO}, {"GAMMALVL0", GAMMALVL0}, {"GAMMALVL1", GAMMALVL1}, {"GAMMALVL2", GAMMALVL2}, {"GAMMALVL3", GAMMALVL3}, {"GAMMALVL4", GAMMALVL4}, {"EMPTYSTRING", EMPTYSTRING}, {"GGSAVED", GGSAVED}, {"SAVEGAMENAME", SAVEGAMENAME}, // part 2 - messages when the player gets things {"GOTARMOR", GOTARMOR}, {"GOTMEGA", GOTMEGA}, {"GOTHTHBONUS", GOTHTHBONUS}, {"GOTARMBONUS", GOTARMBONUS}, {"GOTSTIM", GOTSTIM}, {"GOTMEDINEED", GOTMEDINEED}, {"GOTMEDIKIT", GOTMEDIKIT}, {"GOTSUPER", GOTSUPER}, {"GOTBLUECARD", GOTBLUECARD}, {"GOTYELWCARD", GOTYELWCARD}, {"GOTREDCARD", GOTREDCARD}, {"GOTBLUESKUL", GOTBLUESKUL}, {"GOTYELWSKUL", GOTYELWSKUL}, {"GOTREDSKULL", GOTREDSKULL}, {"GOTINVUL", GOTINVUL}, {"GOTBERSERK", GOTBERSERK}, {"GOTINVIS", GOTINVIS}, {"GOTSUIT", GOTSUIT}, {"GOTMAP", GOTMAP}, {"GOTVISOR", GOTVISOR}, {"GOTMSPHERE", GOTMSPHERE}, {"GOTCLIP", GOTCLIP}, {"GOTCLIPBOX", GOTCLIPBOX}, {"GOTROCKET", GOTROCKET}, {"GOTROCKBOX", GOTROCKBOX}, {"GOTCELL", GOTCELL}, {"GOTCELLBOX", GOTCELLBOX}, {"GOTSHELLS", GOTSHELLS}, {"GOTSHELLBOX", GOTSHELLBOX}, {"GOTBACKPACK", GOTBACKPACK}, {"GOTBFG9000", GOTBFG9000}, {"GOTCHAINGUN", GOTCHAINGUN}, {"GOTCHAINSAW", GOTCHAINSAW}, {"GOTLAUNCHER", GOTLAUNCHER}, {"GOTPLASMA", GOTPLASMA}, {"GOTSHOTGUN", GOTSHOTGUN}, {"GOTSHOTGUN2", GOTSHOTGUN2}, // part 3 - messages when keys are needed {"PD_BLUEO", PD_BLUEO}, {"PD_REDO", PD_REDO}, {"PD_YELLOWO", PD_YELLOWO}, {"PD_BLUEK", PD_BLUEK}, {"PD_REDK", PD_REDK}, {"PD_YELLOWK", PD_YELLOWK}, // part 4 - multiplayer messaging {"HUSTR_MSGU", HUSTR_MSGU}, {"HUSTR_MESSAGESENT", HUSTR_MESSAGESENT}, {"HUSTR_CHATMACRO0", HUSTR_CHATMACRO0}, {"HUSTR_CHATMACRO1", HUSTR_CHATMACRO1}, {"HUSTR_CHATMACRO2", HUSTR_CHATMACRO2}, {"HUSTR_CHATMACRO3", HUSTR_CHATMACRO3}, {"HUSTR_CHATMACRO4", HUSTR_CHATMACRO4}, {"HUSTR_CHATMACRO5", HUSTR_CHATMACRO5}, {"HUSTR_CHATMACRO6", HUSTR_CHATMACRO6}, {"HUSTR_CHATMACRO7", HUSTR_CHATMACRO7}, {"HUSTR_CHATMACRO8", HUSTR_CHATMACRO8}, {"HUSTR_CHATMACRO9", HUSTR_CHATMACRO9}, {"HUSTR_TALKTOSELF1", HUSTR_TALKTOSELF1}, {"HUSTR_TALKTOSELF2", HUSTR_TALKTOSELF2}, {"HUSTR_TALKTOSELF3", HUSTR_TALKTOSELF3}, {"HUSTR_TALKTOSELF4", HUSTR_TALKTOSELF4}, {"HUSTR_TALKTOSELF5", HUSTR_TALKTOSELF5}, {"HUSTR_PLRGREEN", HUSTR_PLRGREEN}, {"HUSTR_PLRINDIGO", HUSTR_PLRINDIGO}, {"HUSTR_PLRBROWN", HUSTR_PLRBROWN}, {"HUSTR_PLRRED", HUSTR_PLRRED}, // part 5 - level names in the automap {"HUSTR_E1M1", HUSTR_E1M1}, {"HUSTR_E1M2", HUSTR_E1M2}, {"HUSTR_E1M3", HUSTR_E1M3}, {"HUSTR_E1M4", HUSTR_E1M4}, {"HUSTR_E1M5", HUSTR_E1M5}, {"HUSTR_E1M6", HUSTR_E1M6}, {"HUSTR_E1M7", HUSTR_E1M7}, {"HUSTR_E1M8", HUSTR_E1M8}, {"HUSTR_E1M9", HUSTR_E1M9}, {"HUSTR_E2M1", HUSTR_E2M1}, {"HUSTR_E2M2", HUSTR_E2M2}, {"HUSTR_E2M3", HUSTR_E2M3}, {"HUSTR_E2M4", HUSTR_E2M4}, {"HUSTR_E2M5", HUSTR_E2M5}, {"HUSTR_E2M6", HUSTR_E2M6}, {"HUSTR_E2M7", HUSTR_E2M7}, {"HUSTR_E2M8", HUSTR_E2M8}, {"HUSTR_E2M9", HUSTR_E2M9}, {"HUSTR_E3M1", HUSTR_E3M1}, {"HUSTR_E3M2", HUSTR_E3M2}, {"HUSTR_E3M3", HUSTR_E3M3}, {"HUSTR_E3M4", HUSTR_E3M4}, {"HUSTR_E3M5", HUSTR_E3M5}, {"HUSTR_E3M6", HUSTR_E3M6}, {"HUSTR_E3M7", HUSTR_E3M7}, {"HUSTR_E3M8", HUSTR_E3M8}, {"HUSTR_E3M9", HUSTR_E3M9}, {"HUSTR_E4M1", HUSTR_E4M1}, {"HUSTR_E4M2", HUSTR_E4M2}, {"HUSTR_E4M3", HUSTR_E4M3}, {"HUSTR_E4M4", HUSTR_E4M4}, {"HUSTR_E4M5", HUSTR_E4M5}, {"HUSTR_E4M6", HUSTR_E4M6}, {"HUSTR_E4M7", HUSTR_E4M7}, {"HUSTR_E4M8", HUSTR_E4M8}, {"HUSTR_E4M9", HUSTR_E4M9}, {"HUSTR_1", HUSTR_1}, {"HUSTR_2", HUSTR_2}, {"HUSTR_3", HUSTR_3}, {"HUSTR_4", HUSTR_4}, {"HUSTR_5", HUSTR_5}, {"HUSTR_6", HUSTR_6}, {"HUSTR_7", HUSTR_7}, {"HUSTR_8", HUSTR_8}, {"HUSTR_9", HUSTR_9}, {"HUSTR_10", HUSTR_10}, {"HUSTR_11", HUSTR_11}, {"HUSTR_12", HUSTR_12}, {"HUSTR_13", HUSTR_13}, {"HUSTR_14", HUSTR_14}, {"HUSTR_15", HUSTR_15}, {"HUSTR_16", HUSTR_16}, {"HUSTR_17", HUSTR_17}, {"HUSTR_18", HUSTR_18}, {"HUSTR_19", HUSTR_19}, {"HUSTR_20", HUSTR_20}, {"HUSTR_21", HUSTR_21}, {"HUSTR_22", HUSTR_22}, {"HUSTR_23", HUSTR_23}, {"HUSTR_24", HUSTR_24}, {"HUSTR_25", HUSTR_25}, {"HUSTR_26", HUSTR_26}, {"HUSTR_27", HUSTR_27}, {"HUSTR_28", HUSTR_28}, {"HUSTR_29", HUSTR_29}, {"HUSTR_30", HUSTR_30}, {"HUSTR_31", HUSTR_31}, {"HUSTR_32", HUSTR_32}, {"PHUSTR_1", PHUSTR_1}, {"PHUSTR_2", PHUSTR_2}, {"PHUSTR_3", PHUSTR_3}, {"PHUSTR_4", PHUSTR_4}, {"PHUSTR_5", PHUSTR_5}, {"PHUSTR_6", PHUSTR_6}, {"PHUSTR_7", PHUSTR_7}, {"PHUSTR_8", PHUSTR_8}, {"PHUSTR_9", PHUSTR_9}, {"PHUSTR_10", PHUSTR_10}, {"PHUSTR_11", PHUSTR_11}, {"PHUSTR_12", PHUSTR_12}, {"PHUSTR_13", PHUSTR_13}, {"PHUSTR_14", PHUSTR_14}, {"PHUSTR_15", PHUSTR_15}, {"PHUSTR_16", PHUSTR_16}, {"PHUSTR_17", PHUSTR_17}, {"PHUSTR_18", PHUSTR_18}, {"PHUSTR_19", PHUSTR_19}, {"PHUSTR_20", PHUSTR_20}, {"PHUSTR_21", PHUSTR_21}, {"PHUSTR_22", PHUSTR_22}, {"PHUSTR_23", PHUSTR_23}, {"PHUSTR_24", PHUSTR_24}, {"PHUSTR_25", PHUSTR_25}, {"PHUSTR_26", PHUSTR_26}, {"PHUSTR_27", PHUSTR_27}, {"PHUSTR_28", PHUSTR_28}, {"PHUSTR_29", PHUSTR_29}, {"PHUSTR_30", PHUSTR_30}, {"PHUSTR_31", PHUSTR_31}, {"PHUSTR_32", PHUSTR_32}, {"THUSTR_1", THUSTR_1}, {"THUSTR_2", THUSTR_2}, {"THUSTR_3", THUSTR_3}, {"THUSTR_4", THUSTR_4}, {"THUSTR_5", THUSTR_5}, {"THUSTR_6", THUSTR_6}, {"THUSTR_7", THUSTR_7}, {"THUSTR_8", THUSTR_8}, {"THUSTR_9", THUSTR_9}, {"THUSTR_10", THUSTR_10}, {"THUSTR_11", THUSTR_11}, {"THUSTR_12", THUSTR_12}, {"THUSTR_13", THUSTR_13}, {"THUSTR_14", THUSTR_14}, {"THUSTR_15", THUSTR_15}, {"THUSTR_16", THUSTR_16}, {"THUSTR_17", THUSTR_17}, {"THUSTR_18", THUSTR_18}, {"THUSTR_19", THUSTR_19}, {"THUSTR_20", THUSTR_20}, {"THUSTR_21", THUSTR_21}, {"THUSTR_22", THUSTR_22}, {"THUSTR_23", THUSTR_23}, {"THUSTR_24", THUSTR_24}, {"THUSTR_25", THUSTR_25}, {"THUSTR_26", THUSTR_26}, {"THUSTR_27", THUSTR_27}, {"THUSTR_28", THUSTR_28}, {"THUSTR_29", THUSTR_29}, {"THUSTR_30", THUSTR_30}, {"THUSTR_31", THUSTR_31}, {"THUSTR_32", THUSTR_32}, // part 6 - messages as a result of toggling states {"AMSTR_FOLLOWON", AMSTR_FOLLOWON}, {"AMSTR_FOLLOWOFF", AMSTR_FOLLOWOFF}, {"AMSTR_GRIDON", AMSTR_GRIDON}, {"AMSTR_GRIDOFF", AMSTR_GRIDOFF}, {"AMSTR_MARKEDSPOT", AMSTR_MARKEDSPOT}, {"AMSTR_MARKSCLEARED", AMSTR_MARKSCLEARED}, {"STSTR_MUS", STSTR_MUS}, {"STSTR_NOMUS", STSTR_NOMUS}, {"STSTR_DQDON", STSTR_DQDON}, {"STSTR_DQDOFF", STSTR_DQDOFF}, {"STSTR_KFAADDED", STSTR_KFAADDED}, {"STSTR_FAADDED", STSTR_FAADDED}, {"STSTR_NCON", STSTR_NCON}, {"STSTR_NCOFF", STSTR_NCOFF}, {"STSTR_BEHOLD", STSTR_BEHOLD}, {"STSTR_BEHOLDX", STSTR_BEHOLDX}, {"STSTR_CHOPPERS", STSTR_CHOPPERS}, {"STSTR_CLEV", STSTR_CLEV}, // part 7 - episode intermission texts {"E1TEXT", E1TEXT}, {"E2TEXT", E2TEXT}, {"E3TEXT", E3TEXT}, {"E4TEXT", E4TEXT}, {"C1TEXT", C1TEXT}, {"C2TEXT", C2TEXT}, {"C3TEXT", C3TEXT}, {"C4TEXT", C4TEXT}, {"C5TEXT", C5TEXT}, {"C6TEXT", C6TEXT}, {"P1TEXT", P1TEXT}, {"P2TEXT", P2TEXT}, {"P3TEXT", P3TEXT}, {"P4TEXT", P4TEXT}, {"P5TEXT", P5TEXT}, {"P6TEXT", P6TEXT}, {"T1TEXT", T1TEXT}, {"T2TEXT", T2TEXT}, {"T3TEXT", T3TEXT}, {"T4TEXT", T4TEXT}, {"T5TEXT", T5TEXT}, {"T6TEXT", T6TEXT}, // part 8 - creature names for the finale {"CC_ZOMBIE", CC_ZOMBIE}, {"CC_SHOTGUN", CC_SHOTGUN}, {"CC_HEAVY", CC_HEAVY}, {"CC_IMP", CC_IMP}, {"CC_DEMON", CC_DEMON}, {"CC_LOST", CC_LOST}, {"CC_CACO", CC_CACO}, {"CC_HELL", CC_HELL}, {"CC_BARON", CC_BARON}, {"CC_ARACH", CC_ARACH}, {"CC_PAIN", CC_PAIN}, {"CC_REVEN", CC_REVEN}, {"CC_MANCU", CC_MANCU}, {"CC_ARCH", CC_ARCH}, {"CC_SPIDER", CC_SPIDER}, {"CC_CYBER", CC_CYBER}, {"CC_HERO", CC_HERO}, // part 9 - intermission tiled backgrounds {"BGFLATE1", "FLOOR4_8"}, {"BGFLATE2", "SFLR6_1"}, {"BGFLATE3", "MFLR8_4"}, {"BGFLATE4", "MFLR8_3"}, {"BGFLAT06", "SLIME16"}, {"BGFLAT11", "RROCK14"}, {"BGFLAT20", "RROCK07"}, {"BGFLAT30", "RROCK17"}, {"BGFLAT15", "RROCK13"}, {"BGFLAT31", "RROCK19"}, {"BGCASTCALL", "BOSSBACK"}, }; static void *DEH_BEXStrStart(deh_context_t *context, char *line) { char s[10]; if (sscanf(line, "%9s", s) == 0 || strncmp("[STRINGS]", s, sizeof(s))) { DEH_Warning(context, "Parse error on section start"); } return NULL; } static void DEH_BEXStrParseLine(deh_context_t *context, char *line, void *tag) { char *variable_name, *value; int i; if (!DEH_ParseAssignment(line, &variable_name, &value)) { DEH_Warning(context, "Failed to parse assignment"); return; } for (i = 0; i < arrlen(bex_stringtable); i++) { if (!strcmp(bex_stringtable[i].macro, variable_name)) { DEH_AddStringReplacement(bex_stringtable[i].string, value); } } } deh_section_t deh_section_bexstr = { "[STRINGS]", NULL, DEH_BEXStrStart, DEH_BEXStrParseLine, NULL, NULL, };