diff --git a/CMakeLists.txt b/CMakeLists.txt index 28d2a452d5..527934d0d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,21 +13,6 @@ endif() list( APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ) include( FindPackageHandleStandardArgs ) -# Produce a warning if XP support will be missing when building a 32 bit target for MSVC. -if( MSVC ) - if(NOT "${CMAKE_GENERATOR}" MATCHES "(Win64|IA64)") - - list( APPEND WINXP_TOOLSETS v140_xp v141_xp) - list( FIND WINXP_TOOLSETS "${CMAKE_GENERATOR_TOOLSET}" HAVE_WINXP_SUPPORT) - - if( HAVE_WINXP_SUPPORT EQUAL -1 ) - string( REPLACE ";" " or " WINXP_TOOLSETS_STR "${WINXP_TOOLSETS}" ) - message( WARNING "This project supports Windows XP but you must set the optional toolset to ${WINXP_TOOLSETS_STR} manually to have it in your build!\n" - "Assign toolset's name to CMAKE_GENERATOR_TOOLSET variable or use -T from the command prompt." ) - endif() - endif() -endif() - # Support cross compiling option( FORCE_CROSSCOMPILE "Turn on cross compiling." NO ) if( FORCE_CROSSCOMPILE ) @@ -229,9 +214,7 @@ if( MSVC ) set( DEB_C_FLAGS "/D _CRTDBG_MAP_ALLOC /MTd" ) # Disable warnings for unsecure CRT functions from VC8+ - if( MSVC_VERSION GREATER 1399 ) - set( ALL_C_FLAGS "${ALL_C_FLAGS} /wd4996" ) - endif() + set( ALL_C_FLAGS "${ALL_C_FLAGS} /wd4996 /DUNICODE /D_UNICODE" ) # The CMake configurations set /GR and /MD by default, which conflict with our settings. string(REPLACE "/MD " " " CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index aa1b53cf05..47c586417d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -487,7 +487,6 @@ endif() # Start defining source files for ZDoom set( PLAT_WIN32_SOURCES sound/mididevices/music_win_mididevice.cpp - win32/critsec.cpp win32/hardware.cpp win32/helperthread.cpp win32/i_cd.cpp @@ -511,7 +510,6 @@ set( PLAT_POSIX_SOURCES posix/i_steam.cpp ) set( PLAT_SDL_SOURCES posix/sdl/crashcatcher.c - posix/sdl/critsec.cpp posix/sdl/hardware.cpp posix/sdl/i_gui.cpp posix/sdl/i_input.cpp @@ -528,7 +526,6 @@ set( PLAT_OSX_SOURCES posix/osx/i_specialpaths.mm posix/osx/zdoom.icns ) set( PLAT_COCOA_SOURCES - posix/cocoa/critsec.cpp posix/cocoa/i_input.mm posix/cocoa/i_joystick.cpp posix/cocoa/i_main.mm @@ -655,6 +652,7 @@ file( GLOB HEADER_FILES g_statusbar/*.h gamedata/*.h gamedata/resourcefiles/*.h + gamedata/fonts/*.h gamedata/textures/*.h gamedata/textures/hires/hqnx/*.h gamedata/textures/hires/hqnx_asm/*.h @@ -690,6 +688,7 @@ file( GLOB HEADER_FILES sound/timidity/*.h sound/timiditypp/*.h sound/wildmidi/*.h + rendering/2d/*.h rendering/swrenderer/*.h rendering/swrenderer/textures/*.h rendering/swrenderer/drawers/*.h @@ -925,7 +924,6 @@ set (PCH_SOURCES c_expr.cpp c_functions.cpp ct_chat.cpp - cycler.cpp d_iwad.cpp d_main.cpp d_anonstats.cpp @@ -936,7 +934,6 @@ set (PCH_SOURCES dobjgc.cpp dobjtype.cpp doomstat.cpp - f_wipe.cpp g_cvars.cpp g_dumpinfo.cpp g_game.cpp @@ -968,7 +965,6 @@ set (PCH_SOURCES p_states.cpp p_things.cpp p_tick.cpp - p_usdf.cpp p_user.cpp r_utility.cpp r_sky.cpp @@ -980,16 +976,8 @@ set (PCH_SOURCES serializer.cpp scriptutil.cpp st_stuff.cpp - statistics.cpp - stats.cpp - v_2ddrawer.cpp - v_blend.cpp - v_draw.cpp - v_font.cpp v_framebuffer.cpp v_palette.cpp - v_pfx.cpp - v_text.cpp v_video.cpp wi_stuff.cpp gamedata/a_keys.cpp @@ -1006,6 +994,7 @@ set (PCH_SOURCES gamedata/info.cpp gamedata/keysections.cpp gamedata/p_terrain.cpp + gamedata/statistics.cpp gamedata/teaminfo.cpp g_shared/a_pickups.cpp g_shared/a_action.cpp @@ -1046,6 +1035,11 @@ set (PCH_SOURCES g_statusbar/sbarinfo.cpp g_statusbar/sbar_mugshot.cpp g_statusbar/shared_sbar.cpp + rendering/2d/f_wipe.cpp + rendering/2d/v_2ddrawer.cpp + rendering/2d/v_drawtext.cpp + rendering/2d/v_blend.cpp + rendering/2d/v_draw.cpp rendering/gl/renderer/gl_renderer.cpp rendering/gl/renderer/gl_renderstate.cpp rendering/gl/renderer/gl_renderbuffers.cpp @@ -1092,6 +1086,8 @@ set (PCH_SOURCES maploader/slopes.cpp maploader/glnodes.cpp maploader/udmf.cpp + maploader/usdf.cpp + maploader/strifedialogue.cpp maploader/polyobjects.cpp maploader/renderinfo.cpp maploader/compatibility.cpp @@ -1142,6 +1138,12 @@ set (PCH_SOURCES gamedata/textures/formats/tgatexture.cpp gamedata/textures/hires/hqresize.cpp gamedata/textures/hires/hirestex.cpp + gamedata/fonts/singlelumpfont.cpp + gamedata/fonts/singlepicfont.cpp + gamedata/fonts/specialfont.cpp + gamedata/fonts/font.cpp + gamedata/fonts/v_font.cpp + gamedata/fonts/v_text.cpp gamedata/p_xlat.cpp gamedata/xlat/parse_xlat.cpp gamedata/xlat/parsecontext.cpp @@ -1157,6 +1159,7 @@ set (PCH_SOURCES intermission/intermission.cpp intermission/intermission_parse.cpp r_data/colormaps.cpp + r_data/cycler.cpp r_data/gldefs.cpp r_data/a_dynlightdata.cpp r_data/r_translate.cpp @@ -1277,6 +1280,7 @@ set (PCH_SOURCES utility/nodebuilder/nodebuild_gl.cpp utility/nodebuilder/nodebuild_utility.cpp utility/sc_man.cpp + utility/stats.cpp utility/cmdlib.cpp utility/colormatcher.cpp utility/configfile.cpp @@ -1288,6 +1292,7 @@ set (PCH_SOURCES utility/name.cpp utility/s_playlist.cpp utility/v_collection.cpp + utility/utf8.cpp utility/zstrformat.cpp ) @@ -1355,7 +1360,9 @@ include_directories( . g_shared gamedata gamedata/textures + gamedata/fonts rendering + rendering/2d sound sound/oplsynth sound/timidity @@ -1476,6 +1483,7 @@ source_group("External\\SFMT" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/s source_group("FraggleScript" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/fragglescript/.+") source_group("Game Data" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gamedata/.+") source_group("Game Data\\Resource Files" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gamedata/resourcefiles/.+") +source_group("Game Data\\Fonts" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gamedata/fonts/.+") source_group("Game Data\\Textures" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gamedata/textures/.+") source_group("Game Data\\Textures\\Hires" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gamedata/textures/hires/.+") source_group("Game Data\\Textures\\Hires\\HQ Resize" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gamedata/textures/hires/hqnx/.+") @@ -1486,6 +1494,7 @@ source_group("Intermission" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/int source_group("Map Loader" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/maploader/.+") source_group("Menu" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/menu/.+") source_group("Rendering" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/.+") +source_group("Rendering\\2D" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/2d/.+") source_group("Rendering\\Hardware Renderer" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gl/.+") source_group("Rendering\\Hardware Renderer\\Data" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/hwrenderer/data/.+") source_group("Rendering\\Hardware Renderer\\Dynamic Lights" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/hwrenderer/dynlights/.+") diff --git a/src/c_console.cpp b/src/c_console.cpp index b25303c266..12d76adba4 100644 --- a/src/c_console.cpp +++ b/src/c_console.cpp @@ -61,6 +61,7 @@ #include "c_consolebuffer.h" #include "g_levellocals.h" #include "vm.h" +#include "utf8.h" #include "gi.h" @@ -167,17 +168,19 @@ struct History struct FCommandBuffer { +private: FString Text; // The actual command line text - unsigned CursorPos; - unsigned StartPos; // First character to display + unsigned CursorPos = 0; + unsigned StartPos = 0; // First character to display + unsigned CursorPosChars = 0; + unsigned StartPosChars = 0; FString YankBuffer; // Deleted text buffer - bool AppendToYankBuffer; // Append consecutive deletes to buffer - FCommandBuffer() - { - CursorPos = StartPos = 0; - } +public: + bool AppendToYankBuffer = false; // Append consecutive deletes to buffer + + FCommandBuffer() = default; FCommandBuffer(const FCommandBuffer &o) { @@ -186,6 +189,16 @@ struct FCommandBuffer StartPos = o.StartPos; } + FString GetText() const + { + return Text; + } + + size_t TextLength() const + { + return Text.Len(); + } + void Draw(int x, int y, int scale, bool cursor) { if (scale == 1) @@ -197,7 +210,7 @@ struct FCommandBuffer if (cursor) { screen->DrawChar(ConFont, CR_YELLOW, - x + ConFont->GetCharWidth(0x1c) + (CursorPos - StartPos) * ConFont->GetCharWidth(0xb), + x + ConFont->GetCharWidth(0x1c) + (CursorPosChars - StartPosChars) * ConFont->GetCharWidth(0xb), y, '\xb', TAG_DONE); } } @@ -217,7 +230,7 @@ struct FCommandBuffer if (cursor) { screen->DrawChar(ConFont, CR_YELLOW, - x + ConFont->GetCharWidth(0x1c) + (CursorPos - StartPos) * ConFont->GetCharWidth(0xb), + x + ConFont->GetCharWidth(0x1c) + (CursorPosChars - StartPosChars) * ConFont->GetCharWidth(0xb), y, '\xb', DTA_VirtualWidth, screen->GetWidth() / scale, DTA_VirtualHeight, screen->GetHeight() / scale, @@ -226,108 +239,127 @@ struct FCommandBuffer } } + unsigned BytesForChars(unsigned chars) + { + unsigned bytes = 0; + while (chars > 0) + { + if ((Text[bytes++] & 0xc0) != 0x80) chars--; + } + return bytes; + } + void MakeStartPosGood() { - int n = StartPos; + int n = StartPosChars; unsigned cols = ConCols / active_con_scale(); - if (StartPos >= Text.Len()) + if (StartPosChars >= Text.CharacterCount()) { // Start of visible line is beyond end of line - n = CursorPos - cols + 2; + n = CursorPosChars - cols + 2; } - if ((CursorPos - StartPos) >= cols - 2) + if ((CursorPosChars - StartPosChars) >= cols - 2) { // The cursor is beyond the visible part of the line - n = CursorPos - cols + 2; + n = CursorPosChars - cols + 2; } - if (StartPos > CursorPos) + if (StartPosChars > CursorPosChars) { // The cursor is in front of the visible part of the line - n = CursorPos; + n = CursorPosChars; } - StartPos = MAX(0, n); - } - - unsigned WordBoundaryRight() - { - unsigned index = CursorPos; - while (index < Text.Len() && Text[index] == ' ') { - index++; - } - while (index < Text.Len() && Text[index] != ' ') { - index++; - } - return index; - } - - unsigned WordBoundaryLeft() - { - int index = CursorPos - 1; - while (index > -1 && Text[index] == ' ') { - index--; - } - while (index > -1 && Text[index] != ' ') { - index--; - } - return (unsigned)index + 1; + StartPosChars = MAX(0, n); + StartPos = BytesForChars(StartPosChars); } void CursorStart() { CursorPos = 0; StartPos = 0; + CursorPosChars = 0; + StartPosChars = 0; } void CursorEnd() { CursorPos = (unsigned)Text.Len(); - StartPos = 0; + CursorPosChars = (unsigned)Text.CharacterCount(); + StartPosChars = 0; MakeStartPosGood(); } +private: + void MoveCursorLeft() + { + CursorPosChars--; + do CursorPos--; + while ((Text[CursorPos] & 0xc0) == 0x80); // Step back to the last non-continuation byte. + } + + void MoveCursorRight() + { + CursorPosChars++; + do CursorPos++; + while ((Text[CursorPos] & 0xc0) == 0x80); // Step back to the last non-continuation byte. + } + +public: void CursorLeft() { - if (CursorPos > 0) + if (CursorPosChars > 0) { - CursorPos--; + MoveCursorLeft(); MakeStartPosGood(); } } void CursorRight() { - if (CursorPos < Text.Len()) + if (CursorPosChars < Text.CharacterCount()) { - CursorPos++; + MoveCursorRight(); MakeStartPosGood(); } } void CursorWordLeft() { - CursorPos = WordBoundaryLeft(); - MakeStartPosGood(); + if (CursorPosChars > 0) + { + do MoveCursorLeft(); + while (CursorPosChars > 0 && Text[CursorPos - 1] != ' '); + MakeStartPosGood(); + } } void CursorWordRight() { - CursorPos = WordBoundaryRight(); - MakeStartPosGood(); + if (CursorPosChars < Text.CharacterCount()) + { + do MoveCursorRight(); + while (CursorPosChars < Text.CharacterCount() && Text[CursorPos] != ' '); + MakeStartPosGood(); + } } void DeleteLeft() { if (CursorPos > 0) { - Text.Remove(CursorPos - 1, 1); - CursorPos--; + auto now = CursorPos; + MoveCursorLeft(); + Text.Remove(CursorPos, now - CursorPos); MakeStartPosGood(); } } void DeleteRight() { - if (CursorPos < Text.Len()) + if (CursorPosChars < Text.CharacterCount()) { - Text.Remove(CursorPos, 1); + auto now = CursorPos; + MoveCursorRight(); + Text.Remove(now, CursorPos - now); + CursorPos = now; + CursorPosChars--; MakeStartPosGood(); } } @@ -336,14 +368,16 @@ struct FCommandBuffer { if (CursorPos > 0) { - unsigned index = WordBoundaryLeft(); + auto now = CursorPos; + + CursorWordLeft(); + if (AppendToYankBuffer) { - YankBuffer = FString(&Text[index], CursorPos - index) + YankBuffer; + YankBuffer = FString(&Text[CursorPos], now - CursorPos) + YankBuffer; } else { - YankBuffer = FString(&Text[index], CursorPos - index); + YankBuffer = FString(&Text[CursorPos], now - CursorPos); } - Text.Remove(index, CursorPos - index); - CursorPos = index; + Text.Remove(CursorPos, now - CursorPos); MakeStartPosGood(); } } @@ -378,18 +412,22 @@ struct FCommandBuffer void AddChar(int character) { - ///FIXME: Not Unicode-aware - if (CursorPos == Text.Len()) + int size; + auto encoded = MakeUTF8(character, &size); + if (*encoded != 0) { - Text += char(character); + if (Text.IsEmpty()) + { + Text = encoded; + } + else + { + Text.Insert(CursorPos, (char*)encoded); + } + CursorPos += size; + CursorPosChars++; + MakeStartPosGood(); } - else - { - char foo = char(character); - Text.Insert(CursorPos, &foo, 1); - } - CursorPos++; - MakeStartPosGood(); } void AddString(FString clip) @@ -401,6 +439,7 @@ struct FCommandBuffer if (brk >= 0) { clip.Truncate(brk); + clip = MakeUTF8(clip.GetChars()); // Make sure that we actually have UTF-8 text. } if (Text.IsEmpty()) { @@ -411,16 +450,22 @@ struct FCommandBuffer Text.Insert(CursorPos, clip); } CursorPos += (unsigned)clip.Len(); + CursorPosChars += (unsigned)clip.CharacterCount(); MakeStartPosGood(); } } - void SetString(FString str) + void SetString(const FString &str) { - Text = str; - CursorPos = (unsigned)Text.Len(); + Text = MakeUTF8(str); + CursorEnd(); MakeStartPosGood(); } + + void AddYankBuffer() + { + AddString(YankBuffer); + } }; static FCommandBuffer CmdLine; @@ -800,33 +845,39 @@ void FNotifyBuffer::AddString(int printlevel, FString source) void AddToConsole (int printlevel, const char *text) { - conbuffer->AddText(printlevel, text, Logfile); + conbuffer->AddText(printlevel, MakeUTF8(text), Logfile); } -/* Adds a string to the console and also to the notify buffer */ int PrintString (int printlevel, const char *outline) { if (printlevel < msglevel || *outline == '\0') { return 0; } - - if (printlevel != PRINT_LOG) + if (printlevel != PRINT_LOG || Logfile != nullptr) { - I_PrintStr (outline); + // Convert everything coming through here to UTF-8 so that all console text is in a consistent format + int count; + outline = MakeUTF8(outline, &count); - AddToConsole (printlevel, outline); - if (vidactive && screen && SmallFont) + if (printlevel != PRINT_LOG) { - NotifyStrings.AddString(printlevel, outline); + I_PrintStr(outline); + + conbuffer->AddText(printlevel, outline, Logfile); + if (vidactive && screen && SmallFont) + { + NotifyStrings.AddString(printlevel, outline); + } } + else if (Logfile != nullptr) + { + fputs(outline, Logfile); + fflush(Logfile); + } + return count; } - else if (Logfile != NULL) - { - fputs (outline, Logfile); - fflush (Logfile); - } - return (int)strlen (outline); + return 0; // Don't waste time on calculating this if nothing at all was printed... } extern bool gameisdead; @@ -1209,10 +1260,7 @@ void C_DrawConsole () { if (gamestate != GS_STARTUP) { - // Make a copy of the command line, in case an input event is handled - // while we draw the console and it changes. - FCommandBuffer command(CmdLine); - command.Draw(left, bottomline, textScale, cursoron); + CmdLine.Draw(left, bottomline, textScale, cursoron); } if (RowAdjust && ConBottom >= ConFont->GetHeight()*7/2) { @@ -1494,7 +1542,7 @@ static bool C_HandleKey (event_t *ev, FCommandBuffer &buffer) break; case 'D': - if (ev->data3 & GKM_CTRL && buffer.Text.Len() == 0) + if (ev->data3 & GKM_CTRL && buffer.TextLength() == 0) { // Control-D pressed on an empty line if (strlen(con_ctrl_d) == 0) { @@ -1509,16 +1557,18 @@ static bool C_HandleKey (event_t *ev, FCommandBuffer &buffer) // Intentional fall-through for command(s) added with Ctrl-D case '\r': + { // Execute command line (ENTER) + FString bufferText = buffer.GetText(); - buffer.Text.StripLeftRight(); - Printf(127, TEXTCOLOR_WHITE "]%s\n", buffer.Text.GetChars()); + bufferText.StripLeftRight(); + Printf(127, TEXTCOLOR_WHITE "]%s\n", bufferText.GetChars()); - if (buffer.Text.Len() == 0) + if (bufferText.Len() == 0) { - // Command line is empty, so do nothing to the history + // Command line is empty, so do nothing to the history } - else if (HistHead && HistHead->String.CompareNoCase(buffer.Text) == 0) + else if (HistHead && HistHead->String.CompareNoCase(bufferText) == 0) { // Command line was the same as the previous one, // so leave the history list alone @@ -1530,7 +1580,7 @@ static bool C_HandleKey (event_t *ev, FCommandBuffer &buffer) // so add it to the history list. History *temp = new History; - temp->String = buffer.Text; + temp->String = bufferText; temp->Older = HistHead; if (HistHead) { @@ -1556,16 +1606,12 @@ static bool C_HandleKey (event_t *ev, FCommandBuffer &buffer) } } HistPos = NULL; - { - // Work with a copy of command to avoid side effects caused by - // exception raised during execution, like with 'error' CCMD. - FString copy = buffer.Text; - buffer.SetString(""); - AddCommandString(copy); - } + buffer.SetString(""); + AddCommandString(bufferText); TabbedLast = false; TabbedList = false; break; + } case '`': // Check to see if we have ` bound to the console before accepting @@ -1606,9 +1652,9 @@ static bool C_HandleKey (event_t *ev, FCommandBuffer &buffer) { if (data1 == 'C') { // copy to clipboard - if (buffer.Text.IsNotEmpty()) + if (buffer.TextLength() > 0) { - I_PutInClipboard(buffer.Text); + I_PutInClipboard(buffer.GetText()); } } else @@ -1663,7 +1709,7 @@ static bool C_HandleKey (event_t *ev, FCommandBuffer &buffer) case 'Y': if (ev->data3 & GKM_CTRL) { - buffer.AddString(buffer.YankBuffer); + buffer.AddYankBuffer(); TabbedLast = false; TabbedList = false; HistPos = NULL; @@ -1906,25 +1952,27 @@ static void C_TabComplete (bool goForward) unsigned i; int diffpoint; + auto CmdLineText = CmdLine.GetText(); if (!TabbedLast) { bool cancomplete; + // Skip any spaces at beginning of command line - for (i = 0; i < CmdLine.Text.Len(); ++i) + for (i = 0; i < CmdLineText.Len(); ++i) { - if (CmdLine.Text[i] != ' ') + if (CmdLineText[i] != ' ') break; } - if (i == CmdLine.Text.Len()) + if (i == CmdLineText.Len()) { // Line was nothing but spaces return; } TabStart = i; - TabSize = (int)CmdLine.Text.Len() - TabStart; + TabSize = (int)CmdLineText.Len() - TabStart; - if (!FindTabCommand(&CmdLine.Text[TabStart], &TabPos, TabSize)) + if (!FindTabCommand(&CmdLineText[TabStart], &TabPos, TabSize)) return; // No initial matches // Show a list of possible completions, if more than one. @@ -1947,7 +1995,7 @@ static void C_TabComplete (bool goForward) { // Find the last matching tab, then go one past it. while (++TabPos < (int)TabCommands.Size()) { - if (FindDiffPoint(TabCommands[TabPos].TabName, &CmdLine.Text[TabStart]) < TabSize) + if (FindDiffPoint(TabCommands[TabPos].TabName, &CmdLineText[TabStart]) < TabSize) { break; } @@ -1964,25 +2012,25 @@ static void C_TabComplete (bool goForward) (!goForward && --TabPos < 0)) { TabbedLast = false; - CmdLine.Text.Truncate(TabSize); + CmdLineText.Truncate(TabSize); } else { - diffpoint = FindDiffPoint(TabCommands[TabPos].TabName, &CmdLine.Text[TabStart]); + diffpoint = FindDiffPoint(TabCommands[TabPos].TabName, &CmdLineText[TabStart]); if (diffpoint < TabSize) { // No more matches TabbedLast = false; - CmdLine.Text.Truncate(TabSize - TabStart); + CmdLineText.Truncate(TabSize - TabStart); } else { - CmdLine.Text.Truncate(TabStart); - CmdLine.Text << TabCommands[TabPos].TabName << ' '; + CmdLineText.Truncate(TabStart); + CmdLineText << TabCommands[TabPos].TabName << ' '; } } - CmdLine.CursorPos = (unsigned)CmdLine.Text.Len(); + CmdLine.SetString(CmdLineText); CmdLine.MakeStartPosGood(); } @@ -1995,9 +2043,10 @@ static bool C_TabCompleteList () nummatches = 0; maxwidth = 0; + auto CmdLineText = CmdLine.GetText(); for (i = TabPos; i < (int)TabCommands.Size(); ++i) { - if (FindDiffPoint (TabCommands[i].TabName, &CmdLine.Text[TabStart]) < TabSize) + if (FindDiffPoint (TabCommands[i].TabName, &CmdLineText[TabStart]) < TabSize) { break; } @@ -2022,7 +2071,7 @@ static bool C_TabCompleteList () { size_t x = 0; maxwidth += 3; - Printf (TEXTCOLOR_BLUE "Completions for %s:\n", CmdLine.Text.GetChars()); + Printf (TEXTCOLOR_BLUE "Completions for %s:\n", CmdLineText.GetChars()); for (i = TabPos; nummatches > 0; ++i, --nummatches) { // [Dusk] Print console commands blue, CVars green, aliases red. @@ -2054,9 +2103,9 @@ static bool C_TabCompleteList () if (TabSize != commonsize) { TabSize = commonsize; - CmdLine.Text.Truncate(TabStart); - CmdLine.Text.AppendCStrPart(TabCommands[TabPos].TabName.GetChars(), commonsize); - CmdLine.CursorPos = (unsigned)CmdLine.Text.Len(); + CmdLineText.Truncate(TabStart); + CmdLineText.AppendCStrPart(TabCommands[TabPos].TabName.GetChars(), commonsize); + CmdLine.SetString(CmdLineText); } return false; } diff --git a/src/c_consolebuffer.cpp b/src/c_consolebuffer.cpp index 9868bc6c3f..0d0d0bc030 100644 --- a/src/c_consolebuffer.cpp +++ b/src/c_consolebuffer.cpp @@ -270,8 +270,7 @@ void FConsoleBuffer::FormatText(FFont *formatfont, int displaywidth) unsigned brokensize = m_BrokenConsoleText.Size(); if (brokensize == mConsoleText.Size()) { - // The last line got text appended. We have to wait until here to format it because - // it is possible that during display new text will be added from the NetUpdate calls in the software version of DrawTextureV. + // The last line got text appended. if (mLastLineNeedsUpdate) { brokensize--; diff --git a/src/c_dispatch.cpp b/src/c_dispatch.cpp index 127f5f2f65..a826216fc0 100644 --- a/src/c_dispatch.cpp +++ b/src/c_dispatch.cpp @@ -1569,13 +1569,14 @@ void FExecList::AddPullins(TArray &wads) const FExecList *C_ParseExecFile(const char *file, FExecList *exec) { - FILE *f; char cmd[4096]; int retval = 0; - if ( (f = fopen (file, "r")) ) + FileReader fr; + + if ( (fr.OpenFile(file)) ) { - while (fgets(cmd, countof(cmd)-1, f)) + while (fr.Gets(cmd, countof(cmd)-1)) { // Comments begin with // char *stop = cmd + strlen(cmd) - 1; @@ -1611,11 +1612,6 @@ FExecList *C_ParseExecFile(const char *file, FExecList *exec) } exec->AddCommand(cmd, file); } - if (!feof(f)) - { - Printf("Error parsing \"%s\"\n", file); - } - fclose(f); } else { diff --git a/src/critsec.h b/src/critsec.h deleted file mode 100644 index ad510383b8..0000000000 --- a/src/critsec.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -// System independent critical sections without polluting the namespace with the operating system headers. -class FInternalCriticalSection; -FInternalCriticalSection *CreateCriticalSection(); -void DeleteCriticalSection(FInternalCriticalSection *c); -void EnterCriticalSection(FInternalCriticalSection *c); -void LeaveCriticalSection(FInternalCriticalSection *c); - -// This is just a convenience wrapper around the function interface. -class FCriticalSection -{ -public: - FCriticalSection() - { - c = CreateCriticalSection(); - } - - ~FCriticalSection() - { - DeleteCriticalSection(c); - } - - void Enter() - { - EnterCriticalSection(c); - } - - void Leave() - { - LeaveCriticalSection(c); - } - -private: - FInternalCriticalSection *c; - -}; diff --git a/src/ct_chat.cpp b/src/ct_chat.cpp index 31dd40f8a2..6facdde727 100644 --- a/src/ct_chat.cpp +++ b/src/ct_chat.cpp @@ -39,14 +39,13 @@ #include "d_event.h" #include "sbar.h" #include "v_video.h" +#include "utf8.h" -#define QUEUESIZE 128 -#define MESSAGESIZE 128 -#define MESSAGELEN 265 -#define HU_INPUTX 0 -#define HU_INPUTY (0 + (screen->Font->GetHeight () + 1)) +enum +{ + QUEUESIZE = 128 +}; -void CT_PasteChat(const char *clip); EXTERN_CVAR (Int, con_scaletext) @@ -61,19 +60,20 @@ int active_con_scaletext(); void CT_Init (); void CT_Drawer (); bool CT_Responder (event_t *ev); +void CT_PasteChat(const char *clip); int chatmodeon; // Private data static void CT_ClearChatMessage (); -static void CT_AddChar (char c); +static void CT_AddChar (int c); static void CT_BackSpace (); static void ShoveChatStr (const char *str, uint8_t who); static bool DoSubstitution (FString &out, const char *in); -static int len; -static uint8_t ChatQueue[QUEUESIZE]; +static int CharLen; +static TArray ChatQueue; CVAR (String, chatmacro1, "I'm ready to kick butt!", CVAR_ARCHIVE) CVAR (String, chatmacro2, "I'm OK.", CVAR_ARCHIVE) @@ -111,9 +111,9 @@ CVAR (Bool, chat_substitution, false, CVAR_ARCHIVE) void CT_Init () { - len = 0; // initialize the queue index + ChatQueue.Clear(); + CharLen = 0; chatmodeon = 0; - ChatQueue[0] = 0; } //=========================================================================== @@ -141,7 +141,9 @@ bool CT_Responder (event_t *ev) { if (ev->data1 == '\r') { - ShoveChatStr ((char *)ChatQueue, chatmodeon - 1); + ChatQueue.Push(0); + ShoveChatStr ((char *)ChatQueue.Data(), chatmodeon - 1); + ChatQueue.Pop(); CT_Stop (); return true; } @@ -161,7 +163,9 @@ bool CT_Responder (event_t *ev) else if (ev->data1 == 'C' && (ev->data3 & GKM_CTRL)) #endif // __APPLE__ { - I_PutInClipboard ((char *)ChatQueue); + ChatQueue.Push(0); + I_PutInClipboard ((char *)ChatQueue.Data()); + ChatQueue.Pop(); return true; } #ifdef __APPLE__ @@ -183,7 +187,7 @@ bool CT_Responder (event_t *ev) } else { - CT_AddChar (char(ev->data1)); + CT_AddChar (ev->data1); } return true; } @@ -206,16 +210,17 @@ bool CT_Responder (event_t *ev) void CT_PasteChat(const char *clip) { - if (clip != NULL && *clip != '\0') + if (clip != nullptr && *clip != '\0') { + auto p = (const uint8_t *)clip; // Only paste the first line. - while (*clip != '\0') + while (auto chr = GetCharFromString(p)) { - if (*clip == '\n' || *clip == '\r' || *clip == '\b') + if (chr == '\n' || chr == '\r' || chr == '\b') { break; } - CT_AddChar (*clip++); + CT_AddChar (chr); } } } @@ -228,10 +233,11 @@ void CT_PasteChat(const char *clip) void CT_Drawer (void) { + FFont *displayfont = ConFont; if (chatmodeon) { static const char *prompt = "Say: "; - int i, x, scalex, y, promptwidth; + int x, scalex, y, promptwidth; y = (viewactive || gamestate != GS_LEVEL) ? -10 : -30; @@ -243,33 +249,25 @@ void CT_Drawer (void) y += ((SCREENHEIGHT == viewheight && viewactive) || gamestate != GS_LEVEL) ? screen_height : st_y; - promptwidth = SmallFont->StringWidth (prompt) * scalex; - x = SmallFont->GetCharWidth ('_') * scalex * 2 + promptwidth; + promptwidth = displayfont->StringWidth (prompt) * scalex; + x = displayfont->GetCharWidth (displayfont->GetCursor()) * scalex * 2 + promptwidth; - // figure out if the text is wider than the screen-> + FString printstr = ChatQueue; + // figure out if the text is wider than the screen // if so, only draw the right-most portion of it. - for (i = len - 1; i >= 0 && x < screen_width; i--) + const uint8_t *textp = (const uint8_t*)printstr.GetChars(); + while(*textp) { - x += SmallFont->GetCharWidth (ChatQueue[i] & 0x7f) * scalex; + auto textw = displayfont->StringWidth(textp); + if (x + textw * scalex < screen_width) break; + GetCharFromString(textp); } + printstr += displayfont->GetCursor(); - if (i >= 0) - { - i++; - } - else - { - i = 0; - } - - // draw the prompt, text, and cursor - ChatQueue[len] = SmallFont->GetCursor(); - ChatQueue[len+1] = '\0'; - screen->DrawText (SmallFont, CR_GREEN, 0, y, prompt, + screen->DrawText (displayfont, CR_GREEN, 0, y, prompt, DTA_VirtualWidth, screen_width, DTA_VirtualHeight, screen_height, DTA_KeepRatio, true, TAG_DONE); - screen->DrawText (SmallFont, CR_GREY, promptwidth, y, (char *)(ChatQueue + i), + screen->DrawText (displayfont, CR_GREY, promptwidth, y, printstr, DTA_VirtualWidth, screen_width, DTA_VirtualHeight, screen_height, DTA_KeepRatio, true, TAG_DONE); - ChatQueue[len] = '\0'; } if (players[consoleplayer].camera != NULL && @@ -289,12 +287,20 @@ void CT_Drawer (void) // //=========================================================================== -static void CT_AddChar (char c) +static void CT_AddChar (int c) { - if (len < QUEUESIZE-2) + if (CharLen < QUEUESIZE-2) { - ChatQueue[len++] = c; - ChatQueue[len] = 0; + int size; + auto encode = MakeUTF8(c, &size); + if (*encode) + { + for (int i = 0; i < size; i++) + { + ChatQueue.Push(encode[i]); + } + CharLen++; + } } } @@ -307,9 +313,12 @@ static void CT_AddChar (char c) static void CT_BackSpace () { - if (len) + if (CharLen) { - ChatQueue[--len] = 0; + int endpos = ChatQueue.Size() - 1; + while (endpos > 0 && ChatQueue[endpos] >= 0x80 && ChatQueue[endpos] < 0xc0) endpos--; + ChatQueue.Clamp(endpos); + CharLen--; } } @@ -322,8 +331,7 @@ static void CT_BackSpace () static void CT_ClearChatMessage () { - ChatQueue[0] = 0; - len = 0; + ChatQueue.Clear(); } //=========================================================================== @@ -355,11 +363,11 @@ static void ShoveChatStr (const char *str, uint8_t who) if (!chat_substitution || !DoSubstitution (substBuff, str)) { - Net_WriteString (str); + Net_WriteString(MakeUTF8(str)); } else { - Net_WriteString (substBuff); + Net_WriteString(MakeUTF8(substBuff)); } } @@ -392,9 +400,9 @@ static bool DoSubstitution (FString &out, const char *in) ++b; } - ptrdiff_t len = b - a; + ptrdiff_t ByteLen = b - a; - if (len == 6) + if (ByteLen == 6) { if (strnicmp(a, "health", 6) == 0) { @@ -412,7 +420,7 @@ static bool DoSubstitution (FString &out, const char *in) } } } - else if (len == 5) + else if (ByteLen == 5) { if (strnicmp(a, "armor", 5) == 0) { @@ -420,7 +428,7 @@ static bool DoSubstitution (FString &out, const char *in) out.AppendFormat("%d", armor != NULL ? armor->IntVar(NAME_Amount) : 0); } } - else if (len == 9) + else if (ByteLen == 9) { if (strnicmp(a, "ammocount", 9) == 0) { @@ -438,7 +446,7 @@ static bool DoSubstitution (FString &out, const char *in) } } } - else if (len == 4) + else if (ByteLen == 4) { if (strnicmp(a, "ammo", 4) == 0) { @@ -456,7 +464,7 @@ static bool DoSubstitution (FString &out, const char *in) } } } - else if (len == 0) + else if (ByteLen == 0) { out += '$'; if (*b == '$') @@ -467,7 +475,7 @@ static bool DoSubstitution (FString &out, const char *in) else { out += '$'; - out.AppendCStrPart(a, len); + out.AppendCStrPart(a, ByteLen); } a = b; } diff --git a/src/d_iwad.cpp b/src/d_iwad.cpp index 2716d1eb14..6f33c718e3 100644 --- a/src/d_iwad.cpp +++ b/src/d_iwad.cpp @@ -163,6 +163,13 @@ void FIWadManager::ParseIWadInfo(const char *fn, const char *data, int datasize, sc.MustGetString(); iwad->BkColor = V_GetColor(NULL, sc); } + else if (sc.Compare("IgnoreTitlePatches")) + { + sc.MustGetStringName("="); + sc.MustGetNumber(); + if (sc.Number) iwad->flags |= GI_IGNORETITLEPATCHES; + else iwad->flags &= ~GI_IGNORETITLEPATCHES; + } else if (sc.Compare("Load")) { sc.MustGetStringName("="); diff --git a/src/d_main.cpp b/src/d_main.cpp index d2a43f9696..c6ee1dddc8 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -2027,8 +2027,6 @@ static void D_DoomInit() gamestate = GS_STARTUP; - SetLanguageIDs (); - const char *v = Args->CheckValue("-rngseed"); if (v) { @@ -2428,7 +2426,7 @@ void D_DoomMain (void) } // [RH] Initialize localizable strings. - GStrings.LoadStrings (false); + GStrings.LoadStrings (); V_InitFontColors (); @@ -2679,7 +2677,7 @@ void D_DoomMain (void) if (StoredWarp.IsNotEmpty()) { AddCommandString(StoredWarp); - StoredWarp = NULL; + StoredWarp = ""; } } else diff --git a/src/d_main.h b/src/d_main.h index 05d818f145..bc8f54adab 100644 --- a/src/d_main.h +++ b/src/d_main.h @@ -160,7 +160,7 @@ public: int GetIWadFlags(unsigned int num) const { if (num < mIWadInfos.Size()) return mIWadInfos[num].flags; - else return false; + else return 0; } }; diff --git a/src/d_netinfo.cpp b/src/d_netinfo.cpp index 6452c1f294..9c938f43ba 100644 --- a/src/d_netinfo.cpp +++ b/src/d_netinfo.cpp @@ -933,7 +933,7 @@ void ReadUserInfo(FSerializer &arc, userinfo_t &info, FString &skin) const char *str; info.Reset(); - skin = NULL; + skin = ""; if (arc.BeginObject("userinfo")) { while ((key = arc.GetKey())) diff --git a/src/d_player.h b/src/d_player.h index f89d665501..7c21358c83 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -151,8 +151,6 @@ enum extern AActor *WP_NOCHANGE; -#define MAXPLAYERNAME 15 - // [GRB] Custom player classes enum { diff --git a/src/doomstat.cpp b/src/doomstat.cpp index b6f0e78710..c9ff769b54 100644 --- a/src/doomstat.cpp +++ b/src/doomstat.cpp @@ -56,10 +56,10 @@ CUSTOM_CVAR (Float, teamdamage, 0.f, CVAR_SERVERINFO) } } -CUSTOM_CVAR (String, language, "auto", CVAR_ARCHIVE) +CUSTOM_CVAR (String, language, "auto", CVAR_ARCHIVE|CVAR_NOINITCALL) { SetLanguageIDs (); - GStrings.LoadStrings (false); + GStrings.UpdateLanguage(); for (auto Level : AllLevels()) { // does this even make sense on secondary levels...? diff --git a/src/events.cpp b/src/events.cpp index d1e92510bf..293ca48d08 100755 --- a/src/events.cpp +++ b/src/events.cpp @@ -41,6 +41,7 @@ #include "d_net.h" #include "g_game.h" #include "info.h" +#include "utf8.h" EventManager staticEventManager; EventManager eventManager; @@ -1026,7 +1027,7 @@ FUiEvent::FUiEvent(const event_t *ev) break; case EV_GUI_Char: KeyChar = ev->data1; - KeyString = FString(char(ev->data1)); + KeyString = MakeUTF8(ev->data1); IsAlt = !!ev->data2; // only true for Win32, not sure about SDL break; default: // mouse event diff --git a/src/g_dumpinfo.cpp b/src/g_dumpinfo.cpp index 2c9caaec30..63bda28ff2 100644 --- a/src/g_dumpinfo.cpp +++ b/src/g_dumpinfo.cpp @@ -349,3 +349,58 @@ CCMD(targetinv) "the NOBLOCKMAP flag or have height/radius of 0.\n"); } + +//========================================================================== +// +// Lists all currently defined maps +// +//========================================================================== + +CCMD(listmaps) +{ + for (unsigned i = 0; i < wadlevelinfos.Size(); i++) + { + level_info_t *info = &wadlevelinfos[i]; + MapData *map = P_OpenMapData(info->MapName, true); + + if (map != NULL) + { + Printf("%s: '%s' (%s)\n", info->MapName.GetChars(), info->LookupLevelName().GetChars(), + Wads.GetWadName(Wads.GetLumpFile(map->lumpnum))); + delete map; + } + } +} + +//========================================================================== +// +// For testing sky fog sheets +// +//========================================================================== +CCMD(skyfog) +{ + if (argv.argc() > 1) + { + // Do this only on the primary level. + primaryLevel->skyfog = MAX(0, (int)strtoull(argv[1], NULL, 0)); + } +} + + +//========================================================================== +// +// +//========================================================================== + +CCMD(listsnapshots) +{ + for (unsigned i = 0; i < wadlevelinfos.Size(); ++i) + { + FCompressedBuffer *snapshot = &wadlevelinfos[i].Snapshot; + if (snapshot->mBuffer != nullptr) + { + Printf("%s (%u -> %u bytes)\n", wadlevelinfos[i].MapName.GetChars(), snapshot->mCompressedSize, snapshot->mSize); + } + } +} + diff --git a/src/g_game.cpp b/src/g_game.cpp index d389dc5300..861b506a85 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -174,9 +174,7 @@ uint8_t* zdembodyend; // end of ZDEM BODY chunk bool singledemo; // quit after playing a demo from cmdline bool precache = true; // if true, load all graphics at start - -wbstartstruct_t wminfo; // parms for world map / intermission - + short consistancy[MAXPLAYERS][BACKUPTICS]; diff --git a/src/g_hub.cpp b/src/g_hub.cpp index 677b991609..0e70deb1ab 100644 --- a/src/g_hub.cpp +++ b/src/g_hub.cpp @@ -129,12 +129,13 @@ void G_LeavingHub(FLevelLocals *Level, int mode, cluster_info_t * cluster, wbsta { if (cluster->flags & CLUSTER_LOOKUPNAME) { - Level->LevelName = GStrings(cluster->ClusterName); + wbs->thisname = GStrings(cluster->ClusterName); } else { - Level->LevelName = cluster->ClusterName; + wbs->thisname = cluster->ClusterName; } + wbs->LName0.SetInvalid(); // The level's own name was just invalidated, and so was its name patch. } } } diff --git a/src/g_level.cpp b/src/g_level.cpp index 66b4b84f17..0d27c6d1a6 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -81,6 +81,7 @@ #include "a_dynlight.h" #include "p_conversation.h" #include "p_effect.h" +#include "stringtable.h" #include "gi.h" @@ -753,6 +754,7 @@ void FLevelLocals::SecretExitLevel (int position) // // //========================================================================== +static wbstartstruct_t staticWmInfo; void G_DoCompleted (void) { @@ -779,7 +781,7 @@ void G_DoCompleted (void) // Close the conversation menu if open. P_FreeStrifeConversations (); - if (primaryLevel->DoCompleted(nextlevel, wminfo)) + if (primaryLevel->DoCompleted(nextlevel, staticWmInfo)) { gamestate = GS_INTERMISSION; viewactive = false; @@ -789,10 +791,16 @@ void G_DoCompleted (void) // if (statcopy) // memcpy (statcopy, &wminfo, sizeof(wminfo)); - WI_Start (&wminfo); + WI_Start (&staticWmInfo); } } +//========================================================================== +// +// Prepare the level to be exited and +// set up the wminfo struct for the coming intermission screen +// +//========================================================================== bool FLevelLocals::DoCompleted (FString nextlevel, wbstartstruct_t &wminfo) { @@ -802,29 +810,57 @@ bool FLevelLocals::DoCompleted (FString nextlevel, wbstartstruct_t &wminfo) if (!(flags & LEVEL_CHANGEMAPCHEAT)) FindLevelInfo (MapName)->flags |= LEVEL_VISITED; + uint32_t langtable[2] = {}; wminfo.finished_ep = cluster - 1; wminfo.LName0 = TexMan.CheckForTexture(info->PName, ETextureType::MiscPatch); + wminfo.thisname = info->LookupLevelName(&langtable[0]); // re-get the name so we have more info about its origin. wminfo.current = MapName; if (deathmatch && - (dmflags & DF_SAME_LEVEL) && + (*dmflags & DF_SAME_LEVEL) && !(flags & LEVEL_CHANGEMAPCHEAT)) { wminfo.next = MapName; wminfo.LName1 = wminfo.LName0; + wminfo.nextname = wminfo.thisname; } else { level_info_t *nextinfo = FindLevelInfo (nextlevel, false); if (nextinfo == NULL || strncmp (nextlevel, "enDSeQ", 6) == 0) { - wminfo.next = nextlevel; + wminfo.next = ""; wminfo.LName1.SetInvalid(); + wminfo.nextname = ""; } else { wminfo.next = nextinfo->MapName; wminfo.LName1 = TexMan.CheckForTexture(nextinfo->PName, ETextureType::MiscPatch); + wminfo.nextname = nextinfo->LookupLevelName(&langtable[1]); + } + } + + // This cannot use any common localization logic because it may not replace user content at all. + // Unlike the menus, replacements here do not merely change the style but also the content. + // On the other hand, the IWAD lumps may always be replaced with text, because they are the same style as the BigFont. + if (gameinfo.flags & GI_IGNORETITLEPATCHES) + { + FTextureID *texids[] = { &wminfo.LName0, &wminfo.LName1 }; + for (int i = 0; i < 2; i++) + { + if (texids[i]->isValid() && langtable[i] != FStringTable::default_table) + { + FTexture *tex = TexMan.GetTexture(*texids[i]); + if (tex != nullptr) + { + int filenum = Wads.GetLumpFile(tex->GetSourceLump()); + if (filenum >= 0 && filenum <= Wads.GetIwadNum()) + { + texids[i]->SetInvalid(); + } + } + } } } @@ -1296,7 +1332,7 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, WorldDone) void G_DoWorldDone (void) { gamestate = GS_LEVEL; - if (wminfo.next[0] == 0) + if (nextlevel.IsEmpty()) { // Don't crash if no next map is given. Just repeat the current one. Printf ("No next map specified.\n"); @@ -1598,68 +1634,6 @@ void FLevelLocals::Init() notexturefill = info->notexturefill < 0 ? gl_notexturefill : !!info->notexturefill; } -//========================================================================== -// -// -//========================================================================== - -bool FLevelLocals::IsJumpingAllowed() const -{ - if (dmflags & DF_NO_JUMP) - return false; - if (dmflags & DF_YES_JUMP) - return true; - return !(flags & LEVEL_JUMP_NO); -} - -DEFINE_ACTION_FUNCTION(FLevelLocals, IsJumpingAllowed) -{ - PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); - ACTION_RETURN_BOOL(self->IsJumpingAllowed()); -} - - -//========================================================================== -// -// -//========================================================================== - -bool FLevelLocals::IsCrouchingAllowed() const -{ - if (dmflags & DF_NO_CROUCH) - return false; - if (dmflags & DF_YES_CROUCH) - return true; - return !(flags & LEVEL_CROUCH_NO); -} - -DEFINE_ACTION_FUNCTION(FLevelLocals, IsCrouchingAllowed) -{ - PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); - ACTION_RETURN_BOOL(self->IsCrouchingAllowed()); -} - -//========================================================================== -// -// -//========================================================================== - -bool FLevelLocals::IsFreelookAllowed() const -{ - if (dmflags & DF_NO_FREELOOK) - return false; - if (dmflags & DF_YES_FREELOOK) - return true; - return !(flags & LEVEL_FREELOOK_NO); -} - -DEFINE_ACTION_FUNCTION(FLevelLocals, IsFreelookAllowed) -{ - PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); - ACTION_RETURN_BOOL(self->IsFreelookAllowed()); -} - - //========================================================================== // // @@ -1699,89 +1673,6 @@ void FLevelLocals::AirControlChanged () } } -//========================================================================== -// -// Archives the current level -// -//========================================================================== - -void FLevelLocals::SnapshotLevel () -{ - info->Snapshot.Clean(); - - if (info->isValid()) - { - FSerializer arc(this); - - if (arc.OpenWriter(save_formatted)) - { - SaveVersion = SAVEVER; - Serialize(arc, false); - info->Snapshot = arc.GetCompressedOutput(); - } - } -} - -//========================================================================== -// -// Unarchives the current level based on its snapshot -// The level should have already been loaded and setup. -// -//========================================================================== - -void FLevelLocals::UnSnapshotLevel (bool hubLoad) -{ - if (info->Snapshot.mBuffer == nullptr) - return; - - if (info->isValid()) - { - FSerializer arc(this); - if (!arc.OpenReader(&info->Snapshot)) - { - I_Error("Failed to load savegame"); - return; - } - - Serialize (arc, hubLoad); - FromSnapshot = true; - - auto it = GetThinkerIterator(NAME_PlayerPawn); - AActor *pawn, *next; - - next = it.Next(); - while ((pawn = next) != 0) - { - next = it.Next(); - if (pawn->player == nullptr || pawn->player->mo == nullptr || !PlayerInGame(pawn->player)) - { - int i; - - // If this isn't the unmorphed original copy of a player, destroy it, because it's extra. - for (i = 0; i < MAXPLAYERS; ++i) - { - if (PlayerInGame(i) && Players[i]->morphTics && Players[i]->mo->alternative == pawn) - { - break; - } - } - if (i == MAXPLAYERS) - { - pawn->Destroy (); - } - } - } - arc.Close(); - } - // No reason to keep the snapshot around once the level's been entered. - info->Snapshot.Clean(); - if (hubLoad) - { - // Unlock ACS global strings that were locked when the snapshot was made. - Behaviors.UnlockLevelVarStrings(levelnum); - } -} - //========================================================================== // // @@ -1932,23 +1823,6 @@ void G_ReadVisited(FSerializer &arc) // //========================================================================== -CCMD(listsnapshots) -{ - for (unsigned i = 0; i < wadlevelinfos.Size(); ++i) - { - FCompressedBuffer *snapshot = &wadlevelinfos[i].Snapshot; - if (snapshot->mBuffer != nullptr) - { - Printf("%s (%u -> %u bytes)\n", wadlevelinfos[i].MapName.GetChars(), snapshot->mCompressedSize, snapshot->mSize); - } - } -} - -//========================================================================== -// -// -//========================================================================== - void P_WriteACSDefereds (FSerializer &arc) { bool found = false; @@ -2286,64 +2160,3 @@ int IsPointInMap(FLevelLocals *Level, double x, double y, double z) return true; } -//========================================================================== -// -// Lists all currently defined maps -// -//========================================================================== - -CCMD(listmaps) -{ - for(unsigned i = 0; i < wadlevelinfos.Size(); i++) - { - level_info_t *info = &wadlevelinfos[i]; - MapData *map = P_OpenMapData(info->MapName, true); - - if (map != NULL) - { - Printf("%s: '%s' (%s)\n", info->MapName.GetChars(), info->LookupLevelName().GetChars(), - Wads.GetWadName(Wads.GetLumpFile(map->lumpnum))); - delete map; - } - } -} - -//========================================================================== -// -// For testing sky fog sheets -// -//========================================================================== -CCMD(skyfog) -{ - if (argv.argc()>1) - { - // Do this only on the primary level. - primaryLevel->skyfog = MAX(0, (int)strtoull(argv[1], NULL, 0)); - } -} - - -//========================================================================== -// -// ZScript counterpart to ACS ChangeSky, uses TextureIDs -// -//========================================================================== -DEFINE_ACTION_FUNCTION(FLevelLocals, ChangeSky) -{ - PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); - PARAM_INT(sky1); - PARAM_INT(sky2); - self->skytexture1 = FSetTextureID(sky1); - self->skytexture2 = FSetTextureID(sky2); - InitSkyMap(self); - return 0; -} - -DEFINE_ACTION_FUNCTION(FLevelLocals, StartIntermission) -{ - PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); - PARAM_NAME(seq); - PARAM_INT(state); - F_StartIntermission(seq, (uint8_t)state); - return 0; -} diff --git a/src/g_levellocals.h b/src/g_levellocals.h index afa6dd454b..37b280b5d7 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -143,6 +143,13 @@ private: void AddDisplacementForPortal(FSectorPortal *portal); void AddDisplacementForPortal(FLinePortal *portal); bool ConnectPortalGroups(); + + void SerializePlayers(FSerializer &arc, bool skipload); + void CopyPlayer(player_t *dst, player_t *src, const char *name); + void ReadOnePlayer(FSerializer &arc, bool skipload); + void ReadMultiplePlayers(FSerializer &arc, int numPlayers, int numPlayersNow, bool skipload); + void SerializeSounds(FSerializer &arc); + public: void SnapshotLevel(); void UnSnapshotLevel(bool hubLoad); @@ -646,9 +653,47 @@ public: TObjPtr SpotState = nullptr; - bool IsJumpingAllowed() const; - bool IsCrouchingAllowed() const; - bool IsFreelookAllowed() const; + //========================================================================== + // + // + //========================================================================== + + bool IsJumpingAllowed() const + { + if (dmflags & DF_NO_JUMP) + return false; + if (dmflags & DF_YES_JUMP) + return true; + return !(flags & LEVEL_JUMP_NO); + } + + //========================================================================== + // + // + //========================================================================== + + bool IsCrouchingAllowed() const + { + if (dmflags & DF_NO_CROUCH) + return false; + if (dmflags & DF_YES_CROUCH) + return true; + return !(flags & LEVEL_CROUCH_NO); + } + + //========================================================================== + // + // + //========================================================================== + + bool IsFreelookAllowed() const + { + if (dmflags & DF_NO_FREELOOK) + return false; + if (dmflags & DF_YES_FREELOOK) + return true; + return !(flags & LEVEL_FREELOOK_NO); + } node_t *HeadNode() const { diff --git a/src/g_shared/a_dynlight.h b/src/g_shared/a_dynlight.h index 54da9e7d54..2a681a71d1 100644 --- a/src/g_shared/a_dynlight.h +++ b/src/g_shared/a_dynlight.h @@ -1,7 +1,7 @@ #pragma once #include "c_cvars.h" #include "actor.h" -#include "cycler.h" +#include "r_data/cycler.h" #include "g_levellocals.h" struct side_t; diff --git a/src/g_statusbar/hudmessages.cpp b/src/g_statusbar/hudmessages.cpp index 11c7aa1a4c..9a57741bab 100644 --- a/src/g_statusbar/hudmessages.cpp +++ b/src/g_statusbar/hudmessages.cpp @@ -713,7 +713,7 @@ DHUDMessageTypeOnFadeOut::DHUDMessageTypeOnFadeOut (FFont *font, const char *tex if (TypeOnTime == 0.f) TypeOnTime = 0.1f; CurrLine = 0; - LineLen = (int)Lines[0].Text.Len(); + LineLen = Lines.Size() > 0? (int)Lines[0].Text.Len() : 0; LineVisible = 0; State = 3; } @@ -741,7 +741,7 @@ void DHUDMessageTypeOnFadeOut::Serialize(FSerializer &arc) bool DHUDMessageTypeOnFadeOut::Tick () { - if (!Super::Tick ()) + if (LineLen > 0 && !Super::Tick ()) { if (State == 3) { @@ -771,7 +771,8 @@ bool DHUDMessageTypeOnFadeOut::Tick () if (State == 3 && --step >= 0) { linedrawcount++; - if (text[linevis++] == TEXTCOLOR_ESCAPE) + + if (text.GetNextCharacter(linevis) == TEXTCOLOR_ESCAPE) { if (text[linevis] == '[') { // named color diff --git a/src/g_statusbar/sbarinfo.cpp b/src/g_statusbar/sbarinfo.cpp index 58ad5ac110..964a23d76d 100644 --- a/src/g_statusbar/sbarinfo.cpp +++ b/src/g_statusbar/sbarinfo.cpp @@ -1356,20 +1356,20 @@ public: { Scale = { 1.,1. }; } - while(*str != '\0') + int ch; + while (ch = GetCharFromString(str), ch != '\0') { - if(*str == ' ') + if(ch == ' ') { if(script->spacingCharacter == '\0') ax += font->GetSpaceWidth(); else ax += font->GetCharWidth((unsigned char) script->spacingCharacter); - str++; continue; } - else if(*str == TEXTCOLOR_ESCAPE) + else if(ch == TEXTCOLOR_ESCAPE) { - EColorRange newColor = V_ParseFontColor(++str, translation, boldTranslation); + EColorRange newColor = V_ParseFontColor(str, translation, boldTranslation); if(newColor != CR_UNDEFINED) fontcolor = newColor; continue; @@ -1377,17 +1377,15 @@ public: int width; if(script->spacingCharacter == '\0') //No monospace? - width = font->GetCharWidth((unsigned char) *str); + width = font->GetCharWidth(ch); else width = font->GetCharWidth((unsigned char) script->spacingCharacter); bool redirected = false; - FTexture* c = font->GetChar((unsigned char) *str, fontcolor, &width); + FTexture* c = font->GetChar(ch, fontcolor, &width); if(c == NULL) //missing character. { - str++; continue; } - int character = (unsigned char)*str; if (script->spacingCharacter == '\0') //If we are monospaced lets use the offset ax += (c->GetDisplayLeftOffset() + 1); //ignore x offsets since we adapt to character size @@ -1441,14 +1439,14 @@ public: double salpha = (Alpha *HR_SHADOW); double srx = rx + (shadowX*Scale.X); double sry = ry + (shadowY*Scale.Y); - screen->DrawChar(font, CR_UNTRANSLATED, srx, sry, character, + screen->DrawChar(font, CR_UNTRANSLATED, srx, sry, ch, DTA_DestWidthF, rw, DTA_DestHeightF, rh, DTA_Alpha, salpha, DTA_FillColor, 0, TAG_DONE); } - screen->DrawChar(font, fontcolor, rx, ry, character, + screen->DrawChar(font, fontcolor, rx, ry, ch, DTA_DestWidthF, rw, DTA_DestHeightF, rh, DTA_Alpha, Alpha, @@ -1457,7 +1455,6 @@ public: ax += width + spacing - (c->GetDisplayLeftOffsetDouble() + 1); else //width gets changed at the call to GetChar() ax += font->GetCharWidth((unsigned char) script->spacingCharacter) + spacing; - str++; } } diff --git a/src/g_statusbar/sbarinfo_commands.cpp b/src/g_statusbar/sbarinfo_commands.cpp index bd565cbc7a..b5a265c655 100644 --- a/src/g_statusbar/sbarinfo_commands.cpp +++ b/src/g_statusbar/sbarinfo_commands.cpp @@ -1025,7 +1025,7 @@ class CommandDrawNumber : public CommandDrawString usePrefix(false), interpolationSpeed(0), drawValue(0), length(3), lowValue(-1), lowTranslation(CR_UNTRANSLATED), highValue(-1), highTranslation(CR_UNTRANSLATED), value(CONSTANT), - inventoryItem(NULL), cvarName(nullptr) + inventoryItem(NULL) { } diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index d1cbe48a38..4a2db9fafd 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -1481,15 +1481,15 @@ void DBaseStatusBar::DrawString(FFont *font, const FString &cstring, double x, d break; case DI_TEXT_ALIGN_RIGHT: if (!monospaced) - x -= static_cast (font->StringWidth(cstring) + (spacing * cstring.Len())); + x -= static_cast (font->StringWidth(cstring) + (spacing * cstring.CharacterCount())); else //monospaced, so just multiply the character size - x -= static_cast ((spacing) * cstring.Len()); + x -= static_cast ((spacing) * cstring.CharacterCount()); break; case DI_TEXT_ALIGN_CENTER: if (!monospaced) - x -= static_cast (font->StringWidth(cstring) + (spacing * cstring.Len())) / 2; + x -= static_cast (font->StringWidth(cstring) + (spacing * cstring.CharacterCount())) / 2; else //monospaced, so just multiply the character size - x -= static_cast ((spacing)* cstring.Len()) / 2; + x -= static_cast ((spacing)* cstring.CharacterCount()) / 2; break; } @@ -1527,7 +1527,7 @@ void DBaseStatusBar::DrawString(FFont *font, const FString &cstring, double x, d Scale = { 1.,1. }; } int ch; - while (ch = *str++, ch != '\0') + while (ch = GetCharFromString(str), ch != '\0') { if (ch == ' ') { @@ -1543,7 +1543,7 @@ void DBaseStatusBar::DrawString(FFont *font, const FString &cstring, double x, d } int width; - FTexture* c = font->GetChar((unsigned char)ch, fontcolor, &width); + FTexture* c = font->GetChar(ch, fontcolor, &width); if (c == NULL) //missing character. { continue; diff --git a/src/gamedata/d_dehacked.cpp b/src/gamedata/d_dehacked.cpp index dbf98a17f7..4643cd492c 100644 --- a/src/gamedata/d_dehacked.cpp +++ b/src/gamedata/d_dehacked.cpp @@ -285,7 +285,7 @@ static bool including, includenotext; static const char *unknown_str = "Unknown key %s encountered in %s %d.\n"; -static FStringTable *EnglishStrings; +static StringMap EnglishStrings, DehStrings; // This is an offset to be used for computing the text stuff. // Straight from the DeHackEd source which was @@ -2169,7 +2169,7 @@ static int PatchMusic (int dummy) keystring << "MUSIC_" << Line1; - GStrings.SetString (keystring, newname); + DehStrings.Insert(keystring, newname); DPrintf (DMSG_SPAMMY, "Music %s set to:\n%s\n", keystring.GetChars(), newname); } @@ -2280,11 +2280,11 @@ static int PatchText (int oldSize) const char *str; do { - str = EnglishStrings->MatchString(oldStr); + str = EnglishStrings.MatchString(oldStr); if (str != NULL) { - GStrings.SetString(str, newStr); - EnglishStrings->SetString(str, "~~"); // set to something invalid so that it won't get found again by the next iteration or by another replacement later + DehStrings.Insert(str, newStr); + EnglishStrings.Remove(str); // remove entry so that it won't get found again by the next iteration or by another replacement later good = true; } } @@ -2337,7 +2337,7 @@ static int PatchStrings (int dummy) // Account for a discrepancy between Boom's and ZDoom's name for the red skull key pickup message const char *ll = Line1; if (!stricmp(ll, "GOTREDSKULL")) ll = "GOTREDSKUL"; - GStrings.SetString (ll, holdstring); + DehStrings.Insert(ll, holdstring); DPrintf (DMSG_SPAMMY, "%s set to:\n%s\n", Line1, holdstring.GetChars()); } @@ -2670,11 +2670,6 @@ static void UnloadDehSupp () StyleNames.Reset(); AmmoNames.Reset(); UnchangedSpriteNames.Reset(); - if (EnglishStrings != NULL) - { - delete EnglishStrings; - EnglishStrings = NULL; - } } } @@ -2704,12 +2699,8 @@ static bool LoadDehSupp () return true; } - if (EnglishStrings == NULL) - { - EnglishStrings = new FStringTable; - EnglishStrings->LoadStrings (true); - } - + if (EnglishStrings.CountUsed() == 0) + EnglishStrings = GStrings.GetDefaultStrings(); UnchangedSpriteNames.Resize(sprites.Size()); for (unsigned i = 0; i < UnchangedSpriteNames.Size(); ++i) @@ -3079,6 +3070,8 @@ void FinishDehPatch () StateMap.ShrinkToFit(); TouchedActors.Clear(); TouchedActors.ShrinkToFit(); + EnglishStrings.Clear(); + GStrings.SetDehackedStrings(std::move(DehStrings)); // Now it gets nasty: We have to fiddle around with the weapons' ammo use info to make Doom's original // ammo consumption work as intended. diff --git a/src/gamedata/fonts/font.cpp b/src/gamedata/fonts/font.cpp new file mode 100644 index 0000000000..5d67b3bcee --- /dev/null +++ b/src/gamedata/fonts/font.cpp @@ -0,0 +1,980 @@ +/* +** v_font.cpp +** Font management +** +**--------------------------------------------------------------------------- +** Copyright 1998-2016 Randy Heit +** Copyright 2005-2019 Christoph Oelckers +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +// HEADER FILES ------------------------------------------------------------ + +#include +#include +#include + +#include "templates.h" +#include "doomtype.h" +#include "m_swap.h" +#include "v_font.h" +#include "v_video.h" +#include "w_wad.h" +#include "gi.h" +#include "cmdlib.h" +#include "sc_man.h" +#include "hu_stuff.h" +#include "gstrings.h" +#include "v_text.h" +#include "vm.h" +#include "image.h" +#include "utf8.h" +#include "textures/formats/fontchars.h" +#include "textures/formats/multipatchtexture.h" + +#include "fontinternals.h" + + + +//========================================================================== +// +// FFont :: FFont +// +// Loads a multi-texture font. +// +//========================================================================== + +FFont::FFont (const char *name, const char *nametemplate, const char *filetemplate, int lfirst, int lcount, int start, int fdlump, int spacewidth, bool notranslate) +{ + int i; + FTextureID lump; + char buffer[12]; + int maxyoffs; + bool doomtemplate = (nametemplate && (gameinfo.gametype & GAME_DoomChex)) ? strncmp (nametemplate, "STCFN", 5) == 0 : false; + DVector2 Scale = { 1, 1 }; + + noTranslate = notranslate; + Lump = fdlump; + FontHeight = 0; + GlobalKerning = false; + FontName = name; + Next = FirstFont; + FirstFont = this; + Cursor = '_'; + ActiveColors = 0; + SpaceWidth = 0; + FontHeight = 0; + uint8_t pp = 0; + for (auto &p : PatchRemap) p = pp++; + translateUntranslated = false; + int FixedWidth = 0; + + maxyoffs = 0; + + TMap charMap; + int minchar = INT_MAX; + int maxchar = INT_MIN; + + // Read the font's configuration. + // This will not be done for the default fonts, because they are not atomic and the default content does not need it. + + TArray folderdata; + if (filetemplate != nullptr) + { + FStringf path("fonts/%s/", filetemplate); + // If a name template is given, collect data from all resource files. + // For anything else, each folder is being treated as an atomic, self-contained unit and mixing from different glyph sets is blocked. + Wads.GetLumpsInFolder(path, folderdata, nametemplate == nullptr); + + if (nametemplate == nullptr) + { + // Only take font.inf from the actual folder we are processing but not from an older folder that may have been superseded. + FStringf infpath("fonts/%s/font.inf", filetemplate); + + unsigned index = folderdata.FindEx([=](const FolderEntry &entry) + { + return infpath.CompareNoCase(entry.name) == 0; + }); + + if (index < folderdata.Size()) + { + FScanner sc; + sc.OpenLumpNum(folderdata[index].lumpnum); + while (sc.GetToken()) + { + sc.TokenMustBe(TK_Identifier); + if (sc.Compare("Kerning")) + { + sc.MustGetValue(false); + GlobalKerning = sc.Number; + } + else if (sc.Compare("Scale")) + { + sc.MustGetValue(true); + Scale.Y = Scale.X = sc.Float; + if (sc.CheckToken(',')) + { + sc.MustGetValue(true); + Scale.Y = sc.Float; + } + } + else if (sc.Compare("SpaceWidth")) + { + sc.MustGetValue(false); + SpaceWidth = sc.Number; + } + else if (sc.Compare("FontHeight")) + { + sc.MustGetValue(false); + FontHeight = sc.Number; + } + else if (sc.Compare("CellSize")) + { + sc.MustGetValue(false); + FixedWidth = sc.Number; + sc.MustGetToken(','); + sc.MustGetValue(false); + FontHeight = sc.Number; + } + else if (sc.Compare("Translationtype")) + { + sc.MustGetToken(TK_Identifier); + if (sc.Compare("console")) + { + TranslationType = 1; + } + else if (sc.Compare("standard")) + { + TranslationType = 0; + } + else + { + sc.ScriptError("Unknown translation type %s", sc.String); + } + } + } + } + } + } + + if (FixedWidth > 0) + { + ReadSheetFont(folderdata, FixedWidth, FontHeight, Scale); + } + else + { + if (nametemplate != nullptr) + { + for (i = 0; i < lcount; i++) + { + int position = '!' + i; + mysnprintf(buffer, countof(buffer), nametemplate, i + start); + + lump = TexMan.CheckForTexture(buffer, ETextureType::MiscPatch); + if (doomtemplate && lump.isValid() && i + start == 121) + { // HACKHACK: Don't load STCFN121 in doom(2), because + // it's not really a lower-case 'y' but a '|'. + // Because a lot of wads with their own font seem to foolishly + // copy STCFN121 and make it a '|' themselves, wads must + // provide STCFN120 (x) and STCFN122 (z) for STCFN121 to load as a 'y'. + if (!TexMan.CheckForTexture("STCFN120", ETextureType::MiscPatch).isValid() || + !TexMan.CheckForTexture("STCFN122", ETextureType::MiscPatch).isValid()) + { + // insert the incorrectly named '|' graphic in its correct position. + position = 124; + } + } + if (lump.isValid()) + { + if (position < minchar) minchar = position; + if (position > maxchar) maxchar = position; + charMap.Insert(position, TexMan.GetTexture(lump)); + } + } + } + if (folderdata.Size() > 0) + { + // all valid lumps must be named with a hex number that represents its Unicode character index. + for (auto &entry : folderdata) + { + char *endp; + auto base = ExtractFileBase(entry.name); + auto position = strtoll(base.GetChars(), &endp, 16); + if ((*endp == 0 || (*endp == '.' && position >= '!' && position < 0xffff))) + { + auto lump = TexMan.CheckForTexture(entry.name, ETextureType::MiscPatch); + if (lump.isValid()) + { + if ((int)position < minchar) minchar = (int)position; + if ((int)position > maxchar) maxchar = (int)position; + auto tex = TexMan.GetTexture(lump); + tex->SetScale(Scale); + charMap.Insert((int)position, tex); + } + } + } + } + FirstChar = minchar; + LastChar = maxchar; + auto count = maxchar - minchar + 1; + Chars.Resize(count); + int fontheight = 0; + + for (i = 0; i < count; i++) + { + auto lump = charMap.CheckKey(FirstChar + i); + if (lump != nullptr) + { + FTexture *pic = *lump; + if (pic != nullptr) + { + int height = pic->GetDisplayHeight(); + int yoffs = pic->GetDisplayTopOffset(); + + if (yoffs > maxyoffs) + { + maxyoffs = yoffs; + } + height += abs(yoffs); + if (height > fontheight) + { + fontheight = height; + } + } + + pic->SetUseType(ETextureType::FontChar); + if (!noTranslate) + { + Chars[i].OriginalPic = pic; + Chars[i].TranslatedPic = new FImageTexture(new FFontChar1(pic->GetImage()), ""); + Chars[i].TranslatedPic->CopySize(pic); + Chars[i].TranslatedPic->SetUseType(ETextureType::FontChar); + TexMan.AddTexture(Chars[i].TranslatedPic); + } + else + { + Chars[i].TranslatedPic = pic; + } + + Chars[i].XMove = Chars[i].TranslatedPic->GetDisplayWidth(); + } + else + { + Chars[i].TranslatedPic = nullptr; + Chars[i].XMove = INT_MIN; + } + } + + if (SpaceWidth == 0) // An explicit override from the .inf file must always take precedence + { + if (spacewidth != -1) + { + SpaceWidth = spacewidth; + } + else if ('N' - FirstChar >= 0 && 'N' - FirstChar < count && Chars['N' - FirstChar].TranslatedPic != nullptr) + { + SpaceWidth = (Chars['N' - FirstChar].XMove + 1) / 2; + } + else + { + SpaceWidth = 4; + } + } + if (FontHeight == 0) FontHeight = fontheight; + + FixXMoves(); + } + + if (!noTranslate) LoadTranslations(); +} + +void FFont::ReadSheetFont(TArray &folderdata, int width, int height, const DVector2 &Scale) +{ + // all valid lumps must be named with a hex number that represents the Unicode character index for its first character, + TArray part(1, true); + TMap charMap; + int minchar = INT_MAX; + int maxchar = INT_MIN; + for (auto &entry : folderdata) + { + char *endp; + auto base = ExtractFileBase(entry.name); + auto position = strtoll(base.GetChars(), &endp, 16); + if ((*endp == 0 || (*endp == '.' && position >= 0 && position < 0xffff))) // Sheet fonts may fill in the low control chars. + { + auto lump = TexMan.CheckForTexture(entry.name, ETextureType::MiscPatch); + if (lump.isValid()) + { + auto tex = TexMan.GetTexture(lump); + int numtex_x = tex->GetWidth() / width; + int numtex_y = tex->GetHeight() / height; + int maxinsheet = int(position) + numtex_x * numtex_y - 1; + if (minchar > position) minchar = int(position); + if (maxchar < maxinsheet) maxchar = maxinsheet; + + for (int y = 0; y < numtex_y; y++) + { + for (int x = 0; x < numtex_x; x++) + { + part[0].OriginX = -width * x; + part[0].OriginY = -height * y; + part[0].Image = tex->GetImage(); + FMultiPatchTexture *image = new FMultiPatchTexture(width, height, part, false, false); + FImageTexture *tex = new FImageTexture(image, ""); + tex->SetUseType(ETextureType::FontChar); + tex->bMultiPatch = true; + tex->Width = width; + tex->Height = height; + tex->_LeftOffset[0] = + tex->_LeftOffset[1] = + tex->_TopOffset[0] = + tex->_TopOffset[1] = 0; + tex->Scale = Scale; + tex->bMasked = true; + tex->bTranslucent = -1; + tex->bWorldPanning = true; + tex->bNoDecals = false; + tex->SourceLump = -1; // We do not really care. + TexMan.AddTexture(tex); + charMap.Insert(int(position) + x + y * numtex_x, tex); + } + } + } + } + } + + + FirstChar = minchar; + bool map1252 = false; + if (minchar < 0x80 && maxchar >= 0xa0) // should be a settable option, but that'd probably cause more problems than it'd solve. + { + if (maxchar < 0x2122) maxchar = 0x2122; + map1252 = true; + } + LastChar = maxchar; + auto count = maxchar - minchar + 1; + Chars.Resize(count); + int fontheight = 0; + + for (int i = 0; i < count; i++) + { + auto lump = charMap.CheckKey(FirstChar + i); + if (lump != nullptr) + { + FTexture *pic = *lump; + + auto b = pic->Get8BitPixels(false); + + Chars[i].OriginalPic = pic; + Chars[i].TranslatedPic = new FImageTexture(new FFontChar1(pic->GetImage()), ""); + Chars[i].TranslatedPic->CopySize(pic); + Chars[i].TranslatedPic->SetUseType(ETextureType::FontChar); + TexMan.AddTexture(Chars[i].TranslatedPic); + } + Chars[i].XMove = width; + } + + if (map1252) + { + // Move the Windows-1252 characters to their proper place. + for (int i = 0x80; i < 0xa0; i++) + { + if (win1252map[i - 0x80] != i && Chars[i - minchar].TranslatedPic != nullptr && Chars[win1252map[i - 0x80] - minchar].TranslatedPic == nullptr) + { + std::swap(Chars[i - minchar], Chars[win1252map[i - 0x80] - minchar]); + } + } + } + + SpaceWidth = width; +} + +//========================================================================== +// +// FFont :: ~FFont +// +//========================================================================== + +FFont::~FFont () +{ + FFont **prev = &FirstFont; + FFont *font = *prev; + + while (font != nullptr && font != this) + { + prev = &font->Next; + font = *prev; + } + + if (font != nullptr) + { + *prev = font->Next; + } +} + +//========================================================================== +// +// FFont :: FindFont +// +// Searches for the named font in the list of loaded fonts, returning the +// font if it was found. The disk is not checked if it cannot be found. +// +//========================================================================== + +FFont *FFont::FindFont (FName name) +{ + if (name == NAME_None) + { + return nullptr; + } + FFont *font = FirstFont; + + while (font != nullptr) + { + if (font->FontName == name) return font; + font = font->Next; + } + return nullptr; +} + +//========================================================================== +// +// RecordTextureColors +// +// Given a 256 entry buffer, sets every entry that corresponds to a color +// used by the texture to 1. +// +//========================================================================== + +void RecordTextureColors (FImageSource *pic, uint32_t *usedcolors) +{ + int x; + + auto pixels = pic->GetPalettedPixels(false); + auto size = pic->GetWidth() * pic->GetHeight(); + + for(x = 0;x < size; x++) + { + usedcolors[pixels[x]]++; + } +} + +//========================================================================== +// +// compare +// +// Used for sorting colors by brightness. +// +//========================================================================== + +static int compare (const void *arg1, const void *arg2) +{ + if (RPART(GPalette.BaseColors[*((uint8_t *)arg1)]) * 299 + + GPART(GPalette.BaseColors[*((uint8_t *)arg1)]) * 587 + + BPART(GPalette.BaseColors[*((uint8_t *)arg1)]) * 114 < + RPART(GPalette.BaseColors[*((uint8_t *)arg2)]) * 299 + + GPART(GPalette.BaseColors[*((uint8_t *)arg2)]) * 587 + + BPART(GPalette.BaseColors[*((uint8_t *)arg2)]) * 114) + return -1; + else + return 1; +} + +//========================================================================== +// +// FFont :: SimpleTranslation +// +// Colorsused, translation, and reverse must all be 256 entry buffers. +// Colorsused must already be filled out. +// Translation be set to remap the source colors to a new range of +// consecutive colors based at 1 (0 is transparent). +// Reverse will be just the opposite of translation: It maps the new color +// range to the original colors. +// *Luminosity will be an array just large enough to hold the brightness +// levels of all the used colors, in consecutive order. It is sorted from +// darkest to lightest and scaled such that the darkest color is 0.0 and +// the brightest color is 1.0. +// The return value is the number of used colors and thus the number of +// entries in *luminosity. +// +//========================================================================== + +int FFont::SimpleTranslation (uint32_t *colorsused, uint8_t *translation, uint8_t *reverse, TArray &Luminosity) +{ + double min, max, diver; + int i, j; + + memset (translation, 0, 256); + + reverse[0] = 0; + for (i = 1, j = 1; i < 256; i++) + { + if (colorsused[i]) + { + reverse[j++] = i; + } + } + + qsort (reverse+1, j-1, 1, compare); + + Luminosity.Resize(j); + Luminosity[0] = 0.0; // [BL] Prevent uninitalized memory + max = 0.0; + min = 100000000.0; + for (i = 1; i < j; i++) + { + translation[reverse[i]] = i; + + Luminosity[i] = RPART(GPalette.BaseColors[reverse[i]]) * 0.299 + + GPART(GPalette.BaseColors[reverse[i]]) * 0.587 + + BPART(GPalette.BaseColors[reverse[i]]) * 0.114; + if (Luminosity[i] > max) + max = Luminosity[i]; + if (Luminosity[i] < min) + min = Luminosity[i]; + } + diver = 1.0 / (max - min); + for (i = 1; i < j; i++) + { + Luminosity[i] = (Luminosity[i] - min) * diver; + } + + return j; +} + +//========================================================================== +// +// FFont :: BuildTranslations +// +// Build color translations for this font. Luminosity is an array of +// brightness levels. The ActiveColors member must be set to indicate how +// large this array is. Identity is an array that remaps the colors to +// their original values; it is only used for CR_UNTRANSLATED. Ranges +// is an array of TranslationParm structs defining the ranges for every +// possible color, in order. Palette is the colors to use for the +// untranslated version of the font. +// +//========================================================================== + +void FFont::BuildTranslations (const double *luminosity, const uint8_t *identity, + const void *ranges, int total_colors, const PalEntry *palette) +{ + int i, j; + const TranslationParm *parmstart = (const TranslationParm *)ranges; + + FRemapTable remap(total_colors); + + // Create different translations for different color ranges + Ranges.Clear(); + for (i = 0; i < NumTextColors; i++) + { + if (i == CR_UNTRANSLATED) + { + if (identity != nullptr) + { + memcpy (remap.Remap, identity, ActiveColors); + if (palette != nullptr) + { + memcpy (remap.Palette, palette, ActiveColors*sizeof(PalEntry)); + } + else + { + remap.Palette[0] = GPalette.BaseColors[identity[0]] & MAKEARGB(0,255,255,255); + for (j = 1; j < ActiveColors; ++j) + { + remap.Palette[j] = GPalette.BaseColors[identity[j]] | MAKEARGB(255,0,0,0); + } + } + } + else + { + remap = Ranges[0]; + } + Ranges.Push(remap); + continue; + } + + assert(parmstart->RangeStart >= 0); + + remap.Remap[0] = 0; + remap.Palette[0] = 0; + + for (j = 1; j < ActiveColors; j++) + { + int v = int(luminosity[j] * 256.0); + + // Find the color range that this luminosity value lies within. + const TranslationParm *parms = parmstart - 1; + do + { + parms++; + if (parms->RangeStart <= v && parms->RangeEnd >= v) + break; + } + while (parms[1].RangeStart > parms[0].RangeEnd); + + // Linearly interpolate to find out which color this luminosity level gets. + int rangev = ((v - parms->RangeStart) << 8) / (parms->RangeEnd - parms->RangeStart); + int r = ((parms->Start[0] << 8) + rangev * (parms->End[0] - parms->Start[0])) >> 8; // red + int g = ((parms->Start[1] << 8) + rangev * (parms->End[1] - parms->Start[1])) >> 8; // green + int b = ((parms->Start[2] << 8) + rangev * (parms->End[2] - parms->Start[2])) >> 8; // blue + r = clamp(r, 0, 255); + g = clamp(g, 0, 255); + b = clamp(b, 0, 255); + remap.Remap[j] = ColorMatcher.Pick(r, g, b); + remap.Palette[j] = PalEntry(255,r,g,b); + } + Ranges.Push(remap); + + // Advance to the next color range. + while (parmstart[1].RangeStart > parmstart[0].RangeEnd) + { + parmstart++; + } + parmstart++; + } +} + +//========================================================================== +// +// FFont :: GetColorTranslation +// +//========================================================================== + +FRemapTable *FFont::GetColorTranslation (EColorRange range, PalEntry *color) const +{ + if (noTranslate) + { + PalEntry retcolor = PalEntry(255, 255, 255, 255); + if (range >= 0 && range < NumTextColors && range != CR_UNTRANSLATED) + { + retcolor = TranslationColors[range]; + retcolor.a = 255; + } + if (color != nullptr) *color = retcolor; + } + if (ActiveColors == 0) + return nullptr; + else if (range >= NumTextColors) + range = CR_UNTRANSLATED; + //if (range == CR_UNTRANSLATED && !translateUntranslated) return nullptr; + return &Ranges[range]; +} + +//========================================================================== +// +// FFont :: GetCharCode +// +// If the character code is in the font, returns it. If it is not, but it +// is lowercase and has an uppercase variant present, return that. Otherwise +// return -1. +// +//========================================================================== + +int FFont::GetCharCode(int code, bool needpic) const +{ + if (code < 0 && code >= -128) + { + // regular chars turn negative when the 8th bit is set. + code &= 255; + } + if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) + { + return code; + } + + // Use different substitution logic based on the fonts content: + // In a font which has both upper and lower case, prefer unaccented small characters over capital ones. + // In a pure upper-case font, do not check for lower case replacements. + if (!MixedCase) + { + // Try converting lowercase characters to uppercase. + if (myislower(code)) + { + code = upperforlower[code]; + if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) + { + return code; + } + } + // Try stripping accents from accented characters. + int newcode = stripaccent(code); + if (newcode != code) + { + code = newcode; + if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) + { + return code; + } + } + } + else + { + int originalcode = code; + int newcode; + + // Try stripping accents from accented characters. This may repeat to allow multi-step fallbacks. + while ((newcode = stripaccent(code)) != code) + { + code = newcode; + if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) + { + return code; + } + } + + if (myislower(code)) + { + int upper = upperforlower[code]; + // Stripping accents did not help - now try uppercase for lowercase + if (upper != code) return GetCharCode(upper, needpic); + } + } + + return -1; +} + +//========================================================================== +// +// FFont :: GetChar +// +//========================================================================== + +FTexture *FFont::GetChar (int code, int translation, int *const width, bool *redirected) const +{ + code = GetCharCode(code, false); + int xmove = SpaceWidth; + + if (code >= 0) + { + code -= FirstChar; + xmove = Chars[code].XMove; + if (Chars[code].TranslatedPic == nullptr) + { + code = GetCharCode(code + FirstChar, true); + if (code >= 0) + { + code -= FirstChar; + xmove = Chars[code].XMove; + } + } + } + if (width != nullptr) + { + *width = xmove; + } + if (code < 0) return nullptr; + + + if (translation == CR_UNTRANSLATED) + { + bool redirect = Chars[code].OriginalPic && Chars[code].OriginalPic != Chars[code].TranslatedPic; + if (redirected) *redirected = redirect; + if (redirect) + { + assert(Chars[code].OriginalPic->UseType == ETextureType::FontChar); + return Chars[code].OriginalPic; + } + } + if (redirected) *redirected = false; + assert(Chars[code].TranslatedPic->UseType == ETextureType::FontChar); + return Chars[code].TranslatedPic; +} + +//========================================================================== +// +// FFont :: GetCharWidth +// +//========================================================================== + +int FFont::GetCharWidth (int code) const +{ + code = GetCharCode(code, false); + return (code < 0) ? SpaceWidth : Chars[code - FirstChar].XMove; +} + +//========================================================================== +// +// +// +//========================================================================== + +double GetBottomAlignOffset(FFont *font, int c) +{ + int w; + FTexture *tex_zero = font->GetChar('0', CR_UNDEFINED, &w); + FTexture *texc = font->GetChar(c, CR_UNDEFINED, &w); + double offset = 0; + if (texc) offset += texc->GetDisplayTopOffsetDouble(); + if (tex_zero) offset += -tex_zero->GetDisplayTopOffsetDouble() + tex_zero->GetDisplayHeightDouble(); + return offset; +} + +//========================================================================== +// +// Find string width using this font +// +//========================================================================== + +int FFont::StringWidth(const uint8_t *string) const +{ + int w = 0; + int maxw = 0; + + while (*string) + { + auto chr = GetCharFromString(string); + if (chr == TEXTCOLOR_ESCAPE) + { + // We do not need to check for UTF-8 in here. + if (*string == '[') + { + while (*string != '\0' && *string != ']') + { + ++string; + } + } + if (*string != '\0') + { + ++string; + } + continue; + } + else if (chr == '\n') + { + if (w > maxw) + maxw = w; + w = 0; + } + else + { + w += GetCharWidth(chr) + GlobalKerning; + } + } + + return MAX(maxw, w); +} + +//========================================================================== +// +// FFont :: LoadTranslations +// +//========================================================================== + +void FFont::LoadTranslations() +{ + unsigned int count = LastChar - FirstChar + 1; + uint32_t usedcolors[256] = {}; + uint8_t identity[256]; + TArray Luminosity; + + for (unsigned int i = 0; i < count; i++) + { + if (Chars[i].TranslatedPic) + { + FFontChar1 *pic = static_cast(Chars[i].TranslatedPic->GetImage()); + if (pic) + { + pic->SetSourceRemap(nullptr); // Force the FFontChar1 to return the same pixels as the base texture + RecordTextureColors(pic, usedcolors); + } + } + } + + // Fixme: This needs to build a translation based on the source palette, not some intermediate 'ordered' table. + + ActiveColors = SimpleTranslation (usedcolors, PatchRemap, identity, Luminosity); + + for (unsigned int i = 0; i < count; i++) + { + if(Chars[i].TranslatedPic) + static_cast(Chars[i].TranslatedPic->GetImage())->SetSourceRemap(PatchRemap); + } + + BuildTranslations (Luminosity.Data(), identity, &TranslationParms[TranslationType][0], ActiveColors, nullptr); +} + +//========================================================================== +// +// FFont :: FFont - default constructor +// +//========================================================================== + +FFont::FFont (int lump) +{ + Lump = lump; + FontName = NAME_None; + Cursor = '_'; + noTranslate = false; + uint8_t pp = 0; + for (auto &p : PatchRemap) p = pp++; +} + +//========================================================================== +// +// FFont :: FixXMoves +// +// If a font has gaps in its characters, set the missing characters' +// XMoves to either SpaceWidth or the unaccented or uppercase variant's +// XMove. Missing XMoves must be initialized with INT_MIN beforehand. +// +//========================================================================== + +void FFont::FixXMoves() +{ + for (int i = 0; i <= LastChar - FirstChar; ++i) + { + if (Chars[i].XMove == INT_MIN) + { + // Try an uppercase character. + if (myislower(i + FirstChar)) + { + int upper = upperforlower[FirstChar + i]; + if (upper >= FirstChar && upper <= LastChar ) + { + Chars[i].XMove = Chars[upper - FirstChar].XMove; + continue; + } + } + // Try an unnaccented character. + int noaccent = stripaccent(i + FirstChar); + if (noaccent != i + FirstChar) + { + noaccent -= FirstChar; + if (noaccent >= 0) + { + Chars[i].XMove = Chars[noaccent].XMove; + continue; + } + } + Chars[i].XMove = SpaceWidth; + } + } +} + + diff --git a/src/gamedata/fonts/fontinternals.h b/src/gamedata/fonts/fontinternals.h new file mode 100644 index 0000000000..63a69733b2 --- /dev/null +++ b/src/gamedata/fonts/fontinternals.h @@ -0,0 +1,44 @@ +#pragma once + +#include +#include "tarray.h" + +// This structure is used by BuildTranslations() to hold color information. +struct TranslationParm +{ + short RangeStart; // First level for this range + short RangeEnd; // Last level for this range + uint8_t Start[3]; // Start color for this range + uint8_t End[3]; // End color for this range +}; + +struct TempParmInfo +{ + unsigned int StartParm[2]; + unsigned int ParmLen[2]; + int Index; +}; +struct TempColorInfo +{ + FName Name; + unsigned int ParmInfo; + PalEntry LogColor; +}; + +struct TranslationMap +{ + FName Name; + int Number; +}; + +extern TArray TranslationParms[2]; +extern TArray TranslationLookup; +extern TArray TranslationColors; +extern uint16_t lowerforupper[65536]; +extern uint16_t upperforlower[65536]; + +class FImageSource; + +void RecordTextureColors (FImageSource *pic, uint32_t *usedcolors); +bool myislower(int code); +int stripaccent(int code); diff --git a/src/gamedata/fonts/singlelumpfont.cpp b/src/gamedata/fonts/singlelumpfont.cpp new file mode 100644 index 0000000000..63cd6ea5a3 --- /dev/null +++ b/src/gamedata/fonts/singlelumpfont.cpp @@ -0,0 +1,653 @@ +/* +** singlelumpfont.cpp +** Management for compiled font lumps +** +**--------------------------------------------------------------------------- +** Copyright 1998-2016 Randy Heit +** Copyright 2005-2019 Christoph Oelckers +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +#include "doomerrors.h" +#include "textures.h" +#include "image.h" +#include "v_font.h" +#include "w_wad.h" +#include "utf8.h" +#include "textures/formats/fontchars.h" + +#include "fontinternals.h" + +/* Special file formats handled here: + +FON1 "console" fonts have the following header: + char Magic[4]; -- The characters "FON1" + uword CharWidth; -- Character cell width + uword CharHeight; -- Character cell height + +The FON1 header is followed by RLE character data for all 256 +8-bit ASCII characters. + + +FON2 "standard" fonts have the following header: + char Magic[4]; -- The characters "FON2" + uword FontHeight; -- Every character in a font has the same height + ubyte FirstChar; -- First character defined by this font. + ubyte LastChar; -- Last character definde by this font. + ubyte bConstantWidth; + ubyte ShadingType; + ubyte PaletteSize; -- size of palette in entries (not bytes!) + ubyte Flags; + +There is presently only one flag for FON2: + FOF_WHOLEFONTKERNING 1 -- The Kerning field is present in the file + +The FON2 header is followed by variable length data: + word Kerning; + -- only present if FOF_WHOLEFONTKERNING is set + + ubyte Palette[PaletteSize+1][3]; + -- The last entry is the delimiter color. The delimiter is not used + -- by the font but is used by imagetool when converting the font + -- back to an image. Color 0 is the transparent color and is also + -- used only for converting the font back to an image. The other + -- entries are all presorted in increasing order of brightness. + + ubyte CharacterData[...]; + -- RLE character data, in order +*/ + +class FSingleLumpFont : public FFont +{ +public: + FSingleLumpFont (const char *fontname, int lump); + +protected: + void CheckFON1Chars (double *luminosity); + void BuildTranslations2 (); + void FixupPalette (uint8_t *identity, double *luminosity, const uint8_t *palette, + bool rescale, PalEntry *out_palette); + void LoadTranslations (); + void LoadFON1 (int lump, const uint8_t *data); + void LoadFON2 (int lump, const uint8_t *data); + void LoadBMF (int lump, const uint8_t *data); + void CreateFontFromPic (FTextureID picnum); + + static int BMFCompare(const void *a, const void *b); + + enum + { + FONT1, + FONT2, + BMFFONT + } FontType; + uint8_t PaletteData[768]; + bool RescalePalette; +}; + + +//========================================================================== +// +// FSingleLumpFont :: FSingleLumpFont +// +// Loads a FON1 or FON2 font resource. +// +//========================================================================== + +FSingleLumpFont::FSingleLumpFont (const char *name, int lump) : FFont(lump) +{ + assert(lump >= 0); + + FontName = name; + + FMemLump data1 = Wads.ReadLump (lump); + const uint8_t *data = (const uint8_t *)data1.GetMem(); + + if (data[0] == 0xE1 && data[1] == 0xE6 && data[2] == 0xD5 && data[3] == 0x1A) + { + LoadBMF(lump, data); + } + else if (data[0] != 'F' || data[1] != 'O' || data[2] != 'N' || + (data[3] != '1' && data[3] != '2')) + { + I_Error ("%s is not a recognizable font", name); + } + else + { + switch (data[3]) + { + case '1': + LoadFON1 (lump, data); + break; + + case '2': + LoadFON2 (lump, data); + break; + } + } + + Next = FirstFont; + FirstFont = this; +} + +//========================================================================== +// +// FSingleLumpFont :: CreateFontFromPic +// +//========================================================================== + +void FSingleLumpFont::CreateFontFromPic (FTextureID picnum) +{ + FTexture *pic = TexMan.GetTexture(picnum); + + FontHeight = pic->GetDisplayHeight (); + SpaceWidth = pic->GetDisplayWidth (); + GlobalKerning = 0; + + FirstChar = LastChar = 'A'; + Chars.Resize(1); + Chars[0].TranslatedPic = pic; + + // Only one color range. Don't bother with the others. + ActiveColors = 0; +} + +//========================================================================== +// +// FSingleLumpFont :: LoadTranslations +// +//========================================================================== + +void FSingleLumpFont::LoadTranslations() +{ + double luminosity[256]; + uint8_t identity[256]; + PalEntry local_palette[256]; + bool useidentity = true; + bool usepalette = false; + const void* ranges; + unsigned int count = LastChar - FirstChar + 1; + + switch(FontType) + { + case FONT1: + useidentity = false; + ranges = &TranslationParms[1][0]; + CheckFON1Chars (luminosity); + break; + + case BMFFONT: + case FONT2: + usepalette = true; + FixupPalette (identity, luminosity, PaletteData, RescalePalette, local_palette); + + ranges = &TranslationParms[0][0]; + break; + + default: + // Should be unreachable. + I_Error("Unknown font type in FSingleLumpFont::LoadTranslation."); + return; + } + + for(unsigned int i = 0;i < count;++i) + { + if(Chars[i].TranslatedPic) + static_cast(Chars[i].TranslatedPic->GetImage())->SetSourceRemap(PatchRemap); + } + + BuildTranslations (luminosity, useidentity ? identity : nullptr, ranges, ActiveColors, usepalette ? local_palette : nullptr); +} + +//========================================================================== +// +// FSingleLumpFont :: LoadFON1 +// +// FON1 is used for the console font. +// +//========================================================================== + +void FSingleLumpFont::LoadFON1 (int lump, const uint8_t *data) +{ + int w, h; + + // The default console font is for Windows-1252 and fills the 0x80-0x9f range with valid glyphs. + // Since now all internal text is processed as Unicode, these have to be remapped to their proper places. + // The highest valid character in this range is 0x2122, so we need 0x2123 entries in our character table. + Chars.Resize(0x2123); + + w = data[4] + data[5]*256; + h = data[6] + data[7]*256; + + FontType = FONT1; + FontHeight = h; + SpaceWidth = w; + FirstChar = 0; + LastChar = 255; // This is to allow LoadTranslations to function. The way this is all set up really needs to be changed. + GlobalKerning = 0; + translateUntranslated = true; + LoadTranslations(); + LastChar = 0x2122; + + // Move the Windows-1252 characters to their proper place. + for (int i = 0x80; i < 0xa0; i++) + { + if (win1252map[i-0x80] != i && Chars[i].TranslatedPic != nullptr && Chars[win1252map[i - 0x80]].TranslatedPic == nullptr) + { + std::swap(Chars[i], Chars[win1252map[i - 0x80]]); + } + } +} + +//========================================================================== +// +// FSingleLumpFont :: LoadFON2 +// +// FON2 is used for everything but the console font. The console font should +// probably use FON2 as well, but oh well. +// +//========================================================================== + +void FSingleLumpFont::LoadFON2 (int lump, const uint8_t *data) +{ + int count, i, totalwidth; + uint16_t *widths; + const uint8_t *palette; + const uint8_t *data_p; + + FontType = FONT2; + FontHeight = data[4] + data[5]*256; + FirstChar = data[6]; + LastChar = data[7]; + ActiveColors = data[10]+1; + RescalePalette = data[9] == 0; + + count = LastChar - FirstChar + 1; + Chars.Resize(count); + TArray widths2(count, true); + if (data[11] & 1) + { // Font specifies a kerning value. + GlobalKerning = LittleShort(*(int16_t *)&data[12]); + widths = (uint16_t *)(data + 14); + } + else + { // Font does not specify a kerning value. + GlobalKerning = 0; + widths = (uint16_t *)(data + 12); + } + totalwidth = 0; + + if (data[8]) + { // Font is mono-spaced. + totalwidth = LittleShort(widths[0]); + for (i = 0; i < count; ++i) + { + widths2[i] = totalwidth; + } + totalwidth *= count; + palette = (uint8_t *)&widths[1]; + } + else + { // Font has varying character widths. + for (i = 0; i < count; ++i) + { + widths2[i] = LittleShort(widths[i]); + totalwidth += widths2[i]; + } + palette = (uint8_t *)(widths + i); + } + + if (FirstChar <= ' ' && LastChar >= ' ') + { + SpaceWidth = widths2[' '-FirstChar]; + } + else if (FirstChar <= 'N' && LastChar >= 'N') + { + SpaceWidth = (widths2['N' - FirstChar] + 1) / 2; + } + else + { + SpaceWidth = totalwidth * 2 / (3 * count); + } + + memcpy(PaletteData, palette, ActiveColors*3); + + data_p = palette + ActiveColors*3; + + for (i = 0; i < count; ++i) + { + int destSize = widths2[i] * FontHeight; + Chars[i].XMove = widths2[i]; + if (destSize <= 0) + { + Chars[i].TranslatedPic = nullptr; + } + else + { + Chars[i].TranslatedPic = new FImageTexture(new FFontChar2 (lump, int(data_p - data), widths2[i], FontHeight)); + Chars[i].TranslatedPic->SetUseType(ETextureType::FontChar); + TexMan.AddTexture(Chars[i].TranslatedPic); + do + { + int8_t code = *data_p++; + if (code >= 0) + { + data_p += code+1; + destSize -= code+1; + } + else if (code != -128) + { + data_p++; + destSize -= (-code)+1; + } + } while (destSize > 0); + } + if (destSize < 0) + { + i += FirstChar; + I_FatalError ("Overflow decompressing char %d (%c) of %s", i, i, FontName.GetChars()); + } + } + + LoadTranslations(); +} + +//========================================================================== +// +// FSingleLumpFont :: LoadBMF +// +// Loads a BMF font. The file format is described at +// +// +//========================================================================== + +void FSingleLumpFont::LoadBMF(int lump, const uint8_t *data) +{ + const uint8_t *chardata; + int numchars, count, totalwidth, nwidth; + int infolen; + int i, chari; + uint8_t raw_palette[256*3]; + PalEntry sort_palette[256]; + + FontType = BMFFONT; + FontHeight = data[5]; + GlobalKerning = (int8_t)data[8]; + ActiveColors = data[16]; + SpaceWidth = -1; + nwidth = -1; + RescalePalette = true; + + infolen = data[17 + ActiveColors*3]; + chardata = data + 18 + ActiveColors*3 + infolen; + numchars = chardata[0] + 256*chardata[1]; + chardata += 2; + + // Scan for lowest and highest characters defined and total font width. + FirstChar = 256; + LastChar = 0; + totalwidth = 0; + for (i = chari = 0; i < numchars; ++i, chari += 6 + chardata[chari+1] * chardata[chari+2]) + { + if ((chardata[chari+1] == 0 || chardata[chari+2] == 0) && chardata[chari+5] == 0) + { // Don't count empty characters. + continue; + } + if (chardata[chari] < FirstChar) + { + FirstChar = chardata[chari]; + } + if (chardata[chari] > LastChar) + { + LastChar = chardata[chari]; + } + totalwidth += chardata[chari+1]; + } + if (LastChar < FirstChar) + { + I_FatalError("BMF font defines no characters"); + } + count = LastChar - FirstChar + 1; + Chars.Resize(count); + // BMF palettes are only six bits per component. Fix that. + for (i = 0; i < ActiveColors*3; ++i) + { + raw_palette[i+3] = (data[17 + i] << 2) | (data[17 + i] >> 4); + } + ActiveColors++; + + // Sort the palette by increasing brightness + for (i = 0; i < ActiveColors; ++i) + { + PalEntry *pal = &sort_palette[i]; + pal->a = i; // Use alpha part to point back to original entry + pal->r = raw_palette[i*3 + 0]; + pal->g = raw_palette[i*3 + 1]; + pal->b = raw_palette[i*3 + 2]; + } + qsort(sort_palette + 1, ActiveColors - 1, sizeof(PalEntry), BMFCompare); + + // Create the PatchRemap table from the sorted "alpha" values. + PatchRemap[0] = 0; + for (i = 1; i < ActiveColors; ++i) + { + PatchRemap[sort_palette[i].a] = i; + } + + memcpy(PaletteData, raw_palette, 768); + + // Now scan through the characters again, creating glyphs for each one. + for (i = chari = 0; i < numchars; ++i, chari += 6 + chardata[chari+1] * chardata[chari+2]) + { + assert(chardata[chari] - FirstChar >= 0); + assert(chardata[chari] - FirstChar < count); + if (chardata[chari] == ' ') + { + SpaceWidth = chardata[chari+5]; + } + else if (chardata[chari] == 'N') + { + nwidth = chardata[chari+5]; + } + Chars[chardata[chari] - FirstChar].XMove = chardata[chari+5]; + if (chardata[chari+1] == 0 || chardata[chari+2] == 0) + { // Empty character: skip it. + continue; + } + auto tex = new FImageTexture(new FFontChar2(lump, int(chardata + chari + 6 - data), + chardata[chari+1], // width + chardata[chari+2], // height + -(int8_t)chardata[chari+3], // x offset + -(int8_t)chardata[chari+4] // y offset + )); + tex->SetUseType(ETextureType::FontChar); + Chars[chardata[chari] - FirstChar].TranslatedPic = tex; + TexMan.AddTexture(tex); + } + + // If the font did not define a space character, determine a suitable space width now. + if (SpaceWidth < 0) + { + if (nwidth >= 0) + { + SpaceWidth = nwidth; + } + else + { + SpaceWidth = totalwidth * 2 / (3 * count); + } + } + + FixXMoves(); + LoadTranslations(); +} + +//========================================================================== +// +// FSingleLumpFont :: BMFCompare STATIC +// +// Helper to sort BMF palettes. +// +//========================================================================== + +int FSingleLumpFont::BMFCompare(const void *a, const void *b) +{ + const PalEntry *pa = (const PalEntry *)a; + const PalEntry *pb = (const PalEntry *)b; + + return (pa->r * 299 + pa->g * 587 + pa->b * 114) - + (pb->r * 299 + pb->g * 587 + pb->b * 114); +} + +//========================================================================== +// +// FSingleLumpFont :: CheckFON1Chars +// +// Scans a FON1 resource for all the color values it uses and sets up +// some tables like SimpleTranslation. Data points to the RLE data for +// the characters. Also sets up the character textures. +// +//========================================================================== + +void FSingleLumpFont::CheckFON1Chars (double *luminosity) +{ + FMemLump memLump = Wads.ReadLump(Lump); + const uint8_t* data = (const uint8_t*) memLump.GetMem(); + + uint8_t used[256], reverse[256]; + const uint8_t *data_p; + int i, j; + + memset (used, 0, 256); + data_p = data + 8; + + for (i = 0; i < 256; ++i) + { + int destSize = SpaceWidth * FontHeight; + + if(!Chars[i].TranslatedPic) + { + Chars[i].TranslatedPic = new FImageTexture(new FFontChar2 (Lump, int(data_p - data), SpaceWidth, FontHeight)); + Chars[i].TranslatedPic->SetUseType(ETextureType::FontChar); + Chars[i].XMove = SpaceWidth; + TexMan.AddTexture(Chars[i].TranslatedPic); + } + + // Advance to next char's data and count the used colors. + do + { + int8_t code = *data_p++; + if (code >= 0) + { + destSize -= code+1; + while (code-- >= 0) + { + used[*data_p++] = 1; + } + } + else if (code != -128) + { + used[*data_p++] = 1; + destSize -= 1 - code; + } + } while (destSize > 0); + } + + memset (PatchRemap, 0, 256); + reverse[0] = 0; + for (i = 1, j = 1; i < 256; ++i) + { + if (used[i]) + { + reverse[j++] = i; + } + } + for (i = 1; i < j; ++i) + { + PatchRemap[reverse[i]] = i; + luminosity[i] = (reverse[i] - 1) / 254.0; + } + ActiveColors = j; +} + +//========================================================================== +// +// FSingleLumpFont :: FixupPalette +// +// Finds the best matches for the colors used by a FON2 font and sets up +// some tables like SimpleTranslation. +// +//========================================================================== + +void FSingleLumpFont::FixupPalette (uint8_t *identity, double *luminosity, const uint8_t *palette, bool rescale, PalEntry *out_palette) +{ + int i; + double maxlum = 0.0; + double minlum = 100000000.0; + double diver; + + identity[0] = 0; + palette += 3; // Skip the transparent color + + for (i = 1; i < ActiveColors; ++i, palette += 3) + { + int r = palette[0]; + int g = palette[1]; + int b = palette[2]; + double lum = r*0.299 + g*0.587 + b*0.114; + identity[i] = ColorMatcher.Pick (r, g, b); + luminosity[i] = lum; + out_palette[i].r = r; + out_palette[i].g = g; + out_palette[i].b = b; + out_palette[i].a = 255; + if (lum > maxlum) + maxlum = lum; + if (lum < minlum) + minlum = lum; + } + out_palette[0] = 0; + + if (rescale) + { + diver = 1.0 / (maxlum - minlum); + } + else + { + diver = 1.0 / 255.0; + } + for (i = 1; i < ActiveColors; ++i) + { + luminosity[i] = (luminosity[i] - minlum) * diver; + } +} + +FFont *CreateSingleLumpFont (const char *fontname, int lump) +{ + return new FSingleLumpFont(fontname, lump); +} diff --git a/src/gamedata/fonts/singlepicfont.cpp b/src/gamedata/fonts/singlepicfont.cpp new file mode 100644 index 0000000000..12daba0818 --- /dev/null +++ b/src/gamedata/fonts/singlepicfont.cpp @@ -0,0 +1,127 @@ +/* +** v_font.cpp +** Font management +** +**--------------------------------------------------------------------------- +** Copyright 1998-2016 Randy Heit +** Copyright 2005-2019 Christoph Oelckers +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +#include "doomerrors.h" +#include "textures.h" +#include "v_font.h" +#include "w_wad.h" + +class FSinglePicFont : public FFont +{ +public: + FSinglePicFont(const char *picname); + + // FFont interface + FTexture *GetChar(int code, int translation, int *const width, bool *redirected = nullptr) const override; + int GetCharWidth (int code) const; + +protected: + FTextureID PicNum; +}; + +//========================================================================== +// +// FSinglePicFont :: FSinglePicFont +// +// Creates a font to wrap a texture so that you can use hudmessage as if it +// were a hudpic command. It does not support translation, but animation +// is supported, unlike all the real fonts. +// +//========================================================================== + +FSinglePicFont::FSinglePicFont(const char *picname) : + FFont(-1) // Since lump is only needed for priority information we don't need to worry about this here. +{ + FTextureID picnum = TexMan.CheckForTexture (picname, ETextureType::Any); + + if (!picnum.isValid()) + { + I_FatalError ("%s is not a font or texture", picname); + } + + FTexture *pic = TexMan.GetTexture(picnum); + + FontName = picname; + FontHeight = pic->GetDisplayHeight(); + SpaceWidth = pic->GetDisplayWidth(); + GlobalKerning = 0; + FirstChar = LastChar = 'A'; + ActiveColors = 0; + PicNum = picnum; + + Next = FirstFont; + FirstFont = this; +} + +//========================================================================== +// +// FSinglePicFont :: GetChar +// +// Returns the texture if code is 'a' or 'A', otherwise nullptr. +// +//========================================================================== + +FTexture *FSinglePicFont::GetChar (int code, int translation, int *const width, bool *redirected) const +{ + *width = SpaceWidth; + if (redirected) *redirected = false; + if (code == 'a' || code == 'A') + { + return TexMan.GetPalettedTexture(PicNum, true); + } + else + { + return nullptr; + } +} + +//========================================================================== +// +// FSinglePicFont :: GetCharWidth +// +// Don't expect the text functions to work properly if I actually allowed +// the character width to vary depending on the animation frame. +// +//========================================================================== + +int FSinglePicFont::GetCharWidth (int code) const +{ + return SpaceWidth; +} + +FFont *CreateSinglePicFont(const char *picname) +{ + return new FSinglePicFont(picname); +} diff --git a/src/gamedata/fonts/specialfont.cpp b/src/gamedata/fonts/specialfont.cpp new file mode 100644 index 0000000000..1d3c92c238 --- /dev/null +++ b/src/gamedata/fonts/specialfont.cpp @@ -0,0 +1,221 @@ +/* +** v_font.cpp +** Font management +** +**--------------------------------------------------------------------------- +** Copyright 1998-2016 Randy Heit +** Copyright 2005-2019 Christoph Oelckers +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +#include "v_font.h" +#include "textures.h" +#include "image.h" +#include "textures/formats/fontchars.h" + +#include "fontinternals.h" + +// Essentially a normal multilump font but with an explicit list of character patches +class FSpecialFont : public FFont +{ +public: + FSpecialFont (const char *name, int first, int count, FTexture **lumplist, const bool *notranslate, int lump, bool donttranslate); + + void LoadTranslations(); + +protected: + bool notranslate[256]; +}; + + +//========================================================================== +// +// FSpecialFont :: FSpecialFont +// +//========================================================================== + +FSpecialFont::FSpecialFont (const char *name, int first, int count, FTexture **lumplist, const bool *notranslate, int lump, bool donttranslate) + : FFont(lump) +{ + int i; + TArray charlumps(count, true); + int maxyoffs; + FTexture *pic; + + memcpy(this->notranslate, notranslate, 256*sizeof(bool)); + + noTranslate = donttranslate; + FontName = name; + Chars.Resize(count); + FirstChar = first; + LastChar = first + count - 1; + FontHeight = 0; + GlobalKerning = false; + Next = FirstFont; + FirstFont = this; + + maxyoffs = 0; + + for (i = 0; i < count; i++) + { + pic = charlumps[i] = lumplist[i]; + if (pic != nullptr) + { + int height = pic->GetDisplayHeight(); + int yoffs = pic->GetDisplayTopOffset(); + + if (yoffs > maxyoffs) + { + maxyoffs = yoffs; + } + height += abs (yoffs); + if (height > FontHeight) + { + FontHeight = height; + } + } + + if (charlumps[i] != nullptr) + { + charlumps[i]->SetUseType(ETextureType::FontChar); + + Chars[i].OriginalPic = charlumps[i]; + if (!noTranslate) + { + Chars[i].TranslatedPic = new FImageTexture(new FFontChar1 (charlumps[i]->GetImage()), ""); + Chars[i].TranslatedPic->CopySize(charlumps[i]); + Chars[i].TranslatedPic->SetUseType(ETextureType::FontChar); + TexMan.AddTexture(Chars[i].TranslatedPic); + } + else Chars[i].TranslatedPic = charlumps[i]; + Chars[i].XMove = Chars[i].TranslatedPic->GetDisplayWidth(); + } + else + { + Chars[i].TranslatedPic = nullptr; + Chars[i].XMove = INT_MIN; + } + } + + // Special fonts normally don't have all characters so be careful here! + if ('N'-first >= 0 && 'N'-first < count && Chars['N' - first].TranslatedPic != nullptr) + { + SpaceWidth = (Chars['N' - first].XMove + 1) / 2; + } + else + { + SpaceWidth = 4; + } + + FixXMoves(); + + if (noTranslate) + { + ActiveColors = 0; + } + else + { + LoadTranslations(); + } +} + +//========================================================================== +// +// FSpecialFont :: LoadTranslations +// +//========================================================================== + +void FSpecialFont::LoadTranslations() +{ + int count = LastChar - FirstChar + 1; + uint32_t usedcolors[256] = {}; + uint8_t identity[256]; + TArray Luminosity; + int TotalColors; + int i, j; + + for (i = 0; i < count; i++) + { + if (Chars[i].TranslatedPic) + { + FFontChar1 *pic = static_cast(Chars[i].TranslatedPic->GetImage()); + if (pic) + { + pic->SetSourceRemap(nullptr); // Force the FFontChar1 to return the same pixels as the base texture + RecordTextureColors(pic, usedcolors); + } + } + } + + // exclude the non-translated colors from the translation calculation + for (i = 0; i < 256; i++) + if (notranslate[i]) + usedcolors[i] = false; + + TotalColors = ActiveColors = SimpleTranslation (usedcolors, PatchRemap, identity, Luminosity); + + // Map all untranslated colors into the table of used colors + for (i = 0; i < 256; i++) + { + if (notranslate[i]) + { + PatchRemap[i] = TotalColors; + identity[TotalColors] = i; + TotalColors++; + } + } + + for (i = 0; i < count; i++) + { + if(Chars[i].TranslatedPic) + static_cast(Chars[i].TranslatedPic->GetImage())->SetSourceRemap(PatchRemap); + } + + BuildTranslations (Luminosity.Data(), identity, &TranslationParms[0][0], TotalColors, nullptr); + + // add the untranslated colors to the Ranges tables + if (ActiveColors < TotalColors) + { + for (i = 0; i < NumTextColors; i++) + { + FRemapTable *remap = &Ranges[i]; + for (j = ActiveColors; j < TotalColors; ++j) + { + remap->Remap[j] = identity[j]; + remap->Palette[j] = GPalette.BaseColors[identity[j]]; + remap->Palette[j].a = 0xff; + } + } + } + ActiveColors = TotalColors; +} + +FFont *CreateSpecialFont (const char *name, int first, int count, FTexture **lumplist, const bool *notranslate, int lump, bool donttranslate) +{ + return new FSpecialFont(name, first, count, lumplist, notranslate, lump, donttranslate); +} diff --git a/src/gamedata/fonts/v_font.cpp b/src/gamedata/fonts/v_font.cpp new file mode 100644 index 0000000000..6ec033c9e5 --- /dev/null +++ b/src/gamedata/fonts/v_font.cpp @@ -0,0 +1,1499 @@ +/* +** v_font.cpp +** Font management +** +**--------------------------------------------------------------------------- +** Copyright 1998-2016 Randy Heit +** Copyright 2005-2019 Christoph Oelckers +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +// HEADER FILES ------------------------------------------------------------ + +#include +#include +#include + +#include "templates.h" +#include "doomtype.h" +#include "m_swap.h" +#include "v_font.h" +#include "v_video.h" +#include "w_wad.h" +#include "gi.h" +#include "cmdlib.h" +#include "sc_man.h" +#include "hu_stuff.h" +#include "gstrings.h" +#include "v_text.h" +#include "vm.h" +#include "image.h" +#include "utf8.h" +#include "textures/formats/fontchars.h" + +#include "fontinternals.h" + +// MACROS ------------------------------------------------------------------ + +#define DEFAULT_LOG_COLOR PalEntry(223,223,223) + +// TYPES ------------------------------------------------------------------- + +// EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- + +// PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- + +// PRIVATE FUNCTION PROTOTYPES --------------------------------------------- + +static int TranslationMapCompare (const void *a, const void *b); + +// EXTERNAL DATA DECLARATIONS ---------------------------------------------- + +extern int PrintColors[]; + +// PUBLIC DATA DEFINITIONS ------------------------------------------------- + +FFont *FFont::FirstFont = nullptr; +int NumTextColors; + +// PRIVATE DATA DEFINITIONS ------------------------------------------------ + +TArray TranslationParms[2]; +TArray TranslationLookup; +TArray TranslationColors; + +// CODE -------------------------------------------------------------------- + +uint16_t lowerforupper[65536]; +uint16_t upperforlower[65536]; +bool islowermap[65536]; +bool isuppermap[65536]; + +// This is a supposedly complete mapping of all lower <-> upper pairs. Most will most likely never be needed by Doom but this way there won't be any future surprises +static const uint16_t loweruppercase[] = { +0x0061,0x0041, +0x0062,0x0042, +0x0063,0x0043, +0x0064,0x0044, +0x0065,0x0045, +0x0066,0x0046, +0x0067,0x0047, +0x0068,0x0048, +0x0069,0x0049, +0x006A,0x004A, +0x006B,0x004B, +0x006C,0x004C, +0x006D,0x004D, +0x006E,0x004E, +0x006F,0x004F, +0x0070,0x0050, +0x0071,0x0051, +0x0072,0x0052, +0x0073,0x0053, +0x0074,0x0054, +0x0075,0x0055, +0x0076,0x0056, +0x0077,0x0057, +0x0078,0x0058, +0x0079,0x0059, +0x007A,0x005A, +0x00E0,0x00C0, +0x00E1,0x00C1, +0x00E2,0x00C2, +0x00E3,0x00C3, +0x00E4,0x00C4, +0x00E5,0x00C5, +0x00E6,0x00C6, +0x00E7,0x00C7, +0x00E8,0x00C8, +0x00E9,0x00C9, +0x00EA,0x00CA, +0x00EB,0x00CB, +0x00EC,0x00CC, +0x00ED,0x00CD, +0x00EE,0x00CE, +0x00EF,0x00CF, +0x00F0,0x00D0, +0x00F1,0x00D1, +0x00F2,0x00D2, +0x00F3,0x00D3, +0x00F4,0x00D4, +0x00F5,0x00D5, +0x00F6,0x00D6, +0x00F8,0x00D8, +0x00F9,0x00D9, +0x00FA,0x00DA, +0x00FB,0x00DB, +0x00FC,0x00DC, +0x00FD,0x00DD, +0x00FE,0x00DE, +0x00FF,0x0178, +0x0101,0x0100, +0x0103,0x0102, +0x0105,0x0104, +0x0107,0x0106, +0x0109,0x0108, +0x010B,0x010A, +0x010D,0x010C, +0x010F,0x010E, +0x0111,0x0110, +0x0113,0x0112, +0x0115,0x0114, +0x0117,0x0116, +0x0119,0x0118, +0x011B,0x011A, +0x011D,0x011C, +0x011F,0x011E, +0x0121,0x0120, +0x0123,0x0122, +0x0125,0x0124, +0x0127,0x0126, +0x0129,0x0128, +0x012B,0x012A, +0x012D,0x012C, +0x012F,0x012E, +0x0131,0x0049, +0x0133,0x0132, +0x0135,0x0134, +0x0137,0x0136, +0x013A,0x0139, +0x013C,0x013B, +0x013E,0x013D, +0x0140,0x013F, +0x0142,0x0141, +0x0144,0x0143, +0x0146,0x0145, +0x0148,0x0147, +0x014B,0x014A, +0x014D,0x014C, +0x014F,0x014E, +0x0151,0x0150, +0x0153,0x0152, +0x0155,0x0154, +0x0157,0x0156, +0x0159,0x0158, +0x015B,0x015A, +0x015D,0x015C, +0x015F,0x015E, +0x0161,0x0160, +0x0163,0x0162, +0x0165,0x0164, +0x0167,0x0166, +0x0169,0x0168, +0x016B,0x016A, +0x016D,0x016C, +0x016F,0x016E, +0x0171,0x0170, +0x0173,0x0172, +0x0175,0x0174, +0x0177,0x0176, +0x017A,0x0179, +0x017C,0x017B, +0x017E,0x017D, +0x0183,0x0182, +0x0185,0x0184, +0x0188,0x0187, +0x018C,0x018B, +0x0192,0x0191, +0x0199,0x0198, +0x01A1,0x01A0, +0x01A3,0x01A2, +0x01A5,0x01A4, +0x01A8,0x01A7, +0x01AD,0x01AC, +0x01B0,0x01AF, +0x01B4,0x01B3, +0x01B6,0x01B5, +0x01B9,0x01B8, +0x01BD,0x01BC, +0x01C6,0x01C4, +0x01C9,0x01C7, +0x01CC,0x01CA, +0x01CE,0x01CD, +0x01D0,0x01CF, +0x01D2,0x01D1, +0x01D4,0x01D3, +0x01D6,0x01D5, +0x01D8,0x01D7, +0x01DA,0x01D9, +0x01DC,0x01DB, +0x01DF,0x01DE, +0x01E1,0x01E0, +0x01E3,0x01E2, +0x01E5,0x01E4, +0x01E7,0x01E6, +0x01E9,0x01E8, +0x01EB,0x01EA, +0x01ED,0x01EC, +0x01EF,0x01EE, +0x01F3,0x01F1, +0x01F5,0x01F4, +0x01FB,0x01FA, +0x01FD,0x01FC, +0x01FF,0x01FE, +0x0201,0x0200, +0x0203,0x0202, +0x0205,0x0204, +0x0207,0x0206, +0x0209,0x0208, +0x020B,0x020A, +0x020D,0x020C, +0x020F,0x020E, +0x0211,0x0210, +0x0213,0x0212, +0x0215,0x0214, +0x0217,0x0216, +0x0253,0x0181, +0x0254,0x0186, +0x0257,0x018A, +0x0258,0x018E, +0x0259,0x018F, +0x025B,0x0190, +0x0260,0x0193, +0x0263,0x0194, +0x0268,0x0197, +0x0269,0x0196, +0x026F,0x019C, +0x0272,0x019D, +0x0275,0x019F, +0x0283,0x01A9, +0x0288,0x01AE, +0x028A,0x01B1, +0x028B,0x01B2, +0x0292,0x01B7, +0x03AC,0x0386, +0x03AD,0x0388, +0x03AE,0x0389, +0x03AF,0x038A, +0x03B1,0x0391, +0x03B2,0x0392, +0x03B3,0x0393, +0x03B4,0x0394, +0x03B5,0x0395, +0x03B6,0x0396, +0x03B7,0x0397, +0x03B8,0x0398, +0x03B9,0x0399, +0x03BA,0x039A, +0x03BB,0x039B, +0x03BC,0x039C, +0x03BD,0x039D, +0x03BE,0x039E, +0x03BF,0x039F, +0x03C0,0x03A0, +0x03C1,0x03A1, +0x03C3,0x03A3, +0x03C4,0x03A4, +0x03C5,0x03A5, +0x03C6,0x03A6, +0x03C7,0x03A7, +0x03C8,0x03A8, +0x03C9,0x03A9, +0x03CA,0x03AA, +0x03CB,0x03AB, +0x03CC,0x038C, +0x03CD,0x038E, +0x03CE,0x038F, +0x03E3,0x03E2, +0x03E5,0x03E4, +0x03E7,0x03E6, +0x03E9,0x03E8, +0x03EB,0x03EA, +0x03ED,0x03EC, +0x03EF,0x03EE, +0x0430,0x0410, +0x0431,0x0411, +0x0432,0x0412, +0x0433,0x0413, +0x0434,0x0414, +0x0435,0x0415, +0x0436,0x0416, +0x0437,0x0417, +0x0438,0x0418, +0x0439,0x0419, +0x043A,0x041A, +0x043B,0x041B, +0x043C,0x041C, +0x043D,0x041D, +0x043E,0x041E, +0x043F,0x041F, +0x0440,0x0420, +0x0441,0x0421, +0x0442,0x0422, +0x0443,0x0423, +0x0444,0x0424, +0x0445,0x0425, +0x0446,0x0426, +0x0447,0x0427, +0x0448,0x0428, +0x0449,0x0429, +0x044A,0x042A, +0x044B,0x042B, +0x044C,0x042C, +0x044D,0x042D, +0x044E,0x042E, +0x044F,0x042F, +0x0451,0x0401, +0x0452,0x0402, +0x0453,0x0403, +0x0454,0x0404, +0x0455,0x0405, +0x0456,0x0406, +0x0457,0x0407, +0x0458,0x0408, +0x0459,0x0409, +0x045A,0x040A, +0x045B,0x040B, +0x045C,0x040C, +0x045E,0x040E, +0x045F,0x040F, +0x0461,0x0460, +0x0463,0x0462, +0x0465,0x0464, +0x0467,0x0466, +0x0469,0x0468, +0x046B,0x046A, +0x046D,0x046C, +0x046F,0x046E, +0x0471,0x0470, +0x0473,0x0472, +0x0475,0x0474, +0x0477,0x0476, +0x0479,0x0478, +0x047B,0x047A, +0x047D,0x047C, +0x047F,0x047E, +0x0481,0x0480, +0x0491,0x0490, +0x0493,0x0492, +0x0495,0x0494, +0x0497,0x0496, +0x0499,0x0498, +0x049B,0x049A, +0x049D,0x049C, +0x049F,0x049E, +0x04A1,0x04A0, +0x04A3,0x04A2, +0x04A5,0x04A4, +0x04A7,0x04A6, +0x04A9,0x04A8, +0x04AB,0x04AA, +0x04AD,0x04AC, +0x04AF,0x04AE, +0x04B1,0x04B0, +0x04B3,0x04B2, +0x04B5,0x04B4, +0x04B7,0x04B6, +0x04B9,0x04B8, +0x04BB,0x04BA, +0x04BD,0x04BC, +0x04BF,0x04BE, +0x04C2,0x04C1, +0x04C4,0x04C3, +0x04C8,0x04C7, +0x04CC,0x04CB, +0x04D1,0x04D0, +0x04D3,0x04D2, +0x04D5,0x04D4, +0x04D7,0x04D6, +0x04D9,0x04D8, +0x04DB,0x04DA, +0x04DD,0x04DC, +0x04DF,0x04DE, +0x04E1,0x04E0, +0x04E3,0x04E2, +0x04E5,0x04E4, +0x04E7,0x04E6, +0x04E9,0x04E8, +0x04EB,0x04EA, +0x04EF,0x04EE, +0x04F1,0x04F0, +0x04F3,0x04F2, +0x04F5,0x04F4, +0x04F9,0x04F8, +0x0561,0x0531, +0x0562,0x0532, +0x0563,0x0533, +0x0564,0x0534, +0x0565,0x0535, +0x0566,0x0536, +0x0567,0x0537, +0x0568,0x0538, +0x0569,0x0539, +0x056A,0x053A, +0x056B,0x053B, +0x056C,0x053C, +0x056D,0x053D, +0x056E,0x053E, +0x056F,0x053F, +0x0570,0x0540, +0x0571,0x0541, +0x0572,0x0542, +0x0573,0x0543, +0x0574,0x0544, +0x0575,0x0545, +0x0576,0x0546, +0x0577,0x0547, +0x0578,0x0548, +0x0579,0x0549, +0x057A,0x054A, +0x057B,0x054B, +0x057C,0x054C, +0x057D,0x054D, +0x057E,0x054E, +0x057F,0x054F, +0x0580,0x0550, +0x0581,0x0551, +0x0582,0x0552, +0x0583,0x0553, +0x0584,0x0554, +0x0585,0x0555, +0x0586,0x0556, +0x10D0,0x10A0, +0x10D1,0x10A1, +0x10D2,0x10A2, +0x10D3,0x10A3, +0x10D4,0x10A4, +0x10D5,0x10A5, +0x10D6,0x10A6, +0x10D7,0x10A7, +0x10D8,0x10A8, +0x10D9,0x10A9, +0x10DA,0x10AA, +0x10DB,0x10AB, +0x10DC,0x10AC, +0x10DD,0x10AD, +0x10DE,0x10AE, +0x10DF,0x10AF, +0x10E0,0x10B0, +0x10E1,0x10B1, +0x10E2,0x10B2, +0x10E3,0x10B3, +0x10E4,0x10B4, +0x10E5,0x10B5, +0x10E6,0x10B6, +0x10E7,0x10B7, +0x10E8,0x10B8, +0x10E9,0x10B9, +0x10EA,0x10BA, +0x10EB,0x10BB, +0x10EC,0x10BC, +0x10ED,0x10BD, +0x10EE,0x10BE, +0x10EF,0x10BF, +0x10F0,0x10C0, +0x10F1,0x10C1, +0x10F2,0x10C2, +0x10F3,0x10C3, +0x10F4,0x10C4, +0x10F5,0x10C5, +0x1E01,0x1E00, +0x1E03,0x1E02, +0x1E05,0x1E04, +0x1E07,0x1E06, +0x1E09,0x1E08, +0x1E0B,0x1E0A, +0x1E0D,0x1E0C, +0x1E0F,0x1E0E, +0x1E11,0x1E10, +0x1E13,0x1E12, +0x1E15,0x1E14, +0x1E17,0x1E16, +0x1E19,0x1E18, +0x1E1B,0x1E1A, +0x1E1D,0x1E1C, +0x1E1F,0x1E1E, +0x1E21,0x1E20, +0x1E23,0x1E22, +0x1E25,0x1E24, +0x1E27,0x1E26, +0x1E29,0x1E28, +0x1E2B,0x1E2A, +0x1E2D,0x1E2C, +0x1E2F,0x1E2E, +0x1E31,0x1E30, +0x1E33,0x1E32, +0x1E35,0x1E34, +0x1E37,0x1E36, +0x1E39,0x1E38, +0x1E3B,0x1E3A, +0x1E3D,0x1E3C, +0x1E3F,0x1E3E, +0x1E41,0x1E40, +0x1E43,0x1E42, +0x1E45,0x1E44, +0x1E47,0x1E46, +0x1E49,0x1E48, +0x1E4B,0x1E4A, +0x1E4D,0x1E4C, +0x1E4F,0x1E4E, +0x1E51,0x1E50, +0x1E53,0x1E52, +0x1E55,0x1E54, +0x1E57,0x1E56, +0x1E59,0x1E58, +0x1E5B,0x1E5A, +0x1E5D,0x1E5C, +0x1E5F,0x1E5E, +0x1E61,0x1E60, +0x1E63,0x1E62, +0x1E65,0x1E64, +0x1E67,0x1E66, +0x1E69,0x1E68, +0x1E6B,0x1E6A, +0x1E6D,0x1E6C, +0x1E6F,0x1E6E, +0x1E71,0x1E70, +0x1E73,0x1E72, +0x1E75,0x1E74, +0x1E77,0x1E76, +0x1E79,0x1E78, +0x1E7B,0x1E7A, +0x1E7D,0x1E7C, +0x1E7F,0x1E7E, +0x1E81,0x1E80, +0x1E83,0x1E82, +0x1E85,0x1E84, +0x1E87,0x1E86, +0x1E89,0x1E88, +0x1E8B,0x1E8A, +0x1E8D,0x1E8C, +0x1E8F,0x1E8E, +0x1E91,0x1E90, +0x1E93,0x1E92, +0x1E95,0x1E94, +0x1EA1,0x1EA0, +0x1EA3,0x1EA2, +0x1EA5,0x1EA4, +0x1EA7,0x1EA6, +0x1EA9,0x1EA8, +0x1EAB,0x1EAA, +0x1EAD,0x1EAC, +0x1EAF,0x1EAE, +0x1EB1,0x1EB0, +0x1EB3,0x1EB2, +0x1EB5,0x1EB4, +0x1EB7,0x1EB6, +0x1EB9,0x1EB8, +0x1EBB,0x1EBA, +0x1EBD,0x1EBC, +0x1EBF,0x1EBE, +0x1EC1,0x1EC0, +0x1EC3,0x1EC2, +0x1EC5,0x1EC4, +0x1EC7,0x1EC6, +0x1EC9,0x1EC8, +0x1ECB,0x1ECA, +0x1ECD,0x1ECC, +0x1ECF,0x1ECE, +0x1ED1,0x1ED0, +0x1ED3,0x1ED2, +0x1ED5,0x1ED4, +0x1ED7,0x1ED6, +0x1ED9,0x1ED8, +0x1EDB,0x1EDA, +0x1EDD,0x1EDC, +0x1EDF,0x1EDE, +0x1EE1,0x1EE0, +0x1EE3,0x1EE2, +0x1EE5,0x1EE4, +0x1EE7,0x1EE6, +0x1EE9,0x1EE8, +0x1EEB,0x1EEA, +0x1EED,0x1EEC, +0x1EEF,0x1EEE, +0x1EF1,0x1EF0, +0x1EF3,0x1EF2, +0x1EF5,0x1EF4, +0x1EF7,0x1EF6, +0x1EF9,0x1EF8, +0x1F00,0x1F08, +0x1F01,0x1F09, +0x1F02,0x1F0A, +0x1F03,0x1F0B, +0x1F04,0x1F0C, +0x1F05,0x1F0D, +0x1F06,0x1F0E, +0x1F07,0x1F0F, +0x1F10,0x1F18, +0x1F11,0x1F19, +0x1F12,0x1F1A, +0x1F13,0x1F1B, +0x1F14,0x1F1C, +0x1F15,0x1F1D, +0x1F20,0x1F28, +0x1F21,0x1F29, +0x1F22,0x1F2A, +0x1F23,0x1F2B, +0x1F24,0x1F2C, +0x1F25,0x1F2D, +0x1F26,0x1F2E, +0x1F27,0x1F2F, +0x1F30,0x1F38, +0x1F31,0x1F39, +0x1F32,0x1F3A, +0x1F33,0x1F3B, +0x1F34,0x1F3C, +0x1F35,0x1F3D, +0x1F36,0x1F3E, +0x1F37,0x1F3F, +0x1F40,0x1F48, +0x1F41,0x1F49, +0x1F42,0x1F4A, +0x1F43,0x1F4B, +0x1F44,0x1F4C, +0x1F45,0x1F4D, +0x1F51,0x1F59, +0x1F53,0x1F5B, +0x1F55,0x1F5D, +0x1F57,0x1F5F, +0x1F60,0x1F68, +0x1F61, 0x1F69, +0x1F62, 0x1F6A, +0x1F63, 0x1F6B, +0x1F64, 0x1F6C, +0x1F65, 0x1F6D, +0x1F66, 0x1F6E, +0x1F67, 0x1F6F, +0x1F80, 0x1F88, +0x1F81, 0x1F89, +0x1F82, 0x1F8A, +0x1F83, 0x1F8B, +0x1F84, 0x1F8C, +0x1F85, 0x1F8D, +0x1F86, 0x1F8E, +0x1F87, 0x1F8F, +0x1F90, 0x1F98, +0x1F91, 0x1F99, +0x1F92, 0x1F9A, +0x1F93, 0x1F9B, +0x1F94, 0x1F9C, +0x1F95, 0x1F9D, +0x1F96, 0x1F9E, +0x1F97, 0x1F9F, +0x1FA0, 0x1FA8, +0x1FA1, 0x1FA9, +0x1FA2, 0x1FAA, +0x1FA3, 0x1FAB, +0x1FA4, 0x1FAC, +0x1FA5, 0x1FAD, +0x1FA6, 0x1FAE, +0x1FA7, 0x1FAF, +0x1FB0, 0x1FB8, +0x1FB1, 0x1FB9, +0x1FD0, 0x1FD8, +0x1FD1, 0x1FD9, +0x1FE0, 0x1FE8, +0x1FE1, 0x1FE9, +0x24D0, 0x24B6, +0x24D1, 0x24B7, +0x24D2, 0x24B8, +0x24D3, 0x24B9, +0x24D4, 0x24BA, +0x24D5, 0x24BB, +0x24D6, 0x24BC, +0x24D7, 0x24BD, +0x24D8, 0x24BE, +0x24D9, 0x24BF, +0x24DA, 0x24C0, +0x24DB, 0x24C1, +0x24DC, 0x24C2, +0x24DD, 0x24C3, +0x24DE, 0x24C4, +0x24DF, 0x24C5, +0x24E0, 0x24C6, +0x24E1, 0x24C7, +0x24E2, 0x24C8, +0x24E3, 0x24C9, +0x24E4, 0x24CA, +0x24E5, 0x24CB, +0x24E6, 0x24CC, +0x24E7, 0x24CD, +0x24E8, 0x24CE, +0x24E9, 0x24CF, +0xFF41, 0xFF21, +0xFF42, 0xFF22, +0xFF43, 0xFF23, +0xFF44, 0xFF24, +0xFF45, 0xFF25, +0xFF46, 0xFF26, +0xFF47, 0xFF27, +0xFF48, 0xFF28, +0xFF49, 0xFF29, +0xFF4A, 0xFF2A, +0xFF4B, 0xFF2B, +0xFF4C, 0xFF2C, +0xFF4D, 0xFF2D, +0xFF4E, 0xFF2E, +0xFF4F, 0xFF2F, +0xFF50, 0xFF30, +0xFF51, 0xFF31, +0xFF52, 0xFF32, +0xFF53, 0xFF33, +0xFF54, 0xFF34, +0xFF55, 0xFF35, +0xFF56, 0xFF36, +0xFF57, 0xFF37, +0xFF58, 0xFF38, +0xFF59, 0xFF39, +0xFF5A, 0xFF3A, +0, 0 +}; + +void InitLowerUpper() +{ + for (int i = 0; i < 65536; i++) + { + lowerforupper[i] = i; + upperforlower[i] = i; + } + for (int i = 0; loweruppercase[i]; i += 2) + { + auto lower = loweruppercase[i]; + auto upper = loweruppercase[i + 1]; + if (upperforlower[upper] == upper) lowerforupper[upper] = lower; // This mapping is ambiguous (see 0x0131 -> 0x0049, (small Turkish 'i' without dot.) so only pick the first match. + if (upperforlower[lower] == lower) upperforlower[lower] = upper; + isuppermap[upper] = islowermap[lower] = true; + } +} + + +bool myislower(int code) +{ + if (code >= 0 && code < 65536) return islowermap[code]; + return false; +} + +// Returns a character without an accent mark (or one with a similar looking accent in some cases where direct support is unlikely. + +int stripaccent(int code) +{ + if (code < 0x8a) + return code; + if (code < 0x100) + { + if (code == 0x8a) // Latin capital letter S with caron + return 'S'; + if (code == 0x8e) // Latin capital letter Z with caron + return 'Z'; + if (code == 0x9a) // Latin small letter S with caron + return 's'; + if (code == 0x9e) // Latin small letter Z with caron + return 'z'; + if (code == 0x9f) // Latin capital letter Y with diaeresis + return 'Y'; + if (code == 0xff) // Latin small letter Y with diaeresis + return 'y'; + // Every other accented character has the high two bits set. + if ((code & 0xC0) == 0) + return code; + // Make lowercase characters uppercase so there are half as many tests. + int acode = code & 0xDF; + if (acode >= 0xC0 && acode <= 0xC5) // A with accents + return 'A' + (code & 0x20); + if (acode == 0xC7) // Cedilla + return 'C' + (acode & 0x20); + if (acode >= 0xC8 && acode <= 0xCB) // E with accents + return 'E' + (code & 0x20); + if (acode >= 0xCC && acode <= 0xCF) // I with accents + return 'I' + (code & 0x20); + if (acode == 0xD0) // Eth + return 'D' + (code & 0x20); + if (acode == 0xD1) // N with tilde + return 'N' + (code & 0x20); + if ((acode >= 0xD2 && acode <= 0xD6) || // O with accents + acode == 0xD8) // O with stroke + return 'O' + (code & 0x20); + if (acode >= 0xD9 && acode <= 0xDC) // U with accents + return 'U' + (code & 0x20); + if (acode == 0xDD) // Y with accute + return 'Y' + (code & 0x20); + if (acode == 0xDE) // Thorn + return 'P' + (code & 0x20); // well, it sort of looks like a 'P' + } + else if (code >= 0x100 && code < 0x180) + { + static const char accentless[] = "AaAaAaCcCcCcCcDdDdEeEeEeEeEeGgGgGgGgHhHhIiIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnnNnOoOoOoOoRrRrRrSsSsSsSsTtTtTtUuUuUuUuUuUuWwYyYZzZzZz "; + return accentless[code -0x100]; + } + else if (code >= 0x200 && code < 0x21c) + { + // 0x200-0x217 are probably irrelevant but easy to map to other characters more likely to exist. 0x218-0x21b are relevant for Romanian but also have a fallback within ranges that are more likely to be supported. + static const uint16_t u200map[] = {0xc4, 0xe4, 0xc2, 0xe2, 0xcb, 0xeb, 0xca, 0xea, 0xcf, 0xef, 0xce, 0xee, 0xd6, 0xf6, 0xd4, 0xe4, 'R', 'r', 'R', 'r', 0xdc, 0xfc, 0xdb, 0xfb, 0x15e, 0x15f, 0x162, 0x163}; + return u200map[code - 0x200]; + } + + // skip the rest of Latin characters because none of them are relevant for modern languages. + + return code; +} + +FFont *V_GetFont(const char *name, const char *fontlumpname) +{ + FFont *font = FFont::FindFont (name); + if (font == nullptr) + { + int lump = -1; + int folderfile = -1; + + TArray folderdata; + FStringf path("fonts/%s/", name); + + // Use a folder-based font only if it comes from a later file than the single lump version. + if (Wads.GetLumpsInFolder(path, folderdata, true)) + { + // This assumes that any custom font comes in one piece and not distributed across multiple resource files. + folderfile = Wads.GetLumpFile(folderdata[0].lumpnum); + } + + + lump = Wads.CheckNumForFullName(fontlumpname? fontlumpname : name, true); + + if (lump != -1 && Wads.GetLumpFile(lump) >= folderfile) + { + uint32_t head; + { + auto lumpy = Wads.OpenLumpReader (lump); + lumpy.Read (&head, 4); + } + if ((head & MAKE_ID(255,255,255,0)) == MAKE_ID('F','O','N',0) || + head == MAKE_ID(0xE1,0xE6,0xD5,0x1A)) + { + FFont *CreateSingleLumpFont (const char *fontname, int lump); + return CreateSingleLumpFont (name, lump); + } + } + FTextureID picnum = TexMan.CheckForTexture (name, ETextureType::Any); + if (picnum.isValid()) + { + FTexture *tex = TexMan.GetTexture(picnum); + if (tex && tex->GetSourceLump() >= folderfile) + { + FFont *CreateSinglePicFont(const char *name); + return CreateSinglePicFont (name); + } + } + if (folderdata.Size() > 0) + { + return new FFont(name, nullptr, name, HU_FONTSTART, HU_FONTSIZE, 1, -1); + } + } + return font; +} + +//========================================================================== +// +// V_InitCustomFonts +// +// Initialize a list of custom multipatch fonts +// +//========================================================================== + +void V_InitCustomFonts() +{ + FScanner sc; + FTexture *lumplist[256]; + bool notranslate[256]; + bool donttranslate; + FString namebuffer, templatebuf; + int i; + int llump,lastlump=0; + int format; + int start; + int first; + int count; + int spacewidth; + int kerning; + char cursor = '_'; + + while ((llump = Wads.FindLump ("FONTDEFS", &lastlump)) != -1) + { + sc.OpenLumpNum(llump); + while (sc.GetString()) + { + memset (lumplist, 0, sizeof(lumplist)); + memset (notranslate, 0, sizeof(notranslate)); + donttranslate = false; + namebuffer = sc.String; + format = 0; + start = 33; + first = 33; + count = 223; + spacewidth = -1; + kerning = 0; + + sc.MustGetStringName ("{"); + while (!sc.CheckString ("}")) + { + sc.MustGetString(); + if (sc.Compare ("TEMPLATE")) + { + if (format == 2) goto wrong; + sc.MustGetString(); + templatebuf = sc.String; + format = 1; + } + else if (sc.Compare ("BASE")) + { + if (format == 2) goto wrong; + sc.MustGetNumber(); + start = sc.Number; + format = 1; + } + else if (sc.Compare ("FIRST")) + { + if (format == 2) goto wrong; + sc.MustGetNumber(); + first = sc.Number; + format = 1; + } + else if (sc.Compare ("COUNT")) + { + if (format == 2) goto wrong; + sc.MustGetNumber(); + count = sc.Number; + format = 1; + } + else if (sc.Compare ("CURSOR")) + { + sc.MustGetString(); + cursor = sc.String[0]; + } + else if (sc.Compare ("SPACEWIDTH")) + { + if (format == 2) goto wrong; + sc.MustGetNumber(); + spacewidth = sc.Number; + format = 1; + } + else if (sc.Compare("DONTTRANSLATE")) + { + donttranslate = true; + } + else if (sc.Compare ("NOTRANSLATION")) + { + if (format == 1) goto wrong; + while (sc.CheckNumber() && !sc.Crossed) + { + if (sc.Number >= 0 && sc.Number < 256) + notranslate[sc.Number] = true; + } + format = 2; + } + else if (sc.Compare("KERNING")) + { + sc.MustGetNumber(); + kerning = sc.Number; + } + else + { + if (format == 1) goto wrong; + FTexture **p = &lumplist[*(unsigned char*)sc.String]; + sc.MustGetString(); + FTextureID texid = TexMan.CheckForTexture(sc.String, ETextureType::MiscPatch); + if (texid.Exists()) + { + *p = TexMan.GetTexture(texid); + } + else if (Wads.GetLumpFile(sc.LumpNum) >= Wads.GetIwadNum()) + { + // Print a message only if this isn't in zdoom.pk3 + sc.ScriptMessage("%s: Unable to find texture in font definition for %s", sc.String, namebuffer.GetChars()); + } + format = 2; + } + } + if (format == 1) + { + FFont *fnt = new FFont (namebuffer, templatebuf, nullptr, first, count, start, llump, spacewidth, donttranslate); + fnt->SetCursor(cursor); + fnt->SetKerning(kerning); + } + else if (format == 2) + { + for (i = 0; i < 256; i++) + { + if (lumplist[i] != nullptr) + { + first = i; + break; + } + } + for (i = 255; i >= 0; i--) + { + if (lumplist[i] != nullptr) + { + count = i - first + 1; + break; + } + } + if (count > 0) + { + FFont *CreateSpecialFont (const char *name, int first, int count, FTexture **lumplist, const bool *notranslate, int lump, bool donttranslate); + FFont *fnt = CreateSpecialFont (namebuffer, first, count, &lumplist[first], notranslate, llump, donttranslate); + fnt->SetCursor(cursor); + fnt->SetKerning(kerning); + } + } + else goto wrong; + } + sc.Close(); + } + return; + +wrong: + sc.ScriptError ("Invalid combination of properties in font '%s'", namebuffer.GetChars()); +} + +//========================================================================== +// +// V_InitFontColors +// +// Reads the list of color translation definitions into memory. +// +//========================================================================== + +void V_InitFontColors () +{ + TArray names; + int lump, lastlump = 0; + TranslationParm tparm = { 0, 0, {0}, {0} }; // Silence GCC (for real with -Wextra ) + TArray parms; + TArray parminfo; + TArray colorinfo; + int c, parmchoice; + TempParmInfo info; + TempColorInfo cinfo; + PalEntry logcolor; + unsigned int i, j; + int k, index; + + info.Index = -1; + + TranslationParms[0].Clear(); + TranslationParms[1].Clear(); + TranslationLookup.Clear(); + TranslationColors.Clear(); + + while ((lump = Wads.FindLump ("TEXTCOLO", &lastlump)) != -1) + { + if (gameinfo.flags & GI_NOTEXTCOLOR) + { + // Chex3 contains a bad TEXTCOLO lump, probably to force all text to be green. + // This renders the Gray, Gold, Red and Yellow color range inoperable, some of + // which are used by the menu. So we have no choice but to skip this lump so that + // all colors work properly. + // The text colors should be the end user's choice anyway. + if (Wads.GetLumpFile(lump) == Wads.GetIwadNum()) continue; + } + FScanner sc(lump); + while (sc.GetString()) + { + names.Clear(); + + logcolor = DEFAULT_LOG_COLOR; + + // Everything until the '{' is considered a valid name for the + // color range. + names.Push (sc.String); + while (sc.MustGetString(), !sc.Compare ("{")) + { + if (names[0] == NAME_Untranslated) + { + sc.ScriptError ("The \"untranslated\" color may not have any other names"); + } + names.Push (sc.String); + } + + parmchoice = 0; + info.StartParm[0] = parms.Size(); + info.StartParm[1] = 0; + info.ParmLen[1] = info.ParmLen[0] = 0; + tparm.RangeEnd = tparm.RangeStart = -1; + + while (sc.MustGetString(), !sc.Compare ("}")) + { + if (sc.Compare ("Console:")) + { + if (parmchoice == 1) + { + sc.ScriptError ("Each color may only have one set of console ranges"); + } + parmchoice = 1; + info.StartParm[1] = parms.Size(); + info.ParmLen[0] = info.StartParm[1] - info.StartParm[0]; + tparm.RangeEnd = tparm.RangeStart = -1; + } + else if (sc.Compare ("Flat:")) + { + sc.MustGetString(); + logcolor = V_GetColor (nullptr, sc); + } + else + { + // Get first color + c = V_GetColor (nullptr, sc); + tparm.Start[0] = RPART(c); + tparm.Start[1] = GPART(c); + tparm.Start[2] = BPART(c); + + // Get second color + sc.MustGetString(); + c = V_GetColor (nullptr, sc); + tparm.End[0] = RPART(c); + tparm.End[1] = GPART(c); + tparm.End[2] = BPART(c); + + // Check for range specifier + if (sc.CheckNumber()) + { + if (tparm.RangeStart == -1 && sc.Number != 0) + { + sc.ScriptError ("The first color range must start at position 0"); + } + if (sc.Number < 0 || sc.Number > 256) + { + sc.ScriptError ("The color range must be within positions [0,256]"); + } + if (sc.Number <= tparm.RangeEnd) + { + sc.ScriptError ("The color range must not start before the previous one ends"); + } + tparm.RangeStart = sc.Number; + + sc.MustGetNumber(); + if (sc.Number < 0 || sc.Number > 256) + { + sc.ScriptError ("The color range must be within positions [0,256]"); + } + if (sc.Number <= tparm.RangeStart) + { + sc.ScriptError ("The color range end position must be larger than the start position"); + } + tparm.RangeEnd = sc.Number; + } + else + { + tparm.RangeStart = tparm.RangeEnd + 1; + tparm.RangeEnd = 256; + if (tparm.RangeStart >= tparm.RangeEnd) + { + sc.ScriptError ("The color has too many ranges"); + } + } + parms.Push (tparm); + } + } + info.ParmLen[parmchoice] = parms.Size() - info.StartParm[parmchoice]; + if (info.ParmLen[0] == 0) + { + if (names[0] != NAME_Untranslated) + { + sc.ScriptError ("There must be at least one normal range for a color"); + } + } + else + { + if (names[0] == NAME_Untranslated) + { + sc.ScriptError ("The \"untranslated\" color must be left undefined"); + } + } + if (info.ParmLen[1] == 0 && names[0] != NAME_Untranslated) + { // If a console translation is unspecified, make it white, since the console + // font has no color information stored with it. + tparm.RangeStart = 0; + tparm.RangeEnd = 256; + tparm.Start[2] = tparm.Start[1] = tparm.Start[0] = 0; + tparm.End[2] = tparm.End[1] = tparm.End[0] = 255; + info.StartParm[1] = parms.Push (tparm); + info.ParmLen[1] = 1; + } + cinfo.ParmInfo = parminfo.Push (info); + // Record this color information for each name it goes by + for (i = 0; i < names.Size(); ++i) + { + // Redefine duplicates in-place + for (j = 0; j < colorinfo.Size(); ++j) + { + if (colorinfo[j].Name == names[i]) + { + colorinfo[j].ParmInfo = cinfo.ParmInfo; + colorinfo[j].LogColor = logcolor; + break; + } + } + if (j == colorinfo.Size()) + { + cinfo.Name = names[i]; + cinfo.LogColor = logcolor; + colorinfo.Push (cinfo); + } + } + } + } + // Make permananent copies of all the color information we found. + for (i = 0, index = 0; i < colorinfo.Size(); ++i) + { + TranslationMap tmap; + TempParmInfo *pinfo; + + tmap.Name = colorinfo[i].Name; + pinfo = &parminfo[colorinfo[i].ParmInfo]; + if (pinfo->Index < 0) + { + // Write out the set of remappings for this color. + for (k = 0; k < 2; ++k) + { + for (j = 0; j < pinfo->ParmLen[k]; ++j) + { + TranslationParms[k].Push (parms[pinfo->StartParm[k] + j]); + } + } + TranslationColors.Push (colorinfo[i].LogColor); + pinfo->Index = index++; + } + tmap.Number = pinfo->Index; + TranslationLookup.Push (tmap); + } + // Leave a terminating marker at the ends of the lists. + tparm.RangeStart = -1; + TranslationParms[0].Push (tparm); + TranslationParms[1].Push (tparm); + // Sort the translation lookups for fast binary searching. + qsort (&TranslationLookup[0], TranslationLookup.Size(), sizeof(TranslationLookup[0]), TranslationMapCompare); + + NumTextColors = index; + assert (NumTextColors >= NUM_TEXT_COLORS); +} + +//========================================================================== +// +// TranslationMapCompare +// +//========================================================================== + +static int TranslationMapCompare (const void *a, const void *b) +{ + return int(((const TranslationMap *)a)->Name) - int(((const TranslationMap *)b)->Name); +} + +//========================================================================== +// +// V_FindFontColor +// +// Returns the color number for a particular named color range. +// +//========================================================================== + +EColorRange V_FindFontColor (FName name) +{ + int min = 0, max = TranslationLookup.Size() - 1; + + while (min <= max) + { + unsigned int mid = (min + max) / 2; + const TranslationMap *probe = &TranslationLookup[mid]; + if (probe->Name == name) + { + return EColorRange(probe->Number); + } + else if (probe->Name < name) + { + min = mid + 1; + } + else + { + max = mid - 1; + } + } + return CR_UNTRANSLATED; +} + +//========================================================================== +// +// V_LogColorFromColorRange +// +// Returns the color to use for text in the startup/error log window. +// +//========================================================================== + +PalEntry V_LogColorFromColorRange (EColorRange range) +{ + if ((unsigned int)range >= TranslationColors.Size()) + { // Return default color + return DEFAULT_LOG_COLOR; + } + return TranslationColors[range]; +} + +//========================================================================== +// +// V_ParseFontColor +// +// Given a pointer to a color identifier (presumably just after a color +// escape character), return the color it identifies and advances +// color_value to just past it. +// +//========================================================================== + +EColorRange V_ParseFontColor (const uint8_t *&color_value, int normalcolor, int boldcolor) +{ + const uint8_t *ch = color_value; + int newcolor = *ch++; + + if (newcolor == '-') // Normal + { + newcolor = normalcolor; + } + else if (newcolor == '+') // Bold + { + newcolor = boldcolor; + } + else if (newcolor == '!') // Team chat + { + newcolor = PrintColors[PRINT_TEAMCHAT]; + } + else if (newcolor == '*') // Chat + { + newcolor = PrintColors[PRINT_CHAT]; + } + else if (newcolor == '[') // Named + { + const uint8_t *namestart = ch; + while (*ch != ']' && *ch != '\0') + { + ch++; + } + FName rangename((const char *)namestart, int(ch - namestart), true); + if (*ch != '\0') + { + ch++; + } + newcolor = V_FindFontColor (rangename); + } + else if (newcolor >= 'A' && newcolor < NUM_TEXT_COLORS + 'A') // Standard, uppercase + { + newcolor -= 'A'; + } + else if (newcolor >= 'a' && newcolor < NUM_TEXT_COLORS + 'a') // Standard, lowercase + { + newcolor -= 'a'; + } + else // Incomplete! + { + color_value = ch - (newcolor == '\0'); + return CR_UNDEFINED; + } + color_value = ch; + return EColorRange(newcolor); +} + +//========================================================================== +// +// V_InitFonts +// +//========================================================================== + +void V_InitFonts() +{ + InitLowerUpper(); + V_InitCustomFonts(); + + // load the heads-up font + if (!(SmallFont = V_GetFont("SmallFont", "SMALLFNT"))) + { + if (Wads.CheckNumForName("FONTA_S") >= 0) + { + SmallFont = new FFont("SmallFont", "FONTA%02u", "defsmallfont", HU_FONTSTART, HU_FONTSIZE, 1, -1); + SmallFont->SetCursor('['); + } + else if (Wads.CheckNumForName("STCFN033", ns_graphics) >= 0) + { + SmallFont = new FFont("SmallFont", "STCFN%.3d", "defsmallfont", HU_FONTSTART, HU_FONTSIZE, HU_FONTSTART, -1); + } + } + if (!(SmallFont2 = V_GetFont("SmallFont2"))) // Only used by Strife + { + if (Wads.CheckNumForName("STBFN033", ns_graphics) >= 0) + { + SmallFont2 = new FFont("SmallFont2", "STBFN%.3d", "defsmallfont2", HU_FONTSTART, HU_FONTSIZE, HU_FONTSTART, -1); + } + } + if (!(BigFont = V_GetFont("BigFont"))) + { + if (gameinfo.gametype & GAME_Raven) + { + BigFont = new FFont("BigFont", "FONTB%02u", "defbigfont", HU_FONTSTART, HU_FONTSIZE, 1, -1); + } + } + if (!(ConFont = V_GetFont("ConsoleFont", "CONFONT"))) + { + ConFont = SmallFont; + } + if (!(IntermissionFont = FFont::FindFont("IntermissionFont"))) + { + if (gameinfo.gametype & GAME_DoomChex) + { + IntermissionFont = FFont::FindFont("IntermissionFont_Doom"); + } + if (IntermissionFont == nullptr) + { + IntermissionFont = BigFont; + } + } + // This can only happen if gzdoom.pk3 is corrupted. ConFont should always be present. + if (ConFont == nullptr) + { + I_FatalError("Console font not found."); + } + // SmallFont and SmallFont2 have no default provided by the engine. BigFont only has in non-Raven games. + if (SmallFont == nullptr) + { + SmallFont = ConFont; + } + if (SmallFont2 == nullptr) + { + SmallFont2 = SmallFont; + } + if (BigFont == nullptr) + { + BigFont = SmallFont; + } +} + +void V_ClearFonts() +{ + while (FFont::FirstFont != nullptr) + { + delete FFont::FirstFont; + } + FFont::FirstFont = nullptr; + SmallFont = SmallFont2 = BigFont = ConFont = IntermissionFont = nullptr; +} + diff --git a/src/v_font.h b/src/gamedata/fonts/v_font.h similarity index 88% rename from src/v_font.h rename to src/gamedata/fonts/v_font.h index 7e83735320..9495cf5e6a 100644 --- a/src/v_font.h +++ b/src/gamedata/fonts/v_font.h @@ -35,6 +35,8 @@ #define __V_FONT_H__ #include "doomtype.h" +#include "w_wad.h" +#include "vectors.h" class DCanvas; struct FRemapTable; @@ -79,7 +81,7 @@ extern int NumTextColors; class FFont { public: - FFont (const char *fontname, const char *nametemplate, int first, int count, int base, int fdlump, int spacewidth=-1, bool notranslate = false); + FFont (const char *fontname, const char *nametemplate, const char *filetemplate, int first, int count, int base, int fdlump, int spacewidth=-1, bool notranslate = false); virtual ~FFont (); virtual FTexture *GetChar (int code, int translation, int *const width, bool *redirected = nullptr) const; @@ -102,6 +104,7 @@ public: int GetCharCode(int code, bool needpic) const; char GetCursor() const { return Cursor; } void SetCursor(char c) { Cursor = c; } + void SetKerning(int c) { GlobalKerning = c; } bool NoTranslate() const { return noTranslate; } protected: @@ -111,16 +114,20 @@ protected: const void *ranges, int total_colors, const PalEntry *palette); void FixXMoves(); - static int SimpleTranslation (uint8_t *colorsused, uint8_t *translation, + static int SimpleTranslation (uint32_t *colorsused, uint8_t *translation, uint8_t *identity, TArray &Luminosity); + void ReadSheetFont(TArray &folderdata, int width, int height, const DVector2 &Scale); + int FirstChar, LastChar; int SpaceWidth; int FontHeight; int GlobalKerning; + int TranslationType = 0; char Cursor; bool noTranslate; bool translateUntranslated; + bool MixedCase = false; struct CharData { FTexture *TranslatedPic = nullptr; // Texture for use with font translations. @@ -150,7 +157,7 @@ void V_ClearFonts(); EColorRange V_FindFontColor (FName name); PalEntry V_LogColorFromColorRange (EColorRange range); EColorRange V_ParseFontColor (const uint8_t *&color_value, int normalcolor, int boldcolor); -FFont *V_GetFont(const char *); +FFont *V_GetFont(const char *fontname, const char *fontlumpname = nullptr); void V_InitFontColors(); #endif //__V_FONT_H__ diff --git a/src/gamedata/fonts/v_text.cpp b/src/gamedata/fonts/v_text.cpp new file mode 100644 index 0000000000..dc2729df1c --- /dev/null +++ b/src/gamedata/fonts/v_text.cpp @@ -0,0 +1,237 @@ +/* +** v_text.cpp +** Draws text to a canvas. Also has a text line-breaker thingy. +** +**--------------------------------------------------------------------------- +** Copyright 1998-2006 Randy Heit +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +#include +#include +#include +#include + +#include "v_text.h" + + +#include "v_video.h" +#include "w_wad.h" + +#include "gstrings.h" +#include "vm.h" +#include "serializer.h" + +//========================================================================== +// +// Break long lines of text into multiple lines no longer than maxwidth pixels +// +//========================================================================== + +static void breakit (FBrokenLines *line, FFont *font, const uint8_t *start, const uint8_t *stop, FString &linecolor) +{ + if (!linecolor.IsEmpty()) + { + line->Text = TEXTCOLOR_ESCAPE; + line->Text += linecolor; + } + line->Text.AppendCStrPart ((const char *)start, stop - start); + line->Width = font->StringWidth (line->Text); +} + +TArray V_BreakLines (FFont *font, int maxwidth, const uint8_t *string, bool preservecolor) +{ + TArray Lines(128); + + const uint8_t *space = NULL, *start = string; + int c, w, nw; + FString lastcolor, linecolor; + bool lastWasSpace = false; + int kerning = font->GetDefaultKerning (); + + w = 0; + + while ( (c = GetCharFromString(string)) ) + { + if (c == TEXTCOLOR_ESCAPE) + { + if (*string) + { + if (*string == '[') + { + const uint8_t *start = string; + while (*string != ']' && *string != '\0') + { + string++; + } + if (*string != '\0') + { + string++; + } + lastcolor = FString((const char *)start, string - start); + } + else + { + lastcolor = *string++; + } + } + continue; + } + + if (iswspace(c)) + { + if (!lastWasSpace) + { + space = string - 1; + lastWasSpace = true; + } + } + else + { + lastWasSpace = false; + } + + nw = font->GetCharWidth (c); + + if ((w > 0 && w + nw > maxwidth) || c == '\n') + { // Time to break the line + if (!space) + space = string - 1; + + auto index = Lines.Reserve(1); + breakit (&Lines[index], font, start, space, linecolor); + if (c == '\n' && !preservecolor) + { + lastcolor = ""; // Why, oh why, did I do it like this? + } + linecolor = lastcolor; + + w = 0; + lastWasSpace = false; + start = space; + space = NULL; + + while (*start && iswspace (*start) && *start != '\n') + start++; + if (*start == '\n') + start++; + else + while (*start && iswspace (*start)) + start++; + string = start; + } + else + { + w += nw + kerning; + } + } + + // String here is pointing one character after the '\0' + if (--string - start >= 1) + { + const uint8_t *s = start; + + while (s < string) + { + // If there is any non-white space in the remainder of the string, add it. + if (!iswspace (*s++)) + { + auto i = Lines.Reserve(1); + breakit (&Lines[i], font, start, string, linecolor); + break; + } + } + } + return Lines; +} + +FSerializer &Serialize(FSerializer &arc, const char *key, FBrokenLines& g, FBrokenLines *def) +{ + if (arc.BeginObject(key)) + { + arc("text", g.Text) + ("width", g.Width) + .EndObject(); + } + return arc; +} + + + +class DBrokenLines : public DObject +{ + DECLARE_CLASS(DBrokenLines, DObject) + +public: + TArray mBroken; + + DBrokenLines() = default; + + DBrokenLines(TArray &broken) + { + mBroken = std::move(broken); + } + + void Serialize(FSerializer &arc) override + { + arc("lines", mBroken); + } +}; + +IMPLEMENT_CLASS(DBrokenLines, false, false); + +DEFINE_ACTION_FUNCTION(DBrokenLines, Count) +{ + PARAM_SELF_PROLOGUE(DBrokenLines); + ACTION_RETURN_INT(self->mBroken.Size()); +} + +DEFINE_ACTION_FUNCTION(DBrokenLines, StringWidth) +{ + PARAM_SELF_PROLOGUE(DBrokenLines); + PARAM_INT(index); + ACTION_RETURN_INT((unsigned)index >= self->mBroken.Size()? -1 : self->mBroken[index].Width); +} + +DEFINE_ACTION_FUNCTION(DBrokenLines, StringAt) +{ + + PARAM_SELF_PROLOGUE(DBrokenLines); + PARAM_INT(index); + ACTION_RETURN_STRING((unsigned)index >= self->mBroken.Size() ? -1 : self->mBroken[index].Text); +} + +DEFINE_ACTION_FUNCTION(FFont, BreakLines) +{ + PARAM_SELF_STRUCT_PROLOGUE(FFont); + PARAM_STRING(text); + PARAM_INT(maxwidth); + + auto broken = V_BreakLines(self, maxwidth, text, true); + ACTION_RETURN_OBJECT(Create(broken)); +} diff --git a/src/v_text.h b/src/gamedata/fonts/v_text.h similarity index 100% rename from src/v_text.h rename to src/gamedata/fonts/v_text.h diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index e4dae12fe5..488ac4f0d0 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -51,7 +51,7 @@ #include "events.h" #include "i_system.h" -TArray wadclusterinfos; +static TArray wadclusterinfos; TArray wadlevelinfos; level_info_t TheDefaultLevelInfo; @@ -299,14 +299,14 @@ void level_info_t::Reset() // //========================================================================== -FString level_info_t::LookupLevelName() +FString level_info_t::LookupLevelName(uint32_t *langtable) { + // All IWAD names that may be substituted by a graphics patch are declared as language strings. + if (langtable) *langtable = 0; if (flags & LEVEL_LOOKUPLEVELNAME) { const char *thename; - const char *lookedup; - - lookedup = GStrings[LevelName]; + const char *lookedup = GStrings.GetString(LevelName, langtable); if (lookedup == NULL) { thename = LevelName; @@ -827,6 +827,28 @@ void FMapInfoParser::ParseCluster() break; } } + // Remap Hexen's CLUS?MSG lumps to the string table, if applicable. The code here only checks what can actually be in an IWAD. + if (clusterinfo->flags & CLUSTER_EXITTEXTINLUMP) + { + int lump = Wads.CheckNumForFullName(clusterinfo->ExitText, true); + if (lump > 0) + { + // Check if this comes from either Hexen.wad or Hexdd.wad and if so, map to the string table. + int fileno = Wads.GetLumpFile(lump); + auto fn = Wads.GetWadName(fileno); + if (fn && (!stricmp(fn, "HEXEN.WAD") || !stricmp(fn, "HEXDD.WAD"))) + { + FStringf key("TXT_%.5s_%s", fn, clusterinfo->ExitText.GetChars()); + if (GStrings.exists(key)) + { + clusterinfo->ExitText = key; + clusterinfo->flags &= ~CLUSTER_EXITTEXTINLUMP; + clusterinfo->flags |= CLUSTER_LOOKUPEXITTEXT; + } + } + } + + } CheckEndOfFile("cluster"); } @@ -1901,8 +1923,28 @@ level_info_t *FMapInfoParser::ParseMapHeader(level_info_t &defaultinfo) { sc.MustGetString (); levelinfo->flags |= LEVEL_LOOKUPLEVELNAME; + levelinfo->LevelName = sc.String; + } + else + { + levelinfo->LevelName = sc.String; + + if (HexenHack) + { + // Try to localize Hexen's map names. + int fileno = Wads.GetLumpFile(sc.LumpNum); + auto fn = Wads.GetWadName(fileno); + if (fn && (!stricmp(fn, "HEXEN.WAD") || !stricmp(fn, "HEXDD.WAD"))) + { + FStringf key("TXT_%.5s_%s", fn, levelinfo->MapName.GetChars()); + if (GStrings.exists(key)) + { + levelinfo->flags |= LEVEL_LOOKUPLEVELNAME; + levelinfo->LevelName = key; + } + } + } } - levelinfo->LevelName = sc.String; } // Set up levelnum now so that you can use Teleport_NewMap specials diff --git a/src/gamedata/g_mapinfo.h b/src/gamedata/g_mapinfo.h index df9a020540..f9cd2f6f4a 100644 --- a/src/gamedata/g_mapinfo.h +++ b/src/gamedata/g_mapinfo.h @@ -400,7 +400,7 @@ struct level_info_t } void Reset(); bool isValid(); - FString LookupLevelName (); + FString LookupLevelName (uint32_t *langtable = nullptr); void ClearDefered() { deferred.Clear(); @@ -427,15 +427,18 @@ struct cluster_info_t }; // Cluster flags -#define CLUSTER_HUB 0x00000001 // Cluster uses hub behavior -#define CLUSTER_EXITTEXTINLUMP 0x00000002 // Exit text is the name of a lump -#define CLUSTER_ENTERTEXTINLUMP 0x00000004 // Enter text is the name of a lump -#define CLUSTER_FINALEPIC 0x00000008 // Finale "flat" is actually a full-sized image -#define CLUSTER_LOOKUPEXITTEXT 0x00000010 // Exit text is the name of a language string -#define CLUSTER_LOOKUPENTERTEXT 0x00000020 // Enter text is the name of a language string -#define CLUSTER_LOOKUPNAME 0x00000040 // Name is the name of a language string -#define CLUSTER_LOOKUPCLUSTERNAME 0x00000080 // Cluster name is the name of a language string -#define CLUSTER_ALLOWINTERMISSION 0x00000100 // Allow intermissions between levels in a hub. +enum +{ + CLUSTER_HUB = 0x00000001, // Cluster uses hub behavior + CLUSTER_EXITTEXTINLUMP = 0x00000002, // Exit text is the name of a lump + CLUSTER_ENTERTEXTINLUMP = 0x00000004, // Enter text is the name of a lump + CLUSTER_FINALEPIC = 0x00000008, // Finale "flat" is actually a full-sized image + CLUSTER_LOOKUPEXITTEXT = 0x00000010, // Exit text is the name of a language string + CLUSTER_LOOKUPENTERTEXT = 0x00000020, // Enter text is the name of a language string + CLUSTER_LOOKUPNAME = 0x00000040, // Name is the name of a language string + CLUSTER_LOOKUPCLUSTERNAME = 0x00000080, // Cluster name is the name of a language string + CLUSTER_ALLOWINTERMISSION = 0x00000100 // Allow intermissions between levels in a hub. +}; extern TArray wadlevelinfos; diff --git a/src/gamedata/gi.cpp b/src/gamedata/gi.cpp index efcfe74dae..ebced3c7c5 100644 --- a/src/gamedata/gi.cpp +++ b/src/gamedata/gi.cpp @@ -396,6 +396,7 @@ void FMapInfoParser::ParseGameInfo() GAMEINFOKEY_BOOL(swapmenu, "swapmenu") GAMEINFOKEY_BOOL(dontcrunchcorpses, "dontcrunchcorpses") GAMEINFOKEY_BOOL(correctprintbold, "correctprintbold") + GAMEINFOKEY_BOOL(forcetextinmenus, "forcetextinmenus") GAMEINFOKEY_BOOL(intermissioncounter, "intermissioncounter") GAMEINFOKEY_BOOL(nightmarefast, "nightmarefast") GAMEINFOKEY_COLOR(dimcolor, "dimcolor") @@ -423,8 +424,6 @@ void FMapInfoParser::ParseGameInfo() GAMEINFOKEY_FONT(mStatscreenMapNameFont, "statscreen_mapnamefont") GAMEINFOKEY_FONT(mStatscreenFinishedFont, "statscreen_finishedfont") GAMEINFOKEY_FONT(mStatscreenEnteringFont, "statscreen_enteringfont") - GAMEINFOKEY_PATCH(mStatscreenFinishedFont, "statscreen_finishedpatch") - GAMEINFOKEY_PATCH(mStatscreenEnteringFont, "statscreen_enteringpatch") GAMEINFOKEY_BOOL(norandomplayerclass, "norandomplayerclass") GAMEINFOKEY_BOOL(forcekillscripts, "forcekillscripts") // [JM] Force kill scripts on thing death. (MF7_NOKILLSCRIPTS overrides.) GAMEINFOKEY_STRING(Dialogue, "dialogue") diff --git a/src/gamedata/gi.h b/src/gamedata/gi.h index 769076d4d2..c9ffa40f8e 100644 --- a/src/gamedata/gi.h +++ b/src/gamedata/gi.h @@ -38,15 +38,19 @@ #include "zstring.h" // Flags are not user configurable and only depend on the standard IWADs -#define GI_MAPxx 0x00000001 -#define GI_SHAREWARE 0x00000002 -#define GI_MENUHACK_EXTENDED 0x00000004 // (Heretic) -#define GI_TEASER2 0x00000008 // Alternate version of the Strife Teaser -#define GI_COMPATSHORTTEX 0x00000010 // always force COMPAT_SHORTTEX for IWAD maps. -#define GI_COMPATSTAIRS 0x00000020 // same for stairbuilding -#define GI_COMPATPOLY1 0x00000040 // Hexen's MAP36 needs old polyobject drawing -#define GI_COMPATPOLY2 0x00000080 // so does HEXDD's MAP47 -#define GI_NOTEXTCOLOR 0x00000100 // Chex Quest 3 would have everything green +enum +{ + GI_MAPxx = 0x00000001, + GI_SHAREWARE = 0x00000002, + GI_MENUHACK_EXTENDED = 0x00000004, // (Heretic) + GI_TEASER2 = 0x00000008, // Alternate version of the Strife Teaser + GI_COMPATSHORTTEX = 0x00000010, // always force COMPAT_SHORTTEX for IWAD maps. + GI_COMPATSTAIRS = 0x00000020, // same for stairbuilding + GI_COMPATPOLY1 = 0x00000040, // Hexen's MAP36 needs old polyobject drawing + GI_COMPATPOLY2 = 0x00000080, // so does HEXDD's MAP47 + GI_NOTEXTCOLOR = 0x00000100, // Chex Quest 3 would have everything green + GI_IGNORETITLEPATCHES = 0x00000200, // Ignore the map name graphics when not runnning in English language +}; #include "gametype.h" @@ -115,6 +119,7 @@ struct gameinfo_t bool swapmenu; bool dontcrunchcorpses; bool correctprintbold; + bool forcetextinmenus; TArray creditPages; TArray finalePages; TArray infoPages; diff --git a/src/gamedata/resourcefiles/file_lump.cpp b/src/gamedata/resourcefiles/file_lump.cpp index da458303a7..5e47183eaa 100644 --- a/src/gamedata/resourcefiles/file_lump.cpp +++ b/src/gamedata/resourcefiles/file_lump.cpp @@ -79,7 +79,7 @@ bool FLumpFile::Open(bool quiet) Lumps[0].LumpSize = (int)Reader.GetLength(); Lumps[0].Namespace = ns_global; Lumps[0].Flags = 0; - Lumps[0].FullName = NULL; + Lumps[0].FullName = ""; NumLumps = 1; if (!quiet) { diff --git a/src/gamedata/resourcefiles/file_wad.cpp b/src/gamedata/resourcefiles/file_wad.cpp index 7b8e81bf9f..f34138e62a 100644 --- a/src/gamedata/resourcefiles/file_wad.cpp +++ b/src/gamedata/resourcefiles/file_wad.cpp @@ -187,7 +187,7 @@ bool FWadFile::Open(bool quiet) Lumps[i].LumpSize = isBigEndian ? BigLong(fileinfo[i].Size) : LittleLong(fileinfo[i].Size); Lumps[i].Namespace = ns_global; Lumps[i].Flags = Lumps[i].Compressed? LUMPF_COMPRESSED : 0; - Lumps[i].FullName = NULL; + Lumps[i].FullName = ""; // Check if the lump is within the WAD file and print a warning if not. if (Lumps[i].Position + Lumps[i].LumpSize > wadSize || Lumps[i].Position < 0 || Lumps[i].LumpSize < 0) diff --git a/src/gamedata/resourcefiles/resourcefile.cpp b/src/gamedata/resourcefiles/resourcefile.cpp index 1cb1f4e9ff..20fb57ad31 100644 --- a/src/gamedata/resourcefiles/resourcefile.cpp +++ b/src/gamedata/resourcefiles/resourcefile.cpp @@ -490,7 +490,7 @@ void FResourceFile::JunkLeftoverFilters(void *lumps, size_t lumpsize, uint32_t m for (void *p = (uint8_t *)lumps + start * lumpsize; p < stop; p = (uint8_t *)p + lumpsize) { FResourceLump *lump = (FResourceLump *)p; - lump->FullName = 0; + lump->FullName = ""; lump->Name[0] = '\0'; lump->Namespace = ns_hidden; } @@ -720,7 +720,7 @@ bool FMemoryFile::Open(bool quiet) Lumps[0].LumpSize = (int)Reader.GetLength(); Lumps[0].Namespace = ns_global; Lumps[0].Flags = 0; - Lumps[0].FullName = nullptr; + Lumps[0].FullName = ""; NumLumps = 1; return true; } diff --git a/src/statistics.cpp b/src/gamedata/statistics.cpp similarity index 100% rename from src/statistics.cpp rename to src/gamedata/statistics.cpp diff --git a/src/gamedata/stringtable.cpp b/src/gamedata/stringtable.cpp index fc5e7ea8af..d57361eac6 100644 --- a/src/gamedata/stringtable.cpp +++ b/src/gamedata/stringtable.cpp @@ -43,119 +43,32 @@ #include "v_text.h" #include "gi.h" -// PassNum identifies which language pass this string is from. -// PassNum 0 is for DeHacked. -// PassNum 1 is for * strings. -// PassNum 2+ are for specific locales. -struct FStringTable::StringEntry -{ - StringEntry *Next; - char *Name; - uint8_t PassNum; - char String[]; -}; - -FStringTable::FStringTable () -{ - for (int i = 0; i < HASH_SIZE; ++i) - { - Buckets[i] = NULL; - } -} - -FStringTable::~FStringTable () -{ - FreeData (); -} - -void FStringTable::FreeData () -{ - for (int i = 0; i < HASH_SIZE; ++i) - { - StringEntry *entry = Buckets[i], *next; - Buckets[i] = NULL; - while (entry != NULL) - { - next = entry->Next; - M_Free (entry); - entry = next; - } - } -} - -void FStringTable::FreeNonDehackedStrings () -{ - for (int i = 0; i < HASH_SIZE; ++i) - { - StringEntry *entry, *next, **pentry; - - for (pentry = &Buckets[i], entry = *pentry; entry != NULL; ) - { - next = entry->Next; - if (entry->PassNum != 0) - { - *pentry = next; - M_Free (entry); - } - else - { - pentry = &entry->Next; - } - entry = next; - } - } -} - -void FStringTable::LoadStrings (bool enuOnly) +void FStringTable::LoadStrings () { int lastlump, lump; - int i, j; - - FreeNonDehackedStrings (); lastlump = 0; while ((lump = Wads.FindLump ("LANGUAGE", &lastlump)) != -1) { - j = 0; - if (!enuOnly) - { - LoadLanguage (lump, MAKE_ID('*',0,0,0), true, ++j); - for (i = 0; i < 4; ++i) - { - LoadLanguage (lump, LanguageIDs[i], true, ++j); - LoadLanguage (lump, LanguageIDs[i] & MAKE_ID(0xff,0xff,0,0), true, ++j); - LoadLanguage (lump, LanguageIDs[i], false, ++j); - } - } - - // Fill in any missing strings with the default language - LoadLanguage (lump, MAKE_ID('*','*',0,0), true, ++j); + LoadLanguage (lump); } + SetLanguageIDs(); + UpdateLanguage(); } -void FStringTable::LoadLanguage (int lumpnum, uint32_t code, bool exactMatch, int passnum) +void FStringTable::LoadLanguage (int lumpnum) { - static bool errordone = false; - const uint32_t orMask = exactMatch ? 0 : MAKE_ID(0,0,0xff,0); - uint32_t inCode = 0; - StringEntry *entry, **pentry; - uint32_t bucket; - int cmpval; - bool skip = true; - - code |= orMask; - + bool errordone = false; + TArray activeMaps; FScanner sc(lumpnum); sc.SetCMode (true); while (sc.GetString ()) { if (sc.Compare ("[")) { // Process language identifiers - bool donot = false; - bool forceskip = false; - skip = true; + activeMaps.Clear(); sc.MustGetString (); do { @@ -164,17 +77,18 @@ void FStringTable::LoadLanguage (int lumpnum, uint32_t code, bool exactMatch, in { if (len == 1 && sc.String[0] == '~') { - donot = true; + // deprecated and ignored + sc.ScriptMessage("Deprecated option '~' found in language list"); sc.MustGetString (); continue; } if (len == 1 && sc.String[0] == '*') { - inCode = MAKE_ID('*',0,0,0); + activeMaps.Push(global_table); } else if (len == 7 && stricmp (sc.String, "default") == 0) { - inCode = MAKE_ID('*','*',0,0); + activeMaps.Push(default_table); } else { @@ -184,31 +98,14 @@ void FStringTable::LoadLanguage (int lumpnum, uint32_t code, bool exactMatch, in } else { - inCode = MAKE_ID(tolower(sc.String[0]), tolower(sc.String[1]), tolower(sc.String[2]), 0); - } - if ((inCode | orMask) == code) - { - if (donot) - { - forceskip = true; - donot = false; - } - else - { - skip = false; - } + activeMaps.Push(MAKE_ID(tolower(sc.String[0]), tolower(sc.String[1]), tolower(sc.String[2]), 0)); } sc.MustGetString (); } while (!sc.Compare ("]")); - if (donot) - { - sc.ScriptError ("You must specify a language after ~"); - } - skip |= forceskip; } else { // Process string definitions. - if (inCode == 0) + if (activeMaps.Size() == 0) { // LANGUAGE lump is bad. We need to check if this is an old binary // lump and if so just skip it to allow old WADs to run which contain @@ -222,32 +119,26 @@ void FStringTable::LoadLanguage (int lumpnum, uint32_t code, bool exactMatch, in sc.ScriptError ("Found a string without a language specified."); } - bool savedskip = skip; + bool skip = false; if (sc.Compare("$")) { sc.MustGetStringName("ifgame"); sc.MustGetStringName("("); sc.MustGetString(); - skip |= !sc.Compare(GameTypeName()); + if (sc.Compare("strifeteaser")) + { + skip |= (gameinfo.gametype != GAME_Strife) || !(gameinfo.flags & GI_SHAREWARE); + } + else + { + skip |= !sc.Compare(GameTypeName()); + } sc.MustGetStringName(")"); sc.MustGetString(); } - if (skip) - { // We're not interested in this language, so skip the string. - sc.MustGetStringName ("="); - sc.MustGetString (); - do - { - sc.MustGetString (); - } - while (!sc.Compare (";")); - skip = savedskip; - continue; - } - - FString strName (sc.String); + FName strName (sc.String); sc.MustGetStringName ("="); sc.MustGetString (); FString strText (sc.String, ProcessEscapes (sc.String)); @@ -258,39 +149,39 @@ void FStringTable::LoadLanguage (int lumpnum, uint32_t code, bool exactMatch, in strText += sc.String; sc.MustGetString (); } - - // Does this string exist? If so, should we overwrite it? - bucket = MakeKey (strName.GetChars()) & (HASH_SIZE-1); - pentry = &Buckets[bucket]; - entry = *pentry; - cmpval = 1; - while (entry != NULL) + if (!skip) { - cmpval = stricmp (entry->Name, strName.GetChars()); - if (cmpval >= 0) - break; - pentry = &entry->Next; - entry = *pentry; - } - if (cmpval == 0 && entry->PassNum >= passnum) - { - *pentry = entry->Next; - M_Free (entry); - entry = NULL; - } - if (entry == NULL || cmpval > 0) - { - entry = (StringEntry *)M_Malloc (sizeof(*entry) + strText.Len() + strName.Len() + 2); - entry->Next = *pentry; - *pentry = entry; - strcpy (entry->String, strText.GetChars()); - strcpy (entry->Name = entry->String + strText.Len() + 1, strName.GetChars()); - entry->PassNum = passnum; + // Insert the string into all relevant tables. + for (auto map : activeMaps) + { + allStrings[map].Insert(strName, strText); + } } } } } +void FStringTable::UpdateLanguage() +{ + currentLanguageSet.Clear(); + + auto checkone = [&](uint32_t lang_id) + { + auto list = allStrings.CheckKey(lang_id); + if (list && currentLanguageSet.FindEx([&](const auto &element) { return element.first == lang_id; }) == currentLanguageSet.Size()) + currentLanguageSet.Push(std::make_pair(lang_id, list)); + }; + + checkone(dehacked_table); + checkone(global_table); + for (int i = 0; i < 4; ++i) + { + checkone(LanguageIDs[i]); + checkone(LanguageIDs[i] & MAKE_ID(0xff, 0xff, 0, 0)); + } + checkone(default_table); +} + // Replace \ escape sequences in a string with the escaped characters. size_t FStringTable::ProcessEscapes (char *iptr) { @@ -318,30 +209,53 @@ size_t FStringTable::ProcessEscapes (char *iptr) return optr - sptr; } -// Finds a string by name and returns its value -const char *FStringTable::operator[] (const char *name) const +bool FStringTable::exists(const char *name) { - if (name == NULL) + // Checks if the given key exists in any one of the default string tables that are valid for all languages. + // To replace IWAD content this condition must be true. + if (name == nullptr || *name == 0) { - return NULL; + return false; } - uint32_t bucket = MakeKey (name) & (HASH_SIZE - 1); - StringEntry *entry = Buckets[bucket]; + FName nm(name, true); + if (nm != NAME_None) + { + uint32_t defaultStrings[] = { default_table, global_table, dehacked_table }; - while (entry != NULL) - { - int cmpval = stricmp (entry->Name, name); - if (cmpval == 0) + for (auto mapid : defaultStrings) { - return entry->String; + auto map = allStrings.CheckKey(mapid); + if (map) + { + auto item = map->CheckKey(nm); + if (item) return true; + } } - if (cmpval == 1) - { - return NULL; - } - entry = entry->Next; } - return NULL; + return false; +} + +// Finds a string by name and returns its value +const char *FStringTable::GetString(const char *name, uint32_t *langtable) const +{ + if (name == nullptr || *name == 0) + { + return nullptr; + } + FName nm(name, true); + if (nm != NAME_None) + { + for (auto map : currentLanguageSet) + { + auto item = map.second->CheckKey(nm); + if (item) + { + if (langtable) *langtable = map.first; + return item->GetChars(); + } + } + } + return nullptr; } // Finds a string by name and returns its value. If the string does @@ -352,75 +266,19 @@ const char *FStringTable::operator() (const char *name) const return str ? str : name; } -// Find a string by name. pentry1 is a pointer to a pointer to it, and entry1 is a -// pointer to it. Return NULL for entry1 if it wasn't found. -void FStringTable::FindString (const char *name, StringEntry **&pentry1, StringEntry *&entry1) -{ - uint32_t bucket = MakeKey (name) & (HASH_SIZE - 1); - StringEntry **pentry = &Buckets[bucket], *entry = *pentry; - - while (entry != NULL) - { - int cmpval = stricmp (entry->Name, name); - if (cmpval == 0) - { - pentry1 = pentry; - entry1 = entry; - return; - } - if (cmpval == 1) - { - pentry1 = pentry; - entry1 = NULL; - return; - } - pentry = &entry->Next; - entry = *pentry; - } - pentry1 = pentry; - entry1 = entry; -} // Find a string with the same exact text. Returns its name. -const char *FStringTable::MatchString (const char *string) const +const char *StringMap::MatchString (const char *string) const { - for (int i = 0; i < HASH_SIZE; ++i) + StringMap::ConstIterator it(*this); + StringMap::ConstPair *pair; + + while (it.NextPair(pair)) { - for (StringEntry *entry = Buckets[i]; entry != NULL; entry = entry->Next) + if (pair->Value.Compare(string) == 0) { - if (strcmp (entry->String, string) == 0) - { - return entry->Name; - } + return pair->Key.GetChars(); } } - return NULL; -} - -void FStringTable::SetString (const char *name, const char *newString) -{ - StringEntry **pentry, *oentry; - FindString (name, pentry, oentry); - - size_t newlen = strlen (newString); - size_t namelen = strlen (name); - - // Create a new string entry - StringEntry *entry = (StringEntry *)M_Malloc (sizeof(*entry) + newlen + namelen + 2); - strcpy (entry->String, newString); - strcpy (entry->Name = entry->String + newlen + 1, name); - entry->PassNum = 0; - - // If this is a new string, insert it. Otherwise, replace the old one. - if (oentry == NULL) - { - entry->Next = *pentry; - *pentry = entry; - } - else - { - *pentry = entry; - entry->Next = oentry->Next; - M_Free (oentry); - } + return nullptr; } diff --git a/src/gamedata/stringtable.h b/src/gamedata/stringtable.h index 792ef06b3a..97201a582d 100644 --- a/src/gamedata/stringtable.h +++ b/src/gamedata/stringtable.h @@ -44,34 +44,53 @@ #include +#include "doomdef.h" #include "doomtype.h" +// This public interface is for Dehacked +class StringMap : public TMap +{ +public: + const char *MatchString(const char *string) const; +}; + + class FStringTable { public: - struct StringEntry; + enum : uint32_t + { + default_table = MAKE_ID('*', '*', 0, 0), + global_table = MAKE_ID('*', 0, 0, 0), + dehacked_table = MAKE_ID('*', '*', '*', 0) + }; - FStringTable (); - ~FStringTable (); - - void LoadStrings (bool enuOnly); + using LangMap = TMap; + void LoadStrings (); + void UpdateLanguage(); + StringMap GetDefaultStrings() { return allStrings[default_table]; } // Dehacked needs these for comparison + void SetDehackedStrings(StringMap && map) + { + allStrings.Insert(dehacked_table, map); + UpdateLanguage(); + } + + const char *GetString(const char *name, uint32_t *langtable) const; const char *operator() (const char *name) const; // Never returns NULL - const char *operator[] (const char *name) const; // Can return NULL - - const char *MatchString (const char *string) const; - void SetString (const char *name, const char *newString); + const char *operator[] (const char *name) const + { + return GetString(name, nullptr); + } + bool exists(const char *name); private: - enum { HASH_SIZE = 128 }; - StringEntry *Buckets[HASH_SIZE]; + LangMap allStrings; + TArray> currentLanguageSet; - void FreeData (); - void FreeNonDehackedStrings (); - void LoadLanguage (int lumpnum, uint32_t code, bool exactMatch, int passnum); + void LoadLanguage (int lumpnum); static size_t ProcessEscapes (char *str); - void FindString (const char *stringName, StringEntry **&pentry, StringEntry *&entry); }; #endif //__STRINGTABLE_H__ diff --git a/src/gamedata/textures/image.h b/src/gamedata/textures/image.h index 7e0db353fe..75efc56e4d 100644 --- a/src/gamedata/textures/image.h +++ b/src/gamedata/textures/image.h @@ -113,6 +113,12 @@ public: { return std::make_pair(LeftOffset, TopOffset); } + + void SetOffsets(int x, int y) + { + LeftOffset = x; + TopOffset = y; + } int LumpNum() const { diff --git a/src/gamedata/textures/texturemanager.cpp b/src/gamedata/textures/texturemanager.cpp index 98b8197bce..ff451dd172 100644 --- a/src/gamedata/textures/texturemanager.cpp +++ b/src/gamedata/textures/texturemanager.cpp @@ -38,6 +38,8 @@ #include "doomstat.h" #include "w_wad.h" #include "templates.h" +#include "i_system.h" +#include "gstrings.h" #include "r_data/r_translate.h" #include "r_data/sprites.h" @@ -389,7 +391,72 @@ FTextureID FTextureManager::GetTextureID (const char *name, ETextureType usetype FTexture *FTextureManager::FindTexture(const char *texname, ETextureType usetype, BITFIELD flags) { FTextureID texnum = CheckForTexture (texname, usetype, flags); - return !texnum.isValid()? NULL : Textures[texnum.GetIndex()].Texture; + return GetTexture(texnum.GetIndex()); +} + +//========================================================================== +// +// Defines how graphics substitution is handled. +// 0: Never replace a text-containing graphic with a font-based text. +// 1: Always replace, regardless of any missing information. Useful for testing the substitution without providing full data. +// 2: Only replace for non-default texts, i.e. if some language redefines the string's content, use it instead of the graphic. Never replace a localized graphic. +// 3: Only replace if the string is not the default and the graphic comes from the IWAD. Never replace a localized graphic. +// 4: Like 1, but lets localized graphics pass. +// +//========================================================================== + +CUSTOM_CVAR(Int, cl_localizationmode,0, CVAR_ARCHIVE) +{ + if (self < 0 || self > 4) self = 0; +} + +//========================================================================== +// +// FTextureManager :: OkForLocalization +// +//========================================================================== + +bool FTextureManager::OkForLocalization(FTextureID texnum, const char *substitute) +{ + if (!texnum.isValid()) return false; + + // First the unconditional settings, 0='never' and 1='always'. + if (cl_localizationmode == 1 || gameinfo.forcetextinmenus) return false; + if (cl_localizationmode == 0) return true; + + uint32_t langtable = 0; + if (*substitute == '$') substitute = GStrings.GetString(substitute+1, &langtable); + if (substitute == nullptr) return true; // The text does not exist. + + // Modes 2, 3 and 4 must not replace localized textures. + int localizedTex = ResolveLocalizedTexture(texnum.GetIndex()); + if (localizedTex != texnum.GetIndex()) return true; // Do not substitute a localized variant of the graphics patch. + + // For mode 4 we are done now. + if (cl_localizationmode == 4) return false; + + // Mode 2 and 3 must reject any text replacement from the default language tables. + if ((langtable & MAKE_ID(255,0,0,0)) == MAKE_ID('*', 0, 0, 0)) return true; // Do not substitute if the string comes from the default table. + if (cl_localizationmode == 2) return false; + + // Mode 3 must also reject substitutions for non-IWAD content. + int file = Wads.GetLumpFile(Textures[texnum.GetIndex()].Texture->SourceLump); + if (file > Wads.GetIwadNum()) return true; + + return false; +} + +static int OkForLocalization(int index, const FString &substitute) +{ + return TexMan.OkForLocalization(FSetTextureID(index), substitute); +} + +DEFINE_ACTION_FUNCTION_NATIVE(_TexMan, OkForLocalization, OkForLocalization) +{ + PARAM_PROLOGUE; + PARAM_INT(name); + PARAM_STRING(subst) + ACTION_RETURN_INT(OkForLocalization(name, subst)); } //========================================================================== @@ -1005,12 +1072,88 @@ void FTextureManager::SortTexturesByType(int start, int end) } } +//========================================================================== +// +// FTextureManager :: AddLocalizedVariants +// +//========================================================================== + +void FTextureManager::AddLocalizedVariants() +{ + TArray content; + Wads.GetLumpsInFolder("localized/textures/", content, false); + for (auto &entry : content) + { + FString name = entry.name; + auto tokens = name.Split(".", FString::TOK_SKIPEMPTY); + if (tokens.Size() == 2) + { + auto ext = tokens[1]; + // Do not interpret common extensions for images as language IDs. + if (ext.CompareNoCase("png") == 0 || ext.CompareNoCase("jpg") == 0 || ext.CompareNoCase("gfx") == 0 || ext.CompareNoCase("tga") == 0 || ext.CompareNoCase("lmp") == 0) + { + Printf("%s contains no language IDs and will be ignored\n", entry.name); + continue; + } + } + if (tokens.Size() >= 2) + { + FString base = ExtractFileBase(tokens[0]); + FTextureID origTex = CheckForTexture(base, ETextureType::MiscPatch); + if (origTex.isValid()) + { + FTextureID tex = CheckForTexture(entry.name, ETextureType::MiscPatch); + if (tex.isValid()) + { + FTexture *otex = GetTexture(origTex); + FTexture *ntex = GetTexture(tex); + if (otex->GetDisplayWidth() != ntex->GetDisplayWidth() || otex->GetDisplayHeight() != ntex->GetDisplayHeight()) + { + Printf("Localized texture %s must be the same size as the one it replaces\n", entry.name); + } + else + { + tokens[1].ToLower(); + auto langids = tokens[1].Split("-", FString::TOK_SKIPEMPTY); + for (auto &lang : langids) + { + if (lang.Len() == 2 || lang.Len() == 3) + { + uint32_t langid = MAKE_ID(lang[0], lang[1], lang[2], 0); + uint64_t comboid = (uint64_t(langid) << 32) | origTex.GetIndex(); + LocalizedTextures.Insert(comboid, tex.GetIndex()); + Textures[origTex.GetIndex()].HasLocalization = true; + } + else + { + Printf("Invalid language ID in texture %s\n", entry.name); + } + } + } + } + else + { + Printf("%s is not a texture\n", entry.name); + } + } + else + { + Printf("Unknown texture %s for localized variant %s\n", tokens[0].GetChars(), entry.name); + } + } + else + { + Printf("%s contains no language IDs and will be ignored\n", entry.name); + } + + } +} + //========================================================================== // // FTextureManager :: Init // //========================================================================== -FTexture *GetBackdropTexture(); FTexture *CreateShaderTexture(bool, bool); void FTextureManager::Init() @@ -1096,7 +1239,7 @@ void FTextureManager::Init() glPart2 = TexMan.CheckForTexture("glstuff/glpart2.png", ETextureType::MiscPatch); glPart = TexMan.CheckForTexture("glstuff/glpart.png", ETextureType::MiscPatch); mirrorTexture = TexMan.CheckForTexture("glstuff/mirror.png", ETextureType::MiscPatch); - + AddLocalizedVariants(); } //========================================================================== @@ -1143,12 +1286,31 @@ void FTextureManager::InitPalettedVersions() // //========================================================================== -FTextureID FTextureManager::PalCheck(FTextureID tex) +int FTextureManager::PalCheck(int tex) { // In any true color mode this shouldn't do anything. if (vid_nopalsubstitutions || V_IsTrueColor()) return tex; - auto ftex = GetTexture(tex); - if (ftex != nullptr && ftex->PalVersion != nullptr) return ftex->PalVersion->id; + auto ftex = Textures[tex].Texture; + if (ftex != nullptr && ftex->PalVersion != nullptr) return ftex->PalVersion->id.GetIndex(); + return tex; +} + +//========================================================================== +// +// FTextureManager :: PalCheck +// +//========================================================================== + +int FTextureManager::ResolveLocalizedTexture(int tex) +{ + for(int i = 0; i < 4; i++) + { + uint32_t lang = LanguageIDs[i]; + uint64_t index = (uint64_t(lang) << 32) + tex; + if (auto pTex = LocalizedTextures.CheckKey(index)) return *pTex; + index = (uint64_t(lang & MAKE_ID(255, 255, 0, 0)) << 32) + tex; + if (auto pTex = LocalizedTextures.CheckKey(index)) return *pTex; + } return tex; } diff --git a/src/gamedata/textures/textures.h b/src/gamedata/textures/textures.h index f23d3c3d6b..3a9678549f 100644 --- a/src/gamedata/textures/textures.h +++ b/src/gamedata/textures/textures.h @@ -300,7 +300,6 @@ class FTexture friend class FBrightmapTexture; friend class FFont; friend class FSpecialFont; - friend void RecordTextureColors (FTexture *pic, uint8_t *usedcolors); public: @@ -482,6 +481,10 @@ protected: } void SetScaledSize(int fitwidth, int fitheight); + void SetScale(const DVector2 &scale) + { + Scale = scale; + } protected: uint16_t Width, Height; @@ -521,47 +524,49 @@ class FTextureManager public: FTextureManager (); ~FTextureManager (); + +private: + int ResolveLocalizedTexture(int texnum); + int PalCheck(int tex); + FTexture *InternalGetTexture(int texnum, bool animate, bool localize, bool palettesubst) + { + if ((unsigned)texnum >= Textures.Size()) return nullptr; + if (animate) texnum = Translation[texnum]; + if (localize && Textures[texnum].HasLocalization) texnum = ResolveLocalizedTexture(texnum); + if (palettesubst) texnum = PalCheck(texnum); + return Textures[texnum].Texture; + } +public: // This only gets used in UI code so we do not need PALVERS handling. FTexture *GetTextureByName(const char *name, bool animate = false) { FTextureID texnum = GetTextureID (name, ETextureType::MiscPatch); - if (!texnum.Exists()) return nullptr; - if (!animate) return Textures[texnum.GetIndex()].Texture; - else return Textures[Translation[texnum.GetIndex()]].Texture; + return InternalGetTexture(texnum.GetIndex(), animate, true, false); } FTexture *GetTexture(FTextureID texnum, bool animate = false) { - if ((size_t)texnum.GetIndex() >= Textures.Size()) return nullptr; - if (animate) texnum = Translation[texnum.GetIndex()]; - return Textures[texnum.GetIndex()].Texture; + return InternalGetTexture(texnum.GetIndex(), animate, true, false); } // This is the only access function that should be used inside the software renderer. FTexture *GetPalettedTexture(FTextureID texnum, bool animate) { - if ((size_t)texnum.texnum >= Textures.Size()) return nullptr; - if (animate) texnum = Translation[texnum.GetIndex()]; - texnum = PalCheck(texnum).GetIndex(); - return Textures[texnum.GetIndex()].Texture; + return InternalGetTexture(texnum.GetIndex(), animate, true, true); } FTexture *ByIndex(int i, bool animate = false) { - if (unsigned(i) >= Textures.Size()) return NULL; - if (animate) i = Translation[i]; - return Textures[i].Texture; + return InternalGetTexture(i, animate, true, false); } + FTexture *FindTexture(const char *texname, ETextureType usetype = ETextureType::MiscPatch, BITFIELD flags = TEXMAN_TryAny); + bool OkForLocalization(FTextureID texnum, const char *substitute); void FlushAll(); -//public: - - FTextureID PalCheck(FTextureID tex); - enum { TEXMAN_TryAny = 1, @@ -569,7 +574,8 @@ public: TEXMAN_ReturnFirst = 4, TEXMAN_AllowSkins = 8, TEXMAN_ShortNameOnly = 16, - TEXMAN_DontCreate = 32 + TEXMAN_DontCreate = 32, + TEXMAN_Localize = 64 }; enum @@ -593,6 +599,7 @@ public: void ParseTextureDef(int remapLump, FMultipatchTextureBuilder &build); void SortTexturesByType(int start, int end); bool AreTexturesCompatible (FTextureID picnum1, FTextureID picnum2); + void AddLocalizedVariants(); FTextureID CreateTexture (int lumpnum, ETextureType usetype=ETextureType::Any); // Also calls AddTexture FTextureID AddTexture (FTexture *texture); @@ -658,9 +665,11 @@ private: { FTexture *Texture; int HashNext; + bool HasLocalization; }; enum { HASH_END = -1, HASH_SIZE = 1027 }; TArray Textures; + TMap LocalizedTextures; TArray Translation; int HashFirst[HASH_SIZE]; FTextureID DefaultTexture; diff --git a/src/gamedata/w_wad.cpp b/src/gamedata/w_wad.cpp index 9564bb5ace..d20eebe234 100644 --- a/src/gamedata/w_wad.cpp +++ b/src/gamedata/w_wad.cpp @@ -759,6 +759,7 @@ void FWadCollection::RenameSprites () { bool renameAll; bool MNTRZfound = false; + const char *altbigfont = gameinfo.gametype == GAME_Strife? "SBIGFONT" : (gameinfo.gametype & GAME_Raven)? "HBIGFONT" : "DBIGFONT"; static const uint32_t HereticRenames[] = { MAKE_ID('H','E','A','D'), MAKE_ID('L','I','C','H'), // Ironlich @@ -889,6 +890,11 @@ void FWadCollection::RenameSprites () } } } + else if (LumpInfo[i].lump->Namespace == ns_global) + { + // Rename the game specific big font lumps so that the font manager does not have to do problematic special checks for them. + if (!strcmp(LumpInfo[i].lump->Name, altbigfont)) strcpy(LumpInfo[i].lump->Name, "BIGFONT"); + } } } @@ -1260,6 +1266,63 @@ FResourceLump *FWadCollection::GetLumpRecord(int lump) const return LumpInfo[lump].lump; } +//========================================================================== +// +// GetLumpsInFolder +// +// Gets all lumps within a single folder in the hierarchy. +// If 'atomic' is set, it treats folders as atomic, i.e. only the +// content of the last found resource file having the given folder name gets used. +// +//========================================================================== + +static int folderentrycmp(const void *a, const void *b) +{ + auto A = (FolderEntry*)a; + auto B = (FolderEntry*)b; + return strcmp(A->name, B->name); +} + +unsigned FWadCollection::GetLumpsInFolder(const char *inpath, TArray &result, bool atomic) const +{ + FString path = inpath; + FixPathSeperator(path); + path.ToLower(); + if (path[path.Len() - 1] != '/') path += '/'; + result.Clear(); + for (unsigned i = 0; i < LumpInfo.Size(); i++) + { + if (LumpInfo[i].lump->FullName.IndexOf(path) == 0) + { + // Only if it hasn't been replaced. + if ((unsigned)Wads.CheckNumForFullName(LumpInfo[i].lump->FullName) == i) + { + result.Push({ LumpInfo[i].lump->FullName.GetChars(), i }); + } + } + } + if (result.Size()) + { + int maxfile = -1; + if (atomic) + { + // Find the highest resource file having content in the given folder. + for (auto & entry : result) + { + int thisfile = Wads.GetLumpFile(entry.lumpnum); + if (thisfile > maxfile) maxfile = thisfile; + } + // Delete everything from older files. + for (int i = result.Size() - 1; i >= 0; i--) + { + if (Wads.GetLumpFile(result[i].lumpnum) != maxfile) result.Delete(i); + } + } + qsort(result.Data(), result.Size(), sizeof(FolderEntry), folderentrycmp); + } + return result.Size(); +} + //========================================================================== // // W_ReadLump diff --git a/src/gamedata/w_wad.h b/src/gamedata/w_wad.h index c223a6bd05..4f6740a0ec 100644 --- a/src/gamedata/w_wad.h +++ b/src/gamedata/w_wad.h @@ -101,6 +101,12 @@ private: friend class FWadCollection; }; +struct FolderEntry +{ + const char *name; + unsigned lumpnum; +}; + class FWadCollection { public: @@ -173,6 +179,7 @@ public: int GetLumpIndexNum (int lump) const; // Returns the RFF index number for this lump FResourceLump *GetLumpRecord(int lump) const; // Returns the FResourceLump, in case the caller wants to have direct access to the lump cache. bool CheckLumpName (int lump, const char *name) const; // [RH] Returns true if the names match + unsigned GetLumpsInFolder(const char *path, TArray &result, bool atomic) const; bool IsEncryptedFile(int lump) const; diff --git a/src/intermission/intermission.cpp b/src/intermission/intermission.cpp index a01f5325a0..8d7fb2470a 100644 --- a/src/intermission/intermission.cpp +++ b/src/intermission/intermission.cpp @@ -49,6 +49,7 @@ #include "menu/menu.h" #include "d_net.h" #include "g_levellocals.h" +#include "utf8.h" FIntermissionDescriptorList IntermissionDescriptors; @@ -255,7 +256,7 @@ void DIntermissionScreenText::Init(FIntermissionAction *desc, bool first) if (mTextX < 0) mTextX =gameinfo.TextScreenX; mTextY = static_cast(desc)->mTextY; if (mTextY < 0) mTextY =gameinfo.TextScreenY; - mTextLen = (int)strlen(mText); + mTextLen = mText.CharacterCount(); mTextDelay = static_cast(desc)->mTextDelay; mTextColor = static_cast(desc)->mTextColor; // For text screens, the duration only counts when the text is complete. @@ -285,7 +286,7 @@ void DIntermissionScreenText::Drawer () size_t count; int c; const FRemapTable *range; - const char *ch = mText; + const uint8_t *ch = (const uint8_t*)mText.GetChars(); const int kerning = SmallFont->GetDefaultKerning(); // Count number of rows in this text. Since it does not word-wrap, we just count @@ -327,7 +328,7 @@ void DIntermissionScreenText::Drawer () for ( ; count > 0 ; count-- ) { - c = *ch++; + c = GetCharFromString(ch); if (!c) break; if (c == '\n') @@ -696,6 +697,7 @@ bool DIntermissionController::NextPage () // last page return false; } + bg.SetInvalid(); if (mScreen != NULL) { diff --git a/src/intermission/intermission.h b/src/intermission/intermission.h index 435b38ed6c..4f776a1dc5 100644 --- a/src/intermission/intermission.h +++ b/src/intermission/intermission.h @@ -207,7 +207,7 @@ class DIntermissionScreenText : public DIntermissionScreen { DECLARE_CLASS (DIntermissionScreenText, DIntermissionScreen) - const char *mText; + FString mText; int mTextSpeed; int mTextX, mTextY; int mTextCounter; diff --git a/src/intermission/intermission_parse.cpp b/src/intermission/intermission_parse.cpp index 50fd050a2d..9fb601faf5 100644 --- a/src/intermission/intermission_parse.cpp +++ b/src/intermission/intermission_parse.cpp @@ -37,6 +37,7 @@ #include "intermission/intermission.h" #include "g_level.h" #include "w_wad.h" +#include "gstrings.h" static void ReplaceIntermission(FName intname,FIntermissionDescriptor *desc) @@ -291,9 +292,23 @@ bool FIntermissionActionTextscreen::ParseKey(FScanner &sc) sc.MustGetToken('='); sc.MustGetToken(TK_StringConst); int lump = Wads.CheckNumForFullName(sc.String, true); + bool done = false; if (lump > 0) { - mText = Wads.ReadLump(lump).GetString(); + // Check if this comes from either Hexen.wad or Hexdd.wad and if so, map to the string table. + int fileno = Wads.GetLumpFile(lump); + auto fn = Wads.GetWadName(fileno); + if (fn && (!stricmp(fn, "HEXEN.WAD") || !stricmp(fn, "HEXDD.WAD"))) + { + FStringf key("TXT_%.5s_%s", fn, sc.String); + if (GStrings.exists(key)) + { + mText = "$" + key; + done = true; + } + } + if (!done) + mText = Wads.ReadLump(lump).GetString(); } else { diff --git a/src/lumpconfigfile.cpp b/src/lumpconfigfile.cpp deleted file mode 100644 index 0606b2dea3..0000000000 --- a/src/lumpconfigfile.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* -** lumpconfigfile.cpp -** Reads an .ini file in a lump -** -**--------------------------------------------------------------------------- -** Copyright 1998-2006 Randy Heit -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- -** -** I don't remember what I was going to use this for, but it's small, so I'll -** leave it in for now. -*/ - -#include -#include - -#include "doomtype.h" -#include "lumpconfigfile.h" -#include "w_wad.h" - -#if 0 -FLumpConfigFile::FLumpConfigFile (int lump) -{ - State.lump = lump; - State.lumpdata = (char *)W_MapLumpNum (lump); - State.end = State.lumpdata + lumpinfo[lump].size; - State.pos = State.lumpdata; -} - -FLumpConfigFile::~FLumpConfigFile () -{ - W_UnMapLump (State.lumpdata); -} - -void FLumpConfigFile::LoadConfigFile () -{ - ReadConfig (&State); -} - -char *FLumpConfigFile::ReadLine (char *string, int n, void *file) const -{ - LumpState *state = (LumpState *)file; - char *pos = state->pos; - int len = 0; - - n--; - if (state->pos + n > state->end) - n = (int)(state->end - state->pos); - - while (len < n && pos[n] != '\n') - n++; - - string[n] = 0; - if (n == 0) - { - return NULL; - } - - memcpy (string, pos, n); - state->pos += n; - return string; -} -#endif diff --git a/src/lumpconfigfile.h b/src/lumpconfigfile.h deleted file mode 100644 index 791290cea4..0000000000 --- a/src/lumpconfigfile.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -** lumpconfigfile.h -** -**--------------------------------------------------------------------------- -** Copyright 1998-2006 Randy Heit -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- -** -*/ - -#ifndef __LUMPCONFIGFILE_H__ -#define __LUMPCONFIGFILE_H__ - -#include "configfile.h" - -class FLumpConfigFile : public FConfigFile -{ -public: - FLumpConfigFile (int lump); - ~FLumpConfigFile (); - - void LoadConfigFile (); - -protected: - virtual char *ReadLine (char *string, int n, void *file) const; - -private: - struct LumpState - { - int lump; - char *lumpdata; - char *end; - char *pos; - }; - - LumpState State; -}; - -#endif //__LUMPCONFIGFILE_H__ diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 5e3dc96692..81da37591a 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3016,7 +3016,7 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) LoadMapinfoACSLump(); - P_LoadStrifeConversations(Level, map, lumpname); + LoadStrifeConversations(map, lumpname); FMissingTextureTracker missingtex; diff --git a/src/maploader/maploader.h b/src/maploader/maploader.h index 37d372edba..67c78c36bf 100644 --- a/src/maploader/maploader.h +++ b/src/maploader/maploader.h @@ -4,6 +4,9 @@ #include "g_levellocals.h" class FileReader; +struct FStrifeDialogueNode; +struct FStrifeDialogueReply; +struct Response; struct EDMapthing { @@ -98,6 +101,7 @@ struct MapData; class MapLoader { friend class UDMFParser; + friend class USDFParser; void *level; // this is to hide the global variable and produce an error for referencing it. public: FLevelLocals *Level; @@ -176,6 +180,16 @@ private: void ReportUnpairedMinisegs(); void CalcIndices(); + // Strife dialogue + void LoadStrifeConversations (MapData *map, const char *mapname); + bool LoadScriptFile (const char *name, bool include, int type); + bool LoadScriptFile(const char *name, int lumpnum, FileReader &lump, int numnodes, bool include, int type); + FStrifeDialogueNode *ReadRetailNode (const char *name, FileReader &lump, uint32_t &prevSpeakerType); + FStrifeDialogueNode *ReadTeaserNode (const char *name, FileReader &lump, uint32_t &prevSpeakerType); + void ParseReplies (const char *name, int pos, FStrifeDialogueReply **replyptr, Response *responses); + + bool ParseUSDF(int lumpnum, FileReader &lump, int lumplen); + // Specials void SpawnSpecials(); void InitSectorSpecial(sector_t *sector, int special); diff --git a/src/maploader/renderinfo.cpp b/src/maploader/renderinfo.cpp index c60b846948..32ec955ac1 100644 --- a/src/maploader/renderinfo.cpp +++ b/src/maploader/renderinfo.cpp @@ -667,7 +667,7 @@ void MapLoader::FloodSectorStacks() for (auto section : HandledSections) { if (section->sector != §or) - Printf("Marked section of sector %d for ceiling portal\n", section->sector->Index()); + DPrintf(DMSG_NOTIFY, "Marked section of sector %d for ceiling portal\n", section->sector->Index()); section->flags |= FSection::DONTRENDERCEILING; } } @@ -688,7 +688,7 @@ void MapLoader::FloodSectorStacks() for (auto section : HandledSections) { if (section->sector != §or) - Printf("Marked section of sector %d for floor portal\n", section->sector->Index()); + DPrintf(DMSG_NOTIFY, "Marked section of sector %d for floor portal\n", section->sector->Index()); section->flags |= FSection::DONTRENDERFLOOR; } } diff --git a/src/maploader/strifedialogue.cpp b/src/maploader/strifedialogue.cpp new file mode 100644 index 0000000000..ea018b6d54 --- /dev/null +++ b/src/maploader/strifedialogue.cpp @@ -0,0 +1,560 @@ +/* +** strifedialogue.cpp +** loads Strife style conversation dialogs +** +**--------------------------------------------------------------------------- +** Copyright 2004-2008 Randy Heit +** Copyright 2006-2019 Christoph Oelckers +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +#include + +#include "actor.h" +#include "p_conversation.h" +#include "w_wad.h" +#include "cmdlib.h" +#include "v_text.h" +#include "gi.h" +#include "a_keys.h" +#include "p_enemy.h" +#include "gstrings.h" +#include "p_setup.h" +#include "d_net.h" +#include "d_event.h" +#include "doomstat.h" +#include "c_console.h" +#include "g_levellocals.h" +#include "maploader.h" + +// The conversations as they exist inside a SCRIPTxx lump. +struct Response +{ + int32_t GiveType; + int32_t Item[3]; + int32_t Count[3]; + char Reply[32]; + char Yes[80]; + int32_t Link; + uint32_t Log; + char No[80]; +}; + +struct Speech +{ + uint32_t SpeakerType; + int32_t DropType; + int32_t ItemCheck[3]; + int32_t Link; + char Name[16]; + char Sound[8]; + char Backdrop[8]; + char Dialogue[320]; + Response Responses[5]; +}; + +// The Teaser version of the game uses an older version of the structure +struct TeaserSpeech +{ + uint32_t SpeakerType; + int32_t DropType; + uint32_t VoiceNumber; + char Name[16]; + char Dialogue[320]; + Response Responses[5]; +}; + +//============================================================================ +// +// P_LoadStrifeConversations +// +// Loads the SCRIPT00 and SCRIPTxx files for a corresponding map. +// +//============================================================================ + +void MapLoader::LoadStrifeConversations (MapData *map, const char *mapname) +{ + if (map->Size(ML_CONVERSATION) > 0) + { + LoadScriptFile (nullptr, map->lumpnum, map->Reader(ML_CONVERSATION), map->Size(ML_CONVERSATION), false, 0); + } + else + { + if (strnicmp (mapname, "MAP", 3) == 0) + { + char scriptname_b[9] = { 'S','C','R','I','P','T',mapname[3],mapname[4],0 }; + char scriptname_t[9] = { 'D','I','A','L','O','G',mapname[3],mapname[4],0 }; + + if ( LoadScriptFile(scriptname_t, false, 2) + || LoadScriptFile(scriptname_b, false, 1)) + { + return; + } + } + + if (gameinfo.Dialogue.IsNotEmpty()) + { + if (LoadScriptFile(gameinfo.Dialogue, false, 0)) + { + return; + } + } + + LoadScriptFile("SCRIPT00", false, 1); + } +} + +//============================================================================ +// +// LoadScriptFile +// +// Loads a SCRIPTxx file and converts it into a more useful internal format. +// +//============================================================================ + +bool MapLoader::LoadScriptFile (const char *name, bool include, int type) +{ + int lumpnum = Wads.CheckNumForName (name); + const bool found = lumpnum >= 0 + || (lumpnum = Wads.CheckNumForFullName (name)) >= 0; + + if (!found) + { + if (type == 0) + { + Printf(TEXTCOLOR_RED "Could not find dialog file %s\n", name); + } + + return false; + } + FileReader lump = Wads.ReopenLumpReader (lumpnum); + + auto fn = Wads.GetLumpFile(lumpnum); + auto wadname = Wads.GetWadName(fn); + if (stricmp(wadname, "STRIFE0.WAD") && stricmp(wadname, "STRIFE1.WAD") && stricmp(wadname, "SVE.WAD")) name = nullptr; // Only localize IWAD content. + if (name && !stricmp(name, "SCRIPT00")) name = nullptr; // This only contains random string references which already use the string table. + + bool res = LoadScriptFile(name, lumpnum, lump, Wads.LumpLength(lumpnum), include, type); + return res; +} + +bool MapLoader::LoadScriptFile(const char *name, int lumpnum, FileReader &lump, int numnodes, bool include, int type) +{ + int i; + uint32_t prevSpeakerType; + FStrifeDialogueNode *node; + char buffer[4]; + + lump.Read(buffer, 4); + lump.Seek(-4, FileReader::SeekCur); + + // The binary format is so primitive that this check is enough to detect it. + bool isbinary = (buffer[0] == 0 || buffer[1] == 0 || buffer[2] == 0 || buffer[3] == 0); + + if ((type == 1 && !isbinary) || (type == 2 && isbinary)) + { + DPrintf(DMSG_ERROR, "Incorrect data format for conversation script in %s.\n", Wads.GetLumpFullName(lumpnum)); + return false; + } + + if (!isbinary) + { + ParseUSDF(lumpnum, lump, numnodes); + } + else + { + if (!include) + { + LoadScriptFile("SCRIPT00", true, 1); + } + if (!(gameinfo.flags & GI_SHAREWARE)) + { + // Strife scripts are always a multiple of 1516 bytes because each entry + // is exactly 1516 bytes long. + if (numnodes % 1516 != 0) + { + DPrintf(DMSG_ERROR, "Incorrect data format for conversation script in %s.\n", Wads.GetLumpFullName(lumpnum)); + return false; + } + numnodes /= 1516; + } + else + { + // And the teaser version has 1488-byte entries. + if (numnodes % 1488 != 0) + { + DPrintf(DMSG_ERROR, "Incorrect data format for conversation script in %s.\n", Wads.GetLumpFullName(lumpnum)); + return false; + } + numnodes /= 1488; + } + + prevSpeakerType = 0; + + for (i = 0; i < numnodes; ++i) + { + if (!(gameinfo.flags & GI_SHAREWARE)) + { + node = ReadRetailNode (name, lump, prevSpeakerType); + } + else + { + node = ReadTeaserNode (name, lump, prevSpeakerType); + } + node->ThisNodeNum = Level->StrifeDialogues.Push(node); + } + } + return true; +} + +//============================================================================ +// +// ReadRetailNode +// +// Converts a single dialogue node from the Retail version of Strife. +// +//============================================================================ + +static FString TokenFromString(const char *speech) +{ + FString token = speech; + token.ToUpper(); + token.ReplaceChars(".,-+!?'", ' '); + token.Substitute(" ", ""); + token.Truncate(5); + return token; +} + +FStrifeDialogueNode *MapLoader::ReadRetailNode (const char *name, FileReader &lump, uint32_t &prevSpeakerType) +{ + FStrifeDialogueNode *node; + Speech speech; + char fullsound[16]; + PClassActor *type; + int j; + + node = new FStrifeDialogueNode; + + auto pos = lump.Tell(); + lump.Read (&speech, sizeof(speech)); + + // Byte swap all the ints in the original data + speech.SpeakerType = LittleLong(speech.SpeakerType); + speech.DropType = LittleLong(speech.DropType); + speech.Link = LittleLong(speech.Link); + + // Assign the first instance of a conversation as the default for its + // actor, so newly spawned actors will use this conversation by default. + type = GetStrifeType (speech.SpeakerType); + node->SpeakerType = type; + + if ((signed)(speech.SpeakerType) >= 0 && prevSpeakerType != speech.SpeakerType) + { + if (type != NULL) + { + Level->ClassRoots[type->TypeName] = Level->StrifeDialogues.Size(); + } + Level->DialogueRoots[speech.SpeakerType] = Level->StrifeDialogues.Size(); + prevSpeakerType = speech.SpeakerType; + } + + // Convert the rest of the data to our own internal format. + + if (name) + { + FStringf label("$TXT_DLG_%s_d%d_%s", name, int(pos), TokenFromString(speech.Dialogue).GetChars()); + node->Dialogue = GStrings.exists(label.GetChars()+1)? label : FString(speech.Dialogue); + } + else + { + node->Dialogue = speech.Dialogue; + } + + // The speaker's portrait, if any. + speech.Dialogue[0] = 0; //speech.Backdrop[8] = 0; + node->Backdrop = speech.Backdrop; + + // The speaker's voice for this node, if any. + speech.Backdrop[0] = 0; //speech.Sound[8] = 0; + mysnprintf (fullsound, countof(fullsound), "svox/%s", speech.Sound); + node->SpeakerVoice = fullsound; + + // The speaker's name, if any. + speech.Sound[0] = 0; //speech.Name[16] = 0; + if (name && speech.Name[0]) + { + FString label = speech.Name; + label.ReplaceChars(' ', '_'); + label.ReplaceChars('\'', '_'); + node->SpeakerName.Format("$TXT_SPEAKER_%s", label.GetChars()); + if (!GStrings.exists(node->SpeakerName.GetChars() + 1)) node->SpeakerName = speech.Name; + + } + else + { + node->SpeakerName = speech.Name; + } + + // The item the speaker should drop when killed. + node->DropType = GetStrifeType(speech.DropType); + + // Items you need to have to make the speaker use a different node. + node->ItemCheck.Resize(3); + for (j = 0; j < 3; ++j) + { + auto inv = GetStrifeType(speech.ItemCheck[j]); + if (!inv->IsDescendantOf(NAME_Inventory)) inv = nullptr; + node->ItemCheck[j].Item = inv; + node->ItemCheck[j].Amount = -1; + } + node->ItemCheckNode = speech.Link; + node->Children = NULL; + + ParseReplies (name, int(pos), &node->Children, &speech.Responses[0]); + + return node; +} + +//============================================================================ +// +// ReadTeaserNode +// +// Converts a single dialogue node from the Teaser version of Strife. +// +//============================================================================ + +FStrifeDialogueNode *MapLoader::ReadTeaserNode (const char *name, FileReader &lump, uint32_t &prevSpeakerType) +{ + FStrifeDialogueNode *node; + TeaserSpeech speech; + char fullsound[16]; + PClassActor *type; + int j; + + node = new FStrifeDialogueNode; + + auto pos = lump.Tell() * 1516 / 1488; + lump.Read (&speech, sizeof(speech)); + + // Byte swap all the ints in the original data + speech.SpeakerType = LittleLong(speech.SpeakerType); + speech.DropType = LittleLong(speech.DropType); + + // Assign the first instance of a conversation as the default for its + // actor, so newly spawned actors will use this conversation by default. + type = GetStrifeType(speech.SpeakerType); + node->SpeakerType = type; + + if ((signed)speech.SpeakerType >= 0 && prevSpeakerType != speech.SpeakerType) + { + if (type != NULL) + { + Level->ClassRoots[type->TypeName] = Level->StrifeDialogues.Size(); + } + Level->DialogueRoots[speech.SpeakerType] = Level->StrifeDialogues.Size(); + prevSpeakerType = speech.SpeakerType; + } + + // Convert the rest of the data to our own internal format. + if (name) + { + FStringf label("$TXT_DLG_%s_d%d_%s", name, pos, TokenFromString(speech.Dialogue).GetChars()); + node->Dialogue = GStrings.exists(label.GetChars() + 1)? label : FString(speech.Dialogue); + } + else + { + node->Dialogue = speech.Dialogue; + } + + // The Teaser version doesn't have portraits. + node->Backdrop = ""; + + // The speaker's voice for this node, if any. + if (speech.VoiceNumber != 0) + { + mysnprintf (fullsound, countof(fullsound), "svox/voc%u", speech.VoiceNumber); + node->SpeakerVoice = fullsound; + } + else + { + node->SpeakerVoice = 0; + } + + // The speaker's name, if any. + speech.Dialogue[0] = 0; //speech.Name[16] = 0; + if (name && speech.Name[0]) + { + FString label = speech.Name; + label.ReplaceChars(' ', '_'); + label.ReplaceChars('\'', '_'); + node->SpeakerName.Format("$TXT_SPEAKER_%s", label.GetChars()); + if (!GStrings.exists(node->SpeakerName.GetChars() + 1)) node->SpeakerName = speech.Name; + } + else + { + node->SpeakerName = speech.Name; + } + + // The item the speaker should drop when killed. + node->DropType = GetStrifeType (speech.DropType); + + // Items you need to have to make the speaker use a different node. + node->ItemCheck.Resize(3); + for (j = 0; j < 3; ++j) + { + node->ItemCheck[j].Item = NULL; + node->ItemCheck[j].Amount = -1; + } + node->ItemCheckNode = 0; + node->Children = NULL; + + ParseReplies (name, int(pos), &node->Children, &speech.Responses[0]); + + return node; +} + +//============================================================================ +// +// ParseReplies +// +// Convert PC responses. Rather than being stored inside the main node, they +// hang off it as a singly-linked list, so no space is wasted on replies that +// don't even matter. +// +//============================================================================ + +void MapLoader::ParseReplies (const char *name, int pos, FStrifeDialogueReply **replyptr, Response *responses) +{ + FStrifeDialogueReply *reply; + int j, k; + + // Byte swap first. + for (j = 0; j < 5; ++j) + { + responses[j].GiveType = LittleLong(responses[j].GiveType); + responses[j].Link = LittleLong(responses[j].Link); + responses[j].Log = LittleLong(responses[j].Log); + for (k = 0; k < 3; ++k) + { + responses[j].Item[k] = LittleLong(responses[j].Item[k]); + responses[j].Count[k] = LittleLong(responses[j].Count[k]); + } + } + + for (j = 0; j < 5; ++j) + { + Response *rsp = &responses[j]; + + // If the reply has no text and goes nowhere, then it doesn't + // need to be remembered. + if (rsp->Reply[0] == 0 && rsp->Link == 0) + { + continue; + } + reply = new FStrifeDialogueReply; + + // The next node to use when this reply is chosen. + reply->NextNode = rsp->Link; + if (reply->NextNode < 0) + { + reply->NextNode *= -1; + reply->CloseDialog = false; + } + + // The message to record in the log for this reply. + reply->LogNumber = rsp->Log; + reply->LogString = ""; + + // The item to receive when this reply is used. + reply->GiveType = GetStrifeType (rsp->GiveType); + reply->ActionSpecial = 0; + + // Do you need anything special for this reply to succeed? + reply->ItemCheck.Resize(3); + for (k = 0; k < 3; ++k) + { + auto inv = GetStrifeType(rsp->Item[k]); + if (!inv->IsDescendantOf(NAME_Inventory)) inv = nullptr; + reply->ItemCheck[k].Item = inv; + reply->ItemCheck[k].Amount = rsp->Count[k]; + } + reply->PrintAmount = reply->ItemCheck[0].Amount; + reply->ItemCheckRequire.Clear(); + reply->ItemCheckExclude.Clear(); + + if (name) + { + FStringf label("$TXT_RPLY%d_%s_d%d_%s", j, name, pos, TokenFromString(rsp->Reply).GetChars()); + reply->Reply = GStrings.exists(label.GetChars() + 1)? label : FString(rsp->Reply); + + reply->Reply = label; + } + else + { + reply->Reply = rsp->Reply; + } + + + // If the first item check has a positive amount required, then + // add that to the reply string. Otherwise, use the reply as-is. + reply->NeedsGold = (rsp->Count[0] > 0); + + // QuickYes messages are shown when you meet the item checks. + // QuickNo messages are shown when you don't. + // Note that empty nodes contain a '_' in retail Strife, a '.' in the teasers and an empty string in SVE. + if (((rsp->Yes[0] == '_' || rsp->Yes[0] == '.') && rsp->Yes[1] == 0) || rsp->Yes[0] == 0) + { + reply->QuickYes = ""; + } + else + { + if (name) + { + FStringf label("$TXT_RYES%d_%s_d%d_%s", j, name, pos, TokenFromString(rsp->Yes).GetChars()); + reply->QuickYes = GStrings.exists(label.GetChars() + 1)? label : FString(rsp->Yes); + } + else + { + reply->QuickYes = rsp->Yes; + } + } + if (reply->ItemCheck[0].Item != 0) + { + FStringf label("$TXT_RNO%d_%s_d%d_%s", j, name, pos, TokenFromString(rsp->No).GetChars()); + reply->QuickNo = GStrings.exists(label.GetChars() + 1)? label : FString(rsp->No); + } + else + { + reply->QuickNo = ""; + } + reply->Next = *replyptr; + *replyptr = reply; + replyptr = &reply->Next; + } +} + diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index 3a86bfcdfb..b8eac3744a 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -40,7 +40,7 @@ #include "gi.h" #include "r_sky.h" #include "g_level.h" -#include "p_udmf.h" +#include "udmf.h" #include "r_state.h" #include "w_wad.h" #include "p_tags.h" diff --git a/src/p_udmf.h b/src/maploader/udmf.h similarity index 100% rename from src/p_udmf.h rename to src/maploader/udmf.h diff --git a/src/p_usdf.cpp b/src/maploader/usdf.cpp similarity index 97% rename from src/p_usdf.cpp rename to src/maploader/usdf.cpp index e88bbeda85..d6098ab310 100644 --- a/src/p_usdf.cpp +++ b/src/maploader/usdf.cpp @@ -35,12 +35,13 @@ #include "p_setup.h" #include "p_lnspec.h" #include "p_conversation.h" -#include "p_udmf.h" +#include "udmf.h" #include "doomerrors.h" #include "actor.h" #include "a_pickups.h" #include "w_wad.h" #include "g_levellocals.h" +#include "maploader.h" #define Zd 1 #define St 2 @@ -496,9 +497,9 @@ class USDFParser : public UDMFParserBase //=========================================================================== public: - bool Parse(FLevelLocals *l, int lumpnum, FileReader &lump, int lumplen) + bool Parse(MapLoader *loader,int lumpnum, FileReader &lump, int lumplen) { - Level = l; + Level = loader->Level; sc.OpenMem(Wads.GetLumpFullName(lumpnum), lump.Read(lumplen)); sc.SetCMode(true); // Namespace must be the first field because everything else depends on it. @@ -541,7 +542,7 @@ public: { sc.MustGetToken('='); sc.MustGetToken(TK_StringConst); - LoadScriptFile(Level, sc.String, true); + loader->LoadScriptFile(sc.String, true, 0); sc.MustGetToken(';'); } else @@ -607,13 +608,13 @@ public: -bool P_ParseUSDF(FLevelLocals *l, int lumpnum, FileReader &lump, int lumplen) +bool MapLoader::ParseUSDF(int lumpnum, FileReader &lump, int lumplen) { USDFParser parse; try { - if (!parse.Parse(l, lumpnum, lump, lumplen)) + if (!parse.Parse(this, lumpnum, lump, lumplen)) { // clean up the incomplete dialogue structures here return false; diff --git a/src/menu/loadsavemenu.cpp b/src/menu/loadsavemenu.cpp index c7dc2738e8..851a7fb4cf 100644 --- a/src/menu/loadsavemenu.cpp +++ b/src/menu/loadsavemenu.cpp @@ -185,14 +185,11 @@ void FSavegameManager::ReadSaveStrings() if (arc.OpenReader((const char *)data, info->LumpSize)) { int savever = 0; - FString engine; - FString iwad; - FString title; - arc("Save Version", savever); - arc("Engine", engine); - arc("Game WAD", iwad); - arc("Title", title); + FString engine = arc.GetString("Engine"); + FString iwad = arc.GetString("Game WAD"); + FString title = arc.GetString("Title"); + if (engine.Compare(GAMESIG) != 0 || savever > SAVEVER) { @@ -473,10 +470,10 @@ unsigned FSavegameManager::ExtractSaveData(int index) FSerializer arc(nullptr); if (arc.OpenReader((const char *)data, info->LumpSize)) { - FString time, pcomment, comment; + FString comment; - arc("Creation Time", time); - arc("Comment", pcomment); + FString time = arc.GetString("Creation Time"); + FString pcomment = arc.GetString("Comment"); comment = time; if (time.Len() > 0) comment += "\n"; diff --git a/src/menu/menu.cpp b/src/menu/menu.cpp index 6689f771b4..03b66986d1 100644 --- a/src/menu/menu.cpp +++ b/src/menu/menu.cpp @@ -52,6 +52,7 @@ #include "vm.h" #include "events.h" #include "v_video.h" +#include "i_system.h" #include "scripting/types.h" int DMenu::InMenu; @@ -404,11 +405,45 @@ DEFINE_ACTION_FUNCTION(DMenu, ActivateMenu) // //============================================================================= +EXTERN_CVAR(Int, cl_localizationmode) + + void M_SetMenu(FName menu, int param) { // some menus need some special treatment switch (menu) { + case NAME_Mainmenu: + if (gameinfo.gametype & GAME_DoomStrifeChex) // Raven's games always used text based menus + { + if (gameinfo.forcetextinmenus) // If text is forced, this overrides any check. + { + menu = NAME_MainmenuTextOnly; + } + else + { + // For these games we must check up-front if they get localized because in that case another template must be used. + DMenuDescriptor **desc = MenuDescriptors.CheckKey(NAME_Mainmenu); + if (desc != nullptr) + { + if ((*desc)->IsKindOf(RUNTIME_CLASS(DListMenuDescriptor))) + { + DListMenuDescriptor *ld = static_cast(*desc); + if (ld->mFromEngine && cl_localizationmode != 0) + { + // This assumes that replacing one graphic will replace all of them. + // So this only checks the "New game" entry for localization capability. + FTextureID texid = TexMan.CheckForTexture("M_NGAME", ETextureType::MiscPatch); + if (!TexMan.OkForLocalization(texid, "$MNU_NEWGAME")) + { + menu = NAME_MainmenuTextOnly; + } + } + } + } + } + } + break; case NAME_Episodemenu: // sent from the player class menu GameStartupInfo.Skill = -1; @@ -416,6 +451,7 @@ void M_SetMenu(FName menu, int param) GameStartupInfo.PlayerClass = param == -1000? nullptr : param == -1? "Random" : GetPrintableDisplayName(PlayerClasses[param].Type).GetChars(); + M_StartupEpisodeMenu(&GameStartupInfo); // needs player class name from class menu (later) break; case NAME_Skillmenu: diff --git a/src/menu/menu.h b/src/menu/menu.h index 83f4f66da5..ae78940828 100644 --- a/src/menu/menu.h +++ b/src/menu/menu.h @@ -149,6 +149,7 @@ public: EColorRange mFontColor; EColorRange mFontColor2; bool mCenter; + bool mFromEngine; void Reset() { @@ -164,6 +165,7 @@ public: mFont = NULL; mFontColor = CR_UNTRANSLATED; mFontColor2 = CR_UNTRANSLATED; + mFromEngine = false; } size_t PropagateMark() override; @@ -339,6 +341,7 @@ void M_ActivateMenu(DMenu *menu); void M_ClearMenus (); void M_PreviousMenu (); void M_ParseMenuDefs(); +void M_StartupEpisodeMenu(FGameStartup *gs); void M_StartupSkillMenu(FGameStartup *gs); void M_StartControlPanel (bool makeSound); void M_SetMenu(FName menu, int param = -1); diff --git a/src/menu/menudef.cpp b/src/menu/menudef.cpp index 409db4ba3d..26a42d539e 100644 --- a/src/menu/menudef.cpp +++ b/src/menu/menudef.cpp @@ -370,7 +370,7 @@ static void ParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc) if (cls != nullptr && cls->IsDescendantOf("ListMenuItem")) { auto func = dyn_cast(cls->FindSymbol("Init", true)); - if (func != nullptr && !(func->Variants[0].Flags & (VARF_Protected | VARF_Private))) // skip internal classes which have a protexted init method. + if (func != nullptr && !(func->Variants[0].Flags & (VARF_Protected | VARF_Private))) // skip internal classes which have a protected init method. { auto &args = func->Variants[0].Proto->ArgumentTypes; TArray params; @@ -404,7 +404,7 @@ static void ParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc) } else if (args[i] == TypeFont) { - auto f = FFont::FindFont(sc.String); + auto f = V_GetFont(sc.String); if (f == nullptr) { sc.ScriptError("Unknown font %s", sc.String); @@ -645,6 +645,7 @@ static void ParseListMenu(FScanner &sc) desc->mWLeft = 0; desc->mWRight = 0; desc->mCenter = false; + desc->mFromEngine = Wads.GetLumpFile(sc.LumpNum) == 0; // flags menu if the definition is from the IWAD. ParseListMenuBody(sc, desc); ReplaceMenu(sc, desc); @@ -1078,16 +1079,31 @@ void M_ParseMenuDefs() // //============================================================================= -static void BuildEpisodeMenu() +void M_StartupEpisodeMenu(FGameStartup *gs) { // Build episode menu bool success = false; + bool isOld = false; DMenuDescriptor **desc = MenuDescriptors.CheckKey(NAME_Episodemenu); if (desc != nullptr) { if ((*desc)->IsKindOf(RUNTIME_CLASS(DListMenuDescriptor))) { DListMenuDescriptor *ld = static_cast(*desc); + + // Delete previous contents + for(unsigned i=0; imItems.Size(); i++) + { + FName n = ld->mItems[i]->mAction; + if (n == NAME_Skillmenu) + { + isOld = true; + ld->mItems.Resize(i); + break; + } + } + + int posy = (int)ld->mYpos; int topy = posy; @@ -1114,16 +1130,17 @@ static void BuildEpisodeMenu() posy -= topdelta; } - ld->mSelectedItem = ld->mItems.Size(); + if (!isOld) ld->mSelectedItem = ld->mItems.Size(); for(unsigned i = 0; i < AllEpisodes.Size(); i++) { - DMenuItemBase *it; + DMenuItemBase *it = nullptr; if (AllEpisodes[i].mPicName.IsNotEmpty()) { FTextureID tex = GetMenuTexture(AllEpisodes[i].mPicName); - it = CreateListMenuItemPatch(ld->mXpos, posy, ld->mLinespacing, AllEpisodes[i].mShortcut, tex, NAME_Skillmenu, i); + if (AllEpisodes[i].mEpisodeName.IsEmpty() || TexMan.OkForLocalization(tex, AllEpisodes[i].mEpisodeName)) + it = CreateListMenuItemPatch(ld->mXpos, posy, ld->mLinespacing, AllEpisodes[i].mShortcut, tex, NAME_Skillmenu, i); } - else + if (it == nullptr) { it = CreateListMenuItemText(ld->mXpos, posy, ld->mLinespacing, AllEpisodes[i].mShortcut, AllEpisodes[i].mEpisodeName, ld->mFont, ld->mFontColor, ld->mFontColor2, NAME_Skillmenu, i); @@ -1142,6 +1159,7 @@ static void BuildEpisodeMenu() } } } + else return; // do not recreate the option menu variant, because it is always text based. } if (!success) { @@ -1186,6 +1204,7 @@ static void BuildPlayerclassMenu() { DListMenuDescriptor *ld = static_cast(*desc); // add player display + ld->mSelectedItem = ld->mItems.Size(); int posy = (int)ld->mYpos; @@ -1482,7 +1501,6 @@ static void InitKeySections() void M_CreateMenus() { - BuildEpisodeMenu(); BuildPlayerclassMenu(); InitCrosshairsList(); InitMusicMenus(); @@ -1617,7 +1635,7 @@ void M_StartupSkillMenu(FGameStartup *gs) for(unsigned int i = 0; i < MenuSkills.Size(); i++) { FSkillInfo &skill = *MenuSkills[i]; - DMenuItemBase *li; + DMenuItemBase *li = nullptr; // Using a different name for skills that must be confirmed makes handling this easier. FName action = (skill.MustConfirm && !AllEpisodes[gs->Episode].mNoSkill) ? NAME_StartgameConfirm : NAME_Startgame; @@ -1627,16 +1645,17 @@ void M_StartupSkillMenu(FGameStartup *gs) pItemText = skill.MenuNamesForPlayerClass.CheckKey(gs->PlayerClass); } + EColorRange color = (EColorRange)skill.GetTextColor(); + if (color == CR_UNTRANSLATED) color = ld->mFontColor; if (skill.PicName.Len() != 0 && pItemText == nullptr) { FTextureID tex = GetMenuTexture(skill.PicName); - li = CreateListMenuItemPatch(ld->mXpos, y, ld->mLinespacing, skill.Shortcut, tex, action, SkillIndices[i]); + if (skill.MenuName.IsEmpty() || TexMan.OkForLocalization(tex, skill.MenuName)) + li = CreateListMenuItemPatch(ld->mXpos, y, ld->mLinespacing, skill.Shortcut, tex, action, SkillIndices[i]); } - else + if (li == nullptr) { - EColorRange color = (EColorRange)skill.GetTextColor(); - if (color == CR_UNTRANSLATED) color = ld->mFontColor; - li = CreateListMenuItemText(x, y, ld->mLinespacing, skill.Shortcut, + li = CreateListMenuItemText(x, y, ld->mLinespacing, skill.Shortcut, pItemText? *pItemText : skill.MenuName, ld->mFont, color,ld->mFontColor2, action, SkillIndices[i]); } ld->mItems.Push(li); diff --git a/src/menu/messagebox.cpp b/src/menu/messagebox.cpp index e205536732..8a2335fa78 100644 --- a/src/menu/messagebox.cpp +++ b/src/menu/messagebox.cpp @@ -191,8 +191,8 @@ CCMD (quicksave) S_Sound(CHAN_VOICE | CHAN_UI, "menu/activate", snd_menuvolume, ATTN_NONE); - FString tempstring; - tempstring.Format(GStrings("QSPROMPT"), savegameManager.quickSaveSlot->SaveTitle.GetChars()); + FString tempstring = GStrings("QSPROMPT"); + tempstring.Substitute("%s", savegameManager.quickSaveSlot->SaveTitle.GetChars()); DMenu *newmenu = CreateMessageBoxMenu(CurrentMenu, tempstring, 0, false, NAME_None, []() { @@ -234,8 +234,8 @@ CCMD (quickload) G_LoadGame(savegameManager.quickSaveSlot->Filename.GetChars()); return; } - FString tempstring; - tempstring.Format(GStrings("QLPROMPT"), savegameManager.quickSaveSlot->SaveTitle.GetChars()); + FString tempstring = GStrings("QLPROMPT"); + tempstring.Substitute("%s", savegameManager.quickSaveSlot->SaveTitle.GetChars()); M_StartControlPanel(true); diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index e65e203dfd..b94d19535d 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -58,43 +58,6 @@ #include "v_video.h" #include "actorinlines.h" -// The conversations as they exist inside a SCRIPTxx lump. -struct Response -{ - int32_t GiveType; - int32_t Item[3]; - int32_t Count[3]; - char Reply[32]; - char Yes[80]; - int32_t Link; - uint32_t Log; - char No[80]; -}; - -struct Speech -{ - uint32_t SpeakerType; - int32_t DropType; - int32_t ItemCheck[3]; - int32_t Link; - char Name[16]; - char Sound[8]; - char Backdrop[8]; - char Dialogue[320]; - Response Responses[5]; -}; - -// The Teaser version of the game uses an older version of the structure -struct TeaserSpeech -{ - uint32_t SpeakerType; - int32_t DropType; - uint32_t VoiceNumber; - char Name[16]; - char Dialogue[320]; - Response Responses[5]; -}; - static FRandom pr_randomspeech("RandomSpeech"); static int ConversationMenuY; @@ -103,10 +66,6 @@ static int ConversationMenuY; static FStrifeDialogueNode *PrevNode; static int StaticLastReply; -static bool LoadScriptFile(FLevelLocals *Level, const char *name, int lumpnum, FileReader &lump, int numnodes, bool include, int type); -static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, const char *name, FileReader &lump, uint32_t &prevSpeakerType); -static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, const char *name, FileReader &lump, uint32_t &prevSpeakerType); -static void ParseReplies (const char *name, int pos, FStrifeDialogueReply **replyptr, Response *responses); static bool DrawConversationMenu (); static void PickConversationReply (int replyindex); static void TerminalResponse (const char *str); @@ -153,458 +112,6 @@ int FLevelLocals::GetConversation(FName classname) else return *pindex; } -//============================================================================ -// -// P_LoadStrifeConversations -// -// Loads the SCRIPT00 and SCRIPTxx files for a corresponding map. -// -//============================================================================ - -void P_LoadStrifeConversations (FLevelLocals *Level, MapData *map, const char *mapname) -{ - if (map->Size(ML_CONVERSATION) > 0) - { - LoadScriptFile (Level, nullptr, map->lumpnum, map->Reader(ML_CONVERSATION), map->Size(ML_CONVERSATION), false, 0); - } - else - { - if (strnicmp (mapname, "MAP", 3) == 0) - { - char scriptname_b[9] = { 'S','C','R','I','P','T',mapname[3],mapname[4],0 }; - char scriptname_t[9] = { 'D','I','A','L','O','G',mapname[3],mapname[4],0 }; - - if ( LoadScriptFile(Level, scriptname_t, false, 2) - || LoadScriptFile(Level, scriptname_b, false, 1)) - { - return; - } - } - - if (gameinfo.Dialogue.IsNotEmpty()) - { - if (LoadScriptFile(Level, gameinfo.Dialogue, false, 0)) - { - return; - } - } - - LoadScriptFile(Level, "SCRIPT00", false, 1); - } -} - -//============================================================================ -// -// LoadScriptFile -// -// Loads a SCRIPTxx file and converts it into a more useful internal format. -// -//============================================================================ - -bool LoadScriptFile (FLevelLocals *Level, const char *name, bool include, int type) -{ - int lumpnum = Wads.CheckNumForName (name); - const bool found = lumpnum >= 0 - || (lumpnum = Wads.CheckNumForFullName (name)) >= 0; - - if (!found) - { - if (type == 0) - { - Printf(TEXTCOLOR_RED "Could not find dialog file %s\n", name); - } - - return false; - } - FileReader lump = Wads.ReopenLumpReader (lumpnum); - - auto fn = Wads.GetLumpFile(lumpnum); - auto wadname = Wads.GetWadName(fn); - if (stricmp(wadname, "STRIFE0.WAD") && stricmp(wadname, "STRIFE1.WAD") && stricmp(wadname, "SVE.WAD")) name = nullptr; // Only localize IWAD content. - if (name && !stricmp(name, "SCRIPT00")) name = nullptr; // This only contains random string references which already use the string table. - - bool res = LoadScriptFile(Level, name, lumpnum, lump, Wads.LumpLength(lumpnum), include, type); - return res; -} - -static bool LoadScriptFile(FLevelLocals *Level, const char *name, int lumpnum, FileReader &lump, int numnodes, bool include, int type) -{ - int i; - uint32_t prevSpeakerType; - FStrifeDialogueNode *node; - char buffer[4]; - - lump.Read(buffer, 4); - lump.Seek(-4, FileReader::SeekCur); - - // The binary format is so primitive that this check is enough to detect it. - bool isbinary = (buffer[0] == 0 || buffer[1] == 0 || buffer[2] == 0 || buffer[3] == 0); - - if ((type == 1 && !isbinary) || (type == 2 && isbinary)) - { - DPrintf(DMSG_ERROR, "Incorrect data format for conversation script in %s.\n", Wads.GetLumpFullName(lumpnum)); - return false; - } - - if (!isbinary) - { - P_ParseUSDF(Level, lumpnum, lump, numnodes); - } - else - { - if (!include) - { - LoadScriptFile(Level, "SCRIPT00", true, 1); - } - if (!(gameinfo.flags & GI_SHAREWARE)) - { - // Strife scripts are always a multiple of 1516 bytes because each entry - // is exactly 1516 bytes long. - if (numnodes % 1516 != 0) - { - DPrintf(DMSG_ERROR, "Incorrect data format for conversation script in %s.\n", Wads.GetLumpFullName(lumpnum)); - return false; - } - numnodes /= 1516; - } - else - { - // And the teaser version has 1488-byte entries. - if (numnodes % 1488 != 0) - { - DPrintf(DMSG_ERROR, "Incorrect data format for conversation script in %s.\n", Wads.GetLumpFullName(lumpnum)); - return false; - } - numnodes /= 1488; - } - - prevSpeakerType = 0; - - for (i = 0; i < numnodes; ++i) - { - if (!(gameinfo.flags & GI_SHAREWARE)) - { - node = ReadRetailNode (Level, name, lump, prevSpeakerType); - } - else - { - node = ReadTeaserNode (Level, name, lump, prevSpeakerType); - } - node->ThisNodeNum = Level->StrifeDialogues.Push(node); - } - } - return true; -} - -//============================================================================ -// -// ReadRetailNode -// -// Converts a single dialogue node from the Retail version of Strife. -// -//============================================================================ - -static FString TokenFromString(const char *speech) -{ - FString token = speech; - token.ToUpper(); - token.ReplaceChars(".,-+!?'", ' '); - token.Substitute(" ", ""); - token.Truncate(5); - return token; -} - -static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, const char *name, FileReader &lump, uint32_t &prevSpeakerType) -{ - FStrifeDialogueNode *node; - Speech speech; - char fullsound[16]; - PClassActor *type; - int j; - - node = new FStrifeDialogueNode; - - auto pos = lump.Tell(); - lump.Read (&speech, sizeof(speech)); - - // Byte swap all the ints in the original data - speech.SpeakerType = LittleLong(speech.SpeakerType); - speech.DropType = LittleLong(speech.DropType); - speech.Link = LittleLong(speech.Link); - - // Assign the first instance of a conversation as the default for its - // actor, so newly spawned actors will use this conversation by default. - type = GetStrifeType (speech.SpeakerType); - node->SpeakerType = type; - - if ((signed)(speech.SpeakerType) >= 0 && prevSpeakerType != speech.SpeakerType) - { - if (type != NULL) - { - Level->ClassRoots[type->TypeName] = Level->StrifeDialogues.Size(); - } - Level->DialogueRoots[speech.SpeakerType] = Level->StrifeDialogues.Size(); - prevSpeakerType = speech.SpeakerType; - } - - // Convert the rest of the data to our own internal format. - - if (name) - { - FStringf label("$TXT_DLG_%s_d%d_%s", name, int(pos), TokenFromString(speech.Dialogue).GetChars()); - node->Dialogue = label; - } - else - { - node->Dialogue = speech.Dialogue; - } - - // The speaker's portrait, if any. - speech.Dialogue[0] = 0; //speech.Backdrop[8] = 0; - node->Backdrop = speech.Backdrop; - - // The speaker's voice for this node, if any. - speech.Backdrop[0] = 0; //speech.Sound[8] = 0; - mysnprintf (fullsound, countof(fullsound), "svox/%s", speech.Sound); - node->SpeakerVoice = fullsound; - - // The speaker's name, if any. - speech.Sound[0] = 0; //speech.Name[16] = 0; - node->SpeakerName = speech.Name; - - // The item the speaker should drop when killed. - node->DropType = GetStrifeType(speech.DropType); - - // Items you need to have to make the speaker use a different node. - node->ItemCheck.Resize(3); - for (j = 0; j < 3; ++j) - { - auto inv = GetStrifeType(speech.ItemCheck[j]); - if (!inv->IsDescendantOf(NAME_Inventory)) inv = nullptr; - node->ItemCheck[j].Item = inv; - node->ItemCheck[j].Amount = -1; - } - node->ItemCheckNode = speech.Link; - node->Children = NULL; - - ParseReplies (name, int(pos), &node->Children, &speech.Responses[0]); - - return node; -} - -//============================================================================ -// -// ReadTeaserNode -// -// Converts a single dialogue node from the Teaser version of Strife. -// -//============================================================================ - -static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, const char *name, FileReader &lump, uint32_t &prevSpeakerType) -{ - FStrifeDialogueNode *node; - TeaserSpeech speech; - char fullsound[16]; - PClassActor *type; - int j; - - node = new FStrifeDialogueNode; - - auto pos = lump.Tell() * 1516 / 1488; - lump.Read (&speech, sizeof(speech)); - - // Byte swap all the ints in the original data - speech.SpeakerType = LittleLong(speech.SpeakerType); - speech.DropType = LittleLong(speech.DropType); - - // Assign the first instance of a conversation as the default for its - // actor, so newly spawned actors will use this conversation by default. - type = GetStrifeType(speech.SpeakerType); - node->SpeakerType = type; - - if ((signed)speech.SpeakerType >= 0 && prevSpeakerType != speech.SpeakerType) - { - if (type != NULL) - { - Level->ClassRoots[type->TypeName] = Level->StrifeDialogues.Size(); - } - Level->DialogueRoots[speech.SpeakerType] = Level->StrifeDialogues.Size(); - prevSpeakerType = speech.SpeakerType; - } - - // Convert the rest of the data to our own internal format. - if (name) - { - FStringf label("$TXT_DLG_%s_d%d_%s", name, pos, TokenFromString(speech.Dialogue).GetChars()); - node->Dialogue = label; - } - else - { - node->Dialogue = speech.Dialogue; - } - - // The Teaser version doesn't have portraits. - node->Backdrop = ""; - - // The speaker's voice for this node, if any. - if (speech.VoiceNumber != 0) - { - mysnprintf (fullsound, countof(fullsound), "svox/voc%u", speech.VoiceNumber); - node->SpeakerVoice = fullsound; - } - else - { - node->SpeakerVoice = 0; - } - - // The speaker's name, if any. - speech.Dialogue[0] = 0; //speech.Name[16] = 0; - node->SpeakerName = speech.Name; - - // The item the speaker should drop when killed. - node->DropType = GetStrifeType (speech.DropType); - - // Items you need to have to make the speaker use a different node. - node->ItemCheck.Resize(3); - for (j = 0; j < 3; ++j) - { - node->ItemCheck[j].Item = NULL; - node->ItemCheck[j].Amount = -1; - } - node->ItemCheckNode = 0; - node->Children = NULL; - - ParseReplies (name, int(pos), &node->Children, &speech.Responses[0]); - - return node; -} - -//============================================================================ -// -// ParseReplies -// -// Convert PC responses. Rather than being stored inside the main node, they -// hang off it as a singly-linked list, so no space is wasted on replies that -// don't even matter. -// -//============================================================================ - -static void ParseReplies (const char *name, int pos, FStrifeDialogueReply **replyptr, Response *responses) -{ - FStrifeDialogueReply *reply; - int j, k; - - // Byte swap first. - for (j = 0; j < 5; ++j) - { - responses[j].GiveType = LittleLong(responses[j].GiveType); - responses[j].Link = LittleLong(responses[j].Link); - responses[j].Log = LittleLong(responses[j].Log); - for (k = 0; k < 3; ++k) - { - responses[j].Item[k] = LittleLong(responses[j].Item[k]); - responses[j].Count[k] = LittleLong(responses[j].Count[k]); - } - } - - for (j = 0; j < 5; ++j) - { - Response *rsp = &responses[j]; - - // If the reply has no text and goes nowhere, then it doesn't - // need to be remembered. - if (rsp->Reply[0] == 0 && rsp->Link == 0) - { - continue; - } - reply = new FStrifeDialogueReply; - - // The next node to use when this reply is chosen. - reply->NextNode = rsp->Link; - if (reply->NextNode < 0) - { - reply->NextNode *= -1; - reply->CloseDialog = false; - } - - // The message to record in the log for this reply. - reply->LogNumber = rsp->Log; - reply->LogString = ""; - - // The item to receive when this reply is used. - reply->GiveType = GetStrifeType (rsp->GiveType); - reply->ActionSpecial = 0; - - // Do you need anything special for this reply to succeed? - reply->ItemCheck.Resize(3); - for (k = 0; k < 3; ++k) - { - auto inv = GetStrifeType(rsp->Item[k]); - if (!inv->IsDescendantOf(NAME_Inventory)) inv = nullptr; - reply->ItemCheck[k].Item = inv; - reply->ItemCheck[k].Amount = rsp->Count[k]; - } - reply->PrintAmount = reply->ItemCheck[0].Amount; - reply->ItemCheckRequire.Clear(); - reply->ItemCheckExclude.Clear(); - - if (name) - { - FStringf label("$TXT_RPLY%d_%s_d%d_%s", j, name, pos, TokenFromString(rsp->Reply).GetChars()); - reply->Reply = label; - } - else - { - reply->Reply = rsp->Reply; - } - - - // If the first item check has a positive amount required, then - // add that to the reply string. Otherwise, use the reply as-is. - reply->NeedsGold = (rsp->Count[0] > 0); - - // QuickYes messages are shown when you meet the item checks. - // QuickNo messages are shown when you don't. - // Note that empty nodes contain a '_' in retail Strife, a '.' in the teasers and an empty string in SVE. - if (((rsp->Yes[0] == '_' || rsp->Yes[0] == '.') && rsp->Yes[1] == 0) || rsp->Yes[0] == 0) - { - reply->QuickYes = ""; - } - else - { - if (name) - { - FStringf label("$TXT_RYES%d_%s_d%d_%s", j, name, pos, TokenFromString(rsp->Yes).GetChars()); - reply->QuickYes = label; - } - else - { - reply->QuickYes = rsp->Yes; - } - } - if (reply->ItemCheck[0].Item != 0) - { - if (name && strncmp(rsp->No, "NO. ", 4)) // All 'no' nodes starting with 'NO.' won't ever be shown and they all contain broken text. - { - FStringf label("$TXT_RNO%d_%s_d%d_%s", j, name, pos, TokenFromString(rsp->No).GetChars()); - reply->QuickNo = label; - } - else - { - reply->QuickNo = rsp->No; - } - - } - else - { - reply->QuickNo = ""; - } - reply->Next = *replyptr; - *replyptr = reply; - replyptr = &reply->Next; - } -} - //============================================================================ // // FStrifeDialogueNode :: ~FStrifeDialogueNode diff --git a/src/p_conversation.h b/src/p_conversation.h index d102e59f7d..b9f18a24c2 100644 --- a/src/p_conversation.h +++ b/src/p_conversation.h @@ -65,9 +65,6 @@ struct MapData; PClassActor *GetStrifeType (int typenum); -bool LoadScriptFile (FLevelLocals *Level, const char *name, bool include, int type = 0); - -void P_LoadStrifeConversations (FLevelLocals *Level, MapData *map, const char *mapname); void P_FreeStrifeConversations (); void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveangle); @@ -76,7 +73,6 @@ void P_ResumeConversation (); void P_ConversationCommand (int netcode, int player, uint8_t **stream); class FileReader; -bool P_ParseUSDF(FLevelLocals *Level, int lumpnum, FileReader &lump, int lumplen); #endif diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 55c04c944b..61b9ec2672 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -58,8 +58,11 @@ #include "events.h" #include "p_destructible.h" #include "r_sky.h" +#include "version.h" #include "fragglescript/t_script.h" +EXTERN_CVAR(Bool, save_formatted) + //========================================================================== // // @@ -486,6 +489,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FPolyObj &poly, FPolyO ("blocked", poly.bBlocked) ("hasportals", poly.bHasPortals) ("specialdata", poly.specialdata) + ("level", poly.Level) .EndObject(); if (arc.isReading()) @@ -526,46 +530,39 @@ FSerializer &Serialize(FSerializer &arc, const char *key, zone_t &z, zone_t *def // //========================================================================== -void P_SerializeSounds(FLevelLocals *Level, FSerializer &arc) +void FLevelLocals::SerializeSounds(FSerializer &arc) { - S_SerializeSounds(arc); - const char *name = NULL; - uint8_t order; - float musvol = Level->MusicVolume; - - if (arc.isWriting()) + if (isPrimaryLevel()) { - order = S_GetMusic(&name); - } - arc.StringPtr("musicname", name) - ("musicorder", order) - ("musicvolume", musvol); + S_SerializeSounds(arc); + const char *name = NULL; + uint8_t order; + float musvol = MusicVolume; - if (arc.isReading()) - { - if (!S_ChangeMusic(name, order)) - Level->SetMusic(); - Level->SetMusicVolume(musvol); + if (arc.isWriting()) + { + order = S_GetMusic(&name); + } + arc.StringPtr("musicname", name) + ("musicorder", order) + ("musicvolume", musvol); + + if (arc.isReading()) + { + if (!S_ChangeMusic(name, order)) + SetMusic(); + SetMusicVolume(musvol); + } } } -//========================================================================== -// -// -// -//========================================================================== - -void CopyPlayer(player_t *dst, player_t *src, const char *name); -static void ReadOnePlayer(FSerializer &arc, bool skipload); -static void ReadMultiplePlayers(FSerializer &arc, int numPlayers, int numPlayersNow, bool skipload); - //========================================================================== // // P_ArchivePlayers // //========================================================================== -void P_SerializePlayers(FLevelLocals *Level, FSerializer &arc, bool skipload) +void FLevelLocals::SerializePlayers(FSerializer &arc, bool skipload) { int numPlayers, numPlayersNow; int i; @@ -573,7 +570,7 @@ void P_SerializePlayers(FLevelLocals *Level, FSerializer &arc, bool skipload) // Count the number of players present right now. for (numPlayersNow = 0, i = 0; i < MAXPLAYERS; ++i) { - if (Level->PlayerInGame(i)) + if (PlayerInGame(i)) { ++numPlayersNow; } @@ -588,13 +585,13 @@ void P_SerializePlayers(FLevelLocals *Level, FSerializer &arc, bool skipload) // Record each player's name, followed by their data. for (i = 0; i < MAXPLAYERS; ++i) { - if (Level->PlayerInGame(i)) + if (PlayerInGame(i)) { if (arc.BeginObject(nullptr)) { - const char *n = Level->Players[i]->userinfo.GetName(); + const char *n = Players[i]->userinfo.GetName(); arc.StringPtr("playername", n); - Level->Players[i]->Serialize(arc); + Players[i]->Serialize(arc); arc.EndObject(); } } @@ -622,10 +619,10 @@ void P_SerializePlayers(FLevelLocals *Level, FSerializer &arc, bool skipload) } if (!skipload && numPlayersNow > numPlayers) { - Level->SpawnExtraPlayers(); + SpawnExtraPlayers(); } // Redo pitch limits, since the spawned player has them at 0. - auto p = Level->GetConsolePlayer(); + auto p = GetConsolePlayer(); if (p) p->SendPitchLimits(); } } @@ -636,7 +633,7 @@ void P_SerializePlayers(FLevelLocals *Level, FSerializer &arc, bool skipload) // //========================================================================== -static void ReadOnePlayer(FSerializer &arc, bool skipload) +void FLevelLocals::ReadOnePlayer(FSerializer &arc, bool skipload) { int i; const char *name = NULL; @@ -663,20 +660,20 @@ static void ReadOnePlayer(FSerializer &arc, bool skipload) // via a net command, but that won't be processed in time for a screen // wipe, so we need something here. playerTemp.MaxPitch = playerTemp.MinPitch = playerTemp.mo->Angles.Pitch; - CopyPlayer(&players[i], &playerTemp, name); + CopyPlayer(Players[i], &playerTemp, name); } else { // we need the player actor, so that G_FinishTravel can destroy it later. - players[i].mo = playerTemp.mo; + Players[i]->mo = playerTemp.mo; } } else { - if (players[i].mo != NULL) + if (Players[i]->mo != NULL) { - players[i].mo->Destroy(); - players[i].mo = NULL; + Players[i]->mo->Destroy(); + Players[i]->mo = NULL; } } } @@ -691,7 +688,7 @@ static void ReadOnePlayer(FSerializer &arc, bool skipload) // //========================================================================== -static void ReadMultiplePlayers(FSerializer &arc, int numPlayers, int numPlayersNow, bool skipload) +void FLevelLocals::ReadMultiplePlayers(FSerializer &arc, int numPlayers, int numPlayersNow, bool skipload) { // For two or more players, read each player into a temporary array. int i, j; @@ -729,7 +726,7 @@ static void ReadMultiplePlayers(FSerializer &arc, int numPlayers, int numPlayers if (playerUsed[j] == 0 && stricmp(players[j].userinfo.GetName(), nametemp[i]) == 0) { // Found a match, so copy our temp player to the real player Printf("Found player %d (%s) at %d\n", i, nametemp[i], j); - CopyPlayer(&players[j], &playertemp[i], nametemp[i]); + CopyPlayer(Players[j], &playertemp[i], nametemp[i]); playerUsed[j] = 1; tempPlayerUsed[i] = 1; break; @@ -802,7 +799,7 @@ static void ReadMultiplePlayers(FSerializer &arc, int numPlayers, int numPlayers // //========================================================================== -void CopyPlayer(player_t *dst, player_t *src, const char *name) +void FLevelLocals::CopyPlayer(player_t *dst, player_t *src, const char *name) { // The userinfo needs to be saved for real players, but it // needs to come from the save for bots. @@ -823,7 +820,7 @@ void CopyPlayer(player_t *dst, player_t *src, const char *name) if (dst->Bot != nullptr) { - botinfo_t *thebot = src->mo->Level->BotInfo.botinfo; + botinfo_t *thebot = BotInfo.botinfo; while (thebot && stricmp(name, thebot->name)) { thebot = thebot->next; @@ -832,14 +829,14 @@ void CopyPlayer(player_t *dst, player_t *src, const char *name) { thebot->inuse = BOTINUSE_Yes; } - src->mo->Level->BotInfo.botnum++; + BotInfo.botnum++; dst->userinfo.TransferFrom(uibackup2); } else { dst->userinfo.TransferFrom(uibackup); // The player class must come from the save, so that the menu reflects the currently playing one. - dst->userinfo.PlayerClassChanged(src->mo->GetInfo()->DisplayName); + dst->userinfo.PlayerClassChanged(src->mo->GetInfo()->DisplayName); } // Validate the skin @@ -868,6 +865,7 @@ void CopyPlayer(player_t *dst, player_t *src, const char *name) dst->usedown = usedown; } + //========================================================================== // // @@ -1006,8 +1004,8 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) StatusBar->SerializeMessages(arc); FRemapTable::StaticSerializeTranslations(arc); canvasTextureInfo.Serialize(arc); - P_SerializePlayers(this, arc, hubload); - P_SerializeSounds(this, arc); + SerializePlayers(arc, hubload); + SerializeSounds(arc); // Regenerate some data that wasn't saved if (arc.isReading()) @@ -1036,3 +1034,87 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) } } + +//========================================================================== +// +// Archives the current level +// +//========================================================================== + +void FLevelLocals::SnapshotLevel() +{ + info->Snapshot.Clean(); + + if (info->isValid()) + { + FSerializer arc(this); + + if (arc.OpenWriter(save_formatted)) + { + SaveVersion = SAVEVER; + Serialize(arc, false); + info->Snapshot = arc.GetCompressedOutput(); + } + } +} + +//========================================================================== +// +// Unarchives the current level based on its snapshot +// The level should have already been loaded and setup. +// +//========================================================================== + +void FLevelLocals::UnSnapshotLevel(bool hubLoad) +{ + if (info->Snapshot.mBuffer == nullptr) + return; + + if (info->isValid()) + { + FSerializer arc(this); + if (!arc.OpenReader(&info->Snapshot)) + { + I_Error("Failed to load savegame"); + return; + } + + Serialize(arc, hubLoad); + FromSnapshot = true; + + auto it = GetThinkerIterator(NAME_PlayerPawn); + AActor *pawn, *next; + + next = it.Next(); + while ((pawn = next) != 0) + { + next = it.Next(); + if (pawn->player == nullptr || pawn->player->mo == nullptr || !PlayerInGame(pawn->player)) + { + int i; + + // If this isn't the unmorphed original copy of a player, destroy it, because it's extra. + for (i = 0; i < MAXPLAYERS; ++i) + { + if (PlayerInGame(i) && Players[i]->morphTics && Players[i]->mo->alternative == pawn) + { + break; + } + } + if (i == MAXPLAYERS) + { + pawn->Destroy(); + } + } + } + arc.Close(); + } + // No reason to keep the snapshot around once the level's been entered. + info->Snapshot.Clean(); + if (hubLoad) + { + // Unlock ACS global strings that were locked when the snapshot was made. + Behaviors.UnlockLevelVarStrings(levelnum); + } +} + diff --git a/src/p_setup.cpp b/src/p_setup.cpp index dddfe2d46c..2842587b40 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -260,8 +260,7 @@ void FLevelLocals::ClearLevelData() ClearAllSubsectorLinks(); // can't be done as part of the polyobj deletion process. total_monsters = total_items = total_secrets = - killed_monsters = found_items = found_secrets = - wminfo.maxfrags = 0; + killed_monsters = found_items = found_secrets = 0; for (int i = 0; i < 4; i++) { @@ -375,7 +374,6 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) // This is motivated as follows: Level->maptype = MAPTYPE_UNKNOWN; - wminfo.partime = 180; if (!savegamerestore) { diff --git a/src/p_user.cpp b/src/p_user.cpp index 6fd7070ec6..87359c958b 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -371,18 +371,37 @@ size_t player_t::PropagateMark() void player_t::SetLogNumber (int num) { - char lumpname[16]; + char lumpname[26]; int lumpnum; + // First look up TXT_LOGTEXT%d in the string table + mysnprintf(lumpname, countof(lumpname), "$TXT_LOGTEXT%d", num); + auto text = GStrings[lumpname+1]; + if (text) + { + SetLogText(lumpname); // set the label, not the content, so that a language change can be picked up. + return; + } + mysnprintf (lumpname, countof(lumpname), "LOG%d", num); lumpnum = Wads.CheckNumForName (lumpname); - if (lumpnum == -1) - { - // Leave the log message alone if this one doesn't exist. - //SetLogText (lumpname); - } - else + if (lumpnum != -1) { + auto fn = Wads.GetLumpFile(lumpnum); + auto wadname = Wads.GetWadName(fn); + if (!stricmp(wadname, "STRIFE0.WAD") || !stricmp(wadname, "STRIFE1.WAD") || !stricmp(wadname, "SVE.WAD")) + { + // If this is an original IWAD text, try looking up its lower priority string version first. + + mysnprintf(lumpname, countof(lumpname), "$TXT_ILOG%d", num); + auto text = GStrings[lumpname + 1]; + if (text) + { + SetLogText(lumpname); // set the label, not the content, so that a language change can be picked up. + return; + } + } + auto lump = Wads.ReadLump(lumpnum); SetLogText (lump.GetString()); } diff --git a/src/posix/cocoa/critsec.cpp b/src/posix/cocoa/critsec.cpp deleted file mode 100644 index b9de5e7985..0000000000 --- a/src/posix/cocoa/critsec.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/* - ** critsec.cpp - ** - **--------------------------------------------------------------------------- - ** Copyright 2014 Alexey Lysiuk - ** All rights reserved. - ** - ** Redistribution and use in source and binary forms, with or without - ** modification, are permitted provided that the following conditions - ** are met: - ** - ** 1. Redistributions of source code must retain the above copyright - ** notice, this list of conditions and the following disclaimer. - ** 2. Redistributions in binary form must reproduce the above copyright - ** notice, this list of conditions and the following disclaimer in the - ** documentation and/or other materials provided with the distribution. - ** 3. The name of the author may not be used to endorse or promote products - ** derived from this software without specific prior written permission. - ** - ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - **--------------------------------------------------------------------------- - ** - */ - -#include "critsec.h" - -#include - -class FInternalCriticalSection -{ -public: - FInternalCriticalSection(); - ~FInternalCriticalSection(); - - void Enter(); - void Leave(); - -private: - pthread_mutex_t m_mutex; - -}; - -// TODO: add error handling - -FInternalCriticalSection::FInternalCriticalSection() -{ - pthread_mutexattr_t attributes; - pthread_mutexattr_init(&attributes); - pthread_mutexattr_settype(&attributes, PTHREAD_MUTEX_RECURSIVE); - - pthread_mutex_init(&m_mutex, &attributes); - - pthread_mutexattr_destroy(&attributes); -} - -FInternalCriticalSection::~FInternalCriticalSection() -{ - pthread_mutex_destroy(&m_mutex); -} - -void FInternalCriticalSection::Enter() -{ - pthread_mutex_lock(&m_mutex); -} - -void FInternalCriticalSection::Leave() -{ - pthread_mutex_unlock(&m_mutex); -} - - -FInternalCriticalSection *CreateCriticalSection() -{ - return new FInternalCriticalSection(); -} - -void DeleteCriticalSection(FInternalCriticalSection *c) -{ - delete c; -} - -void EnterCriticalSection(FInternalCriticalSection *c) -{ - c->Enter(); -} - -void LeaveCriticalSection(FInternalCriticalSection *c) -{ - c->Leave(); -} diff --git a/src/posix/cocoa/i_input.mm b/src/posix/cocoa/i_input.mm index 7ae2050b49..9a536d3bfb 100644 --- a/src/posix/cocoa/i_input.mm +++ b/src/posix/cocoa/i_input.mm @@ -371,7 +371,7 @@ NSStringEncoding GetEncodingForUnicodeCharacter(const unichar character) return NSWindowsCP1252StringEncoding; } -unsigned char GetCharacterFromNSEvent(NSEvent* theEvent) +unsigned char GetCharacterFromNSEvent(NSEvent* theEvent, unichar *realchar) { const NSString* unicodeCharacters = [theEvent characters]; @@ -400,6 +400,7 @@ unsigned char GetCharacterFromNSEvent(NSEvent* theEvent) : '\0'; } + *realchar = unicodeCharacter; return character; } @@ -407,9 +408,10 @@ void ProcessKeyboardEventInMenu(NSEvent* theEvent) { event_t event = {}; + unichar realchar; event.type = EV_GUI_Event; event.subtype = NSKeyDown == [theEvent type] ? EV_GUI_KeyDown : EV_GUI_KeyUp; - event.data2 = GetCharacterFromNSEvent(theEvent); + event.data2 = GetCharacterFromNSEvent(theEvent, &realchar); event.data3 = ModifierFlagsToGUIKeyModifiers(theEvent); if (EV_GUI_KeyDown == event.subtype && [theEvent isARepeat]) @@ -462,7 +464,7 @@ void ProcessKeyboardEventInMenu(NSEvent* theEvent) && ShouldGenerateGUICharEvent(theEvent)) { event.subtype = EV_GUI_Char; - event.data1 = event.data2; + event.data1 = realchar; event.data2 = event.data3 & GKM_ALT; D_PostEvent(&event); diff --git a/src/posix/sdl/critsec.cpp b/src/posix/sdl/critsec.cpp deleted file mode 100644 index 03a6202b9c..0000000000 --- a/src/posix/sdl/critsec.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* -** critsec.cpp -** -**--------------------------------------------------------------------------- -** Copyright 2006-2016 Randy Heit -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- -** -** Wraps an SDL mutex object. (A critical section is a Windows synchronization -** object similar to a mutex but optimized for access by threads belonging to -** only one process, hence the class name.) -*/ - -#include "SDL.h" -#include "i_system.h" -#include "doomerrors.h" - -class FInternalCriticalSection -{ -public: - FInternalCriticalSection() - { - CritSec = SDL_CreateMutex(); - if (CritSec == NULL) - { - I_FatalError("Failed to create a critical section mutex."); - } - } - ~FInternalCriticalSection() - { - if (CritSec != NULL) - { - SDL_DestroyMutex(CritSec); - } - } - void Enter() - { - if (SDL_mutexP(CritSec) != 0) - { - I_FatalError("Failed entering a critical section."); - } - } - void Leave() - { - if (SDL_mutexV(CritSec) != 0) - { - I_FatalError("Failed to leave a critical section."); - } - } -private: - SDL_mutex *CritSec; -}; - -FInternalCriticalSection *CreateCriticalSection() -{ - return new FInternalCriticalSection(); -} - -void DeleteCriticalSection(FInternalCriticalSection *c) -{ - delete c; -} - -void EnterCriticalSection(FInternalCriticalSection *c) -{ - c->Enter(); -} - -void LeaveCriticalSection(FInternalCriticalSection *c) -{ - c->Leave(); -} diff --git a/src/posix/sdl/i_input.cpp b/src/posix/sdl/i_input.cpp index 0d45ed7229..626b9580f5 100644 --- a/src/posix/sdl/i_input.cpp +++ b/src/posix/sdl/i_input.cpp @@ -46,6 +46,7 @@ #include "events.h" #include "g_game.h" #include "g_levellocals.h" +#include "utf8.h" static void I_CheckGUICapture (); @@ -476,11 +477,17 @@ void MessagePump (const SDL_Event &sev) case SDL_TEXTINPUT: if (GUICapture) { - event.type = EV_GUI_Event; - event.subtype = EV_GUI_Char; - event.data1 = sev.text.text[0]; - event.data2 = !!(SDL_GetModState() & KMOD_ALT); - D_PostEvent (&event); + int size; + + int unichar = utf8_decode((const uint8_t*)sev.text.text, &size); + if (size != 4) + { + event.type = EV_GUI_Event; + event.subtype = EV_GUI_Char; + event.data1 = (int16_t)unichar; + event.data2 = !!(SDL_GetModState() & KMOD_ALT); + D_PostEvent (&event); + } } break; diff --git a/src/cycler.cpp b/src/r_data/cycler.cpp similarity index 100% rename from src/cycler.cpp rename to src/r_data/cycler.cpp diff --git a/src/cycler.h b/src/r_data/cycler.h similarity index 100% rename from src/cycler.h rename to src/r_data/cycler.h diff --git a/src/f_wipe.cpp b/src/rendering/2d/f_wipe.cpp similarity index 100% rename from src/f_wipe.cpp rename to src/rendering/2d/f_wipe.cpp diff --git a/src/f_wipe.h b/src/rendering/2d/f_wipe.h similarity index 100% rename from src/f_wipe.h rename to src/rendering/2d/f_wipe.h diff --git a/src/v_2ddrawer.cpp b/src/rendering/2d/v_2ddrawer.cpp similarity index 100% rename from src/v_2ddrawer.cpp rename to src/rendering/2d/v_2ddrawer.cpp diff --git a/src/v_2ddrawer.h b/src/rendering/2d/v_2ddrawer.h similarity index 100% rename from src/v_2ddrawer.h rename to src/rendering/2d/v_2ddrawer.h diff --git a/src/v_blend.cpp b/src/rendering/2d/v_blend.cpp similarity index 100% rename from src/v_blend.cpp rename to src/rendering/2d/v_blend.cpp diff --git a/src/v_draw.cpp b/src/rendering/2d/v_draw.cpp similarity index 100% rename from src/v_draw.cpp rename to src/rendering/2d/v_draw.cpp diff --git a/src/v_text.cpp b/src/rendering/2d/v_drawtext.cpp similarity index 61% rename from src/v_text.cpp rename to src/rendering/2d/v_drawtext.cpp index 345f4b7311..e0bc0d6391 100644 --- a/src/v_text.cpp +++ b/src/rendering/2d/v_drawtext.cpp @@ -42,85 +42,124 @@ #include "v_video.h" #include "w_wad.h" +#include "image.h" +#include "textures/formats/multipatchtexture.h" #include "gstrings.h" #include "vm.h" #include "serializer.h" + int ListGetInt(VMVa_List &tags); + //========================================================================== // -// reads one character from the string. -// This can handle both ISO 8859-1 and UTF-8, as well as mixed strings -// between both encodings, which may happen if inconsistent encoding is -// used between different files in a mod. +// Create a texture from a text in a given font. // //========================================================================== -int GetCharFromString(const uint8_t *&string) +FTexture * BuildTextTexture(FFont *font, const char *string, int textcolor) { - int z, y, x; + int w; + const uint8_t *ch; + int cx; + int cy; + FRemapTable *range; + int kerning; + FTexture *pic; - z = *string++; + kerning = font->GetDefaultKerning(); - if (z < 192) + ch = (const uint8_t *)string; + cx = 0; + cy = 0; + + + IntRect box; + + while (auto c = GetCharFromString(ch)) { - return z; + if (c == TEXTCOLOR_ESCAPE) + { + // Here we only want to measure the texture so just parse over the color. + V_ParseFontColor(ch, 0, 0); + continue; + } + + if (c == '\n') + { + cx = 0; + cy += font->GetHeight(); + continue; + } + + if (nullptr != (pic = font->GetChar(c, CR_UNTRANSLATED, &w, nullptr))) + { + auto img = pic->GetImage(); + auto offsets = img->GetOffsets(); + int x = cx - offsets.first; + int y = cy - offsets.second; + int ww = img->GetWidth(); + int h = img->GetHeight(); + + box.AddToRect(x, y); + box.AddToRect(x + ww, y + h); + } + cx += (w + kerning); } - else if (z <= 223) + + cx = -box.left; + cy = -box.top; + + TArray part(strlen(string)); + + while (auto c = GetCharFromString(ch)) { - y = *string++; - if (y < 128 || y >= 192) + if (c == TEXTCOLOR_ESCAPE) { - // not an UTF-8 sequence so return the first byte unchanged - string--; - } - else - { - z = (z - 192) * 64 + (y - 128); - } - } - else if (z >= 224 && z <= 239) - { - y = *string++; - if (y < 128 || y >= 192) - { - // not an UTF-8 sequence so return the first byte unchanged - string--; - } - else - { - x = *string++; - if (x < 128 || x >= 192) + EColorRange newcolor = V_ParseFontColor(ch, textcolor, textcolor); + if (newcolor != CR_UNDEFINED) { - // not an UTF-8 sequence so return the first byte unchanged - string -= 2; - } - else - { - z = (z - 224) * 4096 + (y - 128) * 64 + (x - 128); + range = font->GetColorTranslation(newcolor); + textcolor = newcolor; } + continue; } - } - else if (z >= 240) - { - y = *string++; - if (y < 128 || y >= 192) + + if (c == '\n') { - // not an UTF-8 sequence so return the first byte unchanged - string--; + cx = 0; + cy += font->GetHeight(); + continue; } - else + + if (nullptr != (pic = font->GetChar(c, textcolor, &w, nullptr))) { - // we do not support 4-Byte UTF-8 here - string += 2; - return '?'; + auto img = pic->GetImage(); + auto offsets = img->GetOffsets(); + int x = cx - offsets.first; + int y = cy - offsets.second; + + auto &tp = part[part.Reserve(1)]; + + tp.OriginX = x; + tp.OriginY = y; + tp.Image = img; + tp.Translation = range; } + cx += (w + kerning); } - return z; + FMultiPatchTexture *image = new FMultiPatchTexture(box.width, box.height, part, false, false); + image->SetOffsets(-box.left, -box.top); + FImageTexture *tex = new FImageTexture(image, ""); + tex->SetUseType(ETextureType::MiscPatch); + TexMan.AddTexture(tex); + return tex; } + + //========================================================================== // // DrawChar @@ -335,192 +374,3 @@ DEFINE_ACTION_FUNCTION(_Screen, DrawText) return 0; } - -//========================================================================== -// -// Break long lines of text into multiple lines no longer than maxwidth pixels -// -//========================================================================== - -static void breakit (FBrokenLines *line, FFont *font, const uint8_t *start, const uint8_t *stop, FString &linecolor) -{ - if (!linecolor.IsEmpty()) - { - line->Text = TEXTCOLOR_ESCAPE; - line->Text += linecolor; - } - line->Text.AppendCStrPart ((const char *)start, stop - start); - line->Width = font->StringWidth (line->Text); -} - -TArray V_BreakLines (FFont *font, int maxwidth, const uint8_t *string, bool preservecolor) -{ - TArray Lines(128); - - const uint8_t *space = NULL, *start = string; - int c, w, nw; - FString lastcolor, linecolor; - bool lastWasSpace = false; - int kerning = font->GetDefaultKerning (); - - w = 0; - - while ( (c = GetCharFromString(string)) ) - { - if (c == TEXTCOLOR_ESCAPE) - { - if (*string) - { - if (*string == '[') - { - const uint8_t *start = string; - while (*string != ']' && *string != '\0') - { - string++; - } - if (*string != '\0') - { - string++; - } - lastcolor = FString((const char *)start, string - start); - } - else - { - lastcolor = *string++; - } - } - continue; - } - - if (iswspace(c)) - { - if (!lastWasSpace) - { - space = string - 1; - lastWasSpace = true; - } - } - else - { - lastWasSpace = false; - } - - nw = font->GetCharWidth (c); - - if ((w > 0 && w + nw > maxwidth) || c == '\n') - { // Time to break the line - if (!space) - space = string - 1; - - auto index = Lines.Reserve(1); - breakit (&Lines[index], font, start, space, linecolor); - if (c == '\n' && !preservecolor) - { - lastcolor = ""; // Why, oh why, did I do it like this? - } - linecolor = lastcolor; - - w = 0; - lastWasSpace = false; - start = space; - space = NULL; - - while (*start && iswspace (*start) && *start != '\n') - start++; - if (*start == '\n') - start++; - else - while (*start && iswspace (*start)) - start++; - string = start; - } - else - { - w += nw + kerning; - } - } - - // String here is pointing one character after the '\0' - if (--string - start >= 1) - { - const uint8_t *s = start; - - while (s < string) - { - // If there is any non-white space in the remainder of the string, add it. - if (!iswspace (*s++)) - { - auto i = Lines.Reserve(1); - breakit (&Lines[i], font, start, string, linecolor); - break; - } - } - } - return Lines; -} - -FSerializer &Serialize(FSerializer &arc, const char *key, FBrokenLines& g, FBrokenLines *def) -{ - if (arc.BeginObject(key)) - { - arc("text", g.Text) - ("width", g.Width) - .EndObject(); - } - return arc; -} - - - -class DBrokenLines : public DObject -{ - DECLARE_CLASS(DBrokenLines, DObject) - -public: - TArray mBroken; - - DBrokenLines() = default; - - DBrokenLines(TArray &broken) - { - mBroken = std::move(broken); - } - - void Serialize(FSerializer &arc) override - { - arc("lines", mBroken); - } -}; - -IMPLEMENT_CLASS(DBrokenLines, false, false); - -DEFINE_ACTION_FUNCTION(DBrokenLines, Count) -{ - PARAM_SELF_PROLOGUE(DBrokenLines); - ACTION_RETURN_INT(self->mBroken.Size()); -} - -DEFINE_ACTION_FUNCTION(DBrokenLines, StringWidth) -{ - PARAM_SELF_PROLOGUE(DBrokenLines); - PARAM_INT(index); - ACTION_RETURN_INT((unsigned)index >= self->mBroken.Size()? -1 : self->mBroken[index].Width); -} - -DEFINE_ACTION_FUNCTION(DBrokenLines, StringAt) -{ - - PARAM_SELF_PROLOGUE(DBrokenLines); - PARAM_INT(index); - ACTION_RETURN_STRING((unsigned)index >= self->mBroken.Size() ? -1 : self->mBroken[index].Text); -} - -DEFINE_ACTION_FUNCTION(FFont, BreakLines) -{ - PARAM_SELF_STRUCT_PROLOGUE(FFont); - PARAM_STRING(text); - PARAM_INT(maxwidth); - - auto broken = V_BreakLines(self, maxwidth, text, true); - ACTION_RETURN_OBJECT(Create(broken)); -} diff --git a/src/rendering/hwrenderer/postprocessing/hw_postprocess.h b/src/rendering/hwrenderer/postprocessing/hw_postprocess.h index 0b11ec1241..67b95b56cb 100644 --- a/src/rendering/hwrenderer/postprocessing/hw_postprocess.h +++ b/src/rendering/hwrenderer/postprocessing/hw_postprocess.h @@ -117,7 +117,7 @@ public: tex.Filter = filter; tex.Wrap = wrap; tex.Type = type; - tex.Texture = {}; + tex.Texture = ""; } void SetOutputTexture(PPTextureName texture) @@ -129,19 +129,19 @@ public: void SetOutputCurrent() { Output.Type = PPTextureType::CurrentPipelineTexture; - Output.Texture = {}; + Output.Texture = ""; } void SetOutputNext() { Output.Type = PPTextureType::NextPipelineTexture; - Output.Texture = {}; + Output.Texture = ""; } void SetOutputSceneColor() { Output.Type = PPTextureType::SceneColor; - Output.Texture = {}; + Output.Texture = ""; } void SetNoBlend() diff --git a/src/rendering/hwrenderer/utility/hw_cvars.h b/src/rendering/hwrenderer/utility/hw_cvars.h index 025880fc43..29fe587fa6 100644 --- a/src/rendering/hwrenderer/utility/hw_cvars.h +++ b/src/rendering/hwrenderer/utility/hw_cvars.h @@ -68,3 +68,7 @@ EXTERN_CVAR(Int, gl_enhanced_nv_stealth) EXTERN_CVAR(Int, gl_fuzztype) EXTERN_CVAR(Int, gl_shadowmap_filter) + +EXTERN_CVAR(Bool, gl_brightfog) +EXTERN_CVAR(Bool, gl_lightadditivesurfaces) +EXTERN_CVAR(Bool, gl_notexturefill) diff --git a/src/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index 878c7beeae..3e9b6be0df 100644 --- a/src/scripting/backend/codegen.cpp +++ b/src/scripting/backend/codegen.cpp @@ -49,10 +49,10 @@ #include "doomstat.h" #include "g_levellocals.h" #include "v_video.h" +#include "utf8.h" extern FRandom pr_exrandom; FMemArena FxAlloc(65536); -int utf8_decode(const char *src, int *size); struct FLOP { @@ -318,19 +318,13 @@ static FxExpression *StringConstToChar(FxExpression *basex) // This serves as workaround for not being able to use single quoted literals because those are taken for names. ExpVal constval = static_cast(basex)->GetValue(); FString str = constval.GetString(); - if (str.Len() == 1) + int position = 0; + int chr = str.GetNextCharacter(position); + + // Only succeed if the full string is consumed, i.e. it contains only one code point. + if (position == (int)str.Len()) { - return new FxConstant(str[0], basex->ScriptPosition); - } - else if (str.Len() > 1) - { - // If the string is UTF-8, allow a single character UTF-8 sequence. - int size; - int c = utf8_decode(str.GetChars(), &size); - if (c >= 0 && size_t(size) == str.Len()) - { - return new FxConstant(c, basex->ScriptPosition); - } + return new FxConstant(chr, basex->ScriptPosition); } return nullptr; } @@ -8864,10 +8858,17 @@ FxExpression *FxVMFunctionCall::Resolve(FCompileContext& ctx) CallingFunction = ctx.Function; if (ArgList.Size() > 0) { + if (argtypes.Size() == 0) + { + ScriptPosition.Message(MSG_ERROR, "Too many arguments in call to %s", Function->SymbolName.GetChars()); + delete this; + return nullptr; + } + bool foundvarargs = false; PType * type = nullptr; int flag = 0; - if (argtypes.Last() != nullptr && ArgList.Size() + implicit > argtypes.Size()) + if (argtypes.Size() > 0 && argtypes.Last() != nullptr && ArgList.Size() + implicit > argtypes.Size()) { ScriptPosition.Message(MSG_ERROR, "Too many arguments in call to %s", Function->SymbolName.GetChars()); delete this; diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index 4a73214ab7..7eed56ad75 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -987,10 +987,11 @@ FString FStringFormat(VM_ARGS, int offset) ThrowAbortException(X_FORMAT_ERROR, "Cannot mix explicit and implicit arguments."); FString argnumstr = fmt_current.Mid(1); if (!argnumstr.IsInt()) ThrowAbortException(X_FORMAT_ERROR, "Expected a numeric value for argument number, got '%s'.", argnumstr.GetChars()); - argnum = argnumstr.ToLong(); - if (argnum < 1 || argnum >= numparam) ThrowAbortException(X_FORMAT_ERROR, "Not enough arguments for format (tried to access argument %d, %d total).", argnum, numparam); + auto argnum64 = argnumstr.ToLong(); + if (argnum64 < 1 || argnum64 >= numparam) ThrowAbortException(X_FORMAT_ERROR, "Not enough arguments for format (tried to access argument %d, %d total).", argnum64, numparam); fmt_current = "%"; haveargnums = true; + argnum = int(argnum64); } else { @@ -1157,3 +1158,17 @@ DEFINE_ACTION_FUNCTION(FStringStruct, AppendFormat) return 0; } +DEFINE_ACTION_FUNCTION(FStringStruct, AppendCharacter) +{ + PARAM_SELF_STRUCT_PROLOGUE(FString); + PARAM_INT(c); + self->AppendCharacter(c); + return 0; +} + +DEFINE_ACTION_FUNCTION(FStringStruct, DeleteLastCharacter) +{ + PARAM_SELF_STRUCT_PROLOGUE(FString); + self->DeleteLastCharacter(); + return 0; +} diff --git a/src/scripting/vm/jit_move.cpp b/src/scripting/vm/jit_move.cpp index 54c055cb2c..ca584a326a 100644 --- a/src/scripting/vm/jit_move.cpp +++ b/src/scripting/vm/jit_move.cpp @@ -44,7 +44,7 @@ static void CastF2S(FString *a, double b) { a->Format("%.5f", b); } static void CastV22S(FString *a, double b, double b1) { a->Format("(%.5f, %.5f)", b, b1); } static void CastV32S(FString *a, double b, double b1, double b2) { a->Format("(%.5f, %.5f, %.5f)", b, b1, b2); } static void CastP2S(FString *a, void *b) { if (b == nullptr) *a = "null"; else a->Format("%p", b); } -static int CastS2I(FString *b) { return (VM_SWORD)b->ToLong(); } +static int CastS2I(FString *b) { return (int)b->ToLong(); } static double CastS2F(FString *b) { return b->ToDouble(); } static int CastS2N(FString *b) { return b->Len() == 0 ? FName(NAME_None) : FName(*b); } static void CastN2S(FString *a, int b) { FName name = FName(ENamedName(b)); *a = name.IsValidName() ? name.GetChars() : ""; } diff --git a/src/scripting/vm/vm.h b/src/scripting/vm/vm.h index 8cd666467b..d8da4d4342 100644 --- a/src/scripting/vm/vm.h +++ b/src/scripting/vm/vm.h @@ -369,7 +369,7 @@ struct VMValue } if (Type == REGT_STRING) { - return s().ToLong(); + return (int)s().ToLong(); } // FIXME return 0; diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index 6512480b2c..39201c79a8 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -49,6 +49,8 @@ #include "i_music.h" #include "am_map.h" #include "v_video.h" +#include "gi.h" +#include "intermission/intermission.h" DVector2 AM_GetPosition(); int Net_GetLatency(int *ld, int *ad); @@ -257,7 +259,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, ToInt, StringToInt) { PARAM_SELF_STRUCT_PROLOGUE(FString); PARAM_INT(base); - ACTION_RETURN_INT(self->ToLong(base)); + ACTION_RETURN_INT((int)self->ToLong(base)); } static double StringToDbl(FString *self) @@ -1627,6 +1629,76 @@ DEFINE_ACTION_FUNCTION_NATIVE(_Sector, SetXOffset, SetXOffset) // //===================================================================================== + static int IsJumpingAllowed(FLevelLocals *self) + { + return self->IsJumpingAllowed(); + } + + DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, IsJumpingAllowed, IsJumpingAllowed) + { + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); + ACTION_RETURN_BOOL(self->IsJumpingAllowed()); + } + + //========================================================================== + // + // + //========================================================================== + + static int IsCrouchingAllowed(FLevelLocals *self) + { + return self->IsCrouchingAllowed(); + } + + + DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, IsCrouchingAllowed, IsCrouchingAllowed) + { + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); + ACTION_RETURN_BOOL(self->IsCrouchingAllowed()); + } + + //========================================================================== + // + // + //========================================================================== + + static int IsFreelookAllowed(FLevelLocals *self) + { + return self->IsFreelookAllowed(); + } + + DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, IsFreelookAllowed, IsFreelookAllowed) + { + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); + ACTION_RETURN_BOOL(self->IsFreelookAllowed()); + } + + //========================================================================== +// +// ZScript counterpart to ACS ChangeSky, uses TextureIDs +// +//========================================================================== + DEFINE_ACTION_FUNCTION(FLevelLocals, ChangeSky) + { + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); + PARAM_INT(sky1); + PARAM_INT(sky2); + self->skytexture1 = FSetTextureID(sky1); + self->skytexture2 = FSetTextureID(sky2); + InitSkyMap(self); + return 0; + } + + DEFINE_ACTION_FUNCTION(FLevelLocals, StartIntermission) + { + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); + PARAM_NAME(seq); + PARAM_INT(state); + F_StartIntermission(seq, (uint8_t)state); + return 0; + } + + // This is needed to convert the strings to char pointers. static void ReplaceTextures(FLevelLocals *self, const FString &from, const FString &to, int flags) { diff --git a/src/serializer.cpp b/src/serializer.cpp index 7fccd74752..ab66c792a8 100644 --- a/src/serializer.cpp +++ b/src/serializer.cpp @@ -59,114 +59,31 @@ #include "v_text.h" #include "cmdlib.h" #include "g_levellocals.h" +#include "utf8.h" char nulspace[1024 * 1024 * 4]; bool save_full = false; // for testing. Should be removed afterward. -int utf8_encode(int32_t codepoint, char *buffer, int *size) -{ - if (codepoint < 0) - return -1; - else if (codepoint < 0x80) - { - buffer[0] = (char)codepoint; - *size = 1; - } - else if (codepoint < 0x800) - { - buffer[0] = 0xC0 + ((codepoint & 0x7C0) >> 6); - buffer[1] = 0x80 + ((codepoint & 0x03F)); - *size = 2; - } - else if (codepoint < 0x10000) - { - buffer[0] = 0xE0 + ((codepoint & 0xF000) >> 12); - buffer[1] = 0x80 + ((codepoint & 0x0FC0) >> 6); - buffer[2] = 0x80 + ((codepoint & 0x003F)); - *size = 3; - } - else if (codepoint <= 0x10FFFF) - { - buffer[0] = 0xF0 + ((codepoint & 0x1C0000) >> 18); - buffer[1] = 0x80 + ((codepoint & 0x03F000) >> 12); - buffer[2] = 0x80 + ((codepoint & 0x000FC0) >> 6); - buffer[3] = 0x80 + ((codepoint & 0x00003F)); - *size = 4; - } - else - return -1; - - return 0; -} - -int utf8_decode(const char *src, int *size) -{ - int c = src[0] & 255; - int r; - - *size = 1; - if ((c & 0x80) == 0) - { - return c; - } - - int c1 = src[1] & 255; - - if ((c & 0xE0) == 0xC0) - { - r = ((c & 0x1F) << 6) | c1; - if (r >= 128) - { - *size = 2; - return r; - } - return -1; - } - - int c2 = src[2] & 255; - - if ((c & 0xF0) == 0xE0) - { - r = ((c & 0x0F) << 12) | (c1 << 6) | c2; - if (r >= 2048 && (r < 55296 || r > 57343)) - { - *size = 3; - return r; - } - return -1; - } - - int c3 = src[3] & 255; - - if ((c & 0xF8) == 0xF0) - { - r = ((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3; - if (r >= 65536 && r <= 1114111) - { - *size = 4; - return r; - } - } - return -1; -} +//========================================================================== +// +// This will double-encode already existing UTF-8 content. +// The reason for this behavior is to preserve any original data coming through here, no matter what it is. +// If these are script-based strings, exact preservation in the serializer is very important. +// +//========================================================================== static TArray out; static const char *StringToUnicode(const char *cc, int size = -1) { int ch; - const char *c = cc; + const uint8_t *c = (const uint8_t*)cc; int count = 0; int count1 = 0; out.Clear(); while ((ch = (*c++) & 255)) { count1++; - if (ch >= 128) - { - if (ch < 0x800) count += 2; - else count += 3; - // The source cannot contain 4-byte chars. - } + if (ch >= 128) count += 2; else count++; if (count1 == size && size > 0) break; } @@ -174,11 +91,11 @@ static const char *StringToUnicode(const char *cc, int size = -1) // we need to convert out.Resize(count + 1); out.Last() = 0; - c = cc; + c = (const uint8_t*)cc; int i = 0; - while ((ch = (*c++) & 255)) + while ((ch = (*c++))) { - utf8_encode(ch, &out[i], &count1); + utf8_encode(ch, (uint8_t*)&out[i], &count1); i += count1; } return &out[0]; @@ -191,8 +108,8 @@ static const char *UnicodeToString(const char *cc) while (*cc != 0) { int size; - int c = utf8_decode(cc, &size); - if (c < 0 || c > 255) c = '?'; + int c = utf8_decode((const uint8_t*)cc, &size); + if (c < 0 || c > 255) c = '?'; // This should never happen because all content was encoded with StringToUnicode which only produces code points 0-255. out[ndx++] = c; cc += size; } @@ -304,6 +221,13 @@ struct FWriter else if (mWriter2) mWriter2->Null(); } + void StringU(const char *k, bool encode) + { + if (encode) k = StringToUnicode(k); + if (mWriter1) mWriter1->String(k); + else if (mWriter2) mWriter2->String(k); + } + void String(const char *k) { k = StringToUnicode(k); @@ -896,7 +820,7 @@ FSerializer &FSerializer::StringPtr(const char *key, const char *&charptr) //========================================================================== // -// +// Adds a string literal. This won't get double encoded, like a serialized string. // //========================================================================== @@ -905,11 +829,33 @@ FSerializer &FSerializer::AddString(const char *key, const char *charptr) if (isWriting()) { WriteKey(key); - w->String(charptr); + w->StringU(MakeUTF8(charptr), false); } return *this; } +//========================================================================== +// +// Reads back a string without any processing. +// +//========================================================================== + +const char *FSerializer::GetString(const char *key) +{ + auto val = r->FindKey(key); + if (val != nullptr) + { + if (val->IsString()) + { + return val->GetString(); + } + else + { + } + } + return nullptr; +} + //========================================================================== // // diff --git a/src/serializer.h b/src/serializer.h index 2957dbdc75..46f6dfbb28 100644 --- a/src/serializer.h +++ b/src/serializer.h @@ -100,6 +100,7 @@ public: FSerializer &Sprite(const char *key, int32_t &spritenum, int32_t *def); FSerializer &StringPtr(const char *key, const char *&charptr); // This only retrieves the address but creates no permanent copy of the string unlike the regular char* serializer. FSerializer &AddString(const char *key, const char *charptr); + const char *GetString(const char *key); FSerializer &ScriptNum(const char *key, int &num); bool isReading() const { diff --git a/src/sound/i_musicinterns.h b/src/sound/i_musicinterns.h index b3cebfccf2..0143fcb258 100644 --- a/src/sound/i_musicinterns.h +++ b/src/sound/i_musicinterns.h @@ -1,4 +1,5 @@ +#include #include "oplsynth/opl_mus_player.h" #include "c_cvars.h" #include "mus2midi.h" @@ -113,7 +114,7 @@ public: bool Pause(bool paused); protected: - FCriticalSection CritSec; + std::mutex CritSec; SoundStream *Stream; double Tempo; double Division; diff --git a/src/sound/mididevices/music_fluidsynth_mididevice.cpp b/src/sound/mididevices/music_fluidsynth_mididevice.cpp index 8314107df3..be22298070 100644 --- a/src/sound/mididevices/music_fluidsynth_mididevice.cpp +++ b/src/sound/mididevices/music_fluidsynth_mididevice.cpp @@ -644,7 +644,7 @@ FString FluidSynthMIDIDevice::GetStats() } FString out; - CritSec.Enter(); + std::lock_guard lock(CritSec); int polyphony = fluid_synth_get_polyphony(FluidSynth); int voices = fluid_synth_get_active_voice_count(FluidSynth); double load = fluid_synth_get_cpu_load(FluidSynth); @@ -652,7 +652,6 @@ FString FluidSynthMIDIDevice::GetStats() fluid_settings_getint(FluidSettings, "synth.chorus.active", &chorus); fluid_settings_getint(FluidSettings, "synth.reverb.active", &reverb); fluid_settings_getint(FluidSettings, "synth.polyphony", &maxpoly); - CritSec.Leave(); out.Format("Voices: " TEXTCOLOR_YELLOW "%3d" TEXTCOLOR_NORMAL "/" TEXTCOLOR_ORANGE "%3d" TEXTCOLOR_NORMAL "(" TEXTCOLOR_RED "%3d" TEXTCOLOR_NORMAL ")" TEXTCOLOR_YELLOW "%6.2f" TEXTCOLOR_NORMAL "%% CPU " diff --git a/src/sound/mididevices/music_softsynth_mididevice.cpp b/src/sound/mididevices/music_softsynth_mididevice.cpp index 46fcb59e1a..af1f1251c1 100644 --- a/src/sound/mididevices/music_softsynth_mididevice.cpp +++ b/src/sound/mididevices/music_softsynth_mididevice.cpp @@ -237,9 +237,8 @@ void SoftSynthMIDIDevice::Stop() int SoftSynthMIDIDevice::StreamOutSync(MidiHeader *header) { - CritSec.Enter(); + std::lock_guard lock(CritSec); StreamOut(header); - CritSec.Leave(); return 0; } @@ -392,7 +391,7 @@ bool SoftSynthMIDIDevice::ServiceStream (void *buff, int numbytes) samples1 = samples; memset(buff, 0, numbytes); - CritSec.Enter(); + std::lock_guard lock(CritSec); while (Events != NULL && numsamples > 0) { double ticky = NextTickIn; @@ -434,7 +433,6 @@ bool SoftSynthMIDIDevice::ServiceStream (void *buff, int numbytes) { res = false; } - CritSec.Leave(); return res; } diff --git a/src/sound/mididevices/music_timidity_mididevice.cpp b/src/sound/mididevices/music_timidity_mididevice.cpp index 504fe8afe9..0022f527a5 100644 --- a/src/sound/mididevices/music_timidity_mididevice.cpp +++ b/src/sound/mididevices/music_timidity_mididevice.cpp @@ -167,7 +167,7 @@ FString TimidityMIDIDevice::GetStats() FString out; int i, used; - CritSec.Enter(); + std::lock_guard lock(CritSec); for (i = used = 0; i < Renderer->voices; ++i) { int status = Renderer->voice[i].status; @@ -205,7 +205,7 @@ FString TimidityMIDIDevice::GetStats() } } } - CritSec.Leave(); + CritSec.unlock(); out.Format(TEXTCOLOR_YELLOW"%3d/%3d ", used, Renderer->voices); out += dots; if (Renderer->cut_notes | Renderer->lost_notes) diff --git a/src/sound/mididevices/music_win_mididevice.cpp b/src/sound/mididevices/music_win_mididevice.cpp index e2605297d3..71ddb4efc6 100644 --- a/src/sound/mididevices/music_win_mididevice.cpp +++ b/src/sound/mididevices/music_win_mididevice.cpp @@ -664,9 +664,9 @@ void CALLBACK WinMIDIDevice::CallbackFunc(HMIDIOUT hOut, UINT uMsg, DWORD_PTR dw static bool IgnoreMIDIVolume(UINT id) { - MIDIOUTCAPS caps; + MIDIOUTCAPSA caps; - if (MMSYSERR_NOERROR == midiOutGetDevCaps(id, &caps, sizeof(caps))) + if (MMSYSERR_NOERROR == midiOutGetDevCapsA(id, &caps, sizeof(caps))) { if (caps.wTechnology == MIDIDEV_MAPPER) { diff --git a/src/sound/music_midi_base.cpp b/src/sound/music_midi_base.cpp index ac34d1cf54..bd7fa1c028 100644 --- a/src/sound/music_midi_base.cpp +++ b/src/sound/music_midi_base.cpp @@ -207,15 +207,18 @@ CCMD (snd_listmididevices) { for (id = 0; id < nummididevices; ++id) { + FString text; res = midiOutGetDevCaps (id, &caps, sizeof(caps)); if (res == MMSYSERR_NODRIVER) - strcpy (caps.szPname, ""); + text = ""; else if (res == MMSYSERR_NOMEM) - strcpy (caps.szPname, ""); - else if (res != MMSYSERR_NOERROR) + text = ""; + else if (res == MMSYSERR_NOERROR) + text = caps.szPname; + else continue; - PrintMidiDevice (id, caps.szPname, caps.wTechnology, caps.dwSupport); + PrintMidiDevice (id, text, caps.wTechnology, caps.dwSupport); } } } diff --git a/src/sound/musicformats/music_dumb.cpp b/src/sound/musicformats/music_dumb.cpp index 5ff82f0de8..c39bc83851 100644 --- a/src/sound/musicformats/music_dumb.cpp +++ b/src/sound/musicformats/music_dumb.cpp @@ -36,6 +36,7 @@ // HEADER FILES ------------------------------------------------------------ #include +#include #include "i_musicinterns.h" @@ -73,7 +74,7 @@ protected: size_t written; DUH *duh; DUH_SIGRENDERER *sr; - FCriticalSection crit_sec; + std::mutex crit_sec; bool open2(long pos); long render(double volume, double delta, long samples, sample_t **buffer); @@ -957,18 +958,16 @@ bool input_mod::read(SoundStream *stream, void *buffer, int sizebytes, void *use memset(buffer, 0, sizebytes); return false; } - state->crit_sec.Enter(); + std::lock_guard lock(state->crit_sec); while (sizebytes > 0) { int written = state->decode_run(buffer, sizebytes / 8); if (written < 0) { - state->crit_sec.Leave(); return false; } if (written == 0) { - state->crit_sec.Leave(); memset(buffer, 0, sizebytes); return true; } @@ -983,7 +982,6 @@ bool input_mod::read(SoundStream *stream, void *buffer, int sizebytes, void *use buffer = (uint8_t *)buffer + written * 8; sizebytes -= written * 8; } - state->crit_sec.Leave(); return true; } @@ -1063,18 +1061,16 @@ bool input_mod::SetSubsong(int order) { return false; } - crit_sec.Enter(); + std::lock_guard lock(crit_sec); DUH_SIGRENDERER *oldsr = sr; sr = NULL; start_order = order; if (!open2(0)) { sr = oldsr; - crit_sec.Leave(); return false; } duh_end_sigrenderer(oldsr); - crit_sec.Leave(); return true; } diff --git a/src/sound/musicformats/music_gme.cpp b/src/sound/musicformats/music_gme.cpp index 0c1d6d230d..19a7b57c2f 100644 --- a/src/sound/musicformats/music_gme.cpp +++ b/src/sound/musicformats/music_gme.cpp @@ -39,6 +39,7 @@ #include "i_musicinterns.h" #include +#include #include "v_text.h" #include "templates.h" @@ -56,7 +57,7 @@ public: FString GetStats(); protected: - FCriticalSection CritSec; + std::mutex CritSec; Music_Emu *Emu; gme_info_t *TrackInfo; int SampleRate; @@ -251,12 +252,12 @@ bool GMESong::StartTrack(int track, bool getcritsec) if (getcritsec) { - CritSec.Enter(); + std::lock_guard lock(CritSec); + err = gme_start_track(Emu, track); } - err = gme_start_track(Emu, track); - if (getcritsec) + else { - CritSec.Leave(); + err = gme_start_track(Emu, track); } if (err != NULL) { @@ -356,7 +357,7 @@ bool GMESong::Read(SoundStream *stream, void *buff, int len, void *userdata) gme_err_t err; GMESong *song = (GMESong *)userdata; - song->CritSec.Enter(); + std::lock_guard lock(song->CritSec); if (gme_track_ended(song->Emu)) { if (song->m_Looping) @@ -366,11 +367,9 @@ bool GMESong::Read(SoundStream *stream, void *buff, int len, void *userdata) else { memset(buff, 0, len); - song->CritSec.Leave(); return false; } } err = gme_play(song->Emu, len >> 1, (short *)buff); - song->CritSec.Leave(); return (err == NULL); } diff --git a/src/sound/musicformats/music_libsndfile.cpp b/src/sound/musicformats/music_libsndfile.cpp index e4cd09a427..e0891342f0 100644 --- a/src/sound/musicformats/music_libsndfile.cpp +++ b/src/sound/musicformats/music_libsndfile.cpp @@ -34,6 +34,7 @@ // HEADER FILES ------------------------------------------------------------ +#include #include "i_musicinterns.h" #include "v_text.h" #include "templates.h" @@ -53,7 +54,7 @@ public: FString GetStats(); protected: - FCriticalSection CritSec; + std::mutex CritSec; FileReader Reader; SoundDecoder *Decoder; int Channels; @@ -387,7 +388,7 @@ bool SndFileSong::Read(SoundStream *stream, void *vbuff, int ilen, void *userdat { char *buff = (char*)vbuff; SndFileSong *song = (SndFileSong *)userdata; - song->CritSec.Enter(); + std::lock_guard lock(song->CritSec); size_t len = size_t(ilen); size_t currentpos = song->Decoder->getSampleOffset(); @@ -399,7 +400,6 @@ bool SndFileSong::Read(SoundStream *stream, void *vbuff, int ilen, void *userdat if (currentpos == maxpos) { memset(buff, 0, len); - song->CritSec.Leave(); return false; } if (currentpos + framestoread > maxpos) @@ -436,7 +436,6 @@ bool SndFileSong::Read(SoundStream *stream, void *vbuff, int ilen, void *userdat size_t readlen = song->Decoder->read(buff, len); if (readlen == 0) { - song->CritSec.Leave(); return false; } buff += readlen; @@ -447,6 +446,5 @@ bool SndFileSong::Read(SoundStream *stream, void *vbuff, int ilen, void *userdat } } } - song->CritSec.Leave(); return true; } diff --git a/src/sound/oplsynth/opl_mus_player.cpp b/src/sound/oplsynth/opl_mus_player.cpp index 73b2d9bc64..cf4a702d67 100644 --- a/src/sound/oplsynth/opl_mus_player.cpp +++ b/src/sound/oplsynth/opl_mus_player.cpp @@ -67,10 +67,9 @@ OPLmusicBlock::~OPLmusicBlock() void OPLmusicBlock::ResetChips () { - ChipAccess.Enter(); + std::lock_guard lock(ChipAccess); io->Reset (); NumChips = io->Init(MIN(*opl_numchips, 2), FullPan); - ChipAccess.Leave(); } void OPLmusicBlock::Restart() @@ -255,7 +254,7 @@ bool OPLmusicBlock::ServiceStream (void *buff, int numbytes) memset(buff, 0, numbytes); - ChipAccess.Enter(); + std::lock_guard lock(ChipAccess); while (numsamples > 0) { double ticky = NextTickIn; @@ -312,7 +311,6 @@ bool OPLmusicBlock::ServiceStream (void *buff, int numbytes) } } } - ChipAccess.Leave(); return res; } diff --git a/src/sound/oplsynth/opl_mus_player.h b/src/sound/oplsynth/opl_mus_player.h index 17f5521e25..bd6e2612af 100644 --- a/src/sound/oplsynth/opl_mus_player.h +++ b/src/sound/oplsynth/opl_mus_player.h @@ -1,4 +1,4 @@ -#include "critsec.h" +#include #include "musicblock.h" class FileReader; @@ -28,7 +28,7 @@ protected: double LastOffset; bool FullPan; - FCriticalSection ChipAccess; + std::mutex ChipAccess; }; class OPLmusicFile : public OPLmusicBlock diff --git a/src/sound/timiditypp/playmidi.cpp b/src/sound/timiditypp/playmidi.cpp index 4ffa768c86..fa4bd43c13 100644 --- a/src/sound/timiditypp/playmidi.cpp +++ b/src/sound/timiditypp/playmidi.cpp @@ -25,6 +25,7 @@ #include #include +#include #include "timidity.h" #include "common.h" #include "instrum.h" @@ -37,13 +38,12 @@ #include "c_cvars.h" #include "tables.h" #include "effect.h" -#include "critsec.h" #include "i_musicinterns.h" namespace TimidityPlus { - FCriticalSection CvarCritSec; + std::mutex CvarCritSec; bool timidity_modulation_wheel = true; bool timidity_portamento = false; int timidity_reverb = 0; @@ -73,9 +73,8 @@ namespace TimidityPlus template void ChangeVarSync(T&var, T value) { - TimidityPlus::CvarCritSec.Enter(); + std::lock_guard lock(TimidityPlus::CvarCritSec); var = value; - TimidityPlus::CvarCritSec.Leave(); } CUSTOM_CVAR(Bool, timidity_modulation_wheel, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) @@ -5128,7 +5127,7 @@ int Player::compute_data(float *buffer, int32_t count) { if (count == 0) return RC_OK; - CvarCritSec.Enter(); + std::lock_guard lock(CvarCritSec); if (last_reverb_setting != timidity_reverb) { @@ -5154,7 +5153,6 @@ int Player::compute_data(float *buffer, int32_t count) *buffer++ = (common_buffer[i])*(5.f / 0x80000000u); } } - CvarCritSec.Leave(); return RC_OK; } diff --git a/src/sound/wildmidi/wildmidi_lib.cpp b/src/sound/wildmidi/wildmidi_lib.cpp index b505d09829..4fdf12cf3f 100644 --- a/src/sound/wildmidi/wildmidi_lib.cpp +++ b/src/sound/wildmidi/wildmidi_lib.cpp @@ -36,6 +36,7 @@ #endif #include #include +#include #include "common.h" #include "wm_error.h" @@ -43,7 +44,6 @@ #include "reverb.h" #include "gus_pat.h" #include "wildmidi_lib.h" -#include "critsec.h" #include "files.h" #include "i_soundfont.h" @@ -84,7 +84,7 @@ static int fix_release = 0; static int auto_amp = 0; static int auto_amp_with_amp = 0; -static FCriticalSection patch_lock; +static std::mutex patch_lock; extern std::unique_ptr wm_sfreader; struct _channel { @@ -151,7 +151,7 @@ struct _mdi { reverb = NULL; } - FCriticalSection lock; + std::mutex lock; unsigned long int samples_to_mix; unsigned short midi_master_vol; @@ -179,7 +179,7 @@ static double newt_coeffs[58][58]; /* for start/end of samples */ #define MAX_GAUSS_ORDER 34 /* 34 is as high as we can go before errors crop up */ static double *gauss_table = NULL; /* *gauss_table[1< lock(gauss_lock); if (gauss_table) { - gauss_lock.Leave(); return; } @@ -241,14 +240,13 @@ static void init_gauss(void) { } gauss_table = t; - gauss_lock.Leave(); } -static void free_gauss(void) { - gauss_lock.Enter(); +static void free_gauss(void) +{ + std::lock_guard lock(gauss_lock); free(gauss_table); gauss_table = NULL; - gauss_lock.Leave(); } struct _hndl { @@ -562,7 +560,7 @@ static void WM_FreePatches(void) { struct _patch * tmp_patch; struct _sample * tmp_sample; - patch_lock.Enter(); + std::lock_guard lock(patch_lock); for (i = 0; i < 128; i++) { while (patch[i]) { while (patch[i]->first_sample) { @@ -577,7 +575,6 @@ static void WM_FreePatches(void) { patch[i] = tmp_patch; } } - patch_lock.Leave(); } /* wm_strdup -- adds extra space for appending up to 4 chars */ @@ -1324,27 +1321,23 @@ static struct _patch * get_patch_data(unsigned short patchid) { struct _patch *search_patch; - patch_lock.Enter(); + std::lock_guard lock(patch_lock); search_patch = patch[patchid & 0x007F]; if (search_patch == NULL) { - patch_lock.Leave(); return NULL; } while (search_patch) { if (search_patch->patchid == patchid) { - patch_lock.Leave(); return search_patch; } search_patch = search_patch->next; } if ((patchid >> 8) != 0) { - patch_lock.Leave(); return (get_patch_data(patchid & 0x00FF)); } - patch_lock.Leave(); return NULL; } @@ -1363,16 +1356,14 @@ static void load_patch(struct _mdi *mdi, unsigned short patchid) { return; } - patch_lock.Enter(); + std::lock_guard lock(patch_lock); if (!tmp_patch->loaded) { if (load_sample(tmp_patch) == -1) { - patch_lock.Leave(); return; } } if (tmp_patch->first_sample == NULL) { - patch_lock.Leave(); return; } @@ -1381,7 +1372,6 @@ static void load_patch(struct _mdi *mdi, unsigned short patchid) { (sizeof(struct _patch*) * mdi->patch_count)); mdi->patches[mdi->patch_count - 1] = tmp_patch; tmp_patch->inuse_count++; - patch_lock.Leave(); } static struct _sample * @@ -1389,17 +1379,14 @@ get_sample_data(struct _patch *sample_patch, unsigned long int freq) { struct _sample *last_sample = NULL; struct _sample *return_sample = NULL; - patch_lock.Enter(); + std::lock_guard lock(patch_lock); if (sample_patch == NULL) { - patch_lock.Leave(); return NULL; } if (sample_patch->first_sample == NULL) { - patch_lock.Leave(); return NULL; } if (freq == 0) { - patch_lock.Leave(); return sample_patch->first_sample; } @@ -1408,7 +1395,6 @@ get_sample_data(struct _patch *sample_patch, unsigned long int freq) { while (last_sample) { if (freq > last_sample->freq_low) { if (freq < last_sample->freq_high) { - patch_lock.Leave(); return last_sample; } else { return_sample = last_sample; @@ -1416,7 +1402,6 @@ get_sample_data(struct _patch *sample_patch, unsigned long int freq) { } last_sample = last_sample->next; } - patch_lock.Leave(); return return_sample; } @@ -2100,7 +2085,7 @@ static void freeMDI(struct _mdi *mdi) { unsigned long int i; if (mdi->patch_count != 0) { - patch_lock.Enter(); + std::lock_guard lock(patch_lock); for (i = 0; i < mdi->patch_count; i++) { mdi->patches[i]->inuse_count--; if (mdi->patches[i]->inuse_count == 0) { @@ -2114,7 +2099,6 @@ static void freeMDI(struct _mdi *mdi) { mdi->patches[i]->loaded = 0; } } - patch_lock.Leave(); free(mdi->patches); } @@ -2632,7 +2616,7 @@ WM_SYMBOL int WildMidi_Close(midi * handle) { 0); return -1; } - mdi->lock.Enter(); + std::lock_guard lock(mdi->lock); if (first_handle->handle == handle) { tmp_handle = first_handle->next; free(first_handle); @@ -2703,17 +2687,15 @@ WM_SYMBOL int WildMidi_SetOption(midi * handle, unsigned short int options, } mdi = (struct _mdi *) handle; - mdi->lock.Enter(); + std::lock_guard lock(mdi->lock); if ((!(options & 0x0007)) || (options & 0xFFF8)) { _WM_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(invalid option)", 0); - mdi->lock.Leave(); return -1; } if (setting & 0xFFF8) { _WM_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(invalid setting)", 0); - mdi->lock.Leave(); return -1; } @@ -2727,7 +2709,6 @@ WM_SYMBOL int WildMidi_SetOption(midi * handle, unsigned short int options, _WM_reset_reverb(mdi->reverb); } - mdi->lock.Leave(); return 0; } @@ -2743,12 +2724,11 @@ WildMidi_GetInfo(midi * handle) { 0); return NULL; } - mdi->lock.Enter(); + std::lock_guard lock(mdi->lock); if (mdi->tmp_info == NULL) { mdi->tmp_info = (struct _WM_Info*)malloc(sizeof(struct _WM_Info)); if (mdi->tmp_info == NULL) { _WM_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to set info", 0); - mdi->lock.Leave(); return NULL; } mdi->tmp_info->copyright = NULL; @@ -2763,7 +2743,6 @@ WildMidi_GetInfo(midi * handle) { } else { mdi->tmp_info->copyright = NULL; } - mdi->lock.Leave(); return mdi->tmp_info; } diff --git a/src/utility/cmdlib.cpp b/src/utility/cmdlib.cpp index 2ed0eefe93..219d11fafa 100644 --- a/src/utility/cmdlib.cpp +++ b/src/utility/cmdlib.cpp @@ -190,8 +190,15 @@ bool DirEntryExists(const char *pathname, bool *isdir) if (pathname == NULL || *pathname == 0) return false; +#ifndef _WIN32 struct stat info; bool res = stat(pathname, &info) == 0; +#else + // Windows must use the wide version of stat to preserve non-standard paths. + auto wstr = WideString(pathname); + struct _stat64i32 info; + bool res = _wstat64i32(wstr.c_str(), &info) == 0; +#endif if (isdir) *isdir = !!(info.st_mode & S_IFDIR); return res; } diff --git a/src/utility/configfile.cpp b/src/utility/configfile.cpp index b841e8d3da..2dc016e9e4 100644 --- a/src/utility/configfile.cpp +++ b/src/utility/configfile.cpp @@ -623,15 +623,15 @@ void FConfigFile::LoadConfigFile () bool FConfigFile::ReadConfig (void *file) { - char readbuf[READBUFFERSIZE]; + uint8_t readbuf[READBUFFERSIZE]; FConfigSection *section = NULL; ClearConfig (); - while (ReadLine (readbuf, READBUFFERSIZE, file) != NULL) + while (ReadLine ((char*)readbuf, READBUFFERSIZE, file) != NULL) { - char *start = readbuf; - char *equalpt; - char *endpt; + uint8_t *start = readbuf; + uint8_t *equalpt; + uint8_t *endpt; // Remove white space at start of line while (*start && *start <= ' ') @@ -644,7 +644,7 @@ bool FConfigFile::ReadConfig (void *file) continue; } // Do not process tail of long line - const bool longline = (READBUFFERSIZE - 1) == strlen(readbuf) && '\n' != readbuf[READBUFFERSIZE - 2]; + const bool longline = (READBUFFERSIZE - 1) == strlen((char*)readbuf) && '\n' != readbuf[READBUFFERSIZE - 2]; if (longline) { endpt = start + READBUFFERSIZE - 2; @@ -652,7 +652,7 @@ bool FConfigFile::ReadConfig (void *file) else { // Remove white space at end of line - endpt = start + strlen (start) - 1; + endpt = start + strlen ((char*)start) - 1; while (endpt > start && *endpt <= ' ') { endpt--; @@ -667,7 +667,7 @@ bool FConfigFile::ReadConfig (void *file) { // Section header if (*endpt == ']') *endpt = 0; - section = NewConfigSection (start+1); + section = NewConfigSection ((char*)start+1); } else if (section == NULL) { @@ -675,11 +675,11 @@ bool FConfigFile::ReadConfig (void *file) } else { // Should be key=value - equalpt = strchr (start, '='); + equalpt = (uint8_t*)strchr ((char*)start, '='); if (equalpt != NULL && equalpt > start) { // Remove white space in front of = - char *whiteprobe = equalpt - 1; + uint8_t *whiteprobe = equalpt - 1; while (whiteprobe > start && isspace(*whiteprobe)) { whiteprobe--; @@ -695,16 +695,16 @@ bool FConfigFile::ReadConfig (void *file) // Check for multi-line value if (whiteprobe[0] == '<' && whiteprobe[1] == '<' && whiteprobe[2] == '<' && whiteprobe[3] != '\0') { - ReadMultiLineValue (file, section, start, whiteprobe + 3); + ReadMultiLineValue (file, section, (char*)start, (char*)whiteprobe + 3); } else if (longline) { - const FString key = start; - FString value = whiteprobe; + const FString key = (char*)start; + FString value = (char*)whiteprobe; - while (ReadLine (readbuf, READBUFFERSIZE, file) != NULL) + while (ReadLine ((char*)readbuf, READBUFFERSIZE, file) != NULL) { - const size_t endpos = (0 == readbuf[0]) ? 0 : (strlen(readbuf) - 1); + const size_t endpos = (0 == readbuf[0]) ? 0 : (strlen((char*)readbuf) - 1); const bool endofline = '\n' == readbuf[endpos]; if (endofline) @@ -712,7 +712,7 @@ bool FConfigFile::ReadConfig (void *file) readbuf[endpos] = 0; } - value += readbuf; + value += (char*)readbuf; if (endofline) { @@ -724,7 +724,7 @@ bool FConfigFile::ReadConfig (void *file) } else { - NewConfigEntry (section, start, whiteprobe); + NewConfigEntry (section, (char*)start, (char*)whiteprobe); } } } diff --git a/src/doomerrors.h b/src/utility/doomerrors.h similarity index 100% rename from src/doomerrors.h rename to src/utility/doomerrors.h diff --git a/src/utility/files.cpp b/src/utility/files.cpp index 3e288a0fd0..e5a17dd4f4 100644 --- a/src/utility/files.cpp +++ b/src/utility/files.cpp @@ -37,6 +37,17 @@ #include "templates.h" +FILE *myfopen(const char *filename, const char *flags) +{ +#ifndef _WIN32 + return fopen(filename, flags); +#else + auto widename = WideString(filename); + auto wideflags = WideString(flags); + return _wfopen(widename.c_str(), wideflags.c_str()); +#endif +} + //========================================================================== // @@ -67,7 +78,7 @@ public: bool Open(const char *filename, long startpos = 0, long len = -1) { - File = fopen(filename, "rb"); + File = myfopen(filename, "rb"); if (File == nullptr) return false; FilePos = startpos; StartPos = startpos; @@ -407,7 +418,7 @@ bool FileReader::OpenMemoryArray(std::function&)> getter) bool FileWriter::OpenDirect(const char *filename) { - File = fopen(filename, "wb"); + File = myfopen(filename, "wb"); return (File != NULL); } diff --git a/src/utility/i_module.cpp b/src/utility/i_module.cpp index f28942109f..f22a557913 100644 --- a/src/utility/i_module.cpp +++ b/src/utility/i_module.cpp @@ -41,7 +41,7 @@ #endif #ifndef _WIN32 -#define LoadLibrary(x) dlopen((x), RTLD_LAZY) +#define LoadLibraryA(x) dlopen((x), RTLD_LAZY) #define GetProcAddress(a,b) dlsym((a),(b)) #define FreeLibrary(x) dlclose((x)) using HMODULE = void*; @@ -83,14 +83,14 @@ void FModule::Unload() bool FModule::Open(const char* lib) { #ifdef _WIN32 - if((handle = GetModuleHandle(lib)) != nullptr) + if((handle = GetModuleHandleA(lib)) != nullptr) return true; #else // Loading an empty string in Linux doesn't do what we expect it to. if(*lib == '\0') return false; #endif - handle = LoadLibrary(lib); + handle = LoadLibraryA(lib); return handle != nullptr; } diff --git a/src/utility/namedef.h b/src/utility/namedef.h index 9fb39bfc65..470a58a25b 100644 --- a/src/utility/namedef.h +++ b/src/utility/namedef.h @@ -747,6 +747,7 @@ xx(Pagename) // Special menus xx(Mainmenu) +xx(MainmenuTextOnly) xx(Episodemenu) xx(Playerclassmenu) xx(HexenDefaultPlayerclassmenu) diff --git a/src/stats.cpp b/src/utility/stats.cpp similarity index 100% rename from src/stats.cpp rename to src/utility/stats.cpp diff --git a/src/stats.h b/src/utility/stats.h similarity index 100% rename from src/stats.h rename to src/utility/stats.h diff --git a/src/templates.h b/src/utility/templates.h similarity index 100% rename from src/templates.h rename to src/utility/templates.h diff --git a/src/utility/utf8.cpp b/src/utility/utf8.cpp new file mode 100644 index 0000000000..14f7b79833 --- /dev/null +++ b/src/utility/utf8.cpp @@ -0,0 +1,259 @@ +/* +** utf8.cpp +** UTF-8 utilities +** +**--------------------------------------------------------------------------- +** Copyright 2019 Christoph Oelckers +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ +#include +#include "tarray.h" + + +//========================================================================== +// +// +// +//========================================================================== + +int utf8_encode(int32_t codepoint, uint8_t *buffer, int *size) +{ + if (codepoint < 0) + return -1; + else if (codepoint < 0x80) + { + buffer[0] = (char)codepoint; + *size = 1; + } + else if (codepoint < 0x800) + { + buffer[0] = 0xC0 + ((codepoint & 0x7C0) >> 6); + buffer[1] = 0x80 + ((codepoint & 0x03F)); + *size = 2; + } + else if (codepoint < 0x10000) + { + buffer[0] = 0xE0 + ((codepoint & 0xF000) >> 12); + buffer[1] = 0x80 + ((codepoint & 0x0FC0) >> 6); + buffer[2] = 0x80 + ((codepoint & 0x003F)); + *size = 3; + } + else if (codepoint <= 0x10FFFF) + { + buffer[0] = 0xF0 + ((codepoint & 0x1C0000) >> 18); + buffer[1] = 0x80 + ((codepoint & 0x03F000) >> 12); + buffer[2] = 0x80 + ((codepoint & 0x000FC0) >> 6); + buffer[3] = 0x80 + ((codepoint & 0x00003F)); + *size = 4; + } + else + return -1; + + return 0; +} + +//========================================================================== +// +// +// +//========================================================================== + +int utf8_decode(const uint8_t *src, int *size) +{ + int c = src[0]; + int r; + + *size = 1; + if ((c & 0x80) == 0) + { + return c; + } + + int c1 = src[1] & 0x3f; + + if ((c & 0xE0) == 0xC0) + { + r = ((c & 0x1F) << 6) | c1; + if (r >= 128) + { + *size = 2; + return r; + } + return -1; + } + + int c2 = src[2] & 0x3f; + + if ((c & 0xF0) == 0xE0) + { + r = ((c & 0x0F) << 12) | (c1 << 6) | c2; + if (r >= 2048 && (r < 55296 || r > 57343)) + { + *size = 3; + return r; + } + return -1; + } + + int c3 = src[3] & 0x3f; + + if ((c & 0xF8) == 0xF0) + { + r = ((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3; + if (r >= 65536 && r <= 1114111) + { + *size = 4; + return r; + } + } + return -1; +} + +//========================================================================== +// +// Unicode mapping for the 0x80-0x9f range of the Windows 1252 code page +// +//========================================================================== + +uint16_t win1252map[] = { + 0x20AC, + 0x81 , + 0x201A, + 0x0192, + 0x201E, + 0x2026, + 0x2020, + 0x2021, + 0x02C6, + 0x2030, + 0x0160, + 0x2039, + 0x0152, + 0x8d , + 0x017D, + 0x8f , + 0x90 , + 0x2018, + 0x2019, + 0x201C, + 0x201D, + 0x2022, + 0x2013, + 0x2014, + 0x02DC, + 0x2122, + 0x0161, + 0x203A, + 0x0153, + 0x9d , + 0x017E, + 0x0178, +}; + +//========================================================================== +// +// reads one character from the string. +// This can handle both ISO 8859-1/Windows-1252 and UTF-8, as well as mixed strings +// between both encodings, which may happen if inconsistent encoding is +// used between different files in a mod. +// +//========================================================================== + +int GetCharFromString(const uint8_t *&string) +{ + int z; + + z = *string; + + if (z < 192) + { + string++; + + // Handle Windows 1252 characters + if (z >= 128 && z < 160) + { + return win1252map[z - 128]; + } + return z; + } + else + { + int size = 0; + auto chr = utf8_decode(string, &size); + if (chr >= 0) + { + string += size; + return chr; + } + string++; + return z; + } +} + +//========================================================================== +// +// convert a potentially mixed-encoded string to pure UTF-8 +// this returns a pointer to a static buffer, +// assuming that its caller will immediately process the result. +// +//========================================================================== + +static TArray UTF8String; + +const char *MakeUTF8(const char *outline, int *numchars = nullptr) +{ + UTF8String.Clear(); + const uint8_t *in = (const uint8_t*)outline; + + if (numchars) *numchars = 0; + while (int chr = GetCharFromString(in)) + { + int size = 0; + uint8_t encode[4]; + if (!utf8_encode(chr, encode, &size)) + { + for (int i = 0; i < size; i++) + { + UTF8String.Push(encode[i]); + } + } + if (numchars) *numchars++; + } + UTF8String.Push(0); + return UTF8String.Data(); +} + +const char *MakeUTF8(int codepoint, int *psize) +{ + int size = 0; + UTF8String.Resize(5); + utf8_encode(codepoint, (uint8_t*)UTF8String.Data(), &size); + UTF8String[size] = 0; + if (psize) *psize = size; + return UTF8String.Data(); +} diff --git a/src/utility/utf8.h b/src/utility/utf8.h new file mode 100644 index 0000000000..cb437a2a1f --- /dev/null +++ b/src/utility/utf8.h @@ -0,0 +1,9 @@ +#pragma once + +int utf8_encode(int32_t codepoint, uint8_t *buffer, int *size); +int utf8_decode(const uint8_t *src, int *size); +int GetCharFromString(const uint8_t *&string); +const char *MakeUTF8(const char *outline, int *numchars = nullptr); // returns a pointer to a static buffer, assuming that its caller will immediately process the result. +const char *MakeUTF8(int codepoint, int *psize = nullptr); + +extern uint16_t win1252map[]; diff --git a/src/utility/zstrformat.cpp b/src/utility/zstrformat.cpp index 2bec178035..bf61ce282b 100644 --- a/src/utility/zstrformat.cpp +++ b/src/utility/zstrformat.cpp @@ -89,6 +89,7 @@ #include "zstring.h" #include "gdtoa.h" +#include "utf8.h" /* @@ -557,8 +558,11 @@ namespace StringFormat else if (type == 'c') { intarg = va_arg (arglist, int); - buffer[0] = char(intarg); - bufflen = 1; + if (utf8_encode(intarg, (uint8_t*)buffer, &bufflen) != 0) + { + buffer[0] = '?'; + bufflen = 1; + } obuff = buffer; } else if (type == 's') diff --git a/src/utility/zstring.cpp b/src/utility/zstring.cpp index ff17fd607e..d4ad5ec89c 100644 --- a/src/utility/zstring.cpp +++ b/src/utility/zstring.cpp @@ -38,6 +38,8 @@ #include // for bad_alloc #include "zstring.h" +#include "v_text.h" +#include "utf8.h" FNullStringData FString::NullString = { @@ -379,6 +381,25 @@ FString &FString::CopyCStrPart(const char *tail, size_t tailLen) return *this; } +size_t FString::CharacterCount() const +{ + // Counts string length in Unicode code points. + size_t len = 0; + const uint8_t *cp = (const uint8_t*)Chars; + while (GetCharFromString(cp)) len++; + return len; +} + + +int FString::GetNextCharacter(int &position) const +{ + const uint8_t *cp = (const uint8_t*)Chars; + const uint8_t *cpread = cp + position; + int chr = GetCharFromString(cpread); + position += int(cpread - cp); + return chr; +} + void FString::Truncate(size_t newlen) { if (newlen == 0) @@ -455,6 +476,28 @@ FString FString::Mid (size_t pos, size_t numChars) const return FString (Chars + pos, numChars); } +void FString::AppendCharacter(int codepoint) +{ + (*this) << MakeUTF8(codepoint); +} + +void FString::DeleteLastCharacter() +{ + if (Len() == 0) return; + auto pos = Len() - 1; + while (pos > 0 && uint8_t(Chars[pos]) >= 0x80 && uint8_t(Chars[pos]) < 0xc0) pos--; + if (pos <= 0) + { + Data()->Release(); + ResetToNull(); + } + else + { + Truncate(pos); + } +} + + long FString::IndexOf (const FString &substr, long startIndex) const { return IndexOf (substr.Chars, startIndex); @@ -996,6 +1039,7 @@ void FString::Substitute (const char *oldstr, const char *newstr) void FString::Substitute (const char *oldstr, const char *newstr, size_t oldstrlen, size_t newstrlen) { + if (oldstr == nullptr || newstr == nullptr || *oldstr == 0) return; LockBuffer(); for (size_t checkpt = 0; checkpt < Len(); ) { @@ -1130,14 +1174,14 @@ digits = [0-9]; return yych == '\0'; } -long FString::ToLong (int base) const +int64_t FString::ToLong (int base) const { - return (long)strtoll (Chars, NULL, base); + return strtoll (Chars, NULL, base); } -unsigned long FString::ToULong (int base) const +uint64_t FString::ToULong (int base) const { - return (unsigned long)strtoull (Chars, NULL, base); + return strtoull (Chars, NULL, base); } double FString::ToDouble () const @@ -1231,6 +1275,53 @@ void FString::Split(TArray& tokens, const char *delimiter, EmptyTokenTy #define WIN32_LEAN_AND_MEAN #include +// Convert from and to Windows wide strings so that we can interface with the Unicode version of the Windows API. +FString::FString(const wchar_t *copyStr) +{ + if (copyStr == NULL || *copyStr == '\0') + { + ResetToNull(); + } + else + { + auto len = wcslen(copyStr); + int size_needed = WideCharToMultiByte(CP_UTF8, 0, copyStr, (int)len, nullptr, 0, nullptr, nullptr); + AllocBuffer(size_needed); + WideCharToMultiByte(CP_UTF8, 0, copyStr, (int)len, Chars, size_needed, nullptr, nullptr); + Chars[size_needed] = 0; + } +} + +FString &FString::operator=(const wchar_t *copyStr) +{ + if (copyStr == NULL || *copyStr == '\0') + { + Data()->Release(); + ResetToNull(); + } + else + { + auto len = wcslen(copyStr); + int size_needed = WideCharToMultiByte(CP_UTF8, 0, copyStr, (int)len, nullptr, 0, nullptr, nullptr); + ReallocBuffer(size_needed); + WideCharToMultiByte(CP_UTF8, 0, copyStr, (int)len, Chars, size_needed, nullptr, nullptr); + Chars[size_needed] = 0; + } + return *this; +} + +std::wstring WideString(const char *cin) +{ + const uint8_t *in = (const uint8_t*)cin; + // This is a bit tricky because we need to support both UTF-8 and legacy content in ISO-8859-1 + // and thanks to user-side string manipulation it can be that a text mixes both. + // To convert the string this uses the same function as all text printing in the engine. + TArray buildbuffer; + while (*in) buildbuffer.Push((wchar_t)GetCharFromString(in)); + buildbuffer.Push(0); + return std::wstring(buildbuffer.Data()); +} + static HANDLE StringHeap; const SIZE_T STRING_HEAP_SIZE = 64*1024; #endif diff --git a/src/utility/zstring.h b/src/utility/zstring.h index 334fbcb1f1..35e7be7003 100644 --- a/src/utility/zstring.h +++ b/src/utility/zstring.h @@ -57,6 +57,9 @@ #define IGNORE_FORMAT_POST #endif +#ifdef _WIN32 +std::wstring WideString(const char *); +#endif struct FStringData { @@ -128,6 +131,14 @@ public: FString (const char *copyStr); FString (const char *copyStr, size_t copyLen); FString (char oneChar); + FString(const TArray & source) : FString(source.Data(), source.Size()) {} + FString(const TArray & source) : FString((char*)source.Data(), source.Size()) {} + // This is intentionally #ifdef'd. The only code which needs this is parts of the Windows backend that receive Unicode text from the system. +#ifdef _WIN32 + explicit FString(const wchar_t *copyStr); + FString &operator = (const wchar_t *copyStr); + std::wstring WideString() const { return ::WideString(Chars); } +#endif // Concatenation constructors FString (const FString &head, const FString &tail); @@ -199,6 +210,9 @@ public: FString Right (size_t numChars) const; FString Mid (size_t pos, size_t numChars = ~(size_t)0) const; + void AppendCharacter(int codepoint); + void DeleteLastCharacter(); + long IndexOf (const FString &substr, long startIndex=0) const; long IndexOf (const char *substr, long startIndex=0) const; long IndexOf (char subchar, long startIndex=0) const; @@ -299,11 +313,13 @@ public: bool IsInt () const; bool IsFloat () const; - long ToLong (int base=0) const; - unsigned long ToULong (int base=0) const; + int64_t ToLong (int base=0) const; + uint64_t ToULong (int base=0) const; double ToDouble () const; size_t Len() const { return Data()->Len; } + size_t CharacterCount() const; + int GetNextCharacter(int &position) const; bool IsEmpty() const { return Len() == 0; } bool IsNotEmpty() const { return Len() != 0; } diff --git a/src/v_font.cpp b/src/v_font.cpp deleted file mode 100644 index dc71f1937c..0000000000 --- a/src/v_font.cpp +++ /dev/null @@ -1,2304 +0,0 @@ -/* -** v_font.cpp -** Font management -** -**--------------------------------------------------------------------------- -** Copyright 1998-2008 Randy Heit -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- -** -*/ - -/* Special file formats handled here: - -FON1 "console" fonts have the following header: - char Magic[4]; -- The characters "FON1" - uword CharWidth; -- Character cell width - uword CharHeight; -- Character cell height - -The FON1 header is followed by RLE character data for all 256 -8-bit ASCII characters. - - -FON2 "standard" fonts have the following header: - char Magic[4]; -- The characters "FON2" - uword FontHeight; -- Every character in a font has the same height - ubyte FirstChar; -- First character defined by this font. - ubyte LastChar; -- Last character definde by this font. - ubyte bConstantWidth; - ubyte ShadingType; - ubyte PaletteSize; -- size of palette in entries (not bytes!) - ubyte Flags; - -There is presently only one flag for FON2: - FOF_WHOLEFONTKERNING 1 -- The Kerning field is present in the file - -The FON2 header is followed by variable length data: - word Kerning; - -- only present if FOF_WHOLEFONTKERNING is set - - ubyte Palette[PaletteSize+1][3]; - -- The last entry is the delimiter color. The delimiter is not used - -- by the font but is used by imagetool when converting the font - -- back to an image. Color 0 is the transparent color and is also - -- used only for converting the font back to an image. The other - -- entries are all presorted in increasing order of brightness. - - ubyte CharacterData[...]; - -- RLE character data, in order -*/ - -// HEADER FILES ------------------------------------------------------------ - -#include -#include -#include - -#include "templates.h" -#include "doomtype.h" -#include "m_swap.h" -#include "v_font.h" -#include "v_video.h" -#include "w_wad.h" -#include "gi.h" -#include "cmdlib.h" -#include "sc_man.h" -#include "hu_stuff.h" -#include "gstrings.h" -#include "v_text.h" -#include "vm.h" -#include "image.h" -#include "textures/formats/fontchars.h" - -// MACROS ------------------------------------------------------------------ - -#define DEFAULT_LOG_COLOR PalEntry(223,223,223) - -// TYPES ------------------------------------------------------------------- -void RecordTextureColors (FImageSource *pic, uint8_t *colorsused); - -// This structure is used by BuildTranslations() to hold color information. -struct TranslationParm -{ - short RangeStart; // First level for this range - short RangeEnd; // Last level for this range - uint8_t Start[3]; // Start color for this range - uint8_t End[3]; // End color for this range -}; - -struct TranslationMap -{ - FName Name; - int Number; -}; - -class FSingleLumpFont : public FFont -{ -public: - FSingleLumpFont (const char *fontname, int lump); - -protected: - void CheckFON1Chars (double *luminosity); - void BuildTranslations2 (); - void FixupPalette (uint8_t *identity, double *luminosity, const uint8_t *palette, - bool rescale, PalEntry *out_palette); - void LoadTranslations (); - void LoadFON1 (int lump, const uint8_t *data); - void LoadFON2 (int lump, const uint8_t *data); - void LoadBMF (int lump, const uint8_t *data); - void CreateFontFromPic (FTextureID picnum); - - static int BMFCompare(const void *a, const void *b); - - enum - { - FONT1, - FONT2, - BMFFONT - } FontType; - uint8_t PaletteData[768]; - bool RescalePalette; -}; - -class FSinglePicFont : public FFont -{ -public: - FSinglePicFont(const char *picname); - - // FFont interface - FTexture *GetChar(int code, int translation, int *const width, bool *redirected = nullptr) const override; - int GetCharWidth (int code) const; - -protected: - FTextureID PicNum; -}; - -// Essentially a normal multilump font but with an explicit list of character patches -class FSpecialFont : public FFont -{ -public: - FSpecialFont (const char *name, int first, int count, FTexture **lumplist, const bool *notranslate, int lump, bool donttranslate); - - void LoadTranslations(); - -protected: - bool notranslate[256]; -}; - -struct TempParmInfo -{ - unsigned int StartParm[2]; - unsigned int ParmLen[2]; - int Index; -}; -struct TempColorInfo -{ - FName Name; - unsigned int ParmInfo; - PalEntry LogColor; -}; - -// EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- - -// PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- - -// PRIVATE FUNCTION PROTOTYPES --------------------------------------------- - -static int TranslationMapCompare (const void *a, const void *b); - -// EXTERNAL DATA DECLARATIONS ---------------------------------------------- - -extern int PrintColors[]; - -// PUBLIC DATA DEFINITIONS ------------------------------------------------- - -FFont *FFont::FirstFont = nullptr; -int NumTextColors; - -// PRIVATE DATA DEFINITIONS ------------------------------------------------ - -static TArray TranslationParms[2]; -static TArray TranslationLookup; -static TArray TranslationColors; - -// CODE -------------------------------------------------------------------- - -static bool myislower(int code) -{ - if (code >= 'a' && code <= 'z') - return true; - if (code != 0xF7 && code != 0xFF && (code & 0xE0) == 0xE0) - return true; - return false; -} - -// Returns a character without an accent mark. -// FIXME: Only valid for CP-1252; we should go Unicode at some point. - -static int stripaccent(int code) -{ - if (code < 0x8a) - return code; - if (code == 0x8a) // Latin capital letter S with caron - return 'S'; - if (code == 0x8e) // Latin capital letter Z with caron - return 'Z'; - if (code == 0x9a) // Latin small letter S with caron - return 's'; - if (code == 0x9e) // Latin small letter Z with caron - return 'z'; - if (code == 0x9f) // Latin capital letter Y with diaeresis - return 'Y'; - if (code == 0xff) // Latin small letter Y with diaeresis - return 'y'; - // Every other accented character has the high two bits set. - if ((code & 0xC0) == 0) - return code; - // Make lowercase characters uppercase so there are half as many tests. - int acode = code & 0xDF; - if (acode >= 0xC0 && acode <= 0xC5) // A with accents - return 'A' + (code & 0x20); - if (acode == 0xC7) // Cedilla - return 'C' + (acode & 0x20); - if (acode >= 0xC8 && acode <= 0xCB) // E with accents - return 'E' + (code & 0x20); - if (acode >= 0xCC && acode <= 0xCF) // I with accents - return 'I' + (code & 0x20); - if (acode == 0xD0) // Eth - return 'D' + (code & 0x20); - if (acode == 0xD1) // N with tilde - return 'N' + (code & 0x20); - if ((acode >= 0xD2 && acode <= 0xD6) || // O with accents - acode == 0xD8) // O with stroke - return 'O' + (code & 0x20); - if (acode >= 0xD9 && acode <= 0xDC) // U with accents - return 'U' + (code & 0x20); - if (acode == 0xDD) // Y with accute - return 'Y' + (code & 0x20); - if (acode == 0xDE) // Thorn - return 'P' + (code & 0x20); // well, it sort of looks like a 'P' - return code; -} - -FFont *V_GetFont(const char *name) -{ - FFont *font = FFont::FindFont (name); - if (font == nullptr) - { - int lump = -1; - - lump = Wads.CheckNumForFullName(name, true); - - if (lump != -1) - { - uint32_t head; - { - auto lumpy = Wads.OpenLumpReader (lump); - lumpy.Read (&head, 4); - } - if ((head & MAKE_ID(255,255,255,0)) == MAKE_ID('F','O','N',0) || - head == MAKE_ID(0xE1,0xE6,0xD5,0x1A)) - { - font = new FSingleLumpFont (name, lump); - } - } - if (font == nullptr) - { - FTextureID picnum = TexMan.CheckForTexture (name, ETextureType::Any); - if (picnum.isValid()) - { - font = new FSinglePicFont (name); - } - } - } - return font; -} - -//========================================================================== -// -// FFont :: FFont -// -// Loads a multi-texture font. -// -//========================================================================== - -FFont::FFont (const char *name, const char *nametemplate, int first, int count, int start, int fdlump, int spacewidth, bool notranslate) -{ - int i; - FTextureID lump; - char buffer[12]; - TArray charLumps(count, true); - int maxyoffs; - bool doomtemplate = gameinfo.gametype & GAME_DoomChex ? strncmp (nametemplate, "STCFN", 5) == 0 : false; - bool stcfn121 = false; - - noTranslate = notranslate; - Lump = fdlump; - Chars.Resize(count); - FirstChar = first; - LastChar = first + count - 1; - FontHeight = 0; - GlobalKerning = false; - FontName = name; - Next = FirstFont; - FirstFont = this; - Cursor = '_'; - ActiveColors = 0; - uint8_t pp = 0; - for (auto &p : PatchRemap) p = pp++; - translateUntranslated = false; - - maxyoffs = 0; - - for (i = 0; i < count; i++) - { - charLumps[i] = nullptr; - mysnprintf (buffer, countof(buffer), nametemplate, i + start); - - lump = TexMan.CheckForTexture(buffer, ETextureType::MiscPatch); - if (doomtemplate && lump.isValid() && i + start == 121) - { // HACKHACK: Don't load STCFN121 in doom(2), because - // it's not really a lower-case 'y' but a '|'. - // Because a lot of wads with their own font seem to foolishly - // copy STCFN121 and make it a '|' themselves, wads must - // provide STCFN120 (x) and STCFN122 (z) for STCFN121 to load as a 'y'. - if (!TexMan.CheckForTexture("STCFN120", ETextureType::MiscPatch).isValid() || - !TexMan.CheckForTexture("STCFN122", ETextureType::MiscPatch).isValid()) - { - // insert the incorrectly named '|' graphic in its correct position. - if (count > 124-start) charLumps[124-start] = TexMan.GetTexture(lump); - lump.SetInvalid(); - stcfn121 = true; - } - } - - if (lump.isValid()) - { - FTexture *pic = TexMan.GetTexture(lump); - if (pic != nullptr) - { - // set the lump here only if it represents a valid texture - if (i != 124-start || !stcfn121) - charLumps[i] = pic; - - int height = pic->GetDisplayHeight(); - int yoffs = pic->GetDisplayTopOffset(); - - if (yoffs > maxyoffs) - { - maxyoffs = yoffs; - } - height += abs (yoffs); - if (height > FontHeight) - { - FontHeight = height; - } - } - } - - if (charLumps[i] != nullptr) - { - charLumps[i]->SetUseType(ETextureType::FontChar); - - if (!noTranslate) - { - Chars[i].OriginalPic = charLumps[i]; - Chars[i].TranslatedPic = new FImageTexture(new FFontChar1 (charLumps[i]->GetImage()), ""); - Chars[i].TranslatedPic->CopySize(charLumps[i]); - Chars[i].TranslatedPic->SetUseType(ETextureType::FontChar); - TexMan.AddTexture(Chars[i].TranslatedPic); - } - else Chars[i].TranslatedPic = charLumps[i]; - - Chars[i].XMove = Chars[i].TranslatedPic->GetDisplayWidth(); - } - else - { - Chars[i].TranslatedPic = nullptr; - Chars[i].XMove = INT_MIN; - } - } - - if (spacewidth != -1) - { - SpaceWidth = spacewidth; - } - else if ('N'-first >= 0 && 'N'-first < count && Chars['N' - first].TranslatedPic != nullptr) - { - SpaceWidth = (Chars['N' - first].XMove + 1) / 2; - } - else - { - SpaceWidth = 4; - } - - FixXMoves(); - - if (!noTranslate) LoadTranslations(); -} - -//========================================================================== -// -// FFont :: ~FFont -// -//========================================================================== - -FFont::~FFont () -{ - FFont **prev = &FirstFont; - FFont *font = *prev; - - while (font != nullptr && font != this) - { - prev = &font->Next; - font = *prev; - } - - if (font != nullptr) - { - *prev = font->Next; - } -} - -//========================================================================== -// -// FFont :: FindFont -// -// Searches for the named font in the list of loaded fonts, returning the -// font if it was found. The disk is not checked if it cannot be found. -// -//========================================================================== - -FFont *FFont::FindFont (FName name) -{ - if (name == NAME_None) - { - return nullptr; - } - FFont *font = FirstFont; - - while (font != nullptr) - { - if (font->FontName == name) return font; - font = font->Next; - } - return nullptr; -} - -//========================================================================== -// -// RecordTextureColors -// -// Given a 256 entry buffer, sets every entry that corresponds to a color -// used by the texture to 1. -// -//========================================================================== - -void RecordTextureColors (FImageSource *pic, uint8_t *usedcolors) -{ - int x; - - auto pixels = pic->GetPalettedPixels(false); - auto size = pic->GetWidth() * pic->GetHeight(); - - for(x = 0;x < size; x++) - { - usedcolors[pixels[x]]++; - } -} - -//========================================================================== -// -// compare -// -// Used for sorting colors by brightness. -// -//========================================================================== - -static int compare (const void *arg1, const void *arg2) -{ - if (RPART(GPalette.BaseColors[*((uint8_t *)arg1)]) * 299 + - GPART(GPalette.BaseColors[*((uint8_t *)arg1)]) * 587 + - BPART(GPalette.BaseColors[*((uint8_t *)arg1)]) * 114 < - RPART(GPalette.BaseColors[*((uint8_t *)arg2)]) * 299 + - GPART(GPalette.BaseColors[*((uint8_t *)arg2)]) * 587 + - BPART(GPalette.BaseColors[*((uint8_t *)arg2)]) * 114) - return -1; - else - return 1; -} - -//========================================================================== -// -// FFont :: SimpleTranslation -// -// Colorsused, translation, and reverse must all be 256 entry buffers. -// Colorsused must already be filled out. -// Translation be set to remap the source colors to a new range of -// consecutive colors based at 1 (0 is transparent). -// Reverse will be just the opposite of translation: It maps the new color -// range to the original colors. -// *Luminosity will be an array just large enough to hold the brightness -// levels of all the used colors, in consecutive order. It is sorted from -// darkest to lightest and scaled such that the darkest color is 0.0 and -// the brightest color is 1.0. -// The return value is the number of used colors and thus the number of -// entries in *luminosity. -// -//========================================================================== - -int FFont::SimpleTranslation (uint8_t *colorsused, uint8_t *translation, uint8_t *reverse, TArray &Luminosity) -{ - double min, max, diver; - int i, j; - - memset (translation, 0, 256); - - reverse[0] = 0; - for (i = 1, j = 1; i < 256; i++) - { - if (colorsused[i]) - { - reverse[j++] = i; - } - } - - qsort (reverse+1, j-1, 1, compare); - - Luminosity.Resize(j); - Luminosity[0] = 0.0; // [BL] Prevent uninitalized memory - max = 0.0; - min = 100000000.0; - for (i = 1; i < j; i++) - { - translation[reverse[i]] = i; - - Luminosity[i] = RPART(GPalette.BaseColors[reverse[i]]) * 0.299 + - GPART(GPalette.BaseColors[reverse[i]]) * 0.587 + - BPART(GPalette.BaseColors[reverse[i]]) * 0.114; - if (Luminosity[i] > max) - max = Luminosity[i]; - if (Luminosity[i] < min) - min = Luminosity[i]; - } - diver = 1.0 / (max - min); - for (i = 1; i < j; i++) - { - Luminosity[i] = (Luminosity[i] - min) * diver; - } - - return j; -} - -//========================================================================== -// -// FFont :: BuildTranslations -// -// Build color translations for this font. Luminosity is an array of -// brightness levels. The ActiveColors member must be set to indicate how -// large this array is. Identity is an array that remaps the colors to -// their original values; it is only used for CR_UNTRANSLATED. Ranges -// is an array of TranslationParm structs defining the ranges for every -// possible color, in order. Palette is the colors to use for the -// untranslated version of the font. -// -//========================================================================== - -void FFont::BuildTranslations (const double *luminosity, const uint8_t *identity, - const void *ranges, int total_colors, const PalEntry *palette) -{ - int i, j; - const TranslationParm *parmstart = (const TranslationParm *)ranges; - - FRemapTable remap(total_colors); - - // Create different translations for different color ranges - Ranges.Clear(); - for (i = 0; i < NumTextColors; i++) - { - if (i == CR_UNTRANSLATED) - { - if (identity != nullptr) - { - memcpy (remap.Remap, identity, ActiveColors); - if (palette != nullptr) - { - memcpy (remap.Palette, palette, ActiveColors*sizeof(PalEntry)); - } - else - { - remap.Palette[0] = GPalette.BaseColors[identity[0]] & MAKEARGB(0,255,255,255); - for (j = 1; j < ActiveColors; ++j) - { - remap.Palette[j] = GPalette.BaseColors[identity[j]] | MAKEARGB(255,0,0,0); - } - } - } - else - { - remap = Ranges[0]; - } - Ranges.Push(remap); - continue; - } - - assert(parmstart->RangeStart >= 0); - - remap.Remap[0] = 0; - remap.Palette[0] = 0; - - for (j = 1; j < ActiveColors; j++) - { - int v = int(luminosity[j] * 256.0); - - // Find the color range that this luminosity value lies within. - const TranslationParm *parms = parmstart - 1; - do - { - parms++; - if (parms->RangeStart <= v && parms->RangeEnd >= v) - break; - } - while (parms[1].RangeStart > parms[0].RangeEnd); - - // Linearly interpolate to find out which color this luminosity level gets. - int rangev = ((v - parms->RangeStart) << 8) / (parms->RangeEnd - parms->RangeStart); - int r = ((parms->Start[0] << 8) + rangev * (parms->End[0] - parms->Start[0])) >> 8; // red - int g = ((parms->Start[1] << 8) + rangev * (parms->End[1] - parms->Start[1])) >> 8; // green - int b = ((parms->Start[2] << 8) + rangev * (parms->End[2] - parms->Start[2])) >> 8; // blue - r = clamp(r, 0, 255); - g = clamp(g, 0, 255); - b = clamp(b, 0, 255); - remap.Remap[j] = ColorMatcher.Pick(r, g, b); - remap.Palette[j] = PalEntry(255,r,g,b); - } - Ranges.Push(remap); - - // Advance to the next color range. - while (parmstart[1].RangeStart > parmstart[0].RangeEnd) - { - parmstart++; - } - parmstart++; - } -} - -//========================================================================== -// -// FFont :: GetColorTranslation -// -//========================================================================== - -FRemapTable *FFont::GetColorTranslation (EColorRange range, PalEntry *color) const -{ - if (noTranslate) - { - PalEntry retcolor = PalEntry(255, 255, 255, 255); - if (range >= 0 && range < NumTextColors && range != CR_UNTRANSLATED) - { - retcolor = TranslationColors[range]; - retcolor.a = 255; - } - if (color != nullptr) *color = retcolor; - } - if (ActiveColors == 0) - return nullptr; - else if (range >= NumTextColors) - range = CR_UNTRANSLATED; - //if (range == CR_UNTRANSLATED && !translateUntranslated) return nullptr; - return &Ranges[range]; -} - -//========================================================================== -// -// FFont :: GetCharCode -// -// If the character code is in the font, returns it. If it is not, but it -// is lowercase and has an uppercase variant present, return that. Otherwise -// return -1. -// -//========================================================================== - -int FFont::GetCharCode(int code, bool needpic) const -{ - if (code < 0 && code >= -128) - { - // regular chars turn negative when the 8th bit is set. - code &= 255; - } - if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) - { - return code; - } - // Try converting lowercase characters to uppercase. - if (myislower(code)) - { - code -= 32; - if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) - { - return code; - } - } - // Try stripping accents from accented characters. - int newcode = stripaccent(code); - if (newcode != code) - { - code = newcode; - if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) - { - return code; - } - } - return -1; -} - -//========================================================================== -// -// FFont :: GetChar -// -//========================================================================== - -FTexture *FFont::GetChar (int code, int translation, int *const width, bool *redirected) const -{ - code = GetCharCode(code, false); - int xmove = SpaceWidth; - - if (code >= 0) - { - code -= FirstChar; - xmove = Chars[code].XMove; - if (Chars[code].TranslatedPic == nullptr) - { - code = GetCharCode(code + FirstChar, true); - if (code >= 0) - { - code -= FirstChar; - xmove = Chars[code].XMove; - } - } - } - if (width != nullptr) - { - *width = xmove; - } - if (code < 0) return nullptr; - - - if (translation == CR_UNTRANSLATED) - { - bool redirect = Chars[code].OriginalPic && Chars[code].OriginalPic != Chars[code].TranslatedPic; - if (redirected) *redirected = redirect; - if (redirect) - { - assert(Chars[code].OriginalPic->UseType == ETextureType::FontChar); - return Chars[code].OriginalPic; - } - } - if (redirected) *redirected = false; - assert(Chars[code].TranslatedPic->UseType == ETextureType::FontChar); - return Chars[code].TranslatedPic; -} - -//========================================================================== -// -// FFont :: GetCharWidth -// -//========================================================================== - -int FFont::GetCharWidth (int code) const -{ - code = GetCharCode(code, false); - return (code < 0) ? SpaceWidth : Chars[code - FirstChar].XMove; -} - -//========================================================================== -// -// -// -//========================================================================== - -double GetBottomAlignOffset(FFont *font, int c) -{ - int w; - FTexture *tex_zero = font->GetChar('0', CR_UNDEFINED, &w); - FTexture *texc = font->GetChar(c, CR_UNDEFINED, &w); - double offset = 0; - if (texc) offset += texc->GetDisplayTopOffsetDouble(); - if (tex_zero) offset += -tex_zero->GetDisplayTopOffsetDouble() + tex_zero->GetDisplayHeightDouble(); - return offset; -} - -//========================================================================== -// -// Find string width using this font -// -//========================================================================== - -int FFont::StringWidth(const uint8_t *string) const -{ - int w = 0; - int maxw = 0; - - while (*string) - { - auto chr = GetCharFromString(string); - if (chr == TEXTCOLOR_ESCAPE) - { - // We do not need to check for UTF-8 in here. - if (*string == '[') - { - while (*string != '\0' && *string != ']') - { - ++string; - } - } - if (*string != '\0') - { - ++string; - } - continue; - } - else if (chr == '\n') - { - if (w > maxw) - maxw = w; - w = 0; - } - else - { - w += GetCharWidth(chr) + GlobalKerning; - } - } - - return MAX(maxw, w); -} - -//========================================================================== -// -// FFont :: LoadTranslations -// -//========================================================================== - -void FFont::LoadTranslations() -{ - unsigned int count = LastChar - FirstChar + 1; - uint8_t usedcolors[256], identity[256]; - TArray Luminosity; - - memset (usedcolors, 0, 256); - for (unsigned int i = 0; i < count; i++) - { - if (Chars[i].TranslatedPic) - { - FFontChar1 *pic = static_cast(Chars[i].TranslatedPic->GetImage()); - if (pic) - { - pic->SetSourceRemap(nullptr); // Force the FFontChar1 to return the same pixels as the base texture - RecordTextureColors(pic, usedcolors); - } - } - } - - // Fixme: This needs to build a translation based on the source palette, not some intermediate 'ordered' table. - - ActiveColors = SimpleTranslation (usedcolors, PatchRemap, identity, Luminosity); - - for (unsigned int i = 0; i < count; i++) - { - if(Chars[i].TranslatedPic) - static_cast(Chars[i].TranslatedPic->GetImage())->SetSourceRemap(PatchRemap); - } - - BuildTranslations (Luminosity.Data(), identity, &TranslationParms[0][0], ActiveColors, nullptr); -} - -//========================================================================== -// -// FFont :: FFont - default constructor -// -//========================================================================== - -FFont::FFont (int lump) -{ - Lump = lump; - FontName = NAME_None; - Cursor = '_'; - noTranslate = false; - uint8_t pp = 0; - for (auto &p : PatchRemap) p = pp++; -} - -//========================================================================== -// -// FSingleLumpFont :: FSingleLumpFont -// -// Loads a FON1 or FON2 font resource. -// -//========================================================================== - -FSingleLumpFont::FSingleLumpFont (const char *name, int lump) : FFont(lump) -{ - assert(lump >= 0); - - FontName = name; - - FMemLump data1 = Wads.ReadLump (lump); - const uint8_t *data = (const uint8_t *)data1.GetMem(); - - if (data[0] == 0xE1 && data[1] == 0xE6 && data[2] == 0xD5 && data[3] == 0x1A) - { - LoadBMF(lump, data); - } - else if (data[0] != 'F' || data[1] != 'O' || data[2] != 'N' || - (data[3] != '1' && data[3] != '2')) - { - I_FatalError ("%s is not a recognizable font", name); - } - else - { - switch (data[3]) - { - case '1': - LoadFON1 (lump, data); - break; - - case '2': - LoadFON2 (lump, data); - break; - } - } - - Next = FirstFont; - FirstFont = this; -} - -//========================================================================== -// -// FSingleLumpFont :: CreateFontFromPic -// -//========================================================================== - -void FSingleLumpFont::CreateFontFromPic (FTextureID picnum) -{ - FTexture *pic = TexMan.GetTexture(picnum); - - FontHeight = pic->GetDisplayHeight (); - SpaceWidth = pic->GetDisplayWidth (); - GlobalKerning = 0; - - FirstChar = LastChar = 'A'; - Chars.Resize(1); - Chars[0].TranslatedPic = pic; - - // Only one color range. Don't bother with the others. - ActiveColors = 0; -} - -//========================================================================== -// -// FSingleLumpFont :: LoadTranslations -// -//========================================================================== - -void FSingleLumpFont::LoadTranslations() -{ - double luminosity[256]; - uint8_t identity[256]; - PalEntry local_palette[256]; - bool useidentity = true; - bool usepalette = false; - const void* ranges; - unsigned int count = LastChar - FirstChar + 1; - - switch(FontType) - { - case FONT1: - useidentity = false; - ranges = &TranslationParms[1][0]; - CheckFON1Chars (luminosity); - break; - - case BMFFONT: - case FONT2: - usepalette = true; - FixupPalette (identity, luminosity, PaletteData, RescalePalette, local_palette); - - ranges = &TranslationParms[0][0]; - break; - - default: - // Should be unreachable. - I_Error("Unknown font type in FSingleLumpFont::LoadTranslation."); - return; - } - - for(unsigned int i = 0;i < count;++i) - { - if(Chars[i].TranslatedPic) - static_cast(Chars[i].TranslatedPic->GetImage())->SetSourceRemap(PatchRemap); - } - - BuildTranslations (luminosity, useidentity ? identity : nullptr, ranges, ActiveColors, usepalette ? local_palette : nullptr); -} - -//========================================================================== -// -// FSingleLumpFont :: LoadFON1 -// -// FON1 is used for the console font. -// -//========================================================================== - -void FSingleLumpFont::LoadFON1 (int lump, const uint8_t *data) -{ - int w, h; - - Chars.Resize(256); - - w = data[4] + data[5]*256; - h = data[6] + data[7]*256; - - FontType = FONT1; - FontHeight = h; - SpaceWidth = w; - FirstChar = 0; - LastChar = 255; - GlobalKerning = 0; - translateUntranslated = true; - LoadTranslations(); -} - -//========================================================================== -// -// FSingleLumpFont :: LoadFON2 -// -// FON2 is used for everything but the console font. The console font should -// probably use FON2 as well, but oh well. -// -//========================================================================== - -void FSingleLumpFont::LoadFON2 (int lump, const uint8_t *data) -{ - int count, i, totalwidth; - uint16_t *widths; - const uint8_t *palette; - const uint8_t *data_p; - - FontType = FONT2; - FontHeight = data[4] + data[5]*256; - FirstChar = data[6]; - LastChar = data[7]; - ActiveColors = data[10]+1; - RescalePalette = data[9] == 0; - - count = LastChar - FirstChar + 1; - Chars.Resize(count); - TArray widths2(count, true); - if (data[11] & 1) - { // Font specifies a kerning value. - GlobalKerning = LittleShort(*(int16_t *)&data[12]); - widths = (uint16_t *)(data + 14); - } - else - { // Font does not specify a kerning value. - GlobalKerning = 0; - widths = (uint16_t *)(data + 12); - } - totalwidth = 0; - - if (data[8]) - { // Font is mono-spaced. - totalwidth = LittleShort(widths[0]); - for (i = 0; i < count; ++i) - { - widths2[i] = totalwidth; - } - totalwidth *= count; - palette = (uint8_t *)&widths[1]; - } - else - { // Font has varying character widths. - for (i = 0; i < count; ++i) - { - widths2[i] = LittleShort(widths[i]); - totalwidth += widths2[i]; - } - palette = (uint8_t *)(widths + i); - } - - if (FirstChar <= ' ' && LastChar >= ' ') - { - SpaceWidth = widths2[' '-FirstChar]; - } - else if (FirstChar <= 'N' && LastChar >= 'N') - { - SpaceWidth = (widths2['N' - FirstChar] + 1) / 2; - } - else - { - SpaceWidth = totalwidth * 2 / (3 * count); - } - - memcpy(PaletteData, palette, ActiveColors*3); - - data_p = palette + ActiveColors*3; - - for (i = 0; i < count; ++i) - { - int destSize = widths2[i] * FontHeight; - Chars[i].XMove = widths2[i]; - if (destSize <= 0) - { - Chars[i].TranslatedPic = nullptr; - } - else - { - Chars[i].TranslatedPic = new FImageTexture(new FFontChar2 (lump, int(data_p - data), widths2[i], FontHeight)); - Chars[i].TranslatedPic->SetUseType(ETextureType::FontChar); - TexMan.AddTexture(Chars[i].TranslatedPic); - do - { - int8_t code = *data_p++; - if (code >= 0) - { - data_p += code+1; - destSize -= code+1; - } - else if (code != -128) - { - data_p++; - destSize -= (-code)+1; - } - } while (destSize > 0); - } - if (destSize < 0) - { - i += FirstChar; - I_FatalError ("Overflow decompressing char %d (%c) of %s", i, i, FontName.GetChars()); - } - } - - LoadTranslations(); -} - -//========================================================================== -// -// FSingleLumpFont :: LoadBMF -// -// Loads a BMF font. The file format is described at -// -// -//========================================================================== - -void FSingleLumpFont::LoadBMF(int lump, const uint8_t *data) -{ - const uint8_t *chardata; - int numchars, count, totalwidth, nwidth; - int infolen; - int i, chari; - uint8_t raw_palette[256*3]; - PalEntry sort_palette[256]; - - FontType = BMFFONT; - FontHeight = data[5]; - GlobalKerning = (int8_t)data[8]; - ActiveColors = data[16]; - SpaceWidth = -1; - nwidth = -1; - RescalePalette = true; - - infolen = data[17 + ActiveColors*3]; - chardata = data + 18 + ActiveColors*3 + infolen; - numchars = chardata[0] + 256*chardata[1]; - chardata += 2; - - // Scan for lowest and highest characters defined and total font width. - FirstChar = 256; - LastChar = 0; - totalwidth = 0; - for (i = chari = 0; i < numchars; ++i, chari += 6 + chardata[chari+1] * chardata[chari+2]) - { - if ((chardata[chari+1] == 0 || chardata[chari+2] == 0) && chardata[chari+5] == 0) - { // Don't count empty characters. - continue; - } - if (chardata[chari] < FirstChar) - { - FirstChar = chardata[chari]; - } - if (chardata[chari] > LastChar) - { - LastChar = chardata[chari]; - } - totalwidth += chardata[chari+1]; - } - if (LastChar < FirstChar) - { - I_FatalError("BMF font defines no characters"); - } - count = LastChar - FirstChar + 1; - Chars.Resize(count); - // BMF palettes are only six bits per component. Fix that. - for (i = 0; i < ActiveColors*3; ++i) - { - raw_palette[i+3] = (data[17 + i] << 2) | (data[17 + i] >> 4); - } - ActiveColors++; - - // Sort the palette by increasing brightness - for (i = 0; i < ActiveColors; ++i) - { - PalEntry *pal = &sort_palette[i]; - pal->a = i; // Use alpha part to point back to original entry - pal->r = raw_palette[i*3 + 0]; - pal->g = raw_palette[i*3 + 1]; - pal->b = raw_palette[i*3 + 2]; - } - qsort(sort_palette + 1, ActiveColors - 1, sizeof(PalEntry), BMFCompare); - - // Create the PatchRemap table from the sorted "alpha" values. - PatchRemap[0] = 0; - for (i = 1; i < ActiveColors; ++i) - { - PatchRemap[sort_palette[i].a] = i; - } - - memcpy(PaletteData, raw_palette, 768); - - // Now scan through the characters again, creating glyphs for each one. - for (i = chari = 0; i < numchars; ++i, chari += 6 + chardata[chari+1] * chardata[chari+2]) - { - assert(chardata[chari] - FirstChar >= 0); - assert(chardata[chari] - FirstChar < count); - if (chardata[chari] == ' ') - { - SpaceWidth = chardata[chari+5]; - } - else if (chardata[chari] == 'N') - { - nwidth = chardata[chari+5]; - } - Chars[chardata[chari] - FirstChar].XMove = chardata[chari+5]; - if (chardata[chari+1] == 0 || chardata[chari+2] == 0) - { // Empty character: skip it. - continue; - } - auto tex = new FImageTexture(new FFontChar2(lump, int(chardata + chari + 6 - data), - chardata[chari+1], // width - chardata[chari+2], // height - -(int8_t)chardata[chari+3], // x offset - -(int8_t)chardata[chari+4] // y offset - )); - tex->SetUseType(ETextureType::FontChar); - Chars[chardata[chari] - FirstChar].TranslatedPic = tex; - TexMan.AddTexture(tex); - } - - // If the font did not define a space character, determine a suitable space width now. - if (SpaceWidth < 0) - { - if (nwidth >= 0) - { - SpaceWidth = nwidth; - } - else - { - SpaceWidth = totalwidth * 2 / (3 * count); - } - } - - FixXMoves(); - LoadTranslations(); -} - -//========================================================================== -// -// FSingleLumpFont :: BMFCompare STATIC -// -// Helper to sort BMF palettes. -// -//========================================================================== - -int FSingleLumpFont::BMFCompare(const void *a, const void *b) -{ - const PalEntry *pa = (const PalEntry *)a; - const PalEntry *pb = (const PalEntry *)b; - - return (pa->r * 299 + pa->g * 587 + pa->b * 114) - - (pb->r * 299 + pb->g * 587 + pb->b * 114); -} - -//========================================================================== -// -// FSingleLumpFont :: CheckFON1Chars -// -// Scans a FON1 resource for all the color values it uses and sets up -// some tables like SimpleTranslation. Data points to the RLE data for -// the characters. Also sets up the character textures. -// -//========================================================================== - -void FSingleLumpFont::CheckFON1Chars (double *luminosity) -{ - FMemLump memLump = Wads.ReadLump(Lump); - const uint8_t* data = (const uint8_t*) memLump.GetMem(); - - uint8_t used[256], reverse[256]; - const uint8_t *data_p; - int i, j; - - memset (used, 0, 256); - data_p = data + 8; - - for (i = 0; i < 256; ++i) - { - int destSize = SpaceWidth * FontHeight; - - if(!Chars[i].TranslatedPic) - { - Chars[i].TranslatedPic = new FImageTexture(new FFontChar2 (Lump, int(data_p - data), SpaceWidth, FontHeight)); - Chars[i].TranslatedPic->SetUseType(ETextureType::FontChar); - Chars[i].XMove = SpaceWidth; - TexMan.AddTexture(Chars[i].TranslatedPic); - } - - // Advance to next char's data and count the used colors. - do - { - int8_t code = *data_p++; - if (code >= 0) - { - destSize -= code+1; - while (code-- >= 0) - { - used[*data_p++] = 1; - } - } - else if (code != -128) - { - used[*data_p++] = 1; - destSize -= 1 - code; - } - } while (destSize > 0); - } - - memset (PatchRemap, 0, 256); - reverse[0] = 0; - for (i = 1, j = 1; i < 256; ++i) - { - if (used[i]) - { - reverse[j++] = i; - } - } - for (i = 1; i < j; ++i) - { - PatchRemap[reverse[i]] = i; - luminosity[i] = (reverse[i] - 1) / 254.0; - } - ActiveColors = j; -} - -//========================================================================== -// -// FSingleLumpFont :: FixupPalette -// -// Finds the best matches for the colors used by a FON2 font and sets up -// some tables like SimpleTranslation. -// -//========================================================================== - -void FSingleLumpFont::FixupPalette (uint8_t *identity, double *luminosity, const uint8_t *palette, bool rescale, PalEntry *out_palette) -{ - int i; - double maxlum = 0.0; - double minlum = 100000000.0; - double diver; - - identity[0] = 0; - palette += 3; // Skip the transparent color - - for (i = 1; i < ActiveColors; ++i, palette += 3) - { - int r = palette[0]; - int g = palette[1]; - int b = palette[2]; - double lum = r*0.299 + g*0.587 + b*0.114; - identity[i] = ColorMatcher.Pick (r, g, b); - luminosity[i] = lum; - out_palette[i].r = r; - out_palette[i].g = g; - out_palette[i].b = b; - out_palette[i].a = 255; - if (lum > maxlum) - maxlum = lum; - if (lum < minlum) - minlum = lum; - } - out_palette[0] = 0; - - if (rescale) - { - diver = 1.0 / (maxlum - minlum); - } - else - { - diver = 1.0 / 255.0; - } - for (i = 1; i < ActiveColors; ++i) - { - luminosity[i] = (luminosity[i] - minlum) * diver; - } -} - -//========================================================================== -// -// FSinglePicFont :: FSinglePicFont -// -// Creates a font to wrap a texture so that you can use hudmessage as if it -// were a hudpic command. It does not support translation, but animation -// is supported, unlike all the real fonts. -// -//========================================================================== - -FSinglePicFont::FSinglePicFont(const char *picname) : - FFont(-1) // Since lump is only needed for priority information we don't need to worry about this here. -{ - FTextureID picnum = TexMan.CheckForTexture (picname, ETextureType::Any); - - if (!picnum.isValid()) - { - I_FatalError ("%s is not a font or texture", picname); - } - - FTexture *pic = TexMan.GetTexture(picnum); - - FontName = picname; - FontHeight = pic->GetDisplayHeight(); - SpaceWidth = pic->GetDisplayWidth(); - GlobalKerning = 0; - FirstChar = LastChar = 'A'; - ActiveColors = 0; - PicNum = picnum; - - Next = FirstFont; - FirstFont = this; -} - -//========================================================================== -// -// FSinglePicFont :: GetChar -// -// Returns the texture if code is 'a' or 'A', otherwise nullptr. -// -//========================================================================== - -FTexture *FSinglePicFont::GetChar (int code, int translation, int *const width, bool *redirected) const -{ - *width = SpaceWidth; - if (redirected) *redirected = false; - if (code == 'a' || code == 'A') - { - return TexMan.GetPalettedTexture(PicNum, true); - } - else - { - return nullptr; - } -} - -//========================================================================== -// -// FSinglePicFont :: GetCharWidth -// -// Don't expect the text functions to work properly if I actually allowed -// the character width to vary depending on the animation frame. -// -//========================================================================== - -int FSinglePicFont::GetCharWidth (int code) const -{ - return SpaceWidth; -} - -//========================================================================== -// -// FSpecialFont :: FSpecialFont -// -//========================================================================== - -FSpecialFont::FSpecialFont (const char *name, int first, int count, FTexture **lumplist, const bool *notranslate, int lump, bool donttranslate) - : FFont(lump) -{ - int i; - TArray charlumps(count, true); - int maxyoffs; - FTexture *pic; - - memcpy(this->notranslate, notranslate, 256*sizeof(bool)); - - noTranslate = donttranslate; - FontName = name; - Chars.Resize(count); - FirstChar = first; - LastChar = first + count - 1; - FontHeight = 0; - GlobalKerning = false; - Next = FirstFont; - FirstFont = this; - - maxyoffs = 0; - - for (i = 0; i < count; i++) - { - pic = charlumps[i] = lumplist[i]; - if (pic != nullptr) - { - int height = pic->GetDisplayHeight(); - int yoffs = pic->GetDisplayTopOffset(); - - if (yoffs > maxyoffs) - { - maxyoffs = yoffs; - } - height += abs (yoffs); - if (height > FontHeight) - { - FontHeight = height; - } - } - - if (charlumps[i] != nullptr) - { - charlumps[i]->SetUseType(ETextureType::FontChar); - - Chars[i].OriginalPic = charlumps[i]; - if (!noTranslate) - { - Chars[i].TranslatedPic = new FImageTexture(new FFontChar1 (charlumps[i]->GetImage()), ""); - Chars[i].TranslatedPic->CopySize(charlumps[i]); - Chars[i].TranslatedPic->SetUseType(ETextureType::FontChar); - TexMan.AddTexture(Chars[i].TranslatedPic); - } - else Chars[i].TranslatedPic = charlumps[i]; - Chars[i].XMove = Chars[i].TranslatedPic->GetDisplayWidth(); - } - else - { - Chars[i].TranslatedPic = nullptr; - Chars[i].XMove = INT_MIN; - } - } - - // Special fonts normally don't have all characters so be careful here! - if ('N'-first >= 0 && 'N'-first < count && Chars['N' - first].TranslatedPic != nullptr) - { - SpaceWidth = (Chars['N' - first].XMove + 1) / 2; - } - else - { - SpaceWidth = 4; - } - - FixXMoves(); - - if (noTranslate) - { - ActiveColors = 0; - } - else - { - LoadTranslations(); - } -} - -//========================================================================== -// -// FSpecialFont :: LoadTranslations -// -//========================================================================== - -void FSpecialFont::LoadTranslations() -{ - int count = LastChar - FirstChar + 1; - uint8_t usedcolors[256], identity[256]; - TArray Luminosity; - int TotalColors; - int i, j; - - memset (usedcolors, 0, 256); - for (i = 0; i < count; i++) - { - if (Chars[i].TranslatedPic) - { - FFontChar1 *pic = static_cast(Chars[i].TranslatedPic->GetImage()); - if (pic) - { - pic->SetSourceRemap(nullptr); // Force the FFontChar1 to return the same pixels as the base texture - RecordTextureColors(pic, usedcolors); - } - } - } - - // exclude the non-translated colors from the translation calculation - for (i = 0; i < 256; i++) - if (notranslate[i]) - usedcolors[i] = false; - - TotalColors = ActiveColors = SimpleTranslation (usedcolors, PatchRemap, identity, Luminosity); - - // Map all untranslated colors into the table of used colors - for (i = 0; i < 256; i++) - { - if (notranslate[i]) - { - PatchRemap[i] = TotalColors; - identity[TotalColors] = i; - TotalColors++; - } - } - - for (i = 0; i < count; i++) - { - if(Chars[i].TranslatedPic) - static_cast(Chars[i].TranslatedPic->GetImage())->SetSourceRemap(PatchRemap); - } - - BuildTranslations (Luminosity.Data(), identity, &TranslationParms[0][0], TotalColors, nullptr); - - // add the untranslated colors to the Ranges tables - if (ActiveColors < TotalColors) - { - for (i = 0; i < NumTextColors; i++) - { - FRemapTable *remap = &Ranges[i]; - for (j = ActiveColors; j < TotalColors; ++j) - { - remap->Remap[j] = identity[j]; - remap->Palette[j] = GPalette.BaseColors[identity[j]]; - remap->Palette[j].a = 0xff; - } - } - } - ActiveColors = TotalColors; -} - -//========================================================================== -// -// FFont :: FixXMoves -// -// If a font has gaps in its characters, set the missing characters' -// XMoves to either SpaceWidth or the unaccented or uppercase variant's -// XMove. Missing XMoves must be initialized with INT_MIN beforehand. -// -//========================================================================== - -void FFont::FixXMoves() -{ - for (int i = 0; i <= LastChar - FirstChar; ++i) - { - if (Chars[i].XMove == INT_MIN) - { - // Try an uppercase character. - if (myislower(i + FirstChar)) - { - int upper = i - 32; - if (upper >= 0) - { - Chars[i].XMove = Chars[upper].XMove; - continue; - } - } - // Try an unnaccented character. - int noaccent = stripaccent(i + FirstChar); - if (noaccent != i + FirstChar) - { - noaccent -= FirstChar; - if (noaccent >= 0) - { - Chars[i].XMove = Chars[noaccent].XMove; - continue; - } - } - Chars[i].XMove = SpaceWidth; - } - } -} - - -//========================================================================== -// -// V_InitCustomFonts -// -// Initialize a list of custom multipatch fonts -// -//========================================================================== - -void V_InitCustomFonts() -{ - FScanner sc; - FTexture *lumplist[256]; - bool notranslate[256]; - bool donttranslate; - FString namebuffer, templatebuf; - int i; - int llump,lastlump=0; - int format; - int start; - int first; - int count; - int spacewidth; - char cursor = '_'; - - while ((llump = Wads.FindLump ("FONTDEFS", &lastlump)) != -1) - { - sc.OpenLumpNum(llump); - while (sc.GetString()) - { - memset (lumplist, 0, sizeof(lumplist)); - memset (notranslate, 0, sizeof(notranslate)); - donttranslate = false; - namebuffer = sc.String; - format = 0; - start = 33; - first = 33; - count = 223; - spacewidth = -1; - - sc.MustGetStringName ("{"); - while (!sc.CheckString ("}")) - { - sc.MustGetString(); - if (sc.Compare ("TEMPLATE")) - { - if (format == 2) goto wrong; - sc.MustGetString(); - templatebuf = sc.String; - format = 1; - } - else if (sc.Compare ("BASE")) - { - if (format == 2) goto wrong; - sc.MustGetNumber(); - start = sc.Number; - format = 1; - } - else if (sc.Compare ("FIRST")) - { - if (format == 2) goto wrong; - sc.MustGetNumber(); - first = sc.Number; - format = 1; - } - else if (sc.Compare ("COUNT")) - { - if (format == 2) goto wrong; - sc.MustGetNumber(); - count = sc.Number; - format = 1; - } - else if (sc.Compare ("CURSOR")) - { - sc.MustGetString(); - cursor = sc.String[0]; - } - else if (sc.Compare ("SPACEWIDTH")) - { - if (format == 2) goto wrong; - sc.MustGetNumber(); - spacewidth = sc.Number; - format = 1; - } - else if (sc.Compare("DONTTRANSLATE")) - { - donttranslate = true; - } - else if (sc.Compare ("NOTRANSLATION")) - { - if (format == 1) goto wrong; - while (sc.CheckNumber() && !sc.Crossed) - { - if (sc.Number >= 0 && sc.Number < 256) - notranslate[sc.Number] = true; - } - format = 2; - } - else - { - if (format == 1) goto wrong; - FTexture **p = &lumplist[*(unsigned char*)sc.String]; - sc.MustGetString(); - FTextureID texid = TexMan.CheckForTexture(sc.String, ETextureType::MiscPatch); - if (texid.Exists()) - { - *p = TexMan.GetTexture(texid); - } - else if (Wads.GetLumpFile(sc.LumpNum) >= Wads.GetIwadNum()) - { - // Print a message only if this isn't in zdoom.pk3 - sc.ScriptMessage("%s: Unable to find texture in font definition for %s", sc.String, namebuffer.GetChars()); - } - format = 2; - } - } - if (format == 1) - { - FFont *fnt = new FFont (namebuffer, templatebuf, first, count, start, llump, spacewidth, donttranslate); - fnt->SetCursor(cursor); - } - else if (format == 2) - { - for (i = 0; i < 256; i++) - { - if (lumplist[i] != nullptr) - { - first = i; - break; - } - } - for (i = 255; i >= 0; i--) - { - if (lumplist[i] != nullptr) - { - count = i - first + 1; - break; - } - } - if (count > 0) - { - FFont *fnt = new FSpecialFont (namebuffer, first, count, &lumplist[first], notranslate, llump, donttranslate); - fnt->SetCursor(cursor); - } - } - else goto wrong; - } - sc.Close(); - } - return; - -wrong: - sc.ScriptError ("Invalid combination of properties in font '%s'", namebuffer.GetChars()); -} - -//========================================================================== -// -// V_InitFontColors -// -// Reads the list of color translation definitions into memory. -// -//========================================================================== - -void V_InitFontColors () -{ - TArray names; - int lump, lastlump = 0; - TranslationParm tparm = { 0, 0, {0}, {0} }; // Silence GCC (for real with -Wextra ) - TArray parms; - TArray parminfo; - TArray colorinfo; - int c, parmchoice; - TempParmInfo info; - TempColorInfo cinfo; - PalEntry logcolor; - unsigned int i, j; - int k, index; - - info.Index = -1; - - TranslationParms[0].Clear(); - TranslationParms[1].Clear(); - TranslationLookup.Clear(); - TranslationColors.Clear(); - - while ((lump = Wads.FindLump ("TEXTCOLO", &lastlump)) != -1) - { - if (gameinfo.flags & GI_NOTEXTCOLOR) - { - // Chex3 contains a bad TEXTCOLO lump, probably to force all text to be green. - // This renders the Gray, Gold, Red and Yellow color range inoperable, some of - // which are used by the menu. So we have no choice but to skip this lump so that - // all colors work properly. - // The text colors should be the end user's choice anyway. - if (Wads.GetLumpFile(lump) == Wads.GetIwadNum()) continue; - } - FScanner sc(lump); - while (sc.GetString()) - { - names.Clear(); - - logcolor = DEFAULT_LOG_COLOR; - - // Everything until the '{' is considered a valid name for the - // color range. - names.Push (sc.String); - while (sc.MustGetString(), !sc.Compare ("{")) - { - if (names[0] == NAME_Untranslated) - { - sc.ScriptError ("The \"untranslated\" color may not have any other names"); - } - names.Push (sc.String); - } - - parmchoice = 0; - info.StartParm[0] = parms.Size(); - info.StartParm[1] = 0; - info.ParmLen[1] = info.ParmLen[0] = 0; - tparm.RangeEnd = tparm.RangeStart = -1; - - while (sc.MustGetString(), !sc.Compare ("}")) - { - if (sc.Compare ("Console:")) - { - if (parmchoice == 1) - { - sc.ScriptError ("Each color may only have one set of console ranges"); - } - parmchoice = 1; - info.StartParm[1] = parms.Size(); - info.ParmLen[0] = info.StartParm[1] - info.StartParm[0]; - tparm.RangeEnd = tparm.RangeStart = -1; - } - else if (sc.Compare ("Flat:")) - { - sc.MustGetString(); - logcolor = V_GetColor (nullptr, sc); - } - else - { - // Get first color - c = V_GetColor (nullptr, sc); - tparm.Start[0] = RPART(c); - tparm.Start[1] = GPART(c); - tparm.Start[2] = BPART(c); - - // Get second color - sc.MustGetString(); - c = V_GetColor (nullptr, sc); - tparm.End[0] = RPART(c); - tparm.End[1] = GPART(c); - tparm.End[2] = BPART(c); - - // Check for range specifier - if (sc.CheckNumber()) - { - if (tparm.RangeStart == -1 && sc.Number != 0) - { - sc.ScriptError ("The first color range must start at position 0"); - } - if (sc.Number < 0 || sc.Number > 256) - { - sc.ScriptError ("The color range must be within positions [0,256]"); - } - if (sc.Number <= tparm.RangeEnd) - { - sc.ScriptError ("The color range must not start before the previous one ends"); - } - tparm.RangeStart = sc.Number; - - sc.MustGetNumber(); - if (sc.Number < 0 || sc.Number > 256) - { - sc.ScriptError ("The color range must be within positions [0,256]"); - } - if (sc.Number <= tparm.RangeStart) - { - sc.ScriptError ("The color range end position must be larger than the start position"); - } - tparm.RangeEnd = sc.Number; - } - else - { - tparm.RangeStart = tparm.RangeEnd + 1; - tparm.RangeEnd = 256; - if (tparm.RangeStart >= tparm.RangeEnd) - { - sc.ScriptError ("The color has too many ranges"); - } - } - parms.Push (tparm); - } - } - info.ParmLen[parmchoice] = parms.Size() - info.StartParm[parmchoice]; - if (info.ParmLen[0] == 0) - { - if (names[0] != NAME_Untranslated) - { - sc.ScriptError ("There must be at least one normal range for a color"); - } - } - else - { - if (names[0] == NAME_Untranslated) - { - sc.ScriptError ("The \"untranslated\" color must be left undefined"); - } - } - if (info.ParmLen[1] == 0 && names[0] != NAME_Untranslated) - { // If a console translation is unspecified, make it white, since the console - // font has no color information stored with it. - tparm.RangeStart = 0; - tparm.RangeEnd = 256; - tparm.Start[2] = tparm.Start[1] = tparm.Start[0] = 0; - tparm.End[2] = tparm.End[1] = tparm.End[0] = 255; - info.StartParm[1] = parms.Push (tparm); - info.ParmLen[1] = 1; - } - cinfo.ParmInfo = parminfo.Push (info); - // Record this color information for each name it goes by - for (i = 0; i < names.Size(); ++i) - { - // Redefine duplicates in-place - for (j = 0; j < colorinfo.Size(); ++j) - { - if (colorinfo[j].Name == names[i]) - { - colorinfo[j].ParmInfo = cinfo.ParmInfo; - colorinfo[j].LogColor = logcolor; - break; - } - } - if (j == colorinfo.Size()) - { - cinfo.Name = names[i]; - cinfo.LogColor = logcolor; - colorinfo.Push (cinfo); - } - } - } - } - // Make permananent copies of all the color information we found. - for (i = 0, index = 0; i < colorinfo.Size(); ++i) - { - TranslationMap tmap; - TempParmInfo *pinfo; - - tmap.Name = colorinfo[i].Name; - pinfo = &parminfo[colorinfo[i].ParmInfo]; - if (pinfo->Index < 0) - { - // Write out the set of remappings for this color. - for (k = 0; k < 2; ++k) - { - for (j = 0; j < pinfo->ParmLen[k]; ++j) - { - TranslationParms[k].Push (parms[pinfo->StartParm[k] + j]); - } - } - TranslationColors.Push (colorinfo[i].LogColor); - pinfo->Index = index++; - } - tmap.Number = pinfo->Index; - TranslationLookup.Push (tmap); - } - // Leave a terminating marker at the ends of the lists. - tparm.RangeStart = -1; - TranslationParms[0].Push (tparm); - TranslationParms[1].Push (tparm); - // Sort the translation lookups for fast binary searching. - qsort (&TranslationLookup[0], TranslationLookup.Size(), sizeof(TranslationLookup[0]), TranslationMapCompare); - - NumTextColors = index; - assert (NumTextColors >= NUM_TEXT_COLORS); -} - -//========================================================================== -// -// TranslationMapCompare -// -//========================================================================== - -static int TranslationMapCompare (const void *a, const void *b) -{ - return int(((const TranslationMap *)a)->Name) - int(((const TranslationMap *)b)->Name); -} - -//========================================================================== -// -// V_FindFontColor -// -// Returns the color number for a particular named color range. -// -//========================================================================== - -EColorRange V_FindFontColor (FName name) -{ - int min = 0, max = TranslationLookup.Size() - 1; - - while (min <= max) - { - unsigned int mid = (min + max) / 2; - const TranslationMap *probe = &TranslationLookup[mid]; - if (probe->Name == name) - { - return EColorRange(probe->Number); - } - else if (probe->Name < name) - { - min = mid + 1; - } - else - { - max = mid - 1; - } - } - return CR_UNTRANSLATED; -} - -//========================================================================== -// -// V_LogColorFromColorRange -// -// Returns the color to use for text in the startup/error log window. -// -//========================================================================== - -PalEntry V_LogColorFromColorRange (EColorRange range) -{ - if ((unsigned int)range >= TranslationColors.Size()) - { // Return default color - return DEFAULT_LOG_COLOR; - } - return TranslationColors[range]; -} - -//========================================================================== -// -// V_ParseFontColor -// -// Given a pointer to a color identifier (presumably just after a color -// escape character), return the color it identifies and advances -// color_value to just past it. -// -//========================================================================== - -EColorRange V_ParseFontColor (const uint8_t *&color_value, int normalcolor, int boldcolor) -{ - const uint8_t *ch = color_value; - int newcolor = *ch++; - - if (newcolor == '-') // Normal - { - newcolor = normalcolor; - } - else if (newcolor == '+') // Bold - { - newcolor = boldcolor; - } - else if (newcolor == '!') // Team chat - { - newcolor = PrintColors[PRINT_TEAMCHAT]; - } - else if (newcolor == '*') // Chat - { - newcolor = PrintColors[PRINT_CHAT]; - } - else if (newcolor == '[') // Named - { - const uint8_t *namestart = ch; - while (*ch != ']' && *ch != '\0') - { - ch++; - } - FName rangename((const char *)namestart, int(ch - namestart), true); - if (*ch != '\0') - { - ch++; - } - newcolor = V_FindFontColor (rangename); - } - else if (newcolor >= 'A' && newcolor < NUM_TEXT_COLORS + 'A') // Standard, uppercase - { - newcolor -= 'A'; - } - else if (newcolor >= 'a' && newcolor < NUM_TEXT_COLORS + 'a') // Standard, lowercase - { - newcolor -= 'a'; - } - else // Incomplete! - { - color_value = ch - (newcolor == '\0'); - return CR_UNDEFINED; - } - color_value = ch; - return EColorRange(newcolor); -} - -//========================================================================== -// -// V_InitFonts -// -//========================================================================== - -void V_InitFonts() -{ - V_InitCustomFonts (); - - // load the heads-up font - if (!(SmallFont = FFont::FindFont("SmallFont"))) - { - int i; - - if ((i = Wads.CheckNumForName("SMALLFNT")) >= 0) - { - SmallFont = new FSingleLumpFont("SmallFont", i); - } - else if (Wads.CheckNumForName ("FONTA_S") >= 0) - { - SmallFont = new FFont ("SmallFont", "FONTA%02u", HU_FONTSTART, HU_FONTSIZE, 1, -1); - SmallFont->SetCursor('['); - } - else - { - SmallFont = new FFont ("SmallFont", "STCFN%.3d", HU_FONTSTART, HU_FONTSIZE, HU_FONTSTART, -1); - } - } - if (!(SmallFont2 = FFont::FindFont("SmallFont2"))) // Only used by Strife - { - if (Wads.CheckNumForName ("STBFN033", ns_graphics) >= 0) - { - SmallFont2 = new FFont ("SmallFont2", "STBFN%.3d", HU_FONTSTART, HU_FONTSIZE, HU_FONTSTART, -1); - } - else - { - SmallFont2 = SmallFont; - } - } - if (!(BigFont = FFont::FindFont("BigFont"))) - { - int lump = Wads.CheckNumForName("BIGFONT"); - if (lump >= 0) - { - BigFont = new FSingleLumpFont("BigFont", lump); - } - else if (gameinfo.gametype & GAME_DoomChex) - { - BigFont = new FSingleLumpFont ("BigFont", Wads.GetNumForName ("DBIGFONT")); - } - else if (gameinfo.gametype == GAME_Strife) - { - BigFont = new FSingleLumpFont ("BigFont", Wads.GetNumForName ("SBIGFONT")); - } - else - { - lump = Wads.CheckNumForName("HBIGFONT"); - if (lump >= 0) - { - BigFont = new FSingleLumpFont("BigFont", lump); - } - else - { - BigFont = new FFont ("BigFont", "FONTB%02u", HU_FONTSTART, HU_FONTSIZE, 1, -1); - } - } - } - if (!(ConFont = FFont::FindFont("ConsoleFont"))) - { - ConFont = new FSingleLumpFont ("ConsoleFont", Wads.GetNumForName ("CONFONT")); - } - if (!(IntermissionFont = FFont::FindFont("IntermissionFont"))) - { - if (gameinfo.gametype & GAME_DoomChex) - { - IntermissionFont = FFont::FindFont("IntermissionFont_Doom"); - } - if (IntermissionFont == nullptr) - { - IntermissionFont = BigFont; - } - } -} - -void V_ClearFonts() -{ - while (FFont::FirstFont != nullptr) - { - delete FFont::FirstFont; - } - FFont::FirstFont = nullptr; - SmallFont = SmallFont2 = BigFont = ConFont = IntermissionFont = nullptr; -} - diff --git a/src/v_pfx.cpp b/src/v_pfx.cpp deleted file mode 100644 index 14a50c7c97..0000000000 --- a/src/v_pfx.cpp +++ /dev/null @@ -1,687 +0,0 @@ -/* -** v_pfx.cpp -** Pixel format conversion routines -** -**--------------------------------------------------------------------------- -** Copyright 1998-2006 Randy Heit -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- -** -*/ - -#include "doomtype.h" -#include "doomerrors.h" -#include "v_pfx.h" - -PfxUnion GPfxPal; -PfxState GPfx; - -static bool AnalyzeMask (uint32_t mask, uint8_t *shift); - -static void Palette16Generic (const PalEntry *pal); -static void Palette16R5G5B5 (const PalEntry *pal); -static void Palette16R5G6B5 (const PalEntry *pal); -static void Palette32Generic (const PalEntry *pal); -static void Palette32RGB (const PalEntry *pal); -static void Palette32BGR (const PalEntry *pal); - -static void Scale8 (uint8_t *src, int srcpitch, - void *destin, int destpitch, int destwidth, int destheight, - fixed_t xstep, fixed_t ystep, fixed_t xfrac, fixed_t yfrac); -static void Convert8 (uint8_t *src, int srcpitch, - void *destin, int destpitch, int destwidth, int destheight, - fixed_t xstep, fixed_t ystep, fixed_t xfrac, fixed_t yfrac); -static void Convert16 (uint8_t *src, int srcpitch, - void *destin, int destpitch, int destwidth, int destheight, - fixed_t xstep, fixed_t ystep, fixed_t xfrac, fixed_t yfrac); -static void Convert24 (uint8_t *src, int srcpitch, - void *destin, int destpitch, int destwidth, int destheight, - fixed_t xstep, fixed_t ystep, fixed_t xfrac, fixed_t yfrac); -static void Convert32 (uint8_t *src, int srcpitch, - void *destin, int destpitch, int destwidth, int destheight, - fixed_t xstep, fixed_t ystep, fixed_t xfrac, fixed_t yfrac); - -void PfxState::SetFormat (int bits, uint32_t redMask, uint32_t greenMask, uint32_t blueMask) -{ - switch (bits) - { - case -8: - Convert = Scale8; - SetPalette = NULL; - break; - - case 8: - Convert = Convert8; - SetPalette = NULL; - break; - - case 16: - if (redMask == 0x7c00 && greenMask == 0x03e0 && blueMask == 0x001f) - { - SetPalette = Palette16R5G5B5; - } - else if (redMask == 0xf800 && greenMask == 0x07e0 && blueMask == 0x001f) - { - SetPalette = Palette16R5G6B5; - } - else - { - SetPalette = Palette16Generic; - } - Convert = Convert16; - Masks.Bits16.Red = (uint16_t)redMask; - Masks.Bits16.Green = (uint16_t)greenMask; - Masks.Bits16.Blue = (uint16_t)blueMask; - break; - - case 24: - if (redMask == 0xff0000 && greenMask == 0x00ff00 && blueMask == 0x0000ff) - { - SetPalette = Palette32RGB; - Convert = Convert24; - } - else if (redMask == 0x0000ff && greenMask == 0x00ff00 && blueMask == 0xff0000) - { - SetPalette = Palette32BGR; - Convert = Convert24; - } - else - { - I_FatalError ("24-bit displays are only supported if they are RGB or BGR"); - }; - break; - - case 32: - if (redMask == 0xff0000 && greenMask == 0x00ff00 && blueMask == 0x0000ff) - { - SetPalette = Palette32RGB; - } - else if (redMask == 0x0000ff && greenMask == 0x00ff00 && blueMask == 0xff0000) - { - SetPalette = Palette32BGR; - } - else - { - SetPalette = Palette32Generic; - } - Convert = Convert32; - Masks.Bits32.Red = redMask; - Masks.Bits32.Green = greenMask; - Masks.Bits32.Blue = blueMask; - break; - - default: - I_FatalError ("Can't draw to %d-bit displays", bits); - } - if (bits != 8 && bits != -8) - { - RedLeft = AnalyzeMask (redMask, &RedShift); - GreenLeft = AnalyzeMask (greenMask, &GreenShift); - BlueLeft = AnalyzeMask (blueMask, &BlueShift); - } -} - -static bool AnalyzeMask (uint32_t mask, uint8_t *shiftout) -{ - uint8_t shift = 0; - - if (mask >= 0xff) - { - while (mask > 0xff) - { - shift++; - mask >>= 1; - } - *shiftout = shift; - return true; - } - else - { - while (mask < 0xff) - { - shift++; - mask <<= 1; - } - *shiftout = shift; - return false; - } -} - -// Palette converters ------------------------------------------------------ - -static void Palette16Generic (const PalEntry *pal) -{ - uint16_t *p16; - int i; - - for (p16 = GPfxPal.Pal16, i = 256; i != 0; i--, pal++, p16++) - { - uint16_t rpart, gpart, bpart; - - if (GPfx.RedLeft) rpart = pal->r << GPfx.RedShift; - else rpart = pal->r >> GPfx.RedShift; - - if (GPfx.GreenLeft) gpart = pal->g << GPfx.GreenShift; - else gpart = pal->g >> GPfx.GreenShift; - - if (GPfx.BlueLeft) bpart = pal->b << GPfx.BlueShift; - else bpart = pal->b >> GPfx.BlueShift; - - *p16 = (rpart & GPfx.Masks.Bits16.Red) | - (gpart & GPfx.Masks.Bits16.Green) | - (bpart & GPfx.Masks.Bits16.Blue); - } -} - -static void Palette16R5G5B5 (const PalEntry *pal) -{ - uint16_t *p16; - int i; - - for (p16 = GPfxPal.Pal16, i = 256; i != 0; i--, pal++, p16++) - { - *p16 = ((pal->r << 7) & 0x7c00) | - ((pal->g << 2) & 0x03e0) | - ((pal->b >> 3) & 0x001f); - } -} - -static void Palette16R5G6B5 (const PalEntry *pal) -{ - uint16_t *p16; - int i; - - for (p16 = GPfxPal.Pal16, i = 256; i != 0; i--, pal++, p16++) - { - *p16 = ((pal->r << 8) & 0xf800) | - ((pal->g << 3) & 0x07e0) | - ((pal->b >> 3) & 0x001f); - } -} - -static void Palette32Generic (const PalEntry *pal) -{ - uint32_t *p32; - int i; - - for (p32 = GPfxPal.Pal32, i = 256; i != 0; i--, pal++, p32++) - { - uint32_t rpart, gpart, bpart; - - if (GPfx.RedLeft) rpart = pal->r << GPfx.RedShift; - else rpart = pal->r >> GPfx.RedShift; - - if (GPfx.GreenLeft) gpart = pal->g << GPfx.GreenShift; - else gpart = pal->g >> GPfx.GreenShift; - - if (GPfx.BlueLeft) bpart = pal->b << GPfx.BlueShift; - else bpart = pal->b >> GPfx.BlueShift; - - *p32 = (rpart & GPfx.Masks.Bits32.Red) | - (gpart & GPfx.Masks.Bits32.Green) | - (bpart & GPfx.Masks.Bits32.Blue); - } -} - -static void Palette32RGB (const PalEntry *pal) -{ - memcpy (GPfxPal.Pal32, pal, 256*4); -} - -static void Palette32BGR (const PalEntry *pal) -{ - uint32_t *p32; - int i; - - for (p32 = GPfxPal.Pal32, i = 256; i != 0; i--, pal++, p32++) - { - *p32 = (pal->r) | (pal->g << 8) | (pal->b << 16); - } -} - -// Bitmap converters ------------------------------------------------------- - -static void Scale8 (uint8_t *src, int srcpitch, - void *destin, int destpitch, int destwidth, int destheight, - fixed_t xstep, fixed_t ystep, fixed_t xfrac, fixed_t yfrac) -{ - if ((destwidth | destheight) == 0) - { - return; - } - - int x, y, savedx; - uint8_t *dest = (uint8_t *)destin; - - if (xstep == FRACUNIT && ystep == FRACUNIT) - { - for (y = destheight; y != 0; y--) - { - memcpy(dest, src, destwidth); - dest += destpitch; - src += srcpitch; - } - } - else if (xstep == FRACUNIT/2 && ystep == FRACUNIT/2) - { - uint8_t *dest2 = dest + destpitch; - destpitch = destpitch * 2 - destwidth; - srcpitch -= destwidth / 2; - for (y = destheight / 2; y != 0; --y) - { - for (x = destwidth / 2; x != 0; --x) - { - uint8_t foo = src[0]; - dest[0] = foo; - dest[1] = foo; - dest2[0] = foo; - dest2[1] = foo; - dest += 2; - dest2 += 2; - src += 1; - } - dest += destpitch; - dest2 += destpitch; - src += srcpitch; - } - } - else if (xstep == FRACUNIT/4 && ystep == FRACUNIT/4) - { - int gap = destpitch * 4 - destwidth; - srcpitch -= destwidth / 4; - for (y = destheight / 4; y != 0; --y) - { - for (uint8_t *end = dest + destpitch; dest != end; dest += 4) - { - uint8_t foo = src[0]; - dest[0] = foo; - dest[1] = foo; - dest[2] = foo; - dest[3] = foo; - dest[0 + destpitch] = foo; - dest[1 + destpitch] = foo; - dest[2 + destpitch] = foo; - dest[3 + destpitch] = foo; - dest[0 + destpitch*2] = foo; - dest[1 + destpitch*2] = foo; - dest[2 + destpitch*2] = foo; - dest[3 + destpitch*2] = foo; - dest[0 + destpitch*3] = foo; - dest[1 + destpitch*3] = foo; - dest[2 + destpitch*3] = foo; - dest[3 + destpitch*3] = foo; - src += 1; - } - dest += gap; - src += srcpitch; - } - } - else - { - destpitch -= destwidth; - for (y = destheight; y != 0; y--) - { - fixed_t xf = xfrac; - x = destwidth; - while (((size_t)dest & 3) && x != 0) - { - *dest++ = src[xf >> FRACBITS]; - xf += xstep; - x--; - } - for (savedx = x, x >>= 2; x != 0; x--) - { - uint32_t work; - -#ifdef __BIG_ENDIAN__ - work = src[xf >> FRACBITS] << 24; xf += xstep; - work |= src[xf >> FRACBITS] << 16; xf += xstep; - work |= src[xf >> FRACBITS] << 8; xf += xstep; - work |= src[xf >> FRACBITS]; xf += xstep; -#else - work = src[xf >> FRACBITS]; xf += xstep; - work |= src[xf >> FRACBITS] << 8; xf += xstep; - work |= src[xf >> FRACBITS] << 16; xf += xstep; - work |= src[xf >> FRACBITS] << 24; xf += xstep; -#endif - *(uint32_t *)dest = work; - dest += 4; - } - for (savedx &= 3; savedx != 0; savedx--, xf += xstep) - { - *dest++ = src[xf >> FRACBITS]; - } - yfrac += ystep; - while (yfrac >= FRACUNIT) - { - yfrac -= FRACUNIT; - src += srcpitch; - } - dest += destpitch; - } - } -} - -static void Convert8 (uint8_t *src, int srcpitch, - void *destin, int destpitch, int destwidth, int destheight, - fixed_t xstep, fixed_t ystep, fixed_t xfrac, fixed_t yfrac) -{ - if ((destwidth | destheight) == 0) - { - return; - } - - int x, y, savedx; - uint8_t *dest = (uint8_t *)destin; - - destpitch -= destwidth; - if (xstep == FRACUNIT && ystep == FRACUNIT) - { - srcpitch -= destwidth; - for (y = destheight; y != 0; y--) - { - x = destwidth; - while (((size_t)dest & 3) && x != 0) - { - *dest++ = GPfxPal.Pal8[*src++]; - x--; - } - for (savedx = x, x >>= 2; x != 0; x--) - { - *(uint32_t *)dest = -#ifdef __BIG_ENDIAN__ - (GPfxPal.Pal8[src[0]] << 24) | - (GPfxPal.Pal8[src[1]] << 16) | - (GPfxPal.Pal8[src[2]] << 8) | - (GPfxPal.Pal8[src[3]]); -#else - (GPfxPal.Pal8[src[0]]) | - (GPfxPal.Pal8[src[1]] << 8) | - (GPfxPal.Pal8[src[2]] << 16) | - (GPfxPal.Pal8[src[3]] << 24); -#endif - dest += 4; - src += 4; - } - for (savedx &= 3; savedx != 0; savedx--) - { - *dest++ = GPfxPal.Pal8[*src++]; - } - dest += destpitch; - src += srcpitch; - } - } - else - { - for (y = destheight; y != 0; y--) - { - fixed_t xf = xfrac; - x = destwidth; - while (((size_t)dest & 3) && x != 0) - { - *dest++ = GPfxPal.Pal8[src[xf >> FRACBITS]]; - xf += xstep; - x--; - } - for (savedx = x, x >>= 2; x != 0; x--) - { - uint32_t work; - -#ifdef __BIG_ENDIAN__ - work = GPfxPal.Pal8[src[xf >> FRACBITS]] << 24; xf += xstep; - work |= GPfxPal.Pal8[src[xf >> FRACBITS]] << 16; xf += xstep; - work |= GPfxPal.Pal8[src[xf >> FRACBITS]] << 8; xf += xstep; - work |= GPfxPal.Pal8[src[xf >> FRACBITS]]; xf += xstep; -#else - work = GPfxPal.Pal8[src[xf >> FRACBITS]]; xf += xstep; - work |= GPfxPal.Pal8[src[xf >> FRACBITS]] << 8; xf += xstep; - work |= GPfxPal.Pal8[src[xf >> FRACBITS]] << 16; xf += xstep; - work |= GPfxPal.Pal8[src[xf >> FRACBITS]] << 24; xf += xstep; -#endif - *(uint32_t *)dest = work; - dest += 4; - } - for (savedx &= 3; savedx != 0; savedx--, xf += xstep) - { - *dest++ = GPfxPal.Pal8[src[xf >> FRACBITS]]; - } - yfrac += ystep; - while (yfrac >= FRACUNIT) - { - yfrac -= FRACUNIT; - src += srcpitch; - } - dest += destpitch; - } - } -} - -static void Convert16 (uint8_t *src, int srcpitch, - void *destin, int destpitch, int destwidth, int destheight, - fixed_t xstep, fixed_t ystep, fixed_t xfrac, fixed_t yfrac) -{ - if ((destwidth | destheight) == 0) - { - return; - } - - int x, y, savedx; - uint16_t *dest = (uint16_t *)destin; - - destpitch = (destpitch >> 1) - destwidth; - if (xstep == FRACUNIT && ystep == FRACUNIT) - { - srcpitch -= destwidth; - for (y = destheight; y != 0; y--) - { - x = destwidth; - if ((size_t)dest & 1) - { - x--; - *dest++ = GPfxPal.Pal16[*src++]; - } - for (savedx = x, x >>= 1; x != 0; x--) - { - *(uint32_t *)dest = -#ifdef __BIG_ENDIAN__ - (GPfxPal.Pal16[src[0]] << 16) | - (GPfxPal.Pal16[src[1]]); -#else - (GPfxPal.Pal16[src[0]]) | - (GPfxPal.Pal16[src[1]] << 16); -#endif - dest += 2; - src += 2; - } - if (savedx & 1) - { - *dest++ = GPfxPal.Pal16[*src++]; - } - dest += destpitch; - src += srcpitch; - } - } - else - { - for (y = destheight; y != 0; y--) - { - fixed_t xf = xfrac; - x = destwidth; - if ((size_t)dest & 1) - { - *dest++ = GPfxPal.Pal16[src[xf >> FRACBITS]]; - xf += xstep; - x--; - } - for (savedx = x, x >>= 1; x != 0; x--) - { - uint32_t work; - -#ifdef __BIG_ENDIAN__ - work = GPfxPal.Pal16[src[xf >> FRACBITS]] << 16; xf += xstep; - work |= GPfxPal.Pal16[src[xf >> FRACBITS]]; xf += xstep; -#else - work = GPfxPal.Pal16[src[xf >> FRACBITS]]; xf += xstep; - work |= GPfxPal.Pal16[src[xf >> FRACBITS]] << 16; xf += xstep; -#endif - *(uint32_t *)dest = work; - dest += 2; - } - if (savedx & 1) - { - *dest++ = GPfxPal.Pal16[src[xf >> FRACBITS]]; - } - yfrac += ystep; - while (yfrac >= FRACUNIT) - { - yfrac -= FRACUNIT; - src += srcpitch; - } - dest += destpitch; - } - } -} - -static void Convert24 (uint8_t *src, int srcpitch, - void *destin, int destpitch, int destwidth, int destheight, - fixed_t xstep, fixed_t ystep, fixed_t xfrac, fixed_t yfrac) -{ - if ((destwidth | destheight) == 0) - { - return; - } - - int x, y; - uint8_t *dest = (uint8_t *)destin; - - destpitch = destpitch - destwidth*3; - if (xstep == FRACUNIT && ystep == FRACUNIT) - { - srcpitch -= destwidth; - for (y = destheight; y != 0; y--) - { - for (x = destwidth; x != 0; x--) - { - uint8_t *pe = GPfxPal.Pal24[src[0]]; - dest[0] = pe[0]; - dest[1] = pe[1]; - dest[2] = pe[2]; - dest += 3; - src++; - } - dest += destpitch; - src += srcpitch; - } - } - else - { - for (y = destheight; y != 0; y--) - { - fixed_t xf = xfrac; - for (x = destwidth; x != 0; x--) - { - uint8_t *pe = GPfxPal.Pal24[src[xf >> FRACBITS]]; - dest[0] = pe[0]; - dest[1] = pe[1]; - dest[2] = pe[2]; - xf += xstep; - dest += 2; - } - yfrac += ystep; - while (yfrac >= FRACUNIT) - { - yfrac -= FRACUNIT; - src += srcpitch; - } - dest += destpitch; - } - } -} - -static void Convert32 (uint8_t *src, int srcpitch, - void *destin, int destpitch, int destwidth, int destheight, - fixed_t xstep, fixed_t ystep, fixed_t xfrac, fixed_t yfrac) -{ - if ((destwidth | destheight) == 0) - { - return; - } - - int x, y, savedx; - uint32_t *dest = (uint32_t *)destin; - - destpitch = (destpitch >> 2) - destwidth; - if (xstep == FRACUNIT && ystep == FRACUNIT) - { - srcpitch -= destwidth; - for (y = destheight; y != 0; y--) - { - for (savedx = x = destwidth, x >>= 3; x != 0; x--) - { - dest[0] = GPfxPal.Pal32[src[0]]; - dest[1] = GPfxPal.Pal32[src[1]]; - dest[2] = GPfxPal.Pal32[src[2]]; - dest[3] = GPfxPal.Pal32[src[3]]; - dest[4] = GPfxPal.Pal32[src[4]]; - dest[5] = GPfxPal.Pal32[src[5]]; - dest[6] = GPfxPal.Pal32[src[6]]; - dest[7] = GPfxPal.Pal32[src[7]]; - dest += 8; - src += 8; - } - for (x = savedx & 7; x != 0; x--) - { - *dest++ = GPfxPal.Pal32[*src++]; - } - dest += destpitch; - src += srcpitch; - } - } - else - { - for (y = destheight; y != 0; y--) - { - fixed_t xf = xfrac; - for (savedx = x = destwidth, x >>= 1; x != 0; x--) - { - dest[0] = GPfxPal.Pal32[src[xf >> FRACBITS]]; xf += xstep; - dest[1] = GPfxPal.Pal32[src[xf >> FRACBITS]]; xf += xstep; - dest += 2; - } - if (savedx & 1) - { - *dest++ = GPfxPal.Pal32[src[xf >> FRACBITS]]; - } - yfrac += ystep; - while (yfrac >= FRACUNIT) - { - yfrac -= FRACUNIT; - src += srcpitch; - } - dest += destpitch; - } - } -} diff --git a/src/v_pfx.h b/src/v_pfx.h deleted file mode 100644 index 5ae1af0659..0000000000 --- a/src/v_pfx.h +++ /dev/null @@ -1,83 +0,0 @@ -/* -** v_pfx.h -** -**--------------------------------------------------------------------------- -** Copyright 1998-2006 Randy Heit -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- -** -*/ - -#ifndef __V_PFX_H__ -#define __V_PFX_H__ - -// -// Pixel format conversion routines, for use with DFrameBuffer implementations -// - -union PfxUnion -{ - uint8_t Pal8[256]; - uint16_t Pal16[256]; - uint32_t Pal32[256]; - uint8_t Pal24[256][4]; -}; - -struct PfxState -{ - union - { - struct - { - uint16_t Red; - uint16_t Green; - uint16_t Blue; - } Bits16; - struct - { - uint32_t Red; - uint32_t Green; - uint32_t Blue; - } Bits32; - } Masks; - uint8_t RedShift; - uint8_t BlueShift; - uint8_t GreenShift; - BITFIELD RedLeft:1; - BITFIELD BlueLeft:1; - BITFIELD GreenLeft:1; - - void SetFormat (int bits, uint32_t redMask, uint32_t greenMask, uint32_t blueMask); - void (*SetPalette) (const PalEntry *pal); - void (*Convert) (uint8_t *src, int srcpitch, - void *dest, int destpitch, int destwidth, int destheight, - fixed_t xstep, fixed_t ystep, fixed_t xfrac, fixed_t yfrac); -}; - -extern PfxUnion GPfxPal; -extern PfxState GPfx; - -#endif //__V_PFX_H__ diff --git a/src/v_video.h b/src/v_video.h index 1b3131f835..b4ecdeb9c3 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -86,6 +86,21 @@ struct IntRect left += xofs; top += yofs; } + + void AddToRect(int x, int y) + { + if (x < left) + left = x; + if (x > left + width) + width = x - left; + + if (y < top) + top = y; + if (y > top + height) + height = y - top; + } + + }; diff --git a/src/version.h b/src/version.h index 231c3bad13..56b397468c 100644 --- a/src/version.h +++ b/src/version.h @@ -97,6 +97,7 @@ const char *GetVersionString(); // More stuff that needs to be different for derivatives. #define GAMENAME "GZDoom" +#define WGAMENAME L"GZDoom" #define GAMENAMELOWERCASE "gzdoom" #define FORUM_URL "http://forum.zdoom.org/" #define BUGS_FORUM_URL "http://forum.zdoom.org/viewforum.php?f=2" diff --git a/src/wi_stuff.cpp b/src/wi_stuff.cpp index c752be66d1..1849d471cf 100644 --- a/src/wi_stuff.cpp +++ b/src/wi_stuff.cpp @@ -760,13 +760,7 @@ void WI_Start(wbstartstruct_t *wbstartstruct) I_FatalError("Cannot create status screen"); } } - // Set up some global stuff that is always needed. - auto info = FindLevelInfo(wbstartstruct->next, false); - if (info == nullptr) - { - wbstartstruct->next = ""; - } - else wbstartstruct->nextname = info->LookupLevelName(); + V_SetBlend(0, 0, 0, 0); S_StopAllChannels(); for (auto Level : AllLevels()) @@ -863,6 +857,7 @@ DEFINE_FIELD_X(WBStartStruct, wbstartstruct_t, next_ep); DEFINE_FIELD_X(WBStartStruct, wbstartstruct_t, current); DEFINE_FIELD_X(WBStartStruct, wbstartstruct_t, next); DEFINE_FIELD_X(WBStartStruct, wbstartstruct_t, nextname); +DEFINE_FIELD_X(WBStartStruct, wbstartstruct_t, thisname); DEFINE_FIELD_X(WBStartStruct, wbstartstruct_t, LName0); DEFINE_FIELD_X(WBStartStruct, wbstartstruct_t, LName1); DEFINE_FIELD_X(WBStartStruct, wbstartstruct_t, maxkills); diff --git a/src/wi_stuff.h b/src/wi_stuff.h index 4b12820f00..3ff4828b1b 100644 --- a/src/wi_stuff.h +++ b/src/wi_stuff.h @@ -30,6 +30,7 @@ #include "doomdef.h" class FTexture; +struct FLevelLocals; // // INTERMISSION @@ -54,6 +55,7 @@ struct wbstartstruct_t FString current; // [RH] Name of map just finished FString next; // next level, [RH] actual map name FString nextname; // printable name for next level. + FString thisname; // printable name for next level. FTextureID LName0; FTextureID LName1; @@ -74,12 +76,11 @@ struct wbstartstruct_t int pnum; wbplayerstruct_t plyr[MAXPLAYERS]; + }; // Intermission stats. // Parameters for world map / intermission. -extern wbstartstruct_t wminfo; - // Called by main loop, animate the intermission. void WI_Ticker (); diff --git a/src/win32/base_sysfb.cpp b/src/win32/base_sysfb.cpp index c5f14404bc..53384cf2b1 100644 --- a/src/win32/base_sysfb.cpp +++ b/src/win32/base_sysfb.cpp @@ -287,10 +287,10 @@ void SystemBaseFrameBuffer::PositionWindow(bool fullscreen, bool initialcall) if (!m_Fullscreen && fullscreen && !initialcall) SaveWindowedPos(); if (m_Monitor) { - MONITORINFOEX mi; + MONITORINFOEXA mi; mi.cbSize = sizeof mi; - if (GetMonitorInfo(HMONITOR(m_Monitor), &mi)) + if (GetMonitorInfoA(HMONITOR(m_Monitor), &mi)) { strcpy(m_displayDeviceNameBuffer, mi.szDevice); m_displayDeviceName = m_displayDeviceNameBuffer; diff --git a/src/win32/boing1.ico b/src/win32/boing1.ico deleted file mode 100644 index ba19283332..0000000000 Binary files a/src/win32/boing1.ico and /dev/null differ diff --git a/src/win32/boing2.ico b/src/win32/boing2.ico deleted file mode 100644 index 083f6b21ca..0000000000 Binary files a/src/win32/boing2.ico and /dev/null differ diff --git a/src/win32/boing3.ico b/src/win32/boing3.ico deleted file mode 100644 index dafc2ea58a..0000000000 Binary files a/src/win32/boing3.ico and /dev/null differ diff --git a/src/win32/boing4.ico b/src/win32/boing4.ico deleted file mode 100644 index d8f60c0d6a..0000000000 Binary files a/src/win32/boing4.ico and /dev/null differ diff --git a/src/win32/boing5.ico b/src/win32/boing5.ico deleted file mode 100644 index 085a991116..0000000000 Binary files a/src/win32/boing5.ico and /dev/null differ diff --git a/src/win32/boing6.ico b/src/win32/boing6.ico deleted file mode 100644 index fa69051d46..0000000000 Binary files a/src/win32/boing6.ico and /dev/null differ diff --git a/src/win32/boing7.ico b/src/win32/boing7.ico deleted file mode 100644 index a5864b22a8..0000000000 Binary files a/src/win32/boing7.ico and /dev/null differ diff --git a/src/win32/boing8.ico b/src/win32/boing8.ico deleted file mode 100644 index 9fcbc853e9..0000000000 Binary files a/src/win32/boing8.ico and /dev/null differ diff --git a/src/win32/critsec.cpp b/src/win32/critsec.cpp deleted file mode 100644 index 471b19b9f1..0000000000 --- a/src/win32/critsec.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* -** -** -**--------------------------------------------------------------------------- -** Copyright 2005-2016 Randy Heit -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- -** -*/ -// Wraps a Windows critical section object. - -#ifndef _WINNT_ -#define WIN32_LEAN_AND_MEAN -#include -#endif - -class FInternalCriticalSection -{ -public: - FInternalCriticalSection() - { - InitializeCriticalSection(&CritSec); - } - ~FInternalCriticalSection() - { - DeleteCriticalSection(&CritSec); - } - void Enter() - { - EnterCriticalSection(&CritSec); - } - void Leave() - { - LeaveCriticalSection(&CritSec); - } -#if 0 - // SDL has no equivalent functionality, so better not use it on Windows. - bool TryEnter() - { - return TryEnterCriticalSection(&CritSec) != 0; - } -#endif -private: - CRITICAL_SECTION CritSec; -}; - - -FInternalCriticalSection *CreateCriticalSection() -{ - return new FInternalCriticalSection(); -} - -void DeleteCriticalSection(FInternalCriticalSection *c) -{ - delete c; -} - -void EnterCriticalSection(FInternalCriticalSection *c) -{ - c->Enter(); -} - -void LeaveCriticalSection(FInternalCriticalSection *c) -{ - c->Leave(); -} diff --git a/src/win32/i_cd.cpp b/src/win32/i_cd.cpp index c8dcc3d62a..a127a13780 100644 --- a/src/win32/i_cd.cpp +++ b/src/win32/i_cd.cpp @@ -173,7 +173,7 @@ bool FCDThread::Init () CD_WindowClass.style = CS_NOCLOSE; CD_WindowClass.lpfnWndProc = CD_WndProc; CD_WindowClass.hInstance = g_hInst; - CD_WindowClass.lpszClassName = GAMENAME " CD Player"; + CD_WindowClass.lpszClassName = WGAMENAME " CD Player"; CD_WindowAtom = RegisterClass (&CD_WindowClass); if (CD_WindowAtom == 0) @@ -181,7 +181,7 @@ bool FCDThread::Init () CD_Window = CreateWindow ( (LPCTSTR)(INT_PTR)(int)CD_WindowAtom, - GAMENAME " CD Player", + WGAMENAME " CD Player", 0, 0, 0, 10, 10, NULL, @@ -263,12 +263,12 @@ DWORD FCDThread::Dispatch (DWORD method, DWORD parm1, DWORD parm2, DWORD parm3) DWORD firstTrack, lastTrack, numTracks; DWORD length; DWORD openFlags; - char ident[32]; + wchar_t ident[32]; switch (method) { case CDM_Init: - mciOpen.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_CD_AUDIO; + mciOpen.lpstrDeviceType = (LPCWSTR)MCI_DEVTYPE_CD_AUDIO; openFlags = MCI_OPEN_SHAREABLE|MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_WAIT; if ((signed)parm1 >= 0) { @@ -411,7 +411,7 @@ DWORD FCDThread::Dispatch (DWORD method, DWORD parm1, DWORD parm2, DWORD parm3) case CDM_GetMediaIdentity: case CDM_GetMediaUPC: - char ident[32]; + wchar_t ident[32]; infoParms.lpstrReturn = ident; infoParms.dwRetSize = sizeof(ident); @@ -423,7 +423,7 @@ DWORD FCDThread::Dispatch (DWORD method, DWORD parm1, DWORD parm2, DWORD parm3) } else { - return strtoul (ident, NULL, 0); + return wcstoul (ident, NULL, 0); } default: diff --git a/src/win32/i_crash.cpp b/src/win32/i_crash.cpp index 64ffc32bdb..4918910ce9 100644 --- a/src/win32/i_crash.cpp +++ b/src/win32/i_crash.cpp @@ -66,17 +66,6 @@ // MACROS ------------------------------------------------------------------ -#define REMOTE_HOST "localhost" -#define REMOTE_PORT "80" -#define UPLOAD_URI "/test.php" -#define UPLOAD_BOUNDARY "Von-DnrNbJl0 P9d_BD;cEEsQVWpYMq0pbZ6NUmYHus;yIbFbkgB?.N=YC5O=BGZm+Rab5" -#define DBGHELP_URI "/msredist/dbghelp.dl_" - -#define UPLOAD_AGENT GAMENAME "/" VERSIONSTR " (" GAMESIG ")" - -// Time, in milliseconds, to wait for a send() or recv() to complete. -#define TIMEOUT 60000 - // Maximum number of files that might appear in a crash report. #define MAX_FILES 5 @@ -260,53 +249,6 @@ EXCEPTION_POINTERS CrashPointers; static HRESULT (__stdcall *pEnableThemeDialogTexture) (HWND hwnd, DWORD dwFlags); -static const char PostHeader[] = -"POST " UPLOAD_URI " HTTP/1.1\r\n" -"Host: " REMOTE_HOST "\r\n" -"Connection: Close\r\n" -"User-Agent: " UPLOAD_AGENT "\r\n" -"Expect: 100-continue\r\n" -"Content-Type: multipart/form-data; boundary=\"" UPLOAD_BOUNDARY "\"\r\n" -"Content-Length: %lu\r\n" -"\r\n"; - -static const char MultipartInfoHeader[] = -"\r\n--" UPLOAD_BOUNDARY "\r\n" -"Content-Transfer-Encoding: 7bit\r\n" -"Content-Disposition: form-data; name=\"Info\"\r\n" -"\r\n"; - -static const char MultipartUserSummaryHeader[] = -"\r\n--" UPLOAD_BOUNDARY "\r\n" -"Content-Transfer-Encoding: 8bit\r\n" -"Content-Disposition: form-data; name=\"UserSummary\"\r\n" -"\r\n"; - -static const char MultipartBinaryHeader[] = -"\r\n--" UPLOAD_BOUNDARY "\r\n" -"Content-Transfer-Encoding: binary\r\n" -"Content-Disposition: form-data; name=\"reportfile\"; filename=\"itdidcrash.tar"; - -static const char MultipartHeaderGZip[] = -".gz\"\r\n" -"Content-Type: application/x-tar-gz\r\n" -"\r\n"; - -static const char MultipartHeaderNoGZip[] = -"\"\r\n" -"Content-Type: application/x-tar\r\n" -"\r\n"; - -static const char MultipartFooter[] = -"\r\n--" UPLOAD_BOUNDARY "--\r\n\r\n"; - -static const char DbgHelpRequest[] = -"GET " DBGHELP_URI " HTTP/1.1\r\n" -"Host: " REMOTE_HOST "\r\n" -"Connection: Close\r\n" -"User-Agent: " UPLOAD_AGENT "\r\n" -"\r\n"; - static TarFile TarFiles[MAX_FILES]; static int NumFiles; @@ -397,7 +339,7 @@ DWORD *GetTopOfStack (void *top) static HANDLE WriteMyMiniDump (void) { MINIDUMP_EXCEPTION_INFORMATION exceptor = { DbgThreadID, &CrashPointers, FALSE }; - char dbghelpPath[MAX_PATH+12], *bs; + WCHAR dbghelpPath[MAX_PATH+12], *bs; WRITEDUMP pMiniDumpWriteDump; HANDLE file; BOOL good = FALSE; @@ -405,17 +347,17 @@ static HANDLE WriteMyMiniDump (void) // Make sure dbghelp.dll and MiniDumpWriteDump are available // Try loading from the application directory first, then from the search path. - GetModuleFileName (NULL, dbghelpPath, MAX_PATH); + GetModuleFileNameW (NULL, dbghelpPath, MAX_PATH); dbghelpPath[MAX_PATH] = 0; - bs = strrchr (dbghelpPath, '\\'); + bs = wcsrchr (dbghelpPath, '\\'); if (bs != NULL) { - strcpy (bs + 1, "dbghelp.dll"); - dbghelp = LoadLibrary (dbghelpPath); + wcscpy (bs + 1, L"dbghelp.dll"); + dbghelp = LoadLibraryW (dbghelpPath); } if (dbghelp == NULL) { - dbghelp = LoadLibrary ("dbghelp.dll"); + dbghelp = LoadLibraryA ("dbghelp.dll"); if (dbghelp == NULL) { NeedDbgHelp = true; @@ -852,7 +794,7 @@ HANDLE WriteTextReport () static void AddToolHelp (HANDLE file) { - HMODULE kernel = GetModuleHandle ("kernel32.dll"); + HMODULE kernel = GetModuleHandleA ("kernel32.dll"); if (kernel == NULL) return; @@ -1251,7 +1193,7 @@ static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD Writef (file, "\r\nCall trace:\r\n rip=%p <- Here it dies.\r\n", CrashAddress); - kernel = GetModuleHandle("kernel32.dll"); + kernel = GetModuleHandleA("kernel32.dll"); if (kernel == NULL || NULL == (RtlLookupFunctionEntry = (RTLLOOKUPFUNCTIONENTRY)GetProcAddress(kernel, "RtlLookupFunctionEntry"))) { @@ -1391,18 +1333,18 @@ static void DumpBytes (HANDLE file, uint8_t *address) static HANDLE CreateTempFile () { - char temppath[MAX_PATH-13]; - char tempname[MAX_PATH]; - if (!GetTempPath (sizeof(temppath), temppath)) + WCHAR temppath[MAX_PATH-13]; + WCHAR tempname[MAX_PATH]; + if (!GetTempPathW (countof(temppath), temppath)) { temppath[0] = '.'; temppath[1] = '\0'; } - if (!GetTempFileName (temppath, "zdo", 0, tempname)) + if (!GetTempFileNameW (temppath, L"zdo", 0, tempname)) { return INVALID_HANDLE_VALUE; } - return CreateFile (tempname, GENERIC_WRITE|GENERIC_READ, 0, NULL, CREATE_ALWAYS, + return CreateFileW (tempname, GENERIC_WRITE|GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY|FILE_FLAG_DELETE_ON_CLOSE|FILE_FLAG_SEQUENTIAL_SCAN, NULL); } @@ -1844,33 +1786,6 @@ static LRESULT CALLBACK TransparentStaticProc (HWND hWnd, UINT uMsg, WPARAM wPar } static HMODULE WinHlp32; -static char *UserSummary; - -//========================================================================== -// -// AddDescriptionText -// -// Adds a file with the contents of the specified edit control to a new -// file in the tarball. The control's user data is used to keep track of -// the file handle for the created file, so you can call this more than -// once and it will only open the file the first time. -// -//========================================================================== - -static void AddDescriptionText (HWND edit) -{ - DWORD textlen; - - textlen = (DWORD)SendMessage (edit, WM_GETTEXTLENGTH, 0, 0) + 1; - if (textlen > 1) - { - UserSummary = (char *)HeapAlloc (GetProcessHeap(), 0, textlen); - if (UserSummary != NULL) - { - textlen = (DWORD)SendMessage (edit, WM_GETTEXT, textlen, (LPARAM)UserSummary); - } - } -} //========================================================================== // @@ -1889,46 +1804,49 @@ static INT_PTR CALLBACK OverviewDlgProc (HWND hDlg, UINT message, WPARAM wParam, switch (message) { case WM_INITDIALOG: + { if (pEnableThemeDialogTexture != NULL) { - pEnableThemeDialogTexture (hDlg, ETDT_ENABLETAB); + pEnableThemeDialogTexture(hDlg, ETDT_ENABLETAB); } // Setup the header at the top of the page. - edit = GetDlgItem (hDlg, IDC_CRASHHEADER); - SendMessage (edit, WM_SETTEXT, 0, (LPARAM)GAMENAME" has encountered a problem and needs to close.\n" + edit = GetDlgItem(hDlg, IDC_CRASHHEADER); + SetWindowTextW(edit, WGAMENAME" has encountered a problem and needs to close.\n" "We are sorry for the inconvenience."); - + // Setup a bold version of the standard dialog font and make the header bold. charFormat.cbSize = sizeof(charFormat); - SendMessage (edit, EM_GETCHARFORMAT, SCF_DEFAULT, (LPARAM)&charFormat); + SendMessageW(edit, EM_GETCHARFORMAT, SCF_DEFAULT, (LPARAM)&charFormat); charFormat.dwEffects = CFE_BOLD; - SendMessage (edit, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&charFormat); + SendMessageW(edit, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&charFormat); // Setup the drawing routine for the dying guy's bitmap. - edit = GetDlgItem (hDlg, IDC_DEADGUYVIEWER); - StdStaticProc = (WNDPROC)(LONG_PTR)SetWindowLongPtr (edit, GWLP_WNDPROC, (WLONG_PTR)(LONG_PTR)TransparentStaticProc); + edit = GetDlgItem(hDlg, IDC_DEADGUYVIEWER); + StdStaticProc = (WNDPROC)(LONG_PTR)SetWindowLongPtr(edit, GWLP_WNDPROC, (WLONG_PTR)(LONG_PTR)TransparentStaticProc); // Fill in all the text just below the heading. - edit = GetDlgItem (hDlg, IDC_PLEASETELLUS); - SendMessage (edit, EM_AUTOURLDETECT, TRUE, 0); - SendMessage (edit, WM_SETTEXT, 0, (LPARAM)"Please tell us about this problem.\n" + edit = GetDlgItem(hDlg, IDC_PLEASETELLUS); + SendMessageW(edit, EM_AUTOURLDETECT, TRUE, 0); + SetWindowTextW(edit, L"Please tell us about this problem.\n" "The information will NOT be sent to Microsoft.\n\n" "An error report has been created that you can submit to help improve " GAMENAME ". " "You can either save it to disk and make a report in the bugs forum at " FORUM_URL ", " "or you can send it directly without letting other people know about it."); - SendMessage (edit, EM_SETSEL, 0, 81); - SendMessage (edit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&charFormat); - SendMessage (edit, EM_SETEVENTMASK, 0, ENM_LINK); + SendMessageW(edit, EM_SETSEL, 0, 81); + SendMessageW(edit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&charFormat); + SendMessageW(edit, EM_SETEVENTMASK, 0, ENM_LINK); // Assign a default invalid file handle to the user's edit control. - edit = GetDlgItem (hDlg, IDC_CRASHINFO); - SetWindowLongPtr (edit, GWLP_USERDATA, (LONG_PTR)INVALID_HANDLE_VALUE); + edit = GetDlgItem(hDlg, IDC_CRASHINFO); + SetWindowLongPtrW(edit, GWLP_USERDATA, (LONG_PTR)INVALID_HANDLE_VALUE); // Fill in the summary text at the bottom of the page. - edit = GetDlgItem (hDlg, IDC_CRASHSUMMARY); - SendMessage (edit, WM_SETTEXT, 0, (LPARAM)CrashSummary); + edit = GetDlgItem(hDlg, IDC_CRASHSUMMARY); + auto wsum = WideString(CrashSummary); + SetWindowTextW(edit, wsum.c_str()); return TRUE; + } case WM_NOTIFY: // When the link in the "please tell us" edit control is clicked, open @@ -1939,18 +1857,13 @@ static INT_PTR CALLBACK OverviewDlgProc (HWND hDlg, UINT message, WPARAM wParam, { if (link->msg == WM_LBUTTONDOWN) { - ShellExecute (NULL, "open", BUGS_FORUM_URL, NULL, NULL, 0); - SetWindowLongPtr (hDlg, DWLP_MSGRESULT, 1); + ShellExecuteA (NULL, "open", BUGS_FORUM_URL, NULL, NULL, 0); + SetWindowLongPtrW (hDlg, DWLP_MSGRESULT, 1); return TRUE; } } return FALSE; break; - - case WM_DESTROY: - // When this pane is destroyed, extract the user's summary. - AddDescriptionText (GetDlgItem (hDlg, IDC_CRASHINFO)); - break; } return FALSE; } @@ -1965,8 +1878,8 @@ static INT_PTR CALLBACK OverviewDlgProc (HWND hDlg, UINT message, WPARAM wParam, static INT_PTR CALLBACK CrashDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - static CHAR overview[] = "Overview"; - static CHAR details[] = "Details"; + static WCHAR overview[] = L"Overview"; + static WCHAR details[] = L"Details"; HWND edit; TCITEM tcitem; RECT tabrect, tcrect; @@ -1987,14 +1900,14 @@ static INT_PTR CALLBACK CrashDlgProc (HWND hDlg, UINT message, WPARAM wParam, LP // dialog template, and the resultant window is stored as the lParam for // the corresponding tab. tcitem.pszText = overview; - tcitem.lParam = (LPARAM)CreateDialogParam (g_hInst, MAKEINTRESOURCE(IDD_CRASHOVERVIEW), hDlg, OverviewDlgProc, (LPARAM)edit); + tcitem.lParam = (LPARAM)CreateDialogParamW (g_hInst, MAKEINTRESOURCE(IDD_CRASHOVERVIEW), hDlg, OverviewDlgProc, (LPARAM)edit); TabCtrl_InsertItem (edit, 0, &tcitem); TabCtrl_GetItemRect (edit, 0, &tabrect); SetWindowPos ((HWND)tcitem.lParam, HWND_TOP, tcrect.left + 3, tcrect.top + tabrect.bottom + 3, tcrect.right - tcrect.left - 8, tcrect.bottom - tcrect.top - tabrect.bottom - 8, 0); tcitem.pszText = details; - tcitem.lParam = (LPARAM)CreateDialogParam (g_hInst, MAKEINTRESOURCE(IDD_CRASHDETAILS), hDlg, DetailsDlgProc, (LPARAM)edit); + tcitem.lParam = (LPARAM)CreateDialogParamW (g_hInst, MAKEINTRESOURCE(IDD_CRASHDETAILS), hDlg, DetailsDlgProc, (LPARAM)edit); TabCtrl_InsertItem (edit, 1, &tcitem); SetWindowPos ((HWND)tcitem.lParam, HWND_TOP, tcrect.left + 3, tcrect.top + tabrect.bottom + 3, tcrect.right - tcrect.left - 8, tcrect.bottom - tcrect.top - tabrect.bottom - 8, 0); @@ -2067,10 +1980,10 @@ static INT_PTR CALLBACK DetailsDlgProc (HWND hDlg, UINT message, WPARAM wParam, // Set up the file contents display: No undos. The control's // userdata stores the index of the file currently displayed. ctrl = GetDlgItem (hDlg, IDC_CRASHFILECONTENTS); - SendMessage (ctrl, EM_SETUNDOLIMIT, 0, 0); - SetWindowLongPtr (ctrl, GWLP_USERDATA, -1); + SendMessageW (ctrl, EM_SETUNDOLIMIT, 0, 0); + SetWindowLongPtrW (ctrl, GWLP_USERDATA, -1); SetEditControl (ctrl, GetDlgItem(hDlg, IDC_CRASHFILESIZE), 0); - SendMessage (ctrl, LB_SETCURSEL, 0, 0); + SendMessageW (ctrl, LB_SETCURSEL, 0, 0); break; case WM_SHOWWINDOW: @@ -2079,14 +1992,14 @@ static INT_PTR CALLBACK DetailsDlgProc (HWND hDlg, UINT message, WPARAM wParam, if (wParam == TRUE) { ctrl = GetDlgItem (hDlg, IDC_CRASHFILES); - j = (int)SendMessage (ctrl, LB_GETCURSEL, 0, 0); - SendMessage (ctrl, LB_RESETCONTENT, 0, 0); + j = (int)SendMessageW (ctrl, LB_GETCURSEL, 0, 0); + SendMessageW (ctrl, LB_RESETCONTENT, 0, 0); for (i = 0; i < NumFiles; ++i) { - SendMessage (ctrl, LB_ADDSTRING, 0, (LPARAM)TarFiles[i].Filename); + SendMessageA (ctrl, LB_ADDSTRING, 0, (LPARAM)TarFiles[i].Filename); } if (j == LB_ERR || j >= i) j = 0; - SendMessage (ctrl, LB_SETCURSEL, j, 0); + SendMessageW (ctrl, LB_SETCURSEL, j, 0); ctrl = GetDlgItem (hDlg, IDC_CRASHFILECONTENTS); if (j > 2) SetWindowLongPtr (ctrl, GWLP_USERDATA, -1); @@ -2258,7 +2171,7 @@ static void SetEditControl (HWND edit, HWND sizedisplay, int filenum) { mysnprintf (sizebuf, countof(sizebuf), "(%lu KB)", size/1024); } - SetWindowText (sizedisplay, sizebuf); + SetWindowTextA (sizedisplay, sizebuf); SetWindowLongPtr (edit, GWLP_USERDATA, filenum); @@ -2301,931 +2214,6 @@ static void SetEditControl (HWND edit, HWND sizedisplay, int filenum) SendMessage (edit, EM_SETSEL, (WPARAM)-1, 0); } -#if 0 // Server-side support is not done yet - -//========================================================================== -// -// GetHeader -// -// Receives the HTTP header from a socket, up to and including the empty -// line that terminates the header. -// -//========================================================================== - -static char *GetHeader (SOCKET sock) -{ - DWORD spaceHave = 0, spaceAt = 0; - char *space = NULL; - char inchar; - int got; - - for (;;) - { - // Get one character - got = recv (sock, &inchar, 1, 0); - if (got != 1) - { -error: - if (space != NULL) HeapFree (GetProcessHeap(), 0, space); - return NULL; - } - // Append it to the header we have so far - if (space == NULL) - { - spaceHave = 256; - space = (char *)HeapAlloc (GetProcessHeap(), 0, 256); - } - else if (spaceAt == spaceHave-1) - { - spaceHave += 256; - space = (char *)HeapReAlloc (GetProcessHeap(), 0, space, spaceHave); - } - switch (spaceAt) - { - case 0: if (inchar != 'H') goto error; break; - case 1: if (inchar != 'T') goto error; break; - case 2: if (inchar != 'T') goto error; break; - case 3: if (inchar != 'P') goto error; break; - case 4: if (inchar != '/') goto error; break; - } - space[spaceAt++] = inchar; - if (inchar == '\n' && space[spaceAt-2] == '\r' && space[spaceAt-3] == '\n' && space[spaceAt-4] == '\r') - { // The header is complete - break; - } - } - space[spaceAt++] = '\0'; - if (spaceAt < 12) goto error; - return space; -} - -//========================================================================== -// -// UploadFail -// -// Stuffs some text into the status control to indicate what went wrong. -// -//========================================================================== - -static void UploadFail (HWND hDlg, const char *message, int reason) -{ - char buff[512]; - - mysnprintf (buff, countof(buff), "%s: %d", message, reason); - SetWindowText (GetDlgItem (hDlg, IDC_BOINGSTATUS), buff); - - if (reason >= 10000 && reason <= 11999) - { - LPVOID lpMsgBuf; - if (FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR)&lpMsgBuf, - 0, - NULL)) - { - SetWindowText (GetDlgItem (hDlg, IDC_BOINGEDIT), (LPCSTR)lpMsgBuf); - LocalFree (lpMsgBuf); - } - } -} - -//========================================================================== -// -// GetChunkLen -// -// Returns the chunk length for a HTTP response using the chunked -// transfer-encoding. -// -//========================================================================== - -static int GetChunkLen (SOCKET sock) -{ - char crlf[2] = { '\r', '\n' }; - int len = 0; - int stage = 0; - char inchar; - - while (recv (sock, &inchar, 1, 0) == 1) - { - switch (stage) - { - case 0: // Checking for CRLF from the previous chunk - case 1: - if (inchar == crlf[stage]) { stage++; break; } - else stage = 2; - - case 2: // Reading length - if (inchar == ';') stage = 3; - else if (inchar >= '0' && inchar <= '9') len = (len << 4) | (inchar - '0'); - else if (inchar >= 'A' && inchar <= 'F') len = (len << 4) | ((inchar - 'A') + 10); - else if (inchar >= 'a' && inchar <= 'f') len = (len << 4) | ((inchar - 'a') + 10); - else if (inchar == '\r') stage = 4; - break; - - case 3: // Skipping chunk extension - case 4: - if (inchar == crlf[stage-3]) stage++; - else stage = 3; - if (stage == 5) - { - return len; - } - break; - } - } - return len; -} - -//========================================================================== -// -// TranslateHTML -// -// Converts HTML text into something closer to plain-text and appends it -// to the edit control's contents. -// -//========================================================================== - -struct TranslateHTML -{ - TranslateHTML (char *header, HWND editcontrol) - : edit(editcontrol), state(0), allowspace(false) - { - plaintext = strstr (header, "content-type: text/html") == NULL; - } - void Translate (char *buf); - - HWND edit; - int state; - bool allowspace; - char token[64]; - bool plaintext; -}; - -void TranslateHTML::Translate (char *buf) -{ - char *in, *out; - int tokenp = 0; - bool endrange = false; - bool inhead = false, inscript = false; - - if (plaintext) - { - SendMessage (edit, EM_REPLACESEL, 0, (LPARAM)buf); - return; - } - - for (in = out = buf; *in != 0; in++) - { - char x = *in; - switch (state) - { - case 0: // Not in a token - if (x == '<' || x == '&') - { - state = x == '<' ? 1 : 11; - } - else if (!inhead && !inscript) - { - if (x <= ' ') - { - if (allowspace) - { - allowspace = false; - *out++ = ' '; - } - } - else - { - *out++ = x; - allowspace = true; - } - } - break; - - case 1: // Just got a '<' - state = 2; - tokenp = 0; - if (x == '/') - { - endrange = true; - break; - } - else if (x == '!') - { - state = 20; - break; - } - else - { - endrange = false; - } - - case 2: // Somewhere past '<' - if (x == '>') - { // Token finished -gottoken: - token[tokenp] = 0; - if (!endrange) - { - if (stricmp (token, "head") == 0) - { - inhead = true; - } - else if (stricmp (token, "script") == 0) - { - inscript = true; - } - else if (stricmp (token, "p") == 0 || stricmp (token, "address") == 0) - { - *out++ = '\n'; - *out++ = '\n'; - allowspace = false; - } - else if (stricmp (token, "br") == 0) - { - *out++ = '\n'; - allowspace = false; - } - else if (stricmp (token, "li") == 0) - { - *out++ = '\n'; - *out++ = '*'; - *out++ = ' '; - allowspace = false; - } - else if ((token[0] == 'h' || token[0] == 'H') && token[1] >= '0' && token[1] <= '9' && token[2] == '\0') - { - *out++ = '\n'; - allowspace = false; - } - } - else - { - if (stricmp (token, "head") == 0) - { - inhead = false; - } - else if (stricmp (token, "script") == 0) - { - inscript = false; - } - else if ((token[0] == 'h' || token[0] == 'H') && token[1] >= '0' && token[1] <= '9' && token[2] == '\0') - { - *out++ = '\n'; - *out++ = '\n'; - allowspace = false; - } - else if (stricmp (token, "ul") == 0 || stricmp (token, "ol") == 0) - { - *out++ = '\n'; - allowspace = false; - } - } - state = 0; - } - else if (x == ' ') - { - state = 3; - } - else if (tokenp < 63) - { - token[tokenp++] = x; - } - break; - - case 3: // Past '<' TOKEN ' ' - if (x == '>') - { // Token finished - goto gottoken; - } - break; - - case 11: // Just got a '&' - state = 12; - tokenp = 0; - - case 12: - if (x == ';') - { // Token finished - if (stricmp (token, "lt") == 0) - { - *out++ = '<'; - } - else if (stricmp (token, "gt") == 0) - { - *out++ = '>'; - } - else if (stricmp (token, "amp") == 0) - { - *out++ = '&'; - } - state = 0; - } - else if (tokenp < 63) - { - token[tokenp++] = x; - } - break; - - case 20: // Just got "') - { - state = 0; - } - else - { - state = 22; - } - break; - } - } - if (out != buf) - { - *out++ = '\0'; - SendMessage (edit, EM_REPLACESEL, 0, (LPARAM)buf); - } -} - -//========================================================================== -// -// ReadResponse -// -// Read the HTTP response. If file is not INVALID_HANDLE_VALUE, then the -// response is downloaded to the file. Otherwise, it is passed through -// TranslateHTML and into the upload dialog's edit control. -// -//========================================================================== - -static bool ReadResponse (HWND hDlg, char *header, SOCKET sock, char *buf, int bufsize, HANDLE file) -{ - HWND edit = GetDlgItem (hDlg, IDC_BOINGEDIT); - DWORD wrote; - int len, avail, totalRecv; - int recvBytes = 0; - POINT pt = { 0, 0 }; - - strlwr (header); - - TranslateHTML translator (header, edit); - SendMessage (edit, WM_SETREDRAW, FALSE, 0); - - if (strstr (header, "transfer-encoding: chunked") != NULL) - { // Response body is chunked - for (;;) - { - len = GetChunkLen (sock); - if (len == 0) - { - break; - } - while (len > 0) - { - if (len > bufsize-1) avail = bufsize-1; - else avail = len; - recvBytes = recv (sock, buf, avail, 0); - if (recvBytes == 0 || recvBytes == SOCKET_ERROR) - { - goto done; - } - buf[recvBytes] = '\0'; - if (file != INVALID_HANDLE_VALUE) - { - WriteFile (file, buf, recvBytes, &wrote, NULL); - } - else - { - translator.Translate (buf); - } - len -= recvBytes; - } - } - } - else - { // Response body is uninterrupted - char *lenhead = strstr (header, "content-length: "); - if (lenhead != 0) - { - len = (int)strtoll (lenhead + 16, NULL, 10); - if (file != INVALID_HANDLE_VALUE) - { - ShowWindow (GetDlgItem (hDlg, IDC_BOINGPROGRESS), SW_SHOW); - SendMessage (GetDlgItem (hDlg, IDC_BOINGPROGRESS), PBM_SETRANGE, 0, MAKELPARAM (0, (len + bufsize-2)/(bufsize-1))); - } - } - else - { - len = 0; - } - totalRecv = 0; - for (;;) - { - if (len == 0) avail = bufsize - 1; - else - { - avail = len - totalRecv; - if (avail > bufsize - 1) avail = bufsize - 1; - } - recvBytes = recv (sock, buf, avail, 0); - if (recvBytes == 0 || recvBytes == SOCKET_ERROR) - { - break; - } - totalRecv += recvBytes; - buf[recvBytes] = '\0'; - if (file != INVALID_HANDLE_VALUE) - { - SendMessage (GetDlgItem (hDlg, IDC_BOINGPROGRESS), PBM_SETPOS, totalRecv/(bufsize-1), 0); - WriteFile (file, buf, recvBytes, &wrote, NULL); - } - else - { - translator.Translate (buf); - } - if (len != 0 && totalRecv >= len) - { - break; - } - } - } -done: - SendMessage (edit, EM_SETSCROLLPOS, 0, (LPARAM)&pt); - SendMessage (edit, WM_SETREDRAW, TRUE, 0); - InvalidateRect (edit, NULL, FALSE); - return recvBytes != SOCKET_ERROR; -} - -//========================================================================== -// -// CheckServerResponse -// -// Waits for a response from the server. If it doesn't get a 1xx or 2xx -// response, the response is displayed. The return value is either the -// response code or -1 if a socket error occurred. -// -//========================================================================== - -static int CheckServerResponse (HWND hDlg, SOCKET sock, char *&header, char *buf, int bufsize) -{ - int response; - - header = GetHeader (sock); - if (header == NULL) - { - UploadFail (hDlg, "Error reading server response", WSAGetLastError()); - return -1; - } - response = strtoul (strchr (header, ' '), NULL, 10); - if (response >= 300) - { - char *topline = strstr (header, "\r\n"); - *topline = 0; - SetWindowText (GetDlgItem (hDlg, IDC_BOINGSTATUS), header); - *topline = '\r'; - if (response != 304) - { - ReadResponse (hDlg, header, sock, buf, bufsize, INVALID_HANDLE_VALUE); - } - } - return response; -} - -//========================================================================== -// -// CabinetCallback -// -// Used to extract dbghelp.dll out of the downloaded cabinet. -// -//========================================================================== - -static UINT CALLBACK CabinetCallback (PVOID context, UINT notification, UINT_PTR param1, UINT_PTR param2) -{ - if (notification == SPFILENOTIFY_FILEINCABINET) - { - FILE_IN_CABINET_INFO *info = (FILE_IN_CABINET_INFO *)param1; - if (strcmp (info->NameInCabinet, "dbghelp.dll") == 0) - { - strncpy (info->FullTargetName, (char *)context, sizeof(info->FullTargetName)); - info->FullTargetName[sizeof(info->FullTargetName)-1] = '\0'; - info->FullTargetName[strlen(info->FullTargetName)-1] = 'l'; - return FILEOP_DOIT; - } - return FILEOP_SKIP; - } - return NO_ERROR; -} - -struct UploadParmStruct -{ - HWND hDlg; - HANDLE hThread; - HANDLE hFile; - const char *UserSummary; -}; - -//========================================================================== -// -// UploadProc -// -// Drives the error report upload and optionally the dbghelp download, -// using standard HTTP requests. -// -//========================================================================== - -static DWORD WINAPI UploadProc (LPVOID lpParam) -{ - char dbghelpPath[MAX_PATH+12]; - UploadParmStruct *parm = (UploadParmStruct *)lpParam; - char xferbuf[1024]; - WSADATA wsad; - SOCKET sock = INVALID_SOCKET; - addrinfo aiHints = { 0 }; - addrinfo *aiList = NULL; - char *header = NULL; - DWORD fileLen, fileLeft, contentLength; - int bytesSent; - int headerLen; - int err, i; - int retries; - DWORD returnval = TRUE; - HANDLE dbghelp = INVALID_HANDLE_VALUE; - HWND status = GetDlgItem (parm->hDlg, IDC_BOINGSTATUS); - - dbghelpPath[0] = '\0'; - SetWindowText (status, "Looking up " REMOTE_HOST "..."); - - // Startup Winsock. If this doesn't work, then we can't do anything. - err = WSAStartup (0x0101, &wsad); - if (err != 0) - { - UploadFail (parm->hDlg, "Could not initialize Winsock", err); - return FALSE; - } - - try - { - OSVERSIONINFO verinfo = { sizeof(verinfo) }; - GetVersionEx (&verinfo); - if (verinfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) - { - verinfo.dwBuildNumber &= 0xFFFF; - } - - // Lookup the host we want to talk with. - aiHints.ai_family = AF_INET; - aiHints.ai_socktype = SOCK_STREAM; - aiHints.ai_protocol = IPPROTO_TCP; - - err = getaddrinfo (REMOTE_HOST, REMOTE_PORT, &aiHints, &aiList); - if (err != 0 || aiList == NULL) - { - UploadFail (parm->hDlg, "Could not resolve " REMOTE_HOST, err); - throw 1; - } - - // Create a new socket... - sock = socket (aiList->ai_family, aiList->ai_socktype, aiList->ai_protocol); - if (sock == INVALID_SOCKET) - { - UploadFail (parm->hDlg, "Could not create socket", WSAGetLastError()); - throw 1; - } - - int timeout = TIMEOUT; - setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)); - setsockopt (sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)); - - // ...and connect it to the remote host. - SetWindowText (status, "Connecting to " REMOTE_HOST "..."); - err = connect (sock, aiList->ai_addr, sizeof(*aiList->ai_addr)); - if (err == SOCKET_ERROR) - { - UploadFail (parm->hDlg, "Failed to connect", WSAGetLastError()); - throw 1; - } - - // Now tell the host we want to submit the report. - SetWindowText (status, "Sending HTTP request..."); - fileLen = GetFileSize (parm->hFile, NULL); - contentLength = sizeof(MultipartInfoHeader)-1 + 8+9*7+2 + strlen(verinfo.szCSDVersion) + - (parm->UserSummary ? (sizeof(MultipartUserSummaryHeader)-1 + strlen(UserSummary)) : 0) + - sizeof(MultipartBinaryHeader)-1 + - sizeof(MultipartHeaderGZip)-1 + fileLen + - sizeof(MultipartFooter)-1; - headerLen = mysnprintf (xferbuf, countof(xferbuf), PostHeader, contentLength); - bytesSent = send (sock, xferbuf, headerLen, 0); - if (bytesSent != headerLen) - { - UploadFail (parm->hDlg, "Could not send HTTP request", WSAGetLastError()); - throw 1; - } - - // Wait for a 100 continue response from the host. - err = CheckServerResponse (parm->hDlg, sock, header, xferbuf, sizeof(xferbuf)); - if (err < 0 || err >= 300) - { - throw 1; - } - - // And now that we have it, we can finally send the report. - SetWindowText (status, "Sending report..."); - - // First show the progress bar so the user knows how much of the report has been sent. - ShowWindow (GetDlgItem (parm->hDlg, IDC_BOINGPROGRESS), SW_SHOW); - SendMessage (GetDlgItem (parm->hDlg, IDC_BOINGPROGRESS), PBM_SETRANGE, 0, MAKELPARAM (0, (fileLen + sizeof(xferbuf)-1)/sizeof(xferbuf))); - - // Send the bare-bones info (exception and windows version info) - bytesSent = send (sock, MultipartInfoHeader, sizeof(MultipartInfoHeader)-1, 0); - if (bytesSent == SOCKET_ERROR) - { - UploadFail (parm->hDlg, "Could not upload report", WSAGetLastError()); - throw 1; - } - headerLen = mysnprintf (xferbuf, countof(xferbuf), "Windows %08lX %p %X %08lX %08lX %08lX %08lX %08lX %s", - CrashPointers.ExceptionRecord->ExceptionCode, - CrashPointers.ExceptionRecord->ExceptionAddress, - !!CrashPointers.ExceptionRecord->ExceptionInformation[0], - CrashPointers.ExceptionRecord->ExceptionInformation[1], - - verinfo.dwMajorVersion, - verinfo.dwMinorVersion, - verinfo.dwBuildNumber, - verinfo.dwPlatformId, - verinfo.szCSDVersion); - bytesSent = send (sock, xferbuf, headerLen, 0); - if (bytesSent == SOCKET_ERROR) - { - UploadFail (parm->hDlg, "Could not upload report", WSAGetLastError()); - throw 1; - } - - // Send the user summary. - if (parm->UserSummary) - { - bytesSent = send (sock, MultipartUserSummaryHeader, sizeof(MultipartUserSummaryHeader)-1, 0); - if (bytesSent == SOCKET_ERROR) - { - UploadFail (parm->hDlg, "Could not upload report", WSAGetLastError()); - throw 1; - } - bytesSent = send (sock, parm->UserSummary, (int)strlen(parm->UserSummary), 0); - if (bytesSent == SOCKET_ERROR) - { - UploadFail (parm->hDlg, "Could not upload report", WSAGetLastError()); - throw 1; - } - } - - // Send the report file. - headerLen = mysnprintf (xferbuf, countof(xferbuf), "%s%s", MultipartBinaryHeader, MultipartHeaderZip); - - bytesSent = send (sock, xferbuf, headerLen, 0); - if (bytesSent == SOCKET_ERROR) - { - UploadFail (parm->hDlg, "Could not upload report", WSAGetLastError()); - throw 1; - } - - // Send the report itself. - SetFilePointer (parm->hFile, 0, NULL, FILE_BEGIN); - fileLeft = fileLen; - i = 0; - while (fileLeft != 0) - { - DWORD grab = fileLeft > sizeof(xferbuf) ? sizeof(xferbuf) : fileLeft; - DWORD didread; - - ReadFile (parm->hFile, xferbuf, grab, &didread, NULL); - bytesSent = send (sock, xferbuf, didread, 0); - if (bytesSent == SOCKET_ERROR) - { - UploadFail (parm->hDlg, "Could not upload report", WSAGetLastError()); - throw 1; - } - fileLeft -= grab; - SendMessage (GetDlgItem (parm->hDlg, IDC_BOINGPROGRESS), PBM_SETPOS, ++i, 0); - } - // Send the multipart footer. - bytesSent += send (sock, MultipartFooter, sizeof(MultipartFooter) - 1, 0); - - // And now we're done uploading the report. Yay! - SetWindowText (status, "Report sent"); - - // But we still need a 200 response from the host. Hopefully it gives us one. - HeapFree (GetProcessHeap(), 0, header); - err = CheckServerResponse (parm->hDlg, sock, header, xferbuf, sizeof(xferbuf)); - if (err < 0 || err >= 300) - { - throw 1; - } - - // Fill the edit control with the response body, in case the host wants - // to say, "Thank you for clicking that send button." - ReadResponse (parm->hDlg, header, sock, xferbuf, sizeof(xferbuf), INVALID_HANDLE_VALUE); - - // Close the connection, because we told the host this was a one-shot communication. - closesocket (sock); sock = INVALID_SOCKET; - - // If dbghelp.dll was not available or too old when the report was created, - // ask the user if they want to download it. It's too late to be of any use - // to this report, but it can still be used for future reports. - if (NeedDbgHelp && MessageBox (parm->hDlg, - "Shall I download dbghelp.dll?\n\n" - "This is a Microsoft-supplied DLL that can gather detailed information when a program crashes.\n\n" - "Although it is not essential for "GAMENAME", it will make any future error\n" - "reports more useful, so it is strongly suggested that you answer \"yes.\"\n\n" - "If you answer \"yes,\" dbghelp.dll will be installed in the same directory as "GAMENAME".", - "Download dbghelp.dll?", MB_YESNO|MB_ICONQUESTION) == IDYES) - { - char *bs; - - // Download it to the same directory as zdoom.exe. - GetModuleFileName (NULL, dbghelpPath, MAX_PATH); - dbghelpPath[MAX_PATH] = 0; - bs = strrchr (dbghelpPath, '\\'); - if (bs != NULL) - { - strcpy (bs + 1, "dbghelp.dl_"); - } - else - { - strcpy (dbghelpPath, "dbghelp.dl_"); - } - dbghelp = CreateFile (dbghelpPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); - if (dbghelp != INVALID_HANDLE_VALUE) - { - SetWindowText (status, "Receiving dbghelp..."); - retries = 0; - - // Reopen the socket. We don't need to repeat the lookup, because - // we already know where the host is. - SetWindowText (status, "Reconnecting to " REMOTE_HOST "..."); - sock = socket (aiList->ai_family, aiList->ai_socktype, aiList->ai_protocol); - if (sock == INVALID_SOCKET) - { - UploadFail (parm->hDlg, "Could not create socket", WSAGetLastError()); - throw 1; - } - - // Socket is open. Try reconnecting now. - err = connect (sock, aiList->ai_addr, sizeof(*aiList->ai_addr)); - if (err == SOCKET_ERROR) - { - UploadFail (parm->hDlg, "Failed to reconnect", WSAGetLastError()); - throw 2; - } - SetWindowText (status, "Receiving dbghelp..."); - - // And send the request. - bytesSent = send (sock, DbgHelpRequest, sizeof(DbgHelpRequest)-1, 0); - if (bytesSent == 0 || bytesSent == SOCKET_ERROR) - { - UploadFail (parm->hDlg, "Failed trying to request dbghelp", WSAGetLastError()); - throw 2; - } - - // Ignore any information replies from the server. There shouldn't be any, - // but this loop is here just in case. - err = 100; - while (err / 100 == 1) - { - HeapFree (GetProcessHeap(), 0, header); - err = CheckServerResponse (parm->hDlg, sock, header, xferbuf, sizeof(xferbuf)); - } - // Now, if we haven't received a 200 OK response, give up because we - // shouldn't receive anything but that. - if (err != 200) - { - throw 2; - } - // Write the response body to the dbghelp.dl_ file. - if (!ReadResponse (parm->hDlg, header, sock, xferbuf, sizeof(xferbuf), dbghelp)) - { - UploadFail (parm->hDlg, "Could not receive dbghelp", WSAGetLastError()); - throw 2; - } - CloseHandle (dbghelp); dbghelp = INVALID_HANDLE_VALUE; - - // Now use the Setup API to extract dbghelp.dll from the file we just downloaded. - if (!SetupIterateCabinet (dbghelpPath, 0, CabinetCallback, dbghelpPath)) - { - UploadFail (parm->hDlg, "Extraction of dbghelp failed", GetLastError()); - } - - // And now we're done with that. There's nothing more to do here now. - SetWindowText (status, "Dbghelp installed"); - } - } - } - catch (...) - { - returnval = FALSE; - } - - ShowWindow (GetDlgItem (parm->hDlg, IDC_BOINGPROGRESS), SW_HIDE); - KillTimer (parm->hDlg, 1); - EnableWindow (GetDlgItem (parm->hDlg, IDOK), TRUE); - EnableWindow (GetDlgItem (parm->hDlg, IDC_BOINGEDIT), TRUE); - - if (dbghelp != INVALID_HANDLE_VALUE) CloseHandle (dbghelp); - if (dbghelpPath[0] != '\0') DeleteFile (dbghelpPath); - if (header != NULL) HeapFree (GetProcessHeap(), 0, header); - if (sock != INVALID_SOCKET) closesocket (sock); - if (aiList != NULL) freeaddrinfo (aiList); - WSACleanup (); - return returnval; -} - -//========================================================================== -// -// BoingDlgProc -// -// The dialog procedure for the upload status dialog. Aside from spawning -// off a new thread executing UploadProc, it doesn't do a whole lot. -// -//========================================================================== - -static BOOL CALLBACK BoingDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - UploadParmStruct *parms = (UploadParmStruct *)lParam; - HWND ctrl; - WLONG_PTR iconNum; - HANDLE icon; - DWORD threadID; - - switch (message) - { - case WM_INITDIALOG: - SetTimer (hDlg, 1, 100, NULL); - ctrl = GetDlgItem (hDlg, IDC_BOING); - SetWindowLongPtr (ctrl, GWLP_USERDATA, IDI_BOING1); - parms->hDlg = hDlg; - parms->hThread = CreateThread (NULL, 0, UploadProc, parms, 0, &threadID); - return TRUE; - - case WM_TIMER: - if (wParam == 1) - { - ctrl = GetDlgItem (hDlg, IDC_BOING); - iconNum = GetWindowLongPtr (ctrl, GWLP_USERDATA) + 1; - if (iconNum > IDI_BOING8) iconNum = IDI_BOING1; - SetWindowLongPtr (ctrl, GWLP_USERDATA, iconNum); - icon = LoadImage (g_hInst, MAKEINTRESOURCE(iconNum), IMAGE_ICON, 32, 32, LR_SHARED|LR_DEFAULTCOLOR); - SendMessage (ctrl, STM_SETICON, (WPARAM)icon, 0); - InvalidateRect (ctrl, NULL, FALSE); - SetWindowLongPtr (hDlg, DWLP_MSGRESULT, 0); - return TRUE; - } - break; - - case WM_COMMAND: - if (HIWORD(wParam) == BN_CLICKED) - { - KillTimer (hDlg, 1); - EndDialog (hDlg, LOWORD(wParam)); - } - break; - } - return FALSE; -} - -//========================================================================== -// -// UploadReport -// -// Starts off the upload by showing the upload dialog. -// -//========================================================================== - -static BOOL UploadReport (HANDLE file) -{ - UploadParmStruct uploadParm = { 0, 0, file, UserSummary }; - BOOL res = (BOOL)DialogBoxParam (g_hInst, MAKEINTRESOURCE(IDD_BOING), NULL, (DLGPROC)BoingDlgProc, (LPARAM)&uploadParm); - if (UserSummary != NULL) - { - HeapFree (GetProcessHeap(), 0, UserSummary); - UserSummary = NULL; - } - return res; -} - -#endif // #if 0 - //========================================================================== // // SaveReport @@ -3243,21 +2231,21 @@ static void SaveReport (HANDLE file) sizeof(ofn) #endif , }; - char filename[256]; + WCHAR filename[256]; - ofn.lpstrFilter = "Zip file (*.zip)\0*.zip\0"; - strcpy (filename, "CrashReport.zip"); + ofn.lpstrFilter = L"Zip file (*.zip)\0*.zip\0"; + wcscpy (filename, L"CrashReport.zip"); ofn.lpstrFile = filename; - ofn.nMaxFile = sizeof(filename); + ofn.nMaxFile = countof(filename); - while (GetSaveFileName (&ofn)) + while (GetSaveFileNameW (&ofn)) { - HANDLE ofile = CreateFile (ofn.lpstrFile, GENERIC_WRITE, 0, NULL, + HANDLE ofile = CreateFileW (ofn.lpstrFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (ofile == INVALID_HANDLE_VALUE) { - if (MessageBox (NULL, "Could not open the crash report file", + if (MessageBoxA (NULL, "Could not open the crash report file", "Save As failed", MB_RETRYCANCEL) == IDRETRY) { continue; @@ -3306,7 +2294,7 @@ void DisplayCrashLog () "detailed information about the crash.\n" "\nThis is all that is available:\n\nCode=XXXXXXXX\nAddr=XXXXXXXX"; mysnprintf (ohPoo + countof(ohPoo) - 23, 23, "%08lX\nAddr=%p", CrashCode, CrashAddress); - MessageBox (NULL, ohPoo, GAMENAME" Very Fatal Error", MB_OK|MB_ICONSTOP); + MessageBoxA (NULL, ohPoo, GAMENAME" Very Fatal Error", MB_OK|MB_ICONSTOP); if (WinHlp32 != NULL) { FreeLibrary (WinHlp32); @@ -3314,21 +2302,14 @@ void DisplayCrashLog () } else { - HMODULE uxtheme = LoadLibrary ("uxtheme.dll"); + HMODULE uxtheme = LoadLibraryA ("uxtheme.dll"); if (uxtheme != NULL) { pEnableThemeDialogTexture = (HRESULT (__stdcall *)(HWND,DWORD))GetProcAddress (uxtheme, "EnableThemeDialogTexture"); } INT_PTR result = DialogBox (g_hInst, MAKEINTRESOURCE(IDD_CRASHDIALOG), NULL, (DLGPROC)CrashDlgProc); - if (result == IDYES) - { -#if 0 // Server-side support is not done yet because I am too lazy. - file = MakeZip (); - UploadReport (file); - CloseHandle (file); -#endif - } - else if (result == IDC_SAVEREPORT) + + if (result == IDC_SAVEREPORT) { file = MakeZip (); SaveReport (file); diff --git a/src/win32/i_input.cpp b/src/win32/i_input.cpp index 990ab416e5..676484a301 100644 --- a/src/win32/i_input.cpp +++ b/src/win32/i_input.cpp @@ -553,7 +553,7 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) if (message == WM_WTSSESSION_CHANGE && lParam == (LPARAM)SessionID) { #ifdef _DEBUG - OutputDebugString ("SessionID matched\n"); + OutputDebugStringA ("SessionID matched\n"); #endif // When using fast user switching, XP will lock a session before // disconnecting it, and the session will be unlocked before reconnecting it. @@ -601,7 +601,7 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) #ifdef _DEBUG char foo[256]; mysnprintf (foo, countof(foo), "Session Change: %ld %d\n", lParam, wParam); - OutputDebugString (foo); + OutputDebugStringA (foo); #endif } break; @@ -640,7 +640,7 @@ bool I_InitInput (void *hwnd) FindRawInputFunctions(); // Try for DirectInput 8 first, then DirectInput 3 for NT 4's benefit. - DInputDLL = LoadLibrary("dinput8.dll"); + DInputDLL = LoadLibraryA("dinput8.dll"); if (DInputDLL != NULL) { typedef HRESULT (WINAPI *blah)(HINSTANCE, DWORD, REFIID, LPVOID *, LPUNKNOWN); @@ -666,7 +666,7 @@ bool I_InitInput (void *hwnd) { FreeLibrary(DInputDLL); } - DInputDLL = LoadLibrary ("dinput.dll"); + DInputDLL = LoadLibraryA ("dinput.dll"); if (DInputDLL == NULL) { I_FatalError ("Could not load dinput.dll: %08lx", GetLastError()); @@ -860,13 +860,14 @@ void I_PutInClipboard (const char *str) return; EmptyClipboard (); - HGLOBAL cliphandle = GlobalAlloc (GMEM_DDESHARE, strlen (str) + 1); + auto wstr = WideString(str); + HGLOBAL cliphandle = GlobalAlloc (GMEM_DDESHARE, wstr.length() * 2 + 2); if (cliphandle != NULL) { - char *ptr = (char *)GlobalLock (cliphandle); - strcpy (ptr, str); + wchar_t *ptr = (wchar_t *)GlobalLock (cliphandle); + wcscpy (ptr, wstr.c_str()); GlobalUnlock (cliphandle); - SetClipboardData (CF_TEXT, cliphandle); + SetClipboardData (CF_UNICODETEXT, cliphandle); } CloseClipboard (); } @@ -875,28 +876,21 @@ FString I_GetFromClipboard (bool return_nothing) { FString retstr; HGLOBAL cliphandle; - char *clipstr; - char *nlstr; + wchar_t *clipstr; - if (return_nothing || !IsClipboardFormatAvailable (CF_TEXT) || !OpenClipboard (Window)) + if (return_nothing || !IsClipboardFormatAvailable (CF_UNICODETEXT) || !OpenClipboard (Window)) return retstr; - cliphandle = GetClipboardData (CF_TEXT); - if (cliphandle != NULL) + cliphandle = GetClipboardData (CF_UNICODETEXT); + if (cliphandle != nullptr) { - clipstr = (char *)GlobalLock (cliphandle); - if (clipstr != NULL) + clipstr = (wchar_t *)GlobalLock (cliphandle); + if (clipstr != nullptr) { - // Convert CR-LF pairs to just LF while copying to the FString - for (nlstr = clipstr; *nlstr != '\0'; ++nlstr) - { - if (nlstr[0] == '\r' && nlstr[1] == '\n') - { - nlstr++; - } - retstr += *nlstr; - } - GlobalUnlock (clipstr); + // Convert CR-LF pairs to just LF. + retstr = clipstr; + GlobalUnlock(clipstr); + retstr.Substitute("\r\n", "\n"); } } @@ -967,7 +961,7 @@ static void FindRawInputFunctions() { if (!norawinput) { - HMODULE user32 = GetModuleHandle("user32.dll"); + HMODULE user32 = GetModuleHandleA("user32.dll"); if (user32 == NULL) { diff --git a/src/win32/i_main.cpp b/src/win32/i_main.cpp index 4ca5bdce4d..e6a63980c6 100644 --- a/src/win32/i_main.cpp +++ b/src/win32/i_main.cpp @@ -73,6 +73,7 @@ #include "s_sound.h" #include "vm.h" #include "i_system.h" +#include "gstrings.h" #include "stats.h" #include "st_start.h" @@ -143,17 +144,14 @@ FModule User32Module{"User32"}; namespace OptWin32 { #define DYN_WIN32_SYM(x) decltype(x) x{#x} -DYN_WIN32_SYM(SHGetFolderPathA); DYN_WIN32_SYM(SHGetKnownFolderPath); -DYN_WIN32_SYM(GetLongPathNameA); -DYN_WIN32_SYM(GetMonitorInfoA); #undef DYN_WIN32_SYM } // namespace OptWin32 // PRIVATE DATA DEFINITIONS ------------------------------------------------ -static const char WinClassName[] = GAMENAME "MainWindow"; +static const WCHAR WinClassName[] = WGAMENAME "MainWindow"; static HMODULE hwtsapi32; // handle to wtsapi32.dll static void (*TermFuncs[MAX_TERMS])(void); static int NumTerms; @@ -422,7 +420,6 @@ LRESULT CALLBACK LConProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) HBRUSH hbr; HGDIOBJ oldfont; RECT rect; - int titlelen; SIZE size; LOGFONT lf; TEXTMETRIC tm; @@ -440,7 +437,7 @@ LRESULT CALLBACK LConProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) lf.lfCharSet = ANSI_CHARSET; lf.lfWeight = FW_BOLD; lf.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN; - strcpy (lf.lfFaceName, "Trebuchet MS"); + wcscpy (lf.lfFaceName, L"Trebuchet MS"); GameTitleFont = CreateFontIndirect (&lf); oldfont = SelectObject (hdc, GetStockObject (DEFAULT_GUI_FONT)); @@ -459,7 +456,7 @@ LRESULT CALLBACK LConProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) SelectObject (hdc, oldfont); // Create log read-only edit control - view = CreateWindowEx (WS_EX_NOPARENTNOTIFY, "RichEdit20W", NULL, + view = CreateWindowExW (WS_EX_NOPARENTNOTIFY, L"RichEdit20W", nullptr, WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | ES_MULTILINE | WS_CLIPSIBLINGS, 0, 0, 0, 0, @@ -489,8 +486,8 @@ LRESULT CALLBACK LConProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) ConWindow = view; ReleaseDC (hWnd, hdc); - view = CreateWindowEx (WS_EX_NOPARENTNOTIFY, "STATIC", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SS_OWNERDRAW, 0, 0, 0, 0, hWnd, NULL, inst, NULL); - if (view == NULL) + view = CreateWindowExW (WS_EX_NOPARENTNOTIFY, L"STATIC", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SS_OWNERDRAW, 0, 0, 0, 0, hWnd, nullptr, inst, nullptr); + if (view == nullptr) { return -1; } @@ -526,14 +523,14 @@ LRESULT CALLBACK LConProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) // Calculate width of the title string. SetTextAlign (drawitem->hDC, TA_TOP); oldfont = SelectObject (drawitem->hDC, GameTitleFont != NULL ? GameTitleFont : (HFONT)GetStockObject (DEFAULT_GUI_FONT)); - titlelen = (int)DoomStartupInfo.Name.Len(); - GetTextExtentPoint32 (drawitem->hDC, DoomStartupInfo.Name, titlelen, &size); + auto widename = DoomStartupInfo.Name.WideString(); + GetTextExtentPoint32W (drawitem->hDC, widename.c_str(), (int)widename.length(), &size); // Draw the title. c = (const PalEntry *)&DoomStartupInfo.FgColor; SetTextColor (drawitem->hDC, RGB(c->r,c->g,c->b)); SetBkMode (drawitem->hDC, TRANSPARENT); - TextOut (drawitem->hDC, rect.left + (rect.right - rect.left - size.cx) / 2, 2, DoomStartupInfo.Name, titlelen); + TextOutW (drawitem->hDC, rect.left + (rect.right - rect.left - size.cx) / 2, 2, widename.c_str(), (int)widename.length()); SelectObject (drawitem->hDC, oldfont); return TRUE; } @@ -555,12 +552,12 @@ LRESULT CALLBACK LConProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) // where the command prompt would have been in DOS. if (GameTitleWindow == NULL) { - static const char QuitText[] = "Press any key or click anywhere in the window to quit."; + auto quitmsg = WideString(GStrings("TXT_QUITENDOOM")); SetTextColor (drawitem->hDC, RGB(240,240,240)); SetBkMode (drawitem->hDC, TRANSPARENT); oldfont = SelectObject (drawitem->hDC, (HFONT)GetStockObject (DEFAULT_GUI_FONT)); - TextOut (drawitem->hDC, 3, drawitem->rcItem.bottom - DefaultGUIFontHeight - 3, QuitText, countof(QuitText)-1); + TextOutW (drawitem->hDC, 3, drawitem->rcItem.bottom - DefaultGUIFontHeight - 3, quitmsg.c_str(), (int)quitmsg.length()); SelectObject (drawitem->hDC, oldfont); } return TRUE; @@ -714,12 +711,13 @@ void RestoreConView() void ShowErrorPane(const char *text) { - if (Window == NULL || ConWindow == NULL) + auto widetext = WideString(text); + if (Window == nullptr || ConWindow == nullptr) { if (text != NULL) { - MessageBox (Window, text, - GAMESIG " Fatal Error", MB_OK|MB_ICONSTOP|MB_TASKMODAL); + MessageBoxW (Window, widetext.c_str(), + WGAMENAME " Fatal Error", MB_OK|MB_ICONSTOP|MB_TASKMODAL); } return; } @@ -730,10 +728,10 @@ void ShowErrorPane(const char *text) } if (text != NULL) { - char caption[100]; - mysnprintf(caption, countof(caption), "Fatal Error - " GAMESIG " %s " X64 " (%s)", GetVersionString(), GetGitTime()); - SetWindowText (Window, caption); - ErrorIcon = CreateWindowEx (WS_EX_NOPARENTNOTIFY, "STATIC", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SS_OWNERDRAW, 0, 0, 0, 0, Window, NULL, g_hInst, NULL); + FStringf caption("Fatal Error - " GAMENAME " %s " X64 " (%s)", GetVersionString(), GetGitTime()); + auto wcaption = caption.WideString(); + SetWindowTextW (Window, wcaption.c_str()); + ErrorIcon = CreateWindowExW (WS_EX_NOPARENTNOTIFY, L"STATIC", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SS_OWNERDRAW, 0, 0, 0, 0, Window, NULL, g_hInst, NULL); if (ErrorIcon != NULL) { SetWindowLong (ErrorIcon, GWL_ID, IDC_ICONPIC); @@ -768,21 +766,21 @@ void ShowErrorPane(const char *text) paraformat.dwMask = PFM_STARTINDENT | PFM_OFFSETINDENT | PFM_RIGHTINDENT; paraformat.dxStartIndent = paraformat.dxOffset = paraformat.dxRightIndent = 120; SendMessage (ConWindow, EM_SETPARAFORMAT, 0, (LPARAM)¶format); - SendMessage (ConWindow, EM_REPLACESEL, FALSE, (LPARAM)"\n"); + SendMessageW (ConWindow, EM_REPLACESEL, FALSE, (LPARAM)L"\n"); // Find out where the error lines start for the error icon display control. SendMessage (ConWindow, EM_EXGETSEL, 0, (LPARAM)&end); ErrorIconChar = end.cpMax; // Now start adding the actual error message. - SendMessage (ConWindow, EM_REPLACESEL, FALSE, (LPARAM)"Execution could not continue.\n\n"); + SendMessageW (ConWindow, EM_REPLACESEL, FALSE, (LPARAM)L"Execution could not continue.\n\n"); // Restore old charformat but with light yellow text. oldformat.crTextColor = RGB(255,255,170); SendMessage (ConWindow, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&oldformat); // Add the error text. - SendMessage (ConWindow, EM_REPLACESEL, FALSE, (LPARAM)text); + SendMessageW (ConWindow, EM_REPLACESEL, FALSE, (LPARAM)widetext.c_str()); // Make sure the error text is not scrolled below the window. SendMessage (ConWindow, EM_LINESCROLL, 0, SendMessage (ConWindow, EM_GETLINECOUNT, 0, 0)); @@ -798,8 +796,7 @@ void ShowErrorPane(const char *text) { if (bRet == -1) { - MessageBox (Window, text, - GAMESIG " Fatal Error", MB_OK|MB_ICONSTOP|MB_TASKMODAL); + MessageBoxW (Window, widetext.c_str(), WGAMENAME " Fatal Error", MB_OK|MB_ICONSTOP|MB_TASKMODAL); return; } else if (!IsDialogMessage (ErrorPane, &msg)) @@ -837,7 +834,15 @@ void DoMain (HINSTANCE hInstance) _set_new_handler (NewFailure); #endif - Args = new FArgs(__argc, __argv); + // Do not use the multibyte __argv here because we want UTF-8 arguments + // and those can only be done by converting the Unicode variants. + Args = new FArgs(); + auto argc = __argc; + auto wargv = __wargv; + for (int i = 0; i < argc; i++) + { + Args->AppendArg(FString(wargv[i])); + } // Load Win32 modules Kernel32Module.Load({"kernel32.dll"}); @@ -847,7 +852,7 @@ void DoMain (HINSTANCE hInstance) // Under XP, get our session ID so we can know when the user changes/locks sessions. // Since we need to remain binary compatible with older versions of Windows, we // need to extract the ProcessIdToSessionId function from kernel32.dll manually. - HMODULE kernel = GetModuleHandle ("kernel32.dll"); + HMODULE kernel = GetModuleHandleA ("kernel32.dll"); if (Args->CheckParm("-stdout")) { @@ -917,23 +922,19 @@ void DoMain (HINSTANCE hInstance) atterm (I_Quit); // Figure out what directory the program resides in. - char progbuff[1024]; - if (GetModuleFileName(nullptr, progbuff, sizeof progbuff) == 0) + WCHAR progbuff[1024]; + if (GetModuleFileNameW(nullptr, progbuff, sizeof progbuff) == 0) { I_FatalError("Could not determine program location."); } progbuff[1023] = '\0'; - - char *program = progbuff; - progdir = program; - program = progdir.LockBuffer(); - if (char *lastsep = strrchr(program, '\\')) + if (auto lastsep = wcsrchr(progbuff, '\\')) { lastsep[1] = '\0'; } - FixPathSeperator(program); - progdir.Truncate((long)strlen(program)); - progdir.UnlockBuffer(); + + progdir = progbuff; + FixPathSeperator(progdir); HDC screenDC = GetDC(0); int dpi = GetDeviceCaps(screenDC, LOGPIXELSX); @@ -964,19 +965,19 @@ void DoMain (HINSTANCE hInstance) WndClass.hCursor = LoadCursor (NULL, IDC_ARROW); WndClass.hbrBackground = NULL; WndClass.lpszMenuName = NULL; - WndClass.lpszClassName = (LPCTSTR)WinClassName; + WndClass.lpszClassName = WinClassName; /* register this new class with Windows */ if (!RegisterClass((LPWNDCLASS)&WndClass)) I_FatalError ("Could not register window class"); /* create window */ - char caption[100]; - mysnprintf(caption, countof(caption), "" GAMESIG " %s " X64 " (%s)", GetVersionString(), GetGitTime()); - Window = CreateWindowEx( + FStringf caption("" GAMESIG " %s " X64 " (%s)", GetVersionString(), GetGitTime()); + std::wstring wcaption = caption.WideString(); + Window = CreateWindowExW( WS_EX_APPWINDOW, - (LPCTSTR)WinClassName, - (LPCTSTR)caption, + WinClassName, + wcaption.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN, x, y, width, height, (HWND) NULL, @@ -1260,20 +1261,27 @@ static void infiniterecursion(int foo) } #endif +// Setting this to 'true' allows getting the standard notification for a crash +// which offers the very important feature to open a debugger and see the crash in context right away. +CUSTOM_CVAR(Bool, disablecrashlog, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +{ + SetUnhandledExceptionFilter(!*self ? CatchAllExceptions : nullptr); +} + //========================================================================== // // WinMain // //========================================================================== -int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE nothing, LPSTR cmdline, int nCmdShow) +int WINAPI wWinMain (HINSTANCE hInstance, HINSTANCE nothing, LPWSTR cmdline, int nCmdShow) { g_hInst = hInstance; InitCommonControls (); // Load some needed controls and be pretty under XP // We need to load riched20.dll so that we can create the control. - if (NULL == LoadLibrary ("riched20.dll")) + if (NULL == LoadLibraryA ("riched20.dll")) { // This should only happen on basic Windows 95 installations, but since we // don't support Windows 95, we have no obligation to provide assistance in @@ -1283,27 +1291,27 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE nothing, LPSTR cmdline, int n } #if !defined(__GNUC__) && defined(_DEBUG) - if (__argc == 2 && strcmp (__argv[1], "TestCrash") == 0) + if (__argc == 2 && __wargv != nullptr && wcscmp (__wargv[1], L"TestCrash") == 0) { __try { *(int *)0 = 0; } __except(CrashPointers = *GetExceptionInformation(), - CreateCrashLog (__argv[1], 9, NULL), EXCEPTION_EXECUTE_HANDLER) + CreateCrashLog ("TestCrash", 9, NULL), EXCEPTION_EXECUTE_HANDLER) { } DisplayCrashLog (); exit (0); } - if (__argc == 2 && strcmp (__argv[1], "TestStackCrash") == 0) + if (__argc == 2 && __wargv != nullptr && wcscmp (__wargv[1], L"TestStackCrash") == 0) { __try { infiniterecursion(1); } __except(CrashPointers = *GetExceptionInformation(), - CreateCrashLog (__argv[1], 14, NULL), EXCEPTION_EXECUTE_HANDLER) + CreateCrashLog ("TestStackCrash", 14, NULL), EXCEPTION_EXECUTE_HANDLER) { } DisplayCrashLog (); @@ -1357,12 +1365,15 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE nothing, LPSTR cmdline, int n // each platform has its own specific version of this function. void I_SetWindowTitle(const char* caption) { - if (caption) - SetWindowText(Window, (LPCTSTR)caption); + std::wstring widecaption; + if (!caption) + { + FStringf default_caption("" GAMENAME " %s " X64 " (%s)", GetVersionString(), GetGitTime()); + widecaption = default_caption.WideString(); + } else { - char default_caption[100]; - mysnprintf(default_caption, countof(default_caption), "" GAMESIG " %s " X64 " (%s)", GetVersionString(), GetGitTime()); - SetWindowText(Window, default_caption); + widecaption = WideString(caption); } + SetWindowText(Window, widecaption.c_str()); } diff --git a/src/win32/i_specialpaths.cpp b/src/win32/i_specialpaths.cpp index ecd24efb1a..d7a9e7c2e8 100644 --- a/src/win32/i_specialpaths.cpp +++ b/src/win32/i_specialpaths.cpp @@ -68,15 +68,14 @@ bool UseKnownFolders() // of the program. (e.g. Somebody could add write access while the // program is running.) static INTBOOL iswritable = -1; - FString testpath; HANDLE file; if (iswritable >= 0) { return !iswritable; } - testpath << progdir << "writest"; - file = CreateFile(testpath, GENERIC_READ | GENERIC_WRITE, 0, NULL, + std::wstring testpath = progdir.WideString() + L"writest"; + file = CreateFile(testpath.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, NULL); if (file != INVALID_HANDLE_VALUE) @@ -102,19 +101,14 @@ bool UseKnownFolders() bool GetKnownFolder(int shell_folder, REFKNOWNFOLDERID known_folder, bool create, FString &path) { - using OptWin32::SHGetFolderPathA; using OptWin32::SHGetKnownFolderPath; - char pathstr[MAX_PATH]; + WCHAR pathstr[MAX_PATH]; // SHGetKnownFolderPath knows about more folders than SHGetFolderPath, but is // new to Vista, hence the reason we support both. if (!SHGetKnownFolderPath) { - // NT4 doesn't even have this function. - if (!SHGetFolderPathA) - return false; - if (shell_folder < 0) { // Not supported by SHGetFolderPath return false; @@ -123,7 +117,7 @@ bool GetKnownFolder(int shell_folder, REFKNOWNFOLDERID known_folder, bool create { shell_folder |= CSIDL_FLAG_CREATE; } - if (FAILED(SHGetFolderPathA(NULL, shell_folder, NULL, 0, pathstr))) + if (FAILED(SHGetFolderPathW(NULL, shell_folder, NULL, 0, pathstr))) { return false; } @@ -137,18 +131,9 @@ bool GetKnownFolder(int shell_folder, REFKNOWNFOLDERID known_folder, bool create { return false; } - // FIXME: Support Unicode, at least for filenames. This function - // has no MBCS equivalent, so we have to convert it since we don't - // support Unicode. :( - bool converted = false; - if (WideCharToMultiByte(GetACP(), WC_NO_BEST_FIT_CHARS, wpath, -1, - pathstr, countof(pathstr), NULL, NULL) > 0) - { - path = pathstr; - converted = true; - } + path = wpath; CoTaskMemFree(wpath); - return converted; + return true; } } @@ -279,14 +264,14 @@ FString M_GetConfigPath(bool for_reading) { // Is it valid for a user name to have slashes? // Check for them and substitute just in case. - char *probe = uname; + auto probe = uname; while (*probe != 0) { if (*probe == '\\' || *probe == '/') *probe = '_'; ++probe; } - path << GAMENAMELOWERCASE "-" << uname << ".ini"; + path << GAMENAMELOWERCASE "-" << FString(uname) << ".ini"; } else { // Couldn't get user name, so just use zdoom.ini diff --git a/src/win32/i_system.cpp b/src/win32/i_system.cpp index bc0fb865bc..f9691146ae 100644 --- a/src/win32/i_system.cpp +++ b/src/win32/i_system.cpp @@ -69,6 +69,7 @@ #include "resource.h" #include "x86.h" #include "stats.h" +#include "v_text.h" #include "d_main.h" #include "d_net.h" @@ -285,10 +286,10 @@ static void SubsetLanguageIDs(LCID id, LCTYPE type, int idx) LCID langid; char *idp; - if (!GetLocaleInfo(id, type, buf, 8)) + if (!GetLocaleInfoA(id, type, buf, 8)) return; langid = MAKELCID(strtoul(buf, NULL, 16), SORT_DEFAULT); - if (!GetLocaleInfo(langid, LOCALE_SABBREVLANGNAME, buf, 8)) + if (!GetLocaleInfoA(langid, LOCALE_SABBREVLANGNAME, buf, 8)) return; idp = (char *)(&LanguageIDs[idx]); memset (idp, 0, 4); @@ -444,7 +445,7 @@ void I_FatalError(const char *error, ...) va_start(argptr, error); myvsnprintf(errortext, MAX_ERRORTEXT, error, argptr); va_end(argptr); - OutputDebugString(errortext); + OutputDebugStringA(errortext); // Record error to log (if logging) if (Logfile) @@ -480,79 +481,15 @@ void I_Error(const char *error, ...) va_start(argptr, error); myvsnprintf(errortext, MAX_ERRORTEXT, error, argptr); va_end(argptr); - OutputDebugString(errortext); + if (IsDebuggerPresent()) + { + auto wstr = WideString(errortext); + OutputDebugStringW(wstr.c_str()); + } throw CRecoverableError(errortext); } -//========================================================================== -// -// ToEditControl -// -// Converts string to Unicode and inserts it into the control. -// -//========================================================================== - -void ToEditControl(HWND edit, const char *buf, wchar_t *wbuf, int bpos) -{ - // Let's just do this ourself. It's not hard, and we can compensate for - // special console characters at the same time. -#if 0 - MultiByteToWideChar(1252 /* Western */, 0, buf, bpos, wbuf, countof(wbuf)); - wbuf[bpos] = 0; -#else - static wchar_t notlatin1[32] = // code points 0x80-0x9F - { - 0x20AC, // Euro sign - 0x0081, // Undefined - 0x201A, // Single low-9 quotation mark - 0x0192, // Latin small letter f with hook - 0x201E, // Double low-9 quotation mark - 0x2026, // Horizontal ellipsis - 0x2020, // Dagger - 0x2021, // Double dagger - 0x02C6, // Modifier letter circumflex accent - 0x2030, // Per mille sign - 0x0160, // Latin capital letter S with caron - 0x2039, // Single left-pointing angle quotation mark - 0x0152, // Latin capital ligature OE - 0x008D, // Undefined - 0x017D, // Latin capital letter Z with caron - 0x008F, // Undefined - 0x0090, // Undefined - 0x2018, // Left single quotation mark - 0x2019, // Right single quotation mark - 0x201C, // Left double quotation mark - 0x201D, // Right double quotation mark - 0x2022, // Bullet - 0x2013, // En dash - 0x2014, // Em dash - 0x02DC, // Small tilde - 0x2122, // Trade mark sign - 0x0161, // Latin small letter s with caron - 0x203A, // Single right-pointing angle quotation mark - 0x0153, // Latin small ligature oe - 0x009D, // Undefined - 0x017E, // Latin small letter z with caron - 0x0178 // Latin capital letter Y with diaeresis - }; - for (int i = 0; i <= bpos; ++i) - { - wchar_t code = (uint8_t)buf[i]; - if (code >= 0x1D && code <= 0x1F) - { // The bar characters, most commonly used to indicate map changes - code = 0x2550; // Box Drawings Double Horizontal - } - else if (code >= 0x80 && code <= 0x9F) - { - code = notlatin1[code - 0x80]; - } - wbuf[i] = code; - } -#endif - SendMessageW(edit, EM_REPLACESEL, FALSE, (LPARAM)wbuf); -} - //========================================================================== // // I_PrintStr @@ -562,13 +499,12 @@ void ToEditControl(HWND edit, const char *buf, wchar_t *wbuf, int bpos) // //========================================================================== -static void DoPrintStr(const char *cp, HWND edit, HANDLE StdOut) +static void DoPrintStr(const char *cpt, HWND edit, HANDLE StdOut) { - if (edit == NULL && StdOut == NULL) + if (edit == nullptr && StdOut == nullptr && !con_debugoutput) return; - char buf[256]; - wchar_t wbuf[countof(buf)]; + wchar_t wbuf[256]; int bpos = 0; CHARRANGE selection; CHARRANGE endselection; @@ -590,32 +526,53 @@ static void DoPrintStr(const char *cp, HWND edit, HANDLE StdOut) lines_before = (LONG)SendMessage(edit, EM_GETLINECOUNT, 0, 0); } - while (*cp != 0) + const uint8_t *cptr = (const uint8_t*)cpt; + + auto outputIt = [&]() { - // 28 is the escape code for a color change. - if ((*cp == 28 && bpos != 0) || bpos == 255) + wbuf[bpos] = 0; + if (edit != nullptr) { - buf[bpos] = 0; - if (edit != NULL) - { - ToEditControl(edit, buf, wbuf, bpos); - } - if (StdOut != NULL) - { - DWORD bytes_written; - WriteFile(StdOut, buf, bpos, &bytes_written, NULL); - } - bpos = 0; + SendMessageW(edit, EM_REPLACESEL, FALSE, (LPARAM)wbuf); } - if (*cp != 28) + if (con_debugoutput) { - buf[bpos++] = *cp++; + OutputDebugStringW(wbuf); + } + if (StdOut != nullptr) + { + // Convert back to UTF-8. + DWORD bytes_written; + if (!FancyStdOut) + { + FString conout(wbuf); + WriteFile(StdOut, conout.GetChars(), (DWORD)conout.Len(), &bytes_written, NULL); + } + else + { + WriteConsoleW(StdOut, wbuf, bpos, &bytes_written, nullptr); + } + } + bpos = 0; + }; + + while (int chr = GetCharFromString(cptr)) + { + if ((chr == TEXTCOLOR_ESCAPE && bpos != 0) || bpos == 255) + { + outputIt(); + } + if (chr != TEXTCOLOR_ESCAPE) + { + if (chr >= 0x1D && chr <= 0x1F) + { // The bar characters, most commonly used to indicate map changes + chr = 0x2550; // Box Drawings Double Horizontal + } + wbuf[bpos++] = chr; } else { - const uint8_t *color_id = (const uint8_t *)cp + 1; - EColorRange range = V_ParseFontColor(color_id, CR_UNTRANSLATED, CR_YELLOW); - cp = (const char *)color_id; + EColorRange range = V_ParseFontColor(cptr, CR_UNTRANSLATED, CR_YELLOW); if (range != CR_UNDEFINED) { @@ -662,16 +619,7 @@ static void DoPrintStr(const char *cp, HWND edit, HANDLE StdOut) } if (bpos != 0) { - buf[bpos] = 0; - if (edit != NULL) - { - ToEditControl(edit, buf, wbuf, bpos); - } - if (StdOut != NULL) - { - DWORD bytes_written; - WriteFile(StdOut, buf, bpos, &bytes_written, NULL); - } + outputIt(); } if (edit != NULL) @@ -702,35 +650,12 @@ static TArray bufferedConsoleStuff; void I_DebugPrint(const char *cp) { - OutputDebugStringA(cp); + auto wstr = WideString(cp); + OutputDebugStringW(wstr.c_str()); } void I_PrintStr(const char *cp) { - if (con_debugoutput) - { - // Strip out any color escape sequences before writing to debug output - TArray copy(strlen(cp) + 1, true); - const char * srcp = cp; - char * dstp = copy.Data(); - - while (*srcp != 0) - { - if (*srcp!=0x1c && *srcp!=0x1d && *srcp!=0x1e && *srcp!=0x1f) - { - *dstp++=*srcp++; - } - else - { - if (srcp[1]!=0) srcp+=2; - else break; - } - } - *dstp=0; - - OutputDebugStringA(copy.Data()); - } - if (ConWindowHidden) { bufferedConsoleStuff.Push(cp); @@ -768,7 +693,7 @@ static void SetQueryIWad(HWND dialog) if (!query && queryiwad) { - MessageBox(dialog, + MessageBoxA(dialog, "You have chosen not to show this dialog box in the future.\n" "If you wish to see it again, hold down SHIFT while starting " GAMENAME ".", "Don't ask me this again", @@ -796,12 +721,14 @@ BOOL CALLBACK IWADBoxCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lPa case WM_INITDIALOG: // Add our program name to the window title { - TCHAR label[256]; + WCHAR label[256]; FString newlabel; - GetWindowText(hDlg, label, countof(label)); - newlabel.Format(GAMESIG " %s: %s", GetVersionString(), label); - SetWindowText(hDlg, newlabel.GetChars()); + GetWindowTextW(hDlg, label, countof(label)); + FString alabel(label); + newlabel.Format(GAMESIG " %s: %s", GetVersionString(), alabel.GetChars()); + auto wlabel = newlabel.WideString(); + SetWindowTextW(hDlg, wlabel.c_str()); } // [SP] Upstreamed from Zandronum @@ -818,20 +745,20 @@ BOOL CALLBACK IWADBoxCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lPa // Set up our version string. sprintf(szString, "Version %s.", GetVersionString()); - SetDlgItemText (hDlg, IDC_WELCOME_VERSION, szString); + SetDlgItemTextA (hDlg, IDC_WELCOME_VERSION, szString); // Populate the list with all the IWADs found ctrl = GetDlgItem(hDlg, IDC_IWADLIST); for (i = 0; i < NumWads; i++) { - FString work; const char *filepart = strrchr(WadList[i].Path, '/'); if (filepart == NULL) filepart = WadList[i].Path; else filepart++; - work.Format("%s (%s)", WadList[i].Name.GetChars(), filepart); - SendMessage(ctrl, LB_ADDSTRING, 0, (LPARAM)work.GetChars()); + FStringf work("%s (%s)", WadList[i].Name.GetChars(), filepart); + std::wstring wide = work.WideString(); + SendMessage(ctrl, LB_ADDSTRING, 0, (LPARAM)wide.c_str()); SendMessage(ctrl, LB_SETITEMDATA, i, (LPARAM)i); } SendMessage(ctrl, LB_SETCURSEL, DefaultWad, 0); @@ -1177,7 +1104,7 @@ bool I_WriteIniFailed() ); errortext.Format ("The config file %s could not be written:\n%s", GameConfig->GetPathName(), lpMsgBuf); LocalFree (lpMsgBuf); - return MessageBox(Window, errortext.GetChars(), GAMENAME " configuration not saved", MB_ICONEXCLAMATION | MB_RETRYCANCEL) == IDRETRY; + return MessageBoxA(Window, errortext.GetChars(), GAMENAME " configuration not saved", MB_ICONEXCLAMATION | MB_RETRYCANCEL) == IDRETRY; } //========================================================================== @@ -1188,9 +1115,13 @@ bool I_WriteIniFailed() // //========================================================================== + void *I_FindFirst(const char *filespec, findstate_t *fileinfo) { - return FindFirstFileA(filespec, (LPWIN32_FIND_DATAA)fileinfo); + static_assert(sizeof(WIN32_FIND_DATAW) == sizeof(fileinfo->FindData), "Findata size mismatch"); + auto widespec = WideString(filespec); + fileinfo->UTF8Name = ""; + return FindFirstFileW(widespec.c_str(), (LPWIN32_FIND_DATAW)&fileinfo->FindData); } //========================================================================== @@ -1203,7 +1134,8 @@ void *I_FindFirst(const char *filespec, findstate_t *fileinfo) int I_FindNext(void *handle, findstate_t *fileinfo) { - return !FindNextFileA((HANDLE)handle, (LPWIN32_FIND_DATAA)fileinfo); + fileinfo->UTF8Name = ""; + return !FindNextFileW((HANDLE)handle, (LPWIN32_FIND_DATAW)&fileinfo->FindData); } //========================================================================== @@ -1219,6 +1151,20 @@ int I_FindClose(void *handle) return FindClose((HANDLE)handle); } +//========================================================================== +// +// I_FindName +// +// Returns the name for an entry +// +//========================================================================== + +const char *I_FindName(findstate_t *fileinfo) +{ + if (fileinfo->UTF8Name.IsEmpty()) fileinfo->UTF8Name = fileinfo->FindData.Name; + return fileinfo->UTF8Name.GetChars(); +} + //========================================================================== // // QueryPathKey @@ -1227,26 +1173,23 @@ int I_FindClose(void *handle) // //========================================================================== -static bool QueryPathKey(HKEY key, const char *keypath, const char *valname, FString &value) +static bool QueryPathKey(HKEY key, const wchar_t *keypath, const wchar_t *valname, FString &value) { HKEY pathkey; DWORD pathtype; DWORD pathlen; LONG res; + value = ""; if(ERROR_SUCCESS == RegOpenKeyEx(key, keypath, 0, KEY_QUERY_VALUE, &pathkey)) { if (ERROR_SUCCESS == RegQueryValueEx(pathkey, valname, 0, &pathtype, NULL, &pathlen) && pathtype == REG_SZ && pathlen != 0) { // Don't include terminating null in count - char *chars = value.LockNewBuffer(pathlen - 1); - res = RegQueryValueEx(pathkey, valname, 0, NULL, (LPBYTE)chars, &pathlen); - value.UnlockBuffer(); - if (res != ERROR_SUCCESS) - { - value = ""; - } + TArray chars(pathlen + 1, true); + res = RegQueryValueEx(pathkey, valname, 0, NULL, (LPBYTE)chars.Data(), &pathlen); + if (res == ERROR_SUCCESS) value = FString(chars.Data()); } RegCloseKey(pathkey); } @@ -1268,35 +1211,35 @@ TArray I_GetGogPaths() { TArray result; FString path; - FString gamepath; + std::wstring gamepath; #ifdef _WIN64 - FString gogregistrypath = "Software\\Wow6432Node\\GOG.com\\Games"; + std::wstring gogregistrypath = L"Software\\Wow6432Node\\GOG.com\\Games"; #else // If a 32-bit ZDoom runs on a 64-bit Windows, this will be transparently and // automatically redirected to the Wow6432Node address instead, so this address // should be safe to use in all cases. - FString gogregistrypath = "Software\\GOG.com\\Games"; + std::wstring gogregistrypath = L"Software\\GOG.com\\Games"; #endif // Look for Ultimate Doom - gamepath = gogregistrypath + "\\1435827232"; - if (QueryPathKey(HKEY_LOCAL_MACHINE, gamepath.GetChars(), "Path", path)) + gamepath = gogregistrypath + L"\\1435827232"; + if (QueryPathKey(HKEY_LOCAL_MACHINE, gamepath.c_str(), L"Path", path)) { result.Push(path); // directly in install folder } // Look for Doom II - gamepath = gogregistrypath + "\\1435848814"; - if (QueryPathKey(HKEY_LOCAL_MACHINE, gamepath.GetChars(), "Path", path)) + gamepath = gogregistrypath + L"\\1435848814"; + if (QueryPathKey(HKEY_LOCAL_MACHINE, gamepath.c_str(), L"Path", path)) { result.Push(path + "/doom2"); // in a subdirectory // If direct support for the Master Levels is ever added, they are in path + /master/wads } // Look for Final Doom - gamepath = gogregistrypath + "\\1435848742"; - if (QueryPathKey(HKEY_LOCAL_MACHINE, gamepath.GetChars(), "Path", path)) + gamepath = gogregistrypath + L"\\1435848742"; + if (QueryPathKey(HKEY_LOCAL_MACHINE, gamepath.c_str(), L"Path", path)) { // in subdirectories result.Push(path + "/TNT"); @@ -1304,15 +1247,15 @@ TArray I_GetGogPaths() } // Look for Doom 3: BFG Edition - gamepath = gogregistrypath + "\\1135892318"; - if (QueryPathKey(HKEY_LOCAL_MACHINE, gamepath.GetChars(), "Path", path)) + gamepath = gogregistrypath + L"\\1135892318"; + if (QueryPathKey(HKEY_LOCAL_MACHINE, gamepath.c_str(), L"Path", path)) { result.Push(path + "/base/wads"); // in a subdirectory } // Look for Strife: Veteran Edition - gamepath = gogregistrypath + "\\1432899949"; - if (QueryPathKey(HKEY_LOCAL_MACHINE, gamepath.GetChars(), "Path", path)) + gamepath = gogregistrypath + L"\\1432899949"; + if (QueryPathKey(HKEY_LOCAL_MACHINE, gamepath.c_str(), L"Path", path)) { result.Push(path); // directly in install folder } @@ -1346,9 +1289,9 @@ TArray I_GetSteamPath() FString path; - if (!QueryPathKey(HKEY_CURRENT_USER, "Software\\Valve\\Steam", "SteamPath", path)) + if (!QueryPathKey(HKEY_CURRENT_USER, L"Software\\Valve\\Steam", L"SteamPath", path)) { - if (!QueryPathKey(HKEY_LOCAL_MACHINE, "Software\\Valve\\Steam", "InstallPath", path)) + if (!QueryPathKey(HKEY_LOCAL_MACHINE, L"Software\\Valve\\Steam", L"InstallPath", path)) return result; } path += "/SteamApps/common/"; @@ -1375,7 +1318,7 @@ unsigned int I_MakeRNGSeed() // If RtlGenRandom is available, use that to avoid increasing the // working set by pulling in all of the crytographic API. - HMODULE advapi = GetModuleHandle("advapi32.dll"); + HMODULE advapi = GetModuleHandleA("advapi32.dll"); if (advapi != NULL) { BOOLEAN (APIENTRY *RtlGenRandom)(void *, ULONG) = @@ -1414,28 +1357,21 @@ unsigned int I_MakeRNGSeed() // //========================================================================== -FString I_GetLongPathName(FString shortpath) +FString I_GetLongPathName(const FString &shortpath) { - using OptWin32::GetLongPathNameA; - - // Doesn't exist on NT4 - if (!GetLongPathNameA) - return shortpath; - - DWORD buffsize = GetLongPathNameA(shortpath.GetChars(), NULL, 0); + std::wstring wshortpath = shortpath.WideString(); + DWORD buffsize = GetLongPathNameW(wshortpath.c_str(), nullptr, 0); if (buffsize == 0) { // nothing to change (it doesn't exist, maybe?) return shortpath; } - TCHAR *buff = new TCHAR[buffsize]; - DWORD buffsize2 = GetLongPathNameA(shortpath.GetChars(), buff, buffsize); + TArray buff(buffsize, true); + DWORD buffsize2 = GetLongPathNameW(wshortpath.c_str(), buff.Data(), buffsize); if (buffsize2 >= buffsize) { // Failure! Just return the short path - delete[] buff; return shortpath; } - FString longpath(buff, buffsize2); - delete[] buff; + FString longpath(buff.Data()); return longpath; } @@ -1450,10 +1386,10 @@ FString I_GetLongPathName(FString shortpath) // //========================================================================== -int _stat64i32(const char *path, struct _stat64i32 *buffer) +int _wstat64i32(const wchar_t *path, struct _stat64i32 *buffer) { WIN32_FILE_ATTRIBUTE_DATA data; - if(!GetFileAttributesEx(path, GetFileExInfoStandard, &data)) + if(!GetFileAttributesExW(path, GetFileExInfoStandard, &data)) return -1; buffer->st_ino = 0; diff --git a/src/win32/i_system.h b/src/win32/i_system.h index 59551a865c..d03f210443 100644 --- a/src/win32/i_system.h +++ b/src/win32/i_system.h @@ -137,7 +137,7 @@ typedef long WLONG_PTR; #endif // Wrapper for GetLongPathName -FString I_GetLongPathName(FString shortpath); +FString I_GetLongPathName(const FString &shortpath); // Directory searching routines @@ -152,12 +152,17 @@ FString I_GetLongPathName(FString shortpath); struct findstate_t { private: - uint32_t Attribs; - uint32_t Times[3*2]; - uint32_t Size[2]; - uint32_t Reserved[2]; - char Name[MAX_PATH]; - char AltName[14]; + struct WinData + { + uint32_t Attribs; + uint32_t Times[3 * 2]; + uint32_t Size[2]; + uint32_t Reserved[2]; + wchar_t Name[MAX_PATH]; + wchar_t AltName[14]; + }; + WinData FindData; + FString UTF8Name; friend void *I_FindFirst(const char *filespec, findstate_t *fileinfo); friend int I_FindNext(void *handle, findstate_t *fileinfo); @@ -169,13 +174,10 @@ void *I_FindFirst (const char *filespec, findstate_t *fileinfo); int I_FindNext (void *handle, findstate_t *fileinfo); int I_FindClose (void *handle); -inline const char *I_FindName(findstate_t *fileinfo) -{ - return fileinfo->Name; -} +const char *I_FindName(findstate_t *fileinfo); inline int I_FindAttr(findstate_t *fileinfo) { - return fileinfo->Attribs; + return fileinfo->FindData.Attribs; } #define FA_RDONLY 0x00000001 diff --git a/src/win32/optwin32.h b/src/win32/optwin32.h index c6cced98b7..2a54e8e5d7 100644 --- a/src/win32/optwin32.h +++ b/src/win32/optwin32.h @@ -9,15 +9,10 @@ #include "i_module.h" -extern FModule Kernel32Module; extern FModule Shell32Module; -extern FModule User32Module; namespace OptWin32 { -extern TOptProc SHGetFolderPathA; extern TOptProc SHGetKnownFolderPath; -extern TOptProc GetLongPathNameA; -extern TOptProc GetMonitorInfoA; } // namespace OptWin32 diff --git a/src/win32/resource.h b/src/win32/resource.h index cf41b6f1f5..dcb94999ff 100644 --- a/src/win32/resource.h +++ b/src/win32/resource.h @@ -20,15 +20,6 @@ #define IDB_BITMAP1 131 #define IDB_DEADGUY 131 #define IDD_CRASHDETAILS 133 -#define IDI_BOING1 137 -#define IDI_BOING2 138 -#define IDI_BOING3 139 -#define IDI_BOING4 140 -#define IDI_BOING5 141 -#define IDI_BOING6 142 -#define IDI_BOING7 143 -#define IDI_BOING8 144 -#define IDD_BOING 145 #define IDD_CRASHOVERVIEW 147 #define IDD_ERRORPANE 148 #define IDD_NETSTARTPANE 149 @@ -83,7 +74,6 @@ #define IDC_BUTTON2 1062 #define IDC_CRASHDETAILS 1062 #define IDC_DEADGUYVIEWER 1063 -#define IDC_BOING 1065 #define IDC_CRASHFILESIZE 1066 #define IDC_BUTTON1 1071 #define IDC_BOINGSTATUS 1072 diff --git a/src/win32/st_start.cpp b/src/win32/st_start.cpp index c2a0d59414..dc6b0694d7 100644 --- a/src/win32/st_start.cpp +++ b/src/win32/st_start.cpp @@ -400,7 +400,8 @@ void FBasicStartupScreen::NetInit(const char *message, int numplayers) { HWND ctl; - SetDlgItemText (NetStartPane, IDC_NETSTARTMESSAGE, message); + std::wstring wmessage = WideString(message); + SetDlgItemTextW (NetStartPane, IDC_NETSTARTMESSAGE, wmessage.c_str()); ctl = GetDlgItem (NetStartPane, IDC_NETSTARTPROGRESS); if (numplayers == 0) @@ -416,7 +417,7 @@ void FBasicStartupScreen::NetInit(const char *message, int numplayers) // If we don't set the PBS_MARQUEE style, then the marquee will never show up. SetWindowLong (ctl, GWL_STYLE, GetWindowLong (ctl, GWL_STYLE) | PBS_MARQUEE); } - SetDlgItemText (NetStartPane, IDC_NETSTARTCOUNT, ""); + SetDlgItemTextW (NetStartPane, IDC_NETSTARTCOUNT, L""); } else { @@ -429,7 +430,7 @@ void FBasicStartupScreen::NetInit(const char *message, int numplayers) if (numplayers == 1) { SendMessage (ctl, PBM_SETPOS, 1, 0); - SetDlgItemText (NetStartPane, IDC_NETSTARTCOUNT, ""); + SetDlgItemTextW (NetStartPane, IDC_NETSTARTCOUNT, L""); } } } @@ -510,7 +511,7 @@ void FBasicStartupScreen :: NetProgress(int count) char buf[16]; mysnprintf (buf, countof(buf), "%d/%d", NetCurPos, NetMaxPos); - SetDlgItemText (NetStartPane, IDC_NETSTARTCOUNT, buf); + SetDlgItemTextA (NetStartPane, IDC_NETSTARTCOUNT, buf); SendDlgItemMessage (NetStartPane, IDC_NETSTARTPROGRESS, PBM_SETPOS, MIN(NetCurPos, NetMaxPos), 0); } } @@ -1194,7 +1195,7 @@ void ST_Endoom() bool ST_Util_CreateStartupWindow () { - StartupScreen = CreateWindowEx (WS_EX_NOPARENTNOTIFY, "STATIC", NULL, + StartupScreen = CreateWindowEx (WS_EX_NOPARENTNOTIFY, L"STATIC", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SS_OWNERDRAW, 0, 0, 0, 0, Window, NULL, g_hInst, NULL); if (StartupScreen == NULL) diff --git a/src/win32/win32basevideo.cpp b/src/win32/win32basevideo.cpp index 300905b09b..090b0bb1d9 100644 --- a/src/win32/win32basevideo.cpp +++ b/src/win32/win32basevideo.cpp @@ -128,11 +128,11 @@ void Win32BaseVideo::GetDisplayDeviceName() { if (mes.hFoundMonitor) { - MONITORINFOEX mi; + MONITORINFOEXA mi; mi.cbSize = sizeof mi; - if (GetMonitorInfo(mes.hFoundMonitor, &mi)) + if (GetMonitorInfoA(mes.hFoundMonitor, &mi)) { strcpy(m_DisplayDeviceBuffer, mi.szDevice); m_DisplayDeviceName = m_DisplayDeviceBuffer; @@ -159,14 +159,14 @@ static BOOL CALLBACK DumpAdaptersMonitorEnumProc(HMONITOR hMonitor, HDC, LPRECT, { DumpAdaptersState *state = reinterpret_cast(dwData); - MONITORINFOEX mi; + MONITORINFOEXA mi; mi.cbSize = sizeof mi; char moreinfo[64] = ""; bool active = true; - if (GetMonitorInfo(hMonitor, &mi)) + if (GetMonitorInfoA(hMonitor, &mi)) { bool primary = !!(mi.dwFlags & MONITORINFOF_PRIMARY); diff --git a/src/win32/win32glvideo.cpp b/src/win32/win32glvideo.cpp index 2fb24b4640..9104e546b9 100644 --- a/src/win32/win32glvideo.cpp +++ b/src/win32/win32glvideo.cpp @@ -124,7 +124,7 @@ HWND Win32GLVideo::InitDummy() wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = NULL; - wc.lpszClassName = "GZDoomOpenGLDummyWindow"; + wc.lpszClassName = L"GZDoomOpenGLDummyWindow"; //Register window class if (!RegisterClass(&wc)) @@ -141,9 +141,9 @@ HWND Win32GLVideo::InitDummy() AdjustWindowRectEx(&windowRect, style, false, exStyle); //Create Window - if (!(dummy = CreateWindowEx(exStyle, - "GZDoomOpenGLDummyWindow", - "GZDOOM", + if (!(dummy = CreateWindowExW(exStyle, + L"GZDoomOpenGLDummyWindow", + WGAMENAME, WS_CLIPSIBLINGS | WS_CLIPCHILDREN | style, 0, 0, windowRect.right - windowRect.left, @@ -152,7 +152,7 @@ HWND Win32GLVideo::InitDummy() g_hInst, NULL))) { - UnregisterClass("GZDoomOpenGLDummyWindow", g_hInst); + UnregisterClassW(L"GZDoomOpenGLDummyWindow", g_hInst); return 0; } ShowWindow(dummy, SW_HIDE); @@ -169,7 +169,7 @@ HWND Win32GLVideo::InitDummy() void Win32GLVideo::ShutdownDummy(HWND dummy) { DestroyWindow(dummy); - UnregisterClass("GZDoomOpenGLDummyWindow", GetModuleHandle(NULL)); + UnregisterClassW(L"GZDoomOpenGLDummyWindow", GetModuleHandle(NULL)); } diff --git a/src/win32/zdoom.rc b/src/win32/zdoom.rc index 74e019de8c..d19f6c40e4 100644 --- a/src/win32/zdoom.rc +++ b/src/win32/zdoom.rc @@ -100,14 +100,6 @@ END // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_ICON1 ICON "icon1.ico" -IDI_BOING1 ICON "boing1.ico" -IDI_BOING2 ICON "boing2.ico" -IDI_BOING3 ICON "boing3.ico" -IDI_BOING4 ICON "boing4.ico" -IDI_BOING5 ICON "boing5.ico" -IDI_BOING6 ICON "boing6.ico" -IDI_BOING7 ICON "boing7.ico" -IDI_BOING8 ICON "boing8.ico" ///////////////////////////////////////////////////////////////////////////// // @@ -188,14 +180,6 @@ BEGIN HORZGUIDE, 76 END - IDD_BOING, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 180 - VERTGUIDE, 33 - TOPMARGIN, 7 - END - IDD_ERRORPANE, DIALOG BEGIN LEFTMARGIN, 7 @@ -416,7 +400,6 @@ CAPTION "GZDoom Very Fatal Error" FONT 8, "MS Shell Dlg", 400, 0, 0x0 BEGIN CONTROL "",IDC_CRASHTAB,"SysTabControl32",WS_TABSTOP,4,4,404,280 - PUSHBUTTON "&Send Error Report",IDYES,146,289,91,14,WS_DISABLED PUSHBUTTON "Save Report to Disk...",IDC_SAVEREPORT,242,289,91,14 PUSHBUTTON "&Discard Report",IDNO,338,289,70,14 END @@ -446,19 +429,6 @@ BEGIN CONTROL "",IDC_CRASHFILECONTENTS,"RichEdit20A",ES_MULTILINE | ES_READONLY | WS_BORDER | WS_VSCROLL | WS_TABSTOP,7,83,385,174 END -IDD_BOING DIALOGEX 0, 0, 187, 196 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTERMOUSE | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Upload status" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - DEFPUSHBUTTON "Close",IDOK,130,175,50,14,WS_DISABLED - ICON IDI_BOING1,IDC_BOING,7,7,21,20 - LTEXT "Static",IDC_BOINGSTATUS,33,12,147,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,166,189,1 - CONTROL "",IDC_BOINGEDIT,"RichEdit20A",ES_MULTILINE | ES_READONLY | WS_BORDER | WS_VSCROLL | WS_TABSTOP,7,34,173,124 - CONTROL "",IDC_BOINGPROGRESS,"msctls_progress32",NOT WS_VISIBLE | WS_BORDER | 0x1,33,22,147,9 -END - IDD_ERRORPANE DIALOGEX 0, 0, 190, 28 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN EXSTYLE WS_EX_CONTROLPARENT diff --git a/wadsrc/static/confont.lmp b/wadsrc/static/confont.lmp deleted file mode 100644 index 6b68df2e3e..0000000000 Binary files a/wadsrc/static/confont.lmp and /dev/null differ diff --git a/wadsrc/static/dbigfont.lmp b/wadsrc/static/filter/game-doomstrifechex/bigfont.lmp similarity index 100% rename from wadsrc/static/dbigfont.lmp rename to wadsrc/static/filter/game-doomstrifechex/bigfont.lmp diff --git a/wadsrc/static/filter/game-strife/acs/strfhelp.o b/wadsrc/static/filter/game-strife/acs/strfhelp.o index 521d887145..483056f7bf 100644 Binary files a/wadsrc/static/filter/game-strife/acs/strfhelp.o and b/wadsrc/static/filter/game-strife/acs/strfhelp.o differ diff --git a/wadsrc/static/fonts/consolefont/0000.png b/wadsrc/static/fonts/consolefont/0000.png new file mode 100644 index 0000000000..aa78736f71 Binary files /dev/null and b/wadsrc/static/fonts/consolefont/0000.png differ diff --git a/wadsrc/static/fonts/consolefont/0100.png b/wadsrc/static/fonts/consolefont/0100.png new file mode 100644 index 0000000000..82a22799ef Binary files /dev/null and b/wadsrc/static/fonts/consolefont/0100.png differ diff --git a/wadsrc/static/fonts/consolefont/0400.png b/wadsrc/static/fonts/consolefont/0400.png new file mode 100644 index 0000000000..d3f3786eed Binary files /dev/null and b/wadsrc/static/fonts/consolefont/0400.png differ diff --git a/wadsrc/static/fonts/consolefont/font.inf b/wadsrc/static/fonts/consolefont/font.inf new file mode 100644 index 0000000000..897845b494 --- /dev/null +++ b/wadsrc/static/fonts/consolefont/font.inf @@ -0,0 +1,3 @@ +TranslationType Console +CellSize 8, 8 // This implies font sheets + diff --git a/wadsrc/static/iwadinfo.txt b/wadsrc/static/iwadinfo.txt index 12d5db1b56..c75fc166d1 100644 --- a/wadsrc/static/iwadinfo.txt +++ b/wadsrc/static/iwadinfo.txt @@ -318,6 +318,7 @@ IWad "DPHOOF","BFGGA0","HEADA1","CYBRA1","SPIDA1D1", "E4M2", "DMENUPIC", "M_ACPT", "M_CAN", "M_EXITO", "M_CHG" BannerColors = "54 54 54", "a8 a8 a8" + IgnoreTitlePatches = 1 } IWad @@ -330,6 +331,7 @@ IWad Compatibility = "Shorttex" MustContain = "SMOOSHED", "ANIMDEFS", "LANGUAGE", "MAPINFO", "ENDOOM", "M_DOOM", "TITLEPIC", "TEXTURES" BannerColors = "a8 00 00", "a8 a8 a8" + IgnoreTitlePatches = 1 } IWad @@ -345,6 +347,7 @@ IWad "E3M1","E3M2","E3M3","E3M4","E3M5","E3M6","E3M7","E3M8","E3M9", "DPHOOF","BFGGA0","HEADA1","CYBRA1","SPIDA1D1", "E4M2" BannerColors = "54 54 54", "a8 a8 a8" + IgnoreTitlePatches = 1 } IWad @@ -360,6 +363,7 @@ IWad "E3M1","E3M2","E3M3","E3M4","E3M5","E3M6","E3M7","E3M8","E3M9", "DPHOOF","BFGGA0","HEADA1","CYBRA1","SPIDA1D1" BannerColors = "54 54 54", "a8 a8 a8" + IgnoreTitlePatches = 1 } IWad @@ -371,6 +375,7 @@ IWad Compatibility = "Shareware", "Shorttex" MustContain = "E1M1" BannerColors = "54 54 54", "a8 a8 a8" + IgnoreTitlePatches = 1 } IWad @@ -384,6 +389,7 @@ IWad Compatibility = "Shorttex", "Stairs" MustContain = "MAP01", "REDTNT2" BannerColors = "a8 00 00", "a8 a8 a8" + IgnoreTitlePatches = 1 } IWad @@ -397,6 +403,7 @@ IWad Compatibility = "Shorttex" MustContain = "MAP01", "CAMO1" BannerColors = "a8 00 00", "a8 a8 a8" + IgnoreTitlePatches = 1 } IWad @@ -411,9 +418,10 @@ IWad MustContain = "MAP01", "DMENUPIC", "M_ACPT", "M_CAN", "M_EXITO", "M_CHG" BannerColors = "a8 00 00", "a8 a8 a8" Load = "nerve.wad" + IgnoreTitlePatches = 1 } -// Doom 2 must be last to be checked becaude MAP01 is its only requirement +// Doom 2 must be last to be checked because MAP01 is its only requirement IWad { Name = "DOOM 2: Hell on Earth" @@ -426,6 +434,7 @@ IWad MustContain = "MAP01" BannerColors = "a8 00 00", "a8 a8 a8" Load = "nerve.wad" + IgnoreTitlePatches = 1 } diff --git a/wadsrc/static/language.def b/wadsrc/static/language.def new file mode 100644 index 0000000000..5e629dc97f --- /dev/null +++ b/wadsrc/static/language.def @@ -0,0 +1,95 @@ +[default] + +// The contents of this file are not supposed to be translated!!! +// These strings are needed in the string table only so that they can be replaced by Dehacked. + + +// Music names for Doom. +// Note that these names are not prefixed with 'd_' because that's how Dehacked patches expect them. + +MUSIC_E1M1 = "e1m1"; +MUSIC_E1M2 = "e1m2"; +MUSIC_E1M3 = "e1m3"; +MUSIC_E1M4 = "e1m4"; +MUSIC_E1M5 = "e1m5"; +MUSIC_E1M6 = "e1m6"; +MUSIC_E1M7 = "e1m7"; +MUSIC_E1M8 = "e1m8"; +MUSIC_E1M9 = "e1m9"; +MUSIC_E2M1 = "e2m1"; +MUSIC_E2M2 = "e2m2"; +MUSIC_E2M3 = "e2m3"; +MUSIC_E2M4 = "e2m4"; +MUSIC_E2M5 = "e2m5"; +MUSIC_E2M6 = "e2m6"; +MUSIC_E2M7 = "e2m7"; +MUSIC_E2M8 = "e2m8"; +MUSIC_E2M9 = "e2m9"; +MUSIC_E3M1 = "e3m1"; +MUSIC_E3M2 = "e3m2"; +MUSIC_E3M3 = "e3m3"; +MUSIC_E3M4 = "e3m4"; +MUSIC_E3M5 = "e3m5"; +MUSIC_E3M6 = "e3m6"; +MUSIC_E3M7 = "e3m7"; +MUSIC_E3M8 = "e3m8"; +MUSIC_E3M9 = "e3m9"; +MUSIC_INTER = "inter"; +MUSIC_INTRO = "intro"; +MUSIC_BUNNY = "bunny"; +MUSIC_VICTOR = "victor"; +MUSIC_INTROA = "introa"; +MUSIC_RUNNIN = "runnin"; +MUSIC_STALKS = "stalks"; +MUSIC_COUNTD = "countd"; +MUSIC_BETWEE = "betwee"; +MUSIC_DOOM = "doom"; +MUSIC_THE_DA = "the_da"; +MUSIC_SHAWN = "shawn"; +MUSIC_DDTBLU = "ddtblu"; +MUSIC_IN_CIT = "in_cit"; +MUSIC_DEAD = "dead"; +MUSIC_STLKS2 = "stlks2"; +MUSIC_THEDA2 = "theda2"; +MUSIC_DOOM2 = "doom2"; +MUSIC_DDTBL2 = "ddtbl2"; +MUSIC_RUNNI2 = "runni2"; +MUSIC_DEAD2 = "dead2"; +MUSIC_STLKS3 = "stlks3"; +MUSIC_ROMERO = "romero"; +MUSIC_SHAWN2 = "shawn2"; +MUSIC_MESSAG = "messag"; +MUSIC_COUNT2 = "count2"; +MUSIC_DDTBL3 = "ddtbl3"; +MUSIC_AMPIE = "ampie"; +MUSIC_THEDA3 = "theda3"; +MUSIC_ADRIAN = "adrian"; +MUSIC_MESSG2 = "messg2"; +MUSIC_ROMER2 = "romer2"; +MUSIC_TENSE = "tense"; +MUSIC_SHAWN3 = "shawn3"; +MUSIC_OPENIN = "openin"; +MUSIC_EVIL = "evil"; +MUSIC_ULTIMA = "ultima"; +MUSIC_READ_M = "read_m"; +MUSIC_DM2TTL = "dm2ttl"; +MUSIC_DM2INT = "dm2int"; + + +// MBF (BOOM?) narration 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"; + +TAG_QUEST4 = "quest4"; +TAG_QUEST5 = "quest5"; +TAG_QUEST6 = "quest4"; diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index 7e1ac20ae2..a43247c258 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -1,6 +1,6 @@ /* U.S. English. (Sorry, it's not English English.) */ -[enu default] +[default] SECRETMESSAGE = "A secret is revealed!"; @@ -634,19 +634,6 @@ PD_ALL6 = "You need all six keys to open this door"; PD_ALL6O = "You need all six keys to activate this object"; PD_ALLKEYS = "You need all the keys"; -// MBF (BOOM?) narration 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"; - // Gameflow messages TXT_FRAGLIMIT = "Fraglimit hit."; TXT_TIMELIMIT = "Timelimit hit."; @@ -1052,9 +1039,6 @@ TAG_10GOLD = "10 gold"; TAG_25GOLD = "25 gold"; TAG_50GOLD = "50 gold"; TAG_300GOLD = "300 gold"; -TAG_QUEST4 = "quest4"; -TAG_QUEST5 = "quest5"; -TAG_QUEST6 = "quest4"; // Item tags: Strife NPCs TAG_ACOLYTE = "ACOLYTE"; @@ -1310,17 +1294,24 @@ TXT_FREEZEOFF = "Freeze mode off"; TXT_STRANGE = "You feel strange..."; TXT_STRANGER = "You feel even stranger."; TXT_NOTSTRANGE = "You feel like yourself again."; -TXT_LEADBOOTSON = "LEAD BOOTS ON"; -TXT_LEADBOOTSOFF = "LEAD BOOTS OFF"; +TXT_LEADBOOTSON = "Lead Boots On"; +TXT_LEADBOOTSOFF = "Lead Boots Off"; TXT_LIGHTER = "You feel lighter"; TXT_GRAVITY = "Gravity weighs you down"; // Raven intermission -TXT_IMKILLS = "KILLS"; -TXT_IMITEMS = "ITEMS"; -TXT_IMSECRETS = "SECRETS"; -TXT_IMTIME = "TIME"; +TXT_IMKILLS = "Kills"; +TXT_IMITEMS = "Items"; +TXT_IMSECRETS = "Secrets"; +TXT_IMTIME = "Time"; +TXT_IMSUCKS = "Sucks"; +TXT_IMSCRT = "Scrt"; +TXT_IMPAR = "Par"; + +// For testing the extended characters' positioning. +//TXT_IMKILLS = "AÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽ"; +//TXT_IMITEMS = "OÃÃÑÒÓÔÕÖØÙÚÛÜÃÞß"; RAVENQUITMSG = "ARE YOU SURE YOU WANT TO QUIT?"; @@ -1720,7 +1711,7 @@ MNU_DEMESNE = "THE STAGNANT DEMESNE"; $ifgame(heretic) SWSTRING = "ONLY AVAILABLE IN THE REGISTERED VERSION"; // Options Menu -OPTMNU_TITLE = "OPTIONS"; +OPTMNU_TITLE = "Options"; OPTMNU_CONTROLS = "Customize Controls"; OPTMNU_MOUSE = "Mouse options"; OPTMNU_JOYSTICK = "Joystick options"; @@ -1739,10 +1730,11 @@ OPTMNU_DEFAULTS = "Reset to defaults"; OPTMNU_RESETTOSAVED = "Reset to last saved"; OPTMNU_CONSOLE = "Go to console"; OPTMNU_REVERB = "Reverb environment editor"; +OPTMNU_LANGUAGE = "Language"; // Controls Menu -CNTRLMNU_TITLE = "CUSTOMIZE CONTROLS"; +CNTRLMNU_TITLE = "Customize Controls"; CNTRLMNU_SWITCHTEXT1 = "ENTER to change, BACKSPACE to clear"; CNTRLMNU_SWITCHTEXT2 = "Press new key for control, ESC to cancel"; CNTRLMNU_CONTROLS = "Controls"; @@ -1836,7 +1828,7 @@ CNTRLMNU_STATS = "Weapons/ammo/stats"; // Mouse Menu -MOUSEMNU_TITLE = "MOUSE OPTIONS"; +MOUSEMNU_TITLE = "Mouse Options"; MOUSEMNU_ENABLEMOUSE = "Enable mouse"; MOUSEMNU_MOUSEINMENU = "Enable mouse in menus"; MOUSEMNU_SHOWBACKBUTTON = "Show back button"; @@ -1855,12 +1847,12 @@ MOUSEMNU_LOOKSTRAFE = "Lookstrafe"; // Joystick Menu -JOYMNU_TITLE = "CONFIGURE CONTROLLER"; -JOYMNU_OPTIONS = "CONTROLLER OPTIONS"; +JOYMNU_TITLE = "Configure Controller"; +JOYMNU_OPTIONS = "Controller Options"; JOYMNU_NOMENU = "Block controller input in menu"; // Player Setup Menu -MNU_PLAYERSETUP = "PLAYER SETUP"; +MNU_PLAYERSETUP = "Player Setup"; PLYRMNU_NAME = "Name"; PLYRMNU_TEAM = "Team"; PLYRMNU_PLAYERCOLOR = "Color"; @@ -1878,7 +1870,7 @@ PLYRMNU_SEEFRONT = "TO SEE FRONT"; PLYRMNU_SEEBACK = "TO SEE BACK"; // Display Options -DSPLYMNU_TITLE = "DISPLAY OPTIONS"; +DSPLYMNU_TITLE = "Display Options"; DSPLYMNU_SCOREBOARD = "Scoreboard Options"; DSPLYMNU_SCREENSIZE = "Screen size"; DSPLYMNU_BRIGHTNESS = "Brightness"; @@ -1892,8 +1884,6 @@ DSPLYMNU_SHOWENDOOM = "Show ENDOOM screen"; DSPLYMNU_BLOODFADE = "Blood Flash Intensity"; DSPLYMNU_PICKUPFADE = "Pickup Flash Intensity"; DSPLYMNU_WATERFADE = "Underwater Blend Intensity"; -DSPLYMNU_PALLETEHACK = "DirectDraw palette hack"; // Not used -DSPLYMNU_ATTACHEDSURFACES = "Use attached surfaces"; // Not used DSPLYMNU_SKYMODE = "Sky render mode"; DSPLYMNU_LINEARSKY = "Linear skies"; DSPLYMNU_GZDFULLBRIGHT = "Fullbright overrides sector color"; @@ -2002,7 +1992,7 @@ MISCMNU_CACHETIME = "Time threshold for node caching"; MISCMNU_CLEARNODECACHE = "Clear node cache"; MISCMNU_INTERSCROLL = "Allow skipping of intermission scrollers"; // Automap Options -AUTOMAPMNU_TITLE = "AUTOMAP OPTIONS"; +AUTOMAPMNU_TITLE = "Automap Options"; AUTOMAPMNU_COLORSET = "Map color set"; AUTOMAPMNU_CUSTOMCOLORS = "Allow map defined colors"; AUTOMAPMNU_SETCUSTOMCOLORS = "Set custom colors"; @@ -2028,7 +2018,7 @@ AUTOMAPMNU_MARKFONT = "Mark font"; AUTOMAPMNU_MARKCOLOR = "Mark color"; // Automap Controls -MAPCNTRLMNU_TITLE = "CUSTOMIZE MAP CONTROLS"; +MAPCNTRLMNU_TITLE = "Customize Map Controls"; MAPCNTRLMNU_CONTROLS = "Map Controls"; MAPCNTRLMNU_PANLEFT = "Pan left"; MAPCNTRLMNU_PANRIGHT = "Pan right"; @@ -2044,7 +2034,7 @@ MAPCNTRLMNU_SETMARK = "Set mark"; MAPCNTRLMNU_CLEARMARK = "Clear mark"; // Automap Colors -MAPCOLORMNU_TITLE = "CUSTOMIZE MAP COLORS"; +MAPCOLORMNU_TITLE = "Customize Map Colors"; MAPCOLORMNU_DEFAULTMAPCOLORS = "Restore default custom colors"; MAPCOLORMNU_BACKCOLOR = "Background"; MAPCOLORMNU_YOURCOLOR = "You"; @@ -2075,7 +2065,7 @@ MAPCOLORMNU_OVCHEATMODE = "Overlay Cheat Mode"; MAPCOLORMNU_PORTAL = "Portal Overlays"; // Message Options -MSGMNU_TITLE = "MESSAGES"; +MSGMNU_TITLE = "Messages"; MSGMNU_SHOWMESSAGES = "Show messages"; MSGMNU_SHOWOBITUARIES = "Show obituaries"; MSGMNU_SHOWSECRETS = "Show secret notifications"; @@ -2093,7 +2083,7 @@ MSGMNU_LONGSAVEMESSAGES = "Detailed save messages"; MSGMNU_DEVELOPER = "Developer message mode"; // Scoreboard Options -SCRBRDMNU_TITLE = "SCOREBOARD OPTIONS"; +SCRBRDMNU_TITLE = "Scoreboard Options"; SCRBRDMNU_COOPERATIVE = "Cooperative Options"; SCRBRDMNU_ENABLE = "Enable Scoreboard"; SCRBRDMNU_HEADERCOLOR = "Header Color"; @@ -2103,7 +2093,7 @@ SCRBRDMNU_DEATHMATCH = "Deathmatch Options"; SCRBRDMNU_TEAMDEATHMATCH = "Team Deathmatch Options"; // Gameplay Menu -GMPLYMNU_TITLE = "GAMEPLAY OPTIONS"; +GMPLYMNU_TITLE = "Gameplay Options"; GMPLYMNU_TEAMPLAY = "Teamplay"; GMPLYMNU_TEAMDAMAGE = "Team damage scalar"; GMPLYMNU_SMARTAUTOAIM = "Smart Autoaim"; @@ -2160,7 +2150,7 @@ GMPLYMNU_LOSEHALFAMMO = "Lose half ammo"; GMPLYMNU_SPAWNWHEREDIED = "Spawn where died"; // Compatibility Options -CMPTMNU_TITLE = "COMPATIBILITY OPTIONS"; +CMPTMNU_TITLE = "Compatibility Options"; CMPTMNU_MODE = "Compatibility mode"; CMPTMNU_ACTORBEHAVIOR = "Actor Behavior"; CMPTMNU_CORPSEGIBS = "Crushed monsters can be resurrected"; @@ -2210,7 +2200,7 @@ CMPTMNU_PUSHWINDOW = "Non-blocking lines can be pushed"; CMPTMNU_CHECKSWITCHRANGE = "Enable buggy CheckSwitchRange behavior"; // Sound Options -SNDMNU_TITLE = "SOUND OPTIONS"; +SNDMNU_TITLE = "Sound Options"; SNDMNU_SFXVOLUME = "Sounds volume"; SNDMNU_MENUVOLUME = "Menu volume"; SNDMNU_MUSICVOLUME = "Music volume"; @@ -2227,13 +2217,13 @@ SNDMNU_MODREPLAYER = "Module replayer options"; SNDMNU_MIDIPLAYER = "Midi player options"; // OpenAL Options -OPENALMNU_TITLE = "OPENAL OPTIONS"; +OPENALMNU_TITLE = "OpenAL Options"; OPENALMNU_PLAYBACKDEVICE = "Playback device"; OPENALMNU_ENABLEEFX = "Enable EFX"; OPENALMNU_RESAMPLER = "Resampler"; // Advanced Sound Options -ADVSNDMNU_TITLE = "ADVANCED SOUND OPTIONS"; +ADVSNDMNU_TITLE = "Advanced Sound Options"; ADVSNDMNU_SAMPLERATE = "Sample rate"; ADVSNDMNU_HRTF = "HRTF"; ADVSNDMNU_OPLSYNTHESIS = "OPL Synthesis"; @@ -2287,7 +2277,7 @@ ADLVLMODEL_APOGEE = "Apogee"; ADLVLMODEL_WIN9X = "Win9X-like"; // Module Replayer Options -MODMNU_TITLE = "MODULE REPLAYER OPTIONS"; +MODMNU_TITLE = "Module Replayer Options"; MODMNU_REPLAYERENGINE = "Replayer engine"; MODMNU_MASTERVOLUME = "Master Volume"; MODMNU_QUALITY = "Quality"; @@ -2295,14 +2285,14 @@ MODMNU_VOLUMERAMPING = "Volume ramping"; MODMNU_CHIPOMATIC = "Chip-o-matic"; // Renderer Options -RNDMNU_TITLE = "CHANGE RENDERER"; +RNDMNU_TITLE = "Change Renderer"; RNDMNU_RENDERER = "Hardware Acceleration"; RNDMNU_TRUECOLOR = "Software Truecolor Mode"; RNDMNU_POLY = "Poly Renderer (experimental)"; RNDMNU_CANVAS = "Software Canvas"; // Video Options -VIDMNU_TITLE = "VIDEO MODE"; +VIDMNU_TITLE = "Video Mode"; VIDMNU_RENDERMODE = "Render Mode"; VIDMNU_FULLSCREEN = "Fullscreen"; VIDMNU_HIDPI = "Retina/HiDPI support"; @@ -2331,7 +2321,7 @@ VIDMNU_ASPECT169 = "16:9 Aspect"; VIDMNU_ASPECT1610 = "16:10 Aspect"; // Network Options -NETMNU_TITLE = "NETWORK OPTIONS"; +NETMNU_TITLE = "Network Options"; NETMNU_LOCALOPTIONS = "Local options"; NETMNU_MOVEPREDICTION = "Movement prediction"; NETMNU_LINESPECIALPREDICTION = "Predict line actions"; @@ -2719,79 +2709,6 @@ OB_MPPHASEZORCH = "%o was phase zorched by %k."; OB_MPLAZ_BOOM = "%o fell prey to %k's LAZ device."; OB_MPLAZ_SPLASH = "%o was lazzed by %k."; -// Music names for Doom. These are needed in the string table only so that they can -// be replaced by Dehacked. -// Note that these names are not prefixed with 'd_' because that's how Dehacked patches -// expect them. - -MUSIC_E1M1 = "e1m1"; -MUSIC_E1M2 = "e1m2"; -MUSIC_E1M3 = "e1m3"; -MUSIC_E1M4 = "e1m4"; -MUSIC_E1M5 = "e1m5"; -MUSIC_E1M6 = "e1m6"; -MUSIC_E1M7 = "e1m7"; -MUSIC_E1M8 = "e1m8"; -MUSIC_E1M9 = "e1m9"; -MUSIC_E2M1 = "e2m1"; -MUSIC_E2M2 = "e2m2"; -MUSIC_E2M3 = "e2m3"; -MUSIC_E2M4 = "e2m4"; -MUSIC_E2M5 = "e2m5"; -MUSIC_E2M6 = "e2m6"; -MUSIC_E2M7 = "e2m7"; -MUSIC_E2M8 = "e2m8"; -MUSIC_E2M9 = "e2m9"; -MUSIC_E3M1 = "e3m1"; -MUSIC_E3M2 = "e3m2"; -MUSIC_E3M3 = "e3m3"; -MUSIC_E3M4 = "e3m4"; -MUSIC_E3M5 = "e3m5"; -MUSIC_E3M6 = "e3m6"; -MUSIC_E3M7 = "e3m7"; -MUSIC_E3M8 = "e3m8"; -MUSIC_E3M9 = "e3m9"; -MUSIC_INTER = "inter"; -MUSIC_INTRO = "intro"; -MUSIC_BUNNY = "bunny"; -MUSIC_VICTOR = "victor"; -MUSIC_INTROA = "introa"; -MUSIC_RUNNIN = "runnin"; -MUSIC_STALKS = "stalks"; -MUSIC_COUNTD = "countd"; -MUSIC_BETWEE = "betwee"; -MUSIC_DOOM = "doom"; -MUSIC_THE_DA = "the_da"; -MUSIC_SHAWN = "shawn"; -MUSIC_DDTBLU = "ddtblu"; -MUSIC_IN_CIT = "in_cit"; -MUSIC_DEAD = "dead"; -MUSIC_STLKS2 = "stlks2"; -MUSIC_THEDA2 = "theda2"; -MUSIC_DOOM2 = "doom2"; -MUSIC_DDTBL2 = "ddtbl2"; -MUSIC_RUNNI2 = "runni2"; -MUSIC_DEAD2 = "dead2"; -MUSIC_STLKS3 = "stlks3"; -MUSIC_ROMERO = "romero"; -MUSIC_SHAWN2 = "shawn2"; -MUSIC_MESSAG = "messag"; -MUSIC_COUNT2 = "count2"; -MUSIC_DDTBL3 = "ddtbl3"; -MUSIC_AMPIE = "ampie"; -MUSIC_THEDA3 = "theda3"; -MUSIC_ADRIAN = "adrian"; -MUSIC_MESSG2 = "messg2"; -MUSIC_ROMER2 = "romer2"; -MUSIC_TENSE = "tense"; -MUSIC_SHAWN3 = "shawn3"; -MUSIC_OPENIN = "openin"; -MUSIC_EVIL = "evil"; -MUSIC_ULTIMA = "ultima"; -MUSIC_READ_M = "read_m"; -MUSIC_DM2TTL = "dm2ttl"; -MUSIC_DM2INT = "dm2int"; - // GZDoom exclusive: DSPLYMNU_GLOPT = "OpenGL Renderer"; @@ -2802,13 +2719,13 @@ DSPLYMNU_SATURATION = "Saturation"; DSPLYMNU_HWGAMMA = "Hardware Gamma"; // OpenGL Options -GLMNU_TITLE = "OPENGL OPTIONS"; +GLMNU_TITLE = "OpenGL Options"; GLMNU_DYNLIGHT = "Dynamic Light Options"; GLMNU_TEXOPT = "Texture Options"; GLMNU_PREFS = "Preferences"; // Texture Options -GLTEXMNU_TITLE = "TEXTURE OPTIONS"; +GLTEXMNU_TITLE = "Texture Options"; GLTEXMNU_TEXENABLED = "Textures enabled"; GLTEXMNU_TEXFILTER = "Texture Filter mode"; GLTEXMNU_ANISOTROPIC = "Anisotropic filter"; @@ -2825,7 +2742,7 @@ GLTEXMNU_TRIMSPREDGE = "Trim sprite edges"; GLTEXMNU_SORTDRAWLIST = "Sort draw lists by texture"; // Dynamic Light Options -GLLIGHTMNU_TITLE = "DYNAMIC LIGHTS"; +GLLIGHTMNU_TITLE = "Dynamic Lights"; GLLIGHTMNU_LIGHTSENABLED = "Dynamic Lights (OpenGL)"; GLLIGHTMNU_LIGHTDEFS = "Enable light definitions"; GLLIGHTMNU_CLIPLIGHTS = "Clip lights"; @@ -2836,7 +2753,7 @@ GLLIGHTMNU_LIGHTSHADOWMAPQUALITY = "Shadowmap quality"; GLLIGHTMNU_LIGHTSHADOWMAPFILTER = "Shadowmap filter"; // OpenGL Preferences -GLPREFMNU_TITLE = "OPENGL PREFERENCES"; +GLPREFMNU_TITLE = "OpenGL Preferences"; GLPREFMNU_SECLIGHTMODE = "Sector light mode"; GLPREFMNU_FOGMODE = "Fog mode"; GLPREFMNU_FOGFORCEFULLBRIGHT = "Fog forces fullbright"; @@ -2953,7 +2870,7 @@ OPTVAL_REVERSEFIRST = "Reverse"; DSPLYMNU_TCOPT = "TrueColor Options"; -TCMNU_TITLE = "TRUECOLOR OPTIONS"; +TCMNU_TITLE = "TrueColor Options"; TCMNU_TRUECOLOR = "True color output"; TCMNU_MINFILTER = "Linear filter when downscaling"; @@ -2970,3 +2887,51 @@ MSG_TALISMANRED = "You have a feeling that it wasn't to be touched..."; MSG_TALISMANGREEN = "Whatever it is, it doesn't belong in this world..."; MSG_TALISMANBLUE = "It must do something..."; MSG_TALISMANPOWER = "You have super strength!"; + +TXT_STRIFE_MAP01 = "AREA 1: Sanctuary"; +TXT_STRIFE_MAP02 = "AREA 2: Town"; +TXT_STRIFE_MAP03 = "AREA 3: Front Base"; +TXT_STRIFE_MAP04 = "AREA 4: Power Station"; +TXT_STRIFE_MAP05 = "AREA 5: Prison"; +TXT_STRIFE_MAP06 = "AREA 6: Sewers"; +TXT_STRIFE_MAP07 = "AREA 7: Castle"; +TXT_STRIFE_MAP08 = "AREA 8: Audience Chamber"; +TXT_STRIFE_MAP09 = "AREA 9: Castle: Programmer's Keep"; +TXT_STRIFE_MAP10 = "AREA 10: New Front Base"; +TXT_STRIFE_MAP11 = "AREA 11: Borderlands"; +TXT_STRIFE_MAP12 = "AREA 12: The Temple of the Oracle"; +TXT_STRIFE_MAP13 = "AREA 13: Catacombs"; +TXT_STRIFE_MAP14 = "AREA 14: Mines"; +TXT_STRIFE_MAP15 = "AREA 15: Fortress: Administration"; +TXT_STRIFE_MAP16 = "AREA 16: Fortress: Bishop's Tower"; +TXT_STRIFE_MAP17 = "AREA 17: Fortress: The Bailey"; +TXT_STRIFE_MAP18 = "AREA 18: Fortress: Stores"; +TXT_STRIFE_MAP19 = "AREA 19: Fortress: Security Complex"; +TXT_STRIFE_MAP20 = "AREA 20: Factory: Receiving"; +TXT_STRIFE_MAP21 = "AREA 21: Factory: Manufacturing"; +TXT_STRIFE_MAP22 = "AREA 22: Factory: Forge"; +TXT_STRIFE_MAP23 = "AREA 23: Order Commons"; +TXT_STRIFE_MAP24 = "AREA 24: Factory: Conversion Chapel"; +TXT_STRIFE_MAP25 = "AREA 25: Catacombs: Ruined Temple"; +TXT_STRIFE_MAP26 = "AREA 26: Proving Grounds"; +TXT_STRIFE_MAP27 = "AREA 27: The Lab"; +TXT_STRIFE_MAP28 = "AREA 28: Alien Ship"; +TXT_STRIFE_MAP29 = "AREA 29: Entity's Lair"; +TXT_STRIFE_MAP30 = "AREA 30: Abandoned Front Base"; +TXT_STRIFE_MAP31 = "AREA 31: Training Facility"; +TXT_STRIFE_MAP32 = "AREA 1: Sanctuary"; +TXT_STRIFE_MAP33 = "AREA 2: Town"; +TXT_STRIFE_MAP34 = "AREA 3: Movement Base"; +TXT_STRIFE_MAP35 = "AREA 35: Factory: Production"; +TXT_STRIFE_MAP36 = "AREA 36: Castle Clash"; +TXT_STRIFE_MAP37 = "AREA 37: Killing Grounds"; +TXT_STRIFE_MAP38 = "AREA 38: Ordered Chaos"; +TXT_STRIFE_EPI = "Quest for the Sigil"; + +TXT_NEED_CHALICE = "You need the chalice!"; +TXT_NEED_OPASS = "You need the Oracle Pass!"; +TXT_FREED_PRISONERS = "You've freed the prisoners!"; +TXT_DESTROYED_CONVERTER = "You've destroyed the Converter!"; +TXT_COMPLETED_TRAINING = "Congratulations! You have completed the training area"; + +TXT_QUITENDOOM = "Press any key or click anywhere in the window to quit."; diff --git a/wadsrc/static/language.fr b/wadsrc/static/language.fr index 70f6a5b22b..18e1f0e299 100644 --- a/wadsrc/static/language.fr +++ b/wadsrc/static/language.fr @@ -1774,6 +1774,7 @@ OPTMNU_DEFAULTS = "Réinitialiser les paramètres"; OPTMNU_RESETTOSAVED = "Recharger dernière config."; OPTMNU_CONSOLE = "Ouvrir la console"; OPTMNU_REVERB = "Editeur environement de révérb."; +OPTMNU_LANGUAGE = "Langage"; // Controls Menu CNTRLMNU_TITLE = "MODIFIER CONTROLES"; diff --git a/wadsrc/static/language.ptb b/wadsrc/static/language.ptb index 75ae542224..d46e1681f7 100644 --- a/wadsrc/static/language.ptb +++ b/wadsrc/static/language.ptb @@ -582,19 +582,6 @@ PD_ALL6 = "Precisa das 6 chaves para abrir a porta"; PD_ALL6O = "Precisa das 6 chaves para ativar este objeto"; PD_ALLKEYS = "Precisa de todas as chaves"; -// MBF (BOOM?) narration 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"; - // Mensagens de fim de partida online TXT_FRAGLIMIT = "Pontuação atingida."; TXT_TIMELIMIT = "Tempo atingido."; @@ -981,9 +968,6 @@ TAG_10GOLD = "10 moedas"; TAG_25GOLD = "25 moedas"; TAG_50GOLD = "50 moedas"; TAG_300GOLD = "sortudo! 300 moedas"; -TAG_QUEST4 = "quest4"; -TAG_QUEST5 = "quest5"; -TAG_QUEST6 = "quest6"; // Item tags: Strife NPCs TAG_ACOLYTE = "ACOLYTE"; diff --git a/wadsrc/static/language.rus b/wadsrc/static/language.rus new file mode 100644 index 0000000000..1facbc50ff --- /dev/null +++ b/wadsrc/static/language.rus @@ -0,0 +1,2869 @@ +/* РуÑÑкий Ñзык */ + +[rus] + +SECRETMESSAGE = "Обнаружен тайник!"; + +D_DEVSTR = "Включен режим разработчика."; +D_CDROM = "ВерÑÐ¸Ñ Ð´Ð»Ñ Ð´Ð¸Ñка: файл zdoom.ini в c:\\zdoomdat\n"; +PRESSKEY = "Ðажмите любую клавишу."; +PRESSYN = "Ðажмите Y или N."; + +QUITMSG = "Ты дейÑтвительно хочешь выйти\nиз Ñтой замечательной игры?"; +TXT_YES = "Да"; +TXT_NO = "Ðет"; + +// Quit Doom 1 messages +QUITMSG1 = "ПожалуйÑта, не уходи!\nТут еще много демонов!"; +QUITMSG2 = "Да, давай, убегай, еÑли Ñта\nÐºÑ€Ð¾Ð²Ð°Ð²Ð°Ñ Ð±Ð°Ð½Ñ Ñ‚ÐµÐ±Ðµ не по зубам!"; +QUITMSG3 = "Ðа твоем меÑте Ñ Ð±Ñ‹ не уходил.\nDOS намного Ñкучнее."; +QUITMSG4 = "Ты хочешь Ñказать, что DOS\nтебе нравитÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµ, чем Ñ, а?"; +QUITMSG5 = "Ðе уходи! За углом\nпритаилÑÑ ÐµÑ‰Ðµ один монÑтр!"; +QUITMSG6 = "Знаешь, по возвращении тебÑ\nбудут ждать большие неприÑтноÑти."; +QUITMSG7 = "Давай, уходи. Мне Ñовершенно вÑе равно."; + +// Quit Doom II messages +QUITMSG8 = "Ð’Ñерьез задумываешь выйти?\nПолагаю, Ñто не очень-то разумно!"; +QUITMSG9 = "Ðе уходи! Тут чудовище из другого\nмира ожидает оÑобого приглашениÑ!"; +QUITMSG10 = "Вот и убирайÑÑ Ð¾Ñ‚Ñюда к\nÑвоим Ñкучным программам."; +QUITMSG11 = "Будь Ñ Ñ‚Ð²Ð¾Ð¸Ð¼ боÑÑом,\nразобралÑÑ Ð±Ñ‹ Ñ Ñ‚Ð¾Ð±Ð¾Ð¹ ровно за минуту!"; +QUITMSG12 = "ПоÑлушай, дружище. Выйдешь —\nи ÑброÑишь Ñвой Ñчетчик убийÑтв!"; +QUITMSG13 = "Уходи, уходи... но когда вернешьÑÑ,\nÑ Ð±ÑƒÐ´Ñƒ ждать Ñ‚ÐµÐ±Ñ Ñ Ð±Ð¸Ñ‚Ð¾Ð¹."; +QUITMSG14 = "Тебе повезло, что Ñ Ð½Ðµ вмажу тебе\nза то, что ты выходишь."; + +// Quit Strife messages +QUITMSG15 = "Куда ты ÑобралÑÑ?\nРкак же воÑÑтание?!"; +QUITMSG16 = "Ð ÐµÐ·Ð½Ñ Ð¿Ñ€ÐµÐºÑ€Ð°Ñ‰Ð°ÐµÑ‚ÑÑ...\nÐа Ñамом интереÑном меÑте!"; +QUITMSG17 = "Ðо на Ñ‚ÐµÐ±Ñ Ð²ÑÑ Ð½Ð°Ð´ÐµÐ¶Ð´Ð° —\nты мой единÑтвенный шанÑ!"; +QUITMSG18 = "Ðикто не броÑает Птицу."; +QUITMSG19 = "Я думала, ты другой..."; +QUITMSG20 = "Отлично! ПоÑтрелÑл и ÑмылÑÑ!"; +QUITMSG21 = "Ты можешь уйти...\nно не можешь ÑпрÑтатьÑÑ..."; +QUITMSG22 = "Ха! Ð’ чем дело?\nМама зовет обедать?"; + +// Quit Chex messages +QUITMSG23 = "Ðе выходи ÑейчаÑ! ЗдеÑÑŒ еÑть\nеще много флемоидов!"; +QUITMSG24 = "Ðе ÑдавайÑÑ â€” не то флемоиды\nполучат преимущеÑтво!"; +QUITMSG25 = "Ðе уходи ÑейчаÑ.\nÐам нужна Ñ‚Ð²Ð¾Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒ!"; +QUITMSG26 = "ÐадеюÑÑŒ, ты лишь делаешь\nперерыв на тарелку хлопьев Chex(R)."; +QUITMSG27 = "Ðе уходи ÑейчаÑ!\nÐам нужна Ñ‚Ð²Ð¾Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒ!"; +QUITMSG28 = "Ðе оÑтавлÑй\nМежгалактичеÑкую Федерацию Хлопьев!"; +QUITMSG29 = "ÐаÑтоÑщий Воин Chex(R)\nне ÑдаÑÑ‚ÑÑ Ñ‚Ð°Ðº быÑтро!"; + +LOADNET = "Ðевозможно загрузить Ñохранение в Ñетевой игре!\n\nÐажмите любую клавишу."; +QLOADNET = "Ðевозможно загрузить быÑтрое Ñохранение в Ñетевой игре!\n\nÐажмите любую клавишу."; +QSAVESPOT = "У Ð’Ð°Ñ Ð½Ðµ выбран Ñлот быÑтрого ÑохранениÑ!\n\nÐажмите любую клавишу."; +SAVEDEAD = "Ðевозможно Ñохранить игру, не начав ее!\n\nÐажмите любую клавишу."; +QSPROMPT = "ПерезапиÑать быÑтрое Ñохранение\n\n'%s'?\n\nÐажмите Y или N."; +QLPROMPT = "Загрузить быÑтрое Ñохранение\n\n'%s'?\n\nÐажмите Y или N."; +NEWGAME = "Ðевозможно начать новую игру\nпри активной Ñетевой игре.\n\nÐажмите любую клавишу."; +NIGHTMARE = "Уверены? Этот уровень ÑложноÑти\nдаже не близок к чеÑтному.\n\nÐажмите Y или N."; +SWSTRING = "Это демонÑÑ‚Ñ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Doom.\n\nВам необходимо приобреÑти вÑÑŽ трилогию.\n\nÐажмите любую клавишу."; +MSGOFF = "Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐžÐ¢ÐšÐ›Ð®Ð§Ð•ÐЫ"; +MSGON = "Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð’ÐšÐ›Ð®Ð§Ð•ÐЫ"; +NETEND = "Ðевозможно закончить Ñетевую игру!\n\nÐажмите любую клавишу."; +ENDGAME = "Ð’Ñ‹ дейÑтвительно хотите закончить игру?\n\nÐажмите Y или N."; +DOSY = "(Ðажмите Y, чтобы выйти)"; +EMPTYSTRING = "ПуÑтой Ñлот"; +GOTARMOR = "Получена бронÑ."; +GOTMEGA = "Получена мегабронÑ!"; +GOTHTHBONUS = "Получен Ð±Ð¾Ð½ÑƒÑ Ðº здоровью."; +GOTARMBONUS = "Получен Ð±Ð¾Ð½ÑƒÑ Ðº броне."; +GOTSTIM = "Получен ÑтимулÑтор."; +GOTMEDINEED = "Получена крайне Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð°Ð¿Ñ‚ÐµÑ‡ÐºÐ°!"; +GOTMEDIKIT = "Получена аптечка."; +GOTSUPER = "СверхзарÑд!"; +GOTBLUECARD = "Получена ÑинÑÑ ÐºÐ»ÑŽÑ‡-карта."; +GOTYELWCARD = "Получена Ð¶ÐµÐ»Ñ‚Ð°Ñ ÐºÐ»ÑŽÑ‡-карта"; +GOTREDCARD = "Получена краÑÐ½Ð°Ñ ÐºÐ»ÑŽÑ‡-карта."; +GOTBLUESKUL = "Получен Ñиний ключ-череп."; +GOTYELWSKUL = "Получен желтый ключ-череп."; +GOTREDSKUL = "Получен краÑный ключ-череп."; +GOTINVUL = "ÐеуÑзвимоÑть!"; +GOTBERSERK = "БерÑерк!"; +GOTINVIS = "ЧаÑÑ‚Ð¸Ñ‡Ð½Ð°Ñ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ð¾Ñть."; +GOTSUIT = "КоÑтюм радиационной защиты."; +GOTMAP = "ÐšÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð° уровнÑ."; +GOTVISOR = "Очки ночного видениÑ."; +GOTMSPHERE = "МегаÑфера!"; +GOTCLIP = "Получен магазин."; +GOTCLIPBOX = "Получена коробка патронов."; +GOTROCKET = "Получена ракета."; +GOTROCKBOX = "Получен Ñщик ракет."; +GOTCELL = "Получена ÑнергобатареÑ."; +GOTCELLBOX = "Получен ÑнергоаккумулÑтор."; +GOTSHELLS = "Получено 4 патрона Ð´Ð»Ñ Ð´Ñ€Ð¾Ð±Ð¾Ð²Ð¸ÐºÐ°."; +GOTSHELLBOX = "Получена коробка патронов Ð´Ð»Ñ Ð´Ñ€Ð¾Ð±Ð¾Ð²Ð¸ÐºÐ°."; +GOTBACKPACK = "Получен рюкзак, полный патронов!"; +GOTBFG9000 = "Получено BFG9000! О, да!"; +GOTCHAINGUN = "Получен пулемет!"; +GOTCHAINSAW = "Бензопила! Ðайди немного мÑÑа!"; +GOTLAUNCHER = "Получена ракетница!"; +GOTPLASMA = "Получен плазмомет!"; +GOTSHOTGUN = "Получен дробовик!"; +GOTSHOTGUN2 = "Получен Ñупер-дробовик!"; +PD_BLUEO = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужен Ñиний ключ"; +PD_REDO = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужен краÑный ключ"; +PD_YELLOWO = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужен желтый ключ"; +PD_BLUEK = "Ðужен Ñиний ключ, чтобы открыть"; +PD_REDK = "Ðужен краÑный ключ, чтобы открыть"; +PD_YELLOWK = "Ðужен желтый ключ, чтобы открыть"; +PD_BLUECO = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужен Ñиний ключ"; +PD_REDCO = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужен краÑный ключ"; +PD_YELLOWCO = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужен желтый ключ"; +PD_BLUESO = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужен Ñиний череп."; +PD_REDSO = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужен краÑный череп."; +PD_YELLOWSO = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужен желтый череп."; +NEWSAVE = "<Ðовое Ñохранение>"; +GGSAVED = "Игра Ñохранена!"; +HUSTR_MSGU = "[Сообщение не отправлено]"; +PICKUP_PISTOL_DROPPED = "Получен пиÑтолет."; +BETA_BONUS1 = "Ð’Ñ‹ подобрали демоничеÑкий кинжал."; +BETA_BONUS2 = "Ð’Ñ‹ подобрали Ñундук Ñ Ñ‡ÐµÑ€ÐµÐ¿Ð¾Ð¼."; +BETA_BONUS3 = "Ð’Ñ‹ подобрали Ñкипетр зла."; +BETA_BONUS4 = "Ð’Ñ‹ подобрали порочную Библию."; + +// ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ ÑƒÑ€Ð¾Ð²Ð½ÐµÐ¹ +HUSTR_E1M1 = "E1M1: Ðнгар"; +HUSTR_E1M2 = "E1M2: ÐÑ‚Ð¾Ð¼Ð½Ð°Ñ Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾ÑтанциÑ"; +HUSTR_E1M3 = "E1M3: Завод По Переработке ТокÑинов"; +HUSTR_E1M4 = "E1M4: Командный Пункт"; +HUSTR_E1M5 = "E1M5: Ð›Ð°Ð±Ð¾Ñ€Ð°Ñ‚Ð¾Ñ€Ð¸Ñ Ðа ФобоÑе"; +HUSTR_E1M6 = "E1M6: Центральный Пункт Обработки"; +HUSTR_E1M7 = "E1M7: ВычиÑлительный Центр"; +HUSTR_E1M8 = "E1M8: ÐÐ½Ð¾Ð¼Ð°Ð»Ð¸Ñ Ð¤Ð¾Ð±Ð¾Ñа"; +HUSTR_E1M9 = "E1M9: Ð’Ð¾ÐµÐ½Ð½Ð°Ñ Ð‘Ð°Ð·Ð°"; +HUSTR_E2M1 = "E2M1: ÐÐ½Ð¾Ð¼Ð°Ð»Ð¸Ñ Ð”ÐµÐ¹Ð¼Ð¾Ñа"; +HUSTR_E2M2 = "E2M2: Хранилище"; +HUSTR_E2M3 = "E2M3: ОчиÑтительный Завод"; +HUSTR_E2M4 = "E2M4: Ð›Ð°Ð±Ð¾Ñ€Ð°Ñ‚Ð¾Ñ€Ð¸Ñ Ðа ДеймоÑе"; +HUSTR_E2M5 = "E2M5: Командный Центр"; +HUSTR_E2M6 = "E2M6: Залы ПроклÑтых"; +HUSTR_E2M7 = "E2M7: ÐереÑтилище"; +HUSTR_E2M8 = "E2M8: ВавилонÑÐºÐ°Ñ Ð‘Ð°ÑˆÐ½Ñ"; +HUSTR_E2M9 = "E2M9: КрепоÑть Тайн"; +HUSTR_E3M1 = "E3M1: КрепоÑть Ðда"; +HUSTR_E3M2 = "E3M2: ТрÑÑина ОтчаÑниÑ"; +HUSTR_E3M3 = "E3M3: Пандемониум"; +HUSTR_E3M4 = "E3M4: Дом Боли"; +HUSTR_E3M5 = "E3M5: ÐечеÑтивый Собор"; +HUSTR_E3M6 = "E3M6: ЭребуÑ"; +HUSTR_E3M7 = "E3M7: Лимб"; +HUSTR_E3M8 = "E3M8: Дит"; +HUSTR_E3M9 = "E3M9: Кроличий Сад"; +HUSTR_E4M1 = "E4M1: ПреиÑподнÑÑ Ð’Ð½Ð¸Ð·Ñƒ"; +HUSTR_E4M2 = "E4M2: ÐŸÐ¾Ð»Ð½Ð°Ñ ÐенавиÑть"; +HUSTR_E4M3 = "E4M3: Отделить Злых"; +HUSTR_E4M4 = "E4M4: Ðеудержимое Зло"; +HUSTR_E4M5 = "E4M5: Они ПокаютÑÑ"; +HUSTR_E4M6 = "E4M6: Против Ð¢ÐµÐ±Ñ ÐечеÑтиво"; +HUSTR_E4M7 = "E4M7: И ПоÑледовал Ðд"; +HUSTR_E4M8 = "E4M8: К Мучителю"; +HUSTR_E4M9 = "E4M9: Страх"; + +hustr_1 = "уровень 1: вход"; +hustr_2 = "уровень 2: подземные ходы"; +hustr_3 = "уровень 3: вызов брошен"; +hustr_4 = "уровень 4: Ñредоточие"; +hustr_5 = "уровень 5: Ñточные туннели"; +hustr_6 = "уровень 6: преÑÑ"; +hustr_7 = "уровень 7: Ñмертельно проÑто"; +hustr_8 = "уровень 8: уловки и ловушки"; +hustr_9 = "уровень 9: Ñма"; +hustr_10 = "уровень 10: Ð·Ð°Ð¿Ñ€Ð°Ð²Ð¾Ñ‡Ð½Ð°Ñ Ð±Ð°Ð·Ð°"; +hustr_11 = "уровень 11: круг разрушениÑ!"; +hustr_12 = "уровень 12: фабрика"; +hustr_13 = "уровень 13: деловой район"; +hustr_14 = "уровень 14: глубочайшие логовища"; +hustr_15 = "уровень 15: Ð¿Ñ€Ð¾Ð¼Ñ‹ÑˆÐ»ÐµÐ½Ð½Ð°Ñ Ð·Ð¾Ð½Ð°"; +hustr_16 = "уровень 16: пригород"; +hustr_17 = "уровень 17: владениÑ"; +hustr_18 = "уровень 18: внутренний двор"; +hustr_19 = "уровень 19: цитадель"; +hustr_20 = "уровень 20: попалÑÑ!"; +hustr_21 = "уровень 21: нирвана"; +hustr_22 = "уровень 22: катакомбы"; +hustr_23 = "уровень 23: бочки веÑельÑ"; +hustr_24 = "уровень 24: пропаÑть"; +hustr_25 = "уровень 25: кровопады"; +hustr_26 = "уровень 26: заброшенные шахты"; +hustr_27 = "уровень 27: жилище монÑтров"; +hustr_28 = "уровень 28: мир духов"; +hustr_29 = "уровень 29: конец вÑего живого"; +hustr_30 = "уровень 30: икона греха"; +hustr_31 = "уровень 31: вольфенштайн"; +hustr_32 = "уровень 32: гроÑÑе"; +hustr_31b = "уровень 31: idkfa"; +hustr_32b = "уровень 32: кин"; +hustr_33 = "уровень 33: предательÑтво"; + +NHUSTR_1 = "уровень 1: база на земле"; +NHUSTR_2 = "уровень 2: лаборатории боли"; +NHUSTR_3 = "уровень 3: каньон мертвецов"; +NHUSTR_4 = "уровень 4: адÑÐºÐ°Ñ Ð³Ð¾Ñ€Ð°"; +NHUSTR_5 = "уровень 5: вивиÑекциÑ"; +NHUSTR_6 = "уровень 6: ÐºÑ€Ð¾Ð²Ð°Ð²Ð°Ñ Ð¿Ñ€ÐµÐ¸ÑподнÑÑ"; +NHUSTR_7 = "уровень 7: банкет у барона"; +NHUSTR_8 = "уровень 8: гробница злобы"; +NHUSTR_9 = "уровень 9: шеÑтвие демонов"; + +PHUSTR_1 = "уровень 1: конго"; +PHUSTR_2 = "уровень 2: колодец душ"; +PHUSTR_3 = "уровень 3: ацтек"; +PHUSTR_4 = "уровень 4: запертый в клетке"; +PHUSTR_5 = "уровень 5: город-призрак"; +PHUSTR_6 = "уровень 6: обитель барона"; +PHUSTR_7 = "уровень 7: двор-ловушка"; +PHUSTR_8 = "уровень 8: царÑтво"; +PHUSTR_9 = "уровень 9: аббатÑтво"; +PHUSTR_10 = "уровень 10: натиÑк"; +PHUSTR_11 = "уровень 11: преÑледуемый"; +PHUSTR_12 = "уровень 12: ÑкороÑть"; +PHUSTR_13 = "уровень 13: Ñклеп"; +PHUSTR_14 = "уровень 14: зарождение"; +PHUSTR_15 = "уровень 15: Ñумерки"; +PHUSTR_16 = "уровень 16: предзнаменование"; +PHUSTR_17 = "уровень 17: компаунд"; +PHUSTR_18 = "уровень 18: нейроÑфера"; +PHUSTR_19 = "уровень 19: в.Ñ€.а.г."; +PHUSTR_20 = "уровень 20: обитель Ñмерти"; +PHUSTR_21 = "уровень 21: убийца"; +PHUSTR_22 = "уровень 22: невыполнимое задание"; +PHUSTR_23 = "уровень 23: надгробие"; +PHUSTR_24 = "уровень 24: поÑледний рубеж"; +PHUSTR_25 = "уровень 25: храм тьмы"; +PHUSTR_26 = "уровень 26: бункер"; +PHUSTR_27 = "уровень 27: антихриÑÑ‚"; +PHUSTR_28 = "уровень 28: канализациÑ"; +PHUSTR_29 = "уровень 29: одиÑÑÐµÑ ÑˆÑƒÐ¼Ð¾Ð²"; +PHUSTR_30 = "уровень 30: врата ада"; +PHUSTR_31 = "уровень 31: киберлогово"; +PHUSTR_32 = "уровень 32: иди к Ñему"; + +THUSTR_1 = "уровень 1: центр ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑиÑтемой"; +THUSTR_2 = "уровень 2: барбекю из человечины"; +THUSTR_3 = "уровень 3: центр ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¸Ñ‚Ð°Ð½Ð¸ÐµÐ¼"; +THUSTR_4 = "уровень 4: червоточина"; +THUSTR_5 = "уровень 5: виÑелица"; +THUSTR_6 = "уровень 6: открытый Ñезон"; +THUSTR_7 = "уровень 7: тюрьма"; +THUSTR_8 = "уровень 8: металл"; +THUSTR_9 = "уровень 9: крепоÑть"; +THUSTR_10 = "уровень 10: иÑкупление"; +THUSTR_11 = "уровень 11: Ñклад"; +THUSTR_12 = "уровень 12: кратер"; +THUSTR_13 = "уровень 13: переработка Ñдерных отходов"; +THUSTR_14 = "уровень 14: металлургиÑ"; +THUSTR_15 = "уровень 15: Ð¼ÐµÑ€Ñ‚Ð²Ð°Ñ Ð·Ð¾Ð½Ð°"; +THUSTR_16 = "уровень 16: глубочайшие доÑтижениÑ"; +THUSTR_17 = "уровень 17: зона обработки"; +THUSTR_18 = "уровень 18: завод"; +THUSTR_19 = "уровень 19: погрузка/отправка"; +THUSTR_20 = "уровень 20: центральный пункт обработки"; +THUSTR_21 = "уровень 21: админиÑтративный центр"; +THUSTR_22 = "уровень 22: обиталище"; +THUSTR_23 = "уровень 23: лунный горный проект"; +THUSTR_24 = "уровень 24: карьер"; +THUSTR_25 = "уровень 25: логово барона"; +THUSTR_26 = "уровень 26: баллиÑтикÑ"; +THUSTR_27 = "уровень 27: гора боль"; +THUSTR_28 = "уровень 28: чертовщина"; +THUSTR_29 = "уровень 29: река ÑтикÑ"; +THUSTR_30 = "уровень 30: поÑледний вызов"; +THUSTR_31 = "уровень 31: фараон"; +THUSTR_32 = "уровень 32: карибы"; + +HUSTR_TALKTOSELF1 = "Ðеразборчивое бормотание"; +HUSTR_TALKTOSELF2 = "Кто там?"; +HUSTR_TALKTOSELF3 = "Что Ñто было?"; +HUSTR_TALKTOSELF4 = "Ð’Ñ‹ бредите."; +HUSTR_TALKTOSELF5 = "ÐšÐ°ÐºÐ°Ñ Ð´Ð¾Ñада..."; +HUSTR_MESSAGESENT = "[Сообщение Отправлено]"; + +AMSTR_FOLLOWON = "ПривÑзка к игроку ВКЛЮЧЕÐÐ"; +AMSTR_FOLLOWOFF = "ПривÑзка к игроку ОТКЛЮЧЕÐÐ"; +AMSTR_GRIDON = "Сетка ВКЛЮЧЕÐÐ"; +AMSTR_GRIDOFF = "Сетка ОТКЛЮЧЕÐÐ"; +AMSTR_TEXON = "ТекÑтурный режим ВКЛЮЧЕÐ"; +AMSTR_TEXOFF = "ТекÑтурный режим ОТКЛЮЧЕÐ"; +AMSTR_MARKEDSPOT = "Отметка"; +AMSTR_MARKSCLEARED = "Отметки очищены"; +STSTR_MUS = "Смена музыки"; +STSTR_NOMUS = "ÐЕКОРРЕКТÐЫЙ ВЫБОР"; +STSTR_DQDON = "ÐеуÑзвимоÑть включена"; +STSTR_DQDOFF = "ÐеуÑзвимоÑть выключена"; +STSTR_DQD2ON = "ÐŸÐ¾Ð»Ð½Ð°Ñ Ð½ÐµÑƒÑзвимоÑть включена"; +STSTR_DQD2OFF = "ÐŸÐ¾Ð»Ð½Ð°Ñ Ð½ÐµÑƒÑзвимоÑть выключена"; +STSTR_KFAADDED = "Ð‘Ð¾ÐµÐ·Ð°Ð¿Ð°Ñ Ð¿Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½"; +STSTR_FAADDED = "Ð‘Ð¾ÐµÐ·Ð°Ð¿Ð°Ñ Ð¿Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½ (без ключей)"; +STSTR_NCON = "Прохождение Ñквозь Ñтены включено"; +STSTR_NCOFF = "Прохождение Ñквозь Ñтены выключено"; +STSTR_NC2ON = "Полёт Ñковозь Ñтены включен"; +STSTR_BEHOLD = "m=беÑÑм., s=берÑ., i=нев., r=коÑ., a=крт., l=виз."; +STSTR_BEHOLDX = "Предмет переключен"; +STSTR_CHOPPERS = "... неплохо — г.м."; +STSTR_CLEV = "Смена уровнÑ...\n"; +TXT_BUDDHAON = "Ð’Ñ‹ теперь Будда."; +TXT_BUDDHAOFF = "Ð’Ñ‹ больше не Будда."; +TXT_BUDDHA2ON = "Ð’Ñ‹ теперь абÑолютный Будда."; +TXT_BUDDHA2OFF = "Ð’Ñ‹ больше не абÑолютный Будда."; +TXT_DEFAULTPICKUPMSG = "Что-то подобрано"; + +E1TEXT = + "Уничтожив Баронов Ðда и зачиÑтив лунную\n" + "базу, Ð’Ñ‹ должны были победить, не так ли?\n" + "Ðе так ли? Где заÑÐ»ÑƒÐ¶ÐµÐ½Ð½Ð°Ñ Ð½Ð°Ð³Ñ€Ð°Ð´Ð° и\n" + "билет домой? Что Ñто за чертовщина?\n" + "Ð’Ñе должно было закончитьÑÑ Ð½Ðµ так!\n" + "\n" + "Это меÑто пахнет как гнилое мÑÑо, а\n" + "выглÑдит как потерÑÐ½Ð½Ð°Ñ Ð±Ð°Ð·Ð° на ДеймоÑе.\n" + "Похоже, Ð’Ñ‹ заÑтрÑли на «Берегах Ðда», и\n" + "единÑтвенный путь теперь — пройти их.\n" + "\n" + "Чтобы продолжить погружение в игру,\n" + "пройдите Ñпизод «Берега Ðда» и его\n" + "замечательный Ñиквел «Инферно»!"; +E2TEXT = + "У Ð’Ð°Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ð»Ð¾ÑÑŒ! УжаÑный Лорд-\n" + "Кибердемон, правÑщий потерÑнной\n" + "деймоÑовÑкой базой, был повержен\n" + "и Ð’Ñ‹ торжеÑтвуете! Ðо... Где Ð’Ñ‹?\n" + "ПодобравшиÑÑŒ к краю Ñпутника, Ð’Ñ‹\n" + "обращаете взор вниз, чтобы\n" + "увидеть ужаÑную правду.\n" + "\n" + "Ð”ÐµÐ¹Ð¼Ð¾Ñ Ð¿Ð»Ñ‹Ð²ÐµÑ‚ над Ñамим Ðдом!\n" + "Ð’Ñ‹ никогда не Ñлышали, чтобы кто-нибудь\n" + "Ñбегал из Ðда, но Ð’Ñ‹ заÑтавите ублюдков\n" + "пожалеть о том, что они проÑлышали о ВаÑ.\n" + "ПоÑпешно обвÑзавшиÑÑŒ веревкой, Ð’Ñ‹\n" + "ÑпуÑкаетеÑÑŒ на поверхноÑть Ðда.\n" + "\n" + "Теперь наÑтупает Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледней главы\n" + "— «Инферно»."; +E3TEXT = + "Омерзительный паукодемон,\n" + "руководивший вторжением на лунные\n" + "базы и принеÑший Ñтоль много\n" + "Ñмертей, был окончательно повержен.\n" + "\n" + "ОткрываетÑÑ Ñ‚Ð°Ð¹Ð½Ð¸ÐºÐ½Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ и Ð’Ñ‹\n" + "входите в нее. Ð’Ñ‹ доказали, что\n" + "Ñлишком круты Ð´Ð»Ñ Ð°Ð´Ð°, и поÑтому\n" + "Ðд, наконец, поÑтупает Ñправедливо —\n" + "Ð’Ñ‹ выходите из двери прÑмо на\n" + "зеленые Ð¿Ð¾Ð»Ñ Ð—ÐµÐ¼Ð»Ð¸. Ðаконец-то дом.\n" + "\n" + "Ð’Ñ‹ Ñпрашиваете ÑебÑ: что проиÑходило\n" + "на Земле, пока Ð’Ñ‹ ÑражалиÑÑŒ Ñ\n" + "выÑвободившимÑÑ Ð·Ð»Ð¾Ð¼? Хорошо, что ни\n" + "одно порождение Ðда не Ñмогло пройти\n" + "через Ñту дверь вмеÑте Ñ Ð’Ð°Ð¼Ð¸..."; +E4TEXT = + "паук-предводитель, должно быть, поÑлал\n" + "вперед Ñвои легионы порождений ада\n" + "перед вашим поÑледним Ñражением Ñ Ñтим\n" + "ужаÑным отродьем. но вы пошли до конца\n" + "и принеÑли вечное проклÑтье и Ñтрадание\n" + "Ñтой орде так, как поÑтупил бы наÑтоÑщий\n" + "герой перед лицом Ñмертельной опаÑноÑти.\n" + "\n" + "кроме того, кто-то должен был заплатить\n" + "за то, что ÑлучилоÑÑŒ Ñ Ð´Ñйзи, вашей\n" + "домашней крольчихой.\n" + "\n" + "теперь вы видите, Ñколь много боли и\n" + "крови вам пророчат полчища демонов,\n" + "неиÑтовÑтвующих в наших городах.\n" + "\n" + "ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¾Ñтановка — ад на земле!"; +C1TEXT = + "ВЫ ПРОШЛИ ВГЛУБЬ ЗÐРÐЖЕÐÐОГО КОСМОПОРТÐ,\n" + "ÐО ЧТО-ТО ЗДЕСЬ ÐЕ ТÐК. МОÐСТРЫ ПРИÐЕСЛИ\n" + "С СОБОЙ СВОЮ СОБСТВЕÐÐУЮ РЕÐЛЬÐОСТЬ,\n" + "И ТЕХÐИКРКОСМОПОРТÐ\n" + "ТРÐÐСФОРМИРУЕТСЯ ОТ ИХ ПРИСУТСТВИЯ.\n" + "\n" + "ВПЕРЕДИ ВЫ ВИДИТЕ ÐÐ’ÐÐПОСТ ÐДÐ.\n" + "ЕСЛИ Ð’ÐМ УДÐСТСЯ ПРОБРÐТЬСЯ ЧЕРЕЗ ÐЕГО,\n" + "ВЫ СМОЖЕТЕ ПРОÐИКÐУТЬ Ð’ ÐÐСЕЛЕÐÐЫЙ\n" + "ДЕМОÐÐМИ ЦЕÐТР БÐЗЫ И ÐÐЙТИ УПРÐВЛЯЮЩИЙ\n" + "ВЫКЛЮЧÐТЕЛЬ, ДЕРЖÐЩИЙ ÐÐСЕЛЕÐИЕ ЗЕМЛИ\n" + "Ð’ ЗÐЛОЖÐИКÐÐ¥."; +C2TEXT = + "ВЫ ПОБЕДИЛИ! Ð’ÐШРПОБЕДРПОЗВОЛИЛÐ\n" + "ЧЕЛОВЕЧЕСТВУ ЭВÐКУИРОВÐТЬСЯ С ЗЕМЛИ\n" + "И СПÐСТИСЬ ОТ КОШМÐРÐ. ТЕПЕРЬ ВЫ —\n" + "ЕДИÐСТВЕÐÐЫЙ ЧЕЛОВЕК, ОСТÐВШИЙСЯ ÐÐ\n" + "ПЛÐÐЕТЕ, И ЛЮДОЕДЫ-МУТÐÐТЫ, ХИЩÐЫЕ\n" + "ИÐОПЛÐÐЕТЯÐЕ И ЗЛЫЕ ДУХИ — Ð’ÐШИ\n" + "ЕДИÐСТВЕÐÐЫЕ СОСЕДИ. УДОВЛЕТВОРЕÐÐЫЙ\n" + "СПÐСЕÐИЕМ СВОЕГО ВИДÐ, ВЫ СПОКОЙÐО\n" + "ДОЖИДÐЕТЕСЬ ÐЕМИÐУЕМОЙ ГИБЕЛИ.\n" + "\n" + "ÐО ВСКОРЕ РУКОВОДСТВО ЗЕМЛИ ПЕРЕДÐЕТ\n" + "СООБЩЕÐИЕ С ОРБИТЫ: «СЕÐСОРЫ ОБÐÐРУЖИЛИ\n" + "ИСТОЧÐИК ИÐОПЛÐÐЕТÐОГО ВТОРЖЕÐИЯ. Ð’ÐШÐ\n" + "ЗÐДÐЧР— ЛИКВИДИРОВÐТЬ ЕГО». ИÐОПЛÐÐЕТÐÐЯ\n" + "БÐЗРÐÐХОДИТСЯ Ð’ ЦЕÐТРЕ Ð’ÐШЕГО ГОРОДÐ,\n" + "ÐЕДÐЛЕКО ОТ КОСМОПОРТÐ. МЕДЛЕÐÐО И\n" + "МУЧИТЕЛЬÐО ВЫ ВОЗВРÐЩÐЕТЕСЬ Ð’ БОЙ.\n"; +C3TEXT = + "ВЫ ÐÐХОДИТЕСЬ Ð’ РÐЗЛÐГÐЮЩЕМСЯ СЕРДЦЕ\n" + "ГОРОДÐ, Ð’ ОКРУЖЕÐИИ ТРУПОВ СВОИХ ВРÐГОВ.\n" + "ВЫ ÐЕ ВИДИТЕ ÐИКÐКОГО СПОСОБРУÐИЧТОЖИТЬ\n" + "ПОРТÐЛ ÐРЭТОЙ СТОРОÐЕ, И ПОЭТОМУ, СТИСÐУВ\n" + "ЗУБЫ, ПРОХОДИТЕ СКВОЗЬ ÐЕГО.\n" + "\n" + "ДОЛЖЕРБЫТЬ СПОСОБ ЗÐКРЫТЬ ПОРТÐЛ\n" + "ÐРДРУГОЙ СТОРОÐЕ. И КÐКОЕ Ð’ÐМ ДЕЛО ДО\n" + "ТОГО, ЧТО ПРИДЕТСЯ ПРОЙТИ ЧЕРЕЗ ÐД, ЧТОБЫ\n" + "ДОБРÐТЬСЯ ДО ÐЕГО?"; +C4TEXT = + "ЖУТЧÐЙШИЙ ЛИК СÐМОГО БОЛЬШОГО ДЕМОÐÐ,\n" + "КОТОРОГО ВЫ КОГДÐ-ЛИБО ВИДЕЛИ, РУШИТСЯ\n" + "ÐÐ Ð’ÐШИХ ГЛÐЗÐÐ¥ ПОСЛЕ ТОГО, КÐК ВЫ\n" + "ÐÐКÐЧÐЛИ РÐКЕТÐМИ ЕГО ÐЕЗÐЩИЩЕÐÐЫЙ\n" + "МОЗГ. МОÐСТР УГÐСÐЕТ И ГИБÐЕТ,\n" + "РÐЗРУШÐЯ БЕСЧИСЛЕÐÐЫЕ МИЛИ ПОВЕРХÐОСТИ\n" + "ÐДÐ.\n" + "\n" + "ВЫ СДЕЛÐЛИ ЭТО. ВТОРЖЕÐИЮ КОÐЕЦ. ЗЕМЛЯ\n" + "СПÐСЕÐÐ. ÐД ПОВЕРЖЕÐ. ВЫ СПРÐШИВÐЕТЕ\n" + "СЕБЯ: КУДРТЕПЕРЬ ПОСЛЕ СМЕРТИ БУДУТ\n" + "ПОПÐДÐТЬ ПЛОХИЕ ЛЮДИ? УТЕРЕВ ПОТ\n" + "СО ЛБÐ, ВЫ ÐÐЧИÐÐЕТЕ ДОЛГОЕ ПУТЕШЕСТВИЕ\n" + "ОБРÐТÐО ДОМОЙ. ВОССТÐÐОВЛЕÐИЕ ЗЕМЛИ\n" + "ДОЛЖÐО БЫТЬ ГОРÐЗДО БОЛЕЕ ИÐТЕРЕСÐЫМ\n" + "ЗÐÐЯТИЕМ, ÐЕЖЕЛИ ЕЕ РÐЗРУШЕÐИЕ."; +C5TEXT = + "ПОЗДРÐВЛЯЕМ, ВЫ ÐÐШЛИ СЕКРЕТÐЫЙ УРОВЕÐЬ!\n" + "ПОХОЖЕ, ОРБЫЛ ПОСТРОЕРЛЮДЬМИ, Ð ÐЕ\n" + "ДЕМОÐÐМИ. ЛЮБОПЫТÐО, КТО ЖЕ ÐÐСЕЛЯЕТ\n" + "ЭТОТ УГОЛОК ÐДÐ?\n"; +C6TEXT = + "ПОЗДРÐВЛЯЕМ, ВЫ ÐÐШЛИ СВЕРХСЕКРЕТÐЫЙ\n" + "УРОВЕÐЬ! ЛУЧШЕ БЫ Ð’ÐМ СТРЕМИТЕЛЬÐО\n" + "ПРОРВÐТЬСЯ СКВОЗЬ ÐЕГО!"; +P1TEXT = + "Ð’Ñ‹ Ñо злорадÑтвом Ñмотрите на горÑщий\n" + "ÐºÐ°Ñ€ÐºÐ°Ñ Ð¡Ñ‚Ñ€Ð°Ð¶Ð°. С его Ñмертью Ð’Ñ‹ вырвали\n" + "УÑкоритель из зловонных когтей Ðда.\n" + "РаÑÑлабившиÑÑŒ, Ð’Ñ‹ окидываете взглÑдом\n" + "помещение. ПроклÑтье! Тут должен быть\n" + "Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один рабочий прототип, но\n" + "демоны, должно быть, забрали его Ñ Ñобой.\n" + "\n" + "Ð’Ñ‹ должны найти прототип, иначе вÑе Ваши\n" + "прошлые уÑÐ¸Ð»Ð¸Ñ Ð¾ÐºÐ°Ð¶ÑƒÑ‚ÑÑ Ð½Ð°Ð¿Ñ€Ð°Ñными.\n" + "Продолжайте двигатьÑÑ, продолжайте\n" + "ÑражатьÑÑ, продолжайте убивать. И да,\n" + "продолжайте выживать."; +P2TEXT = + "Даже Ñмертельный лабиринт арчвайлов не\n" + "Ñмог оÑтановить ВаÑ. Ð’Ñ‹ добралиÑÑŒ до\n" + "прототипа УÑкорителÑ, который вÑкоре\n" + "был уничтожен раз и навÑегда.\n" + "\n" + "Уничтожение — Ваша ÑпециальноÑть."; +P3TEXT = + "Ð’Ñ‹ пробили путь в Ñамое\n" + "Ñердце дьÑвольÑкого ульÑ. ÐаÑтало времÑ\n" + "Ð´Ð»Ñ Ð¼Ð¸ÑÑии «найти и уничтожить»,\n" + "объектом которой Ñтанет Привратник,\n" + "чьи нечеÑтивые отпрыÑки низвергаютÑÑ\n" + "на Землю.\n" + "\n" + "Да, он плохой. Ðо Ð’Ñ‹ знаете кто еще хуже!\n" + "\n" + "Злобно ухмылÑÑÑÑŒ, Ð’Ñ‹ проверÑете Ñвое\n" + "ÑнарÑжение, и готовитеÑÑŒ преподать\n" + "ублюдку немного Ðда Вашего\n" + "ÑобÑтвенного производÑтва!"; +P4TEXT = + "ПоÑле ÑƒÐ½Ð¸Ñ‡Ñ‚Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð»Ð¸ÐºÐ° Привратника\n" + "начинают формироватьÑÑ Ð¸Ð½Ð²ÐµÑ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ðµ\n" + "Врата, которые затÑгивают в ÑебÑ\n" + "поÑледние обломки УÑÐºÐ¾Ñ€Ð¸Ñ‚ÐµÐ»Ñ Ð¸\n" + "неÑкольких оÑтавшихÑÑ Ð´ÐµÐ¼Ð¾Ð½Ð¾Ð².\n" + "\n" + "Готово. Ðд вернулÑÑ Ð½Ð° круги ÑвоÑ,\n" + "Ð¿Ð¾Ð³Ð»Ð¾Ñ‰Ð°Ñ Ð»Ð¸ÑˆÑŒ грешных людей, а не\n" + "праведных.\n" + "\n" + "Ðе забудьте попроÑить внуков положить\n" + "ракетницу в Ваш гроб. ЕÑли поÑле Ñмерти\n" + "Ð’Ñ‹ попадете в Ðд, она понадобитÑÑ\n" + "Ð´Ð»Ñ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¾Ð¹ поÑледней зачиÑтки..."; +P5TEXT = + "Ð’Ñ‹ нашли второй по ÑложноÑти уровень,\n" + "который у Ð½Ð°Ñ ÐµÑть. ÐадеемÑÑ, Ð’Ñ‹\n" + "Ñохранили игру на предыдущем уровне\n" + "или еще раньше. ЕÑли нет, приготовьтеÑÑŒ\n" + "много умирать.\n" + "\n" + "Уровень раÑÑчитан иÑключительно на\n" + "профеÑÑионалов."; +P6TEXT = + "Спорим, Ð’Ñ‹ удивлÑлиÑÑŒ, какой же уровень\n" + "СÐМЫЙ Ñложный? Теперь Ð’Ñ‹ знаете.\n" + "Ðикто не выберетÑÑ Ð¶Ð¸Ð²Ñ‹Ð¼."; +T1TEXT = + "СражаÑÑÑŒ, Ð’Ñ‹ выбралиÑÑŒ из зараженных\n" + "ÑкÑпериментальных лабораторий.\n" + "Похоже, ОÐК раÑтранжирила и их, неÑмотрÑ\n" + "на огромные корпоративные доходы. Они\n" + "даже не позаботилиÑÑŒ о покупке Ñтраховок\n" + "Ð´Ð»Ñ Ñвоих Ñотрудников...\n" + "\n" + "Впереди раÑположен военный комплекÑ,\n" + "кишащий вируÑами и только ждущий\n" + "как бы вгрызтьÑÑ Ð² Вашу плоть. Что ж,\n" + "еÑли повезет, в комплекÑе вÑе еще\n" + "должны оÑтаватьÑÑ Ð±Ð¾ÐµÐ¿Ñ€Ð¸Ð¿Ð°ÑÑ‹."; +T2TEXT = + "Впереди Ñлышен металличеÑкий Ñкрежет\n" + "Ñ‚Ñжелых механизмов. Ð’Ñ‹ уверены, что они\n" + "не штампуют очередную партию\n" + "дьÑвольÑких отродий, но даже еÑли\n" + "и так, Ð’Ñ‹ к Ñтому готовы.\n" + "\n" + "Эти звуки могут означать очередной\n" + "кровавый феÑтиваль, но Ð’Ñ‹ чувÑтвуете\n" + "ÑÐµÐ±Ñ ÐºÐ°Ðº тыÑÑчи головорезов,\n" + "Ñобранных в одном безумном убийце.\n" + "\n" + "Ð’Ñ‹ так проÑто не ÑдадитеÑÑŒ."; +T3TEXT = + "ОткрывающаÑÑÑ Ð¿ÐµÑ€Ñпектива выглÑдит\n" + "чертовÑки знакомой и пахнет\n" + "Ñловно зажаренные ÑкÑкременты.\n" + "Это меÑто не нравилоÑÑŒ Вам раньше,\n" + "и Ð’Ñ‹ чертовÑки уверены, что не\n" + "понравитÑÑ Ð¸ ÑейчаÑ. Чем больше Ð’Ñ‹\n" + "размышлÑете над Ñтим, тем печальнее\n" + "вÑе ÑтановитÑÑ.\n" + "\n" + "ВзвеÑив Ñвое оружие, Ð’Ñ‹ зловеще\n" + "ухмылÑетеÑÑŒ. ÐаÑтало Ð²Ñ€ÐµÐ¼Ñ Ð²Ñерьез\n" + "надрать кое-кому задницу."; +T4TEXT = + "Внезапно вÑе окуталоÑÑŒ тишиной до\n" + "Ñамого горизонта. Ðгонизирующее ÐдÑкое\n" + "Ñхо Ñтихло, кошмарное небо Ñтало вновь\n" + "голубым, трупы монÑтров начали\n" + "разлагатьÑÑ Ñо зловонным Ñмрадом.\n" + "Боже, неужели Ð’Ñ‹ и правда победили?\n" + "\n" + "ПоÑле короткого землетрÑÑениÑ, из\n" + "разгромленного черепа ИзрыгателÑ\n" + "Демонов начинает пробиватьÑÑ Ñркое\n" + "Ñинее Ñвечение."; +T5TEXT = + "И что теперь? Ð’Ñе выглÑдит Ñовершенно\n" + "по-другому, Ñловно покои владыки\n" + "Тутанхамона.\n" + "\n" + "Что ж, что бы не ожидало Ð’Ð°Ñ Ð²Ð½ÑƒÑ‚Ñ€Ð¸,\n" + "хуже уже быть не может, не так ли?\n" + "Или может лучше не тревожить\n" + "ÑпÑщих богов..."; +T6TEXT = + "Пришло Ð²Ñ€ÐµÐ¼Ñ Ð´Ð»Ñ Ð¾Ñ‚Ð¿ÑƒÑка. Ей-богу,\n" + "вороша недра Ðда, Ð’Ñ‹ только о нем\n" + "и мечтали! ПуÑть кто-нибудь другой\n" + "теперь боретÑÑ Ñ Ð¿Ð¾Ð»Ñ‡Ð¸Ñ‰Ð°Ð¼Ð¸ демонов.\n" + "\n" + "Впереди раÑполагаетÑÑ Ñ‚Ð¸Ñ…Ð¸Ð¹ городок Ñ\n" + "неÑпешно текущей водой, причудливыми\n" + "домиками, и, вероÑтно, не наÑеленный\n" + "адÑким отродьем.\n" + "\n" + "Покинув транÑпортное ÑредÑтво,\n" + "Ð’Ñ‹ Ñлышите топот железного копыта\n" + "кибердемона." + +NERVETEXT = + "ÐЕПРИЯТÐОСТИ, КÐЗÐЛОСЬ, ÐÐСТИГЛИ Ð’ СÐМЫЙ\n" + "ÐЕПОДХОДЯЩИЙ МОМЕÐТ...\b" + "ÐЕСМОТРЯ ÐРРÐЗГРОМÐОЕ ПОРÐЖЕÐИЕ СИЛ\n" + "ÐДÐ, ОБЕЗУМЕВШИЙ КИБЕРДЕМОРРЕШИЛ, ЧТО\n" + "СМОЖЕТ ИЗМЕÐИТЬ ХОД СОБЫТИЙ И Ð’ÐОВЬ\n" + "ПОВЕРГÐУТЬ ЗЕМЛЮ Ð’ ДЕМОÐИЧЕСКИЙ Ð¥ÐОС.\n" + "\b" + "И МУЧИТЕЛЬÐÐЯ СМЕРТЬ СТÐЛРПЛÐТОЙ ЗРЭТУ\n" + "РОКОВУЮ ОШИБКУ. СТЕÐЫ ЕГО ОБИТЕЛИ ЕЩЕ\n" + "ДОЛГО БУДУТ ПОМÐИТЬ ПРЕДСМЕРТÐУЮ ÐГОÐИЮ\n" + "ЭТОГО ПОРОЖДЕÐИЯ ПОТУСТОРОÐÐИХ СИЛ.\n" + "И ПУСТЬ ЕГО ГÐИЮЩИЕ ОСТÐÐКИ СТÐÐУТ\n" + "ВЕЧÐЫМ ÐÐПОМИÐÐÐИЕМ ДЛЯ ТЕХ, КТО Ð’ÐОВЬ\n" + "ОСМЕЛИТСЯ ÐÐРУШИТЬ ПОКОЙ ÐÐШЕГО МИРÐ.\n" + "\n" + "ЭТРМИССИЯ ЗÐВЕРШЕÐÐ."; + +// Cast list (должны идти в Ñтом порÑдке) +CC_ZOMBIE = "ЗОМБИ"; +CC_SHOTGUN = "ЗОМБИ-СЕРЖÐÐТ"; +CC_HEAVY = "ПУЛЕМЕТЧИК"; +CC_IMP = "ИМП"; +CC_DEMON = "ДЕМОÐ"; +CC_LOST = "ПОТЕРЯÐÐÐЯ ДУШÐ"; +CC_CACO = "КÐКОДЕМОÐ"; +CC_HELL = "РЫЦÐРЬ ÐДÐ"; +CC_BARON = "БÐРОРÐДÐ"; +CC_ARACH = "ÐРÐÐ¥ÐОТРОÐ"; +CC_PAIN = "ЭЛЕМЕÐТÐЛЬ БОЛИ"; +CC_REVEN = "РЕВЕÐÐÐТ"; +CC_MANCU = "МÐÐКУБУС"; +CC_ARCH = "ÐРЧВÐЙЛ"; +CC_SPIDER = "ПÐУК-ПРЕДВОДИТЕЛЬ"; +CC_CYBER = "КИБЕРДЕМОÐ"; +CC_HERO = "ÐÐШ ГЕРОЙ"; + +// Friendly names +FN_ZOMBIE = "Зомби"; +FN_SHOTGUN = "Сержант"; +FN_HEAVY = "Пулеметчик"; +FN_IMP = "Имп"; +FN_DEMON = "Демон"; +FN_SPECTRE = "Спектр"; +FN_LOST = "ПотерÑÐ½Ð½Ð°Ñ Ð´ÑƒÑˆÐ°"; +FN_CACO = "Какодемон"; +FN_HELL = "Рыцарь Ðда"; +FN_BARON = "Барон Ðда"; +FN_ARACH = "Ðрахнотрон"; +FN_PAIN = "Элементаль боли"; +FN_REVEN = "Ревенант"; +FN_MANCU = "МанкубуÑ"; +FN_ARCH = "Ðрчвайл"; +FN_SPIDER = "Паук-предводитель"; +FN_CYBER = "Кибердемон"; +FN_WOLFSS = "ÐациÑÑ‚"; +FN_DOG = "Собака"; + +// Ðовые Ñтроки из BOOM +PD_BLUEC = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужна ÑинÑÑ ÐºÐ°Ñ€Ñ‚Ð°"; +PD_REDC = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужна краÑÐ½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð°"; +PD_YELLOWC = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужна Ð¶ÐµÐ»Ñ‚Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð°"; +PD_BLUES = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужен Ñиний череп"; +PD_REDS = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужен краÑный череп"; +PD_YELLOWS = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужен желтый череп"; +PD_ANY = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужен любой ключ"; +PD_ANYOBJ = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ нужен любой ключ"; +PD_ALL3 = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ требуютÑÑ Ð²Ñе три ключа"; +PD_ALL3O = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ требуютÑÑ Ð²Ñе три ключа"; +PD_ALL6 = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ требуютÑÑ Ð²Ñе шеÑть ключей"; +PD_ALL6O = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ требуютÑÑ Ð²Ñе шеÑть ключей"; +PD_ALLKEYS = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ требуютÑÑ Ð²Ñе ключи"; + +// Gameflow messages +TXT_FRAGLIMIT = "ДоÑтигнут лимит фрагов."; +TXT_TIMELIMIT = "ДоÑтигнут лимит времени."; + +// Spree messages +SPREEKILLSELF = "Игрок %o хорошо ÑмотрелÑÑ, пока не покончил Ñ Ñобой!"; +SPREEOVER = "Игрок %k прервал череду убийÑтв игрока %o"; +SPREE5 = "Игрок %k Ñовершил череду убийÑтв!"; +SPREE10 = "Игрок %k в неиÑтовÑтве!"; +SPREE15 = "Игрок %k доминирует!"; +SPREE20 = "Игрок %k неоÑтановимый!"; +SPREE25 = "Игрок %k богоподобен!"; + +// Multikill messages +MULTI2 = "Двойное убийÑтво!"; +MULTI3 = "МаÑÑовое убийÑтво!"; +MULTI4 = "Ультра убийÑтво!"; +MULTI5 = "Чудовищное убийÑтво!"; + +// Ðекрологи +// First the self-kills, then the other-kills +OB_SUICIDE = "Игрок %o покончил Ñ Ñобой."; +OB_FALLING = "Игрок %o упал Ñлишком выÑоко."; +OB_CRUSH = "Игрок %o был раздавлен."; +OB_EXIT = "Игрок %o попыталÑÑ Ñвалить."; +OB_WATER = "Игрок %o не умеет плавать."; +OB_SLIME = "Игрок %o мутировал."; +OB_LAVA = "Игрок %o раÑплавилÑÑ."; +OB_BARREL = "Игрок %o взорвалÑÑ."; +OB_SPLASH = "Игрок %o ÑтоÑл в неверной точке."; +OB_R_SPLASH = "Игрок %o не отÑтупил в Ñторону."; +OB_ROCKET = "Игрок %o не отÑтупил в Ñторону."; +OB_KILLEDSELF = "Игрок %o покончил Ñ Ñобой."; + +OB_VOODOO = "Игрока %o убила Ñила Вуду."; +OB_STEALTHBABY = "Игрок %o краем глаза заметил арахнотрона."; +OB_STEALTHVILE = "Игрок %o краем глаза заметил арчвайла."; +OB_STEALTHBARON = "Игрок %o краем глаза заметил барона Ðда."; +OB_STEALTHCACO = "Игрок %o краем глаза заметил какодемона."; +OB_STEALTHCHAINGUY = "Игрок %o краем глаза заметил пулеметчика."; +OB_STEALTHDEMON = "Игрок %o краем глаза заметил демона."; +OB_STEALTHKNIGHT = "Игрок %o краем глаза заметил Ñ€Ñ‹Ñ†Ð°Ñ€Ñ Ðда."; +OB_STEALTHIMP = "Игрок %o краем глаза заметил импа."; +OB_STEALTHFATSO = "Игрок %o краем глаза заметил манкубуÑа."; +OB_STEALTHUNDEAD = "Игрок %o краем глаза заметил ревенанта."; +OB_STEALTHSHOTGUY = "Игрок %o краем глаза заметил Ñержанта."; +OB_STEALTHZOMBIE = "Игрок %o краем глаза заметил зомби."; +OB_UNDEADHIT = "Игрока %o ударил ревенант."; +OB_IMPHIT = "Игрока %o раÑцарапал имп."; +OB_CACOHIT = "Игрок %o Ñлишком ÑблизилÑÑ Ñ ÐºÐ°ÐºÐ¾Ð´ÐµÐ¼Ð¾Ð½Ð¾Ð¼."; +OB_DEMONHIT = "Игрока %o укуÑил демон."; +OB_SPECTREHIT = "Игрока %o Ñожрал Ñпектр."; +OB_BARONHIT = "Игрока %o разорвал барон Ðда."; +OB_KNIGHTHIT = "Игрока %o раÑпотрошил рыцарь Ðда."; +OB_ZOMBIE = "Игрока %o убил зомби."; +OB_SHOTGUY = "Игрока %o заÑтрелил Ñержант."; +OB_VILE = "Игрока %o кремировал арчвайл."; +OB_UNDEAD = "Игрок %o не уÑпел увернутьÑÑ Ð¾Ñ‚ ÑнарÑда ревенанта."; +OB_FATSO = "Игрока %o раздавил манкубуÑ."; +OB_CHAINGUY = "Игрока %o продырÑвил пулеметчик."; +OB_SKULL = "Игрок %o иÑпугалÑÑ Ð¿Ð¾Ñ‚ÐµÑ€Ñнной души."; +OB_IMP = "Игрока %o Ñжег имп."; +OB_CACO = "Игрока %o поразил какодемон."; +OB_BARON = "Игрок %o получил ÑинÑк от барона Ðда."; +OB_KNIGHT = "Игрока %o раÑплаÑтал рыцарь Ðда."; +OB_SPIDER = "Игрок %o ÑтоÑл в воÑторге перед пауком-предводителем."; +OB_BABY = "Игрок %o дал арахнотрону ÑÐµÐ±Ñ ÑƒÐ±Ð¸Ñ‚ÑŒ."; +OB_CYBORG = "Игрока %o размазал кибердемон."; +OB_WOLFSS = "Игрок %o вÑтретил нациÑта."; +OB_DOG = "Игрока %o разорвала Ñобака."; + +OB_CHICKEN = "Игрока %o заклевал до Ñмерти цыпленок."; +OB_BEAST = "Игрока %o обуглил дракон-оборотень."; +OB_CLINK = "Игрока %o нарезал Ñаблекоготь."; +OB_DSPARIL1 = "Игрока %o обжег Ñерпент Д'Спарила."; +OB_DSPARIL1HIT = "Игрока %o пожрал Ñерпент Д'Спарила."; +OB_DSPARIL2 = "Игрок %o был не Ñ€Ð¾Ð²Ð½Ñ Ð”'Спарилу."; +OB_DSPARIL2HIT = "Игрока %o Ñбил Д'Спарил."; +OB_HERETICIMP = "Игрока %o изуродовала горгульÑ."; +OB_HERETICIMPHIT = "Игрока %o покалечила горгульÑ."; +OB_IRONLICH = "Игрока %o раÑтоптал железный лич."; +OB_IRONLICHHIT = "Игрок %o ÑближалÑÑ Ñ Ð¶ÐµÐ»ÐµÐ·Ð½Ñ‹Ð¼ личем."; +OB_BONEKNIGHT = "Игрока %o зарубил воин-нежить."; +OB_BONEKNIGHTHIT = "Игрока %o Ñразил воин-нежить."; +OB_MINOTAUR = "Игрока %o Ñ€Ð°Ð·Ð½ÐµÑ Ð½Ð° Ñгоревшие чаÑти Молотавр."; // fix — «превратил в пепел»? +OB_MINOTAURHIT = "Игрока %o превратил в кровавое меÑиво Молотавр."; +OB_MUMMY = "Игрока %o разбил голем."; +OB_MUMMYLEADER = "Игрока %o убил криком нитроголем."; +OB_SNAKE = "Игрока %o потрÑÑ Ð¾Ñ„Ð¸Ð´Ð¸Ð°Ð½."; +OB_WIZARD = "Игрока %o проклÑл волшебник."; +OB_WIZARDHIT = "Игрока %o нащупал волшебник."; + +OB_FIREDEMON = "Игрок %o отведал Ð¾Ð³Ð½Ñ Ðфрита."; +OB_DEMON1 = "Игрока %o Ñпалил Серпент."; +OB_DEMON2 = "Игрока %o отравил Серпент."; +OB_ETTIN = "Игрока %o раздробил Эттин."; +OB_CENTAUR = "Игрока %o разрезал Кентавр."; +OB_SLAUGHTAURHIT = "Игрока %o разрезал Старший кентавр."; +OB_SLAUGHTAUR = "Игрока %o Ñбил огненным шаром Старший кентавр."; +OB_BISHOP = "Игрок %o поддалÑÑ Ñ‡ÐµÑ€Ð½Ñ‹Ð¼ Ñилам ЕпиÑкопа."; +OB_ICEGUY = "Игрока %o полноÑтью заморозил Вендиго."; +OB_SERPENTHIT = "Игрока %o Ñломал Сталкер."; +OB_SERPENT = "Игрока %o раÑплавил Сталкер."; +OB_WRAITH = "Игрока %o обуглил Грабитель."; +OB_WRAITHHIT = "Жизнь игрока %o украл Грабитель."; +OB_DRAGON = "Игрока %o кремировала Виверна Смерти."; +OB_KORAX = "Игрока %o Ñкинул Ñ Ð´Ð¾Ñки КоракÑ."; +OB_FBOSS = "Игрока %o Ñразил Зедек."; +OB_MBOSS = "Игрок %o не Ñмог боротьÑÑ Ñ Ð¼Ð°Ð½Ð¾Ð¹ Менелкира."; +OB_CBOSS = "Игрока %o креÑтил ТрадуктуÑ."; +OB_HERESIARCH = "ЕреÑиарх Ñыграл в коÑти игрока %o."; + +OB_ACOLYTE = "Игрока %o ревноÑтно заÑтрелил Ðколит."; +OB_MACIL = "Игроку %o не Ñледовало Подобрань мÑтеж против МÑйÑила."; +OB_REBEL = "Игрока %o раÑÑтрелÑл МÑтежник."; +OB_BEGGAR = "Игрока %o забили до Ñмерти бедные."; +OB_PEASANT = "Игроку %o не Ñледовало затеÑть драку Ñ Ð“Ñ€Ð°Ð¶Ð´Ð°Ð½Ñким."; +OB_ALIENSPECTRE = "Игрока %o Ñбил Спектр."; +OB_ENTITY = "Игрок %o иÑпытал на Ñебе ÑроÑть Единого Бога."; +OB_LOREMASTER = "Игрок %o не Ñмог избежать длани Ð¥Ñ€Ð°Ð½Ð¸Ñ‚ÐµÐ»Ñ ÐœÑƒÐ´Ñ€Ð¾Ñти."; +OB_PROGRAMMER = "Игрока %o удалил ПрограммиÑÑ‚."; +OB_STFBISHOP = "Игрока %o отдул ЕпиÑкоп."; +OB_SENTINEL = "Игрока %o уничтожил Страж."; +OB_CRUSADER = "Игрока %o Ñмёл КреÑтоноÑец."; +OB_INQUISITOR = "Игрока %o приговорил Инквизитор."; +OB_STALKER = "Игрок %o пугалÑÑ Ð´Ð¾ Ñмерти из-за Сталкера."; // fix — Оригинал: «%o was bugged by a Stalker.» +OB_TURRET = "Игрок %o включил автоматичеÑкую защиту."; +OB_TEMPLARHIT = "Игрока %o раÑцарапал Тамплиер."; +OB_TEMPLAR = "Игрока %o иÑпарил Тамплиер."; +OB_REAVERHIT = "Игрока %o разрезал на куÑки Похититель."; +OB_REAVER = "Игрока %o заÑтрелил Похититель."; + +OB_MPFIST = "Игрок %o отведал кулака %k."; +OB_MPCHAINSAW = "Игрок %k ÑкоÑил бензопилой игрока %o."; +OB_MPPISTOL = "Игрок %k пощекотал пукалкой игрока %o."; +OB_MPSHOTGUN = "Игрок %o отведал дробовик игрока %k."; +OB_MPSSHOTGUN = "Игрок %k размазал из обреза игрока %o."; +OB_MPCHAINGUN = "Игрок %k выкоÑил Ñ Ð¿ÑƒÐ»ÐµÐ¼ÐµÑ‚Ð° игрока %o."; +OB_MPROCKET = "Игрок %k прокатил на ракете игрока %о."; +OB_MPR_SPLASH = "Игрок %o почти увильнул от ракеты %k."; +OB_MPPLASMARIFLE = "Игрок %k раÑплавил плазмометом игрока %o."; +OB_MPBFG_BOOM = "Игрок %k раÑщепил игрока %o Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ BFG."; +OB_MPBFG_SPLASH = "Игрок %o не уÑпел ÑпрÑтатьÑÑ Ð¾Ñ‚ BFG игрока %k."; +OB_MPTELEFRAG = "Игрок %k телефрагнул игрока %o."; +OB_RAILGUN = "Игрок %k показал Ñвой рельÑотрон игроку %o."; +OB_MPBFG_MBF = "Игрока %o Ñжег %k Ñ BFG."; + +OB_MPSTAFF = "Игрок %o Ñел на поÑох игрока %k."; +OB_MPGAUNTLETS = "Игрок %o шокирован перчатками %k."; +OB_MPGOLDWAND = "Игрок %o узрел прощальный взмах ÑльфийÑкого жезла %k."; +OB_MPCROSSBOW = "Игрок %o изранен болтами Ñфирного арбалета %k."; +OB_MPBLASTER = "Игрок %o взорван драконьим когтем %k."; +OB_MPSKULLROD = "Игрок %o ÑоÑлан в Ñамый низ поÑохом Ðда %k."; +OB_MPPHOENIXROD = "Игрок %o Ñожжен в пепел жезлом феникÑа %k."; +OB_MPMACE = "Игрок %o отбит огненной булавой %k."; + +OB_MPPSTAFF = "Игрок %o отведал зарÑженного поÑоха %k."; +OB_MPPGAUNTLETS = "Игрок %o опуÑтошен перчатками %k."; +OB_MPPGOLDWAND = "Игрок %o атакован %k Ñ ÑльфийÑким жезлом."; +OB_MPPCROSSBOW = "Игрок %o пробит Ñфирным арбалетом %k."; +OB_MPPBLASTER = "Игрок %o разорван драконьим когтем %k."; +OB_MPPSKULLROD = "%k залил игрока %o горÑчим дождем, иÑпользовав поÑох ада."; +OB_MPPPHOENIXROD = "Игрок %o Ñожжен жезлом феникÑа %k."; +OB_MPPMACE = "Игрок %o раздавлен огромной Ñферой из огненной булавы %k."; + +OB_MPFWEAPFIST = "Игрок %o избит в мÑÑо голыми руками %k."; +OB_MPFWEAPAXE = "Игрок %o Ñловил топорик %k."; +OB_MPFWEAPHAMMERM = "Голова игрока %o была вдолблена в тело молотом %k."; +OB_MPFWEAPHAMMERR = "Душа игрока %o была перекована молотом %k."; +OB_MPFWEAPQUIETUS = "Игрок %o утихомирен легендарным ПоÑледним доводом %k."; +OB_MPCWEAPMACE = "Игрок %o получил по морде булавой %k."; +OB_MPCWEAPSTAFFM = "Игрок %o иÑкуÑан змеиным поÑохом %k."; +OB_MPCWEAPSTAFFR = "Игрок %o задушен змеиным поÑохом %k."; +OB_MPCWEAPFLAME = "Игрок %o Ñгорел в огне %k."; +OB_MPCWEAPWRAITHVERGE = "Игрок %o очищен Жезлом Духов %k."; +OB_MPMWEAPWAND = "Игрок %o Ñхватил Ñлишком много Ñапфировых зарÑдов от %k."; +OB_MPMWEAPFROST = "Игрок %o обращаетÑÑ Ð² ледÑную Ñкульптуру Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ %k."; +OB_MPMWEAPLIGHTNING = "Игрок %o откровенно шокирован %k."; +OB_MPMWEAPBLOODSCOURGE = "Игрок %o Ñтерт Ñ Ð»Ð¸Ñ†Ð° вÑеленной Кровавым бичем %k."; + +OB_MPPUNCHDAGGER = "Игрок %o был непреднамеренно заколот кинжалом %k."; +OB_MPELECTRICBOLT = "Игрок %o был прибит к Ñтене %k."; +OB_MPPOISONBOLT = "Игрок %o получил Ñмертельную дозу гнева %k."; +OB_MPASSAULTGUN = "Игрок %o изрешечен штурмовой винтовкой %k."; +OB_MPMINIMISSILELAUNCHER = "Игрок %o проглотил ракету %k."; +OB_MPSTRIFEGRENADE = "Игрок %o инвертируетÑÑ H-E гранатой %k."; +OB_MPPHOSPHOROUSGRENADE = "Игрок %o принÑл горÑчую ванну из чиÑтого фоÑфора %k."; +OB_MPFLAMETHROWER = "Игрок %k поджарил игрока %o."; +OB_MPMAULER1 = "Игрок %k ударил током игрока %o."; +OB_MPMAULER = "Игрок %k безжалоÑтно раÑпылил игрока %o."; +OB_MPSIGIL = "Игрок %o ÑклонилÑÑ Ð¿ÐµÑ€ÐµÐ´ Ñилой Сигила %k."; + +// Same as OB_MPTELEFRAG, but shown when a monster telefrags you +OB_MONTELEFRAG = "Игрока %o телефрагнуло."; + +OB_DEFAULT = "Игрок %o погиб."; +OB_MPDEFAULT = "Игрок %o убит %k."; +OB_FRIENDLY1 = "Игрок %k убил Ñоюзника."; +OB_FRIENDLY2 = "Игроку %k Ñледует проверить Ñвои очки."; +OB_FRIENDLY3 = "Игрок %k Ð¿Ñ€ÐµÐ¿Ð¾Ð´Ð½ÐµÑ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ команде фраг."; +OB_FRIENDLY4 = "Игрок %k потерÑл еще одного друга."; + +SAVEGAMENAME = "zdoomsv"; +STARTUP1 = ""; +STARTUP2 = ""; +STARTUP3 = ""; +STARTUP4 = ""; +STARTUP5 = ""; + +// Таблица очков +SCORE_ITEMS = "Предметы"; +SCORE_BONUS = "БонуÑ"; +SCORE_COLOR = "Цвет"; +SCORE_SECRET = "Тайники"; +SCORE_NAME = "ИмÑ"; +SCORE_DELAY = "Задержка (мÑ)"; +SCORE_KILLS = "УбийÑтва"; +SCORE_FRAGS = "Фраги"; +SCORE_DEATHS = "Смерти"; +SCORE_MISSED = "Пропущено"; +SCORE_TOTAL = "Ð’Ñего"; +SCORE_LVLTIME = "Ð’Ñ€ÐµÐ¼Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ"; + +// Item tags: Doom weapons +TAG_FIST = "Кулаки"; +TAG_CHAINSAW = "Бензопила"; +TAG_PISTOL = "ПиÑтолет"; +TAG_SHOTGUN = "Дробовик"; +TAG_SUPERSHOTGUN = "Супер-дробовик"; +TAG_CHAINGUN = "Пулемет"; +TAG_ROCKETLAUNCHER = "Ракетница"; +TAG_PLASMARIFLE = "ÐŸÐ»Ð°Ð·Ð¼ÐµÐ½Ð½Ð°Ñ Ð¿ÑƒÑˆÐºÐ°"; +TAG_BFG9000 = "BFG 9000"; + +// Item tags: Heretic weapons +TAG_STAFF = "ПоÑох"; +TAG_GAUNTLETS = "Перчатки Ðекроманта"; +TAG_GOLDWAND = "ЭльфийÑкий Жезл"; +TAG_CROSSBOW = "Эфирный Ðрбалет"; +TAG_BLASTER = "Драконий Коготь"; +TAG_SKULLROD = "ПоÑох Ðда"; +TAG_PHOENIXROD = "Жезл ФеникÑа"; +TAG_MACE = "ÐžÐ³Ð½ÐµÐ½Ð½Ð°Ñ Ð‘ÑƒÐ»Ð°Ð²Ð°"; + +TAG_STAFFP = "ПоÑох"; +TAG_GAUNTLETSP = "Перчатки Ðекроманта"; +TAG_GOLDWANDP = "ЭльфийÑкий Жезл"; +TAG_CROSSBOWP = "Эфирный Ðрбалет"; +TAG_BLASTERP = "Драконий Коготь"; +TAG_SKULLRODP = "ПоÑох Ðда"; +TAG_PHOENIXRODP = "Жезл ФеникÑа"; +TAG_MACEP = "ÐžÐ³Ð½ÐµÐ½Ð½Ð°Ñ Ð‘ÑƒÐ»Ð°Ð²Ð°"; + +// Item tags: Heretic artifacts +TAG_ARTIEGG = "Морф Овум"; +TAG_ARTIFIREBOMB = "ЧаÑÐ¾Ð²Ð°Ñ Ð±Ð¾Ð¼Ð±Ð° Древних"; +TAG_ARTIFLY = "ÐšÑ€Ñ‹Ð»ÑŒÑ ÐŸÑ€Ð¸Ð·Ñ€Ð°ÐºÐ°"; +TAG_ARTIHEALTH = "ÐšÐ²Ð°Ñ€Ñ†ÐµÐ²Ð°Ñ ÐºÐ¾Ð»Ð±Ð°"; +TAG_ARTIINVISIBILITY = "ТенеÑфера"; +TAG_ARTIINVULNERABILITY = "Кольцо ÐевидимоÑти"; +TAG_ARTISUPERHEALTH = "МиÑтичеÑÐºÐ°Ñ Ð£Ñ€Ð½Ð°"; +TAG_ARTITELEPORT = "Механизм ХаоÑа"; +TAG_ARTITOMEOFPOWER = "Том Силы"; +TAG_ARTITORCH = "Факел"; + +// Item tags: Hexen weapons +TAG_CWEAPMACE = "Булава РаÑкаÑниÑ"; +TAG_CWEAPSTAFF = "Змеиный ПоÑох"; +TAG_CWEAPFLAME = "Огненный Шторм"; +TAG_CWEAPWRAITHVERGE = "Жезл Духов"; +TAG_FWEAPFIST = "ШипаÑтые Рукавицы"; +TAG_FWEAPAXE = "Топор Тимона"; +TAG_FWEAPHAMMER = "Молот ВозмездиÑ"; +TAG_FWEAPQUIETUS = "ПоÑледний довод"; +TAG_MWEAPWAND = "Ð¡Ð°Ð¿Ñ„Ð¸Ñ€Ð¾Ð²Ð°Ñ Ð²Ð¾Ð»ÑˆÐµÐ±Ð½Ð°Ñ Ð¿Ð°Ð»Ð¾Ñ‡ÐºÐ°"; +TAG_MWEAPFROST = "Замораживающие ОÑколки"; +TAG_MWEAPLIGHTNING = "Дуга Смерти"; +TAG_MWEAPBLOODSCOURGE = "Кровавый бич"; + +// Item tags: Hexen artifacts +TAG_ARTIBLASTRADIUS = "Отражающий ДиÑк"; +TAG_ARTIBOOSTARMOR = "Ðаручи драконьей кожи"; +TAG_ARTIBOOSTMANA = "Кубок МогущеÑтва"; +TAG_ARTIPOISONBAG = "Флешетта"; +TAG_ARTIPOISONBAG1 = "Флешетта Ядовитого Облака"; +TAG_ARTIPOISONBAG2 = "Флешетта ЧаÑовой бомбы"; +TAG_ARTIPOISONBAG3 = "Флешетта Граната"; +TAG_ARTIHEALINGRADIUS = "МиÑтичеÑкий зачарованный Ñвиток"; +TAG_ARTIDEFENDER = "Икона Защитника"; +TAG_ARTIPORK = "ХрÑкинатор"; +TAG_ARTISPEED = "Сапоги СкороÑти"; +TAG_ARTISUMMON = "Темный Слуга"; +TAG_ARTITELEPORTOTHER = "Механизм ИзгнаниÑ"; + +// Item tags: Hexen puzzle items +TAG_ARTIPUZZSKULL = "Череп Йорика"; +TAG_ARTIPUZZGEMBIG = "Серце Д'Спарила"; +TAG_ARTIPUZZGEMRED = "Ð ÑƒÐ±Ð¸Ð½Ð¾Ð²Ð°Ñ ÐŸÐ»Ð°Ð½ÐµÑ‚Ð°"; +TAG_ARTIPUZZGEMGREEN1 = "Ð˜Ð·ÑƒÐ¼Ñ€ÑƒÐ´Ð½Ð°Ñ ÐŸÐ»Ð°Ð½ÐµÑ‚Ð° (1)"; +TAG_ARTIPUZZGEMGREEN2 = "Ð˜Ð·ÑƒÐ¼Ñ€ÑƒÐ´Ð½Ð°Ñ ÐŸÐ»Ð°Ð½ÐµÑ‚Ð° (2)"; +TAG_ARTIPUZZGEMBLUE1 = "Ð¡Ð°Ð¿Ñ„Ð¸Ñ€Ð¾Ð²Ð°Ñ ÐŸÐ»Ð°Ð½ÐµÑ‚Ð° (1)"; +TAG_ARTIPUZZGEMBLUE2 = "Ð¡Ð°Ð¿Ñ„Ð¸Ñ€Ð¾Ð²Ð°Ñ ÐŸÐ»Ð°Ð½ÐµÑ‚Ð° (2)"; +TAG_ARTIPUZZBOOK1 = "ÐšÐ¾Ð´ÐµÐºÑ Ð”ÐµÐ¼Ð¾Ð½Ð°"; +TAG_ARTIPUZZBOOK2 = "Либер ОÑкура"; +TAG_ARTIPUZZSKULL2 = "ÐžÐ³Ð½ÐµÐ½Ð½Ð°Ñ ÐœÐ°Ñка"; +TAG_ARTIPUZZFWEAPON = "Запечатанный Палаш"; +TAG_ARTIPUZZCWEAPON = "СвÑÑ‚Ð°Ñ Ð ÐµÐ»Ð¸ÐºÐ²Ð¸Ñ"; +TAG_ARTIPUZZMWEAPON = "Сигила МагнуÑа"; +TAG_ARTIPUZZGEAR1 = "Ð–ÐµÐ»ÐµÐ·Ð½Ð°Ñ ÑˆÐµÑтернÑ"; +TAG_ARTIPUZZGEAR2 = "Ð›Ð°Ñ‚ÑƒÐ½Ð½Ð°Ñ ÑˆÐµÑтернÑ"; +TAG_ARTIPUZZGEAR3 = "Ð›Ð°Ñ‚ÑƒÐ½Ð½Ð°Ñ Ð¸ Ð¶ÐµÐ»ÐµÐ·Ð½Ð°Ñ ÑˆÐµÑтерни"; +TAG_ARTIPUZZGEAR4 = "СеребрÑÐ½Ð°Ñ Ð¸ Ð»Ð°Ñ‚ÑƒÐ½Ð½Ð°Ñ ÑˆÐµÑтерни"; + +// Item tags: Strife weapons +TAG_PUNCHDAGGER = "Ðож"; +TAG_STRIFECROSSBOW1 = "Ðрбалет"; +TAG_STRIFECROSSBOW2 = "Ðрбалет"; +TAG_ASSAULTGUN = "Винтовка"; +TAG_MMLAUNCHER = "Мини-ракетница"; +TAG_FLAMER = "Огнемет"; +TAG_MAULER1 = "ИÑÑ‚Ñзатель"; +TAG_MAULER2 = "ИÑÑ‚Ñзатель"; +TAG_GLAUNCHER1 = "Гранатомет"; +TAG_GLAUNCHER2 = "Гранатомет"; +TAG_SIGIL = "Сигил"; + +// Item tags: Strife artifacts +TAG_COIN = "Монета"; +TAG_MEDPATCH = "Бинт"; +TAG_MEDICALKIT = "Ðптечка"; +TAG_SURGERYKIT = "Мед-комплект"; // "full_health" в Тизере +TAG_BELDINSRING = "Кольцо"; +TAG_OFFERINGCHALICE = "Чаша Ð´Ð»Ñ Ð¿Ð¾Ð´Ð°Ñний"; +TAG_EAR = "Ухо"; +TAG_BROKENCOUPLING = "Сломанное ÑопрÑжение"; +TAG_SHADOWARMOR = "Ð¢ÐµÐ½ÐµÐ²Ð°Ñ Ð±Ñ€Ð¾Ð½Ñ"; +TAG_ENVSUIT = "Защитный коÑтюм"; +TAG_GUARDUNIFORM = "Униформа Ñтражника"; +TAG_OFFICERSUNIFORM = "ОфицерÑÐºÐ°Ñ ÑƒÐ½Ð¸Ñ„Ð¾Ñ€Ð¼Ð°"; +TAG_FTHROWERPARTS = "ЧаÑти огнемета"; +TAG_REPORT = "Отчет"; +TAG_INFO = "ИнформациÑ"; +TAG_TARGETER = "Целеуказатель"; +TAG_COMMUNICATOR = "Коммуникатор"; +TAG_DEGNINORE = "ДенгинÑÐºÐ°Ñ Ñ€ÑƒÐ´Ð°"; +TAG_GUNTRAINING = "МеткоÑть"; +TAG_HEALTHTRAINING = "ЖивучеÑть"; +TAG_SCANNER = "Сканнер"; +TAG_PRISONPASS = "ПропуÑк в тюрьму"; +TAG_ALARM = "Тревога"; +TAG_AMMOFILLUP = "БоеприпаÑÑ‹"; +TAG_HEALTHFILLUP = "Здоровье"; +TAG_TELEPORTERBEACON = "z маÑк"; +TAG_METALARMOR = "МеталличеÑÐºÐ°Ñ Ð±Ñ€Ð¾Ð½Ñ"; +TAG_LEATHER = "ÐšÐ¾Ð¶Ð°Ð½Ð°Ñ Ð±Ñ€Ð¾Ð½Ñ"; +TAG_HEGRENADES = "Противопехотные гранаты"; +TAG_PHGRENADES = "Зажигательные гранаты"; // "Fire-Grenade_Rounds" в Teaser +TAG_CLIPOFBULLETS = "Обойма пуль"; // "bullets" в Teaser +TAG_BOXOFBULLETS = "БоеприпаÑÑ‹"; +TAG_MINIMISSILES = "Мини-ракеты"; //"rocket" в Teaser +TAG_CRATEOFMISSILES = "Коробка ракет"; //"box_of_rockets" в Teaser +TAG_ENERGYPOD = "ЭненгоÑчейка"; +TAG_ENERGYPACK = "Энергопакет"; +TAG_POISONBOLTS = "Ядовитые Ñтрелы"; // "poison_arrows" в Teaser +TAG_ELECTRICBOLTS = "ЭлектричеÑкие Ñтрелы"; // "electric_arrows" в Teaser +TAG_AMMOSATCHEL = "Ðмуничный рюкзак"; // "Back_pack" в Teaser + +// Item tags: Strife keys +TAG_BASEKEY = "Ключ от базы"; +TAG_GOVSKEY = "Ключ ГовÑа"; // "Rebel_Key" в Teaser +TAG_PASSCARD = "ПропуÑк"; +TAG_IDBADGE = "Бейдж Ñ ID"; +TAG_PRISONKEY = "Ключ от тюрьмы"; +TAG_SEVEREDHAND = "ÐžÑ‚Ð¾Ñ€Ð²Ð°Ð½Ð½Ð°Ñ Ñ€ÑƒÐºÐ°"; +TAG_POWER1KEY = "Ключ от ЭнерниÑ1"; +TAG_POWER2KEY = "Ключ от ЭнергиÑ2"; +TAG_POWER3KEY = "Ключ от ЭнергиÑ3"; +TAG_GOLDKEY = "Золотой ключ"; +TAG_IDCARD = "УдоÑтоверение"; +TAG_SILVERKEY = "СеребрÑный ключ"; +TAG_ORACLEKEY = "Ключ Оракула"; +TAG_MILITARYID = "Военное удоÑтоверение личноÑти"; +TAG_ORDERKEY = "Заказной ключ"; +TAG_WAREHOUSEKEY = "СкладÑкой ключ"; +TAG_BRASSKEY = "Латунный ключ"; +TAG_REDCRYSTALKEY = "КраÑный криÑталличеÑкий ключ"; +TAG_BLUECRYSTALKEY = "Синий криÑталличеÑкий ключ"; +TAG_CHAPELKEY = "Ключ от ЧаÑовни"; +TAG_CATACOMBKEY = "Ключ от катакомб"; // "Tunnel_Key" в Teaser +TAG_SECURITYKEY = "Ключ охраны"; +TAG_COREKEY = "Ключ Ядра"; // "New_Key1" в Teaser +TAG_MAULERKEY = "Ключ МучителÑ"; // "New_Key2" в Teaser +TAG_FACTORYKEY = "ЗаводÑкой ключ"; // "New_Key3" в Teaser +TAG_MINEKEY = "Ключ от шахты"; // "New_Key4" в Teaser +TAG_NEWKEY5 = "Ðовый ключ5"; +TAG_ORACLEPASS = "ПропуÑк Оракула"; + +// Item tags: misc Strife stuff +TAG_10GOLD = "10 золотых"; +TAG_25GOLD = "25 золотых"; +TAG_50GOLD = "50 золотых"; +TAG_300GOLD = "300 золотых"; + +// Item tags: Strife NPCs +TAG_ACOLYTE = "Служитель"; +TAG_ARMORER = "Бронник"; +TAG_BARKEEP = "Бармен"; +TAG_BEGGAR = "Ðищий"; +TAG_MACIL1 = "МÑйÑил"; +TAG_MACIL2 = "МÑйÑил"; +TAG_MEDIC = "Врач"; +TAG_ORACLE = "Оракул"; +TAG_PRIEST = "Жрец"; +TAG_RATBUDDY = "КрыÑа"; +TAG_REBEL = "ПовÑтанец"; +TAG_TEMPLAR = "Храмовник"; +TAG_WEAPONSMITH = "Оружейник"; + +// Item tags: Chex weapons +TAG_SPOON = "Ложка"; +TAG_SPORK = "Супер Ботинок"; +TAG_MINIZORCHER = "Мини-Зорчер"; +TAG_LARGEZORCHER = "Большой Зорчер"; +TAG_SUPERLARGEZORCHER = "Огромный Зорчер"; +TAG_RAPIDZORCHER = "СкороÑтрельный Зорчер"; +TAG_ZORCHPROPULSOR = "Зорч-пропульÑор"; +TAG_PHASINGZORCHER = "Фазовый Зорчер"; +TAG_LAZDEVICE = "УÑтройÑтво «ЛÐЗ»"; + +// Heretic strings +HE1TEXT = + "С уничтожением Железных Личей\n" + "и их приÑпешников, окреÑтные земли\n" + "очиÑтилиÑÑŒ от омерзительной нежити.\n\n" + "Эта нежить, Ð¿Ñ€Ð¾Ð½Ð¸ÐºÑˆÐ°Ñ Ð² наш мир из\n" + "темного измерениÑ, открыла Огненный\n" + "Портал. Он как Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð¿Ñ‹Ð»Ð°ÑŽÑ‰Ð°Ñ\n" + "паÑть Ðда ведет в Ñвою жуткую утробу.\n\n" + "Угроза иÑходит из Огненного Портала —\n" + "Ð¿Ð¾Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ðда и черной магии могут\n" // Какой-то бред + "изринутьÑÑ Ð¸Ð· него. Ваша цель —\n" + "Ñойти в Ðд и запечатать проклÑтый\n" + "портал.\n\n" + "Это Ñмертельно опаÑное деÑние, и Ð’Ñ‹\n" + "риÑкуете навÑегда увÑзнуть во Тьме.\n" + "Ðо кто говорил, что путь иÑтинного\n" + "Еретика легок и проÑÑ‚?"; +HE2TEXT = + "Могучие Молотавры повержены.\n" + "Их дымÑщиеÑÑ Ñ‚Ñ€ÑƒÐ¿Ñ‹ падают,\n" + "разваливаÑÑÑŒ на куÑки, к Вашим\n" + "ногам, и мрачное удовлетворение\n" + "наполнÑет ВаÑ.\n\n" + "Врата, которые они охранÑли, открылиÑÑŒ.\n" + "Ð’Ñ‹ шагнули в них, думаÑ, что\n" + "вернетеÑÑŒ в родной мир, но лишь\n" + "громкий, наÑмешливый хохот был\n" + "ответом на Вашу надежду.\n\n" + "Чей Ñто злобный хохот? Быть может\n" + "Ñто Ð³Ð¾Ð»Ð¾Ñ Ð´ÐµÐ¼Ð¾Ð½Ð¸Ñ‡ÐµÑких Ñил,\n" + "управлÑющих Молотаврами? Какие\n" + "чудовищные ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð¶Ð¸Ð´Ð°ÑŽÑ‚ ВаÑ\n" + "за Ñтими вратами? Ðе голубое небо\n" + "родного мира над головой, а\n" + "криÑтальный купол, — Ñто плохой знак..."; +HE3TEXT = + "С гибелью Д'Спарила иÑчезла магиÑ,\n" + "ÑохранÑÐ²ÑˆÐ°Ñ Ð¶Ð¸Ð·Ð½ÑŒ порождениÑм Тьмы.\n" + "Стоны умирающих демонов заглушили\n" + "вопль агонии Ñамого Д'Спарила.\n\n" + "Ð’Ñ‹ иÑполнили Ñвою клÑтву. МеÑть\n" + "ÑвершилаÑÑŒ. И за Ñекунду до\n" + "Ñ€Ð°Ð·Ñ€ÑƒÑˆÐµÐ½Ð¸Ñ Ñ…Ñ€ÑƒÑтального купола,\n" + "Ð’Ñ‹ наконец-то, входите во врата,\n" + "ведущие в родной мир.\n\n" + "Ðо и теперь, поÑле гибели Д'Спарила,\n" + "душа Ваша не Ñпокойна, и ее\n" + "одолевают плохие предчувÑтвиÑ. Ðе был\n" + "ли проклÑтием его предÑмертный\n" + "крик? Или призывом темных Ñил?\n\n" + "И где таÑÑ‚ÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ðµ Змеиные\n" + "Ð’Ñадники?"; +HE4TEXT = + "С гибелью Д'Спарила умерла и Ваша\n" + "надежда вернутьÑÑ Ð² родной мир.\n" + "Своим предÑмертным проклÑтьем\n" + "он отправил Ð’Ð°Ñ Ð² те немногие,\n" + "ещё оÑтавшиеÑÑ Ð¿Ð¾Ð´Ð²Ð»Ð°Ñтными\n" + "ему земли. Ð’Ñ‹ разбили поÑледних\n" + "хранителей Ñтих земель и Ñтоите\n" + "перед опуÑтевшим замком Д'Спарила,\n" + "оплотом его темных Ñил.\n\n" + "Само Сердце Зла раÑтворило перед\n" + "Вами врата. И Ñ…Ð¾Ñ‚Ñ Ð”'Спарил\n" + "повержен, глубины, породившие его,\n" + "ÑтоÑÑ‚ нерушимы.\n\n" + "Ð’Ñ‹ Ñойдете в Ñту преиÑподнюю, ибо\n" + "единÑтвенный ÑпоÑоб вернутьÑÑ Ð²\n" + "родной мир — отыÑкать вход в него\n" + "в темных глубинах опуÑтевшей вотчины\n" + "Д'Спарила. Личные Ñтражи мертвого\n" + "гоÑподина уже дожидаютÑÑ Ð’Ð°Ñ..."; +HE5TEXT = + "ÐÐ°Ð±Ð»ÑŽÐ´Ð°Ñ Ñ Ð¼Ñ€Ð°Ñ‡Ð½Ñ‹Ð¼ отвращением\n" + "предÑмертную агонию поÑледнего\n" + "Ñраженного Молотавра, Ð’Ñ‹ только\n" + "теперь понимаете, что Ñмерть еще\n" + "никогда не была так близка. Даже\n" + "во Ð²Ñ€ÐµÐ¼Ñ ÑроÑтной битвы Ñ Ñамим\n" + "Д'Спарилом и его темными Ñлугами.\n\n" + "С угрюмым отчаÑнием приближаетеÑÑŒ\n" + "Ð’Ñ‹ к открытым порталам. СлабаÑ\n" + "надежда теплитÑÑ Ð² Вашей душе, —\n" + "быть может за ними Ñкрыта дорога\n" + "домой, а не бездны чужих миров?\n\n" + "ОтчаÑние наделÑет Ð’Ð°Ñ Ð¼Ñ€Ð°Ñ‡Ð½Ð¾Ð¹\n" + "решимоÑтью. Ðичто не ÑпоÑобно\n" + "оÑтановить ВаÑ, одна только — Ñмерть.\n" + "Ðе ÑдавайтеÑÑŒ без боÑ, взглÑните в\n" + "глаза Ñвоей Ñудьбе. Знайте, еÑли Ð’Ñ‹\n" + "упали на Ñамое дно, еÑть лишь один\n" + "путь — наверх."; + +// ЭПИЗОД 1 - ГОРОД ПРОКЛЯТЫХ +HHUSTR_E1M1 = "Доки"; +HHUSTR_E1M2 = "Темницы"; +HHUSTR_E1M3 = "ПривратницкаÑ"; +HHUSTR_E1M4 = "Ð¡Ñ‚Ð¾Ñ€Ð¾Ð¶ÐµÐ²Ð°Ñ Ð±Ð°ÑˆÐ½Ñ"; +HHUSTR_E1M5 = "Цитадель"; +HHUSTR_E1M6 = "Кафедральный Ñобор"; +HHUSTR_E1M7 = "Склепы"; +HHUSTR_E1M8 = "ÐдÑÐºÐ°Ñ ÑƒÑ‚Ñ€Ð¾Ð±Ð°"; +HHUSTR_E1M9 = "Кладбище"; + +// ЭПИЗОД 2 - ÐДСКÐЯ УТРОБР+HHUSTR_E2M1 = "Кратер"; +HHUSTR_E2M2 = "Лавовые очаги"; +HHUSTR_E2M3 = "Река огнÑ"; +HHUSTR_E2M4 = "ЛедÑной грот"; +HHUSTR_E2M5 = "Катакомбы"; +HHUSTR_E2M6 = "Лабиринт"; +HHUSTR_E2M7 = "Большой зал"; +HHUSTR_E2M8 = "Порталы хаоÑа"; +HHUSTR_E2M9 = "Ледник"; + +// ЭПИЗОД 3 - КУПОЛ Д'СПÐРИЛР+HHUSTR_E3M1 = "КладоваÑ"; +HHUSTR_E3M2 = "Сточный колодец"; +HHUSTR_E3M3 = "СлиÑние"; +HHUSTR_E3M4 = "Ð›Ð°Ð·ÑƒÑ€Ð½Ð°Ñ ÐºÑ€ÐµÐ¿Ð¾Ñть"; +HHUSTR_E3M5 = "Логово офидианов"; +HHUSTR_E3M6 = "Залы Ñтраха"; +HHUSTR_E3M7 = "ПропаÑть"; +HHUSTR_E3M8 = "КрепоÑть Д'Спарила"; +HHUSTR_E3M9 = "ВодоноÑный Ñлой"; + +// ЭПИЗОД 4: СКЛЕП +HHUSTR_E4M1 = "Катафалк"; +HHUSTR_E4M2 = "Укрытие"; +HHUSTR_E4M3 = "МонаÑтырÑÐºÐ°Ñ Ð³Ð°Ð»ÐµÑ€ÐµÑ"; +HHUSTR_E4M4 = "Гробница"; +HHUSTR_E4M5 = "Ð’ÐµÐ»Ð¸ÐºÐ°Ñ Ð»ÐµÑтница"; +HHUSTR_E4M6 = "Залы отÑтупников"; +HHUSTR_E4M7 = "Твердыни погибели"; +HHUSTR_E4M8 = "Разрушенный моÑÑ‚"; +HHUSTR_E4M9 = "Мавзолей"; + +// ЭПИЗОД 5: ЗÐСТОЙÐЫЕ ВЛÐДЕÐИЯ +HHUSTR_E5M1 = "Охровые утеÑÑ‹"; +HHUSTR_E5M2 = "Стремнина"; +HHUSTR_E5M3 = "Причал"; +HHUSTR_E5M4 = "Внутренний двор"; +HHUSTR_E5M5 = "Гидротир"; +HHUSTR_E5M6 = "Колоннада"; +HHUSTR_E5M7 = "Зловонный оÑобнÑк"; +HHUSTR_E5M8 = "Поле выÑшего Ñуда"; +HHUSTR_E5M9 = "Путаница Д'Спарила"; + +// Keys + +TXT_GOTBLUEKEY = "Синий ключ"; +TXT_GOTYELLOWKEY = "Желтый ключ"; +TXT_GOTGREENKEY = "Зеленый ключ"; + +// Artifacts + +TXT_ARTIHEALTH = "Кварцевый флакон"; +TXT_ARTIFLY = "ÐšÑ€Ñ‹Ð»ÑŒÑ Ð³Ð½ÐµÐ²Ð°"; +TXT_ARTIINVULNERABILITY = "Кольцо неуÑзвимоÑти"; +TXT_ARTITOMEOFPOWER = "Том могущеÑтва"; +TXT_ARTIINVISIBILITY = "Ð¢ÐµÐ½ÐµÐ²Ð°Ñ Ñфера"; +TXT_ARTIEGG = "Морфийное Ñйцо"; +TXT_ARTISUPERHEALTH = "МиÑтичеÑÐºÐ°Ñ ÑƒÑ€Ð½Ð°"; +TXT_ARTITORCH = "Факел"; +TXT_ARTIFIREBOMB = "ЧаÑÐ¾Ð²Ð°Ñ Ð±Ð¾Ð¼Ð±Ð° древних"; +TXT_ARTITELEPORT = "Эмблема ХаоÑа"; + +// Items + +TXT_ITEMHEALTH = "КриÑтальный флакон"; +TXT_ITEMBAGOFHOLDING = "ÐоÑильный кошель"; +TXT_ITEMSHIELD1 = "СеребрÑный щит"; +TXT_ITEMSHIELD2 = "Зачарованный щит"; +TXT_ITEMSUPERMAP = "Свиток карты"; + +// Ammo + +TXT_AMMOGOLDWAND1 = "КриÑталл Ð´Ð»Ñ ÑльфийÑкого жезла"; +TXT_AMMOGOLDWAND2 = "Жеода криÑталла"; +TXT_AMMOMACE1 = "Сферы Ð´Ð»Ñ Ð±ÑƒÐ»Ð°Ð²Ñ‹"; +TXT_AMMOMACE2 = "Груда Ñфер Ð´Ð»Ñ Ð±ÑƒÐ»Ð°Ð²Ñ‹"; +TXT_AMMOCROSSBOW1 = "Эфирные Ñтрелы"; +TXT_AMMOCROSSBOW2 = "Колчан Ñфирных Ñтрел"; +TXT_AMMOBLASTER1 = "Когтевой шар"; +TXT_AMMOBLASTER2 = "ЭнергетичеÑкий шар"; +TXT_AMMOSKULLROD1 = "ÐœÐ»Ð°Ð´ÑˆÐ°Ñ Ñ€ÑƒÐ½Ð°"; +TXT_AMMOSKULLROD2 = "Ð¡Ñ‚Ð°Ñ€ÑˆÐ°Ñ Ñ€ÑƒÐ½Ñ‹"; +TXT_AMMOPHOENIXROD1 = "Пламенный шар"; +TXT_AMMOPHOENIXROD2 = "Инфернальный шар"; + +// Weapons + +TXT_WPNGOLDWAND = "ЭльфийÑкий жезл"; +TXT_WPNMACE = "ÐžÐ³Ð½ÐµÐ½Ð½Ð°Ñ Ð±ÑƒÐ»Ð°Ð²Ð°"; +TXT_WPNCROSSBOW = "Эфирный арбалет"; +TXT_WPNBLASTER = "Коготь дракона"; +TXT_WPNSKULLROD = "ПоÑох ада"; +TXT_WPNPHOENIXROD = "Жезл феникÑа"; +TXT_WPNGAUNTLETS = "Перчатки некроманта"; + +TXT_NEEDBLUEKEY = "Ð”Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½ÑƒÐ¶ÐµÐ½ Ñиний ключ"; +TXT_NEEDGREENKEY = "Ð”Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½ÑƒÐ¶ÐµÐ½ зеленый ключ"; +TXT_NEEDYELLOWKEY = "Ð”Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½ÑƒÐ¶ÐµÐ½ желтый ключ"; + +TXT_CHEATPOWERON = "POWER ON"; +TXT_CHEATPOWEROFF = "POWER OFF"; +TXT_CHEATHEALTH = "МакÑимальное здоровье"; +TXT_CHEATKEYS = "Ð’Ñе ключи"; +TXT_CHEATSOUNDON = "Отладка звука ВКЮЧЕÐÐ"; +TXT_CHEATSOUNDOFF = "Отладка звука ВЫКЮЧЕÐÐ"; +TXT_CHEATIDDQD = "Жульничаешь, Ñ? Умрешь!"; +TXT_CHEATIDKFA = "Обманщик — ты не заÑлуживаешь оружиÑ"; +TXT_CHEATTICKERON = "TICKER ON"; +TXT_CHEATTICKEROFF = "TICKER OFF"; +TXT_CHEATARTIFACTS3 = "ВЫ ПОЛУЧИЛИ ЭТО"; +TXT_MIDASTOUCH = "У Ñ‚ÐµÐ±Ñ Ð¿Ñ€Ð¸ÐºÐ¾Ñновение МидаÑа, детка"; +TXT_GOTSTUFF = "You got the stuff!"; +TXT_FREEZEON = "Freeze mode on"; +TXT_FREEZEOFF = "Freeze mode off"; +TXT_STRANGE = "Ð’Ñ‹ чувÑтвуете ÑÐµÐ±Ñ Ñтранно..."; +TXT_STRANGER = "Ð’Ñ‹ чувÑтвуете ÑÐµÐ±Ñ Ð¾Ñ‡ÐµÐ½ÑŒ Ñтранно."; +TXT_NOTSTRANGE = "Ð’Ñ‹ Ñнова чувÑтвуете ÑÐµÐ±Ñ Ñобой."; +TXT_LEADBOOTSON = "LEAD BOOTS ON"; +TXT_LEADBOOTSOFF = "LEAD BOOTS OFF"; +TXT_LIGHTER = "Ð’Ñ‹ чувÑтвуете легкоÑть."; +TXT_GRAVITY = "Ð“Ñ€Ð°Ð²Ð¸Ñ‚Ð°Ñ†Ð¸Ñ Ñ‚Ñнет Ð’Ð°Ñ Ð²Ð½Ð¸Ð·."; + +// Raven intermission + +TXT_IMKILLS = "Враги"; +TXT_IMITEMS = "Тайники"; +TXT_IMSECRETS = "Предметы"; +TXT_IMTIME = "ВремÑ"; + +RAVENQUITMSG = "Ð’Ñ‹ дейÑтвительно желаете выйти?"; + +// Friendly names +FN_CHICKEN = "Цыпленок"; +FN_BEAST = "Дракон-оборотень"; +FN_CLINK = "Саблекоготь"; +FN_DSPARIL = "Д'Спарил"; +FN_HERETICIMP = "ГоргульÑ"; +FN_IRONLICH = "Железный лич"; +FN_BONEKNIGHT = "Воин-нежить"; +FN_MINOTAUR = "Молотавр"; +FN_MUMMY = "Голем"; +FN_MUMMYLEADER = "Ðитроголем"; +FN_SNAKE = "Офидиан"; +FN_WIZARD = "Волшебник"; + +// Hexen strings + +// Mana + +TXT_MANA_1 = "СинÑÑ Ð¼Ð°Ð½Ð°"; +TXT_MANA_2 = "Ð—ÐµÐ»ÐµÐ½Ð°Ñ Ð¼Ð°Ð½Ð°"; +TXT_MANA_BOTH = "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¼Ð°Ð½Ð°"; + +// Keys + +TXT_KEY_STEEL = "Стальной ключ"; +TXT_KEY_CAVE = "Пещерный ключ"; +TXT_KEY_AXE = "Ключ-топор"; +TXT_KEY_FIRE = "Огненный ключ"; +TXT_KEY_EMERALD = "Изумрудный ключ"; +TXT_KEY_DUNGEON = "Ключ от подземельÑ"; +TXT_KEY_SILVER = "СеребрÑный ключ"; +TXT_KEY_RUSTED = "Ржавый ключ"; +TXT_KEY_HORN = "Роговой ключ"; +TXT_KEY_SWAMP = "Болотный ключ"; +TXT_KEY_CASTLE = "Ключ от замка"; + +TXT_NEED_KEY_STEEL = "Ð”Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½ÑƒÐ¶ÐµÐ½ Ñтальной ключ"; +TXT_NEED_KEY_CAVE = "Ð”Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½ÑƒÐ¶ÐµÐ½ пещерный ключ"; +TXT_NEED_KEY_AXE = "Ð”Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½ÑƒÐ¶ÐµÐ½ ключ-топор"; +TXT_NEED_KEY_FIRE = "Ð”Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½ÑƒÐ¶ÐµÐ½ огненный ключ"; +TXT_NEED_KEY_EMERALD = "Ð”Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½ÑƒÐ¶ÐµÐ½ изумрудный ключ"; +TXT_NEED_KEY_DUNGEON = "Ð”Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½ÑƒÐ¶ÐµÐ½ ключ от подземельÑ"; +TXT_NEED_KEY_SILVER = "Ð”Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½ÑƒÐ¶ÐµÐ½ ÑеребрÑный ключ"; +TXT_NEED_KEY_RUSTED = "Ð”Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½ÑƒÐ¶ÐµÐ½ ржавый ключ"; +TXT_NEED_KEY_HORN = "Ð”Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½ÑƒÐ¶ÐµÐ½ роговой ключ"; +TXT_NEED_KEY_SWAMP = "Ð”Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½ÑƒÐ¶ÐµÐ½ болотный ключ"; +TXT_NEED_KEY_CASTLE = "Ð”Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½ÑƒÐ¶ÐµÐ½ ключ от замка"; + +// Artifacts + +TXT_ARTIINVULNERABILITY2 = "Символ защитника"; +TXT_ARTISUMMON = "Темный Ñлуга"; +TXT_ARTIEGG2 = "Свиноморфер"; +TXT_ARTIPOISONBAG = "Зелье"; +TXT_ARTITELEPORTOTHER = "Эмблема изгнаниÑ"; +TXT_ARTISPEED = "Сапоги-Ñкороходы"; +TXT_ARTIBOOSTMANA = "Чаша могущеÑтва"; +TXT_ARTIBOOSTARMOR = "Ðаручи из драконьей кожи"; +TXT_ARTIBLASTRADIUS = "ДиÑк отторжениÑ"; +TXT_ARTIHEALINGRADIUS = "Чары магичеÑкого единÑтва"; + +// Puzzle artifacts + +TXT_ARTIPUZZSKULL = "Череп Йорика"; +TXT_ARTIPUZZGEMBIG = "Сердце Д'Спарила"; +TXT_ARTIPUZZGEMRED = "Ð ÑƒÐ±Ð¸Ð½Ð¾Ð²Ð°Ñ Ð¿Ð»Ð°Ð½ÐµÑ‚Ð°"; +TXT_ARTIPUZZGEMGREEN1 = "Ð˜Ð·ÑƒÐ¼Ñ€ÑƒÐ´Ð½Ð°Ñ Ð¿Ð»Ð°Ð½ÐµÑ‚Ð°"; +TXT_ARTIPUZZGEMGREEN2 = "Ð˜Ð·ÑƒÐ¼Ñ€ÑƒÐ´Ð½Ð°Ñ Ð¿Ð»Ð°Ð½ÐµÑ‚Ð°"; +TXT_ARTIPUZZGEMBLUE1 = "Ð¡Ð°Ð¿Ñ„Ð¸Ñ€Ð¾Ð²Ð°Ñ Ð¿Ð»Ð°Ð½ÐµÑ‚Ð°"; +TXT_ARTIPUZZGEMBLUE2 = "Ð¡Ð°Ð¿Ñ„Ð¸Ñ€Ð¾Ð²Ð°Ñ Ð¿Ð»Ð°Ð½ÐµÑ‚Ð°"; +TXT_ARTIPUZZBOOK1 = "ÐšÐ¾Ð´ÐµÐºÑ Ð´ÐµÐ¼Ð¾Ð½Ð°"; +TXT_ARTIPUZZBOOK2 = "LIBER OSCURA"; +TXT_ARTIPUZZSKULL2 = "МаÑка пламени"; +TXT_ARTIPUZZFWEAPON = "Печать воителÑ"; +TXT_ARTIPUZZCWEAPON = "СвÑÑ‚Ð°Ñ Ñ€ÐµÐ»Ð¸ÐºÐ²Ð¸Ñ"; +TXT_ARTIPUZZMWEAPON = "Символ мага"; +TXT_ARTIPUZZGEAR = "ЧаÑÐ¾Ð²Ð°Ñ ÑˆÐµÑтернÑ"; +TXT_USEPUZZLEFAILED = "ЗдеÑÑŒ Ñто невозможно иÑпользовать"; + +// Items + +TXT_ARMOR1 = "Кольчуга"; +TXT_ARMOR2 = "Соколиный щит"; +TXT_ARMOR3 = "Платиновый шлем"; +TXT_ARMOR4 = "Ðмулет Ñтража"; + +// Weapons + +TXT_WEAPON_F2 = "Топор Тимона"; +TXT_WEAPON_F3 = "Молот возмездиÑ"; +TXT_WEAPON_F4 = "ПоÑледний довод Ñобран воедино"; +TXT_WEAPON_C2 = "Змеиный поÑох"; +TXT_WEAPON_C3 = "Огненный шторм"; +TXT_WEAPON_C4 = "Жезл духов Ñобран воедино"; +TXT_WEAPON_M2 = "ЛедÑные оÑколки"; +TXT_WEAPON_M3 = "Дуга Ñмерти"; +TXT_WEAPON_M4 = "Кровавый бич Ñобран воедино"; +TXT_WEAPONPIECE = "ЧаÑть оружиÑ! Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð’Ð°Ñˆ ÑчаÑтливый день!"; +TXT_QUIETUS_PIECE = "ЧаÑть поÑледнего довода"; +TXT_WRAITHVERGE_PIECE = "ЧаÑть жезла духов"; +TXT_BLOODSCOURGE_PIECE = "ЧаÑть кровавого бича"; + +// Friendly names + +FN_FIREDEMON = "Ðфрит"; +FN_DEMON1 = "Серпент"; +FN_ETTIN = "Эттин"; +FN_CENTAUR = "Кентавр"; +FN_SLAUGHTAUR = "Старший кентавр"; +FN_BISHOP = "ЕпиÑкоп"; +FN_ICEGUY = "Вендиго"; +FN_SERPENT = "Сталкер"; +FN_WRAITH = "Грабитель"; +FN_DRAGON = "Виверна Смерти"; +FN_KORAX = "КоракÑ"; +FN_FBOSS = "Зедек"; +FN_MBOSS = "Менелкир"; +FN_CBOSS = "ТрадуктуÑ"; +FN_HERESIARCH = "ЕреÑиарх"; + +// Strife locks + +TXT_NEEDKEY = "Ðужен ключ"; +TXT_NEED_PASSCARD = "Ðужен пропуÑк"; +TXT_NEED_PASSCARD_DOOR = "Ð”Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½ÑƒÐ¶ÐµÐ½ пропуÑк"; +TXT_NEED_IDCARD = "Ðужна Ð»Ð¸Ñ‡Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð°"; +TXT_NEED_PRISONKEY = "Ðужен ключ от тюрьмы"; +TXT_NEED_HANDPRINT = "Отпечаток руки не раÑпознан"; +TXT_NEED_GOLDKEY = "Ðужен золотой ключ"; +TXT_NEED_IDBADGE = "Ðужна Ð»Ð¸Ñ‡Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð°"; +TXT_NEED_IDBADGE_DOOR = "Ð”Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½ÑƒÐ¶Ð½Ð° Ð»Ð¸Ñ‡Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð°"; +TXT_NEED_SILVERKEY = "Ðужен ÑеребрÑный ключ"; +TXT_NEED_BRASSKEY = "Ðужен латунный ключ"; +TXT_NEED_REDCRYSTAL = "Ðужен краÑный криÑталл"; +TXT_NEED_BLUECRYSTAL = "Ðужен Ñиний криÑталл"; +TXT_RETAIL_ONLY = "ЭТРЛОКÐЦИЯ ДОСТУПÐРТОЛЬКО Ð’ ПОЛÐОЙ ВЕРСИИ ИГРЫ STRIFE"; +TXT_DOES_NOT_WORK = "Похоже, Ñто не работает"; + +// Strife Quest messages + +TXT_QUEST_14 = "КриÑталл взорван"; +TXT_QUEST_16 = "Ворота взорваны"; +TXT_QUEST_27 = "Компьютер взорван"; + +TXT_KILLED_BISHOP = "ЕпиÑкоп убит!"; +TXT_KILLED_ORACLE = "Оракл убит!"; +TXT_KILLED_MACIL = "МÑйÑил убит!"; +TXT_KILLED_LOREMASTER = "Хранитель МудроÑти убит!"; + +TXT_YOUFOOL = "Придурок. Ты включил Ñигнализацию!"; +TXT_YOUREDEAD = "Считай, ты мертв; ты включил Ñигнализацию."; + +// Strife pickup messages + +TXT_METALARMOR = "Получена металличеÑÐºÐ°Ñ Ð±Ñ€Ð¾Ð½Ñ."; +TXT_LEATHERARMOR = "Получена ÐºÐ¾Ð¶Ð°Ð½Ð°Ñ Ð±Ñ€Ð¾Ð½Ñ."; +TXT_MEDPATCH = "Получен медицинÑкий бинт."; +TXT_MEDICALKIT = "Получена аптечка."; +TXT_SURGERYKIT = "Получен медкомплект."; +TXT_STRIFEMAP = "Получена карта."; +TXT_BELDINSRING = "Получено кольцо."; +TXT_OFFERINGCHALICE = "Получена чаша Ð´Ð»Ñ Ð¿Ð¾Ð´Ð½Ð¾ÑˆÐµÐ½Ð¸Ð¹."; +TXT_EAR = "Получено ухо."; +TXT_BROKENCOUPLING = "Получено Ñломанное ÑопрÑжение."; +TXT_SHADOWARMOR = "Получена Ñ‚ÐµÐ½ÐµÐ²Ð°Ñ Ð±Ñ€Ð¾Ð½Ñ."; +TXT_ENVSUIT = "Получен защитный коÑтюм."; +TXT_GUARDUNIFORM = "Получена униформа Ñтражника."; +TXT_OFFICERSUNIFORM = "Получена униформа офицера."; +TXT_FTHROWERPARTS = "Получены запчаÑти Ð´Ð»Ñ Ð¾Ð³Ð½ÐµÐ¼ÐµÑ‚Ð°."; +TXT_REPORT = "Получен отчет."; +TXT_INFO = "Получена Ñводка."; +TXT_TARGETER = "Получен прицел."; +TXT_COMMUNICATOR = "Получен коммуникатор."; +TXT_COIN = "Получена монета."; +TXT_XGOLD = "Получено %d золотых."; +TXT_BEACON = "Получен z маÑк."; +TXT_DEGNINORE = "Получена дегнинÑÐºÐ°Ñ Ñ€ÑƒÐ´Ð°."; +TXT_SCANNER = "Получен Ñканер."; +TXT_NEEDMAP = "Сканер не работает без карты!\n"; +TXT_PRISONPASS = "Получен пропуÑк в тюрьму."; + +TXT_STRIFECROSSBOW = "Получен арбалет."; +TXT_ASSAULTGUN = "Получена ÑˆÑ‚ÑƒÑ€Ð¼Ð¾Ð²Ð°Ñ Ð²Ð¸Ð½Ñ‚Ð¾Ð²ÐºÐ°."; +TXT_MMLAUNCHER = "Получена мини-ракетница."; +TXT_FLAMER = "Получен огнемет."; +TXT_MAULER = "Получен иÑÑ‚Ñзатель."; +TXT_GLAUNCHER = "Получен гранатомет."; +TXT_SIGIL = "Получен СИГИЛ."; + +TXT_BASEKEY = "Получен ключ от базы."; +TXT_GOVSKEY = "Получен ключ губернатора."; +TXT_PASSCARD = "Получен пропуÑк."; +TXT_IDBADGE = "Получен идентификационный значок."; +TXT_PRISONKEY = "Получен ключ от тюрьмы."; +TXT_SEVEREDHAND = "Получена Ð¾Ñ‚Ñ€ÐµÐ·Ð°Ð½Ð½Ð°Ñ Ñ€ÑƒÐºÐ°."; +TXT_POWER1KEY = "Получен ключ ÑлектроÑтанции 1."; +TXT_POWER2KEY = "Получен ключ ÑлектроÑтанции 2."; +TXT_POWER3KEY = "Получен ключ ÑлектроÑтанции 3."; +TXT_GOLDKEY = "Получен золотой ключ."; +TXT_IDCARD = "Получен удоÑтоверение."; +TXT_SILVERKEY = "Получен ÑеребрÑный ключ."; +TXT_ORACLEKEY = "Получен ключ оракула."; +TXT_MILITARYID = "Получен армейÑкий жетон."; +TXT_ORDERKEY = "Получен ключ ордена."; +TXT_WAREHOUSEKEY = "Получен ключ от Ñклада."; +TXT_BRASSKEY = "Получен латунный ключ."; +TXT_REDCRYSTAL = "Получен краÑный криÑталл."; +TXT_BLUECRYSTAL = "Получен Ñиний криÑталл."; +TXT_CHAPELKEY = "Получен ключ от капеллы."; +TXT_CATACOMBKEY = "Получен ключ от катакомб."; +TXT_SECURITYKEY = "Получен ключ охраны."; +TXT_COREKEY = "Получен ключ от реактора."; +TXT_MAULERKEY = "Получен ключ иÑÑ‚ÑзаниÑ."; +TXT_FACTORYKEY = "Получен ключ от завода."; +TXT_MINEKEY = "Получен ключ от шахт."; +TXT_NEWKEY5 = "Получен новый ключ 5."; +TXT_ORACLEPASS = "Получен пропуÑк оракула."; + +TXT_HEGRENADES = "Получена ÑвÑзка гранат."; +TXT_PHGRENADES = "Получена ÑвÑзка фоÑфорных гранат."; +TXT_CLIPOFBULLETS = "Получена обойма пуль."; +TXT_BOXOFBULLETS = "Получена коробка пуль."; +TXT_MINIMISSILES = "Получены мини-ракеты."; +TXT_CRATEOFMISSILES = "Получен Ñщик мини-ракет."; +TXT_ENERGYPOD = "Получена ÑнергоÑчейка."; +TXT_ENERGYPACK = "Получен Ñнергоблок."; +TXT_POISONBOLTS = "Получены Ñдовитые болты."; +TXT_ELECTRICBOLTS = "Получены ÑлектричеÑкие болты."; +TXT_AMMOSATCHEL = "Получен амуничный рюкзак."; + +// Random dialogs + +TXT_RANDOM_PEASANT_01 = "ПожалуйÑта, не трогай менÑ."; +TXT_RANDOM_PEASANT_02 = "ЕÑли ты ÑобираешьÑÑ Ð½Ð°Ð²Ñ€ÐµÐ´Ð¸Ñ‚ÑŒ мне, то Ñ Ð½Ðµ Ñтою твоих уÑилий."; +TXT_RANDOM_PEASANT_03 = "Я ничего не знаю."; +TXT_RANDOM_PEASANT_04 = "Уходи, или Ñ Ð¿Ð¾Ð·Ð¾Ð²Ñƒ Ñтражу!"; +TXT_RANDOM_PEASANT_05 = "Иногда мне проÑто хочетÑÑ, чтобы вÑе Ñти повÑтанцы уÑÑнили Ñебе Ñвое меÑто и прекратили веÑÑŒ Ñтот бред."; +TXT_RANDOM_PEASANT_06 = "ПроÑто оÑтавь Ð¼ÐµÐ½Ñ Ð² покое, хорошо?"; +TXT_RANDOM_PEASANT_07 = "Я не уверен, но порой мне кажетÑÑ, что Ñ ÑƒÐ·Ð½Ð°ÑŽ некоторых Ñлужителей."; +TXT_RANDOM_PEASANT_08 = "Орден держит тут вÑе под замком."; +TXT_RANDOM_PEASANT_09 = "Эта Ñлужба безопаÑноÑти не дает и шагу Ñтупить без ÑпроÑа."; +TXT_RANDOM_PEASANT_10 = "Я Ñлыхал, что Орден Ñерьезно обеÑпокоен дейÑтвиÑми повÑтанцев в Ñтом районе."; + +TXT_RANDOM_REBEL_01 = "Ордену никак не уÑтоÑть против наÑ."; +TXT_RANDOM_REBEL_02 = "Мы почти готовы атаковать. Планы МÑйÑила ÑтановÑÑ‚ÑÑ ÑÑны."; +TXT_RANDOM_REBEL_03 = "Мы вÑе поÑтоим за тебÑ. Ðе беÑпокойÑÑ."; +TXT_RANDOM_REBEL_04 = "ДержиÑÑŒ подальше от Ñтих больших роботов. Они и мокрого меÑта от Ñ‚ÐµÐ±Ñ Ð½Ðµ оÑтавÑÑ‚!"; +TXT_RANDOM_REBEL_05 = "Скоро наÑтупит день нашего триумфа, и те, кто противоÑтоит нам, будут Ñокрушены!"; +TXT_RANDOM_REBEL_06 = "Ðе раÑÑлаблÑйÑÑ. У Ð½Ð°Ñ Ð¿Ð¾-прежнему хватает дел."; +TXT_RANDOM_REBEL_07 = "МÑйÑил говорит, ты наша Ð½Ð¾Ð²Ð°Ñ Ð½Ð°Ð´ÐµÐ¶Ð´Ð°. Имей Ñто в виду."; +TXT_RANDOM_REBEL_08 = "Когда мы Ñвергнем Ñтих шарлатанов, то Ñможем воÑÑоздать Ñтот мир таким, каким он должен быть."; +TXT_RANDOM_REBEL_09 = "Помни, ты ÑпаÑешьÑÑ Ð½Ðµ только за ÑебÑ, но и за каждого здеÑÑŒ и Ñнаружи."; +TXT_RANDOM_REBEL_10 = "Пока Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один из Ð½Ð°Ñ ÐµÑ‰Ðµ дышит, мы не побеждены."; + +TXT_RANDOM_AGUARD_01 = "Проходи, рабочий."; +TXT_RANDOM_AGUARD_02 = "Прими иÑтинную веру. Только тогда ты начнешь понимать."; +TXT_RANDOM_AGUARD_03 = "ИÑтинное перерождение возможно только через Ñмерть."; +TXT_RANDOM_AGUARD_04 = "Мне не интереÑна Ñ‚Ð²Ð¾Ñ Ð±ÐµÑÑмыÑÐ»ÐµÐ½Ð½Ð°Ñ Ð±Ð¾Ð»Ñ‚Ð¾Ð²Ð½Ñ."; +TXT_RANDOM_AGUARD_05 = "ЕÑли бы Ñ Ñ…Ð¾Ñ‚ÐµÐ» поговорить Ñ Ñ‚Ð¾Ð±Ð¾Ð¹, то Ñказал бы об Ñтом."; +TXT_RANDOM_AGUARD_06 = "Иди и надоедай кому-нибудь другому!"; +TXT_RANDOM_AGUARD_07 = "Иди куда шел!"; +TXT_RANDOM_AGUARD_08 = "ЕÑли подниметÑÑ Ñ‚Ñ€ÐµÐ²Ð¾Ð³Ð°, не попадайÑÑ Ð½Ð°Ð¼ под ноги!"; +TXT_RANDOM_AGUARD_09 = "Орден очиÑтит мир и начнетÑÑ Ð½Ð¾Ð²Ð°Ñ Ñра."; +TXT_RANDOM_AGUARD_10 = "Проблемы? КажетÑÑ, нет."; + +TXT_RANDOM_BEGGAR_01 = "У Ñ‚ÐµÐ±Ñ Ð½Ðµ найдетÑÑ Ð¼ÐµÐ»Ð¾Ñ‡Ð¸ Ð´Ð»Ñ Ð±ÐµÐ´Ð½Ñка?"; +TXT_RANDOM_BEGGAR_02 = "Ðа что уÑтавилÑÑ, незнакомец?"; +TXT_RANDOM_BEGGAR_03 = "У Ñ‚ÐµÐ±Ñ Ñлучайно не найдетÑÑ Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ лишней еды?"; +TXT_RANDOM_BEGGAR_04 = "Ð’Ñ‹, люди Ñ Ð¿Ð¾Ð²ÐµÑ€Ñ…Ð½Ð¾Ñти, никогда не поймете наÑ."; +TXT_RANDOM_BEGGAR_05 = "Ха, Ñтражники не могут найти наÑ. Эти дураки даже не знают, что мы ÑущеÑтвуем."; +TXT_RANDOM_BEGGAR_06 = "ÐаÑтупит день, когда вÑе, кроме Ñлуг Ордена, будут вынуждены приÑоединитьÑÑ Ðº нам."; +TXT_RANDOM_BEGGAR_07 = "Смотри Ñколько влезет, но знай, что когда-нибудь так будет выглÑдеть и твое лицо."; +TXT_RANDOM_BEGGAR_08 = "Ðичто так не выводит из ÑебÑ, как болтун Ñ Ð¿Ð¾Ð²ÐµÑ€Ñ…Ð½Ð¾Ñти!"; +TXT_RANDOM_BEGGAR_09 = "Орден быÑтро раÑправитÑÑ Ñ Ñ‚Ð²Ð¾Ð¸Ð¼ беÑÑильным Ñопротивлением."; +TXT_RANDOM_BEGGAR_10 = "Следи за Ñобой, пришедший Ñ Ð¿Ð¾Ð²ÐµÑ€Ñ…Ð½Ð¾Ñти. Мы знаем наших врагов!"; + +TXT_RANDOM_PGUARD_01 = "Мы длани Ñудьбы. Прогневить Ð½Ð°Ñ Ð¾Ð·Ð½Ð°Ñ‡Ð°ÐµÑ‚ вÑтретить забвение!"; +TXT_RANDOM_PGUARD_02 = "Орден очиÑтит мир от Ñлабых и порочных!"; +TXT_RANDOM_PGUARD_03 = "ПодчиниÑÑŒ воле хозÑев!"; +TXT_RANDOM_PGUARD_04 = "Долгой жизни братьÑм Ордена!"; +TXT_RANDOM_PGUARD_05 = "Ð¡Ð²Ð¾Ð±Ð¾Ð´Ð½Ð°Ñ Ð²Ð¾Ð»Ñ â€” лишь иллюзиÑ, приÑÑƒÑ‰Ð°Ñ Ñлабоумным."; +TXT_RANDOM_PGUARD_06 = "Сила — путь к величию. Ð’Ñтупить в Ñ€Ñды Ордена означает пойти Ñтим путем!"; +TXT_RANDOM_PGUARD_07 = "Займи Ñвое меÑто Ñреди праведников. ПриÑоединиÑÑŒ к нам!"; +TXT_RANDOM_PGUARD_08 = "Орден защищает Ñвою ÑобÑтвенноÑть."; +TXT_RANDOM_PGUARD_09 = "Служители? Им еще только предÑтоит узреть подлинное величие Ордена."; +TXT_RANDOM_PGUARD_10 = "ЕÑли внутри Ñтой бренной телеÑной оболочки еÑть хоть ÐºÐ°Ð¿Ð»Ñ Ñ‡ÐµÑти, ты приÑоединишьÑÑ Ðº Ордену."; + +TXT_RANDOMGOODBYE_1 = "Пока!"; +TXT_RANDOMGOODBYE_2 = "СпаÑибо, пока!"; +TXT_RANDOMGOODBYE_3 = "До вÑтречи!"; +TXT_HAVEENOUGH = "КажетÑÑ, тебе хватит!"; +TXT_GOAWAY = "Уходи!"; + +TXT_COMM0 = "ВходÑщее Ñообщение"; +TXT_COMM1 = "ВходÑщее Ñообщение от Черной птицы"; + +TXT_TRADE = " за %u"; + +AMMO_CLIP = "Пули"; +AMMO_SHELLS = "Патроны Ð´Ð»Ñ Ð´Ñ€Ð¾Ð±Ð¾Ð²Ð¸ÐºÐ°"; +AMMO_ROCKETS = "Ракеты"; +AMMO_CELLS = "ЭнергетичеÑкие Ñчейки"; +AMMO_GOLDWAND = "КриÑталл Ð´Ð»Ñ ÑльфийÑкого жезла"; +AMMO_CROSSBOW = "Эфирные Ñтрелы"; +AMMO_BLASTER = "Когтевой шар"; +AMMO_MACE = "Сферы Ð´Ð»Ñ Ð±ÑƒÐ»Ð°Ð²Ñ‹"; +AMMO_SKULLROD = "ÐœÐ»Ð°Ð´ÑˆÐ°Ñ Ñ€ÑƒÐ½Ð°"; +AMMO_PHOENIXROD = "Пламенный шар"; +AMMO_MANA1 = "СинÑÑ ÐœÐ°Ð½Ð°"; +AMMO_MANA2 = "Ð—ÐµÐ»ÐµÐ½Ð°Ñ ÐœÐ°Ð½Ð°"; +$ifgame(chex) AMMO_CLIP = "ЗарÑд мини-Зорчера"; +$ifgame(chex) AMMO_SHELLS = "ЗарÑд большого Зорчера"; +$ifgame(chex) AMMO_ROCKETS = "ЗарÑд пропульÑора"; +$ifgame(chex) AMMO_CELLS = "ЗарÑд фазового Зорчера"; + +// Menu Strings + +// Main Menu +MNU_NEWGAME = "ÐÐ¾Ð²Ð°Ñ Ð¸Ð³Ñ€Ð°"; +MNU_OPTIONS = "ÐаÑтройки"; +MNU_GAMEFILES = "Игровые файлы"; +MNU_INFO = "ИнформациÑ"; +MNU_QUITGAME = "Выход"; + +// Skills +MNU_CHOOSESKILL = "Уровень ÑложноÑти:"; + +SKILL_BABY = "Мне рано умирать."; +SKILL_EASY = "Эй, не так грубо."; +SKILL_NORMAL = "Сделай мне больно."; +SKILL_HARD = "УльтранаÑилие"; +SKILL_NIGHTMARE = "КОШМÐР!"; + +CSKILL_BABY = "Easy does it"; +CSKILL_EASY = "Ðе оÑобо липко"; +CSKILL_NORMAL = "МаÑÑа Ñлизи"; +CSKILL_HARD = "ЭкÑÑ‚Ñ€ÐµÐ¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð³Ñ€Ñзь"; +CSKILL_NIGHTMARE = "СверхÑклизÑкий!"; + +SSKILL_BABY = "Разминка"; +SSKILL_EASY = "Ðовичок"; +SSKILL_NORMAL = "Ветеран"; +SSKILL_HARD = "Элита"; +SSKILL_NIGHTMARE = "ÐšÑ€Ð¾Ð²Ð°Ð²Ð°Ñ Ð±Ð¾Ð¹Ð½Ñ"; + +MNU_WETNURSE = "ÐÑнечка надобна мне"; +MNU_YELLOWBELLIES = "Ðе Ñтоль мужеÑтвенен Ñ"; +MNU_BRINGEST = "Подайте мне их"; +MNU_SMITE = "ИÑкушен Ñ ÑражениÑми"; +MNU_BLACKPLAGUE = "Чума овладела мной"; + +MNU_SQUIRE = "ОруженоÑец"; +MNU_KNIGHT = "Рыцарь"; +MNU_WARRIOR = "Воитель"; +MNU_BERSERKER = "БерÑерк"; +MNU_TITAN = "Титан"; + +MNU_ALTARBOY = "Ðлтарник"; +MNU_ACOLYTE = "Служитель"; +MNU_PRIEST = "СвÑщенник"; +MNU_CARDINAL = "Кардинал"; +MNU_POPE = "ЕпиÑкоп"; + +MNU_APPRENTICE = "Ученик"; +MNU_ENCHANTER = "Чародей"; +MNU_SORCERER = "Колдун"; +MNU_WARLOCK = "Чернокнижник"; +MNU_ARCHMAGE = "Ðрхимаг"; + +// КлаÑÑÑ‹ +MNU_CHOOSECLASS = "КлаÑÑ:"; +MNU_FIGHTER = "Воин"; +MNU_CLERIC = "Клерик"; +MNU_MAGE = "Маг"; +MNU_RANDOM = "Ðаугад"; + +// Game Files +MNU_LOADGAME = "Загрузить игру"; +MNU_SAVEGAME = "Сохранить игру"; +MNU_NOPICTURE = "Ðет\nИзображениÑ"; +MNU_DIFFVERSION = "ДругаÑ\nВерÑиÑ"; +MNU_NOFILES = "Ðет файлов"; +MNU_DELETESG = "Ð’Ñ‹ дейÑтвительно хотите удалить Ñохранение\n"; + +// Episodes +MNU_EPISODE = "Выберите Ñпизод"; +MNU_COTD = "Город проклÑтых"; +MNU_HELLSMAW = "ÐдÑÐºÐ°Ñ ÑƒÑ‚Ñ€Ð¾Ð±Ð°"; +MNU_DOME = "Купол Д'Спарила"; +MNU_OSSUARY = "Склеп"; +MNU_DEMESNE = "ЗаÑтойные владениÑ"; +$ifgame(heretic) SWSTRING = "Эпизод недоÑтупен в демоверÑии"; + +// Меню наÑтроек +OPTMNU_TITLE = "ÐÐСТРОЙКИ"; +OPTMNU_CONTROLS = "Управление"; +OPTMNU_MOUSE = "Мышь"; +OPTMNU_JOYSTICK = "ДжойÑтик"; +OPTMNU_PLAYER = "Игрок"; +OPTMNU_GAMEPLAY = "Геймплей"; +OPTMNU_COMPATIBILITY = "СовмеÑтимоÑть"; +OPTMNU_AUTOMAP = "Ðвтокарта"; +OPTMNU_HUD = "HUD"; +OPTMNU_MISCELLANEOUS = "Дополнительно"; +OPTMNU_NETWORK = "Сеть"; +OPTMNU_SOUND = "Звук"; +OPTMNU_DISPLAY = "Экран"; +OPTMNU_VIDEO = "Видеорежим"; +OPTMNU_CHANGERENDER = "Режим рендеринга"; +OPTMNU_DEFAULTS = "СброÑить вÑе наÑтройки"; +OPTMNU_RESETTOSAVED = "Вернуть предыдущие наÑтройки"; +OPTMNU_CONSOLE = "Открыть конÑоль"; +OPTMNU_REVERB = "Редактор реверберации"; + +// Controls Menu + +CNTRLMNU_TITLE = "ÐÐСТРОЙКИ УПРÐВЛЕÐИЯ"; +CNTRLMNU_SWITCHTEXT1 = "ENTER — изменить, BACKSPACE — очиÑтить"; +CNTRLMNU_SWITCHTEXT2 = "Ðажмите клавишу управлениÑ, ESC Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹"; +CNTRLMNU_CONTROLS = "Управление"; +CNTRLMNU_ATTACK = "Ðтака"; +CNTRLMNU_ALTATTACK = "Ð’Ñ‚Ð¾Ñ€Ð¸Ñ‡Ð½Ð°Ñ Ð°Ñ‚Ð°ÐºÐ°"; +CNTRLMNU_RELOAD = "ПерезарÑдка"; +CNTRLMNU_ZOOM = "Приближение"; +CNTRLMNU_USER1 = "Положение Ð¾Ñ€ÑƒÐ¶Ð¸Ñ 1"; +CNTRLMNU_USER2 = "Положение Ð¾Ñ€ÑƒÐ¶Ð¸Ñ 2"; +CNTRLMNU_USER3 = "Положение Ð¾Ñ€ÑƒÐ¶Ð¸Ñ 3"; +CNTRLMNU_USER4 = "Положение Ð¾Ñ€ÑƒÐ¶Ð¸Ñ 4"; +CNTRLMNU_USE = "ИÑпользовать/открыть"; +CNTRLMNU_FORWARD = "Движение вперед"; +CNTRLMNU_BACK = "Движение назад"; +CNTRLMNU_MOVELEFT = "Движение влево"; +CNTRLMNU_MOVERIGHT = "Движение вправо"; +CNTRLMNU_TURNLEFT = "Поворот налево"; +CNTRLMNU_TURNRIGHT = "Поворот направо"; +CNTRLMNU_TURN180 = "БыÑтрый разворот"; +CNTRLMNU_JUMP = "Прыжок"; +CNTRLMNU_CROUCH = "ПриÑедание"; +CNTRLMNU_TOGGLECROUCH = "СеÑть/вÑтать"; +CNTRLMNU_MOVEUP = "Лететь/плыть вверх"; +CNTRLMNU_MOVEDOWN = "Лететь/плыть вниз"; +CNTRLMNU_LAND = "ПриземлитьÑÑ"; +CNTRLMNU_MOUSELOOK = "Обзор мышью"; +CNTRLMNU_KEYBOARDLOOK = "Обзор клавиатурой"; +CNTRLMNU_LOOKUP = "Смотреть вверх"; +CNTRLMNU_LOOKDOWN = "Смотреть вниз"; +CNTRLMNU_CENTERVIEW = "Отцентрировать взглÑд"; +CNTRLMNU_RUN = "Бег"; +CNTRLMNU_TOGGLERUN = "Бежать/идти"; +CNTRLMNU_STRAFE = "Движение боком"; +CNTRLMNU_SCOREBOARD = "Таблица очков"; +CNTRLMNU_TOGGLESCOREBOARD = "Таблица очков (перекл.)"; +CNTRLMNU_CHAT = "Чат"; +CNTRLMNU_SAY = "Сообщение"; +CNTRLMNU_TEAMSAY = "Сообщение команде"; +CNTRLMNU_WEAPONS = "Оружие"; +CNTRLMNU_NEXTWEAPON = "Следующее оружие"; +CNTRLMNU_PREVIOUSWEAPON = "Предыдущее оружие"; +CNTRLMNU_SLOT1 = "Оружие 1"; +CNTRLMNU_SLOT2 = "Оружие 2"; +CNTRLMNU_SLOT3 = "Оружие 3"; +CNTRLMNU_SLOT4 = "Оружие 4"; +CNTRLMNU_SLOT5 = "Оружие 5"; +CNTRLMNU_SLOT6 = "Оружие 6"; +CNTRLMNU_SLOT7 = "Оружие 7"; +CNTRLMNU_SLOT8 = "Оружие 8"; +CNTRLMNU_SLOT9 = "Оружие 9"; +CNTRLMNU_SLOT0 = "Оружие 0"; +CNTRLMNU_INVENTORY = "Инвентарь"; +CNTRLMNU_USEITEM = "ИÑпользовать предмет"; +CNTRLMNU_USEALLITEMS = "ИÑпользовать вÑе предметы"; +CNTRLMNU_NEXTITEM = "Следующий предмет"; +CNTRLMNU_PREVIOUSITEM = "Предыдущий предмет"; +CNTRLMNU_DROPITEM = "ВыброÑить предмет"; +CNTRLMNU_QUERYITEM = "Показать предмет"; +CNTRLMNU_DROPWEAPON = "ВыброÑить оружие"; +CNTRLMNU_OTHER = "Прочее"; +CNTRLMNU_AUTOMAP = "Переключить автокарту"; +CNTRLMNU_CHASECAM = "Вид от 3-го лица (chasecam)"; +CNTRLMNU_COOPSPY = "Вид от другого игрока"; +CNTRLMNU_SCREENSHOT = "Скриншот"; +CNTRLMNU_CONSOLE = "Открыть конÑоль"; +CNTRLMNU_POPUPS = "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð² Strife"; +CNTRLMNU_MISSION = "Текущее задание"; +CNTRLMNU_KEYS = "СпиÑок ключей"; +CNTRLMNU_STATS = "Оружие и ÑтатиÑтика"; + +// Mouse Menu + +MOUSEMNU_TITLE = "ÐÐСТРОЙКИ МЫШИ"; +MOUSEMNU_ENABLEMOUSE = "ИÑпользовать мышь"; +MOUSEMNU_MOUSEINMENU = "ИÑпользовать мышь в меню"; +MOUSEMNU_SHOWBACKBUTTON = "Кнопка «назад»"; +MOUSEMNU_CURSOR = "КурÑор"; +MOUSEMNU_SENSITIVITY = "ÐžÐ±Ñ‰Ð°Ñ Ñ‡ÑƒÐ²ÑтвительноÑть"; +MOUSEMNU_NOPRESCALE = "Ð£Ð²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð½Ð°Ñ Ñ‡ÑƒÐ²ÑтвительноÑть"; +MOUSEMNU_SMOOTHMOUSE = "Плавное перемещение"; +MOUSEMNU_TURNSPEED = "СкороÑть поворота"; +MOUSEMNU_MOUSELOOKSPEED = "СкороÑть обзора"; +MOUSEMNU_FORWBACKSPEED = "СкороÑть передвижениÑ"; +MOUSEMNU_STRAFESPEED = "СкороÑть Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð±Ð¾ÐºÐ¾Ð¼"; +MOUSEMNU_ALWAYSMOUSELOOK = "Обзор мышью"; +MOUSEMNU_INVERTMOUSE = "Инвертирование мыши"; +MOUSEMNU_LOOKSPRING = "Передвижение мышью"; +MOUSEMNU_LOOKSTRAFE = "Движение боком мышью"; + +// Joystick Menu + +JOYMNU_TITLE = "ÐÐСТРОИТЬ ДЖОЙСТИК"; +JOYMNU_OPTIONS = "ÐаÑтройки джойÑтика"; +JOYMNU_NOMENU = "Отключить джойÑтик в меню"; + +// Player Setup Menu +MNU_PLAYERSETUP = "ÐаÑтройки игрока"; +PLYRMNU_NAME = "ИмÑ"; +PLYRMNU_TEAM = "Команда"; +PLYRMNU_PLAYERCOLOR = "Цвет"; +PLYRMNU_RED = "КраÑ."; +PLYRMNU_GREEN = "Зел."; +PLYRMNU_BLUE = "Синий"; +PLYRMNU_PLAYERCLASS = "КлаÑÑ"; +PLYRMNU_PLAYERSKIN = "Скин"; +PLYRMNU_PLAYERGENDER = "Пол"; +PLYRMNU_AUTOAIM = "Ðвтоприц."; +PLYRMNU_SWITCHONPICKUP = "Перекл. при подборе"; +PLYRMNU_ALWAYSRUN = "ПоÑтоÑнный бег"; +PLYRMNU_PRESSSPACE = "\n\cjSPACE"; +PLYRMNU_SEEFRONT = "\nПовернуть"; +PLYRMNU_SEEBACK = "\nПовернуть"; + +// Display Options +DSPLYMNU_TITLE = "ÐÐСТРОЙКИ ЭКРÐÐÐ"; +DSPLYMNU_SCOREBOARD = "Таблица очков"; +DSPLYMNU_SCREENSIZE = "Размер Ñкрана"; +DSPLYMNU_BRIGHTNESS = "ЯркоÑть"; +DSPLYMNU_VSYNC = "Ð’ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÑинхронизациÑ"; +DSPLYMNU_CAPFPS = "Сглаживание рендеринга"; +DSPLYMNU_COLUMNMETHOD = "Режим рендеринга колонок"; +DSPLYMNU_BLENDMETHOD = "Режим рендеринга прозрачноÑти"; + +DSPLYMNU_WIPETYPE = "Эффект плавной Ñмены Ñкранов"; +DSPLYMNU_SHOWENDOOM = "Показать Ñкран ENDOOM"; +DSPLYMNU_BLOODFADE = "ИнтенÑивноÑть вÑпышки при ранении"; +DSPLYMNU_PICKUPFADE = "ИнтенÑивноÑть вÑпышки при подборе"; +DSPLYMNU_WATERFADE = "ИнтенÑивноÑть Ñффекта под водой"; +DSPLYMNU_SKYMODE = "Режим отриÑовки неба"; +DSPLYMNU_LINEARSKY = "Линейной небо"; +DSPLYMNU_GZDFULLBRIGHT = "ÐŸÐ¾Ð»Ð½Ð°Ñ ÑркоÑть замещает цвет Ñектора"; +DSPLYMNU_MODELS = "Модели"; +DSPLYMNU_SCALEFUZZ = "МаÑштабировать Ñффект шума"; +DSPLYMNU_DRAWFUZZ = "ИÑпользовать Ñффект шума"; +DSPLYMNU_OLDTRANS = "КлаÑÑичеÑÐºÐ°Ñ Ð¿Ñ€Ð¾Ð·Ñ€Ð°Ñ‡Ð½Ð¾Ñть"; +DSPLYMNU_TRANSSOUL = "ПрозрачноÑть потерÑнных душ"; +DSPLYMNU_FAKECONTRAST = "Ð˜Ð¼Ð¸Ñ‚Ð°Ñ†Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð°Ñтного оÑÐ²ÐµÑ‰ÐµÐ½Ð¸Ñ Ñтен"; +DSPLYMNU_ROCKETTRAILS = "Дымовой Ñлед у ракет"; +DSPLYMNU_BLOODTYPE = "Тип крови"; +DSPLYMNU_PUFFTYPE = "Тип рикошетов"; +DSPLYMNU_MAXPARTICLES = "КоличеÑтво чаÑтиц"; +DSPLYMNU_MAXDECALS = "КоличеÑтво декалей"; +DSPLYMNU_PLAYERSPRITES = "Показывать Ñпрайты игрока"; +DSPLYMNU_DEATHCAM = "Вид от 3-го лица камеры при Ñмерти"; +DSPLYMNU_TELEZOOM = "Зум при телепортации"; +DSPLYMNU_QUAKEINTENSITY = "ИнтенÑивноÑть землетрÑÑений"; +DSPLYMNU_NOMONSTERINTERPOLATION = "Сглаживание Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð½Ñтров"; +DSPLYMNU_MENUDIM = "Затемнение фона меню"; +DSPLYMNU_DIMCOLOR = "Цвет затемнениÑ"; +DSPLYMNU_MOVEBOB = "Покачивание камеры при движении"; +DSPLYMNU_STILLBOB = "Покачивание камеры при бездейÑтвии"; +DSPLYMNU_BOBSPEED = "СкороÑть Ð¿Ð¾ÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ€ÑƒÐ¶Ð¸Ñ"; +DSPLYMNU_GPUSWITCH = "ИÑпользование GPU ноутбука"; + +// HUD Options +HUDMNU_TITLE = "ÐаÑтройки HUD"; +HUDMNU_ALTHUD = "Ðльтернативный HUD"; +HUDMNU_MESSAGE = "ÐаÑтройки Ñообщений"; +HUDMNU_UISCALE = "МаÑштаб. интерфейÑа"; +HUDMNU_CROSSHAIR = "Тип прицела"; +HUDMNU_FORCECROSSHAIR = "Ð’Ñегда Ñтандартный прицел"; +HUDMNU_GROWCROSSHAIR = "Увеличение прицела при подборе"; +HUDMNU_CROSSHAIRCOLOR = "Цвет прицела"; +HUDMNU_CROSSHAIRHEALTH = "Цвет прицела по ÑоÑтоÑнию здоровьÑ"; +HUDMNU_CROSSHAIRSCALE = "МаÑштаб. прицела"; +HUDMNU_NAMETAGS = "Указание Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð¾Ð²"; +HUDMNU_NAMETAGCOLOR = "Цвет Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð¾Ð²"; +HUDMNU_SCALEFULLSCREENHUD = "МаÑштаб. полноÑкранного интерфейÑа"; +HUDMNU_OLDOUCH = "Ð¡Ñ‚Ð°Ñ€Ð°Ñ Ñ„Ð¾Ñ€Ð¼ÑƒÐ»Ð° Ð´Ð»Ñ Ð¿Ð¾Ñ€Ñ‚Ñ€ÐµÑ‚Ð°"; +HUDMNU_HEXENFLASHES = "Тип вÑпышки Ð¾Ñ€ÑƒÐ¶Ð¸Ñ Ð² Hexen"; +HUDMNU_POISONFLASHES = "Тип вÑпышки Ñда"; +HUDMNU_ICEFLASHES = "Тип вÑпышки при Ñмерти от льда"; +HUDMNU_HAZARDFLASHES = "Тип вÑпышки при Ñкоплении Ñда"; +HUDMNU_SCALEOPT = "ÐаÑтройки маÑштабированиÑ"; + +// Scaling options +SCALEMNU_TITLE = "ÐÐСТРОЙКИ МÐСШТÐБИРОВÐÐИЯ"; +SCALEMNU_OVERRIDE = "Задать Ñпециальные наÑтройки"; +SCALEMNU_MESSAGES = "СообщениÑ"; +SCALEMNU_CONSOLE = "КонÑоль"; +SCALEMNU_STATBAR = "Строка ÑоÑтоÑниÑ"; +SCALEMNU_HUD = "ПолноÑкранный HUD"; +SCALEMNU_ALTHUD = "Ðльтернативный HUD"; +SCALEMNU_HUDASPECT = "Соотношение Ñторон"; +SCALEMNU_USEUI = "Размер по умолчанию"; +SCALEMNU_USEFS = "МаÑштабировать Ñо вÑем Ñкраном"; +SCALEMNU_ADAPT = "ÐдаптироватьÑÑ Ðº размеру Ñкрана"; + +// AltHUD Options +ALTHUDMNU_TITLE = "Ðльтернативный HUD"; +ALTHUDMNU_ENABLE = "Ðльтернативный HUD"; +ALTHUDMNU_SHOWSECRETS = "Отображение обнаруженных тайников"; +ALTHUDMNU_SHOWMONSTERS = "Отображение количеÑтва монÑтров"; +ALTHUDMNU_SHOWITEMS = "Отображение количеÑтва предметов"; +ALTHUDMNU_SHOWSTATS = "Отображение ÑтойкоÑти и точноÑти"; +ALTHUDMNU_SHOWBERSERK = "Отображение берÑерка"; +ALTHUDMNU_SHOWWEAPONS = "Отображение оружиÑ"; +ALTHUDMNU_SHOWAMMO = "Показывать патроны длÑ"; +ALTHUDMNU_SHOWTIME = "Отображение времени"; +ALTHUDMNU_TIMECOLOR = "Цвет времени"; +ALTHUDMNU_SHOWLAG = "Отображение задержки Ñети"; +ALTHUDMNU_AMMOORDER = "ПорÑдок Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±Ð¾ÐµÐ¿Ñ€Ð¸Ð¿Ð°Ñов"; +ALTHUDMNU_AMMORED = "Кр. отображение боеприпаÑов под %"; +ALTHUDMNU_AMMOYELLOW = "Жл. отображение боеприпаÑов под %"; +ALTHUDMNU_HEALTHRED = "КраÑное отображение Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð¿Ð¾Ð´"; +ALTHUDMNU_HEALTHYELLOW = "Желтое отображение Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð¿Ð¾Ð´"; +ALTHUDMNU_HEALTHGREEN = "Зел. отображение Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð¿Ð¾Ð´"; +ALTHUDMNU_ARMORRED = "КраÑное отображение Ð±Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ð´"; +ALTHUDMNU_ARMORYELLOW = "Желтое отображение Ð±Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ð´"; +ALTHUDMNU_ARMORGREEN = "Зел. отображение Ð±Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ð´"; +ALTHUDMNU_AUTOMAPHUD = "Ðльт. HUD на автокарте"; +ALTHUDMNU_TITLECOLOR = "Цвет Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ"; +ALTHUDMNU_MAPTIMECOLOR = "Цвет времени Ð´Ð»Ñ ÑƒÑ€Ð¾Ð²Ð½ÐµÐ¹"; +ALTHUDMNU_HUBTIMECOLOR = "Цвет времени Ð´Ð»Ñ Ñ…Ð°Ð±Ð¾Ð²"; +ALTHUDMNU_TOTALTIMECOLOR = "Цвет общего времени"; +ALTHUDMNU_COORDINATECOLOR = "Цвет координат"; +ALTHUDMNU_COORDINATEMODE = "Координаты игрока"; +ALTHUDMNU_STATSNAMECOLOR = "Цвет имен в ÑтатиÑтике"; +ALTHUDMNU_STATSCOLOR = "Цвет ÑтатиÑтики"; + +// Misc. Options +MISCMNU_TITLE = "ДОПОЛÐИТЕЛЬÐЫЕ ÐÐСТРОЙКИ"; +MISCMNU_MERGEKEYS = "Ðе разделÑть левый/правый ALT/CTRL/SHIFT"; +MISCMNU_WINFULLSCREENTOGGLE = "Переключение полного Ñкрана по ALT+ENTER"; +MISCMNU_MACFULLSCREENTOGGLE = "Переключение полного Ñкрана по Command+F"; +MISCMNU_QUERYIWAD = "Выбор IWAD при запуÑке"; +MISCMNU_ALLCHEATS = "Читы из вÑех игр"; +MISCMNU_ENABLEAUTOSAVES = "ÐвтоÑохранениÑ"; +MISCMNU_AUTOSAVECOUNT = "КоличеÑтво автоÑохранений"; +MISCMNU_SAVELOADCONFIRMATION = "Подтверждение при Ñохранении/загрузке"; +MISCMNU_DEHLOAD = "Загружать файлы *.deh/*.bex"; +MISCMNU_CACHENODES = "КÑширование нодов"; +MISCMNU_CACHETIME = "Временной порог Ð´Ð»Ñ ÐºÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð¾Ð´Ð¾Ð²"; // ИмеетÑÑ Ð² виду количеÑтво времени, затрачиваемое на загрузку карты, чтобы ноды начали кешироватьÑÑ +MISCMNU_CLEARNODECACHE = "ОчиÑтить кÑш нодов"; +MISCMNU_INTERSCROLL = "Разрешение пропуÑка текÑтовых вÑтавок"; +// Automap Options +AUTOMAPMNU_TITLE = "ÐаÑтройки автокарты"; +AUTOMAPMNU_COLORSET = "Цвета автокарты"; +AUTOMAPMNU_CUSTOMCOLORS = "ÐаÑтроить цвета автокарты"; +AUTOMAPMNU_SETCUSTOMCOLORS = "Выбор цветов"; +AUTOMAPMNU_CONTROLS = "Управление"; +AUTOMAPMNU_ROTATE = "ВращающаÑÑÑ Ð°Ð²Ñ‚Ð¾ÐºÐ°Ñ€Ñ‚Ð°"; +AUTOMAPMNU_OVERLAY = "ÐŸÑ€Ð¾Ð·Ñ€Ð°Ñ‡Ð½Ð°Ñ Ð°Ð²Ñ‚Ð¾ÐºÐ°Ñ€Ñ‚Ð°"; +AUTOMAPMNU_TEXTURED = "ТекÑтуры на автокарте"; +AUTOMAPMNU_FOLLOW = "ПривÑзка к игроку"; +AUTOMAPMNU_SHOWITEMS = "КоличеÑтво предметов"; +AUTOMAPMNU_SHOWMONSTERS = "КоличеÑтво монÑтов"; +AUTOMAPMNU_SHOWSECRETS = "КоличеÑтво тайников"; +AUTOMAPMNU_SHOWTIME = "Прошедшее времÑ"; +AUTOMAPMNU_SHOWTOTALTIME = "Общее времÑ"; +AUTOMAPMNU_MAPSECRETS = "Тайники на карте"; +AUTOMAPMNU_SHOWMAPLABEL = "Ðазвание карты"; +AUTOMAPMNU_DRAWMAPBACK = "Отображать фон автокарты"; +AUTOMAPMNU_SHOWKEYS = "Отображать ключи (только чит)"; +AUTOMAPMNU_SHOWTRIGGERLINES = "Отображать триггеры"; +AUTOMAPMNU_SHOWTHINGSPRITES = "Отображать Ñпрайты предметов"; +AUTOMAPMNU_PTOVERLAY = "Порталы в прозрачном режиме"; +AUTOMAPMNU_EMPTYSPACEMARGIN = "Край автокарты"; + +// Automap Controls +MAPCNTRLMNU_TITLE = "ÐÐСТРОЙКИ УПРÐВЛЕÐИЯ КÐРТОЙ"; +MAPCNTRLMNU_CONTROLS = "Управление автокартой"; +MAPCNTRLMNU_PANLEFT = "Сдвиг влево"; +MAPCNTRLMNU_PANRIGHT = "Сдвиг вправо"; +MAPCNTRLMNU_PANUP = "Сдвиг вверх"; +MAPCNTRLMNU_PANDOWN = "Сдвиг вниз"; +MAPCNTRLMNU_ZOOMIN = "Увеличить маÑштаб"; +MAPCNTRLMNU_ZOOMOUT = "Уменьшить маÑштаб"; +MAPCNTRLMNU_TOGGLEZOOM = "Переключить зум"; +MAPCNTRLMNU_TOGGLEFOLLOW = "Переключить Ñледование"; +MAPCNTRLMNU_TOGGLEGRID = "Переключить Ñетку"; +MAPCNTRLMNU_TOGGLETEXTURE = "Переключить текÑтуры"; +MAPCNTRLMNU_SETMARK = "ПоÑтавить отметку"; +MAPCNTRLMNU_CLEARMARK = "Убрать отметку"; + +// Automap Colors +MAPCOLORMNU_TITLE = "ÐÐСТРОЙКИ ЦВЕТОВ ÐВТОКÐРТЫ"; +MAPCOLORMNU_DEFAULTMAPCOLORS = "Вернуть Ñтандартные цвета"; +MAPCOLORMNU_BACKCOLOR = "Фон"; +MAPCOLORMNU_YOURCOLOR = "Игрок"; +MAPCOLORMNU_WALLCOLOR = "ОдноÑторонние Ñтены"; +MAPCOLORMNU_FDWALLCOLOR = "ДвуÑторонние Ñтены"; +MAPCOLORMNU_CDWALLCOLOR = "ДвуÑторонние Ñтены Ñ Ñ€Ð°Ð·Ð½Ñ‹Ð¼Ð¸ потолками"; +MAPCOLORMNU_EFWALLCOLOR = "ДвуÑторонние Ñтены Ñ Ñ€Ð°Ð·Ð½Ñ‹Ð¼Ð¸ полами"; +MAPCOLORMNU_GRIDCOLOR = "Цвет Ñетки"; +MAPCOLORMNU_XHAIRCOLOR = "КурÑор"; +MAPCOLORMNU_NOTSEENCOLOR = "Ðеобнаруженные Ñтены"; +MAPCOLORMNU_LOCKEDCOLOR = "Запертые двери"; +MAPCOLORMNU_INTRALEVELCOLOR = "Телепорт в пределах уровнÑ"; +MAPCOLORMNU_INTERLEVELCOLOR = "Телепорт на другой уровень"; +MAPCOLORMNU_SECRETSECTORCOLOR = "Тайный Ñектор"; +MAPCOLORMNU_UNEXPLOREDSECRETCOLOR = "Ðеобнаруженный тайник"; +MAPCOLORMNU_SPECIALWALLCOLOR = "Специальные триггер-линии"; +MAPCOLORMNU_CHEATMODE = "Чит-режим"; +MAPCOLORMNU_TSWALLCOLOR = "Ðевидимые двуÑторонние Ñтены"; +MAPCOLORMNU_SECRETWALLCOLOR = "Тайные Ñтены"; +MAPCOLORMNU_THINGCOLOR = "Объекты"; +MAPCOLORMNU_MONSTERCOLOR = "МонÑтры"; +MAPCOLORMNU_NONCOUNTINGMONSTERCOLOR = "Ðеучитываемые монÑтры"; +MAPCOLORMNU_FRIENDCOLOR = "ДружеÑтвенные"; +MAPCOLORMNU_ITEMCOLOR = "Предметы"; +MAPCOLORMNU_COUNTITEMCOLOR = "Учитываемые предметы"; +MAPCOLORMNU_OVERLAY = "Прозрачный режим"; +MAPCOLORMNU_OVCHEATMODE = "Прозрачный чит-режим"; +MAPCOLORMNU_PORTAL = "Порталы в прозрачном режиме"; + +// Message Options +MSGMNU_TITLE = "СООБЩЕÐИЯ"; +MSGMNU_SHOWMESSAGES = "Отображение Ñообщений"; +MSGMNU_SHOWOBITUARIES = "Отображение некрологов"; +MSGMNU_SHOWSECRETS = "Отображение Ñообщений о тайниках"; +MSGMNU_MESSAGELEVEL = "Минимальный уровень Ñообщений"; +MSGMNU_CENTERMESSAGES = "Центрирование Ñообщений"; +MSGMNU_MESSAGECOLORS = "Цвета Ñообщений"; +MSGMNU_ITEMPICKUP = "Подбор предмета"; +MSGMNU_OBITUARIES = "Ðекрологи"; +MSGMNU_CRITICALMESSAGES = "Важные ÑообщениÑ"; +MSGMNU_CHATMESSAGES = "Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² чате"; +MSGMNU_TEAMMESSAGES = "Командные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² чате"; +MSGMNU_CENTEREDMESSAGES = "Центрированные ÑообщениÑ"; +MSGMNU_SCREENSHOTMESSAGES = "Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ Ñкриншотах"; +MSGMNU_LONGSAVEMESSAGES = "Подробные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ÑохранениÑÑ…"; +MSGMNU_DEVELOPER = "Режим Ñообщений Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ¾Ð²"; + +// Scoreboard Options +SCRBRDMNU_TITLE = "ÐÐСТРОЙКИ ТÐБЛИЦЫ ОЧКОВ"; +SCRBRDMNU_COOPERATIVE = "ÐаÑтройки Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´"; +SCRBRDMNU_ENABLE = "Включить таблицу очков"; +SCRBRDMNU_HEADERCOLOR = "Цвет заголовка"; +SCRBRDMNU_YOURCOLOR = "Ваш цвет"; +SCRBRDMNU_OTHERPLAYERCOLOR = "Цвет других игроков"; +SCRBRDMNU_DEATHMATCH = "ÐаÑтройки Deathmatch"; +SCRBRDMNU_TEAMDEATHMATCH = "ÐаÑтройки командного Deathmatch"; + +// Gameplay Menu +GMPLYMNU_TITLE = "ÐÐСТРОЙКИ ГЕЙМПЛЕЯ"; +GMPLYMNU_TEAMPLAY = "Командный режим"; +GMPLYMNU_TEAMDAMAGE = "Множитель урона по Ñвоим"; +GMPLYMNU_SMARTAUTOAIM = "Умное автоприцеливание"; +GMPLYMNU_FALLINGDAMAGE = "Урон от падениÑ"; +GMPLYMNU_DROPWEAPON = "СохранÑть оружие поÑле Ñмерти"; +GMPLYMNU_DOUBLEAMMO = "Удвоенные патроны"; +GMPLYMNU_INFINITEAMMO = "БеÑконечные патроны"; +GMPLYMNU_INFINITEINVENTORY = "БеÑконечный инвентарь"; +GMPLYMNU_NOMONSTERS = "Отключить монÑтров"; +GMPLYMNU_NOMONSTERSTOEXIT = "Убить вÑех монÑтров Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð°"; +GMPLYMNU_MONSTERSRESPAWN = "МонÑтры воÑкрешаютÑÑ"; +GMPLYMNU_NORESPAWN = "Отключение воÑкрешениÑ"; +GMPLYMNU_ITEMSRESPAWN = "ВоÑÑтановление предметов"; +GMPLYMNU_SUPERRESPAWN = "ВоÑÑтановление Ñупер-бонуÑов"; +GMPLYMNU_FASTMONSTERS = "УÑкоренные монÑтры"; +GMPLYMNU_DEGENERATION = "Уменьшать доп. здоровье"; // Или "ДегенерациÑ" =D +GMPLYMNU_NOAUTOAIM = "Разрешить автоприцеливание"; +GMPLYMNU_ALLOWSUICIDE = "Разрешить Ñуицид"; +GMPLYMNU_ALLOWJUMP = "Прыжки"; +GMPLYMNU_ALLOWCROUCH = "ПриÑедание"; +GMPLYMNU_ALLOWFREELOOK = "Обзор мышью"; +GMPLYMNU_ALLOWFOV = "Разрешить изменение FOV"; +GMPLYMNU_BFGFREEAIM = "Разрешить прицеливание Ñ BFG"; +GMPLYMNU_ALLOWAUTOMAP = "Разрешить иÑпользование автокарты"; +GMPLYMNU_AUTOMAPALLIES = "Показывать Ñоюзников на автокарте"; +GMPLYMNU_ALLOWSPYING = "Разрешить вид от других игроков"; +GMPLYMNU_CHASECAM = "Разрешить вид от 3-го лица"; +GMPLYMNU_DONTCHECKAMMO = "ПроверÑть патроны при переключении оружиÑ"; // Именно при перелиÑтывании, а не Ñмене на конкретное +GMPLYMNU_KILLBOSSSPAWNS = "Убить Ð¿Ð¾Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð˜ÐºÐ¾Ð½Ñ‹ при ее Ñмерти"; +GMPLYMNU_NOCOUNTENDMONSTER = "Считать монÑтров в конечном Ñекторе убитыми"; // Или "Пройденные Ñектора ÑчитаютÑÑ Ð·Ð° % убийÑтв +GMPLYMNU_DEATHMATCH = "ÐаÑтройки deathmatch"; +GMPLYMNU_WEAPONSSTAY = "ОÑтавлÑть оружие поÑле подбора"; +GMPLYMNU_ALLOWPOWERUPS = "Разрешить бонуÑÑ‹"; +GMPLYMNU_ALLOWHEALTH = "Разрешить бонуÑÑ‹ к здоровью"; +GMPLYMNU_ALLOWARMOR = "Разрешить броню"; +GMPLYMNU_SPAWNFARTHEST = "ВоÑÑтановление подальше от оÑтальных"; +GMPLYMNU_SAMEMAP = "Зациклить уровень"; +GMPLYMNU_FORCERESPAWN = "Моментальное воÑÑтановление"; +GMPLYMNU_ALLOWEXIT = "Разрешить выход"; +GMPLYMNU_BARRELSRESPAWN = "ВоÑÑтановление бочек"; +GMPLYMNU_RESPAWNPROTECTION = "ÐšÑ€Ð°Ñ‚ÐºÐ¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ð° поÑле воÑкрешениÑ"; +GMPLYMNU_LOSEFRAG = "ТерÑть фраг при Ñмерти"; +GMPLYMNU_KEEPFRAGS = "СохранÑть фраги между уровнÑми"; +GMPLYMNU_NOTEAMSWITCH = "Запретить переход между командами"; +GMPLYMNU_COOPERATIVE = "ÐаÑтройки кооператива"; +GMPLYMNU_MULTIPLAYERWEAPONS = "ПоÑвление Ð¾Ñ€ÑƒÐ¶Ð¸Ñ Ð¸Ð· мультиплеера"; +GMPLYMNU_LOSEINVENTORY = "ТерÑть веÑÑŒ инвентарь при Ñмерти"; +GMPLYMNU_KEEPKEYS = "СохранÑть ключи"; +GMPLYMNU_KEEPWEAPONS = "СохранÑть оружие"; +GMPLYMNU_KEEPARMOR = "СохранÑть броню"; +GMPLYMNU_KEEPPOWERUPS = "СохранÑть Ñупер-бонуÑÑ‹"; +GMPLYMNU_KEEPAMMO = "СохранÑть патроны"; +GMPLYMNU_LOSEHALFAMMO = "ТерÑть половину патронов"; +GMPLYMNU_SPAWNWHEREDIED = "ВоÑÑтановление на меÑте Ñмерти"; + +// Compatibility Options +CMPTMNU_TITLE = "ÐÐСТРОЙКИ СОВМЕСТИМОСТИ"; +CMPTMNU_MODE = "Режим ÑовмеÑтимоÑти"; +CMPTMNU_ACTORBEHAVIOR = "Поведение акторов"; +CMPTMNU_CORPSEGIBS = "Раздавленные монÑтры могут быть воÑкрешены"; +CMPTMNU_NOBLOCKFRIENDS = "Ðе блокировать дружеÑтвенных монÑтров"; +CMPTMNU_LIMITPAIN = "Ограничить чиÑло потер. душ из Ñлементалей боли"; +CMPTMNU_MBFMONSTERMOVE = "Эффекты влиÑÑŽÑ‚ на движение монÑтров"; +CMPTMNU_CROSSDROPOFF = "МонÑтрам Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÑекать уÑтупы"; +CMPTMNU_DROPOFF = "МонÑтры заÑтревают на уÑтупах"; +CMPTMNU_INVISIBILITY = "МонÑтры видÑÑ‚ невидимых игроков"; +CMPTMNU_MINOTAUR = "Минотавры не Ñоздают огонь в воде"; +CMPTMNU_NOTOSSDROPS = "Выброшенные предметы ÑоздаютÑÑ Ð½Ð° земле"; +CMPTMNU_DEHACKEDBEHAVIOR = "Поведение DeHackEd"; +CMPTMNU_DEHHEALTH = "ÐаÑтройки Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ DEH как в Doom2.exe"; +CMPTMNU_MUSHROOM = "ÐžÑ€Ð¸Ð³Ð¸Ð½Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑть A_Mushroom в модах DEH"; +CMPTMNU_MAPACTIONBEHAVIOR = "Поведение уровней/дейÑтвий"; +CMPTMNU_USEBLOCKING = "Ð’Ñе Ñпециальные линии могут блокировать "; +CMPTMNU_ANYBOSSDEATH = "Любой A_BossDeath активирует special на уровне"; +CMPTMNU_NODOORLIGHT = "Отключить Ñветовой Ñффект на дверÑÑ… из BOOM"; +CMPTMNU_LIGHT = "ИÑкать ÑоÑеднего Ñвета как в Doom"; +CMPTMNU_SHORTTEX = "ИÑкать кратчайшие текÑтуры как в Doom"; +CMPTMNU_STAIRS = "ИÑпользовать неиÑправленное поÑтроение леÑтниц"; +CMPTMNU_FLOORMOVE = "Поведение Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ полу из Doom"; +CMPTMNU_POINTONLINE = "ИÑпользовать алгоритм point-on-line из Doom"; +CMPTMNU_MULTIEXIT = "Выходы могут быть активированы более одного раза"; +CMPTMNU_PHYSICSBEHAVIOR = "Поведение физики"; +CMPTMNU_NOPASSOVER = "Ðкторы беÑконечно выÑокие"; +CMPTMNU_BOOMSCROLL = "Скроллеры из BOOM ÑвлÑÑŽÑ‚ÑÑ Ð°Ð´Ð´Ð¸Ñ‚Ð¸Ð²Ð½Ñ‹Ð¼Ð¸"; +CMPTMNU_BADANGLES = "Запрещено двигатьÑÑ Ð¿Ñ€Ñмо на С, Ю, З, Ð’"; +CMPTMNU_WALLRUN = "Включить быÑтрый бег вдоль Ñтен (wallrun)"; +CMPTMNU_RAVENSCROLL = "Raven-Ñкроллеры иÑпользуют оригинальную ÑкороÑть"; +CMPTMNU_TRACE = "СамоÑÑылающиеÑÑ Ñекторы не блокируют выÑтрелы"; +CMPTMNU_HITSCAN = "ИÑпользовать код из Doom Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€Ð¾Ðº хит-Ñканов"; +CMPTMNU_MISSILECLIP = "ИÑпользовать выÑоты из Doom Ð´Ð»Ñ ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ñ€Ð°ÐºÐµÑ‚"; +CMPTMNU_RENDERINGBEHAVIOR = "Поведение рендеринга"; +CMPTMNU_POLYOBJ = "РиÑовать полиобъекты как в Hexen"; +CMPTMNU_MASKEDMIDTEX = "Игнорировать Ñмещение Y на Ñкрытых мид-текÑтурах"; +CMPTMNU_SPRITESORT = "Инвертировать Ñортировку Ñпрайтов"; +CMPTMNU_SOUNDBEHAVIOR = "Поведение звуков"; +CMPTMNU_SOUNDSLOTS = "ИÑказить звуки Ð´Ð»Ñ Ñ‚Ñ€ÑŽÐºÐ° беÑшумной BFG"; +CMPTMNU_SILENTPICKUP = "Запрещать другим Ñлышать Ваш подбор предметов"; +CMPTMNU_SILENTINSTANTFLOORS = "Мгновенно двигающиеÑÑ Ð¿Ð¾Ð»Ñ‹ не беззвучны"; +CMPTMNU_SECTORSOUNDS = "Звуки Ñекторов иÑпользуют центр как иÑточник"; +CMPTMNU_SOUNDCUTOFF = "ОÑтанавливать звуки при иÑчезновении актора"; +CMPTMNU_SOUNDTARGET = "ÐžÑ€Ð¸Ð³Ð¸Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° иÑточников звука"; +CMPTMNU_TELEPORT = "Скрипт. телепорты не инициируют дейÑÑ‚Ð²Ð¸Ñ Ñекторов"; +CMPTMNU_PUSHWINDOW = "Ðеблокирующие линии могут быть отодвинуты"; + +// Sound Options +SNDMNU_TITLE = "ÐÐСТРОЙКИ ЗВУКÐ"; +SNDMNU_SFXVOLUME = "ГромкоÑть звука"; +SNDMNU_MENUVOLUME = "ГромкоÑть меню"; +SNDMNU_MUSICVOLUME = "ГромкоÑть музыки"; +SNDMNU_MIDIDEVICE = "MIDI проигрыватель"; +SNDMNU_BACKGROUND = "Звуки в фоне"; +SNDMNU_UNDERWATERREVERB = "Эффект под водой"; +SNDMNU_RANDOMIZEPITCHES = "ИзменÑть выÑоту"; +SNDMNU_CHANNELS = "КоличеÑтво каналов"; +SNDMNU_BACKEND = "Ð—Ð²ÑƒÐºÐ¾Ð²Ð°Ñ ÑиÑтема"; +SNDMNU_OPENAL = "ÐаÑтройки OpenAL"; +SNDMNU_RESTART = "ПерезапуÑтить звук"; +SNDMNU_ADVANCED = "РаÑширенные наÑтройки"; +SNDMNU_MODREPLAYER = "ПÐРÐМЕТРЫ МОДУЛЯ ВОСПРОИЗВЕДЕÐИЯ"; +SNDMNU_MIDIPLAYER = "ÐÐСТРОЙКИ MIDI-ПРОИГРЫВÐТЕЛЯ"; + +// OpenAL Options +OPENALMNU_TITLE = "ÐÐСТРОЙКИ OPENAL"; +OPENALMNU_PLAYBACKDEVICE = "УÑтройÑтво воÑпроизведениÑ"; +OPENALMNU_ENABLEEFX = "Включить EFX"; +OPENALMNU_RESAMPLER = "РеÑемплер"; + +// Advanced Sound Options +ADVSNDMNU_TITLE = "РÐСШИРЕÐÐЫЕ ÐÐСТРОЙКИ"; +ADVSNDMNU_SAMPLERATE = "ЧаÑтота диÑкретизации"; +ADVSNDMNU_HRTF = "HRTF"; +ADVSNDMNU_OPLSYNTHESIS = "Синтез OPL"; +ADVSNDMNU_OPLNUMCHIPS = "КоличеÑтво Ñмулируемых OPL чипов"; +ADVSNDMNU_OPLFULLPAN = "ÐŸÐ¾Ð»Ð½Ð°Ñ Ñтереопанорама Ð´Ð»Ñ MIDI"; +ADVSNDMNU_OPLCORES = "Ядро ÑмулÑции OPL"; +ADVSNDMNU_OPNCORES = "Ядро ÑмулÑции OPN2"; +ADVSNDMNU_GUSEMULATION = "ЭмулÑÑ†Ð¸Ñ GUS"; +ADVSNDMNU_GUSCONFIG = "Файл конфигурации Ð´Ð»Ñ GUS"; +ADVSNDMNU_MIDIVOICES = "MIDI-голоÑа"; +ADVSNDMNU_DMXGUS = "Читать файлы DMXGUS"; +ADVSNDMNU_GUSMEMSIZE = "Размер памÑти GUS"; +ADVSNDMNU_FLUIDSYNTH = "FluidSynth"; +ADVSNDMNU_FLUIDPATCHSET = "Патч-набор"; +ADVSNDMNU_FLUIDGAIN = "УÑиление"; +ADVSNDMNU_REVERB = "РеверберациÑ"; +ADVSNDMNU_REVERB_LEVEL = "Уровень реверберации"; +ADVSNDMNU_CHORUS = "ХоруÑ"; +ADVSNDMNU_TIMIDITY = "Timidity++"; +ADVSNDMNU_ADLMIDI = "ADLMidi"; +ADVSNDMNU_OPNMIDI = "OPNMidi"; +ADVSNDMNU_TIMIDITYEXE = "Путь к Ñинтезатору"; +ADVSNDMNU_TIMIDITYCONFIG = "Файл конфигурации Timidity"; +ADVSNDMNU_TIMIDITYVOLUME = "ОтноÑÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð³Ñ€Ð¾Ð¼ÐºÐ¾Ñть"; +ADVSNDMNU_WILDMIDI = "WildMidi"; +ADVSNDMNU_WILDMIDICONFIG = "Файл конфигурации WildMidi"; +ADVSNDMNU_SELCONFIG = "Выбор конфигурации"; +ADVSNDMNU_GLOBAL = "Общие"; +ADVSNDMNU_FREEVERB = "Freeverb"; +ADVSNDMNU_GLOBAL_FREEVERB = "Global Freeverb"; +ADVSNDMNU_ADVRESAMPLING = "Продвинутый реÑемплинг"; +ADVSNDMNU_OPLBANK = "OPL Bank"; +ADVSNDMNU_ADLOPLCORES = "OPL Emulator Core"; +ADVSNDMNU_RUNPCMRATE = "Run emulator at PCM rate"; +ADVSNDMNU_ADLNUMCHIPS = "Number of emulated OPL chips"; +ADVSNDMNU_VLMODEL = "Volume model"; +ADVSNDMNU_OPNNUMCHIPS = "Number of emulated OPN chips"; +ADVSNDMNU_ADLCUSTOMBANK = "Use custom WOPL bank"; +ADVSNDMNU_OPLBANKFILE = "WOPL Bank file"; +ADVSNDMNU_OPNCUSTOMBANK = "Use custom WOPN bank"; +ADVSNDMNU_OPNBANKFILE = "WOPN Bank file"; + +// ADLMIDI's emulation cores + +// ADLMIDI's volume models +ADLVLMODEL_AUTO = "Auto (Use setup of bank)"; +ADLVLMODEL_GENERIC = "Generic"; +ADLVLMODEL_NATIVE = "OPL Native"; +ADLVLMODEL_DMX = "DMX"; +ADLVLMODEL_APOGEE = "Apogee"; +ADLVLMODEL_WIN9X = "Win9X-like"; + +// Module Replayer Options +MODMNU_TITLE = "ПÐРÐМЕТРЫ МОДУЛЯ ВОСПРОИЗВЕДЕÐИЯ"; +MODMNU_REPLAYERENGINE = "Звуковой движок"; +MODMNU_MASTERVOLUME = "ÐžÐ±Ñ‰Ð°Ñ Ð³Ñ€Ð¾Ð¼ÐºÐ¾Ñть"; +MODMNU_QUALITY = "КачеÑтво"; +// MODMNU_VOLUMERAMPING = "Объем-Ñ€Ñмпинг"; // TODO: Fix +MODMNU_CHIPOMATIC = "Chip-o-matic"; + +// Renderer Options +RNDMNU_TITLE = "СМЕÐИТЬ РЕÐДЕРЕР"; +RNDMNU_RENDERER = "Ðппаратное уÑкорение"; +RNDMNU_TRUECOLOR = "Полноцветный програмный"; +RNDMNU_POLY = "Поли-рендерер (ÑкÑпериментальный)"; +RNDMNU_CANVAS = "ХолÑÑ‚ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð½Ð¾Ð³Ð¾ рендеринга"; + +// Video Options +VIDMNU_TITLE = "ÐÐСТРОЙКИ ВИДЕОРЕЖИМÐ"; +VIDMNU_RENDERMODE = "Режим рендеринга"; +VIDMNU_FULLSCREEN = "Полный Ñкран"; +VIDMNU_HIDPI = "Поддержка Retina/HiDPI"; +VIDMNU_BRDLSS = "Безрамочный оконный режим"; +VIDMNU_ASPECTRATIO = "Соотношение Ñторон"; +VIDMNU_FORCEASPECT = "Принудительное Ñоот. Ñторон"; +VIDMNU_CROPASPECT = "Принудительный тип Ñоот."; +VIDMNU_5X4ASPECTRATIO = "Включить Ñоотношение Ñторон 5:4"; +VIDMNU_SCALEMODE = "МаÑштабирование"; +VIDMNU_SCALEFACTOR = "Значение маÑштаба"; +VIDMNU_ENTERTEXT = "Ðажмите ENTER Ð´Ð»Ñ ÑƒÑтановки режима"; +VIDMNU_TESTTEXT1 = "T Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра режима в течение 5 Ñекунд"; +VIDMNU_TESTTEXT2 = "ПожалуйÑта, подождите 5 Ñекунд..."; +VIDMNU_USELINEAR = "Линейное МаÑшт. (Полный Экран)"; +VIDMNU_CUSTOMRES = "ПользовательÑкое разрешение"; +VIDMNU_CUSTOMX = "Польз. Длина"; +VIDMNU_CUSTOMY = "Польз. Ð’Ñ‹Ñота"; +VIDMNU_APPLYW = "Сохранить Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (Оконный Режим)"; +VIDMNU_APPLYFS = "Сохранить Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (Полный Экран)"; +VIDMNU_RESPRESET = "Выбор преÑета разрешениÑ"; +VIDMNU_RESPRESETTTL = "ПОЛЬЗОВÐТЕЛЬСКИЕ ПРЕСЕТЫ РÐЗРЕШЕÐИЯ"; +VIDMNU_RESPRESETHEAD = "ДоÑтупные разрешениÑ"; +VIDMNU_ASPECT43 = "4:3"; +VIDMNU_ASPECT54 = "5:4"; +VIDMNU_ASPECT169 = "16:9"; +VIDMNU_ASPECT1610 = "16:10"; + +// Network Options +NETMNU_TITLE = "ÐÐСТРОЙКИ СЕТИ"; +NETMNU_LOCALOPTIONS = "Локальные наÑтройки"; +NETMNU_MOVEPREDICTION = "ПредÑказание движениÑ"; +NETMNU_LINESPECIALPREDICTION = "ПредÑказание дейÑтвий на уровне"; +NETMNU_PREDICTIONLERPSCALE = "ПредÑказание маÑштаба лÑрпа"; // ?? +NETMNU_LERPTHRESHOLD = "Порог лÑрпа"; // ?? +NETMNU_HOSTOPTIONS = "ÐаÑтройки хоÑта"; +NETMNU_EXTRATICS = "Дополнительные тики"; +NETMNU_TICBALANCE = "БаланÑировка задержки"; + +// Joystick menu + +JOYMNU_ENABLE = "Включить поддержку джойÑтика"; +JOYMNU_DINPUT = "Включить джойÑтики DirectInput"; +JOYMNU_XINPUT = "Включить джойÑтики XInput"; +JOYMNU_PS2 = "ИÑпользовать адаптеры Playstation 2 напрÑмую"; +JOYMNU_NOCON = "ДжойÑтики не обнаружены"; +JOYMNU_CONFIG = "ÐаÑтроить джойÑтик:"; +JOYMNU_DISABLED1 = "ÐаÑтройка «включить поддержку джойÑтика»"; +JOYMNU_DISABLED2 = "должна быть включена, чтобы выÑвить джойÑтик"; +JOYMNU_INVALID = "ÐедопуÑтимый джойÑтик выбран Ð´Ð»Ñ Ð¼ÐµÐ½ÑŽ"; +JOYMNU_OVRSENS = "ÐžÐ±Ñ‰Ð°Ñ Ñ‡ÑƒÐ²ÑтвительноÑть"; +JOYMNU_AXIS = "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¾Ñей"; +JOYMNU_INVERT = "Инвертировать"; +JOYMNU_DEADZONE = "ÐœÐµÑ€Ñ‚Ð²Ð°Ñ Ð·Ð¾Ð½Ð°"; +JOYMNU_NOAXES = "Ðет наÑтраиваемых оÑей"; + +// Option Values +OPTVAL_OFF = "Откл."; +OPTVAL_ON = "Вкл."; +OPTVAL_AUTO = "Ðвто"; +OPTVAL_MALE = "МужÑкой"; +OPTVAL_FEMALE = "ЖенÑкий"; +OPTVAL_NEUTRAL = "Ðейтральный"; +OPTVAL_OTHER = "Предмет"; +OPTVAL_UPPERLEFT = "Вверху Ñлева"; +OPTVAL_UPPERRIGHT = "Вверху Ñправа"; +OPTVAL_LOWERLEFT = "Внизу Ñлева"; +OPTVAL_LOWERRIGHT = "Внизу Ñправа"; +OPTVAL_TOUCHSCREENLIKE = "Как ÑенÑорный Ñкран"; +OPTVAL_NONE = "Откл."; +OPTVAL_TURNING = "Поворот"; +OPTVAL_LOOKINGUPDOWN = "ВзглÑд вверх/вниз"; +OPTVAL_MOVINGFORWARD = "Движение вперед"; +OPTVAL_STRAFING = "Движение боком"; +OPTVAL_MOVINGUPDOWN = "Движение вверх/вниз"; +OPTVAL_INVERTED = "Инвертировано"; +OPTVAL_NOTINVERTED = "ПрÑмо"; +OPTVAL_ORIGINAL = "Оригинальный"; +OPTVAL_OPTIMIZED = "Оптимизированный"; +OPTVAL_CLASSIC = "КлаÑÑичеÑкий (более быÑтрый)"; +OPTVAL_PRECISE = "Точный"; +OPTVAL_NORMAL = "Обычный"; +OPTVAL_STRETCH = "РаÑÑ‚Ñнутый"; +OPTVAL_CAPPED = "Ограниченный"; +OPTVAL_PARTICLES = "ЧаÑтицы"; +OPTVAL_SPRITES = "Спрайты"; +OPTVAL_SPRITESPARTICLES = "Спрайты и чаÑтицы"; +OPTVAL_MELT = "ТаÑние"; +OPTVAL_BURN = "Жжение"; +OPTVAL_CROSSFADE = "УвÑдание"; +OPTVAL_ONLYMODIFIED = "Только модифицированный"; +OPTVAL_SMOOTH = "Плавно"; +OPTVAL_TRANSLUCENT = "Полупрозрачный"; +OPTVAL_FUZZ = "Шумовой"; +OPTVAL_SHADOW = "Теневой"; +OPTVAL_ITEMS = "Предметы"; +OPTVAL_WEAPONS = "Оружие"; +OPTVAL_BOTH = "Оба"; +OPTVAL_ZDOOM = "ZDoom"; +OPTVAL_STRIFE = "Strife"; +OPTVAL_PLAYER = "Игрок"; +OPTVAL_MAP = "Карта"; +OPTVAL_SCALETO640X400 = "МаÑштабировать до 640x400"; +OPTVAL_PIXELDOUBLE = "Двойные пикÑели"; +OPTVAL_PIXELQUADRUPLE = "Четверные пикÑели"; +OPTVAL_CURRENTWEAPON = "Текущее оружие"; +OPTVAL_AVAILABLEWEAPONS = "ДоÑтупное оружие"; +OPTVAL_ALLWEAPONS = "Ð’Ñе оружие"; +OPTVAL_LEVELMILLISECONDS = "Уровень, миллиÑекунды"; +OPTVAL_LEVELSECONDS = "Уровень, Ñекунды"; +OPTVAL_LEVEL = "Уровень"; +OPTVAL_HUBSECONDS = "Хаб, Ñекунды"; +OPTVAL_HUB = "Хаб"; +OPTVAL_TOTALSECONDS = "Общее, Ñекунды"; +OPTVAL_TOTAL = "Общее"; +OPTVAL_SYSTEMSECONDS = "СиÑтема, Ñекунды"; +OPTVAL_SYSTEM = "СиÑтема"; +OPTVAL_NETGAMESONLY = "Только Ñетевые игры"; +OPTVAL_ALWAYS = "Ð’Ñегда"; +OPTVAL_AMMOIMAGETEXT = "Изобр. и текÑÑ‚"; +OPTVAL_AMMOTEXTIMAGE = "ТекÑÑ‚ и изобр."; +OPTVAL_SCRIPTSONLY = "Только Ñкрипты"; +OPTVAL_NEVER = "Ðикогда"; +OPTVAL_ALL = "Ð’Ñе"; +OPTVAL_ONLYLASTONE = "Только поÑледнее"; +OPTVAL_CUSTOM = "ПользовательÑкие"; +OPTVAL_TRADITIONALDOOM = "Цвета из Doom"; +OPTVAL_TRADITIONALSTRIFE = "Цвета из Strife"; +OPTVAL_TRADITIONALRAVEN = "Цвета из Raven"; +OPTVAL_ONLYWHENFOUND = "ПоÑле обнаружениÑ"; +OPTVAL_ONFOROVERLAYONLY = "Только прозрачный"; +OPTVAL_OVERLAYNORMAL = "Прозрач. + обыч."; +OPTVAL_OVERLAYONLY = "Только прозрачный"; +OPTVAL_NOTFORHUBS = "Кроме хабов"; +OPTVAL_FRONT = "Перед"; +OPTVAL_ANIMATED = "Ðнимированные"; +OPTVAL_ROTATED = "Повернутые"; +OPTVAL_MAPDEFINEDCOLORSONLY = "Только определенные картой цвета"; +OPTVAL_NODOORS = "Кроме дверей"; +OPTVAL_DOUBLE = "Двойной"; +OPTVAL_TRIPLE = "Тройной"; +OPTVAL_QUADRUPLE = "Четверной"; +OPTVAL_ITEMPICKUP = "Подбор"; +OPTVAL_OBITUARIES = "Ðекрологи"; +OPTVAL_CRITICALMESSAGES = "Важные ÑообщениÑ"; +OPTVAL_NEVERFRIENDS = "Ðе Ð´Ð»Ñ Ñоюзников"; +OPTVAL_ONLYMONSTERS = "Ð”Ð»Ñ Ð¼Ð¾Ð½Ñтров"; +OPTVAL_HEXEN = "Hexen"; +OPTVAL_OLD = "Старый"; +OPTVAL_DEFAULT = "По умол."; +OPTVAL_DOOM = "Doom"; +OPTVAL_DOOMSTRICT = "Doom (Ñтрогий)"; +OPTVAL_BOOM = "Boom"; +OPTVAL_BOOMSTRICT = "Boom (Ñтрогий)"; +OPTVAL_MBF = "MBF"; +OPTVAL_ZDOOM2063 = "ZDoom 2.0.63"; +OPTVAL_4000HZ = "4000 Гц"; +OPTVAL_8000HZ = "8000 Гц"; +OPTVAL_11025HZ = "11025 Гц"; +OPTVAL_22050HZ = "22050 Гц"; +OPTVAL_32000HZ = "32000 Гц"; +OPTVAL_44100HZ = "44100 Гц"; +OPTVAL_48000HZ = "48000 Гц"; +OPTVAL_64SAMPLES = "64 Ñемпла"; +OPTVAL_128SAMPLES = "128 Ñемплов"; +OPTVAL_256SAMPLES = "256 Ñемплов"; +OPTVAL_512SAMPLES = "512 Ñемплов"; +OPTVAL_1024SAMPLES = "1024 Ñемпла"; +OPTVAL_2048SAMPLES = "2048 Ñемплов"; +OPTVAL_4096SAMPLES = "4096 Ñемплов"; +OPTVAL_UNLIMITED = "Без ограничений"; +OPTVAL_256K = "256K"; +OPTVAL_512K = "512K"; +OPTVAL_768K = "768K"; +OPTVAL_1024K = "1024K"; +OPTVAL_MAMEOPL2 = "MAME OPL2"; +OPTVAL_MAMEOPN2 = "MAME YM2612"; +OPTVAL_DOSBOXOPL3 = "DOSBox OPL3"; +OPTVAL_JAVAOPL3 = "Java OPL3"; +OPTVAL_NUKEDOPL3 = "Nuked OPL3"; +OPTVAL_NUKEDOPL3174 = "Nuked OPL3 v1.7.4"; +OPTVAL_NUKEDOPN2 = "Nuked OPN2"; +OPTVAL_GENSOPN2 = "GENS YM2612"; +OPTVAL_SOUNDSYSTEM = "ÐудиоÑиÑтема"; +OPTVAL_FOO_DUMB = "foo_dumb"; +OPTVAL_ALIASING = "ÐлиаÑинг"; +OPTVAL_LINEAR = "Линейный/ое/аÑ"; +OPTVAL_NEAREST = "Ближайший"; +OPTVAL_PCF_LOW = "PCF (Ðизкий)"; +OPTVAL_PCF_MEDIUM = "PCF (Средний)"; +OPTVAL_PCF_HIGH = "PCF (Ð’Ñ‹Ñокий)"; +OPTVAL_CUBIC = "КубичеÑкий"; +OPTVAL_BLEP = "Band-limited step"; // fix +OPTVAL_LINEARSLOW = "Линейный (Медленнее)"; +OPTVAL_BLAM = "Band-limited linear"; +OPTVAL_CUBICSLOW = "КубичеÑкий (Медленнее)"; +OPTVAL_SINC = "Вход"; +OPTVAL_NOTEONOFFONLY = "Note on/off only"; +OPTVAL_FULLRAMPING = "Full ramping"; +OPTVAL_ALLUNACKNOWLEDGED = "All unacknowledged"; +OPTVAL_ERRORS = "Ошибки"; +OPTVAL_WARNINGS = "ПредупреждениÑ"; +OPTVAL_NOTIFICATIONS = "УведомлениÑ"; +OPTVAL_EVERYTHING = "Ð’Ñе"; +OPTVAL_FULLSCREENONLY = "Ð’ полном Ñкране"; +OPTVAL_GL = "OpenGL"; +OPTVAL_D3D = "Direct3D"; +OPTVAL_SDL = "SDL"; +OPTVAL_COCOA = "Cocoa"; +OPTVAL_HWPOLY = "OpenGL аппаратный"; +OPTVAL_SWDOOM = "Программный"; +OPTVAL_SWDOOMTC = "Полноцветный програмный"; +OPTVAL_SWPOLY = "Полирендер"; +OPTVAL_SWPOLYTC = "Полноцветный полирендер"; +OPTVAL_DEDICATED = "Ð’Ñ‹ÑÐ¾ÐºÐ°Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñть"; +OPTVAL_INTEGRATED = "ЭнергоÑбережение"; +OPTVAL_VANILLA = "Ванильный"; +OPTVAL_VTFZDOOM = "ZDoom (форÑирована)"; +OPTVAL_VTFVANILLA = "Vanilla (форÑирована)"; +OPTVAL_VTAZDOOM = "Auto (предпочитать ZDoom)"; +OPTVAL_VTAVANILLA = "Auto (предпочитать Preferred)"; +OPTVAL_SCALENEAREST = "МаÑштаб. (Nearest)"; +OPTVAL_SCALELINEAR = "МаÑштаб. (Linear)"; +OPTVAL_LETTERBOX = "Формат Letterbox"; + +// Colors +C_BRICK = "\caКирпичный"; +C_TAN = "\cbБежевый"; +C_GRAY = "\ccСерый"; +C_GREEN = "\cdЗеленый"; +C_BROWN = "\ceКоричневый"; +C_GOLD = "\cfЗолотой"; +C_RED = "\cgКраÑный"; +C_BLUE = "\chСиний"; +C_ORANGE = "\ciОранжевый"; +C_WHITE = "\cjБелый"; +C_YELLOW = "\ckЖелтый"; +C_DEFAULT = "\clПо умол."; +C_BLACK = "\cmЧерный"; +C_LIGHTBLUE = "\cnГолубой"; +C_CREAM = "\coКремовый"; +C_OLIVE = "\cpОливковый"; +C_DARKGREEN = "\cqТемно-зеленый"; +C_DARKRED = "\crТемно-краÑный"; +C_DARKBROWN = "\csТемно-коричневый"; +C_PURPLE = "\ctФиолетовый"; +C_DARKGRAY = "\cuТемно-Ñерый"; +C_CYAN = "\cvСине-зеленый"; +C_ICE = "\cwЛедÑной"; +C_FIRE = "\cxОгненный"; +C_SAPPHIRE = "\cyСапфировый"; +C_TEAL = "\czМорÑкой"; +// Option Strings +OPTSTR_SIMPLEARROW = "Стрелка"; +OPTSTR_HERETIC = "Heretic"; +OPTSTR_CHEX = "Chex"; +OPTSTR_SYSTEMCURSOR = "СиÑтемный курÑор"; +OPTSTR_NOSOUND = "Без звука"; +OPTSTR_AUTO = "Ðвто"; +OPTSTR_MONO = "Моно"; +OPTSTR_STEREO = "Стерео"; +OPTSTR_PROLOGIC = "Dolby Prologic Декодер"; +OPTSTR_QUAD = "ЧетырехмеÑтный"; +OPTSTR_SURROUND = "5 динамиков"; +OPTSTR_5POINT1 = "Динамики 5.1"; +OPTSTR_7POINT1 = "Динамики 7.1"; +OPTSTR_NOINTERPOLATION = "Без интерполÑции"; +OPTSTR_SPLINE = "Сплайн"; +OPTSTR_OPENAL = "OpenAL"; + +NOTSET = "Ðе задан"; +SAFEMESSAGE = "Ð’Ñ‹ уверены?"; +MNU_COLORPICKER = "Выбор цветов"; + +WI_FINISHED = "завершен"; +WI_ENTERING = "ЗагружаетÑÑ ÑƒÑ€Ð¾Ð²ÐµÐ½ÑŒ:"; + +AM_MONSTERS = "МонÑтры:"; +AM_SECRETS = "Тайники:"; +AM_ITEMS = "Предметы:"; + +// Bloodbath announcer + +BBA_BONED = "%k boned %o like a fish"; +BBA_CASTRA = "%k castrated %o"; +BBA_CREAMED = "%k creamed %o"; +BBA_DECIMAT = "%k decimated %o"; +BBA_DESTRO = "%k destroyed %o"; +BBA_DICED = "%k diced %o"; +BBA_DISEMBO = "%k disembowled %o"; +BBA_FLATTE = "%k flattened %o"; +BBA_JUSTICE = "%k gave %o Anal Justice"; +BBA_MADNESS = "%k gave AnAl MaDnEsS to %o"; +BBA_KILLED = "%k killed %o"; +BBA_MINCMEAT = "%k made mincemeat out of %o"; +BBA_MASSACR = "%k massacred %o"; +BBA_MUTILA = "%k mutilated %o"; +BBA_REAMED = "%k reamed %o"; +BBA_RIPPED = "%k ripped %o a new orifice"; +BBA_SLAUGHT = "%k slaughtered %o"; +BBA_SMASHED = "%k smashed %o"; +BBA_SODOMIZ = "%k sodomized %o"; +BBA_SPLATT = "%k splattered %o"; +BBA_SQUASH = "%k squashed %o"; +BBA_THROTTL = "%k throttled %o"; +BBA_WASTED = "%k wasted %o"; +BBA_BODYBAG = "%k body bagged %o"; +BBA_HELL = "%k sent %o to Hell"; +BBA_TOAST = "%k toasted %o"; +BBA_SNUFF = "%k snuffed %o"; +BBA_HOSED = "%k hosed %o"; +BBA_SPRAYED = "%k sprayed %o"; +BBA_DOGMEAT = "%k made dog meat out of %o"; +BBA_BEATEN = "%k beat %o like a cur"; + +BBA_EXCREMENT = "%o is excrement"; +BBA_HAMBURGER = "%o is hamburger"; +BBA_SCROTUM = "%o suffered scrotum separation"; +BBA_POPULATION = "%o volunteered for population control"; +BBA_SUICIDE = "%o has suicided"; +BBA_DARWIN = "%o received the Darwin Award"; + +// Chex Quest Strings +CHUSTR_E1M1 = "E1M1: Зона приземлениÑ"; +CHUSTR_E1M2 = "E1M2: Хранилище"; +CHUSTR_E1M3 = "E1M3: ЛабораториÑ"; +CHUSTR_E1M4 = "E1M4: Дендрарий"; +CHUSTR_E1M5 = "E1M5: Каверны Базоика"; + +CE1TEXT = + "МиÑÑÐ¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð°.\n" + "\n" + "Готовы к Ñледующей миÑÑии?\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "Ðажмите ESC Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ..."; + +CE2TEXT = "Ты Ñделал Ñто!"; +CE3TEXT = "ПревоÑÑ…Ð¾Ð´Ð½Ð°Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°!"; +CE4TEXT = "ФантаÑтичеÑки."; + +CLOADNET = "you can't do load while in a net quest!\n\npress a key."; +$ifgame(chex) QSPROMPT = "quicksave over your quest named\n\n'%s'?\n\npress y or n."; +$ifgame(chex) QLOADNET = "you can't quickload during a netquest!\n\npress a key."; +$ifgame(chex) QLPROMPT = "do you want to quickload the quest named\n\n'%s'?\n\npress y or n."; +CNEWGAME = "you can't start a new quest\nwhile in a network quest.\n\npress a key."; + +CNIGHTMARE = "Careful, this will be tough.\nDo you wish to continue?\n\npress y or n."; + +CSWSTRING = "Ñто — Chex(R) Quest. look for\n\nfuture levels at www.chexquest.com.\n\npress a key."; // fix + +$ifgame(chex) NETEND = "Ðевозможно прервать Ñетевой квеÑÑ‚!\n\nÐажмите любую клавишу."; +$ifgame(chex) ENDGAME = "Ð’Ñ‹ точно хотите завершить квеÑÑ‚?\n\nÐажмите Y или N."; + +GOTCHEXARMOR = "Получена Chex(R)-бронÑ."; +GOTSUPERCHEXARMOR = "Получена Chex(R)-ÑверхбронÑ!"; +GOTWATER = "Получен Ñтакан воды."; +GOTREPELLENT = "Получен репеллент против Ñлизи."; +GOTBREAKFAST = "Супер-завтрак!"; +GOTCBLUEKEY = "Получен Ñиний ключ."; +GOTCYELLOWKEY = "Получен желтый ключ."; +GOTCREDKEY = "Получен краÑный ключ."; +GOTFRUIT = "ВзÑта тарелка Ñ Ñ„Ñ€ÑƒÐºÑ‚Ð°Ð¼Ð¸."; +GOTVEGETABLESNEED = "ВзÑты овощи при крайней необходимоÑти!"; +GOTVEGETABLES = "ВзÑта тарелка Ñ Ð¾Ð²Ð¾Ñ‰Ð°Ð¼Ð¸."; +GOTSLIMESUIT = "Ðайден противоÑлизневый коÑтюм"; +GOTCHEXMAP = "Ðайдена ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð° меÑтноÑти"; + +GOTZORCHRECHARGE = "Picked up a mini zorch recharge."; +GOTMINIZORCHPACK = "Picked up a mini zorch pack."; +GOTPROPULSORRECHARGE = "Picked up a zorch propulsor recharge."; +GOTPROPULSORPACK = "Picked up a zorch propulsor pack."; +GOTPHASINGZORCHERRECHARGE = "Picked up a phasing zorcher recharge"; +GOTPHASINGZORCHERPACK = "Picked up a phasing zorcher pack."; +GOTLARGEZORCHERRECHARGE = "Picked up a large zorcher recharge."; +GOTLARGEZORCHERPACK = "Picked up a large zorcher pack."; +GOTZORCHPACK = "Picked up a Zorchpak!"; + +GOTLAZDEVICE = "You got the LAZ Device! Woot!"; +GOTRAPIDZORCHER = "You got the Rapid Zorcher!"; +GOTSUPERBOOTSPORK = "You got the Super Bootspork!"; +GOTZORCHPROPULSOR = "You got the Zorch Propulsor!"; +GOTPHASINGZORCHER = "You got the Phasing Zorcher!"; +GOTLARGEZORCHER = "You got the Large Zorcher!"; +GOTSUPERLARGEZORCHER = "You got the Mega Zorcher!"; +GOTMINIZORCHER = "Picked up a Mini Zorcher."; + +$ifgame(chex) STSTR_DQDON = "Invincible Mode ON"; +$ifgame(chex) STSTR_DQDOFF = "Invincible Mode OFF"; +$ifgame(chex) STSTR_FAADDED = "Zorch Added"; +$ifgame(chex) STSTR_KFAADDED = "Super Zorch Added"; +$ifgame(chex) STSTR_CHOPPERS = "... Eat Chex(R)!"; + +OB_COMMONUS = "%o was slimed by a flemoid."; +OB_BIPEDICUS = "%o was slimed by a bipedicus."; +OB_BIPEDICUS2 = "%o was slimed by an armored bipedicus."; +OB_CYCLOPTIS = "%o was slimed by a cycloptis."; +OB_FLEMBRANE = "%o was defeated by the Flembrane."; + +OB_MPSPOON = "%o was spoon fed by %k."; +OB_MPBOOTSPORK = "%o was thoroughly mixed with %k bootspork."; +OB_MPZORCH = "%o was zorched by %k."; +OB_MPMEGAZORCH = "%o was hit by %k mega-zorcher."; +OB_MPRAPIDZORCH = "%o was rapid zorched by %k."; +OB_MPPROPULSOR = "%o was zorched by %k propulsor."; +OB_MPP_SPLASH = "%o was hit by %k propulsor."; +OB_MPPHASEZORCH = "%o was phase zorched by %k."; +OB_MPLAZ_BOOM = "%o fell prey to %k LAZ device."; +OB_MPLAZ_SPLASH = "%o was lazzed by %k."; + +// GZDoom exclusive: + +DSPLYMNU_GLOPT = "Рендерер OpenGL"; +DSPLYMNU_SWOPT = "Программный рендерер"; +DSPLYMNU_GAMMA = "Гамма-коррекциÑ"; +DSPLYMNU_CONTRAST = "КонтраÑÑ‚"; +DSPLYMNU_SATURATION = "ÐаÑыщенноÑть"; +DSPLYMNU_HWGAMMA = "ÐÐ¿Ð¿Ð°Ñ€Ð°Ñ‚Ð½Ð°Ñ Ð³Ð°Ð¼Ð¼Ð°"; + +// OpenGL Options +GLMNU_TITLE = "ÐÐСТРОЙКИ OPENGL"; +GLMNU_DYNLIGHT = "ДинамичеÑкое оÑвещение"; +GLMNU_TEXOPT = "ÐаÑтройки текÑтур"; +GLMNU_PREFS = "ПредпочтениÑ"; + +// Texture Options +GLTEXMNU_TITLE = "ÐÐСТРОЙКИ ТЕКСТУР"; +GLTEXMNU_TEXENABLED = "Вклюить текÑтуры"; +GLTEXMNU_TEXFILTER = "Ð¤Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтур"; +GLTEXMNU_ANISOTROPIC = "ÐÐ½Ð¸Ð·Ð¾Ñ‚Ñ€Ð¾Ð¿Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ"; +GLTEXMNU_TEXFORMAT = "Формат текÑтур"; +GLTEXMNU_ENABLEHIRES = "ТекÑтуры Ñ Ð²Ñ‹Ñоким разрешением"; +GLTEXMNU_HQRESIZE = "МаÑштабирование текÑтур"; +GLTEXMNU_HQRESIZEMULT = "Множитель маÑштабированиÑ"; +GLTEXMNU_HQRESIZEWARN = "Потребует в %d раз больше видеопамÑти"; +GLTEXMNU_RESIZETEX = "МаÑштабирование текÑтур"; +GLTEXMNU_RESIZESPR = "МаÑштабирование Ñпрайтов"; +GLTEXMNU_RESIZEFNT = "МаÑштабирование шрифтов"; +GLTEXMNU_PRECACHETEX = "КÑшировать GL-текÑтур"; +GLTEXMNU_TRIMSPREDGE = "Обрезание краев Ñпрайтов"; +GLTEXMNU_SORTDRAWLIST = "Сортировать ÑпиÑки текÑтур"; + +// Dynamic Light Options +GLLIGHTMNU_TITLE = "ДИÐÐМИЧЕСКОЕ ОСВЕЩЕÐИЕ"; +GLLIGHTMNU_LIGHTSENABLED = "ДинамичеÑкое оÑвещение (OpenGL)"; +GLLIGHTMNU_LIGHTDEFS = "Включить Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñвета"; +GLLIGHTMNU_CLIPLIGHTS = "Обрезать Ñвет"; +GLLIGHTMNU_LIGHTSPRITES = "ОÑвещение Ñпрайтов"; +GLLIGHTMNU_LIGHTPARTICLES = "ОÑвещение чаÑтиц"; +GLLIGHTMNU_LIGHTSHADOWMAP = "Свет на теневых картах"; +GLLIGHTMNU_LIGHTSHADOWMAPQUALITY = "КачеÑтво теневых карт"; +GLLIGHTMNU_LIGHTSHADOWMAPFILTER = "Фильтр теневых карт"; + +// OpenGL Preferences +GLPREFMNU_TITLE = "ÐÐСТРОЙКИ OPENGL"; +GLPREFMNU_SECLIGHTMODE = "Режим оÑÐ²ÐµÑ‰ÐµÐ½Ð¸Ñ Ñекторов"; +GLPREFMNU_FOGMODE = "Режим тумана"; +GLPREFMNU_FOGFORCEFULLBRIGHT = "Туман увеличивает ÑркоÑть"; +GLPREFMNU_WPNLIGHTSTR = "ИнтенÑивноÑть вÑпышек оружиÑ"; +GLPREFMNU_ENVIRONMENTMAPMIRROR = "Карта Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð½Ð° зеркалах"; +GLPREFMNU_ENV = "Улучшенный режим ночного видениÑ"; +GLPREFMNU_ENVSTEALTH = "ПÐÐ’ показывает Ñкрытых монÑтров"; +GLPREFMNU_SPRBRIGHTFOG = "ÐŸÐ¾Ð»Ð½Ð°Ñ ÑркоÑть в тумане"; +GLPREFMNU_SPRCLIP = "ÐаÑтроить обрезку Ñпрайтов"; +GLPREFMNU_SPRBLEND = "Размытие краев Ñпрайтов"; +GLPREFMNU_FUZZSTYLE = "Тип шума"; +GLPREFMNU_SPRBILLBOARD = "Поворот Ñпрайтов"; +GLPREFMNU_SPRBILLFACECAMERA = "Спрайты направлены к камере"; +GLPREFMNU_PARTICLESTYLE = "Тип чаÑтиц"; +GLPREFMNU_AMBLIGHT = "Уровень раÑÑеÑннего Ñвета"; +GLPREFMNU_RENDERQUALITY = "КачеÑтво рендеринга"; +GLPREFMNU_MENUBLUR = "Размытие фона меню"; +GLPREFMNU_VRMODE = "VR режим"; +GLPREFMNU_VRQUADSTEREO = "Quad Stereo"; +GLPREFMNU_MULTISAMPLE = "МультиÑÑмплинг"; +GLPREFMNU_TONEMAP = "Режим тоун-мÑппинга"; +GLPREFMNU_BLOOM = "Режим блум"; +GLPREFMNU_LENS = "ИÑкажение линзы"; +GLPREFMNU_SSAO = "КачеÑтво Ð·Ð°Ñ‚ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾ÐºÑ€ÑƒÐ¶Ð°ÑŽÑ‰ÐµÐ¹ Ñреды"; +GLPREFMNU_SSAO_PORTALS = "КоличеÑтво порталов Ð´Ð»Ñ Ð—Ð°Ñ‚. Окр. Среды"; +GLPREFMNU_FXAA = "КачеÑтво FXAA"; +GLPREFMNU_DITHER = "Вывод дизеринга"; +GLPREFMNU_PALTONEMAPORDER = "ПорÑдок палитры тоун-мÑпа"; +GLPREFMNU_PALTONEMAPPOWER = "ЭкÑпонента палитры тоун-мÑпа"; +GLPREFMNU_SWLMBANDED = "Banded SW Lightmode"; // fix +GLPREFMNU_VRIPD = "РаÑÑтоÑние Между Глазами"; +GLPREFMNU_VRSCREENDIST = "РаÑÑтоÑние От Экрана"; + +// Option Values +OPTVAL_SMART = "Умный"; +OPTVAL_SMARTER = "Умнее"; +OPTVAL_INFRAREDONLY = "Только инфракраÑный"; +OPTVAL_INFRAREDANDTORCH = "ИнфракраÑный и факел"; +OPTVAL_ANYFIXEDCOLORMAP = "Ð›ÑŽÐ±Ð°Ñ Ñ„Ð¸ÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ†Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð°"; +OPTVAL_NONENEARESTMIPMAP = "Ðет (ближайший мипмап)"; +OPTVAL_NONELINEARMIPMAP = "Ðет (линейный мипмап)"; +OPTVAL_NONETRILINEAR = "Ðет (трехлинейнаÑ)"; +OPTVAL_BILINEAR = "БилинейнаÑ"; +OPTVAL_TRILINEAR = "ТрехлинейнаÑ"; +OPTVAL_RGBA8 = "RGBA8"; +OPTVAL_RGB5A1 = "RGB5_A1"; +OPTVAL_RGBA4 = "RGBA4"; +OPTVAL_RGBA2 = "RGBA2"; +OPTVAL_COMPRRGBA = "COMPR_RGBA"; +OPTVAL_S3TCDXT1 = "S3TC_DXT1"; +OPTVAL_S3TCDXT3 = "S3TC_DXT3"; +OPTVAL_S3TCDXT5 = "S3TC_DXT5"; +OPTVAL_2X = "2x"; +OPTVAL_4X = "4x"; +OPTVAL_8X = "8x"; +OPTVAL_16X = "16x"; +OPTVAL_32X = "32x"; +OPTVAL_USEASPALETTE = "ИÑпользовать как палитру"; +OPTVAL_BLEND = "Смешать"; +OPTVAL_STANDARD = "Стандартный"; +OPTVAL_BRIGHT = "Яркий"; +OPTVAL_DARK = "Темный"; +OPTVAL_LEGACY = "Legacy"; +OPTVAL_SOFTWARE = "Программный"; +OPTVAL_SPEED = "СкороÑть"; +OPTVAL_QUALITY = "КачеÑтво"; +OPTVAL_OPTIMAL = "Оптимальный"; +OPTVAL_60 = "60"; +OPTVAL_70 = "70"; +OPTVAL_72 = "72"; +OPTVAL_75 = "75"; +OPTVAL_85 = "85"; +OPTVAL_100 = "100"; +OPTVAL_YAXIS = "По горизонтали"; +OPTVAL_XYAXIS = "По обеим оÑÑм"; +OPTVAL_SQUARE = "Квадратный"; +OPTVAL_ROUND = "Круглый"; +OPTVAL_SCALENX = "ScaleNx"; +OPTVAL_NORMALNX = "NormalNx"; +OPTVAL_HQNX = "hqNx"; +OPTVAL_HQNXMMX = "hqNx MMX"; +OPTVAL_NXBRZ = "xBRZ"; +OPTVAL_OLD_NXBRZ = "Старый xBRZ"; +OPTVAL_RADIAL = "Радиальный"; +OPTVAL_PIXELFUZZ = "ПикÑельный шум"; +OPTVAL_SMOOTHFUZZ = "Гладкий шум"; +OPTVAL_SWIRLYFUZZ = "КружащийÑÑ ÑˆÑƒÐ¼"; +OPTVAL_TRANSLUCENTFUZZ = "Прозрачный шум"; +OPTVAL_NOISE = "Шум"; // fix? +OPTVAL_SMOOTHNOISE = "МÑгкий шум"; // fix? +OPTVAL_JAGGEDFUZZ = "Зазубренный шум"; +OPTVAL_GREENMAGENTA = "Зеленый/Маджента"; +OPTVAL_REDCYAN = "КраÑный/Голубой"; +OPTVAL_AMBERBLUE = "Янтарный/Синий"; +OPTVAL_LEFTEYE = "Левый глаз"; +OPTVAL_RIGHTEYE = "Правый глаз"; +OPTVAL_SBSFULL = "Бок-о-бок, полно"; +OPTVAL_SBSNARROW = "Бок-о-бок, узко"; +OPTVAL_TOPBOTTOM = "Вверх/вниз"; +OPTVAL_ROWINTERLEAVED = "Row Interleaved"; // fix +OPTVAL_COLUMNINTERLEAVED = "Column Interleaved"; // fix +OPTVAL_CHECKERBOARD = "Ð¨Ð°Ñ…Ð¼Ð°Ñ‚Ð½Ð°Ñ Ð´Ð¾Ñка"; +OPTVAL_QUADBUFFERED = "Quad-buffered"; // fix +OPTVAL_UNCHARTED2 = "Uncharted 2"; +OPTVAL_HEJLDAWSON = "Хейл ДоуÑон"; +OPTVAL_REINHARD = "Рейнхард"; +OPTVAL_PALETTE = "Doom палитра"; // Чтобы было понÑтнее +OPTVAL_LOW = "Ðизкий"; +OPTVAL_MEDIUM = "Средний"; +OPTVAL_HIGH = "Ð’Ñ‹Ñокий"; +OPTVAL_EXTREME = "Крайний"; +OPTVAL_OBVERSEFIRST = "Лицевой"; +OPTVAL_REVERSEFIRST = "Обратный"; + +DSPLYMNU_TCOPT = "ПолноцветноÑть"; + +TCMNU_TITLE = "ÐÐСТРОЙКИ ПОЛÐОЦВЕТÐОСТИ"; + +TCMNU_TRUECOLOR = "Полноцветный вывод"; +TCMNU_MINFILTER = "Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸ уменьшении"; +TCMNU_MAGFILTER = "Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸ увеличении"; +TCMNU_MIPMAP = "ИÑпользовать мип-маппинг"; +TCMNU_DYNLIGHTS = "ДинамичеÑкое оÑвещение (программное)"; + +// SVE strings: + +TAG_TALISMANRED = "КраÑный талиÑман"; +TAG_TALISMANGREEN = "Зеленый талиÑман"; +TAG_TALISMANBLUE = "Синий талиÑман"; +MSG_TALISMANRED = "You have a feeling that it wasn't to be touched..."; +MSG_TALISMANGREEN = "Whatever it is, it doesn't belong in this world..."; +MSG_TALISMANBLUE = "It must do something..."; +MSG_TALISMANPOWER = "You have super strength!"; + +GZDRT_LANGUAGE = "Язык"; diff --git a/wadsrc/static/mapinfo/chex.txt b/wadsrc/static/mapinfo/chex.txt index 05ac7adf56..2c3f25318f 100644 --- a/wadsrc/static/mapinfo/chex.txt +++ b/wadsrc/static/mapinfo/chex.txt @@ -65,8 +65,8 @@ gameinfo defaultendsequence = "Inter_Pic1" maparrow = "maparrows/arrow.txt", "maparrows/ddtarrow.txt" statscreen_mapnamefont = "BigFont" - statscreen_finishedpatch = "WIF" - statscreen_enteringpatch = "WIENTER" + statscreen_finishedfont = "BigFont", "green" + statscreen_enteringfont = "BigFont", "green" statscreen_coop = "CoopStatusScreen" statscreen_dm = "DeathmatchStatusScreen" statscreen_single = "DoomStatusScreen" diff --git a/wadsrc/static/mapinfo/doomcommon.txt b/wadsrc/static/mapinfo/doomcommon.txt index 95bd5ab4cf..212dd0dab2 100644 --- a/wadsrc/static/mapinfo/doomcommon.txt +++ b/wadsrc/static/mapinfo/doomcommon.txt @@ -65,8 +65,8 @@ gameinfo defaultendsequence = "Inter_Cast" maparrow = "maparrows/arrow.txt", "maparrows/ddtarrow.txt" statscreen_mapnamefont = "BigFont" - statscreen_finishedpatch = "WIF" - statscreen_enteringpatch = "WIENTER" + statscreen_finishedfont = "BigFont", "red" + statscreen_enteringfont = "BigFont", "red" statscreen_coop = "CoopStatusScreen" statscreen_dm = "DeathmatchStatusScreen" statscreen_single = "DoomStatusScreen" diff --git a/wadsrc/static/mapinfo/mindefaults.txt b/wadsrc/static/mapinfo/mindefaults.txt index 6df82ab82d..80d5623f10 100644 --- a/wadsrc/static/mapinfo/mindefaults.txt +++ b/wadsrc/static/mapinfo/mindefaults.txt @@ -55,8 +55,8 @@ gameinfo defaultendsequence = "Inter_Cast" maparrow = "maparrows/arrow.txt", "maparrows/ddtarrow.txt" statscreen_mapnamefont = "BigFont" - statscreen_finishedpatch = "WIF" - statscreen_enteringpatch = "WIENTER" + statscreen_finishedfont = "BigFont" + statscreen_enteringfont = "BigFont" messageboxclass = "MessageBoxMenu" } diff --git a/wadsrc/static/mapinfo/strife.txt b/wadsrc/static/mapinfo/strife.txt index ec59f1c42d..f80ff3086b 100644 --- a/wadsrc/static/mapinfo/strife.txt +++ b/wadsrc/static/mapinfo/strife.txt @@ -594,7 +594,7 @@ gamedefaults noinfighting } -map MAP01 "AREA 1: sanctuary" +map MAP01 LOOKUP "TXT_STRIFE_MAP01" { next = "MAP02" sky1 = "SKYMNT02" @@ -602,7 +602,7 @@ map MAP01 "AREA 1: sanctuary" cluster = 1 } -map MAP02 "AREA 2: town" +map MAP02 LOOKUP "TXT_STRIFE_MAP02" { next = "MAP03" sky1 = "SKYMNT02" @@ -610,7 +610,7 @@ map MAP02 "AREA 2: town" cluster = 1 } -map MAP03 "AREA 3: front base" +map MAP03 LOOKUP "TXT_STRIFE_MAP03" { next = "MAP04" sky1 = "SKYMNT02" @@ -621,7 +621,7 @@ map MAP03 "AREA 3: front base" slideshow = "Inter_Strife_MAP03" } -map MAP04 "AREA 4: power station" +map MAP04 LOOKUP "TXT_STRIFE_MAP04" { next = "MAP05" sky1 = "SKYMNT02" @@ -629,7 +629,7 @@ map MAP04 "AREA 4: power station" cluster = 1 } -map MAP05 "AREA 5: prison" +map MAP05 LOOKUP "TXT_STRIFE_MAP05" { next = "MAP06" sky1 = "SKYMNT02" @@ -637,7 +637,7 @@ map MAP05 "AREA 5: prison" cluster = 1 } -map MAP06 "AREA 6: sewers" +map MAP06 LOOKUP "TXT_STRIFE_MAP06" { next = "MAP07" sky1 = "SKYMNT02" @@ -645,7 +645,7 @@ map MAP06 "AREA 6: sewers" cluster = 1 } -map MAP07 "AREA 7: castle" +map MAP07 LOOKUP "TXT_STRIFE_MAP07" { next = "MAP08" sky1 = "SKYMNT02" @@ -654,7 +654,7 @@ map MAP07 "AREA 7: castle" redirect = "Sigil", "map10" } -map MAP08 "AREA 8: Audience Chamber" +map MAP08 LOOKUP "TXT_STRIFE_MAP08" { next = "MAP09" sky1 = "SKYMNT02" @@ -662,7 +662,7 @@ map MAP08 "AREA 8: Audience Chamber" cluster = 1 } -map MAP09 "AREA 9: Castle: Programmer's Keep" +map MAP09 LOOKUP "TXT_STRIFE_MAP09" { next = "MAP10" sky1 = "SKYMNT02" @@ -685,7 +685,7 @@ map MAP09 "AREA 9: Castle: Programmer's Keep" // that idea apparently got scrapped as the game developed. } -map MAP10 "AREA 10: New Front Base" +map MAP10 LOOKUP "TXT_STRIFE_MAP10" { next = "MAP11" sky1 = "SKYMNT01" @@ -694,7 +694,7 @@ map MAP10 "AREA 10: New Front Base" slideshow = "Inter_Strife_MAP10" } -map MAP11 "AREA 11: Borderlands" +map MAP11 LOOKUP "TXT_STRIFE_MAP11" { next = "MAP12" sky1 = "SKYMNT01" @@ -702,7 +702,7 @@ map MAP11 "AREA 11: Borderlands" cluster = 1 } -map MAP12 "AREA 12: the temple of the oracle" +map MAP12 LOOKUP "TXT_STRIFE_MAP12" { next = "MAP13" sky1 = "SKYMNT01" @@ -710,7 +710,7 @@ map MAP12 "AREA 12: the temple of the oracle" cluster = 1 } -map MAP13 "AREA 13: Catacombs" +map MAP13 LOOKUP "TXT_STRIFE_MAP13" { next = "MAP14" sky1 = "SKYMNT01" @@ -718,7 +718,7 @@ map MAP13 "AREA 13: Catacombs" cluster = 1 } -map MAP14 "AREA 14: mines" +map MAP14 LOOKUP "TXT_STRIFE_MAP14" { next = "MAP15" sky1 = "SKYMNT01" @@ -726,7 +726,7 @@ map MAP14 "AREA 14: mines" cluster = 1 } -map MAP15 "AREA 15: Fortress: Administration" +map MAP15 LOOKUP "TXT_STRIFE_MAP15" { next = "MAP16" sky1 = "SKYMNT01" @@ -734,7 +734,7 @@ map MAP15 "AREA 15: Fortress: Administration" cluster = 1 } -map MAP16 "AREA 16: Fortress: Bishop's Tower" +map MAP16 LOOKUP "TXT_STRIFE_MAP16" { next = "MAP17" sky1 = "SKYMNT01" @@ -742,7 +742,7 @@ map MAP16 "AREA 16: Fortress: Bishop's Tower" cluster = 1 } -map MAP17 "AREA 17: Fortress: The Bailey" +map MAP17 LOOKUP "TXT_STRIFE_MAP17" { next = "MAP18" sky1 = "SKYMNT01" @@ -750,7 +750,7 @@ map MAP17 "AREA 17: Fortress: The Bailey" cluster = 1 } -map MAP18 "AREA 18: Fortress: Stores" +map MAP18 LOOKUP "TXT_STRIFE_MAP18" { next = "MAP19" sky1 = "SKYMNT01" @@ -758,7 +758,7 @@ map MAP18 "AREA 18: Fortress: Stores" cluster = 1 } -map MAP19 "AREA 19: Fortress: Security Complex" +map MAP19 LOOKUP "TXT_STRIFE_MAP19" { next = "MAP20" sky1 = "SKYMNT01" @@ -766,7 +766,7 @@ map MAP19 "AREA 19: Fortress: Security Complex" cluster = 1 } -map MAP20 "AREA 20: Factory: Receiving" +map MAP20 LOOKUP "TXT_STRIFE_MAP20" { next = "MAP21" sky1 = "SKYMNT01" @@ -774,7 +774,7 @@ map MAP20 "AREA 20: Factory: Receiving" cluster = 1 } -map MAP21 "AREA 21: Factory: Manufacturing" +map MAP21 LOOKUP "TXT_STRIFE_MAP21" { next = "MAP22" sky1 = "SKYMNT01" @@ -782,7 +782,7 @@ map MAP21 "AREA 21: Factory: Manufacturing" cluster = 1 } -map MAP22 "AREA 22: Factory: Forge" +map MAP22 LOOKUP "TXT_STRIFE_MAP22" { next = "MAP23" sky1 = "SKYMNT01" @@ -790,7 +790,7 @@ map MAP22 "AREA 22: Factory: Forge" cluster = 1 } -map MAP23 "AREA 23: Order Commons" +map MAP23 LOOKUP "TXT_STRIFE_MAP23" { next = "MAP24" sky1 = "SKYMNT01" @@ -798,7 +798,7 @@ map MAP23 "AREA 23: Order Commons" cluster = 1 } -map MAP24 "AREA 24: Factory: Conversion Chapel" +map MAP24 LOOKUP "TXT_STRIFE_MAP24" { next = "MAP25" sky1 = "SKYMNT01" @@ -806,7 +806,7 @@ map MAP24 "AREA 24: Factory: Conversion Chapel" cluster = 1 } -map MAP25 "AREA 25: Catacombs: Ruined Temple" +map MAP25 LOOKUP "TXT_STRIFE_MAP25" { next = "MAP26" sky1 = "SKYMNT01" @@ -814,7 +814,7 @@ map MAP25 "AREA 25: Catacombs: Ruined Temple" cluster = 1 } -map MAP26 "AREA 26: proving grounds" +map MAP26 LOOKUP "TXT_STRIFE_MAP26" { next = "MAP27" sky1 = "SKYMNT01" @@ -822,7 +822,7 @@ map MAP26 "AREA 26: proving grounds" cluster = 1 } -map MAP27 "AREA 27: The Lab" +map MAP27 LOOKUP "TXT_STRIFE_MAP27" { next = "MAP28" sky1 = "SKYMNT01" @@ -830,7 +830,7 @@ map MAP27 "AREA 27: The Lab" cluster = 1 } -map MAP28 "AREA 28: Alien Ship" +map MAP28 LOOKUP "TXT_STRIFE_MAP28" { next = "MAP29" sky1 = "SKYMNT01" @@ -838,7 +838,7 @@ map MAP28 "AREA 28: Alien Ship" cluster = 1 } -map MAP29 "AREA 29: Entity's Lair" +map MAP29 LOOKUP "TXT_STRIFE_MAP29" { next = "EndGameS" sky1 = "SKYMNT01" @@ -847,7 +847,7 @@ map MAP29 "AREA 29: Entity's Lair" deathsequence = "Inter_Strife_Lose" } -map MAP30 "AREA 30: Abandoned Front Base" +map MAP30 LOOKUP "TXT_STRIFE_MAP30" { next = "MAP31" sky1 = "SKYMNT01" @@ -855,7 +855,7 @@ map MAP30 "AREA 30: Abandoned Front Base" cluster = 1 } -map MAP31 "AREA 31: Training Facility" +map MAP31 LOOKUP "TXT_STRIFE_MAP31" { next = "MAP01" sky1 = "SKYMNT01" @@ -863,7 +863,7 @@ map MAP31 "AREA 31: Training Facility" cluster = 1 } -map MAP32 "AREA 1: Sanctuary" +map MAP32 LOOKUP "TXT_STRIFE_MAP32" { next = "MAP33" sky1 = "SKYMNT02" @@ -871,7 +871,7 @@ map MAP32 "AREA 1: Sanctuary" cluster = 2 } -map MAP33 "AREA 2: Town" +map MAP33 LOOKUP "TXT_STRIFE_MAP33" { next = "MAP34" sky1 = "SKYMNT02" @@ -879,7 +879,7 @@ map MAP33 "AREA 2: Town" cluster = 2 } -map MAP34 "AREA 3: Movement Base" +map MAP34 LOOKUP "TXT_STRIFE_MAP34" { next = "EndBuyStrife" sky1 = "SKYMNT02" @@ -888,7 +888,7 @@ map MAP34 "AREA 3: Movement Base" noallies } -map MAP35 "AREA 35: Factory: Production" +map MAP35 LOOKUP "TXT_STRIFE_MAP35" { next = "MAP01" sky1 = "SKYMNT01" @@ -896,7 +896,7 @@ map MAP35 "AREA 35: Factory: Production" cluster = 1 } -map MAP36 "AREA 36: Castle Clash" +map MAP36 LOOKUP "TXT_STRIFE_MAP36" { next = "MAP37" sky1 = "SKYMNT01" @@ -904,7 +904,7 @@ map MAP36 "AREA 36: Castle Clash" cluster = 3 } -map MAP37 "AREA 37: Killing Grounds" +map MAP37 LOOKUP "TXT_STRIFE_MAP37" { next = "MAP38" sky1 = "SKYMNT01" @@ -912,7 +912,7 @@ map MAP37 "AREA 37: Killing Grounds" cluster = 3 } -map MAP38 "AREA 38: Ordered Chaos" +map MAP38 LOOKUP "TXT_STRIFE_MAP38" { next = "MAP36" sky1 = "SKYMNT01" @@ -937,5 +937,5 @@ cluster 2 clearepisodes episode MAP02 teaser MAP33 { - name = "Quest for the Sigil" + name = "$TXT_STRIFE_EPI" } diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index f24b139fc3..1f073bf725 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -11,21 +11,25 @@ DEFAULTLISTMENU { Font "BigFont", "Untranslated" - IfGame(Doom, Chex) + LineSpacing 20 + IfGame(Doom) { Selector "M_SKULL1", -32, -5 - Linespacing 16 - Font "BigFont", "Red" + Font "BigUpper", "Red" + LineSpacing 18 + } + IfGame(Chex) + { + Selector "M_SKULL1", -32, -5 + Font "BigFont", "Green" } IfGame(Strife) { Selector "M_CURS1", -28, -5 - Linespacing 19 } IfGame(Heretic, Hexen) { Selector "M_SLCTR1", -28, -1 - Linespacing 20 } } @@ -39,6 +43,7 @@ LISTMENU "MainMenu" { IfGame(Doom, Chex) { + LineSpacing 16 // This must account for some single-graphic replacements, so it cannot be widened StaticPatch 94, 2, "M_DOOM" Position 97, 72 IfOption(ReadThis) @@ -71,21 +76,21 @@ LISTMENU "MainMenu" PatchItem "M_NGAME", "n", "PlayerclassMenu" ifOption(SwapMenu) { - PatchItem "M_LOADG", "l", "LoadGameMenu" - PatchItem "M_SAVEG", "s", "SaveGameMenu" - PatchItem "M_OPTION","o", "OptionsMenu" + PatchItem "M_LOADG", "l", "LoadGameMenu", 0 + PatchItem "M_SAVEG", "s", "SaveGameMenu",0 + PatchItem "M_OPTION","o", "OptionsMenu", 0 } else { - PatchItem "M_OPTION","o", "OptionsMenu" - PatchItem "M_LOADG", "l", "LoadGameMenu" - PatchItem "M_SAVEG", "s", "SaveGameMenu" + PatchItem "M_OPTION","o", "OptionsMenu", 0 + PatchItem "M_LOADG", "l", "LoadGameMenu", 0 + PatchItem "M_SAVEG", "s", "SaveGameMenu", 0 } ifOption(ReadThis) { - PatchItem "M_RDTHIS","r", "ReadThisMenu" + PatchItem "M_RDTHIS","r", "ReadThisMenu", 0 } - PatchItem "M_QUITG", "q", "QuitMenu" + PatchItem "M_QUITG", "q", "QuitMenu", 0 } IfGame(Heretic, Hexen) @@ -98,6 +103,40 @@ LISTMENU "MainMenu" } } +//------------------------------------------------------------------------------------------- +// +// Text only variant of the main menu for Doom, Strife and Chex Quest to be used with localized content. +// +//------------------------------------------------------------------------------------------- + +LISTMENU "MainMenuTextOnly" +{ + IfGame(Doom, Chex) + { + StaticPatch 94, 2, "M_DOOM" + Position 97, 72 + IfOption(ReadThis) + { + Position 97, 64 + } + } + IfGame(Strife) + { + StaticPatch 84, 2, "M_STRIFE" + Position 97, 45 + } + + TextItem "$MNU_NEWGAME", "n", "PlayerclassMenu" + TextItem "$MNU_OPTIONS", "o", "OptionsMenu" + TextItem "$MNU_LOADGAME", "l", "LoadGameMenu" + TextItem "$MNU_SAVEGAME", "s", "SaveGameMenu" + IfOption(ReadThis) + { + TextItem "$MNU_INFO", "i", "ReadThisMenu" + } + TextItem "$MNU_QUITGAME", "q", "QuitMenu" +} + //------------------------------------------------------------------------------------------- // // Important note about the following template menus: @@ -169,7 +208,7 @@ ListMenu "EpisodeMenu" IfGame(Doom, Chex) { Position 48, 63 - StaticPatch 54, 38, "M_EPISOD" + StaticPatch 54, 38, "M_EPISOD", 0 , "$MNU_EPISODE" } IfGame(Strife) { @@ -195,15 +234,15 @@ ListMenu "SkillMenu" IfGame(Doom, Chex) { - StaticPatch 96, 14, "M_NEWG" + StaticPatch 96, 14, "M_NEWG", 0, "$MNU_NEWGAME" } IfGame(Strife) { - StaticPatch 96, 14, "M_NGAME" + StaticPatch 96, 14, "M_NGAME", 0, "$MNU_NEWGAME" } IfGame(Doom, Strife, Chex) { - StaticPatch 54, 38, "M_SKILL" + StaticPatch 54, 38, "M_SKILL", 0, "$MNU_CHOOSESKILL" Position 48, 63 } IfGame (Heretic) @@ -247,14 +286,7 @@ ListMenu "LoadGameMenu" { NetgameMessage "$CLOADNET" } - IfGame(Doom, Strife, Chex) - { - StaticPatchCentered 160, -20, "M_LOADG" - } - IfGame(Heretic, Hexen) - { - StaticTextCentered 160, -10, "$MNU_LOADGAME" - } + StaticTextCentered 160, -10, "$MNU_LOADGAME" Position 80,54 Class "LoadMenu" // uses its own implementation } @@ -267,14 +299,7 @@ ListMenu "LoadGameMenu" ListMenu "SaveGameMenu" { - IfGame(Doom, Strife, Chex) - { - StaticPatchCentered 160, -20, "M_SAVEG" - } - IfGame(Heretic, Hexen) - { - StaticTextCentered 160, -10, "$MNU_SAVEGAME" - } + StaticTextCentered 160, -10, "$MNU_SAVEGAME" Position 80,54 Class "SaveMenu" // uses its own implementation } @@ -2521,3 +2546,27 @@ OptionMenu "ReverbSave" protected StaticText "Environments to save" // Rest is filled in by code. } + +/*======================================= + * + * Language menu + * + *=======================================*/ + +OptionMenu "LanguageOptions" +{ + Title "$OPTMNU_LANGUAGE" + StaticText " " + Command "English (UK)", "language eng" + Command "English (US)", "language enu" + Command "Français (FR)", "language fr" + Command "Italiano (ITA)", "language ita" + Command "Português do Brasil (PTB)", "language ptb" + Command "РуÑÑкий (RU)", "language rus" +} + +AddOptionMenu "OptionsMenu" +{ + StaticText " " + Submenu "$OPTMNU_LANGUAGE", "LanguageOptions" +} diff --git a/wadsrc/static/sbigfont.lmp b/wadsrc/static/sbigfont.lmp deleted file mode 100644 index 6502551e3b..0000000000 Binary files a/wadsrc/static/sbigfont.lmp and /dev/null differ diff --git a/wadsrc/static/strifehelp.acs b/wadsrc/static/strifehelp.acs index 495893edf5..a3799de9ea 100644 --- a/wadsrc/static/strifehelp.acs +++ b/wadsrc/static/strifehelp.acs @@ -268,7 +268,7 @@ script << 0 >> (int type, int tag) case 213: if (!CheckInventory ("OfferingChalice")) { - print (s:"You need the chalice !"); + print (l:"TXT_NEED_CHALICE"); activatorsound ("*usefail", 127); SetResultValue (0); } @@ -281,7 +281,7 @@ script << 0 >> (int type, int tag) case 232: if (!CheckInventory ("QuestItem18") && gametype() != GAME_NET_DEATHMATCH) { - print (s:"You need the Oracle Pass!"); + print (l:"TXT_NEED_OPASS"); activatorsound ("*usefail", 127); SetResultValue (0); } @@ -299,7 +299,7 @@ script << 0 >> (int type, int tag) case 194: if (Door_Open (tag, VDOORSPEED)) { - print (s:"You've freed the prisoners!"); + print (l:"TXT_FREED_PRISONERS"); GiveInventory ("QuestItem13", 1); } else @@ -311,7 +311,7 @@ script << 0 >> (int type, int tag) case 199: if (Ceiling_LowerAndCrush (tag, 8, 10)) { - print (s:"You've destroyed the Converter!"); + print (l:"TXT_DESTROYED_CONVERTER"); GiveInventory ("QuestItem25", 1); GiveInventory ("UpgradeStamina", 10); GiveInventory ("UpgradeAccuracy", 1); @@ -329,7 +329,7 @@ script << 0 >> (int type, int tag) } else { - print (s:"You need the chalice!"); + print (l:"TXT_NEED_CHALICE"); activatorsound ("*usefail", 127); SetResultValue (0); } @@ -345,7 +345,7 @@ script << 0 >> (int type, int tag) { GiveInventory ("UpgradeStamina", 10); GiveInventory ("UpgradeAccuracy", 1); - print (s:"Congratulations! You have completed the training area"); + print (l:"TXT_COMPLETED_TRAINING"); } else { diff --git a/wadsrc/static/zscript.txt b/wadsrc/static/zscript.txt index cfcf37e90c..705f29798c 100644 --- a/wadsrc/static/zscript.txt +++ b/wadsrc/static/zscript.txt @@ -1,270 +1,272 @@ version "3.8" -#include "zscript/base.txt" -#include "zscript/sounddata.txt" -#include "zscript/mapdata.txt" -#include "zscript/dynarrays.txt" -#include "zscript/constants.txt" -#include "zscript/actor.txt" -#include "zscript/actor_attacks.txt" -#include "zscript/actor_checks.txt" -#include "zscript/actor_interaction.txt" -#include "zscript/actor_inventory.txt" -#include "zscript/actor_actions.txt" -#include "zscript/events.txt" -#include "zscript/destructible.txt" -#include "zscript/level_compatibility.txt" +#include "zscript/base.zs" +#include "zscript/sounddata.zs" +#include "zscript/mapdata.zs" +#include "zscript/dynarrays.zs" +#include "zscript/constants.zs" +#include "zscript/events.zs" +#include "zscript/destructible.zs" +#include "zscript/level_compatibility.zs" -#include "zscript/menu/menuitembase.txt" -#include "zscript/menu/menu.txt" -#include "zscript/menu/messagebox.txt" -#include "zscript/menu/listmenu.txt" -#include "zscript/menu/listmenuitems.txt" -#include "zscript/menu/optionmenu.txt" -#include "zscript/menu/optionmenuitems.txt" -#include "zscript/menu/colorpickermenu.txt" -#include "zscript/menu/joystickmenu.txt" -#include "zscript/menu/loadsavemenu.txt" -#include "zscript/menu/playermenu.txt" -#include "zscript/menu/playerdisplay.txt" -#include "zscript/menu/playercontrols.txt" -#include "zscript/menu/textentermenu.txt" -#include "zscript/menu/readthis.txt" -#include "zscript/menu/conversationmenu.txt" -#include "zscript/menu/reverbedit.txt" +#include "zscript/actors/actor.zs" +#include "zscript/actors/checks.zs" +#include "zscript/actors/interaction.zs" +#include "zscript/actors/inventory_util.zs" +#include "zscript/actors/actions.zs" +#include "zscript/actors/attacks.zs" +#include "zscript/actors/morph.zs" -#include "zscript/statscreen/types.txt" -#include "zscript/statscreen/statscreen.txt" -#include "zscript/statscreen/statscreen_sp.txt" -#include "zscript/statscreen/statscreen_dm.txt" -#include "zscript/statscreen/statscreen_coop.txt" +#include "zscript/actors/inventory/inventory.zs" +#include "zscript/actors/inventory/inv_misc.zs" +#include "zscript/actors/inventory/stateprovider.zs" +#include "zscript/actors/inventory/weapons.zs" +#include "zscript/actors/inventory/weaponpiece.zs" +#include "zscript/actors/inventory/armor.zs" +#include "zscript/actors/inventory/ammo.zs" +#include "zscript/actors/inventory/health.zs" +#include "zscript/actors/inventory/powerups.zs" -#include "zscript/statusbar/statusbar.txt" -#include "zscript/statusbar/doom_sbar.txt" -#include "zscript/statusbar/heretic_sbar.txt" -#include "zscript/statusbar/hexen_sbar.txt" -#include "zscript/statusbar/strife_sbar.txt" -#include "zscript/statusbar/harm_sbar.txt" -#include "zscript/statusbar/sbarinfowrapper.txt" -#include "zscript/statusbar/alt_hud.txt" +#include "zscript/actors/player/player.zs" +#include "zscript/actors/player/player_cheat.zs" +#include "zscript/actors/player/player_inventory.zs" +#include "zscript/actors/player/player_morph.zs" -#include "zscript/inventory/inventory.txt" -#include "zscript/inventory/inv_misc.txt" -#include "zscript/inventory/stateprovider.txt" -#include "zscript/inventory/weapons.txt" -#include "zscript/inventory/weaponpiece.txt" -#include "zscript/inventory/armor.txt" -#include "zscript/inventory/ammo.txt" -#include "zscript/inventory/health.txt" -#include "zscript/inventory/powerups.txt" +#include "zscript/actors/shared/botstuff.zs" +#include "zscript/actors/shared/sharedmisc.zs" +#include "zscript/actors/shared/blood.zs" +#include "zscript/actors/shared/debris.zs" +#include "zscript/actors/shared/decal.zs" +#include "zscript/actors/shared/splashes.zs" +#include "zscript/actors/shared/itemeffects.zs" +#include "zscript/actors/shared/fountain.zs" +#include "zscript/actors/shared/spark.zs" +#include "zscript/actors/shared/soundsequence.zs" +#include "zscript/actors/shared/soundenvironment.zs" +#include "zscript/actors/shared/bridge.zs" +#include "zscript/actors/shared/specialspot.zs" +#include "zscript/actors/shared/teleport.zs" +#include "zscript/actors/shared/camera.zs" +#include "zscript/actors/shared/movingcamera.zs" +#include "zscript/actors/shared/mapmarker.zs" +#include "zscript/actors/shared/waterzone.zs" +#include "zscript/actors/shared/skies.zs" +#include "zscript/actors/shared/hatetarget.zs" +#include "zscript/actors/shared/secrettrigger.zs" +#include "zscript/actors/shared/setcolor.zs" +#include "zscript/actors/shared/sectoraction.zs" +#include "zscript/actors/shared/ice.zs" +#include "zscript/actors/shared/dog.zs" +#include "zscript/actors/shared/fastprojectile.zs" +#include "zscript/actors/shared/randomspawner.zs" +#include "zscript/actors/shared/dynlights.zs" -#include "zscript/shared/player.txt" -#include "zscript/shared/player_cheat.txt" -#include "zscript/shared/player_inventory.txt" -#include "zscript/shared/morph.txt" -#include "zscript/shared/botstuff.txt" -#include "zscript/shared/sharedmisc.txt" -#include "zscript/shared/blood.txt" -#include "zscript/shared/debris.txt" -#include "zscript/shared/decal.txt" -#include "zscript/shared/splashes.txt" -#include "zscript/shared/itemeffects.txt" -#include "zscript/shared/fountain.txt" -#include "zscript/shared/spark.txt" -#include "zscript/shared/soundsequence.txt" -#include "zscript/shared/soundenvironment.txt" -#include "zscript/shared/bridge.txt" -#include "zscript/shared/specialspot.txt" -#include "zscript/shared/teleport.txt" -#include "zscript/shared/camera.txt" -#include "zscript/shared/movingcamera.txt" -#include "zscript/shared/mapmarker.txt" -#include "zscript/shared/waterzone.txt" -#include "zscript/shared/skies.txt" -#include "zscript/shared/hatetarget.txt" -#include "zscript/shared/secrettrigger.txt" -#include "zscript/shared/setcolor.txt" -#include "zscript/shared/sectoraction.txt" -#include "zscript/shared/ice.txt" -#include "zscript/shared/dog.txt" -#include "zscript/shared/fastprojectile.txt" -#include "zscript/shared/randomspawner.txt" -#include "zscript/shared/dynlights.txt" +#include "zscript/actors/doom/doomplayer.zs" +#include "zscript/actors/doom/possessed.zs" +#include "zscript/actors/doom/doomimp.zs" +#include "zscript/actors/doom/demon.zs" +#include "zscript/actors/doom/lostsoul.zs" +#include "zscript/actors/doom/cacodemon.zs" +#include "zscript/actors/doom/bruiser.zs" +#include "zscript/actors/doom/revenant.zs" +#include "zscript/actors/doom/arachnotron.zs" +#include "zscript/actors/doom/fatso.zs" +#include "zscript/actors/doom/painelemental.zs" +#include "zscript/actors/doom/archvile.zs" +#include "zscript/actors/doom/cyberdemon.zs" +#include "zscript/actors/doom/spidermaster.zs" +#include "zscript/actors/doom/keen.zs" +#include "zscript/actors/doom/bossbrain.zs" +#include "zscript/actors/doom/weaponfist.zs" +#include "zscript/actors/doom/weaponpistol.zs" +#include "zscript/actors/doom/weaponshotgun.zs" +#include "zscript/actors/doom/weaponssg.zs" +#include "zscript/actors/doom/weaponchaingun.zs" +#include "zscript/actors/doom/weaponchainsaw.zs" +#include "zscript/actors/doom/weaponrlaunch.zs" +#include "zscript/actors/doom/weaponplasma.zs" +#include "zscript/actors/doom/weaponbfg.zs" -#include "zscript/compatibility.txt" +#include "zscript/actors/doom/deadthings.zs" +#include "zscript/actors/doom/doomammo.zs" +#include "zscript/actors/doom/doomarmor.zs" +#include "zscript/actors/doom/doomartifacts.zs" +#include "zscript/actors/doom/doomhealth.zs" +#include "zscript/actors/doom/doomkeys.zs" +#include "zscript/actors/doom/doommisc.zs" +#include "zscript/actors/doom/doomdecorations.zs" +#include "zscript/actors/doom/doomweapons.zs" +#include "zscript/actors/doom/stealthmonsters.zs" +#include "zscript/actors/doom/scriptedmarine.zs" -#include "zscript/doom/doomplayer.txt" -#include "zscript/doom/possessed.txt" -#include "zscript/doom/doomimp.txt" -#include "zscript/doom/demon.txt" -#include "zscript/doom/lostsoul.txt" -#include "zscript/doom/cacodemon.txt" -#include "zscript/doom/bruiser.txt" -#include "zscript/doom/revenant.txt" -#include "zscript/doom/arachnotron.txt" -#include "zscript/doom/fatso.txt" -#include "zscript/doom/painelemental.txt" -#include "zscript/doom/archvile.txt" -#include "zscript/doom/cyberdemon.txt" -#include "zscript/doom/spidermaster.txt" -#include "zscript/doom/keen.txt" -#include "zscript/doom/bossbrain.txt" -#include "zscript/doom/weaponfist.txt" -#include "zscript/doom/weaponpistol.txt" -#include "zscript/doom/weaponshotgun.txt" -#include "zscript/doom/weaponssg.txt" -#include "zscript/doom/weaponchaingun.txt" -#include "zscript/doom/weaponchainsaw.txt" -#include "zscript/doom/weaponrlaunch.txt" -#include "zscript/doom/weaponplasma.txt" -#include "zscript/doom/weaponbfg.txt" +#include "zscript/actors/raven/artiegg.zs" +#include "zscript/actors/raven/artitele.zs" +#include "zscript/actors/raven/ravenartifacts.zs" +#include "zscript/actors/raven/ravenhealth.zs" +#include "zscript/actors/raven/ravenambient.zs" +#include "zscript/actors/raven/minotaur.zs" -#include "zscript/doom/deadthings.txt" -#include "zscript/doom/doomammo.txt" -#include "zscript/doom/doomarmor.txt" -#include "zscript/doom/doomartifacts.txt" -#include "zscript/doom/doomhealth.txt" -#include "zscript/doom/doomkeys.txt" -#include "zscript/doom/doommisc.txt" -#include "zscript/doom/doomdecorations.txt" -#include "zscript/doom/doomweapons.txt" -#include "zscript/doom/stealthmonsters.txt" -#include "zscript/doom/scriptedmarine.txt" +#include "zscript/actors/heretic/hereticplayer.zs" +#include "zscript/actors/heretic/hereticammo.zs" +#include "zscript/actors/heretic/hereticarmor.zs" +#include "zscript/actors/heretic/hereticartifacts.zs" +#include "zscript/actors/heretic/heretickeys.zs" +#include "zscript/actors/heretic/hereticdecorations.zs" +#include "zscript/actors/heretic/hereticmisc.zs" +#include "zscript/actors/heretic/mummy.zs" +#include "zscript/actors/heretic/clink.zs" +#include "zscript/actors/heretic/beast.zs" +#include "zscript/actors/heretic/snake.zs" +#include "zscript/actors/heretic/hereticimp.zs" +#include "zscript/actors/heretic/knight.zs" +#include "zscript/actors/heretic/wizard.zs" +#include "zscript/actors/heretic/ironlich.zs" +#include "zscript/actors/heretic/dsparil.zs" +#include "zscript/actors/heretic/chicken.zs" +#include "zscript/actors/heretic/weaponstaff.zs" +#include "zscript/actors/heretic/weaponwand.zs" +#include "zscript/actors/heretic/weaponcrossbow.zs" +#include "zscript/actors/heretic/weapongauntlets.zs" +#include "zscript/actors/heretic/weaponmace.zs" +#include "zscript/actors/heretic/weaponblaster.zs" +#include "zscript/actors/heretic/weaponskullrod.zs" +#include "zscript/actors/heretic/weaponphoenix.zs" -#include "zscript/raven/artiegg.txt" -#include "zscript/raven/artitele.txt" -#include "zscript/raven/ravenartifacts.txt" -#include "zscript/raven/ravenhealth.txt" -#include "zscript/raven/ravenambient.txt" -#include "zscript/raven/minotaur.txt" +#include "zscript/actors/hexen/baseweapons.zs" +#include "zscript/actors/hexen/korax.zs" +#include "zscript/actors/hexen/fighterplayer.zs" +#include "zscript/actors/hexen/clericplayer.zs" +#include "zscript/actors/hexen/mageplayer.zs" +#include "zscript/actors/hexen/pig.zs" +#include "zscript/actors/hexen/flame.zs" +#include "zscript/actors/hexen/flies.zs" +#include "zscript/actors/hexen/hexenarmor.zs" +#include "zscript/actors/hexen/hexendecorations.zs" +#include "zscript/actors/hexen/hexenkeys.zs" +#include "zscript/actors/hexen/hexenspecialdecs.zs" +#include "zscript/actors/hexen/mana.zs" +#include "zscript/actors/hexen/puzzleitems.zs" +#include "zscript/actors/hexen/scriptprojectiles.zs" +#include "zscript/actors/hexen/speedboots.zs" +#include "zscript/actors/hexen/ettin.zs" +#include "zscript/actors/hexen/centaur.zs" +#include "zscript/actors/hexen/demons.zs" +#include "zscript/actors/hexen/firedemon.zs" +#include "zscript/actors/hexen/fog.zs" +#include "zscript/actors/hexen/summon.zs" +#include "zscript/actors/hexen/flechette.zs" +#include "zscript/actors/hexen/clericboss.zs" +#include "zscript/actors/hexen/fighterboss.zs" +#include "zscript/actors/hexen/mageboss.zs" +#include "zscript/actors/hexen/bats.zs" +#include "zscript/actors/hexen/bishop.zs" +#include "zscript/actors/hexen/blastradius.zs" +#include "zscript/actors/hexen/boostarmor.zs" +#include "zscript/actors/hexen/clericmace.zs" +#include "zscript/actors/hexen/clericflame.zs" +#include "zscript/actors/hexen/clericholy.zs" +#include "zscript/actors/hexen/clericstaff.zs" +#include "zscript/actors/hexen/magewand.zs" +#include "zscript/actors/hexen/magecone.zs" +#include "zscript/actors/hexen/magelightning.zs" +#include "zscript/actors/hexen/magestaff.zs" +#include "zscript/actors/hexen/fighterfist.zs" +#include "zscript/actors/hexen/fighteraxe.zs" +#include "zscript/actors/hexen/fighterhammer.zs" +#include "zscript/actors/hexen/fighterquietus.zs" +#include "zscript/actors/hexen/dragon.zs" +#include "zscript/actors/hexen/healingradius.zs" +#include "zscript/actors/hexen/teleportother.zs" +#include "zscript/actors/hexen/iceguy.zs" +#include "zscript/actors/hexen/serpent.zs" +#include "zscript/actors/hexen/spike.zs" +#include "zscript/actors/hexen/wraith.zs" +#include "zscript/actors/hexen/heresiarch.zs" -#include "zscript/heretic/hereticplayer.txt" -#include "zscript/heretic/hereticammo.txt" -#include "zscript/heretic/hereticarmor.txt" -#include "zscript/heretic/hereticartifacts.txt" -#include "zscript/heretic/heretickeys.txt" -#include "zscript/heretic/hereticdecorations.txt" -#include "zscript/heretic/hereticmisc.txt" -#include "zscript/heretic/mummy.txt" -#include "zscript/heretic/clink.txt" -#include "zscript/heretic/beast.txt" -#include "zscript/heretic/snake.txt" -#include "zscript/heretic/hereticimp.txt" -#include "zscript/heretic/knight.txt" -#include "zscript/heretic/wizard.txt" -#include "zscript/heretic/ironlich.txt" -#include "zscript/heretic/dsparil.txt" -#include "zscript/heretic/chicken.txt" -#include "zscript/heretic/weaponstaff.txt" -#include "zscript/heretic/weaponwand.txt" -#include "zscript/heretic/weaponcrossbow.txt" -#include "zscript/heretic/weapongauntlets.txt" -#include "zscript/heretic/weaponmace.txt" -#include "zscript/heretic/weaponblaster.txt" -#include "zscript/heretic/weaponskullrod.txt" -#include "zscript/heretic/weaponphoenix.txt" +#include "zscript/actors/strife/strifehumanoid.zs" +#include "zscript/actors/strife/strifeplayer.zs" +#include "zscript/actors/strife/strifeweapons.zs" +#include "zscript/actors/strife/spectral.zs" +#include "zscript/actors/strife/acolyte.zs" +#include "zscript/actors/strife/alienspectres.zs" +#include "zscript/actors/strife/beggars.zs" +#include "zscript/actors/strife/coin.zs" +#include "zscript/actors/strife/crusader.zs" +#include "zscript/actors/strife/entityboss.zs" +#include "zscript/actors/strife/inquisitor.zs" +#include "zscript/actors/strife/klaxon.zs" +#include "zscript/actors/strife/loremaster.zs" +#include "zscript/actors/strife/macil.zs" +#include "zscript/actors/strife/merchants.zs" +#include "zscript/actors/strife/peasants.zs" +#include "zscript/actors/strife/strifebishop.zs" +#include "zscript/actors/strife/oracle.zs" +#include "zscript/actors/strife/programmer.zs" +#include "zscript/actors/strife/questitems.zs" +#include "zscript/actors/strife/ratbuddy.zs" +#include "zscript/actors/strife/rebels.zs" +#include "zscript/actors/strife/reaver.zs" +#include "zscript/actors/strife/sentinel.zs" +#include "zscript/actors/strife/stalker.zs" +#include "zscript/actors/strife/strifeammo.zs" +#include "zscript/actors/strife/strifearmor.zs" +#include "zscript/actors/strife/strifefunctions.zs" +#include "zscript/actors/strife/strifeitems.zs" +#include "zscript/actors/strife/strifekeys.zs" +#include "zscript/actors/strife/strifestuff.zs" +#include "zscript/actors/strife/thingstoblowup.zs" +#include "zscript/actors/strife/templar.zs" +#include "zscript/actors/strife/zombie.zs" +#include "zscript/actors/strife/weapondagger.zs" +#include "zscript/actors/strife/weaponcrossbow.zs" +#include "zscript/actors/strife/weaponassault.zs" +#include "zscript/actors/strife/weaponmissile.zs" +#include "zscript/actors/strife/weaponflamer.zs" +#include "zscript/actors/strife/weapongrenade.zs" +#include "zscript/actors/strife/weaponmauler.zs" +#include "zscript/actors/strife/sigil.zs" +#include "zscript/actors/strife/svestuff.zs" +#include "zscript/actors/strife/svelights.zs" -#include "zscript/hexen/baseweapons.txt" -#include "zscript/hexen/korax.txt" -#include "zscript/hexen/fighterplayer.txt" -#include "zscript/hexen/clericplayer.txt" -#include "zscript/hexen/mageplayer.txt" -#include "zscript/hexen/pig.txt" -#include "zscript/hexen/flame.txt" -#include "zscript/hexen/flies.txt" -#include "zscript/hexen/hexenarmor.txt" -#include "zscript/hexen/hexendecorations.txt" -#include "zscript/hexen/hexenkeys.txt" -#include "zscript/hexen/hexenspecialdecs.txt" -#include "zscript/hexen/mana.txt" -#include "zscript/hexen/puzzleitems.txt" -#include "zscript/hexen/scriptprojectiles.txt" -#include "zscript/hexen/speedboots.txt" -#include "zscript/hexen/ettin.txt" -#include "zscript/hexen/centaur.txt" -#include "zscript/hexen/demons.txt" -#include "zscript/hexen/firedemon.txt" -#include "zscript/hexen/fog.txt" -#include "zscript/hexen/summon.txt" -#include "zscript/hexen/flechette.txt" -#include "zscript/hexen/clericboss.txt" -#include "zscript/hexen/fighterboss.txt" -#include "zscript/hexen/mageboss.txt" -#include "zscript/hexen/bats.txt" -#include "zscript/hexen/bishop.txt" -#include "zscript/hexen/blastradius.txt" -#include "zscript/hexen/boostarmor.txt" -#include "zscript/hexen/clericmace.txt" -#include "zscript/hexen/clericflame.txt" -#include "zscript/hexen/clericholy.txt" -#include "zscript/hexen/clericstaff.txt" -#include "zscript/hexen/magewand.txt" -#include "zscript/hexen/magecone.txt" -#include "zscript/hexen/magelightning.txt" -#include "zscript/hexen/magestaff.txt" -#include "zscript/hexen/fighterfist.txt" -#include "zscript/hexen/fighteraxe.txt" -#include "zscript/hexen/fighterhammer.txt" -#include "zscript/hexen/fighterquietus.txt" -#include "zscript/hexen/dragon.txt" -#include "zscript/hexen/healingradius.txt" -#include "zscript/hexen/teleportother.txt" -#include "zscript/hexen/iceguy.txt" -#include "zscript/hexen/serpent.txt" -#include "zscript/hexen/spike.txt" -#include "zscript/hexen/wraith.txt" -#include "zscript/hexen/heresiarch.txt" +#include "zscript/actors/chex/chexmonsters.zs" +#include "zscript/actors/chex/chexkeys.zs" +#include "zscript/actors/chex/chexammo.zs" +#include "zscript/actors/chex/chexweapons.zs" +#include "zscript/actors/chex/chexitems.zs" +#include "zscript/actors/chex/chexdecorations.zs" +#include "zscript/actors/chex/chexplayer.zs" -#include "zscript/strife/strifehumanoid.txt" -#include "zscript/strife/strifeplayer.txt" -#include "zscript/strife/strifeweapons.txt" -#include "zscript/strife/spectral.txt" -#include "zscript/strife/acolyte.txt" -#include "zscript/strife/alienspectres.txt" -#include "zscript/strife/beggars.txt" -#include "zscript/strife/coin.txt" -#include "zscript/strife/crusader.txt" -#include "zscript/strife/entityboss.txt" -#include "zscript/strife/inquisitor.txt" -#include "zscript/strife/klaxon.txt" -#include "zscript/strife/loremaster.txt" -#include "zscript/strife/macil.txt" -#include "zscript/strife/merchants.txt" -#include "zscript/strife/peasants.txt" -#include "zscript/strife/strifebishop.txt" -#include "zscript/strife/oracle.txt" -#include "zscript/strife/programmer.txt" -#include "zscript/strife/questitems.txt" -#include "zscript/strife/ratbuddy.txt" -#include "zscript/strife/rebels.txt" -#include "zscript/strife/reaver.txt" -#include "zscript/strife/sentinel.txt" -#include "zscript/strife/stalker.txt" -#include "zscript/strife/strifeammo.txt" -#include "zscript/strife/strifearmor.txt" -#include "zscript/strife/strifefunctions.txt" -#include "zscript/strife/strifeitems.txt" -#include "zscript/strife/strifekeys.txt" -#include "zscript/strife/strifestuff.txt" -#include "zscript/strife/thingstoblowup.txt" -#include "zscript/strife/templar.txt" -#include "zscript/strife/zombie.txt" -#include "zscript/strife/weapondagger.txt" -#include "zscript/strife/weaponcrossbow.txt" -#include "zscript/strife/weaponassault.txt" -#include "zscript/strife/weaponmissile.txt" -#include "zscript/strife/weaponflamer.txt" -#include "zscript/strife/weapongrenade.txt" -#include "zscript/strife/weaponmauler.txt" -#include "zscript/strife/sigil.txt" -#include "zscript/strife/svestuff.txt" -#include "zscript/strife/svelights.txt" +#include "zscript/ui/menu/colorpickermenu.zs" +#include "zscript/ui/menu/conversationmenu.zs" +#include "zscript/ui/menu/joystickmenu.zs" +#include "zscript/ui/menu/listmenu.zs" +#include "zscript/ui/menu/listmenuitems.zs" +#include "zscript/ui/menu/loadsavemenu.zs" +#include "zscript/ui/menu/menu.zs" +#include "zscript/ui/menu/menuitembase.zs" +#include "zscript/ui/menu/messagebox.zs" +#include "zscript/ui/menu/optionmenu.zs" +#include "zscript/ui/menu/optionmenuitems.zs" +#include "zscript/ui/menu/playercontrols.zs" +#include "zscript/ui/menu/playerdisplay.zs" +#include "zscript/ui/menu/playermenu.zs" +#include "zscript/ui/menu/readthis.zs" +#include "zscript/ui/menu/reverbedit.zs" +#include "zscript/ui/menu/textentermenu.zs" -#include "zscript/chex/chexmonsters.txt" -#include "zscript/chex/chexkeys.txt" -#include "zscript/chex/chexammo.txt" -#include "zscript/chex/chexweapons.txt" -#include "zscript/chex/chexitems.txt" -#include "zscript/chex/chexdecorations.txt" -#include "zscript/chex/chexplayer.txt" +#include "zscript/ui/statscreen/statscreen.zs" +#include "zscript/ui/statscreen/statscreen_coop.zs" +#include "zscript/ui/statscreen/statscreen_dm.zs" +#include "zscript/ui/statscreen/statscreen_sp.zs" +#include "zscript/ui/statscreen/types.zs" -#include "zscript/scriptutil/scriptutil.txt" +#include "zscript/ui/statusbar/alt_hud.zs" +#include "zscript/ui/statusbar/doom_sbar.zs" +#include "zscript/ui/statusbar/harm_sbar.zs" +#include "zscript/ui/statusbar/heretic_sbar.zs" +#include "zscript/ui/statusbar/hexen_sbar.zs" +#include "zscript/ui/statusbar/sbarinfowrapper.zs" +#include "zscript/ui/statusbar/statusbar.zs" +#include "zscript/ui/statusbar/strife_sbar.zs" + +#include "zscript/compatibility.zs" +#include "zscript/scriptutil/scriptutil.zs" diff --git a/wadsrc/static/zscript/actor_actions.txt b/wadsrc/static/zscript/actors/actions.zs similarity index 100% rename from wadsrc/static/zscript/actor_actions.txt rename to wadsrc/static/zscript/actors/actions.zs diff --git a/wadsrc/static/zscript/actor.txt b/wadsrc/static/zscript/actors/actor.zs similarity index 100% rename from wadsrc/static/zscript/actor.txt rename to wadsrc/static/zscript/actors/actor.zs diff --git a/wadsrc/static/zscript/actor_attacks.txt b/wadsrc/static/zscript/actors/attacks.zs similarity index 100% rename from wadsrc/static/zscript/actor_attacks.txt rename to wadsrc/static/zscript/actors/attacks.zs diff --git a/wadsrc/static/zscript/actor_checks.txt b/wadsrc/static/zscript/actors/checks.zs similarity index 100% rename from wadsrc/static/zscript/actor_checks.txt rename to wadsrc/static/zscript/actors/checks.zs diff --git a/wadsrc/static/zscript/chex/chexammo.txt b/wadsrc/static/zscript/actors/chex/chexammo.zs similarity index 100% rename from wadsrc/static/zscript/chex/chexammo.txt rename to wadsrc/static/zscript/actors/chex/chexammo.zs diff --git a/wadsrc/static/zscript/chex/chexdecorations.txt b/wadsrc/static/zscript/actors/chex/chexdecorations.zs similarity index 100% rename from wadsrc/static/zscript/chex/chexdecorations.txt rename to wadsrc/static/zscript/actors/chex/chexdecorations.zs diff --git a/wadsrc/static/zscript/chex/chexitems.txt b/wadsrc/static/zscript/actors/chex/chexitems.zs similarity index 100% rename from wadsrc/static/zscript/chex/chexitems.txt rename to wadsrc/static/zscript/actors/chex/chexitems.zs diff --git a/wadsrc/static/zscript/chex/chexkeys.txt b/wadsrc/static/zscript/actors/chex/chexkeys.zs similarity index 100% rename from wadsrc/static/zscript/chex/chexkeys.txt rename to wadsrc/static/zscript/actors/chex/chexkeys.zs diff --git a/wadsrc/static/zscript/chex/chexmonsters.txt b/wadsrc/static/zscript/actors/chex/chexmonsters.zs similarity index 100% rename from wadsrc/static/zscript/chex/chexmonsters.txt rename to wadsrc/static/zscript/actors/chex/chexmonsters.zs diff --git a/wadsrc/static/zscript/chex/chexplayer.txt b/wadsrc/static/zscript/actors/chex/chexplayer.zs similarity index 100% rename from wadsrc/static/zscript/chex/chexplayer.txt rename to wadsrc/static/zscript/actors/chex/chexplayer.zs diff --git a/wadsrc/static/zscript/chex/chexweapons.txt b/wadsrc/static/zscript/actors/chex/chexweapons.zs similarity index 100% rename from wadsrc/static/zscript/chex/chexweapons.txt rename to wadsrc/static/zscript/actors/chex/chexweapons.zs diff --git a/wadsrc/static/zscript/doom/arachnotron.txt b/wadsrc/static/zscript/actors/doom/arachnotron.zs similarity index 100% rename from wadsrc/static/zscript/doom/arachnotron.txt rename to wadsrc/static/zscript/actors/doom/arachnotron.zs diff --git a/wadsrc/static/zscript/doom/archvile.txt b/wadsrc/static/zscript/actors/doom/archvile.zs similarity index 100% rename from wadsrc/static/zscript/doom/archvile.txt rename to wadsrc/static/zscript/actors/doom/archvile.zs diff --git a/wadsrc/static/zscript/doom/bossbrain.txt b/wadsrc/static/zscript/actors/doom/bossbrain.zs similarity index 100% rename from wadsrc/static/zscript/doom/bossbrain.txt rename to wadsrc/static/zscript/actors/doom/bossbrain.zs diff --git a/wadsrc/static/zscript/doom/bruiser.txt b/wadsrc/static/zscript/actors/doom/bruiser.zs similarity index 100% rename from wadsrc/static/zscript/doom/bruiser.txt rename to wadsrc/static/zscript/actors/doom/bruiser.zs diff --git a/wadsrc/static/zscript/doom/cacodemon.txt b/wadsrc/static/zscript/actors/doom/cacodemon.zs similarity index 100% rename from wadsrc/static/zscript/doom/cacodemon.txt rename to wadsrc/static/zscript/actors/doom/cacodemon.zs diff --git a/wadsrc/static/zscript/doom/cyberdemon.txt b/wadsrc/static/zscript/actors/doom/cyberdemon.zs similarity index 100% rename from wadsrc/static/zscript/doom/cyberdemon.txt rename to wadsrc/static/zscript/actors/doom/cyberdemon.zs diff --git a/wadsrc/static/zscript/doom/deadthings.txt b/wadsrc/static/zscript/actors/doom/deadthings.zs similarity index 100% rename from wadsrc/static/zscript/doom/deadthings.txt rename to wadsrc/static/zscript/actors/doom/deadthings.zs diff --git a/wadsrc/static/zscript/doom/demon.txt b/wadsrc/static/zscript/actors/doom/demon.zs similarity index 100% rename from wadsrc/static/zscript/doom/demon.txt rename to wadsrc/static/zscript/actors/doom/demon.zs diff --git a/wadsrc/static/zscript/doom/doomammo.txt b/wadsrc/static/zscript/actors/doom/doomammo.zs similarity index 100% rename from wadsrc/static/zscript/doom/doomammo.txt rename to wadsrc/static/zscript/actors/doom/doomammo.zs diff --git a/wadsrc/static/zscript/doom/doomarmor.txt b/wadsrc/static/zscript/actors/doom/doomarmor.zs similarity index 100% rename from wadsrc/static/zscript/doom/doomarmor.txt rename to wadsrc/static/zscript/actors/doom/doomarmor.zs diff --git a/wadsrc/static/zscript/doom/doomartifacts.txt b/wadsrc/static/zscript/actors/doom/doomartifacts.zs similarity index 100% rename from wadsrc/static/zscript/doom/doomartifacts.txt rename to wadsrc/static/zscript/actors/doom/doomartifacts.zs diff --git a/wadsrc/static/zscript/doom/doomdecorations.txt b/wadsrc/static/zscript/actors/doom/doomdecorations.zs similarity index 100% rename from wadsrc/static/zscript/doom/doomdecorations.txt rename to wadsrc/static/zscript/actors/doom/doomdecorations.zs diff --git a/wadsrc/static/zscript/doom/doomhealth.txt b/wadsrc/static/zscript/actors/doom/doomhealth.zs similarity index 100% rename from wadsrc/static/zscript/doom/doomhealth.txt rename to wadsrc/static/zscript/actors/doom/doomhealth.zs diff --git a/wadsrc/static/zscript/doom/doomimp.txt b/wadsrc/static/zscript/actors/doom/doomimp.zs similarity index 100% rename from wadsrc/static/zscript/doom/doomimp.txt rename to wadsrc/static/zscript/actors/doom/doomimp.zs diff --git a/wadsrc/static/zscript/doom/doomkeys.txt b/wadsrc/static/zscript/actors/doom/doomkeys.zs similarity index 100% rename from wadsrc/static/zscript/doom/doomkeys.txt rename to wadsrc/static/zscript/actors/doom/doomkeys.zs diff --git a/wadsrc/static/zscript/doom/doommisc.txt b/wadsrc/static/zscript/actors/doom/doommisc.zs similarity index 100% rename from wadsrc/static/zscript/doom/doommisc.txt rename to wadsrc/static/zscript/actors/doom/doommisc.zs diff --git a/wadsrc/static/zscript/doom/doomplayer.txt b/wadsrc/static/zscript/actors/doom/doomplayer.zs similarity index 100% rename from wadsrc/static/zscript/doom/doomplayer.txt rename to wadsrc/static/zscript/actors/doom/doomplayer.zs diff --git a/wadsrc/static/zscript/doom/doomweapons.txt b/wadsrc/static/zscript/actors/doom/doomweapons.zs similarity index 100% rename from wadsrc/static/zscript/doom/doomweapons.txt rename to wadsrc/static/zscript/actors/doom/doomweapons.zs diff --git a/wadsrc/static/zscript/doom/fatso.txt b/wadsrc/static/zscript/actors/doom/fatso.zs similarity index 100% rename from wadsrc/static/zscript/doom/fatso.txt rename to wadsrc/static/zscript/actors/doom/fatso.zs diff --git a/wadsrc/static/zscript/doom/keen.txt b/wadsrc/static/zscript/actors/doom/keen.zs similarity index 100% rename from wadsrc/static/zscript/doom/keen.txt rename to wadsrc/static/zscript/actors/doom/keen.zs diff --git a/wadsrc/static/zscript/doom/lostsoul.txt b/wadsrc/static/zscript/actors/doom/lostsoul.zs similarity index 100% rename from wadsrc/static/zscript/doom/lostsoul.txt rename to wadsrc/static/zscript/actors/doom/lostsoul.zs diff --git a/wadsrc/static/zscript/doom/painelemental.txt b/wadsrc/static/zscript/actors/doom/painelemental.zs similarity index 100% rename from wadsrc/static/zscript/doom/painelemental.txt rename to wadsrc/static/zscript/actors/doom/painelemental.zs diff --git a/wadsrc/static/zscript/doom/possessed.txt b/wadsrc/static/zscript/actors/doom/possessed.zs similarity index 100% rename from wadsrc/static/zscript/doom/possessed.txt rename to wadsrc/static/zscript/actors/doom/possessed.zs diff --git a/wadsrc/static/zscript/doom/revenant.txt b/wadsrc/static/zscript/actors/doom/revenant.zs similarity index 100% rename from wadsrc/static/zscript/doom/revenant.txt rename to wadsrc/static/zscript/actors/doom/revenant.zs diff --git a/wadsrc/static/zscript/doom/scriptedmarine.txt b/wadsrc/static/zscript/actors/doom/scriptedmarine.zs similarity index 100% rename from wadsrc/static/zscript/doom/scriptedmarine.txt rename to wadsrc/static/zscript/actors/doom/scriptedmarine.zs diff --git a/wadsrc/static/zscript/doom/spidermaster.txt b/wadsrc/static/zscript/actors/doom/spidermaster.zs similarity index 100% rename from wadsrc/static/zscript/doom/spidermaster.txt rename to wadsrc/static/zscript/actors/doom/spidermaster.zs diff --git a/wadsrc/static/zscript/doom/stealthmonsters.txt b/wadsrc/static/zscript/actors/doom/stealthmonsters.zs similarity index 100% rename from wadsrc/static/zscript/doom/stealthmonsters.txt rename to wadsrc/static/zscript/actors/doom/stealthmonsters.zs diff --git a/wadsrc/static/zscript/doom/weaponbfg.txt b/wadsrc/static/zscript/actors/doom/weaponbfg.zs similarity index 100% rename from wadsrc/static/zscript/doom/weaponbfg.txt rename to wadsrc/static/zscript/actors/doom/weaponbfg.zs diff --git a/wadsrc/static/zscript/doom/weaponchaingun.txt b/wadsrc/static/zscript/actors/doom/weaponchaingun.zs similarity index 100% rename from wadsrc/static/zscript/doom/weaponchaingun.txt rename to wadsrc/static/zscript/actors/doom/weaponchaingun.zs diff --git a/wadsrc/static/zscript/doom/weaponchainsaw.txt b/wadsrc/static/zscript/actors/doom/weaponchainsaw.zs similarity index 100% rename from wadsrc/static/zscript/doom/weaponchainsaw.txt rename to wadsrc/static/zscript/actors/doom/weaponchainsaw.zs diff --git a/wadsrc/static/zscript/doom/weaponfist.txt b/wadsrc/static/zscript/actors/doom/weaponfist.zs similarity index 100% rename from wadsrc/static/zscript/doom/weaponfist.txt rename to wadsrc/static/zscript/actors/doom/weaponfist.zs diff --git a/wadsrc/static/zscript/doom/weaponpistol.txt b/wadsrc/static/zscript/actors/doom/weaponpistol.zs similarity index 100% rename from wadsrc/static/zscript/doom/weaponpistol.txt rename to wadsrc/static/zscript/actors/doom/weaponpistol.zs diff --git a/wadsrc/static/zscript/doom/weaponplasma.txt b/wadsrc/static/zscript/actors/doom/weaponplasma.zs similarity index 100% rename from wadsrc/static/zscript/doom/weaponplasma.txt rename to wadsrc/static/zscript/actors/doom/weaponplasma.zs diff --git a/wadsrc/static/zscript/doom/weaponrlaunch.txt b/wadsrc/static/zscript/actors/doom/weaponrlaunch.zs similarity index 100% rename from wadsrc/static/zscript/doom/weaponrlaunch.txt rename to wadsrc/static/zscript/actors/doom/weaponrlaunch.zs diff --git a/wadsrc/static/zscript/doom/weaponshotgun.txt b/wadsrc/static/zscript/actors/doom/weaponshotgun.zs similarity index 100% rename from wadsrc/static/zscript/doom/weaponshotgun.txt rename to wadsrc/static/zscript/actors/doom/weaponshotgun.zs diff --git a/wadsrc/static/zscript/doom/weaponssg.txt b/wadsrc/static/zscript/actors/doom/weaponssg.zs similarity index 100% rename from wadsrc/static/zscript/doom/weaponssg.txt rename to wadsrc/static/zscript/actors/doom/weaponssg.zs diff --git a/wadsrc/static/zscript/heretic/beast.txt b/wadsrc/static/zscript/actors/heretic/beast.zs similarity index 100% rename from wadsrc/static/zscript/heretic/beast.txt rename to wadsrc/static/zscript/actors/heretic/beast.zs diff --git a/wadsrc/static/zscript/heretic/chicken.txt b/wadsrc/static/zscript/actors/heretic/chicken.zs similarity index 100% rename from wadsrc/static/zscript/heretic/chicken.txt rename to wadsrc/static/zscript/actors/heretic/chicken.zs diff --git a/wadsrc/static/zscript/heretic/clink.txt b/wadsrc/static/zscript/actors/heretic/clink.zs similarity index 100% rename from wadsrc/static/zscript/heretic/clink.txt rename to wadsrc/static/zscript/actors/heretic/clink.zs diff --git a/wadsrc/static/zscript/heretic/dsparil.txt b/wadsrc/static/zscript/actors/heretic/dsparil.zs similarity index 100% rename from wadsrc/static/zscript/heretic/dsparil.txt rename to wadsrc/static/zscript/actors/heretic/dsparil.zs diff --git a/wadsrc/static/zscript/heretic/hereticammo.txt b/wadsrc/static/zscript/actors/heretic/hereticammo.zs similarity index 100% rename from wadsrc/static/zscript/heretic/hereticammo.txt rename to wadsrc/static/zscript/actors/heretic/hereticammo.zs diff --git a/wadsrc/static/zscript/heretic/hereticarmor.txt b/wadsrc/static/zscript/actors/heretic/hereticarmor.zs similarity index 100% rename from wadsrc/static/zscript/heretic/hereticarmor.txt rename to wadsrc/static/zscript/actors/heretic/hereticarmor.zs diff --git a/wadsrc/static/zscript/heretic/hereticartifacts.txt b/wadsrc/static/zscript/actors/heretic/hereticartifacts.zs similarity index 100% rename from wadsrc/static/zscript/heretic/hereticartifacts.txt rename to wadsrc/static/zscript/actors/heretic/hereticartifacts.zs diff --git a/wadsrc/static/zscript/heretic/hereticdecorations.txt b/wadsrc/static/zscript/actors/heretic/hereticdecorations.zs similarity index 100% rename from wadsrc/static/zscript/heretic/hereticdecorations.txt rename to wadsrc/static/zscript/actors/heretic/hereticdecorations.zs diff --git a/wadsrc/static/zscript/heretic/hereticimp.txt b/wadsrc/static/zscript/actors/heretic/hereticimp.zs similarity index 100% rename from wadsrc/static/zscript/heretic/hereticimp.txt rename to wadsrc/static/zscript/actors/heretic/hereticimp.zs diff --git a/wadsrc/static/zscript/heretic/heretickeys.txt b/wadsrc/static/zscript/actors/heretic/heretickeys.zs similarity index 100% rename from wadsrc/static/zscript/heretic/heretickeys.txt rename to wadsrc/static/zscript/actors/heretic/heretickeys.zs diff --git a/wadsrc/static/zscript/heretic/hereticmisc.txt b/wadsrc/static/zscript/actors/heretic/hereticmisc.zs similarity index 100% rename from wadsrc/static/zscript/heretic/hereticmisc.txt rename to wadsrc/static/zscript/actors/heretic/hereticmisc.zs diff --git a/wadsrc/static/zscript/heretic/hereticplayer.txt b/wadsrc/static/zscript/actors/heretic/hereticplayer.zs similarity index 100% rename from wadsrc/static/zscript/heretic/hereticplayer.txt rename to wadsrc/static/zscript/actors/heretic/hereticplayer.zs diff --git a/wadsrc/static/zscript/heretic/ironlich.txt b/wadsrc/static/zscript/actors/heretic/ironlich.zs similarity index 100% rename from wadsrc/static/zscript/heretic/ironlich.txt rename to wadsrc/static/zscript/actors/heretic/ironlich.zs diff --git a/wadsrc/static/zscript/heretic/knight.txt b/wadsrc/static/zscript/actors/heretic/knight.zs similarity index 100% rename from wadsrc/static/zscript/heretic/knight.txt rename to wadsrc/static/zscript/actors/heretic/knight.zs diff --git a/wadsrc/static/zscript/heretic/mummy.txt b/wadsrc/static/zscript/actors/heretic/mummy.zs similarity index 100% rename from wadsrc/static/zscript/heretic/mummy.txt rename to wadsrc/static/zscript/actors/heretic/mummy.zs diff --git a/wadsrc/static/zscript/heretic/snake.txt b/wadsrc/static/zscript/actors/heretic/snake.zs similarity index 100% rename from wadsrc/static/zscript/heretic/snake.txt rename to wadsrc/static/zscript/actors/heretic/snake.zs diff --git a/wadsrc/static/zscript/heretic/weaponblaster.txt b/wadsrc/static/zscript/actors/heretic/weaponblaster.zs similarity index 100% rename from wadsrc/static/zscript/heretic/weaponblaster.txt rename to wadsrc/static/zscript/actors/heretic/weaponblaster.zs diff --git a/wadsrc/static/zscript/heretic/weaponcrossbow.txt b/wadsrc/static/zscript/actors/heretic/weaponcrossbow.zs similarity index 100% rename from wadsrc/static/zscript/heretic/weaponcrossbow.txt rename to wadsrc/static/zscript/actors/heretic/weaponcrossbow.zs diff --git a/wadsrc/static/zscript/heretic/weapongauntlets.txt b/wadsrc/static/zscript/actors/heretic/weapongauntlets.zs similarity index 100% rename from wadsrc/static/zscript/heretic/weapongauntlets.txt rename to wadsrc/static/zscript/actors/heretic/weapongauntlets.zs diff --git a/wadsrc/static/zscript/heretic/weaponmace.txt b/wadsrc/static/zscript/actors/heretic/weaponmace.zs similarity index 100% rename from wadsrc/static/zscript/heretic/weaponmace.txt rename to wadsrc/static/zscript/actors/heretic/weaponmace.zs diff --git a/wadsrc/static/zscript/heretic/weaponphoenix.txt b/wadsrc/static/zscript/actors/heretic/weaponphoenix.zs similarity index 100% rename from wadsrc/static/zscript/heretic/weaponphoenix.txt rename to wadsrc/static/zscript/actors/heretic/weaponphoenix.zs diff --git a/wadsrc/static/zscript/heretic/weaponskullrod.txt b/wadsrc/static/zscript/actors/heretic/weaponskullrod.zs similarity index 100% rename from wadsrc/static/zscript/heretic/weaponskullrod.txt rename to wadsrc/static/zscript/actors/heretic/weaponskullrod.zs diff --git a/wadsrc/static/zscript/heretic/weaponstaff.txt b/wadsrc/static/zscript/actors/heretic/weaponstaff.zs similarity index 100% rename from wadsrc/static/zscript/heretic/weaponstaff.txt rename to wadsrc/static/zscript/actors/heretic/weaponstaff.zs diff --git a/wadsrc/static/zscript/heretic/weaponwand.txt b/wadsrc/static/zscript/actors/heretic/weaponwand.zs similarity index 100% rename from wadsrc/static/zscript/heretic/weaponwand.txt rename to wadsrc/static/zscript/actors/heretic/weaponwand.zs diff --git a/wadsrc/static/zscript/heretic/wizard.txt b/wadsrc/static/zscript/actors/heretic/wizard.zs similarity index 100% rename from wadsrc/static/zscript/heretic/wizard.txt rename to wadsrc/static/zscript/actors/heretic/wizard.zs diff --git a/wadsrc/static/zscript/hexen/baseweapons.txt b/wadsrc/static/zscript/actors/hexen/baseweapons.zs similarity index 100% rename from wadsrc/static/zscript/hexen/baseweapons.txt rename to wadsrc/static/zscript/actors/hexen/baseweapons.zs diff --git a/wadsrc/static/zscript/hexen/bats.txt b/wadsrc/static/zscript/actors/hexen/bats.zs similarity index 100% rename from wadsrc/static/zscript/hexen/bats.txt rename to wadsrc/static/zscript/actors/hexen/bats.zs diff --git a/wadsrc/static/zscript/hexen/bishop.txt b/wadsrc/static/zscript/actors/hexen/bishop.zs similarity index 100% rename from wadsrc/static/zscript/hexen/bishop.txt rename to wadsrc/static/zscript/actors/hexen/bishop.zs diff --git a/wadsrc/static/zscript/hexen/blastradius.txt b/wadsrc/static/zscript/actors/hexen/blastradius.zs similarity index 100% rename from wadsrc/static/zscript/hexen/blastradius.txt rename to wadsrc/static/zscript/actors/hexen/blastradius.zs diff --git a/wadsrc/static/zscript/hexen/boostarmor.txt b/wadsrc/static/zscript/actors/hexen/boostarmor.zs similarity index 100% rename from wadsrc/static/zscript/hexen/boostarmor.txt rename to wadsrc/static/zscript/actors/hexen/boostarmor.zs diff --git a/wadsrc/static/zscript/hexen/centaur.txt b/wadsrc/static/zscript/actors/hexen/centaur.zs similarity index 100% rename from wadsrc/static/zscript/hexen/centaur.txt rename to wadsrc/static/zscript/actors/hexen/centaur.zs diff --git a/wadsrc/static/zscript/hexen/clericboss.txt b/wadsrc/static/zscript/actors/hexen/clericboss.zs similarity index 100% rename from wadsrc/static/zscript/hexen/clericboss.txt rename to wadsrc/static/zscript/actors/hexen/clericboss.zs diff --git a/wadsrc/static/zscript/hexen/clericflame.txt b/wadsrc/static/zscript/actors/hexen/clericflame.zs similarity index 100% rename from wadsrc/static/zscript/hexen/clericflame.txt rename to wadsrc/static/zscript/actors/hexen/clericflame.zs diff --git a/wadsrc/static/zscript/hexen/clericholy.txt b/wadsrc/static/zscript/actors/hexen/clericholy.zs similarity index 100% rename from wadsrc/static/zscript/hexen/clericholy.txt rename to wadsrc/static/zscript/actors/hexen/clericholy.zs diff --git a/wadsrc/static/zscript/hexen/clericmace.txt b/wadsrc/static/zscript/actors/hexen/clericmace.zs similarity index 100% rename from wadsrc/static/zscript/hexen/clericmace.txt rename to wadsrc/static/zscript/actors/hexen/clericmace.zs diff --git a/wadsrc/static/zscript/hexen/clericplayer.txt b/wadsrc/static/zscript/actors/hexen/clericplayer.zs similarity index 100% rename from wadsrc/static/zscript/hexen/clericplayer.txt rename to wadsrc/static/zscript/actors/hexen/clericplayer.zs diff --git a/wadsrc/static/zscript/hexen/clericstaff.txt b/wadsrc/static/zscript/actors/hexen/clericstaff.zs similarity index 100% rename from wadsrc/static/zscript/hexen/clericstaff.txt rename to wadsrc/static/zscript/actors/hexen/clericstaff.zs diff --git a/wadsrc/static/zscript/hexen/demons.txt b/wadsrc/static/zscript/actors/hexen/demons.zs similarity index 100% rename from wadsrc/static/zscript/hexen/demons.txt rename to wadsrc/static/zscript/actors/hexen/demons.zs diff --git a/wadsrc/static/zscript/hexen/dragon.txt b/wadsrc/static/zscript/actors/hexen/dragon.zs similarity index 100% rename from wadsrc/static/zscript/hexen/dragon.txt rename to wadsrc/static/zscript/actors/hexen/dragon.zs diff --git a/wadsrc/static/zscript/hexen/ettin.txt b/wadsrc/static/zscript/actors/hexen/ettin.zs similarity index 100% rename from wadsrc/static/zscript/hexen/ettin.txt rename to wadsrc/static/zscript/actors/hexen/ettin.zs diff --git a/wadsrc/static/zscript/hexen/fighteraxe.txt b/wadsrc/static/zscript/actors/hexen/fighteraxe.zs similarity index 100% rename from wadsrc/static/zscript/hexen/fighteraxe.txt rename to wadsrc/static/zscript/actors/hexen/fighteraxe.zs diff --git a/wadsrc/static/zscript/hexen/fighterboss.txt b/wadsrc/static/zscript/actors/hexen/fighterboss.zs similarity index 100% rename from wadsrc/static/zscript/hexen/fighterboss.txt rename to wadsrc/static/zscript/actors/hexen/fighterboss.zs diff --git a/wadsrc/static/zscript/hexen/fighterfist.txt b/wadsrc/static/zscript/actors/hexen/fighterfist.zs similarity index 100% rename from wadsrc/static/zscript/hexen/fighterfist.txt rename to wadsrc/static/zscript/actors/hexen/fighterfist.zs diff --git a/wadsrc/static/zscript/hexen/fighterhammer.txt b/wadsrc/static/zscript/actors/hexen/fighterhammer.zs similarity index 100% rename from wadsrc/static/zscript/hexen/fighterhammer.txt rename to wadsrc/static/zscript/actors/hexen/fighterhammer.zs diff --git a/wadsrc/static/zscript/hexen/fighterplayer.txt b/wadsrc/static/zscript/actors/hexen/fighterplayer.zs similarity index 100% rename from wadsrc/static/zscript/hexen/fighterplayer.txt rename to wadsrc/static/zscript/actors/hexen/fighterplayer.zs diff --git a/wadsrc/static/zscript/hexen/fighterquietus.txt b/wadsrc/static/zscript/actors/hexen/fighterquietus.zs similarity index 100% rename from wadsrc/static/zscript/hexen/fighterquietus.txt rename to wadsrc/static/zscript/actors/hexen/fighterquietus.zs diff --git a/wadsrc/static/zscript/hexen/firedemon.txt b/wadsrc/static/zscript/actors/hexen/firedemon.zs similarity index 100% rename from wadsrc/static/zscript/hexen/firedemon.txt rename to wadsrc/static/zscript/actors/hexen/firedemon.zs diff --git a/wadsrc/static/zscript/hexen/flame.txt b/wadsrc/static/zscript/actors/hexen/flame.zs similarity index 100% rename from wadsrc/static/zscript/hexen/flame.txt rename to wadsrc/static/zscript/actors/hexen/flame.zs diff --git a/wadsrc/static/zscript/hexen/flechette.txt b/wadsrc/static/zscript/actors/hexen/flechette.zs similarity index 100% rename from wadsrc/static/zscript/hexen/flechette.txt rename to wadsrc/static/zscript/actors/hexen/flechette.zs diff --git a/wadsrc/static/zscript/hexen/flies.txt b/wadsrc/static/zscript/actors/hexen/flies.zs similarity index 100% rename from wadsrc/static/zscript/hexen/flies.txt rename to wadsrc/static/zscript/actors/hexen/flies.zs diff --git a/wadsrc/static/zscript/hexen/fog.txt b/wadsrc/static/zscript/actors/hexen/fog.zs similarity index 100% rename from wadsrc/static/zscript/hexen/fog.txt rename to wadsrc/static/zscript/actors/hexen/fog.zs diff --git a/wadsrc/static/zscript/hexen/healingradius.txt b/wadsrc/static/zscript/actors/hexen/healingradius.zs similarity index 100% rename from wadsrc/static/zscript/hexen/healingradius.txt rename to wadsrc/static/zscript/actors/hexen/healingradius.zs diff --git a/wadsrc/static/zscript/hexen/heresiarch.txt b/wadsrc/static/zscript/actors/hexen/heresiarch.zs similarity index 100% rename from wadsrc/static/zscript/hexen/heresiarch.txt rename to wadsrc/static/zscript/actors/hexen/heresiarch.zs diff --git a/wadsrc/static/zscript/hexen/hexenarmor.txt b/wadsrc/static/zscript/actors/hexen/hexenarmor.zs similarity index 100% rename from wadsrc/static/zscript/hexen/hexenarmor.txt rename to wadsrc/static/zscript/actors/hexen/hexenarmor.zs diff --git a/wadsrc/static/zscript/hexen/hexendecorations.txt b/wadsrc/static/zscript/actors/hexen/hexendecorations.zs similarity index 100% rename from wadsrc/static/zscript/hexen/hexendecorations.txt rename to wadsrc/static/zscript/actors/hexen/hexendecorations.zs diff --git a/wadsrc/static/zscript/hexen/hexenkeys.txt b/wadsrc/static/zscript/actors/hexen/hexenkeys.zs similarity index 100% rename from wadsrc/static/zscript/hexen/hexenkeys.txt rename to wadsrc/static/zscript/actors/hexen/hexenkeys.zs diff --git a/wadsrc/static/zscript/hexen/hexenspecialdecs.txt b/wadsrc/static/zscript/actors/hexen/hexenspecialdecs.zs similarity index 100% rename from wadsrc/static/zscript/hexen/hexenspecialdecs.txt rename to wadsrc/static/zscript/actors/hexen/hexenspecialdecs.zs diff --git a/wadsrc/static/zscript/hexen/iceguy.txt b/wadsrc/static/zscript/actors/hexen/iceguy.zs similarity index 100% rename from wadsrc/static/zscript/hexen/iceguy.txt rename to wadsrc/static/zscript/actors/hexen/iceguy.zs diff --git a/wadsrc/static/zscript/hexen/korax.txt b/wadsrc/static/zscript/actors/hexen/korax.zs similarity index 100% rename from wadsrc/static/zscript/hexen/korax.txt rename to wadsrc/static/zscript/actors/hexen/korax.zs diff --git a/wadsrc/static/zscript/hexen/mageboss.txt b/wadsrc/static/zscript/actors/hexen/mageboss.zs similarity index 100% rename from wadsrc/static/zscript/hexen/mageboss.txt rename to wadsrc/static/zscript/actors/hexen/mageboss.zs diff --git a/wadsrc/static/zscript/hexen/magecone.txt b/wadsrc/static/zscript/actors/hexen/magecone.zs similarity index 100% rename from wadsrc/static/zscript/hexen/magecone.txt rename to wadsrc/static/zscript/actors/hexen/magecone.zs diff --git a/wadsrc/static/zscript/hexen/magelightning.txt b/wadsrc/static/zscript/actors/hexen/magelightning.zs similarity index 100% rename from wadsrc/static/zscript/hexen/magelightning.txt rename to wadsrc/static/zscript/actors/hexen/magelightning.zs diff --git a/wadsrc/static/zscript/hexen/mageplayer.txt b/wadsrc/static/zscript/actors/hexen/mageplayer.zs similarity index 100% rename from wadsrc/static/zscript/hexen/mageplayer.txt rename to wadsrc/static/zscript/actors/hexen/mageplayer.zs diff --git a/wadsrc/static/zscript/hexen/magestaff.txt b/wadsrc/static/zscript/actors/hexen/magestaff.zs similarity index 100% rename from wadsrc/static/zscript/hexen/magestaff.txt rename to wadsrc/static/zscript/actors/hexen/magestaff.zs diff --git a/wadsrc/static/zscript/hexen/magewand.txt b/wadsrc/static/zscript/actors/hexen/magewand.zs similarity index 100% rename from wadsrc/static/zscript/hexen/magewand.txt rename to wadsrc/static/zscript/actors/hexen/magewand.zs diff --git a/wadsrc/static/zscript/hexen/mana.txt b/wadsrc/static/zscript/actors/hexen/mana.zs similarity index 100% rename from wadsrc/static/zscript/hexen/mana.txt rename to wadsrc/static/zscript/actors/hexen/mana.zs diff --git a/wadsrc/static/zscript/hexen/pig.txt b/wadsrc/static/zscript/actors/hexen/pig.zs similarity index 100% rename from wadsrc/static/zscript/hexen/pig.txt rename to wadsrc/static/zscript/actors/hexen/pig.zs diff --git a/wadsrc/static/zscript/hexen/puzzleitems.txt b/wadsrc/static/zscript/actors/hexen/puzzleitems.zs similarity index 100% rename from wadsrc/static/zscript/hexen/puzzleitems.txt rename to wadsrc/static/zscript/actors/hexen/puzzleitems.zs diff --git a/wadsrc/static/zscript/hexen/scriptprojectiles.txt b/wadsrc/static/zscript/actors/hexen/scriptprojectiles.zs similarity index 100% rename from wadsrc/static/zscript/hexen/scriptprojectiles.txt rename to wadsrc/static/zscript/actors/hexen/scriptprojectiles.zs diff --git a/wadsrc/static/zscript/hexen/serpent.txt b/wadsrc/static/zscript/actors/hexen/serpent.zs similarity index 100% rename from wadsrc/static/zscript/hexen/serpent.txt rename to wadsrc/static/zscript/actors/hexen/serpent.zs diff --git a/wadsrc/static/zscript/hexen/speedboots.txt b/wadsrc/static/zscript/actors/hexen/speedboots.zs similarity index 100% rename from wadsrc/static/zscript/hexen/speedboots.txt rename to wadsrc/static/zscript/actors/hexen/speedboots.zs diff --git a/wadsrc/static/zscript/hexen/spike.txt b/wadsrc/static/zscript/actors/hexen/spike.zs similarity index 100% rename from wadsrc/static/zscript/hexen/spike.txt rename to wadsrc/static/zscript/actors/hexen/spike.zs diff --git a/wadsrc/static/zscript/hexen/summon.txt b/wadsrc/static/zscript/actors/hexen/summon.zs similarity index 100% rename from wadsrc/static/zscript/hexen/summon.txt rename to wadsrc/static/zscript/actors/hexen/summon.zs diff --git a/wadsrc/static/zscript/hexen/teleportother.txt b/wadsrc/static/zscript/actors/hexen/teleportother.zs similarity index 100% rename from wadsrc/static/zscript/hexen/teleportother.txt rename to wadsrc/static/zscript/actors/hexen/teleportother.zs diff --git a/wadsrc/static/zscript/hexen/wraith.txt b/wadsrc/static/zscript/actors/hexen/wraith.zs similarity index 100% rename from wadsrc/static/zscript/hexen/wraith.txt rename to wadsrc/static/zscript/actors/hexen/wraith.zs diff --git a/wadsrc/static/zscript/actor_interaction.txt b/wadsrc/static/zscript/actors/interaction.zs similarity index 100% rename from wadsrc/static/zscript/actor_interaction.txt rename to wadsrc/static/zscript/actors/interaction.zs diff --git a/wadsrc/static/zscript/inventory/ammo.txt b/wadsrc/static/zscript/actors/inventory/ammo.zs similarity index 100% rename from wadsrc/static/zscript/inventory/ammo.txt rename to wadsrc/static/zscript/actors/inventory/ammo.zs diff --git a/wadsrc/static/zscript/inventory/armor.txt b/wadsrc/static/zscript/actors/inventory/armor.zs similarity index 100% rename from wadsrc/static/zscript/inventory/armor.txt rename to wadsrc/static/zscript/actors/inventory/armor.zs diff --git a/wadsrc/static/zscript/inventory/health.txt b/wadsrc/static/zscript/actors/inventory/health.zs similarity index 100% rename from wadsrc/static/zscript/inventory/health.txt rename to wadsrc/static/zscript/actors/inventory/health.zs diff --git a/wadsrc/static/zscript/inventory/inv_misc.txt b/wadsrc/static/zscript/actors/inventory/inv_misc.zs similarity index 100% rename from wadsrc/static/zscript/inventory/inv_misc.txt rename to wadsrc/static/zscript/actors/inventory/inv_misc.zs diff --git a/wadsrc/static/zscript/inventory/inventory.txt b/wadsrc/static/zscript/actors/inventory/inventory.zs similarity index 100% rename from wadsrc/static/zscript/inventory/inventory.txt rename to wadsrc/static/zscript/actors/inventory/inventory.zs diff --git a/wadsrc/static/zscript/inventory/powerups.txt b/wadsrc/static/zscript/actors/inventory/powerups.zs similarity index 100% rename from wadsrc/static/zscript/inventory/powerups.txt rename to wadsrc/static/zscript/actors/inventory/powerups.zs diff --git a/wadsrc/static/zscript/inventory/stateprovider.txt b/wadsrc/static/zscript/actors/inventory/stateprovider.zs similarity index 100% rename from wadsrc/static/zscript/inventory/stateprovider.txt rename to wadsrc/static/zscript/actors/inventory/stateprovider.zs diff --git a/wadsrc/static/zscript/inventory/weaponpiece.txt b/wadsrc/static/zscript/actors/inventory/weaponpiece.zs similarity index 100% rename from wadsrc/static/zscript/inventory/weaponpiece.txt rename to wadsrc/static/zscript/actors/inventory/weaponpiece.zs diff --git a/wadsrc/static/zscript/inventory/weapons.txt b/wadsrc/static/zscript/actors/inventory/weapons.zs similarity index 100% rename from wadsrc/static/zscript/inventory/weapons.txt rename to wadsrc/static/zscript/actors/inventory/weapons.zs diff --git a/wadsrc/static/zscript/actor_inventory.txt b/wadsrc/static/zscript/actors/inventory_util.zs similarity index 100% rename from wadsrc/static/zscript/actor_inventory.txt rename to wadsrc/static/zscript/actors/inventory_util.zs diff --git a/wadsrc/static/zscript/actors/morph.zs b/wadsrc/static/zscript/actors/morph.zs new file mode 100644 index 0000000000..b48bb98d43 --- /dev/null +++ b/wadsrc/static/zscript/actors/morph.zs @@ -0,0 +1,146 @@ +//----------------------------------------------------------------------------- +// +// Copyright 1994-1996 Raven Software +// Copyright 1999-2016 Randy Heit +// Copyright 2002-2018 Christoph Oelckers +// Copyright 2005-2008 Martin Howe +// +// 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 3 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, see http://www.gnu.org/licenses/ +// +//----------------------------------------------------------------------------- +// + +extend class Actor +{ + virtual Actor, int, int MorphedDeath() + { + return null, 0, 0; + } + + + //=========================================================================== + // + // Main entry point + // + //=========================================================================== + + virtual bool Morph(Actor activator, class playerclass, class monsterclass, int duration = 0, int style = 0, class morphflash = null, classunmorphflash = null) + { + if (player != null && player.mo != null && playerclass != null) + { + return player.mo.MorphPlayer(activator? activator.player : null, playerclass, duration, style, morphflash, unmorphflash); + } + else + { + return MorphMonster(monsterclass, duration, style, morphflash, unmorphflash); + } + } + + //=========================================================================== + // + // Action function variant whose arguments differ from the generic one. + // + //=========================================================================== + + bool A_Morph(class type, int duration = 0, int style = 0, class morphflash = null, classunmorphflash = null) + { + if (self.player != null) + { + let playerclass = (class)(type); + if (playerclass && self.player.mo != null) return player.mo.MorphPlayer(self.player, playerclass, duration, style, morphflash, unmorphflash); + } + else + { + return MorphMonster(type, duration, style, morphflash, unmorphflash); + } + return false; + } + + //=========================================================================== + // + // Main entry point + // + //=========================================================================== + + virtual bool UnMorph(Actor activator, int flags, bool force) + { + if (player) + { + return player.mo.UndoPlayerMorph(activator? activator.player : null, flags, force); + } + else + { + let morphed = MorphedMonster(self); + if (morphed) + return morphed.UndoMonsterMorph(force); + } + return false; + } + + + //--------------------------------------------------------------------------- + // + // FUNC P_MorphMonster + // + // Returns true if the monster gets turned into a chicken/pig. + // + //--------------------------------------------------------------------------- + + virtual bool MorphMonster (Class spawntype, int duration, int style, Class enter_flash, Class exit_flash) + { + if (player || spawntype == NULL || bDontMorph || !bIsMonster || !(spawntype is 'MorphedMonster')) + { + return false; + } + + let morphed = MorphedMonster(Spawn (spawntype, Pos, NO_REPLACE)); + Substitute (morphed); + if ((style & MRF_TRANSFERTRANSLATION) && !morphed.bDontTranslate) + { + morphed.Translation = Translation; + } + morphed.ChangeTid(tid); + ChangeTid(0); + morphed.Angle = Angle; + morphed.UnmorphedMe = self; + morphed.Alpha = Alpha; + morphed.RenderStyle = RenderStyle; + morphed.Score = Score; + + morphed.UnmorphTime = level.time + ((duration) ? duration : DEFMORPHTICS) + random[morphmonst](); + morphed.MorphStyle = style; + morphed.MorphExitFlash = (exit_flash) ? exit_flash : (class)("TeleportFog"); + morphed.FlagsSave = bSolid * 2 + bShootable * 4 + bInvisible * 0x40; // The factors are for savegame compatibility + + morphed.special = special; + morphed.args[0] = args[0]; + morphed.args[1] = args[1]; + morphed.args[2] = args[2]; + morphed.args[3] = args[3]; + morphed.args[4] = args[4]; + morphed.CopyFriendliness (self, true); + morphed.bShadow |= bShadow; + morphed.bGhost |= bGhost; + special = 0; + bSolid = false; + bShootable = false; + bUnmorphed = true; + bInvisible = true; + let eflash = Spawn(enter_flash ? enter_flash : (class)("TeleportFog"), Pos + (0, 0, gameinfo.TELEFOGHEIGHT), ALLOW_REPLACE); + if (eflash) + eflash.target = morphed; + return true; + } +} + diff --git a/wadsrc/static/zscript/shared/player.txt b/wadsrc/static/zscript/actors/player/player.zs similarity index 100% rename from wadsrc/static/zscript/shared/player.txt rename to wadsrc/static/zscript/actors/player/player.zs diff --git a/wadsrc/static/zscript/shared/player_cheat.txt b/wadsrc/static/zscript/actors/player/player_cheat.zs similarity index 100% rename from wadsrc/static/zscript/shared/player_cheat.txt rename to wadsrc/static/zscript/actors/player/player_cheat.zs diff --git a/wadsrc/static/zscript/shared/player_inventory.txt b/wadsrc/static/zscript/actors/player/player_inventory.zs similarity index 100% rename from wadsrc/static/zscript/shared/player_inventory.txt rename to wadsrc/static/zscript/actors/player/player_inventory.zs diff --git a/wadsrc/static/zscript/shared/morph.txt b/wadsrc/static/zscript/actors/player/player_morph.zs similarity index 76% rename from wadsrc/static/zscript/shared/morph.txt rename to wadsrc/static/zscript/actors/player/player_morph.zs index 8aa33926e8..7921d1dce5 100644 --- a/wadsrc/static/zscript/shared/morph.txt +++ b/wadsrc/static/zscript/actors/player/player_morph.zs @@ -1,149 +1,3 @@ -//----------------------------------------------------------------------------- -// -// Copyright 1994-1996 Raven Software -// Copyright 1999-2016 Randy Heit -// Copyright 2002-2018 Christoph Oelckers -// Copyright 2005-2008 Martin Howe -// -// 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 3 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, see http://www.gnu.org/licenses/ -// -//----------------------------------------------------------------------------- -// - -extend class Actor -{ - virtual Actor, int, int MorphedDeath() - { - return null, 0, 0; - } - - - //=========================================================================== - // - // Main entry point - // - //=========================================================================== - - virtual bool Morph(Actor activator, class playerclass, class monsterclass, int duration = 0, int style = 0, class morphflash = null, classunmorphflash = null) - { - if (player != null && player.mo != null && playerclass != null) - { - return player.mo.MorphPlayer(activator? activator.player : null, playerclass, duration, style, morphflash, unmorphflash); - } - else - { - return MorphMonster(monsterclass, duration, style, morphflash, unmorphflash); - } - } - - //=========================================================================== - // - // Action function variant whose arguments differ from the generic one. - // - //=========================================================================== - - bool A_Morph(class type, int duration = 0, int style = 0, class morphflash = null, classunmorphflash = null) - { - if (self.player != null) - { - let playerclass = (class)(type); - if (playerclass && self.player.mo != null) return player.mo.MorphPlayer(self.player, playerclass, duration, style, morphflash, unmorphflash); - } - else - { - return MorphMonster(type, duration, style, morphflash, unmorphflash); - } - return false; - } - - //=========================================================================== - // - // Main entry point - // - //=========================================================================== - - virtual bool UnMorph(Actor activator, int flags, bool force) - { - if (player) - { - return player.mo.UndoPlayerMorph(activator? activator.player : null, flags, force); - } - else - { - let morphed = MorphedMonster(self); - if (morphed) - return morphed.UndoMonsterMorph(force); - } - return false; - } - - - //--------------------------------------------------------------------------- - // - // FUNC P_MorphMonster - // - // Returns true if the monster gets turned into a chicken/pig. - // - //--------------------------------------------------------------------------- - - virtual bool MorphMonster (Class spawntype, int duration, int style, Class enter_flash, Class exit_flash) - { - if (player || spawntype == NULL || bDontMorph || !bIsMonster || !(spawntype is 'MorphedMonster')) - { - return false; - } - - let morphed = MorphedMonster(Spawn (spawntype, Pos, NO_REPLACE)); - Substitute (morphed); - if ((style & MRF_TRANSFERTRANSLATION) && !morphed.bDontTranslate) - { - morphed.Translation = Translation; - } - morphed.ChangeTid(tid); - ChangeTid(0); - morphed.Angle = Angle; - morphed.UnmorphedMe = self; - morphed.Alpha = Alpha; - morphed.RenderStyle = RenderStyle; - morphed.Score = Score; - - morphed.UnmorphTime = level.time + ((duration) ? duration : DEFMORPHTICS) + random[morphmonst](); - morphed.MorphStyle = style; - morphed.MorphExitFlash = (exit_flash) ? exit_flash : (class)("TeleportFog"); - morphed.FlagsSave = bSolid * 2 + bShootable * 4 + bInvisible * 0x40; // The factors are for savegame compatibility - - morphed.special = special; - morphed.args[0] = args[0]; - morphed.args[1] = args[1]; - morphed.args[2] = args[2]; - morphed.args[3] = args[3]; - morphed.args[4] = args[4]; - morphed.CopyFriendliness (self, true); - morphed.bShadow |= bShadow; - morphed.bGhost |= bGhost; - special = 0; - bSolid = false; - bShootable = false; - bUnmorphed = true; - bInvisible = true; - let eflash = Spawn(enter_flash ? enter_flash : (class)("TeleportFog"), Pos + (0, 0, gameinfo.TELEFOGHEIGHT), ALLOW_REPLACE); - if (eflash) - eflash.target = morphed; - return true; - } -} - extend class PlayerPawn { //=========================================================================== diff --git a/wadsrc/static/zscript/raven/artiegg.txt b/wadsrc/static/zscript/actors/raven/artiegg.zs similarity index 100% rename from wadsrc/static/zscript/raven/artiegg.txt rename to wadsrc/static/zscript/actors/raven/artiegg.zs diff --git a/wadsrc/static/zscript/raven/artitele.txt b/wadsrc/static/zscript/actors/raven/artitele.zs similarity index 100% rename from wadsrc/static/zscript/raven/artitele.txt rename to wadsrc/static/zscript/actors/raven/artitele.zs diff --git a/wadsrc/static/zscript/raven/minotaur.txt b/wadsrc/static/zscript/actors/raven/minotaur.zs similarity index 100% rename from wadsrc/static/zscript/raven/minotaur.txt rename to wadsrc/static/zscript/actors/raven/minotaur.zs diff --git a/wadsrc/static/zscript/raven/ravenambient.txt b/wadsrc/static/zscript/actors/raven/ravenambient.zs similarity index 100% rename from wadsrc/static/zscript/raven/ravenambient.txt rename to wadsrc/static/zscript/actors/raven/ravenambient.zs diff --git a/wadsrc/static/zscript/raven/ravenartifacts.txt b/wadsrc/static/zscript/actors/raven/ravenartifacts.zs similarity index 100% rename from wadsrc/static/zscript/raven/ravenartifacts.txt rename to wadsrc/static/zscript/actors/raven/ravenartifacts.zs diff --git a/wadsrc/static/zscript/raven/ravenhealth.txt b/wadsrc/static/zscript/actors/raven/ravenhealth.zs similarity index 100% rename from wadsrc/static/zscript/raven/ravenhealth.txt rename to wadsrc/static/zscript/actors/raven/ravenhealth.zs diff --git a/wadsrc/static/zscript/shared/blood.txt b/wadsrc/static/zscript/actors/shared/blood.zs similarity index 100% rename from wadsrc/static/zscript/shared/blood.txt rename to wadsrc/static/zscript/actors/shared/blood.zs diff --git a/wadsrc/static/zscript/shared/botstuff.txt b/wadsrc/static/zscript/actors/shared/botstuff.zs similarity index 100% rename from wadsrc/static/zscript/shared/botstuff.txt rename to wadsrc/static/zscript/actors/shared/botstuff.zs diff --git a/wadsrc/static/zscript/shared/bridge.txt b/wadsrc/static/zscript/actors/shared/bridge.zs similarity index 100% rename from wadsrc/static/zscript/shared/bridge.txt rename to wadsrc/static/zscript/actors/shared/bridge.zs diff --git a/wadsrc/static/zscript/shared/camera.txt b/wadsrc/static/zscript/actors/shared/camera.zs similarity index 100% rename from wadsrc/static/zscript/shared/camera.txt rename to wadsrc/static/zscript/actors/shared/camera.zs diff --git a/wadsrc/static/zscript/shared/debris.txt b/wadsrc/static/zscript/actors/shared/debris.zs similarity index 100% rename from wadsrc/static/zscript/shared/debris.txt rename to wadsrc/static/zscript/actors/shared/debris.zs diff --git a/wadsrc/static/zscript/shared/decal.txt b/wadsrc/static/zscript/actors/shared/decal.zs similarity index 100% rename from wadsrc/static/zscript/shared/decal.txt rename to wadsrc/static/zscript/actors/shared/decal.zs diff --git a/wadsrc/static/zscript/shared/dog.txt b/wadsrc/static/zscript/actors/shared/dog.zs similarity index 100% rename from wadsrc/static/zscript/shared/dog.txt rename to wadsrc/static/zscript/actors/shared/dog.zs diff --git a/wadsrc/static/zscript/shared/dynlights.txt b/wadsrc/static/zscript/actors/shared/dynlights.zs similarity index 100% rename from wadsrc/static/zscript/shared/dynlights.txt rename to wadsrc/static/zscript/actors/shared/dynlights.zs diff --git a/wadsrc/static/zscript/shared/fastprojectile.txt b/wadsrc/static/zscript/actors/shared/fastprojectile.zs similarity index 100% rename from wadsrc/static/zscript/shared/fastprojectile.txt rename to wadsrc/static/zscript/actors/shared/fastprojectile.zs diff --git a/wadsrc/static/zscript/shared/fountain.txt b/wadsrc/static/zscript/actors/shared/fountain.zs similarity index 100% rename from wadsrc/static/zscript/shared/fountain.txt rename to wadsrc/static/zscript/actors/shared/fountain.zs diff --git a/wadsrc/static/zscript/shared/hatetarget.txt b/wadsrc/static/zscript/actors/shared/hatetarget.zs similarity index 100% rename from wadsrc/static/zscript/shared/hatetarget.txt rename to wadsrc/static/zscript/actors/shared/hatetarget.zs diff --git a/wadsrc/static/zscript/shared/ice.txt b/wadsrc/static/zscript/actors/shared/ice.zs similarity index 100% rename from wadsrc/static/zscript/shared/ice.txt rename to wadsrc/static/zscript/actors/shared/ice.zs diff --git a/wadsrc/static/zscript/shared/itemeffects.txt b/wadsrc/static/zscript/actors/shared/itemeffects.zs similarity index 100% rename from wadsrc/static/zscript/shared/itemeffects.txt rename to wadsrc/static/zscript/actors/shared/itemeffects.zs diff --git a/wadsrc/static/zscript/shared/mapmarker.txt b/wadsrc/static/zscript/actors/shared/mapmarker.zs similarity index 100% rename from wadsrc/static/zscript/shared/mapmarker.txt rename to wadsrc/static/zscript/actors/shared/mapmarker.zs diff --git a/wadsrc/static/zscript/shared/movingcamera.txt b/wadsrc/static/zscript/actors/shared/movingcamera.zs similarity index 100% rename from wadsrc/static/zscript/shared/movingcamera.txt rename to wadsrc/static/zscript/actors/shared/movingcamera.zs diff --git a/wadsrc/static/zscript/shared/randomspawner.txt b/wadsrc/static/zscript/actors/shared/randomspawner.zs similarity index 100% rename from wadsrc/static/zscript/shared/randomspawner.txt rename to wadsrc/static/zscript/actors/shared/randomspawner.zs diff --git a/wadsrc/static/zscript/shared/secrettrigger.txt b/wadsrc/static/zscript/actors/shared/secrettrigger.zs similarity index 100% rename from wadsrc/static/zscript/shared/secrettrigger.txt rename to wadsrc/static/zscript/actors/shared/secrettrigger.zs diff --git a/wadsrc/static/zscript/shared/sectoraction.txt b/wadsrc/static/zscript/actors/shared/sectoraction.zs similarity index 100% rename from wadsrc/static/zscript/shared/sectoraction.txt rename to wadsrc/static/zscript/actors/shared/sectoraction.zs diff --git a/wadsrc/static/zscript/shared/setcolor.txt b/wadsrc/static/zscript/actors/shared/setcolor.zs similarity index 100% rename from wadsrc/static/zscript/shared/setcolor.txt rename to wadsrc/static/zscript/actors/shared/setcolor.zs diff --git a/wadsrc/static/zscript/shared/sharedmisc.txt b/wadsrc/static/zscript/actors/shared/sharedmisc.zs similarity index 100% rename from wadsrc/static/zscript/shared/sharedmisc.txt rename to wadsrc/static/zscript/actors/shared/sharedmisc.zs diff --git a/wadsrc/static/zscript/shared/skies.txt b/wadsrc/static/zscript/actors/shared/skies.zs similarity index 100% rename from wadsrc/static/zscript/shared/skies.txt rename to wadsrc/static/zscript/actors/shared/skies.zs diff --git a/wadsrc/static/zscript/shared/soundenvironment.txt b/wadsrc/static/zscript/actors/shared/soundenvironment.zs similarity index 100% rename from wadsrc/static/zscript/shared/soundenvironment.txt rename to wadsrc/static/zscript/actors/shared/soundenvironment.zs diff --git a/wadsrc/static/zscript/shared/soundsequence.txt b/wadsrc/static/zscript/actors/shared/soundsequence.zs similarity index 100% rename from wadsrc/static/zscript/shared/soundsequence.txt rename to wadsrc/static/zscript/actors/shared/soundsequence.zs diff --git a/wadsrc/static/zscript/shared/spark.txt b/wadsrc/static/zscript/actors/shared/spark.zs similarity index 100% rename from wadsrc/static/zscript/shared/spark.txt rename to wadsrc/static/zscript/actors/shared/spark.zs diff --git a/wadsrc/static/zscript/shared/specialspot.txt b/wadsrc/static/zscript/actors/shared/specialspot.zs similarity index 100% rename from wadsrc/static/zscript/shared/specialspot.txt rename to wadsrc/static/zscript/actors/shared/specialspot.zs diff --git a/wadsrc/static/zscript/shared/splashes.txt b/wadsrc/static/zscript/actors/shared/splashes.zs similarity index 100% rename from wadsrc/static/zscript/shared/splashes.txt rename to wadsrc/static/zscript/actors/shared/splashes.zs diff --git a/wadsrc/static/zscript/shared/teleport.txt b/wadsrc/static/zscript/actors/shared/teleport.zs similarity index 100% rename from wadsrc/static/zscript/shared/teleport.txt rename to wadsrc/static/zscript/actors/shared/teleport.zs diff --git a/wadsrc/static/zscript/shared/waterzone.txt b/wadsrc/static/zscript/actors/shared/waterzone.zs similarity index 100% rename from wadsrc/static/zscript/shared/waterzone.txt rename to wadsrc/static/zscript/actors/shared/waterzone.zs diff --git a/wadsrc/static/zscript/strife/acolyte.txt b/wadsrc/static/zscript/actors/strife/acolyte.zs similarity index 100% rename from wadsrc/static/zscript/strife/acolyte.txt rename to wadsrc/static/zscript/actors/strife/acolyte.zs diff --git a/wadsrc/static/zscript/strife/alienspectres.txt b/wadsrc/static/zscript/actors/strife/alienspectres.zs similarity index 100% rename from wadsrc/static/zscript/strife/alienspectres.txt rename to wadsrc/static/zscript/actors/strife/alienspectres.zs diff --git a/wadsrc/static/zscript/strife/beggars.txt b/wadsrc/static/zscript/actors/strife/beggars.zs similarity index 100% rename from wadsrc/static/zscript/strife/beggars.txt rename to wadsrc/static/zscript/actors/strife/beggars.zs diff --git a/wadsrc/static/zscript/strife/coin.txt b/wadsrc/static/zscript/actors/strife/coin.zs similarity index 100% rename from wadsrc/static/zscript/strife/coin.txt rename to wadsrc/static/zscript/actors/strife/coin.zs diff --git a/wadsrc/static/zscript/strife/crusader.txt b/wadsrc/static/zscript/actors/strife/crusader.zs similarity index 100% rename from wadsrc/static/zscript/strife/crusader.txt rename to wadsrc/static/zscript/actors/strife/crusader.zs diff --git a/wadsrc/static/zscript/strife/entityboss.txt b/wadsrc/static/zscript/actors/strife/entityboss.zs similarity index 100% rename from wadsrc/static/zscript/strife/entityboss.txt rename to wadsrc/static/zscript/actors/strife/entityboss.zs diff --git a/wadsrc/static/zscript/strife/inquisitor.txt b/wadsrc/static/zscript/actors/strife/inquisitor.zs similarity index 100% rename from wadsrc/static/zscript/strife/inquisitor.txt rename to wadsrc/static/zscript/actors/strife/inquisitor.zs diff --git a/wadsrc/static/zscript/strife/klaxon.txt b/wadsrc/static/zscript/actors/strife/klaxon.zs similarity index 100% rename from wadsrc/static/zscript/strife/klaxon.txt rename to wadsrc/static/zscript/actors/strife/klaxon.zs diff --git a/wadsrc/static/zscript/strife/loremaster.txt b/wadsrc/static/zscript/actors/strife/loremaster.zs similarity index 100% rename from wadsrc/static/zscript/strife/loremaster.txt rename to wadsrc/static/zscript/actors/strife/loremaster.zs diff --git a/wadsrc/static/zscript/strife/macil.txt b/wadsrc/static/zscript/actors/strife/macil.zs similarity index 100% rename from wadsrc/static/zscript/strife/macil.txt rename to wadsrc/static/zscript/actors/strife/macil.zs diff --git a/wadsrc/static/zscript/strife/merchants.txt b/wadsrc/static/zscript/actors/strife/merchants.zs similarity index 100% rename from wadsrc/static/zscript/strife/merchants.txt rename to wadsrc/static/zscript/actors/strife/merchants.zs diff --git a/wadsrc/static/zscript/strife/oracle.txt b/wadsrc/static/zscript/actors/strife/oracle.zs similarity index 100% rename from wadsrc/static/zscript/strife/oracle.txt rename to wadsrc/static/zscript/actors/strife/oracle.zs diff --git a/wadsrc/static/zscript/strife/peasants.txt b/wadsrc/static/zscript/actors/strife/peasants.zs similarity index 100% rename from wadsrc/static/zscript/strife/peasants.txt rename to wadsrc/static/zscript/actors/strife/peasants.zs diff --git a/wadsrc/static/zscript/strife/programmer.txt b/wadsrc/static/zscript/actors/strife/programmer.zs similarity index 100% rename from wadsrc/static/zscript/strife/programmer.txt rename to wadsrc/static/zscript/actors/strife/programmer.zs diff --git a/wadsrc/static/zscript/strife/questitems.txt b/wadsrc/static/zscript/actors/strife/questitems.zs similarity index 100% rename from wadsrc/static/zscript/strife/questitems.txt rename to wadsrc/static/zscript/actors/strife/questitems.zs diff --git a/wadsrc/static/zscript/strife/ratbuddy.txt b/wadsrc/static/zscript/actors/strife/ratbuddy.zs similarity index 100% rename from wadsrc/static/zscript/strife/ratbuddy.txt rename to wadsrc/static/zscript/actors/strife/ratbuddy.zs diff --git a/wadsrc/static/zscript/strife/reaver.txt b/wadsrc/static/zscript/actors/strife/reaver.zs similarity index 100% rename from wadsrc/static/zscript/strife/reaver.txt rename to wadsrc/static/zscript/actors/strife/reaver.zs diff --git a/wadsrc/static/zscript/strife/rebels.txt b/wadsrc/static/zscript/actors/strife/rebels.zs similarity index 100% rename from wadsrc/static/zscript/strife/rebels.txt rename to wadsrc/static/zscript/actors/strife/rebels.zs diff --git a/wadsrc/static/zscript/strife/sentinel.txt b/wadsrc/static/zscript/actors/strife/sentinel.zs similarity index 100% rename from wadsrc/static/zscript/strife/sentinel.txt rename to wadsrc/static/zscript/actors/strife/sentinel.zs diff --git a/wadsrc/static/zscript/strife/sigil.txt b/wadsrc/static/zscript/actors/strife/sigil.zs similarity index 100% rename from wadsrc/static/zscript/strife/sigil.txt rename to wadsrc/static/zscript/actors/strife/sigil.zs diff --git a/wadsrc/static/zscript/strife/spectral.txt b/wadsrc/static/zscript/actors/strife/spectral.zs similarity index 100% rename from wadsrc/static/zscript/strife/spectral.txt rename to wadsrc/static/zscript/actors/strife/spectral.zs diff --git a/wadsrc/static/zscript/strife/stalker.txt b/wadsrc/static/zscript/actors/strife/stalker.zs similarity index 100% rename from wadsrc/static/zscript/strife/stalker.txt rename to wadsrc/static/zscript/actors/strife/stalker.zs diff --git a/wadsrc/static/zscript/strife/strifeammo.txt b/wadsrc/static/zscript/actors/strife/strifeammo.zs similarity index 100% rename from wadsrc/static/zscript/strife/strifeammo.txt rename to wadsrc/static/zscript/actors/strife/strifeammo.zs diff --git a/wadsrc/static/zscript/strife/strifearmor.txt b/wadsrc/static/zscript/actors/strife/strifearmor.zs similarity index 100% rename from wadsrc/static/zscript/strife/strifearmor.txt rename to wadsrc/static/zscript/actors/strife/strifearmor.zs diff --git a/wadsrc/static/zscript/strife/strifebishop.txt b/wadsrc/static/zscript/actors/strife/strifebishop.zs similarity index 100% rename from wadsrc/static/zscript/strife/strifebishop.txt rename to wadsrc/static/zscript/actors/strife/strifebishop.zs diff --git a/wadsrc/static/zscript/strife/strifefunctions.txt b/wadsrc/static/zscript/actors/strife/strifefunctions.zs similarity index 100% rename from wadsrc/static/zscript/strife/strifefunctions.txt rename to wadsrc/static/zscript/actors/strife/strifefunctions.zs diff --git a/wadsrc/static/zscript/strife/strifehumanoid.txt b/wadsrc/static/zscript/actors/strife/strifehumanoid.zs similarity index 100% rename from wadsrc/static/zscript/strife/strifehumanoid.txt rename to wadsrc/static/zscript/actors/strife/strifehumanoid.zs diff --git a/wadsrc/static/zscript/strife/strifeitems.txt b/wadsrc/static/zscript/actors/strife/strifeitems.zs similarity index 100% rename from wadsrc/static/zscript/strife/strifeitems.txt rename to wadsrc/static/zscript/actors/strife/strifeitems.zs diff --git a/wadsrc/static/zscript/strife/strifekeys.txt b/wadsrc/static/zscript/actors/strife/strifekeys.zs similarity index 100% rename from wadsrc/static/zscript/strife/strifekeys.txt rename to wadsrc/static/zscript/actors/strife/strifekeys.zs diff --git a/wadsrc/static/zscript/strife/strifeplayer.txt b/wadsrc/static/zscript/actors/strife/strifeplayer.zs similarity index 100% rename from wadsrc/static/zscript/strife/strifeplayer.txt rename to wadsrc/static/zscript/actors/strife/strifeplayer.zs diff --git a/wadsrc/static/zscript/strife/strifestuff.txt b/wadsrc/static/zscript/actors/strife/strifestuff.zs similarity index 100% rename from wadsrc/static/zscript/strife/strifestuff.txt rename to wadsrc/static/zscript/actors/strife/strifestuff.zs diff --git a/wadsrc/static/zscript/strife/strifeweapons.txt b/wadsrc/static/zscript/actors/strife/strifeweapons.zs similarity index 100% rename from wadsrc/static/zscript/strife/strifeweapons.txt rename to wadsrc/static/zscript/actors/strife/strifeweapons.zs diff --git a/wadsrc/static/zscript/strife/svelights.txt b/wadsrc/static/zscript/actors/strife/svelights.zs similarity index 100% rename from wadsrc/static/zscript/strife/svelights.txt rename to wadsrc/static/zscript/actors/strife/svelights.zs diff --git a/wadsrc/static/zscript/strife/svestuff.txt b/wadsrc/static/zscript/actors/strife/svestuff.zs similarity index 100% rename from wadsrc/static/zscript/strife/svestuff.txt rename to wadsrc/static/zscript/actors/strife/svestuff.zs diff --git a/wadsrc/static/zscript/strife/templar.txt b/wadsrc/static/zscript/actors/strife/templar.zs similarity index 100% rename from wadsrc/static/zscript/strife/templar.txt rename to wadsrc/static/zscript/actors/strife/templar.zs diff --git a/wadsrc/static/zscript/strife/thingstoblowup.txt b/wadsrc/static/zscript/actors/strife/thingstoblowup.zs similarity index 100% rename from wadsrc/static/zscript/strife/thingstoblowup.txt rename to wadsrc/static/zscript/actors/strife/thingstoblowup.zs diff --git a/wadsrc/static/zscript/strife/weaponassault.txt b/wadsrc/static/zscript/actors/strife/weaponassault.zs similarity index 100% rename from wadsrc/static/zscript/strife/weaponassault.txt rename to wadsrc/static/zscript/actors/strife/weaponassault.zs diff --git a/wadsrc/static/zscript/strife/weaponcrossbow.txt b/wadsrc/static/zscript/actors/strife/weaponcrossbow.zs similarity index 100% rename from wadsrc/static/zscript/strife/weaponcrossbow.txt rename to wadsrc/static/zscript/actors/strife/weaponcrossbow.zs diff --git a/wadsrc/static/zscript/strife/weapondagger.txt b/wadsrc/static/zscript/actors/strife/weapondagger.zs similarity index 100% rename from wadsrc/static/zscript/strife/weapondagger.txt rename to wadsrc/static/zscript/actors/strife/weapondagger.zs diff --git a/wadsrc/static/zscript/strife/weaponflamer.txt b/wadsrc/static/zscript/actors/strife/weaponflamer.zs similarity index 100% rename from wadsrc/static/zscript/strife/weaponflamer.txt rename to wadsrc/static/zscript/actors/strife/weaponflamer.zs diff --git a/wadsrc/static/zscript/strife/weapongrenade.txt b/wadsrc/static/zscript/actors/strife/weapongrenade.zs similarity index 100% rename from wadsrc/static/zscript/strife/weapongrenade.txt rename to wadsrc/static/zscript/actors/strife/weapongrenade.zs diff --git a/wadsrc/static/zscript/strife/weaponmauler.txt b/wadsrc/static/zscript/actors/strife/weaponmauler.zs similarity index 100% rename from wadsrc/static/zscript/strife/weaponmauler.txt rename to wadsrc/static/zscript/actors/strife/weaponmauler.zs diff --git a/wadsrc/static/zscript/strife/weaponmissile.txt b/wadsrc/static/zscript/actors/strife/weaponmissile.zs similarity index 100% rename from wadsrc/static/zscript/strife/weaponmissile.txt rename to wadsrc/static/zscript/actors/strife/weaponmissile.zs diff --git a/wadsrc/static/zscript/strife/zombie.txt b/wadsrc/static/zscript/actors/strife/zombie.zs similarity index 100% rename from wadsrc/static/zscript/strife/zombie.txt rename to wadsrc/static/zscript/actors/strife/zombie.zs diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.zs similarity index 99% rename from wadsrc/static/zscript/base.txt rename to wadsrc/static/zscript/base.zs index be73e3f4df..6841ce6bd0 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.zs @@ -80,7 +80,8 @@ struct TexMan ReturnFirst = 4, AllowSkins = 8, ShortNameOnly = 16, - DontCreate = 32 + DontCreate = 32, + Localize = 64 }; enum ETexReplaceFlags @@ -104,6 +105,7 @@ struct TexMan native static Vector2 GetScaledSize(TextureID tex); native static Vector2 GetScaledOffset(TextureID tex); native static int CheckRealHeight(TextureID tex); + native static bool OkForLocalization(TextureID patch, String textSubstitute); native static void SetCameraToTexture(Actor viewpoint, String texture, double fov); } @@ -894,6 +896,8 @@ struct StringStruct native native int ToInt(int base = 0) const; native double ToDouble() const; native void Split(out Array tokens, String delimiter, EmptyTokenType keepEmpty = TOK_KEEPEMPTY) const; + native void AppendCharacter(int c); + native void DeleteLastCharacter(); } class SectorEffect : Thinker native diff --git a/wadsrc/static/zscript/compatibility.txt b/wadsrc/static/zscript/compatibility.zs similarity index 100% rename from wadsrc/static/zscript/compatibility.txt rename to wadsrc/static/zscript/compatibility.zs diff --git a/wadsrc/static/zscript/constants.txt b/wadsrc/static/zscript/constants.zs similarity index 99% rename from wadsrc/static/zscript/constants.txt rename to wadsrc/static/zscript/constants.zs index 0df0174859..6ac2ddc273 100644 --- a/wadsrc/static/zscript/constants.txt +++ b/wadsrc/static/zscript/constants.zs @@ -1,7 +1,6 @@ // for flag changer functions. const FLAG_NO_CHANGE = -1; const MAXPLAYERS = 8; -const MAXPLAYERNAME = 15; enum EStateUseFlags { diff --git a/wadsrc/static/zscript/destructible.txt b/wadsrc/static/zscript/destructible.zs old mode 100755 new mode 100644 similarity index 100% rename from wadsrc/static/zscript/destructible.txt rename to wadsrc/static/zscript/destructible.zs diff --git a/wadsrc/static/zscript/dynarrays.txt b/wadsrc/static/zscript/dynarrays.zs similarity index 100% rename from wadsrc/static/zscript/dynarrays.txt rename to wadsrc/static/zscript/dynarrays.zs diff --git a/wadsrc/static/zscript/events.txt b/wadsrc/static/zscript/events.zs old mode 100755 new mode 100644 similarity index 100% rename from wadsrc/static/zscript/events.txt rename to wadsrc/static/zscript/events.zs diff --git a/wadsrc/static/zscript/level_compatibility.txt b/wadsrc/static/zscript/level_compatibility.zs similarity index 100% rename from wadsrc/static/zscript/level_compatibility.txt rename to wadsrc/static/zscript/level_compatibility.zs diff --git a/wadsrc/static/zscript/mapdata.txt b/wadsrc/static/zscript/mapdata.zs similarity index 100% rename from wadsrc/static/zscript/mapdata.txt rename to wadsrc/static/zscript/mapdata.zs diff --git a/wadsrc/static/zscript/scriptutil/scriptutil.txt b/wadsrc/static/zscript/scriptutil/scriptutil.zs similarity index 100% rename from wadsrc/static/zscript/scriptutil/scriptutil.txt rename to wadsrc/static/zscript/scriptutil/scriptutil.zs diff --git a/wadsrc/static/zscript/sounddata.txt b/wadsrc/static/zscript/sounddata.zs similarity index 100% rename from wadsrc/static/zscript/sounddata.txt rename to wadsrc/static/zscript/sounddata.zs diff --git a/wadsrc/static/zscript/menu/colorpickermenu.txt b/wadsrc/static/zscript/ui/menu/colorpickermenu.zs similarity index 100% rename from wadsrc/static/zscript/menu/colorpickermenu.txt rename to wadsrc/static/zscript/ui/menu/colorpickermenu.zs diff --git a/wadsrc/static/zscript/menu/conversationmenu.txt b/wadsrc/static/zscript/ui/menu/conversationmenu.zs similarity index 98% rename from wadsrc/static/zscript/menu/conversationmenu.txt rename to wadsrc/static/zscript/ui/menu/conversationmenu.zs index 02201a0ddf..dccfc65662 100644 --- a/wadsrc/static/zscript/menu/conversationmenu.txt +++ b/wadsrc/static/zscript/ui/menu/conversationmenu.zs @@ -137,8 +137,12 @@ class ConversationMenu : Menu mShowGold |= reply.NeedsGold; let ReplyText = Stringtable.Localize(reply.Reply); - if (reply.NeedsGold) ReplyText.AppendFormat(Stringtable.Localize("$TXT_TRADE"), reply.PrintAmount); - + if (reply.NeedsGold) + { + let trade = Stringtable.Localize("$TXT_TRADE"); + let amount = String.Format("%u", reply.PrintAmount); + trade.Replace("%u", amount); + } let ReplyLines = SmallFont.BreakLines (ReplyText, ReplyWidth); mResponses.Push(mResponseLines.Size()); diff --git a/wadsrc/static/zscript/menu/joystickmenu.txt b/wadsrc/static/zscript/ui/menu/joystickmenu.zs similarity index 100% rename from wadsrc/static/zscript/menu/joystickmenu.txt rename to wadsrc/static/zscript/ui/menu/joystickmenu.zs diff --git a/wadsrc/static/zscript/menu/listmenu.txt b/wadsrc/static/zscript/ui/menu/listmenu.zs similarity index 100% rename from wadsrc/static/zscript/menu/listmenu.txt rename to wadsrc/static/zscript/ui/menu/listmenu.zs diff --git a/wadsrc/static/zscript/menu/listmenuitems.txt b/wadsrc/static/zscript/ui/menu/listmenuitems.zs similarity index 87% rename from wadsrc/static/zscript/menu/listmenuitems.txt rename to wadsrc/static/zscript/ui/menu/listmenuitems.zs index 59bff9f61e..f12d3a7c48 100644 --- a/wadsrc/static/zscript/menu/listmenuitems.txt +++ b/wadsrc/static/zscript/ui/menu/listmenuitems.zs @@ -67,12 +67,19 @@ class ListMenuItemStaticPatch : ListMenuItem { TextureID mTexture; bool mCentered; + String mSubstitute; + Font mFont; + int mColor; - void Init(double x, double y, TextureID patch, bool centered = false) + void Init(ListMenuDescriptor desc, double x, double y, TextureID patch, bool centered = false, String substitute = "") { Super.Init(x, y); mTexture = patch; mCentered = centered; + mSubstitute = substitute; + mFont = desc.mFont; + mColor = desc.mFontColor; + } override void Drawer(bool selected) @@ -86,23 +93,39 @@ class ListMenuItemStaticPatch : ListMenuItem Vector2 vec = TexMan.GetScaledSize(mTexture); if (mYpos >= 0) { - if (mCentered) x -= vec.X / 2; - screen.DrawTexture (mTexture, true, x, mYpos, DTA_Clean, true); + if (mSubstitute == "" || TexMan.OkForLocalization(mTexture, mSubstitute)) + { + if (mCentered) x -= vec.X / 2; + screen.DrawTexture (mTexture, true, x, mYpos, DTA_Clean, true); + } + else + { + if (mCentered) x -= mFont.StringWidth(mSubstitute)/2; + screen.DrawText(mFont, mColor, x, mYpos, mSubstitute, DTA_Clean, true); + } } else { x = (mXpos - 160) * CleanXfac + (Screen.GetWidth()>>1); - if (mCentered) x -= (vec.X * CleanXfac)/2; - screen.DrawTexture (mTexture, true, x, -mYpos*CleanYfac, DTA_CleanNoMove, true); + if (mSubstitute == "" || TexMan.OkForLocalization(mTexture, mSubstitute)) + { + if (mCentered) x -= (vec.X * CleanXfac)/2; + screen.DrawTexture (mTexture, true, x, -mYpos*CleanYfac, DTA_CleanNoMove, true); + } + else + { + if (mCentered) x -= (mFont.StringWidth(mSubstitute) * CleanXfac)/2; + screen.DrawText(mFont, mColor, x, mYpos, mSubstitute, DTA_CleanNoMove, true); + } } } } class ListMenuItemStaticPatchCentered : ListMenuItemStaticPatch { - void Init(double x, double y, TextureID patch) + void Init(ListMenuDescriptor desc, double x, double y, TextureID patch) { - Super.Init(x, y, patch, true); + Super.Init(desc, x, y, patch, true); } } @@ -280,7 +303,7 @@ class ListMenuItemTextItem : ListMenuItemSelectable class ListMenuItemPatchItem : ListMenuItemSelectable { TextureID mTexture; - + void Init(ListMenuDescriptor desc, TextureID patch, String hotkey, Name child, int param = 0) { Super.Init(desc.mXpos, desc.mYpos, desc.mLinespacing, child, param); diff --git a/wadsrc/static/zscript/menu/loadsavemenu.txt b/wadsrc/static/zscript/ui/menu/loadsavemenu.zs similarity index 94% rename from wadsrc/static/zscript/menu/loadsavemenu.txt rename to wadsrc/static/zscript/ui/menu/loadsavemenu.zs index 09cf2a33bb..c0f125b462 100644 --- a/wadsrc/static/zscript/menu/loadsavemenu.txt +++ b/wadsrc/static/zscript/ui/menu/loadsavemenu.zs @@ -119,7 +119,7 @@ class LoadSaveMenu : ListMenu savepicHeight = 135*screen.GetHeight()/400; manager.WindowSize = savepicWidth / CleanXfac; - rowHeight = (SmallFont.GetHeight() + 1) * CleanYfac; + rowHeight = (ConFont.GetHeight() + 1) * CleanYfac; listboxLeft = savepicLeft + savepicWidth + 14; listboxTop = savepicTop; listboxWidth = screen.GetWidth() - listboxLeft - 10; @@ -227,24 +227,29 @@ class LoadSaveMenu : ListMenu colr = Font.CR_TAN; } + screen.SetClipRect(listboxLeft, listboxTop+rowHeight*i, listboxRight, listboxTop+rowHeight*(i+1)); + if (j == Selected) { screen.Clear (listboxLeft, listboxTop+rowHeight*i, listboxRight, listboxTop+rowHeight*(i+1), mEntering ? Color(255,255,0,0) : Color(255,0,0,255)); didSeeSelected = true; if (!mEntering) { - screen.DrawText (SmallFont, colr, listboxLeft+1, listboxTop+rowHeight*i+CleanYfac, node.SaveTitle, DTA_CleanNoMove, true); + screen.DrawText (ConFont, colr, listboxLeft+1, listboxTop+rowHeight*i+CleanYfac, node.SaveTitle, DTA_CleanNoMove, true); } else { - String s = mInput.GetText() .. SmallFont.GetCursor(); - screen.DrawText (SmallFont, Font.CR_WHITE, listboxLeft+1, listboxTop+rowHeight*i+CleanYfac, s, DTA_CleanNoMove, true); + String s = mInput.GetText() .. ConFont.GetCursor(); + int length = ConFont.StringWidth(s) * CleanXFac; + int displacement = min(0, listboxWidth - 2 - length); + screen.DrawText (ConFont, Font.CR_WHITE, listboxLeft + 1 + displacement, listboxTop+rowHeight*i+CleanYfac, s, DTA_CleanNoMove, true); } } else { - screen.DrawText (SmallFont, colr, listboxLeft+1, listboxTop+rowHeight*i+CleanYfac, node.SaveTitle, DTA_CleanNoMove, true); + screen.DrawText (ConFont, colr, listboxLeft+1, listboxTop+rowHeight*i+CleanYfac, node.SaveTitle, DTA_CleanNoMove, true); } + screen.ClearClipRect(); j++; } } @@ -460,8 +465,7 @@ class SaveMenu : LoadSaveMenu // // //============================================================================= - const SAVESTRINGSIZE = 32; - + override bool MenuEvent (int mkey, bool fromcontroller) { if (Super.MenuEvent(mkey, fromcontroller)) @@ -476,7 +480,7 @@ class SaveMenu : LoadSaveMenu if (mkey == MKEY_Enter) { String SavegameString = (Selected != 0)? manager.GetSavegame(Selected).SaveTitle : ""; - mInput = TextEnterMenu.Open(self, SavegameString, SAVESTRINGSIZE, 1, fromcontroller); + mInput = TextEnterMenu.OpenTextEnter(self, ConFont, SavegameString, -1, fromcontroller); mInput.ActivateMenu(); mEntering = true; } @@ -605,4 +609,4 @@ class LoadMenu : LoadSaveMenu } return false; } -} \ No newline at end of file +} diff --git a/wadsrc/static/zscript/menu/menu.txt b/wadsrc/static/zscript/ui/menu/menu.zs similarity index 100% rename from wadsrc/static/zscript/menu/menu.txt rename to wadsrc/static/zscript/ui/menu/menu.zs diff --git a/wadsrc/static/zscript/menu/menuitembase.txt b/wadsrc/static/zscript/ui/menu/menuitembase.zs similarity index 100% rename from wadsrc/static/zscript/menu/menuitembase.txt rename to wadsrc/static/zscript/ui/menu/menuitembase.zs diff --git a/wadsrc/static/zscript/menu/messagebox.txt b/wadsrc/static/zscript/ui/menu/messagebox.zs similarity index 100% rename from wadsrc/static/zscript/menu/messagebox.txt rename to wadsrc/static/zscript/ui/menu/messagebox.zs diff --git a/wadsrc/static/zscript/menu/optionmenu.txt b/wadsrc/static/zscript/ui/menu/optionmenu.zs similarity index 98% rename from wadsrc/static/zscript/menu/optionmenu.txt rename to wadsrc/static/zscript/ui/menu/optionmenu.zs index 10bd91140d..659830827b 100644 --- a/wadsrc/static/zscript/menu/optionmenu.txt +++ b/wadsrc/static/zscript/ui/menu/optionmenu.zs @@ -583,11 +583,12 @@ class GLTextureGLOptions : OptionMenu { int multiplier = gl_texture_hqresizemult * gl_texture_hqresizemult; - string localized = StringTable.Localize("$GLTEXMNU_HQRESIZEWARN"); - message = String.Format(localized, multiplier); + message = StringTable.Localize("$GLTEXMNU_HQRESIZEWARN"); + string mult = String.Format("%d", multiplier); + message.Replace("%d", mult); } - mDesc.mItems[mWarningIndex].mLabel = message; + mDesc.mItems[mWarningIndex].mLabel = Font.TEXTCOLOR_CYAN .. message; } } } diff --git a/wadsrc/static/zscript/menu/optionmenuitems.txt b/wadsrc/static/zscript/ui/menu/optionmenuitems.zs similarity index 99% rename from wadsrc/static/zscript/menu/optionmenuitems.txt rename to wadsrc/static/zscript/ui/menu/optionmenuitems.zs index a8f77268cb..df955bb78d 100644 --- a/wadsrc/static/zscript/menu/optionmenuitems.txt +++ b/wadsrc/static/zscript/ui/menu/optionmenuitems.zs @@ -1044,7 +1044,7 @@ class OptionMenuItemTextField : OptionMenuFieldBase if (mkey == Menu.MKEY_Enter) { Menu.MenuSound("menu/choose"); - mEnter = TextEnterMenu.Open(Menu.GetCurrentMenu(), GetCVarString(), -1, 2, fromcontroller); + mEnter = TextEnterMenu.OpenTextEnter(Menu.GetCurrentMenu(), SmallFont, GetCVarString(), -1, fromcontroller); mEnter.ActivateMenu(); return true; } diff --git a/wadsrc/static/zscript/menu/playercontrols.txt b/wadsrc/static/zscript/ui/menu/playercontrols.zs similarity index 98% rename from wadsrc/static/zscript/menu/playercontrols.txt rename to wadsrc/static/zscript/ui/menu/playercontrols.zs index 6b3a9bcf49..8648daf2d0 100644 --- a/wadsrc/static/zscript/menu/playercontrols.txt +++ b/wadsrc/static/zscript/ui/menu/playercontrols.zs @@ -92,7 +92,7 @@ class ListMenuItemPlayerNameBox : ListMenuItemSelectable { if (i == 0) { - mPlayerName = s.Mid(0, MAXPLAYERNAME); + mPlayerName = s; return true; } return false; @@ -164,7 +164,7 @@ class ListMenuItemPlayerNameBox : ListMenuItemSelectable // Draw player name box double x = mXpos + mFont.StringWidth(text) + 16 + mFrameSize; - DrawBorder (x, mYpos - mFrameSize, MAXPLAYERNAME+1); + DrawBorder (x, mYpos - mFrameSize, 16); // This creates a 128 pixel wide text box. if (!mEnter) { screen.DrawText (SmallFont, Font.CR_UNTRANSLATED, x + mFrameSize, mYpos, mPlayerName, DTA_Clean, true); @@ -187,7 +187,7 @@ class ListMenuItemPlayerNameBox : ListMenuItemSelectable if (mkey == Menu.MKEY_Enter) { Menu.MenuSound ("menu/choose"); - mEnter = TextEnterMenu.Open(Menu.GetCurrentMenu(), mPlayerName, MAXPLAYERNAME, 2, fromcontroller); + mEnter = TextEnterMenu.OpenTextEnter(Menu.GetCurrentMenu(), SmallFont, mPlayerName, 128, fromcontroller); mEnter.ActivateMenu(); return true; } diff --git a/wadsrc/static/zscript/menu/playerdisplay.txt b/wadsrc/static/zscript/ui/menu/playerdisplay.zs similarity index 100% rename from wadsrc/static/zscript/menu/playerdisplay.txt rename to wadsrc/static/zscript/ui/menu/playerdisplay.zs diff --git a/wadsrc/static/zscript/menu/playermenu.txt b/wadsrc/static/zscript/ui/menu/playermenu.zs similarity index 100% rename from wadsrc/static/zscript/menu/playermenu.txt rename to wadsrc/static/zscript/ui/menu/playermenu.zs diff --git a/wadsrc/static/zscript/menu/readthis.txt b/wadsrc/static/zscript/ui/menu/readthis.zs similarity index 100% rename from wadsrc/static/zscript/menu/readthis.txt rename to wadsrc/static/zscript/ui/menu/readthis.zs diff --git a/wadsrc/static/zscript/menu/reverbedit.txt b/wadsrc/static/zscript/ui/menu/reverbedit.zs similarity index 97% rename from wadsrc/static/zscript/menu/reverbedit.txt rename to wadsrc/static/zscript/ui/menu/reverbedit.zs index 2f372968c6..7bc799797f 100644 --- a/wadsrc/static/zscript/menu/reverbedit.txt +++ b/wadsrc/static/zscript/ui/menu/reverbedit.zs @@ -235,7 +235,7 @@ class OptionMenuItemSliderReverbEditOption : OptionMenuSliderBase if (mkey == Menu.MKEY_Enter) { Menu.MenuSound("menu/choose"); - mEnter = TextEnterMenu.Open(Menu.GetCurrentMenu(), String.Format("%.3f", GetSliderValue()), -1, 2, fromcontroller); + mEnter = TextEnterMenu.OpenTextEnter(Menu.GetCurrentMenu(), SmallFont, String.Format("%.3f", GetSliderValue()), -1, fromcontroller); mEnter.ActivateMenu(); return true; } diff --git a/wadsrc/static/zscript/menu/textentermenu.txt b/wadsrc/static/zscript/ui/menu/textentermenu.zs similarity index 82% rename from wadsrc/static/zscript/menu/textentermenu.txt rename to wadsrc/static/zscript/ui/menu/textentermenu.zs index db38896b3d..328c7aa94d 100644 --- a/wadsrc/static/zscript/menu/textentermenu.txt +++ b/wadsrc/static/zscript/ui/menu/textentermenu.zs @@ -44,11 +44,12 @@ class TextEnterMenu : Menu String mEnterString; int mEnterSize; int mEnterPos; - int mSizeMode; // 1: size is length in chars. 2: also check string width bool mInputGridOkay; int InputGridX; int InputGridY; + int CursorSize; bool AllowColors; + Font displayFont; //============================================================================= // @@ -57,12 +58,11 @@ class TextEnterMenu : Menu //============================================================================= // [TP] Added allowcolors - private void Init(Menu parent, String textbuffer, int maxlen, int sizemode, bool showgrid, bool allowcolors) + private void Init(Menu parent, Font dpf, String textbuffer, int maxlen, bool showgrid, bool allowcolors) { Super.init(parent); mEnterString = textbuffer; - mEnterSize = maxlen < 0 ? 0x7fffffff : maxlen; - mSizeMode = sizemode; + mEnterSize = maxlen; mInputGridOkay = (showgrid && (m_showinputgrid == 0)) || (m_showinputgrid >= 1); if (mEnterString.Length() > 0) { @@ -76,15 +76,26 @@ class TextEnterMenu : Menu InputGridY = 0; } AllowColors = allowcolors; // [TP] + displayFont = dpf; + CursorSize = displayFont.StringWidth(displayFont.GetCursor()); } - static TextEnterMenu Open(Menu parent, String textbuffer, int maxlen, int sizemode, bool showgrid = false, bool allowcolors = false) + // This had to be deprecated because the unit for maxlen is 8 pixels. + deprecated("3.8") static TextEnterMenu Open(Menu parent, String textbuffer, int maxlen, int sizemode, bool showgrid = false, bool allowcolors = false) { let me = new("TextEnterMenu"); - me.Init(parent, textbuffer, maxlen, sizemode, showgrid, allowcolors); + me.Init(parent, SmallFont, textbuffer, maxlen*8, showgrid, allowcolors); return me; } + static TextEnterMenu OpenTextEnter(Menu parent, Font displayfnt, String textbuffer, int maxlen, bool showgrid = false, bool allowcolors = false) + { + let me = new("TextEnterMenu"); + me.Init(parent, displayfnt, textbuffer, maxlen, showgrid, allowcolors); + return me; + } + + //============================================================================= // // @@ -114,11 +125,7 @@ class TextEnterMenu : Menu if (ev.Type == UIEvent.Type_Char) { mInputGridOkay = false; - if (mEnterString.Length() < mEnterSize && - (mSizeMode == 2/*entering player name*/ || SmallFont.StringWidth(mEnterString) < (mEnterSize-1)*8)) - { - mEnterString.AppendFormat("%c", ev.KeyChar); - } + AppendChar(ev.KeyChar); return true; } int ch = ev.KeyChar; @@ -126,7 +133,7 @@ class TextEnterMenu : Menu { if (mEnterString.Length() > 0) { - mEnterString.Truncate(mEnterString.Length() - 1); + mEnterString.DeleteLastCharacter(); } } else if (ev.Type == UIEvent.Type_KeyDown) @@ -200,6 +207,21 @@ class TextEnterMenu : Menu // //============================================================================= + private void AppendChar(int ch) + { + String newstring = String.Format("%s%c%s", mEnterString, ch, displayFont.GetCursor()); + if (mEnterSize < 0 || displayFont.StringWidth(newstring) < mEnterSize) + { + mEnterString.AppendCharacter(ch); + } + } + + //============================================================================= + // + // + // + //============================================================================= + override bool MenuEvent (int key, bool fromcontroller) { String InputGridChars = Chars; @@ -249,8 +271,7 @@ class TextEnterMenu : Menu case MKEY_Enter: if (mInputGridOkay) { - String c = InputGridChars.CharAt(InputGridX + InputGridY * INPUTGRID_WIDTH); - int ch = c.CharCodeAt(0); + int ch = InputGridChars.CharCodeAt(InputGridX + InputGridY * INPUTGRID_WIDTH); if (ch == 0) // end { if (mEnterString.Length() > 0) @@ -265,13 +286,12 @@ class TextEnterMenu : Menu { if (mEnterString.Length() > 0) { - mEnterString.Truncate(mEnterString.Length() - 1); + mEnterString.DeleteLastCharacter(); } } - else if (mEnterString.Length() < mEnterSize && - (mSizeMode == 2/*entering player name*/ || SmallFont.StringWidth(mEnterString) < (mEnterSize-1)*8)) + else { - mEnterString = mEnterString .. c; + AppendChar(ch); } } return true; @@ -298,7 +318,7 @@ class TextEnterMenu : Menu String InputGridChars = Chars; int cell_width = 18 * CleanXfac; int cell_height = 12 * CleanYfac; - int top_padding = cell_height / 2 - SmallFont.GetHeight() * CleanYfac / 2; + int top_padding = cell_height / 2 - displayFont.GetHeight() * CleanYfac / 2; // Darken the background behind the character grid. screen.Dim(0, 0.8, 0, screen.GetHeight() - INPUTGRID_HEIGHT * cell_height, screen.GetWidth(), INPUTGRID_HEIGHT * cell_height); @@ -319,7 +339,7 @@ class TextEnterMenu : Menu { int xx = x * cell_width - INPUTGRID_WIDTH * cell_width / 2 + screen.GetWidth() / 2; int ch = InputGridChars.CharCodeAt(y * INPUTGRID_WIDTH + x); - int width = SmallFont.GetCharWidth(ch); + int width = displayFont.GetCharWidth(ch); // The highlighted character is yellow; the rest are dark gray. int colr = (x == InputGridX && y == InputGridY) ? Font.CR_YELLOW : Font.CR_DARKGRAY; @@ -328,7 +348,7 @@ class TextEnterMenu : Menu if (ch > 32) { // Draw a normal character. - screen.DrawChar(SmallFont, colr, xx + cell_width/2 - width*CleanXfac/2, yy + top_padding, ch, DTA_CleanNoMove, true); + screen.DrawChar(displayFont, colr, xx + cell_width/2 - width*CleanXfac/2, yy + top_padding, ch, DTA_CleanNoMove, true); } else if (ch == 32) { @@ -336,7 +356,7 @@ class TextEnterMenu : Menu int x1 = xx + cell_width/2 - width * CleanXfac * 3 / 4; int x2 = x1 + width * 3 * CleanXfac / 2; int y1 = yy + top_padding; - int y2 = y1 + SmallFont.GetHeight() * CleanYfac; + int y2 = y1 + displayFont.GetHeight() * CleanYfac; screen.Clear(x1, y1, x2, y1+CleanYfac, palcolor); // top screen.Clear(x1, y2, x2, y2+CleanYfac, palcolor); // bottom screen.Clear(x1, y1+CleanYfac, x1+CleanXfac, y2, palcolor); // left @@ -346,8 +366,8 @@ class TextEnterMenu : Menu { // Draw the backspace and end "characters". String str = ch == 8 ? "BS" : "ED"; - screen.DrawText(SmallFont, colr, - xx + cell_width/2 - SmallFont.StringWidth(str)*CleanXfac/2, + screen.DrawText(displayFont, colr, + xx + cell_width/2 - displayFont.StringWidth(str)*CleanXfac/2, yy + top_padding, str, DTA_CleanNoMove, true); } } @@ -356,4 +376,4 @@ class TextEnterMenu : Menu Super.Drawer(); } -} \ No newline at end of file +} diff --git a/wadsrc/static/zscript/statscreen/statscreen.txt b/wadsrc/static/zscript/ui/statscreen/statscreen.zs similarity index 85% rename from wadsrc/static/zscript/statscreen/statscreen.txt rename to wadsrc/static/zscript/ui/statscreen/statscreen.zs index 7edde60c42..1cf1001989 100644 --- a/wadsrc/static/zscript/statscreen/statscreen.txt +++ b/wadsrc/static/zscript/ui/statscreen/statscreen.zs @@ -8,26 +8,17 @@ class InterBackground native play version("2.5") native virtual void drawBackground(int CurState, bool drawsplat, bool snl_pointeron); } +// This is obsolete. Hopefully this was never used... struct PatchInfo play version("2.5") { Font mFont; - TextureID mPatch; + deprecated("3.8") TextureID mPatch; int mColor; void Init(GIFont gifont) { - if (gifont.color == 'Null') - { - mPatch = TexMan.CheckForTexture(gifont.fontname, TexMan.Type_MiscPatch); - mColor = mPatch.isValid() ? Font.CR_UNTRANSLATED : Font.CR_UNDEFINED; - mFont = NULL; - } - else - { - mFont = Font.GetFont(gifont.fontname); - mColor = Font.FindFontColor(gifont.color); - mPatch.SetInvalid(); - } + mFont = Font.GetFont(gifont.fontname); + mColor = Font.FindFontColor(gifont.color); if (mFont == NULL) { mFont = BigFont; @@ -42,7 +33,7 @@ class StatusScreen abstract play version("2.5") enum EValues { // GLOBAL LOCATIONS - TITLEY = 2, + TITLEY = 5, // SINGPLE-PLAYER STUFF SP_STATSX = 50, @@ -111,6 +102,8 @@ class StatusScreen abstract play version("2.5") TextureID timepic; TextureID par; TextureID sucks; + TextureID finishedPatch; + TextureID enteringPatch; // [RH] Info to dynamically generate the level name graphics String lnametexts[2]; @@ -179,28 +172,43 @@ class StatusScreen abstract play version("2.5") //==================================================================== // - // Draws a text, either as patch or as string from the string table + // Only kept so that mods that were accessing it continue to compile // //==================================================================== - int DrawPatchText(int y, PatchInfo pinfo, String stringname) + deprecated("3.8") int DrawPatchText(int y, PatchInfo pinfo, String stringname) { String string = Stringtable.Localize(stringname); int midx = screen.GetWidth() / 2; - if (pinfo.mPatch.isValid()) + screen.DrawText(pinfo.mFont, pinfo.mColor, midx - pinfo.mFont.StringWidth(string) * CleanXfac/2, y, string, DTA_CleanNoMove, true); + return y + pinfo.mFont.GetHeight() * CleanYfac; + } + + //==================================================================== + // + // Draws a text, either as patch or as string from the string table + // + //==================================================================== + + int DrawPatchOrText(int y, PatchInfo pinfo, TextureID patch, String stringname) + { + String string = Stringtable.Localize(stringname); + int midx = screen.GetWidth() / 2; + + if (TexMan.OkForLocalization(patch, stringname)) { - let size = TexMan.GetScaledSize(pinfo.mPatch); - screen.DrawTexture(pinfo.mPatch, true, midx - size.X * CleanXfac/2, y, DTA_CleanNoMove, true); + let size = TexMan.GetScaledSize(patch); + screen.DrawTexture(patch, true, midx - size.X * CleanXfac/2, y, DTA_CleanNoMove, true); return y + int(size.Y * CleanYfac); } - else + else { screen.DrawText(pinfo.mFont, pinfo.mColor, midx - pinfo.mFont.StringWidth(string) * CleanXfac/2, y, string, DTA_CleanNoMove, true); return y + pinfo.mFont.GetHeight() * CleanYfac; } } - + //==================================================================== // @@ -211,7 +219,7 @@ class StatusScreen abstract play version("2.5") // //==================================================================== - int drawLF () + virtual int drawLF () { int y = TITLEY * CleanYfac; @@ -221,10 +229,12 @@ class StatusScreen abstract play version("2.5") y -= ((mapname.mFont.GetHeight() - finished.mFont.GetHeight()) * CleanYfac) / 4; // draw "Finished!" - if (y < (NG_STATSY - finished.mFont.GetHeight()*3/4) * CleanYfac) + + int statsy = multiplayer? NG_STATSY : SP_STATSY * CleanYFac; + if (y < (statsy - finished.mFont.GetHeight()*3/4) * CleanYfac) { // don't draw 'finished' if the level name is too tall - y = DrawPatchText(y, finished, "$WI_FINISHED"); + y = DrawPatchOrText(y, finished, finishedPatch, "$WI_FINISHED"); } return y; } @@ -239,11 +249,11 @@ class StatusScreen abstract play version("2.5") // //==================================================================== - void drawEL () + virtual void drawEL () { int y = TITLEY * CleanYfac; - y = DrawPatchText(y, entering, "$WI_ENTERING"); + y = DrawPatchOrText(y, entering, enteringPatch, "$WI_ENTERING"); y += entering.mFont.GetHeight() * CleanYfac / 4; DrawName(y, wbs.LName1, lnametexts[1]); } @@ -258,12 +268,11 @@ class StatusScreen abstract play version("2.5") // Returns new x position, that is, the left edge of the number. // //==================================================================== - int drawNum (Font fnt, int x, int y, int n, int digits, bool leadingzeros = true, int translation = Font.CR_UNTRANSLATED) + int drawNum (Font fnt, int x, int y, int n, int digits, bool leadingzeros = true, int translation = Font.CR_UNTRANSLATED, bool nomove = false) { int fntwidth = fnt.StringWidth("3"); String text; int len; - bool nomove = fnt != IntermissionFont; if (nomove) { @@ -310,14 +319,14 @@ class StatusScreen abstract play version("2.5") // //==================================================================== - void drawPercent (Font fnt, int x, int y, int p, int b, bool show_total = true, int color = Font.CR_UNTRANSLATED) + void drawPercent (Font fnt, int x, int y, int p, int b, bool show_total = true, int color = Font.CR_UNTRANSLATED, bool nomove = false) { if (p < 0) return; if (wi_percents) { - if (fnt != IntermissionFont) + if (nomove) { x -= fnt.StringWidth("%") * CleanXfac; } @@ -325,8 +334,8 @@ class StatusScreen abstract play version("2.5") { x -= fnt.StringWidth("%"); } - screen.DrawText(fnt, color, x, y, "%", fnt != IntermissionFont ? DTA_CleanNoMove : DTA_Clean, true); - if (fnt != IntermissionFont) + screen.DrawText(fnt, color, x, y, "%", nomove? DTA_CleanNoMove : DTA_Clean, true); + if (nomove) { x -= 2*CleanXfac; } @@ -336,9 +345,9 @@ class StatusScreen abstract play version("2.5") { if (show_total) { - x = drawNum(fnt, x, y, b, 2, false); + x = drawNum(fnt, x, y, b, 2, false, color); x -= fnt.StringWidth("/"); - screen.DrawText (IntermissionFont, color, x, y, "/", DTA_Clean, true); + screen.DrawText (fnt, color, x, y, "/", nomove? DTA_CleanNoMove : DTA_Clean, true); } drawNum (fnt, x, y, p, -1, false, color); } @@ -350,28 +359,13 @@ class StatusScreen abstract play version("2.5") // //==================================================================== - void drawTime (int x, int y, int t, bool no_sucks=false) + void drawTimeFont (Font printFont, int x, int y, int t, int color) { bool sucky; if (t < 0) return; - sucky = !no_sucks && t >= wbs.sucktime * 60 * 60 && wbs.sucktime > 0; - - if (sucky) - { // "sucks" - if (Sucks.isValid()) - { - let size = TexMan.GetScaledSize(Sucks); - screen.DrawTexture (Sucks, true, x - size.X, y - size.Y - 2, DTA_Clean, true); - } - else - { - screen.DrawText (BigFont, Font.CR_UNTRANSLATED, x - BigFont.StringWidth("SUCKS"), y - IntermissionFont.GetHeight() - 2, "SUCKS", DTA_Clean, true); - } - } - int hours = t / 3600; t -= hours * 3600; int minutes = t / 60; @@ -380,19 +374,24 @@ class StatusScreen abstract play version("2.5") // Why were these offsets hard coded? Half the WADs with custom patches // I tested screwed up miserably in this function! - int num_spacing = IntermissionFont.GetCharWidth("3"); - int colon_spacing = IntermissionFont.GetCharWidth(":"); + int num_spacing = printFont.GetCharWidth("3"); + int colon_spacing = printFont.GetCharWidth(":"); - x = drawNum (IntermissionFont, x, y, seconds, 2) - 1; - DrawCharPatch (IntermissionFont, ":", x -= colon_spacing, y); - x = drawNum (IntermissionFont, x, y, minutes, 2, hours!=0); + x = drawNum (printFont, x, y, seconds, 2, true, color) - 1; + DrawCharPatch (printFont, ":", x -= colon_spacing, y, color); + x = drawNum (printFont, x, y, minutes, 2, hours!=0, color); if (hours) { - DrawCharPatch (IntermissionFont, ":", x -= colon_spacing, y); - drawNum (IntermissionFont, x, y, hours, 2); + DrawCharPatch (printFont, ":", x -= colon_spacing, y, color); + drawNum (printFont, x, y, hours, 2, false, color); } } + void drawTime (int x, int y, int t, bool no_sucks=false) + { + drawTimeFont(IntermissionFont, x, y, t, Font.CR_UNTRANSLATED); + } + //==================================================================== // @@ -697,16 +696,17 @@ class StatusScreen abstract play version("2.5") finished.Init(gameinfo.mStatscreenFinishedFont); mapname.Init(gameinfo.mStatscreenMapNameFont); - Kills = TexMan.CheckForTexture("WIOSTK", TexMan.Type_MiscPatch); // "kills" - Secret = TexMan.CheckForTexture("WIOSTS", TexMan.Type_MiscPatch); // "scrt" - P_secret = TexMan.CheckForTexture("WISCRT2", TexMan.Type_MiscPatch); // "secret" - Items = TexMan.CheckForTexture("WIOSTI", TexMan.Type_MiscPatch); // "items" + Kills = TexMan.CheckForTexture("WIOSTK", TexMan.Type_MiscPatch); // "kills" + Secret = TexMan.CheckForTexture("WIOSTS", TexMan.Type_MiscPatch); // "scrt", not used + P_secret = TexMan.CheckForTexture("WISCRT2", TexMan.Type_MiscPatch); // "secret" + Items = TexMan.CheckForTexture("WIOSTI", TexMan.Type_MiscPatch); // "items" Timepic = TexMan.CheckForTexture("WITIME", TexMan.Type_MiscPatch); // "time" Sucks = TexMan.CheckForTexture("WISUCKS", TexMan.Type_MiscPatch); // "sucks" Par = TexMan.CheckForTexture("WIPAR", TexMan.Type_MiscPatch); // "par" + enteringPatch = TexMan.CheckForTexture("WIENTER", TexMan.Type_MiscPatch); // "entering" + finishedPatch = TexMan.CheckForTexture("WIF", TexMan.Type_MiscPatch); // "finished" - // Use the local level structure which can be overridden by hubs - lnametexts[0] = Level.LevelName; + lnametexts[0] = wbstartstruct.thisname; lnametexts[1] = wbstartstruct.nextname; bg = InterBackground.Create(wbs); diff --git a/wadsrc/static/zscript/statscreen/statscreen_coop.txt b/wadsrc/static/zscript/ui/statscreen/statscreen_coop.zs similarity index 96% rename from wadsrc/static/zscript/statscreen/statscreen_coop.txt rename to wadsrc/static/zscript/ui/statscreen/statscreen_coop.zs index 7393877b6a..fb82cb36b3 100644 --- a/wadsrc/static/zscript/statscreen/statscreen_coop.txt +++ b/wadsrc/static/zscript/ui/statscreen/statscreen_coop.zs @@ -275,15 +275,15 @@ class CoopStatusScreen : StatusScreen screen.DrawTexture(player.mo.ScoreIcon, true, icon_x, y, DTA_CleanNoMove, true); } screen.DrawText(SmallFont, thiscolor, name_x, y + ypadding, player.GetUserName(), DTA_CleanNoMove, true); - drawPercent(SmallFont, kills_x, y + ypadding, cnt_kills[i], wbs.maxkills, false, thiscolor); + drawPercent(SmallFont, kills_x, y + ypadding, cnt_kills[i], wbs.maxkills, false, thiscolor, true); missed_kills -= cnt_kills[i]; if (ng_state >= 4) { - drawPercent(SmallFont, bonus_x, y + ypadding, cnt_items[i], wbs.maxitems, false, thiscolor); + drawPercent(SmallFont, bonus_x, y + ypadding, cnt_items[i], wbs.maxitems, false, thiscolor, true); missed_items -= cnt_items[i]; if (ng_state >= 6) { - drawPercent(SmallFont, secret_x, y + ypadding, cnt_secret[i], wbs.maxsecret, false, thiscolor); + drawPercent(SmallFont, secret_x, y + ypadding, cnt_secret[i], wbs.maxsecret, false, thiscolor, true); missed_secrets -= cnt_secret[i]; } } @@ -293,26 +293,26 @@ class CoopStatusScreen : StatusScreen // Draw "MISSED" line y += 3 * CleanYfac; screen.DrawText(SmallFont, Font.CR_DARKGRAY, name_x, y, Stringtable.Localize("$SCORE_MISSED"), DTA_CleanNoMove, true); - drawPercent(SmallFont, kills_x, y, missed_kills, wbs.maxkills, false, Font.CR_DARKGRAY); + drawPercent(SmallFont, kills_x, y, missed_kills, wbs.maxkills, false, Font.CR_DARKGRAY, true); if (ng_state >= 4) { - drawPercent(SmallFont, bonus_x, y, missed_items, wbs.maxitems, false, Font.CR_DARKGRAY); + drawPercent(SmallFont, bonus_x, y, missed_items, wbs.maxitems, false, Font.CR_DARKGRAY, true); if (ng_state >= 6) { - drawPercent(SmallFont, secret_x, y, missed_secrets, wbs.maxsecret, false, Font.CR_DARKGRAY); + drawPercent(SmallFont, secret_x, y, missed_secrets, wbs.maxsecret, false, Font.CR_DARKGRAY, true); } } // Draw "TOTAL" line y += height + 3 * CleanYfac; screen.DrawText(SmallFont, textcolor, name_x, y, Stringtable.Localize("$SCORE_TOTAL"), DTA_CleanNoMove, true); - drawNum(SmallFont, kills_x, y, wbs.maxkills, 0, false, textcolor); + drawNum(SmallFont, kills_x, y, wbs.maxkills, 0, false, textcolor, true); if (ng_state >= 4) { - drawNum(SmallFont, bonus_x, y, wbs.maxitems, 0, false, textcolor); + drawNum(SmallFont, bonus_x, y, wbs.maxitems, 0, false, textcolor, true); if (ng_state >= 6) { - drawNum(SmallFont, secret_x, y, wbs.maxsecret, 0, false, textcolor); + drawNum(SmallFont, secret_x, y, wbs.maxsecret, 0, false, textcolor, true); } } } diff --git a/wadsrc/static/zscript/statscreen/statscreen_dm.txt b/wadsrc/static/zscript/ui/statscreen/statscreen_dm.zs similarity index 98% rename from wadsrc/static/zscript/statscreen/statscreen_dm.txt rename to wadsrc/static/zscript/ui/statscreen/statscreen_dm.zs index 8807fb19cf..ec9bdcb673 100644 --- a/wadsrc/static/zscript/statscreen/statscreen_dm.txt +++ b/wadsrc/static/zscript/ui/statscreen/statscreen_dm.zs @@ -209,10 +209,10 @@ class DeathmatchStatusScreen : StatusScreen screen.DrawTexture(player.mo.ScoreIcon, true, icon_x, y, DTA_CleanNoMove, true); } screen.DrawText(SmallFont, thiscolor, name_x, y + ypadding, player.GetUserName(), DTA_CleanNoMove, true); - drawNum(SmallFont, frags_x, y + ypadding, cnt_frags[pnum], 0, false, thiscolor); + drawNum(SmallFont, frags_x, y + ypadding, cnt_frags[pnum], 0, false, thiscolor, true); if (ng_state >= 2) { - drawNum(SmallFont, deaths_x, y + ypadding, cnt_deaths[pnum], 0, false, thiscolor); + drawNum(SmallFont, deaths_x, y + ypadding, cnt_deaths[pnum], 0, false, thiscolor, true); } y += lineheight + CleanYfac; } @@ -220,10 +220,10 @@ class DeathmatchStatusScreen : StatusScreen // Draw "TOTAL" line y += height + 3 * CleanYfac; screen.DrawText(SmallFont, textcolor, name_x, y, Stringtable.Localize("$SCORE_TOTAL"), DTA_CleanNoMove, true); - drawNum(SmallFont, frags_x, y, total_frags, 0, false, textcolor); + drawNum(SmallFont, frags_x, y, total_frags, 0, false, textcolor, true); if (ng_state >= 4) { - drawNum(SmallFont, deaths_x, y, total_deaths, 0, false, textcolor); + drawNum(SmallFont, deaths_x, y, total_deaths, 0, false, textcolor, true); } // Draw game time diff --git a/wadsrc/static/zscript/statscreen/statscreen_sp.txt b/wadsrc/static/zscript/ui/statscreen/statscreen_sp.zs similarity index 52% rename from wadsrc/static/zscript/statscreen/statscreen_sp.txt rename to wadsrc/static/zscript/ui/statscreen/statscreen_sp.zs index f4def35695..15606fd789 100644 --- a/wadsrc/static/zscript/statscreen/statscreen_sp.txt +++ b/wadsrc/static/zscript/ui/statscreen/statscreen_sp.zs @@ -137,28 +137,66 @@ class DoomStatusScreen : StatusScreen int lh = IntermissionFont.GetHeight() * 3 / 2; drawLF(); - - screen.DrawTexture (Kills, true, SP_STATSX, SP_STATSY, DTA_Clean, true); - drawPercent (IntermissionFont, 320 - SP_STATSX, SP_STATSY, cnt_kills[0], wbs.maxkills); + + // Fixme: This should try to retrieve the color from the intermission font and use the best approximation here + let tcolor = Font.CR_RED; + + // For visual consistency, only use the patches here if all are present. + bool useGfx = TexMan.OkForLocalization(Kills, "$TXT_IMKILLS") + && TexMan.OkForLocalization(Items, "$TXT_IMITEMS") + && TexMan.OkForLocalization(P_secret, "$TXT_IMSECRETS") + && TexMan.OkForLocalization(Timepic, "$TXT_IMTIME") + && (!wbs.partime || TexMan.OkForLocalization(Par, "$TXT_IMPAR")); + + Font printFont; - screen.DrawTexture (Items, true, SP_STATSX, SP_STATSY+lh, DTA_Clean, true); - drawPercent (IntermissionFont, 320 - SP_STATSX, SP_STATSY+lh, cnt_items[0], wbs.maxitems); + if (useGfx) + { + printFont = IntermissionFont; + screen.DrawTexture (Kills, true, SP_STATSX, SP_STATSY, DTA_Clean, true); + screen.DrawTexture (Items, true, SP_STATSX, SP_STATSY+lh, DTA_Clean, true); + screen.DrawTexture (P_secret, true, SP_STATSX, SP_STATSY+2*lh, DTA_Clean, true); + screen.DrawTexture (Timepic, true, SP_TIMEX, SP_TIMEY, DTA_Clean, true); + if (wbs.partime) screen.DrawTexture (Par, true, 160 + SP_TIMEX, SP_TIMEY, DTA_Clean, true); + } + else + { + printFont = BigFont; + screen.DrawText (BigFont, tcolor, SP_STATSX, SP_STATSY, "$TXT_IMKILLS", DTA_Clean, true); + screen.DrawText (BigFont, tcolor, SP_STATSX, SP_STATSY+lh, "$TXT_IMITEMS", DTA_Clean, true); + screen.DrawText (BigFont, tcolor, SP_STATSX, SP_STATSY+2*lh, "$TXT_IMSECRETS", DTA_Clean, true); + screen.DrawText (BigFont, tcolor, SP_TIMEX, SP_TIMEY, "$TXT_IMTIME", DTA_Clean, true); + if (wbs.partime) screen.DrawText (BigFont, tcolor, 160 + SP_TIMEX, SP_TIMEY, "$TXT_IMPAR", DTA_Clean, true); + } + + drawPercent (printFont, 320 - SP_STATSX, SP_STATSY, cnt_kills[0], wbs.maxkills, true, tcolor); + drawPercent (printFont, 320 - SP_STATSX, SP_STATSY+lh, cnt_items[0], wbs.maxitems, true, tcolor); + drawPercent (printFont, 320 - SP_STATSX, SP_STATSY+2*lh, cnt_secret[0], wbs.maxsecret, true, tcolor); + drawTimeFont (printFont, 160 - SP_TIMEX, SP_TIMEY, cnt_time, tcolor); + + // This really sucks - not just by its message - and should have been removed long ago! + // To avoid problems here, the "sucks" text only gets printed if the lump is present, this even applies to the text replacement. + + if (cnt_time >= wbs.sucktime * 60 * 60 && wbs.sucktime > 0 && Sucks.IsValid()) + { // "sucks" + int x = 160 - SP_TIMEX; + int y = SP_TIMEY; + if (useGfx && TexMan.OkForLocalization(Sucks, "$TXT_IMSUCKS")) + { + let size = TexMan.GetScaledSize(Sucks); + screen.DrawTexture (Sucks, true, x - size.X, y - size.Y - 2, DTA_Clean, true); + } + else + { + screen.DrawText (printFont, Font.CR_UNTRANSLATED, x - printFont.StringWidth("$TXT_IMSUCKS"), y - printFont.GetHeight() - 2, "$TXT_IMSUCKS", DTA_Clean, true); + } + } - screen.DrawTexture (P_secret, true, SP_STATSX, SP_STATSY+2*lh, DTA_Clean, true); - drawPercent (IntermissionFont, 320 - SP_STATSX, SP_STATSY+2*lh, cnt_secret[0], wbs.maxsecret); - - screen.DrawTexture (Timepic, true, SP_TIMEX, SP_TIMEY, DTA_Clean, true); - drawTime (160 - SP_TIMEX, SP_TIMEY, cnt_time); if (wi_showtotaltime) { - drawTime (160 - SP_TIMEX, SP_TIMEY + lh, cnt_total_time, true); // no 'sucks' for total time ever! - } - - if (wbs.partime) - { - screen.DrawTexture (Par, true, 160 + SP_TIMEX, SP_TIMEY, DTA_Clean, true); - drawTime (320 - SP_TIMEX, SP_TIMEY, cnt_par); + drawTimeFont (printFont, 160 - SP_TIMEX, SP_TIMEY + lh, cnt_total_time, tcolor); } + drawTimeFont (printFont, 320 - SP_TIMEX, SP_TIMEY, cnt_par, tcolor); } } @@ -171,9 +209,9 @@ class RavenStatusScreen : DoomStatusScreen drawLF(); - screen.DrawText (BigFont, Font.CR_UNTRANSLATED, 50, 65, Stringtable.Localize("$TXT_IMKILLS"), DTA_Clean, true, DTA_Shadow, true); - screen.DrawText (BigFont, Font.CR_UNTRANSLATED, 50, 90, Stringtable.Localize("$TXT_IMITEMS"), DTA_Clean, true, DTA_Shadow, true); - screen.DrawText (BigFont, Font.CR_UNTRANSLATED, 50, 115, Stringtable.Localize("$TXT_IMSECRETS"), DTA_Clean, true, DTA_Shadow, true); + screen.DrawText (BigFont, Font.CR_UNTRANSLATED, 50, 65, "$TXT_IMKILLS", DTA_Clean, true, DTA_Shadow, true); + screen.DrawText (BigFont, Font.CR_UNTRANSLATED, 50, 90, "$TXT_IMITEMS", DTA_Clean, true, DTA_Shadow, true); + screen.DrawText (BigFont, Font.CR_UNTRANSLATED, 50, 115, "$TXT_IMSECRETS", DTA_Clean, true, DTA_Shadow, true); int countpos = gameinfo.gametype==GAME_Strife? 285:270; if (sp_state >= 2) @@ -190,7 +228,7 @@ class RavenStatusScreen : DoomStatusScreen } if (sp_state >= 8) { - screen.DrawText (BigFont, Font.CR_UNTRANSLATED, 85, 160, Stringtable.Localize("$TXT_IMTIME"), DTA_Clean, true, DTA_Shadow, true); + screen.DrawText (BigFont, Font.CR_UNTRANSLATED, 85, 160, "$TXT_IMTIME", DTA_Clean, true, DTA_Shadow, true); drawTime (249, 160, cnt_time); if (wi_showtotaltime) { diff --git a/wadsrc/static/zscript/statscreen/types.txt b/wadsrc/static/zscript/ui/statscreen/types.zs similarity index 94% rename from wadsrc/static/zscript/statscreen/types.txt rename to wadsrc/static/zscript/ui/statscreen/types.zs index c3dad0c765..972a47b0c5 100644 --- a/wadsrc/static/zscript/statscreen/types.txt +++ b/wadsrc/static/zscript/ui/statscreen/types.zs @@ -23,6 +23,7 @@ struct WBStartStruct native version("2.4") native String current; // [RH] Name of map just finished native String next; // next level, [RH] actual map name native String nextname; // next level, printable name + native String thisname; // this level, printable name native TextureID LName0; native TextureID LName1; diff --git a/wadsrc/static/zscript/statusbar/alt_hud.txt b/wadsrc/static/zscript/ui/statusbar/alt_hud.zs similarity index 100% rename from wadsrc/static/zscript/statusbar/alt_hud.txt rename to wadsrc/static/zscript/ui/statusbar/alt_hud.zs diff --git a/wadsrc/static/zscript/statusbar/doom_sbar.txt b/wadsrc/static/zscript/ui/statusbar/doom_sbar.zs similarity index 100% rename from wadsrc/static/zscript/statusbar/doom_sbar.txt rename to wadsrc/static/zscript/ui/statusbar/doom_sbar.zs diff --git a/wadsrc/static/zscript/statusbar/harm_sbar.txt b/wadsrc/static/zscript/ui/statusbar/harm_sbar.zs similarity index 100% rename from wadsrc/static/zscript/statusbar/harm_sbar.txt rename to wadsrc/static/zscript/ui/statusbar/harm_sbar.zs diff --git a/wadsrc/static/zscript/statusbar/heretic_sbar.txt b/wadsrc/static/zscript/ui/statusbar/heretic_sbar.zs similarity index 100% rename from wadsrc/static/zscript/statusbar/heretic_sbar.txt rename to wadsrc/static/zscript/ui/statusbar/heretic_sbar.zs diff --git a/wadsrc/static/zscript/statusbar/hexen_sbar.txt b/wadsrc/static/zscript/ui/statusbar/hexen_sbar.zs similarity index 100% rename from wadsrc/static/zscript/statusbar/hexen_sbar.txt rename to wadsrc/static/zscript/ui/statusbar/hexen_sbar.zs diff --git a/wadsrc/static/zscript/statusbar/sbarinfowrapper.txt b/wadsrc/static/zscript/ui/statusbar/sbarinfowrapper.zs similarity index 100% rename from wadsrc/static/zscript/statusbar/sbarinfowrapper.txt rename to wadsrc/static/zscript/ui/statusbar/sbarinfowrapper.zs diff --git a/wadsrc/static/zscript/statusbar/statusbar.txt b/wadsrc/static/zscript/ui/statusbar/statusbar.zs similarity index 100% rename from wadsrc/static/zscript/statusbar/statusbar.txt rename to wadsrc/static/zscript/ui/statusbar/statusbar.zs diff --git a/wadsrc/static/zscript/statusbar/strife_sbar.txt b/wadsrc/static/zscript/ui/statusbar/strife_sbar.zs similarity index 100% rename from wadsrc/static/zscript/statusbar/strife_sbar.txt rename to wadsrc/static/zscript/ui/statusbar/strife_sbar.zs diff --git a/wadsrc/static/zscript/zscript_license.txt b/wadsrc/static/zscript/zscript_license.txt index 50a89061ca..4ab1812d34 100644 --- a/wadsrc/static/zscript/zscript_license.txt +++ b/wadsrc/static/zscript/zscript_license.txt @@ -2,7 +2,7 @@ Unless noted differently in the file, the following license applies to all ZScri //----------------------------------------------------------------------------- // -// Copyright 1993-2017 id Software, Randy Heit, Christoph Oelckers et.al. +// Copyright 1993-2019 id Software, Randy Heit, Christoph Oelckers et.al. // // 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 diff --git a/wadsrc_extra/static/dbigfont.lmp b/wadsrc_extra/static/dbigfont.lmp deleted file mode 100644 index b44080a5a8..0000000000 Binary files a/wadsrc_extra/static/dbigfont.lmp and /dev/null differ diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn159.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/009F.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn159.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/009F.lmp diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00AB.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00AB.lmp new file mode 100644 index 0000000000..b7804d21b7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00AB.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00BB.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00BB.lmp new file mode 100644 index 0000000000..179e0ac79f Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00BB.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn191.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00BF.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn191.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00BF.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn192.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C0.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn192.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C0.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn193.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C1.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn193.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C1.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn194.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C2.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn194.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C2.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn195.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C3.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn195.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C3.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn196.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C4.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn196.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C4.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn197.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C5.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn197.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C5.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn199.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C7.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn199.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C7.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn200.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C8.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn200.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C8.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn201.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C9.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn201.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00C9.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn202.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00CA.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn202.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00CA.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn205.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00CD.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn205.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00CD.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn206.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00CE.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn206.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00CE.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn207.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00CF.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn207.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00CF.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn209.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00D1.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn209.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00D1.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn211.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00D3.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn211.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00D3.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn212.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00D4.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn212.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00D4.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn213.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00D5.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn213.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00D5.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn214.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00D6.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn214.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00D6.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn217.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00D9.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn217.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00D9.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn218.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00DA.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn218.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00DA.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn219.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00DB.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn219.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00DB.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn220.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00DC.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn220.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00DC.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn223.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00DF.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-doom/graphics/stcfn223.lmp rename to wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00DF.lmp diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0178.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0178.lmp new file mode 100644 index 0000000000..d57a2dd3eb Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0178.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0401.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0401.lmp new file mode 100644 index 0000000000..9eedf12eda Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0401.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0410.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0410.lmp new file mode 100644 index 0000000000..f805e3aa6e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0410.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0411.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0411.lmp new file mode 100644 index 0000000000..af5f0f468c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0411.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0412.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0412.lmp new file mode 100644 index 0000000000..201c48199f Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0412.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0413.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0413.lmp new file mode 100644 index 0000000000..a33bd8ef64 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0413.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0414.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0414.lmp new file mode 100644 index 0000000000..ccbfbde85c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0414.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0415.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0415.lmp new file mode 100644 index 0000000000..9388132c82 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0415.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0416.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0416.lmp new file mode 100644 index 0000000000..dc873e301d Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0416.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0417.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0417.lmp new file mode 100644 index 0000000000..ff1ee0248c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0417.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0418.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0418.lmp new file mode 100644 index 0000000000..7410e87a7d Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0418.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0419.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0419.lmp new file mode 100644 index 0000000000..b22264c4ab Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0419.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041A.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041A.lmp new file mode 100644 index 0000000000..46423d78f0 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041B.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041B.lmp new file mode 100644 index 0000000000..af8759ef39 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041C.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041C.lmp new file mode 100644 index 0000000000..5c3c3c88dd Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041D.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041D.lmp new file mode 100644 index 0000000000..fa6e340dd7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041E.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041E.lmp new file mode 100644 index 0000000000..3a7a4a4880 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041F.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041F.lmp new file mode 100644 index 0000000000..a478a2da24 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0420.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0420.lmp new file mode 100644 index 0000000000..52061d8ebb Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0420.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0421.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0421.lmp new file mode 100644 index 0000000000..3e350d77e4 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0421.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0422.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0422.lmp new file mode 100644 index 0000000000..2798a47b3a Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0422.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0423.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0423.lmp new file mode 100644 index 0000000000..429c6a52e5 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0423.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0424.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0424.lmp new file mode 100644 index 0000000000..bc5b528c3e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0424.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0425.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0425.lmp new file mode 100644 index 0000000000..ad72667cb5 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0425.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0426.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0426.lmp new file mode 100644 index 0000000000..475944d636 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0426.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0427.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0427.lmp new file mode 100644 index 0000000000..934df7ba16 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0427.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0428.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0428.lmp new file mode 100644 index 0000000000..adeadc5edb Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0428.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0429.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0429.lmp new file mode 100644 index 0000000000..7078c714bf Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0429.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042A.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042A.lmp new file mode 100644 index 0000000000..5df82d3121 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042B.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042B.lmp new file mode 100644 index 0000000000..250c4f7edb Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042C.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042C.lmp new file mode 100644 index 0000000000..74f90b8b0c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042D.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042D.lmp new file mode 100644 index 0000000000..fc193a5305 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042E.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042E.lmp new file mode 100644 index 0000000000..bd3aeb4d1e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042F.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042F.lmp new file mode 100644 index 0000000000..8573a46b9c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/2014.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/2014.lmp new file mode 100644 index 0000000000..14e398c7cb Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/2014.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/201C.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/201C.lmp new file mode 100644 index 0000000000..255833abf9 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/201C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/201E.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/201E.lmp new file mode 100644 index 0000000000..2c00e73778 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/201E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0021.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0021.lmp new file mode 100644 index 0000000000..644ccddc17 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0021.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0022.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0022.lmp new file mode 100644 index 0000000000..7d1d386197 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0022.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0023.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0023.lmp new file mode 100644 index 0000000000..67c7b74c5f Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0023.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0024.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0024.lmp new file mode 100644 index 0000000000..4d52c14623 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0024.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0025.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0025.lmp new file mode 100644 index 0000000000..2f4b2f9f96 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0025.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0026.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0026.lmp new file mode 100644 index 0000000000..b52636dfe3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0026.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0027.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0027.lmp new file mode 100644 index 0000000000..715042a197 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0027.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0028.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0028.lmp new file mode 100644 index 0000000000..c9dfd26135 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0028.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0029.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0029.lmp new file mode 100644 index 0000000000..5cacd61996 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0029.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002A.lmp new file mode 100644 index 0000000000..143fa13690 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002B.lmp new file mode 100644 index 0000000000..07d97218b2 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002C.lmp new file mode 100644 index 0000000000..8ab9111fe6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002D.lmp new file mode 100644 index 0000000000..72f4fcb699 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002E.lmp new file mode 100644 index 0000000000..5821762ef2 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002F.lmp new file mode 100644 index 0000000000..ef983e34fc Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0030.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0030.lmp new file mode 100644 index 0000000000..d5d083529c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0030.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0031.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0031.lmp new file mode 100644 index 0000000000..77750edc9b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0031.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0032.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0032.lmp new file mode 100644 index 0000000000..9c0498e561 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0032.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0033.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0033.lmp new file mode 100644 index 0000000000..724928260d Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0033.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0034.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0034.lmp new file mode 100644 index 0000000000..b92ed8a25f Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0034.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0035.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0035.lmp new file mode 100644 index 0000000000..9b45ff9c36 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0035.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0036.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0036.lmp new file mode 100644 index 0000000000..1ed157a7da Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0036.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0037.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0037.lmp new file mode 100644 index 0000000000..1b9ffffb80 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0037.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0038.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0038.lmp new file mode 100644 index 0000000000..47ad910e68 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0038.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0039.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0039.lmp new file mode 100644 index 0000000000..51dca44793 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0039.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003A.lmp new file mode 100644 index 0000000000..916f9a0d2c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003B.lmp new file mode 100644 index 0000000000..3c359ff41f Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003C.lmp new file mode 100644 index 0000000000..7a664bb048 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003D.lmp new file mode 100644 index 0000000000..40c4c2e4a6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003E.lmp new file mode 100644 index 0000000000..c260ab9237 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003F.lmp new file mode 100644 index 0000000000..f682a107a8 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0040.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0040.lmp new file mode 100644 index 0000000000..4b78b26b02 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0040.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0041.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0041.lmp new file mode 100644 index 0000000000..a838d54f15 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0041.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0042.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0042.lmp new file mode 100644 index 0000000000..0700f6020b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0042.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0043.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0043.lmp new file mode 100644 index 0000000000..41cd7ec332 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0043.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0044.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0044.lmp new file mode 100644 index 0000000000..c689159cd8 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0044.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0045.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0045.lmp new file mode 100644 index 0000000000..ed6f0036d6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0045.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0046.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0046.lmp new file mode 100644 index 0000000000..c79fc8b797 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0046.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0047.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0047.lmp new file mode 100644 index 0000000000..3dccf3651c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0047.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0048.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0048.lmp new file mode 100644 index 0000000000..9fc5120d7a Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0048.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0049.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0049.lmp new file mode 100644 index 0000000000..4110be87cc Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0049.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004A.lmp new file mode 100644 index 0000000000..7ad8fbd85c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004B.lmp new file mode 100644 index 0000000000..f68e086c56 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004C.lmp new file mode 100644 index 0000000000..74cd603944 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004D.lmp new file mode 100644 index 0000000000..cba4ffc5b2 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004E.lmp new file mode 100644 index 0000000000..bec0901500 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004F.lmp new file mode 100644 index 0000000000..809cd26a99 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0050.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0050.lmp new file mode 100644 index 0000000000..8f9c543f2b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0050.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0051.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0051.lmp new file mode 100644 index 0000000000..ebac5b4369 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0051.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0052.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0052.lmp new file mode 100644 index 0000000000..174b26e0b4 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0052.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0053.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0053.lmp new file mode 100644 index 0000000000..59a40625fa Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0053.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0054.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0054.lmp new file mode 100644 index 0000000000..2937370471 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0054.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0055.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0055.lmp new file mode 100644 index 0000000000..7f26458ed9 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0055.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0056.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0056.lmp new file mode 100644 index 0000000000..e505086c2b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0056.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0057.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0057.lmp new file mode 100644 index 0000000000..286f4109cc Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0057.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0058.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0058.lmp new file mode 100644 index 0000000000..6f45e2b69f Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0058.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0059.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0059.lmp new file mode 100644 index 0000000000..bdca8e56b7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0059.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005A.lmp new file mode 100644 index 0000000000..6861783b43 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005B.lmp new file mode 100644 index 0000000000..33b0aa4a30 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005C.lmp new file mode 100644 index 0000000000..1f8c650f2e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005D.lmp new file mode 100644 index 0000000000..f369520997 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005E.lmp new file mode 100644 index 0000000000..df3d7a4958 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005F.lmp new file mode 100644 index 0000000000..0a3af44abb Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0060.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0060.lmp new file mode 100644 index 0000000000..f8d466f194 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0060.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C0.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C0.lmp new file mode 100644 index 0000000000..968c88011c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C0.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C1.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C1.lmp new file mode 100644 index 0000000000..4fe6fb9ba1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C1.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C2.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C2.lmp new file mode 100644 index 0000000000..c01aac491e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C2.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C3.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C3.lmp new file mode 100644 index 0000000000..f69255cf43 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C3.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C4.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C4.lmp new file mode 100644 index 0000000000..a115995088 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C4.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C5.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C5.lmp new file mode 100644 index 0000000000..7c5e9ba485 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C5.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C6.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C6.lmp new file mode 100644 index 0000000000..d9b2d9fecd Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C6.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C7.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C7.lmp new file mode 100644 index 0000000000..a0bae3a8c9 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C7.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C8.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C8.lmp new file mode 100644 index 0000000000..1d9b9fd6a1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C8.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C9.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C9.lmp new file mode 100644 index 0000000000..798544f375 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C9.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CA.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CA.lmp new file mode 100644 index 0000000000..2fafebc108 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CA.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CB.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CB.lmp new file mode 100644 index 0000000000..25ac378331 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CB.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CC.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CC.lmp new file mode 100644 index 0000000000..1bc0a23c88 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CC.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CD.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CD.lmp new file mode 100644 index 0000000000..116bb25ea2 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CD.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CE.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CE.lmp new file mode 100644 index 0000000000..62d920f067 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CE.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CF.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CF.lmp new file mode 100644 index 0000000000..1ad003441e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CF.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D0.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D0.lmp new file mode 100644 index 0000000000..f8cfb11146 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D0.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D1.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D1.lmp new file mode 100644 index 0000000000..d4c3d046cc Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D1.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D2.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D2.lmp new file mode 100644 index 0000000000..43ccdfd0e7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D2.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D3.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D3.lmp new file mode 100644 index 0000000000..213903d531 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D3.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D4.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D4.lmp new file mode 100644 index 0000000000..4c2a67e16e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D4.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D5.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D5.lmp new file mode 100644 index 0000000000..efa77331ed Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D5.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D6.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D6.lmp new file mode 100644 index 0000000000..a099021e3b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D6.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D8.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D8.lmp new file mode 100644 index 0000000000..f8926ed705 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D8.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D9.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D9.lmp new file mode 100644 index 0000000000..8747ba8931 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D9.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DA.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DA.lmp new file mode 100644 index 0000000000..2e1e45bf51 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DA.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DB.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DB.lmp new file mode 100644 index 0000000000..15248ccbeb Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DB.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DC.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DC.lmp new file mode 100644 index 0000000000..5369d14fe6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DC.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DD.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DD.lmp new file mode 100644 index 0000000000..baad1d0a23 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DD.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DE.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DE.lmp new file mode 100644 index 0000000000..055bf6ede6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DE.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DF.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DF.lmp new file mode 100644 index 0000000000..768f04cdf6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DF.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0110.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0110.lmp new file mode 100644 index 0000000000..f8cfb11146 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0110.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0401.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0401.lmp new file mode 100644 index 0000000000..25ac378331 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0401.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0402.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0402.lmp new file mode 100644 index 0000000000..a00a09d099 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0402.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0403.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0403.lmp new file mode 100644 index 0000000000..c61695abed Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0403.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0404.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0404.lmp new file mode 100644 index 0000000000..b225754a9d Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0404.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0405.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0405.lmp new file mode 100644 index 0000000000..59a40625fa Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0405.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0406.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0406.lmp new file mode 100644 index 0000000000..4110be87cc Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0406.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0407.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0407.lmp new file mode 100644 index 0000000000..1ad003441e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0407.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0408.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0408.lmp new file mode 100644 index 0000000000..7ad8fbd85c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0408.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0409.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0409.lmp new file mode 100644 index 0000000000..8d5641010e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0409.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040A.lmp new file mode 100644 index 0000000000..cc6e60363d Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040B.lmp new file mode 100644 index 0000000000..474c633329 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040C.lmp new file mode 100644 index 0000000000..7ea7d48764 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040E.lmp new file mode 100644 index 0000000000..a89fbd14f0 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040F.lmp new file mode 100644 index 0000000000..98381f3df9 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0410.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0410.lmp new file mode 100644 index 0000000000..a838d54f15 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0410.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0411.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0411.lmp new file mode 100644 index 0000000000..228844314f Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0411.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0412.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0412.lmp new file mode 100644 index 0000000000..0700f6020b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0412.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0413.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0413.lmp new file mode 100644 index 0000000000..0fb9a8159a Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0413.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0414.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0414.lmp new file mode 100644 index 0000000000..0154cda6e4 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0414.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0415.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0415.lmp new file mode 100644 index 0000000000..ed6f0036d6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0415.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0416.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0416.lmp new file mode 100644 index 0000000000..9dc4969925 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0416.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0417.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0417.lmp new file mode 100644 index 0000000000..fcf34cf900 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0417.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0418.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0418.lmp new file mode 100644 index 0000000000..5bfa7ebe41 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0418.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0419.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0419.lmp new file mode 100644 index 0000000000..936a3c5183 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0419.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041A.lmp new file mode 100644 index 0000000000..f68e086c56 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041B.lmp new file mode 100644 index 0000000000..f390db584e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041C.lmp new file mode 100644 index 0000000000..cba4ffc5b2 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041D.lmp new file mode 100644 index 0000000000..b2b14f62c4 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041E.lmp new file mode 100644 index 0000000000..809cd26a99 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041F.lmp new file mode 100644 index 0000000000..c0642613ef Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0420.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0420.lmp new file mode 100644 index 0000000000..8f9c543f2b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0420.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0421.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0421.lmp new file mode 100644 index 0000000000..41cd7ec332 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0421.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0422.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0422.lmp new file mode 100644 index 0000000000..2937370471 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0422.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0423.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0423.lmp new file mode 100644 index 0000000000..d0b804232d Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0423.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0424.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0424.lmp new file mode 100644 index 0000000000..578b1e833d Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0424.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0425.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0425.lmp new file mode 100644 index 0000000000..6f45e2b69f Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0425.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0426.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0426.lmp new file mode 100644 index 0000000000..90ff891a76 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0426.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0427.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0427.lmp new file mode 100644 index 0000000000..bf4bbdb26f Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0427.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0428.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0428.lmp new file mode 100644 index 0000000000..9169fbb870 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0428.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0429.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0429.lmp new file mode 100644 index 0000000000..83539039f9 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0429.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042A.lmp new file mode 100644 index 0000000000..f7f001fdbc Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042B.lmp new file mode 100644 index 0000000000..ff5f8f2b14 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042C.lmp new file mode 100644 index 0000000000..79ad681574 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042D.lmp new file mode 100644 index 0000000000..749bc7314e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042E.lmp new file mode 100644 index 0000000000..027ddd5d32 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042F.lmp new file mode 100644 index 0000000000..9312be6b2b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0490.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0490.lmp new file mode 100644 index 0000000000..4f91eca44b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0490.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/2013.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/2013.lmp new file mode 100644 index 0000000000..22b90ba0f2 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/2013.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/font.inf b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/font.inf new file mode 100644 index 0000000000..f3a0b61865 --- /dev/null +++ b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/font.inf @@ -0,0 +1,3 @@ +Kerning -1 +FontHeight 16 + diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0021.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0021.lmp new file mode 100644 index 0000000000..c6e74a303b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0021.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0022.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0022.lmp new file mode 100644 index 0000000000..7d1d386197 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0022.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0023.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0023.lmp new file mode 100644 index 0000000000..4975a93a94 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0023.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0024.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0024.lmp new file mode 100644 index 0000000000..a58be35fd5 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0024.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0025.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0025.lmp new file mode 100644 index 0000000000..46264c2214 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0025.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0026.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0026.lmp new file mode 100644 index 0000000000..a5082b0289 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0026.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0027.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0027.lmp new file mode 100644 index 0000000000..66ff537dec Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0027.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0028.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0028.lmp new file mode 100644 index 0000000000..447da96021 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0028.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0029.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0029.lmp new file mode 100644 index 0000000000..07df3a30d3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0029.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002A.lmp new file mode 100644 index 0000000000..a9750a59cc Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002B.lmp new file mode 100644 index 0000000000..f8233a3e84 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002C.lmp new file mode 100644 index 0000000000..8593486096 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002D.lmp new file mode 100644 index 0000000000..39e4d07c59 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002E.lmp new file mode 100644 index 0000000000..a545844101 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002F.lmp new file mode 100644 index 0000000000..423d7754ab Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0030.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0030.lmp new file mode 100644 index 0000000000..62e3543edc Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0030.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0031.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0031.lmp new file mode 100644 index 0000000000..1a63710954 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0031.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0032.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0032.lmp new file mode 100644 index 0000000000..a319eef9b0 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0032.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0033.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0033.lmp new file mode 100644 index 0000000000..f8e389ac4a Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0033.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0034.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0034.lmp new file mode 100644 index 0000000000..d6af9bf61d Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0034.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0035.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0035.lmp new file mode 100644 index 0000000000..d474cb3197 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0035.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0036.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0036.lmp new file mode 100644 index 0000000000..5efa5665e4 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0036.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0037.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0037.lmp new file mode 100644 index 0000000000..748794f128 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0037.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0038.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0038.lmp new file mode 100644 index 0000000000..19f6b485ec Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0038.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0039.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0039.lmp new file mode 100644 index 0000000000..05286cd41c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0039.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003A.lmp new file mode 100644 index 0000000000..772fe07a56 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003B.lmp new file mode 100644 index 0000000000..61b0a858ba Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003C.lmp new file mode 100644 index 0000000000..5caa691577 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003D.lmp new file mode 100644 index 0000000000..a26ac69a01 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003E.lmp new file mode 100644 index 0000000000..353a3468eb Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003F.lmp new file mode 100644 index 0000000000..132acc43c2 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0040.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0040.lmp new file mode 100644 index 0000000000..3d15e500b1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0040.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0041.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0041.lmp new file mode 100644 index 0000000000..a017a92cac Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0041.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0042.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0042.lmp new file mode 100644 index 0000000000..45e21d75ce Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0042.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0043.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0043.lmp new file mode 100644 index 0000000000..b753f01819 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0043.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0044.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0044.lmp new file mode 100644 index 0000000000..8c02cacf9a Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0044.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0045.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0045.lmp new file mode 100644 index 0000000000..c9388feec3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0045.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0046.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0046.lmp new file mode 100644 index 0000000000..964f8c68e3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0046.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0047.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0047.lmp new file mode 100644 index 0000000000..585f6b1170 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0047.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0048.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0048.lmp new file mode 100644 index 0000000000..8648b88233 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0048.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0049.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0049.lmp new file mode 100644 index 0000000000..2539ac83ef Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0049.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004A.lmp new file mode 100644 index 0000000000..10b50e6c43 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004B.lmp new file mode 100644 index 0000000000..b2c88a69a7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004C.lmp new file mode 100644 index 0000000000..def2daf69b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004D.lmp new file mode 100644 index 0000000000..222e24e1bc Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004E.lmp new file mode 100644 index 0000000000..c7ad030a3b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004F.lmp new file mode 100644 index 0000000000..a52f9ed0df Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0050.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0050.lmp new file mode 100644 index 0000000000..36ae678869 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0050.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0051.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0051.lmp new file mode 100644 index 0000000000..d432664b04 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0051.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0052.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0052.lmp new file mode 100644 index 0000000000..e718b1fb8a Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0052.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0053.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0053.lmp new file mode 100644 index 0000000000..78d408ff78 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0053.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0054.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0054.lmp new file mode 100644 index 0000000000..e332bddddb Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0054.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0055.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0055.lmp new file mode 100644 index 0000000000..009a2052ae Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0055.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0056.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0056.lmp new file mode 100644 index 0000000000..c40220b0a4 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0056.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0057.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0057.lmp new file mode 100644 index 0000000000..486f60269b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0057.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0058.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0058.lmp new file mode 100644 index 0000000000..48993a7e4c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0058.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0059.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0059.lmp new file mode 100644 index 0000000000..9652e731f2 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0059.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005A.lmp new file mode 100644 index 0000000000..bce324bd43 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005B.lmp new file mode 100644 index 0000000000..c3ea98f596 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005C.lmp new file mode 100644 index 0000000000..37dfbe1be3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005D.lmp new file mode 100644 index 0000000000..5ed5da4ddb Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005E.lmp new file mode 100644 index 0000000000..df3d7a4958 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005F.lmp new file mode 100644 index 0000000000..400fefe10d Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0060.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0060.lmp new file mode 100644 index 0000000000..f8d466f194 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0060.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0061.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0061.lmp new file mode 100644 index 0000000000..7276c0c172 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0061.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0062.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0062.lmp new file mode 100644 index 0000000000..2baf91394a Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0062.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0063.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0063.lmp new file mode 100644 index 0000000000..36cf65ef32 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0063.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0064.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0064.lmp new file mode 100644 index 0000000000..13bd903ad1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0064.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0065.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0065.lmp new file mode 100644 index 0000000000..62f301d23c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0065.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0066.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0066.lmp new file mode 100644 index 0000000000..6042a0dd0e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0066.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0067.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0067.lmp new file mode 100644 index 0000000000..e220b5d5d5 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0067.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0068.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0068.lmp new file mode 100644 index 0000000000..7e5975f345 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0068.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0069.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0069.lmp new file mode 100644 index 0000000000..4a6c9ed193 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0069.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006A.lmp new file mode 100644 index 0000000000..4a1d6d2f81 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006B.lmp new file mode 100644 index 0000000000..9e1141a601 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006C.lmp new file mode 100644 index 0000000000..ada0e86e7d Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006D.lmp new file mode 100644 index 0000000000..e0d3da89b1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006E.lmp new file mode 100644 index 0000000000..c97577d511 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006F.lmp new file mode 100644 index 0000000000..efa3f7d5ad Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0070.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0070.lmp new file mode 100644 index 0000000000..f277b46639 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0070.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0071.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0071.lmp new file mode 100644 index 0000000000..734a4dc8c0 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0071.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0072.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0072.lmp new file mode 100644 index 0000000000..ac39dd6d90 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0072.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0073.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0073.lmp new file mode 100644 index 0000000000..1c45185044 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0073.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0074.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0074.lmp new file mode 100644 index 0000000000..b36a26ea53 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0074.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0075.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0075.lmp new file mode 100644 index 0000000000..ceaf39eb93 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0075.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0076.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0076.lmp new file mode 100644 index 0000000000..3ac240a563 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0076.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0077.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0077.lmp new file mode 100644 index 0000000000..d7225a6fe4 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0077.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0078.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0078.lmp new file mode 100644 index 0000000000..6e0ff784e3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0078.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0079.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0079.lmp new file mode 100644 index 0000000000..41414336bb Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0079.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/007A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/007A.lmp new file mode 100644 index 0000000000..c480c79b48 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/007A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C0.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C0.lmp new file mode 100644 index 0000000000..ce11df8fd1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C0.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C1.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C1.lmp new file mode 100644 index 0000000000..8b4153d2d9 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C1.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C2.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C2.lmp new file mode 100644 index 0000000000..5af3a37a9b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C2.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C3.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C3.lmp new file mode 100644 index 0000000000..7f26a9ca3a Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C3.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C4.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C4.lmp new file mode 100644 index 0000000000..fcf57173b7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C4.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C5.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C5.lmp new file mode 100644 index 0000000000..f56bff936b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C5.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C6.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C6.lmp new file mode 100644 index 0000000000..e3531957c4 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C6.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C7.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C7.lmp new file mode 100644 index 0000000000..b189844a3c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C7.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C8.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C8.lmp new file mode 100644 index 0000000000..928b2e0072 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C8.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C9.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C9.lmp new file mode 100644 index 0000000000..01af203e1f Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C9.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CA.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CA.lmp new file mode 100644 index 0000000000..b83e585b7a Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CA.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CB.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CB.lmp new file mode 100644 index 0000000000..599f085c81 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CB.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CC.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CC.lmp new file mode 100644 index 0000000000..e9683092d7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CC.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CD.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CD.lmp new file mode 100644 index 0000000000..b7966584b2 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CD.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CE.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CE.lmp new file mode 100644 index 0000000000..d2fafed01f Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CE.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CF.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CF.lmp new file mode 100644 index 0000000000..6c93f82a06 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CF.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D0.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D0.lmp new file mode 100644 index 0000000000..d69534d77b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D0.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D1.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D1.lmp new file mode 100644 index 0000000000..7c0598de60 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D1.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D2.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D2.lmp new file mode 100644 index 0000000000..d484b703ee Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D2.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D3.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D3.lmp new file mode 100644 index 0000000000..f823b5a58e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D3.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D4.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D4.lmp new file mode 100644 index 0000000000..e184d5c1e6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D4.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D5.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D5.lmp new file mode 100644 index 0000000000..021a9bdd9b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D5.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D6.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D6.lmp new file mode 100644 index 0000000000..dc65476c00 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D6.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D8.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D8.lmp new file mode 100644 index 0000000000..6e2ff4b2a5 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D8.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D9.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D9.lmp new file mode 100644 index 0000000000..3bcc286e3f Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D9.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DA.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DA.lmp new file mode 100644 index 0000000000..c002021f02 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DA.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DB.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DB.lmp new file mode 100644 index 0000000000..6c8eb58d16 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DB.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DC.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DC.lmp new file mode 100644 index 0000000000..5b51821e2e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DC.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DD.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DD.lmp new file mode 100644 index 0000000000..2d61499d4c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DD.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DE.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DE.lmp new file mode 100644 index 0000000000..b154387973 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DE.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DF.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DF.lmp new file mode 100644 index 0000000000..13283798fe Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DF.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E0.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E0.lmp new file mode 100644 index 0000000000..fcd055e48d Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E0.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E1.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E1.lmp new file mode 100644 index 0000000000..2e76786951 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E1.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E2.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E2.lmp new file mode 100644 index 0000000000..c1e878431e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E2.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E3.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E3.lmp new file mode 100644 index 0000000000..c4403b9dd6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E3.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E4.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E4.lmp new file mode 100644 index 0000000000..1856d135a1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E4.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E5.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E5.lmp new file mode 100644 index 0000000000..d0c3833851 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E5.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E6.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E6.lmp new file mode 100644 index 0000000000..953c06aaaf Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E6.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E7.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E7.lmp new file mode 100644 index 0000000000..6420f09e0d Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E7.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E8.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E8.lmp new file mode 100644 index 0000000000..1818a2a899 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E8.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E9.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E9.lmp new file mode 100644 index 0000000000..c35d4deb70 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E9.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EA.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EA.lmp new file mode 100644 index 0000000000..f43aa77844 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EA.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EB.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EB.lmp new file mode 100644 index 0000000000..4c1dd49924 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EB.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EC.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EC.lmp new file mode 100644 index 0000000000..4b50169ed6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EC.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00ED.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00ED.lmp new file mode 100644 index 0000000000..511aaccb1b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00ED.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EE.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EE.lmp new file mode 100644 index 0000000000..a1a54498ef Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EE.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EF.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EF.lmp new file mode 100644 index 0000000000..9da5a4b0cc Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EF.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F0.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F0.lmp new file mode 100644 index 0000000000..730bbce6f6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F0.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F1.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F1.lmp new file mode 100644 index 0000000000..0f8f619287 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F1.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F2.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F2.lmp new file mode 100644 index 0000000000..06e6f36cfe Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F2.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F3.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F3.lmp new file mode 100644 index 0000000000..7e6bece272 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F3.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F4.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F4.lmp new file mode 100644 index 0000000000..bd207c5204 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F4.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F5.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F5.lmp new file mode 100644 index 0000000000..725ec88567 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F5.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F6.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F6.lmp new file mode 100644 index 0000000000..bc8e89d036 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F6.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F8.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F8.lmp new file mode 100644 index 0000000000..8cabf51ec8 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F8.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F9.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F9.lmp new file mode 100644 index 0000000000..c4af621f71 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F9.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FA.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FA.lmp new file mode 100644 index 0000000000..9a275929ca Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FA.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FB.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FB.lmp new file mode 100644 index 0000000000..e58cbf9c07 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FB.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FC.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FC.lmp new file mode 100644 index 0000000000..7c32f19b7c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FC.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FD.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FD.lmp new file mode 100644 index 0000000000..8d47f7c105 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FD.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FE.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FE.lmp new file mode 100644 index 0000000000..65f85c4454 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FE.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FF.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FF.lmp new file mode 100644 index 0000000000..fa4fe54489 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FF.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0110.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0110.lmp new file mode 100644 index 0000000000..d69534d77b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0110.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0111.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0111.lmp new file mode 100644 index 0000000000..730bbce6f6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0111.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0401.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0401.lmp new file mode 100644 index 0000000000..599f085c81 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0401.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0402.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0402.lmp new file mode 100644 index 0000000000..4f72414a26 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0402.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0403.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0403.lmp new file mode 100644 index 0000000000..97a973832f Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0403.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0404.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0404.lmp new file mode 100644 index 0000000000..c9388feec3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0404.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0405.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0405.lmp new file mode 100644 index 0000000000..78d408ff78 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0405.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0406.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0406.lmp new file mode 100644 index 0000000000..2539ac83ef Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0406.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0407.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0407.lmp new file mode 100644 index 0000000000..6c93f82a06 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0407.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0408.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0408.lmp new file mode 100644 index 0000000000..10b50e6c43 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0408.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0409.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0409.lmp new file mode 100644 index 0000000000..db25394db1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0409.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040A.lmp new file mode 100644 index 0000000000..c368480e22 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040B.lmp new file mode 100644 index 0000000000..33b4ea06fd Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040C.lmp new file mode 100644 index 0000000000..3817a89810 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040E.lmp new file mode 100644 index 0000000000..6d5f4b27fa Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040F.lmp new file mode 100644 index 0000000000..faee951767 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0410.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0410.lmp new file mode 100644 index 0000000000..a017a92cac Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0410.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0411.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0411.lmp new file mode 100644 index 0000000000..205b334e39 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0411.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0412.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0412.lmp new file mode 100644 index 0000000000..45e21d75ce Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0412.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0413.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0413.lmp new file mode 100644 index 0000000000..9ddbd0bfce Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0413.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0414.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0414.lmp new file mode 100644 index 0000000000..ed1d4955f1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0414.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0415.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0415.lmp new file mode 100644 index 0000000000..c9388feec3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0415.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0416.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0416.lmp new file mode 100644 index 0000000000..131e107efa Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0416.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0417.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0417.lmp new file mode 100644 index 0000000000..f3b3427c0d Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0417.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0418.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0418.lmp new file mode 100644 index 0000000000..d178e69a98 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0418.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0419.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0419.lmp new file mode 100644 index 0000000000..a014574044 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0419.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041A.lmp new file mode 100644 index 0000000000..b2c88a69a7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041B.lmp new file mode 100644 index 0000000000..c9903bfa3e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041C.lmp new file mode 100644 index 0000000000..222e24e1bc Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041D.lmp new file mode 100644 index 0000000000..8648b88233 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041E.lmp new file mode 100644 index 0000000000..a52f9ed0df Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041F.lmp new file mode 100644 index 0000000000..94bb9376c4 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0420.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0420.lmp new file mode 100644 index 0000000000..36ae678869 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0420.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0421.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0421.lmp new file mode 100644 index 0000000000..b753f01819 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0421.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0422.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0422.lmp new file mode 100644 index 0000000000..e332bddddb Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0422.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0423.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0423.lmp new file mode 100644 index 0000000000..d8b150ba95 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0423.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0424.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0424.lmp new file mode 100644 index 0000000000..bf20a425e3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0424.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0425.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0425.lmp new file mode 100644 index 0000000000..48993a7e4c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0425.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0426.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0426.lmp new file mode 100644 index 0000000000..c389eafa23 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0426.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0427.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0427.lmp new file mode 100644 index 0000000000..7528637ea7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0427.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0428.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0428.lmp new file mode 100644 index 0000000000..b9e613adce Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0428.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0429.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0429.lmp new file mode 100644 index 0000000000..f3bda565b0 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0429.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042A.lmp new file mode 100644 index 0000000000..09677b86d8 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042B.lmp new file mode 100644 index 0000000000..6917587378 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042C.lmp new file mode 100644 index 0000000000..3d7e2c8d27 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042D.lmp new file mode 100644 index 0000000000..1e7496ab6c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042E.lmp new file mode 100644 index 0000000000..24e1880caa Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042F.lmp new file mode 100644 index 0000000000..488736521e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0430.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0430.lmp new file mode 100644 index 0000000000..7276c0c172 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0430.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0431.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0431.lmp new file mode 100644 index 0000000000..813a36ed9f Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0431.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0432.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0432.lmp new file mode 100644 index 0000000000..2baf91394a Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0432.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0433.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0433.lmp new file mode 100644 index 0000000000..5bbf3a958c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0433.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0434.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0434.lmp new file mode 100644 index 0000000000..51baefa4f6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0434.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0435.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0435.lmp new file mode 100644 index 0000000000..62f301d23c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0435.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0436.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0436.lmp new file mode 100644 index 0000000000..b27c9d51f9 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0436.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0437.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0437.lmp new file mode 100644 index 0000000000..2d2817921d Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0437.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0438.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0438.lmp new file mode 100644 index 0000000000..f32ff0ef64 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0438.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0439.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0439.lmp new file mode 100644 index 0000000000..6d37d20551 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0439.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043A.lmp new file mode 100644 index 0000000000..9e1141a601 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043B.lmp new file mode 100644 index 0000000000..4653ebd900 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043C.lmp new file mode 100644 index 0000000000..e0d3da89b1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043D.lmp new file mode 100644 index 0000000000..b1e468842c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043E.lmp new file mode 100644 index 0000000000..efa3f7d5ad Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043F.lmp new file mode 100644 index 0000000000..ec98576104 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0440.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0440.lmp new file mode 100644 index 0000000000..f277b46639 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0440.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0441.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0441.lmp new file mode 100644 index 0000000000..36cf65ef32 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0441.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0442.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0442.lmp new file mode 100644 index 0000000000..b36a26ea53 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0442.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0443.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0443.lmp new file mode 100644 index 0000000000..ffd1e8cf0b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0443.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0444.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0444.lmp new file mode 100644 index 0000000000..8c22d19050 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0444.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0445.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0445.lmp new file mode 100644 index 0000000000..6e0ff784e3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0445.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0446.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0446.lmp new file mode 100644 index 0000000000..2b65486903 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0446.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0447.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0447.lmp new file mode 100644 index 0000000000..79491e07ca Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0447.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0448.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0448.lmp new file mode 100644 index 0000000000..3db8db47f1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0448.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0449.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0449.lmp new file mode 100644 index 0000000000..737e597c9c Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0449.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044A.lmp new file mode 100644 index 0000000000..6daa24900b Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044B.lmp new file mode 100644 index 0000000000..80f3a7c6fd Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044C.lmp new file mode 100644 index 0000000000..80abaf87c6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044D.lmp new file mode 100644 index 0000000000..8c4ece81c2 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044D.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044E.lmp new file mode 100644 index 0000000000..65fb7a720e Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044F.lmp new file mode 100644 index 0000000000..72d254d1b1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0451.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0451.lmp new file mode 100644 index 0000000000..4c1dd49924 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0451.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0452.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0452.lmp new file mode 100644 index 0000000000..d029013b64 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0452.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0453.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0453.lmp new file mode 100644 index 0000000000..7c2d3f79b9 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0453.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0454.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0454.lmp new file mode 100644 index 0000000000..65262f563d Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0454.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0455.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0455.lmp new file mode 100644 index 0000000000..1c45185044 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0455.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0456.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0456.lmp new file mode 100644 index 0000000000..4a6c9ed193 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0456.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0457.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0457.lmp new file mode 100644 index 0000000000..9da5a4b0cc Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0457.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0458.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0458.lmp new file mode 100644 index 0000000000..4a1d6d2f81 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0458.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0459.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0459.lmp new file mode 100644 index 0000000000..129cc00ef5 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0459.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045A.lmp new file mode 100644 index 0000000000..a7f8b67a20 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045A.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045B.lmp new file mode 100644 index 0000000000..4687f23565 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045B.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045C.lmp new file mode 100644 index 0000000000..d9824eafa0 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045C.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045E.lmp new file mode 100644 index 0000000000..d8c0f6904a Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045F.lmp new file mode 100644 index 0000000000..25df0250e6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045F.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0490.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0490.lmp new file mode 100644 index 0000000000..d317c26187 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0490.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0491.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0491.lmp new file mode 100644 index 0000000000..472c86c18a Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0491.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/1E9E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/1E9E.lmp new file mode 100644 index 0000000000..946ff3e5b0 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/1E9E.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/2013.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/2013.lmp new file mode 100644 index 0000000000..22b90ba0f2 Binary files /dev/null and b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/2013.lmp differ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/font.inf b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/font.inf new file mode 100644 index 0000000000..1794c6c03f --- /dev/null +++ b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/font.inf @@ -0,0 +1 @@ +Kerning -1 diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0410.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0410.lmp new file mode 100644 index 0000000000..2ffcdb6b90 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0410.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0411.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0411.lmp new file mode 100644 index 0000000000..bf333fc4b1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0411.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0412.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0412.lmp new file mode 100644 index 0000000000..a57ec1014b Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0412.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0413.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0413.lmp new file mode 100644 index 0000000000..36ad931877 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0413.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0414.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0414.lmp new file mode 100644 index 0000000000..6bc728471a Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0414.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0415.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0415.lmp new file mode 100644 index 0000000000..5d8205ad02 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0415.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0416.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0416.lmp new file mode 100644 index 0000000000..494b23530e Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0416.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0417.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0417.lmp new file mode 100644 index 0000000000..8f206672bf Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0417.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0418.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0418.lmp new file mode 100644 index 0000000000..290fc2315a Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0418.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0419.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0419.lmp new file mode 100644 index 0000000000..6076140729 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0419.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041A.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041A.lmp new file mode 100644 index 0000000000..72a814c9a6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041A.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041B.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041B.lmp new file mode 100644 index 0000000000..bb676ac532 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041B.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041C.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041C.lmp new file mode 100644 index 0000000000..2d13eeb97a Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041C.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041D.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041D.lmp new file mode 100644 index 0000000000..e887cff945 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041D.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041E.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041E.lmp new file mode 100644 index 0000000000..cbd53e0dc8 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041E.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041F.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041F.lmp new file mode 100644 index 0000000000..a137d9f9db Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041F.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0420.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0420.lmp new file mode 100644 index 0000000000..928b2f120c Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0420.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0421.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0421.lmp new file mode 100644 index 0000000000..ee9724f757 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0421.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0422.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0422.lmp new file mode 100644 index 0000000000..d4b5a366fe Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0422.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0423.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0423.lmp new file mode 100644 index 0000000000..e001cbf2bb Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0423.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0424.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0424.lmp new file mode 100644 index 0000000000..6cec8edb5e Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0424.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0425.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0425.lmp new file mode 100644 index 0000000000..38a4f7b4d1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0425.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0426.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0426.lmp new file mode 100644 index 0000000000..0777d13d07 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0426.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0427.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0427.lmp new file mode 100644 index 0000000000..a6202e41d2 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0427.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0428.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0428.lmp new file mode 100644 index 0000000000..c6525098b0 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0428.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0429.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0429.lmp new file mode 100644 index 0000000000..5225c051b8 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0429.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042A.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042A.lmp new file mode 100644 index 0000000000..852b17a2dc Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042A.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042B.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042B.lmp new file mode 100644 index 0000000000..3af92647e3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042B.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042C.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042C.lmp new file mode 100644 index 0000000000..eee057f936 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042C.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042D.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042D.lmp new file mode 100644 index 0000000000..32668b119d Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042D.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042E.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042E.lmp new file mode 100644 index 0000000000..5259b879dc Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042E.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042F.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042F.lmp new file mode 100644 index 0000000000..15f2155dad Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042F.lmp differ diff --git a/wadsrc_extra/static/filter/game-raven/graphics/fonta60.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/005C.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/graphics/fonta60.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/005C.lmp diff --git a/wadsrc_extra/static/filter/game-raven/graphics/fonta61.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/005D.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/graphics/fonta61.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/005D.lmp diff --git a/wadsrc_extra/static/filter/game-raven/graphics/fonta62.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/005E.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/graphics/fonta62.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/005E.lmp diff --git a/wadsrc_extra/static/filter/game-raven/graphics/fonta63.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/005F.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/graphics/fonta63.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/005F.lmp diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00AB.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00AB.lmp new file mode 100644 index 0000000000..d91f95bbed Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00AB.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00BB.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00BB.lmp new file mode 100644 index 0000000000..dde0867e4d Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00BB.lmp differ diff --git a/wadsrc_extra/static/filter/game-raven/graphics/fonta164.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00C4.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/graphics/fonta164.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00C4.lmp diff --git a/wadsrc_extra/static/filter/game-raven/graphics/fonta165.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00C5.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/graphics/fonta165.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00C5.lmp diff --git a/wadsrc_extra/static/filter/game-raven/graphics/fonta182.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00D6.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/graphics/fonta182.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00D6.lmp diff --git a/wadsrc_extra/static/filter/game-raven/graphics/fonta188.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00DC.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/graphics/fonta188.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00DC.lmp diff --git a/wadsrc_extra/static/filter/game-raven/graphics/fonta191.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00DF.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/graphics/fonta191.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00DF.lmp diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0401.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0401.lmp new file mode 100644 index 0000000000..df10c490c7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0401.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0410.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0410.lmp new file mode 100644 index 0000000000..cc92008713 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0410.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0411.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0411.lmp new file mode 100644 index 0000000000..d64d5b41fd Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0411.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0412.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0412.lmp new file mode 100644 index 0000000000..21468524f9 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0412.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0413.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0413.lmp new file mode 100644 index 0000000000..2db9bdd386 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0413.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0414.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0414.lmp new file mode 100644 index 0000000000..38227551b6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0414.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0415.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0415.lmp new file mode 100644 index 0000000000..8daa85207f Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0415.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0416.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0416.lmp new file mode 100644 index 0000000000..fc520b5b19 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0416.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0417.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0417.lmp new file mode 100644 index 0000000000..35ffaa7df7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0417.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0418.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0418.lmp new file mode 100644 index 0000000000..6117f7f7b4 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0418.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0419.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0419.lmp new file mode 100644 index 0000000000..59b8107d1f Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0419.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041A.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041A.lmp new file mode 100644 index 0000000000..a99d51da59 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041A.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041B.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041B.lmp new file mode 100644 index 0000000000..6448b52285 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041B.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041C.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041C.lmp new file mode 100644 index 0000000000..4e565f4eee Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041C.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041D.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041D.lmp new file mode 100644 index 0000000000..82642cd420 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041D.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041E.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041E.lmp new file mode 100644 index 0000000000..a240e32e90 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041E.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041F.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041F.lmp new file mode 100644 index 0000000000..c03d05d82f Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041F.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0420.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0420.lmp new file mode 100644 index 0000000000..6052e03f89 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0420.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0421.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0421.lmp new file mode 100644 index 0000000000..a1347eb801 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0421.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0422.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0422.lmp new file mode 100644 index 0000000000..80a02b2649 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0422.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0423.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0423.lmp new file mode 100644 index 0000000000..fdbb168c2c Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0423.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0424.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0424.lmp new file mode 100644 index 0000000000..787892cff8 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0424.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0425.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0425.lmp new file mode 100644 index 0000000000..d4db7c0869 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0425.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0426.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0426.lmp new file mode 100644 index 0000000000..a395fc8ef1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0426.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0427.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0427.lmp new file mode 100644 index 0000000000..62c603421f Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0427.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0428.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0428.lmp new file mode 100644 index 0000000000..dad0cc925b Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0428.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0429.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0429.lmp new file mode 100644 index 0000000000..54134a5d6d Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0429.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042A.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042A.lmp new file mode 100644 index 0000000000..82ead3bacd Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042A.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042B.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042B.lmp new file mode 100644 index 0000000000..b3b73944ee Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042B.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042C.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042C.lmp new file mode 100644 index 0000000000..d723760fab Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042C.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042D.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042D.lmp new file mode 100644 index 0000000000..5d85497888 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042D.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042E.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042E.lmp new file mode 100644 index 0000000000..b685b3fde0 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042E.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042F.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042F.lmp new file mode 100644 index 0000000000..a954e2a592 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042F.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/2014.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/2014.lmp new file mode 100644 index 0000000000..819abe2adc Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/2014.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/201C.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/201C.lmp new file mode 100644 index 0000000000..0317cfd0a0 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/201C.lmp differ diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/201E.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/201E.lmp new file mode 100644 index 0000000000..9af871b809 Binary files /dev/null and b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/201E.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0410.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0410.lmp new file mode 100644 index 0000000000..02de944a24 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0410.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0411.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0411.lmp new file mode 100644 index 0000000000..1288286e54 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0411.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0412.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0412.lmp new file mode 100644 index 0000000000..8306ce4706 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0412.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0413.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0413.lmp new file mode 100644 index 0000000000..102a117953 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0413.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0414.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0414.lmp new file mode 100644 index 0000000000..2a11c2bd86 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0414.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0415.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0415.lmp new file mode 100644 index 0000000000..754a65dc0c Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0415.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0416.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0416.lmp new file mode 100644 index 0000000000..4070b04637 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0416.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0417.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0417.lmp new file mode 100644 index 0000000000..c06bf6134c Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0417.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0418.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0418.lmp new file mode 100644 index 0000000000..83c0424dd2 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0418.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0419.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0419.lmp new file mode 100644 index 0000000000..a46915f32e Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0419.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041A.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041A.lmp new file mode 100644 index 0000000000..caa995e1bc Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041A.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041B.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041B.lmp new file mode 100644 index 0000000000..e3488d6553 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041B.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041C.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041C.lmp new file mode 100644 index 0000000000..5e681a7770 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041C.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041D.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041D.lmp new file mode 100644 index 0000000000..4f1c7fdd9a Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041D.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041E.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041E.lmp new file mode 100644 index 0000000000..a34f0ba08a Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041E.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041F.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041F.lmp new file mode 100644 index 0000000000..796c87220f Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041F.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0420.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0420.lmp new file mode 100644 index 0000000000..2bb7db81ee Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0420.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0421.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0421.lmp new file mode 100644 index 0000000000..79cd7ca15a Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0421.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0422.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0422.lmp new file mode 100644 index 0000000000..ad3289cfd3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0422.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0423.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0423.lmp new file mode 100644 index 0000000000..85b3bdb279 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0423.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0424.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0424.lmp new file mode 100644 index 0000000000..fbd50a9d8c Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0424.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0425.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0425.lmp new file mode 100644 index 0000000000..1e48b4d2a3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0425.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0426.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0426.lmp new file mode 100644 index 0000000000..9c2225658a Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0426.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0427.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0427.lmp new file mode 100644 index 0000000000..83ba773c4c Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0427.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0428.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0428.lmp new file mode 100644 index 0000000000..c944d9286b Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0428.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0429.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0429.lmp new file mode 100644 index 0000000000..b06c17ea43 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0429.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042A.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042A.lmp new file mode 100644 index 0000000000..4bfb612d39 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042A.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042B.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042B.lmp new file mode 100644 index 0000000000..ad857bb1b1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042B.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042C.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042C.lmp new file mode 100644 index 0000000000..52f56e394e Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042C.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042D.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042D.lmp new file mode 100644 index 0000000000..839bd6177c Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042D.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042E.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042E.lmp new file mode 100644 index 0000000000..b83a2a43df Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042E.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042F.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042F.lmp new file mode 100644 index 0000000000..fe9c4a19f7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042F.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/005C.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/005C.lmp new file mode 100644 index 0000000000..bddfa8a356 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/005C.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/005D.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/005D.lmp new file mode 100644 index 0000000000..bddfa8a356 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/005D.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/005E.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/005E.lmp new file mode 100644 index 0000000000..79af547de8 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/005E.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/005F.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/005F.lmp new file mode 100644 index 0000000000..bddfa8a356 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/005F.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00AB.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00AB.lmp new file mode 100644 index 0000000000..19da358e41 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00AB.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00BB.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00BB.lmp new file mode 100644 index 0000000000..16eb6067b3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00BB.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00C4.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00C4.lmp new file mode 100644 index 0000000000..e93ede5533 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00C4.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00C5.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00C5.lmp new file mode 100644 index 0000000000..87644a898e Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00C5.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00D6.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00D6.lmp new file mode 100644 index 0000000000..2fc034052a Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00D6.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00DC.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00DC.lmp new file mode 100644 index 0000000000..1a06ecd1de Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00DC.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00DF.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00DF.lmp new file mode 100644 index 0000000000..8d7f69ec2a Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00DF.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0401.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0401.lmp new file mode 100644 index 0000000000..fb128a8f58 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0401.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0410.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0410.lmp new file mode 100644 index 0000000000..86abcf7e85 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0410.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0411.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0411.lmp new file mode 100644 index 0000000000..fb5961475b Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0411.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0412.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0412.lmp new file mode 100644 index 0000000000..6b966352fc Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0412.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0413.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0413.lmp new file mode 100644 index 0000000000..0a45b8110e Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0413.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0414.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0414.lmp new file mode 100644 index 0000000000..ee0ea2ce10 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0414.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0415.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0415.lmp new file mode 100644 index 0000000000..0934510b39 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0415.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0416.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0416.lmp new file mode 100644 index 0000000000..8a5d3bae35 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0416.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0417.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0417.lmp new file mode 100644 index 0000000000..2efe76f16e Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0417.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0418.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0418.lmp new file mode 100644 index 0000000000..df029aab76 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0418.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0419.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0419.lmp new file mode 100644 index 0000000000..92c6f21521 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0419.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041A.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041A.lmp new file mode 100644 index 0000000000..6c3796137b Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041A.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041B.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041B.lmp new file mode 100644 index 0000000000..77aef63b31 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041B.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041C.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041C.lmp new file mode 100644 index 0000000000..a7202cdb99 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041C.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041D.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041D.lmp new file mode 100644 index 0000000000..cf7bd0b487 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041D.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041E.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041E.lmp new file mode 100644 index 0000000000..c25542b725 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041E.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041F.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041F.lmp new file mode 100644 index 0000000000..da4b9f7297 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041F.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0420.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0420.lmp new file mode 100644 index 0000000000..108eb57ae6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0420.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0421.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0421.lmp new file mode 100644 index 0000000000..a02f2d1efc Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0421.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0422.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0422.lmp new file mode 100644 index 0000000000..db269314b1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0422.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0423.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0423.lmp new file mode 100644 index 0000000000..7978f087d9 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0423.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0424.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0424.lmp new file mode 100644 index 0000000000..09a6efc882 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0424.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0425.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0425.lmp new file mode 100644 index 0000000000..bef7228e58 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0425.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0426.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0426.lmp new file mode 100644 index 0000000000..6c064144a9 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0426.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0427.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0427.lmp new file mode 100644 index 0000000000..0c33938676 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0427.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0428.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0428.lmp new file mode 100644 index 0000000000..7467d1268e Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0428.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0429.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0429.lmp new file mode 100644 index 0000000000..9e175125f0 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0429.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042A.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042A.lmp new file mode 100644 index 0000000000..dd96c4ee25 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042A.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042B.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042B.lmp new file mode 100644 index 0000000000..38b777b559 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042B.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042C.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042C.lmp new file mode 100644 index 0000000000..288cdd3838 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042C.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042D.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042D.lmp new file mode 100644 index 0000000000..7877d45c5a Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042D.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042E.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042E.lmp new file mode 100644 index 0000000000..f773c9a737 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042E.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042F.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042F.lmp new file mode 100644 index 0000000000..425e8d91a3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042F.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/2014.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/2014.lmp new file mode 100644 index 0000000000..59df945dc2 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/2014.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/201C.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/201C.lmp new file mode 100644 index 0000000000..18f38ddddb Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/201C.lmp differ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/201E.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/201E.lmp new file mode 100644 index 0000000000..16271f7785 Binary files /dev/null and b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/201E.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0021.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0021.lmp new file mode 100644 index 0000000000..8fdf63952e Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0021.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0022.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0022.lmp new file mode 100644 index 0000000000..fc32c12e6e Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0022.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0025.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0025.lmp new file mode 100644 index 0000000000..d3c7f950dc Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0025.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0027.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0027.lmp new file mode 100644 index 0000000000..bea315b7d8 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0027.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002B.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002B.lmp new file mode 100644 index 0000000000..bfc11809a6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002B.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002C.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002C.lmp new file mode 100644 index 0000000000..f33d3ed5a3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002C.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002D.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002D.lmp new file mode 100644 index 0000000000..4970f04132 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002D.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002E.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002E.lmp new file mode 100644 index 0000000000..cbaa88f777 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002E.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002F.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002F.lmp new file mode 100644 index 0000000000..7fb2fb46c1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002F.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0030.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0030.lmp new file mode 100644 index 0000000000..71be6fbd5d Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0030.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0031.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0031.lmp new file mode 100644 index 0000000000..7980d45294 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0031.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0032.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0032.lmp new file mode 100644 index 0000000000..b72ebf6c9e Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0032.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0033.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0033.lmp new file mode 100644 index 0000000000..72c3f80e7b Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0033.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0034.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0034.lmp new file mode 100644 index 0000000000..32bfa8e679 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0034.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0035.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0035.lmp new file mode 100644 index 0000000000..3f0151457b Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0035.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0036.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0036.lmp new file mode 100644 index 0000000000..8320dad427 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0036.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0037.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0037.lmp new file mode 100644 index 0000000000..678cfcf234 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0037.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0038.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0038.lmp new file mode 100644 index 0000000000..1a2eaa7751 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0038.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0039.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0039.lmp new file mode 100644 index 0000000000..64b42f3753 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0039.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/003A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/003A.lmp new file mode 100644 index 0000000000..55ee39f335 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/003A.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/003B.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/003B.lmp new file mode 100644 index 0000000000..93c5083b3c Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/003B.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0041.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0041.lmp new file mode 100644 index 0000000000..3edbf25aef Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0041.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0042.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0042.lmp new file mode 100644 index 0000000000..ccd15296a8 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0042.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0043.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0043.lmp new file mode 100644 index 0000000000..6d0285f037 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0043.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0044.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0044.lmp new file mode 100644 index 0000000000..867160aec6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0044.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0045.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0045.lmp new file mode 100644 index 0000000000..a455336bdc Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0045.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0046.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0046.lmp new file mode 100644 index 0000000000..f46710e5b2 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0046.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0047.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0047.lmp new file mode 100644 index 0000000000..5ec7de00d3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0047.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0048.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0048.lmp new file mode 100644 index 0000000000..a1c28d9ec1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0048.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0049.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0049.lmp new file mode 100644 index 0000000000..ec443369c9 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0049.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004A.lmp new file mode 100644 index 0000000000..95037e0627 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004A.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004B.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004B.lmp new file mode 100644 index 0000000000..94a3cf5968 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004B.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004C.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004C.lmp new file mode 100644 index 0000000000..6c03cfc75c Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004C.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004D.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004D.lmp new file mode 100644 index 0000000000..82a8d8c104 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004D.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004E.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004E.lmp new file mode 100644 index 0000000000..f1ba744b9c Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004E.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004F.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004F.lmp new file mode 100644 index 0000000000..71be6fbd5d Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004F.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0050.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0050.lmp new file mode 100644 index 0000000000..7598665fa5 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0050.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0051.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0051.lmp new file mode 100644 index 0000000000..8b5d308227 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0051.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0052.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0052.lmp new file mode 100644 index 0000000000..f1e0a659ab Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0052.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0053.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0053.lmp new file mode 100644 index 0000000000..8e8ff514ed Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0053.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0054.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0054.lmp new file mode 100644 index 0000000000..898c3c2496 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0054.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0055.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0055.lmp new file mode 100644 index 0000000000..c9d007ed7c Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0055.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0056.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0056.lmp new file mode 100644 index 0000000000..4a57ad9a2f Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0056.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0057.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0057.lmp new file mode 100644 index 0000000000..9da65d67a6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0057.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0058.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0058.lmp new file mode 100644 index 0000000000..a447eb80f5 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0058.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0059.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0059.lmp new file mode 100644 index 0000000000..635bcbcf87 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0059.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/005A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/005A.lmp new file mode 100644 index 0000000000..b9216a5e12 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/005A.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/00AB.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/00AB.lmp new file mode 100644 index 0000000000..24e73edd0b Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/00AB.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/00BB.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/00BB.lmp new file mode 100644 index 0000000000..7afb1e2821 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/00BB.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0410.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0410.lmp new file mode 100644 index 0000000000..3edbf25aef Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0410.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0411.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0411.lmp new file mode 100644 index 0000000000..c5569beff8 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0411.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0412.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0412.lmp new file mode 100644 index 0000000000..ccd15296a8 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0412.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0413.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0413.lmp new file mode 100644 index 0000000000..944a38c1aa Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0413.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0414.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0414.lmp new file mode 100644 index 0000000000..d05672db9d Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0414.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0415.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0415.lmp new file mode 100644 index 0000000000..a455336bdc Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0415.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0416.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0416.lmp new file mode 100644 index 0000000000..8f128e1554 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0416.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0417.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0417.lmp new file mode 100644 index 0000000000..36751642ac Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0417.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0418.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0418.lmp new file mode 100644 index 0000000000..38e9ad6e72 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0418.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0419.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0419.lmp new file mode 100644 index 0000000000..08a399b753 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0419.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041A.lmp new file mode 100644 index 0000000000..b140bd3021 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041A.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041B.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041B.lmp new file mode 100644 index 0000000000..0a8c991cca Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041B.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041C.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041C.lmp new file mode 100644 index 0000000000..82a8d8c104 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041C.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041D.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041D.lmp new file mode 100644 index 0000000000..a1c28d9ec1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041D.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041E.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041E.lmp new file mode 100644 index 0000000000..71be6fbd5d Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041E.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041F.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041F.lmp new file mode 100644 index 0000000000..d05aa69420 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041F.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0420.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0420.lmp new file mode 100644 index 0000000000..7598665fa5 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0420.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0421.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0421.lmp new file mode 100644 index 0000000000..6d0285f037 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0421.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0422.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0422.lmp new file mode 100644 index 0000000000..898c3c2496 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0422.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0423.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0423.lmp new file mode 100644 index 0000000000..635bcbcf87 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0423.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0424.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0424.lmp new file mode 100644 index 0000000000..69858c5348 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0424.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0425.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0425.lmp new file mode 100644 index 0000000000..a447eb80f5 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0425.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0426.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0426.lmp new file mode 100644 index 0000000000..afa8eac5a7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0426.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0427.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0427.lmp new file mode 100644 index 0000000000..f9cbe54bf0 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0427.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0428.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0428.lmp new file mode 100644 index 0000000000..f6475c6007 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0428.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0429.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0429.lmp new file mode 100644 index 0000000000..2c1db826b7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0429.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042A.lmp new file mode 100644 index 0000000000..9489f19b52 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042A.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042B.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042B.lmp new file mode 100644 index 0000000000..fc54d1d887 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042B.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042C.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042C.lmp new file mode 100644 index 0000000000..40072466c7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042C.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042D.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042D.lmp new file mode 100644 index 0000000000..9330016b43 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042D.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042E.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042E.lmp new file mode 100644 index 0000000000..af0ceb5c09 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042E.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042F.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042F.lmp new file mode 100644 index 0000000000..85d8bdfa83 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042F.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/00AB.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/00AB.lmp new file mode 100644 index 0000000000..a165eb46a4 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/00AB.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/00BB.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/00BB.lmp new file mode 100644 index 0000000000..cb65859818 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/00BB.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0401.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0401.lmp new file mode 100644 index 0000000000..3f1034f5c6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0401.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0410.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0410.lmp new file mode 100644 index 0000000000..fce6259059 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0410.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0411.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0411.lmp new file mode 100644 index 0000000000..06bf5548e1 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0411.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0412.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0412.lmp new file mode 100644 index 0000000000..e18f7b5154 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0412.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0413.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0413.lmp new file mode 100644 index 0000000000..d98da18773 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0413.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0414.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0414.lmp new file mode 100644 index 0000000000..581393ea2e Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0414.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0415.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0415.lmp new file mode 100644 index 0000000000..2005d32325 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0415.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0416.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0416.lmp new file mode 100644 index 0000000000..6eb55cab70 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0416.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0417.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0417.lmp new file mode 100644 index 0000000000..adc404bbd6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0417.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0418.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0418.lmp new file mode 100644 index 0000000000..faafe75294 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0418.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0419.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0419.lmp new file mode 100644 index 0000000000..5ddbda41d6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0419.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041A.lmp new file mode 100644 index 0000000000..f6ee373714 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041A.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041B.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041B.lmp new file mode 100644 index 0000000000..f59666bcea Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041B.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041C.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041C.lmp new file mode 100644 index 0000000000..7e2c112b45 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041C.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041D.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041D.lmp new file mode 100644 index 0000000000..037c656868 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041D.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041E.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041E.lmp new file mode 100644 index 0000000000..11f11bd0b7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041E.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041F.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041F.lmp new file mode 100644 index 0000000000..8279a0f2d6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041F.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0420.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0420.lmp new file mode 100644 index 0000000000..61c450d9a3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0420.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0421.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0421.lmp new file mode 100644 index 0000000000..02f86dce76 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0421.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0422.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0422.lmp new file mode 100644 index 0000000000..eb69d5cd80 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0422.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0423.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0423.lmp new file mode 100644 index 0000000000..8a9f3ef490 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0423.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0424.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0424.lmp new file mode 100644 index 0000000000..4ff0d0dbbe Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0424.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0425.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0425.lmp new file mode 100644 index 0000000000..0b4813be9b Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0425.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0426.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0426.lmp new file mode 100644 index 0000000000..a6ea425ab8 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0426.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0427.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0427.lmp new file mode 100644 index 0000000000..7e770826e7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0427.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0428.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0428.lmp new file mode 100644 index 0000000000..3873853b48 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0428.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0429.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0429.lmp new file mode 100644 index 0000000000..7585e2f74f Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0429.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042A.lmp new file mode 100644 index 0000000000..b51be20f25 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042A.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042B.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042B.lmp new file mode 100644 index 0000000000..8cab9d1d93 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042B.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042C.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042C.lmp new file mode 100644 index 0000000000..21d605b2d9 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042C.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042D.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042D.lmp new file mode 100644 index 0000000000..c0fd6ec579 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042D.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042E.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042E.lmp new file mode 100644 index 0000000000..39d7b47abe Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042E.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042F.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042F.lmp new file mode 100644 index 0000000000..5a18bb3930 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042F.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/2014.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/2014.lmp new file mode 100644 index 0000000000..b153f0aeb8 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/2014.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0410.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0410.lmp new file mode 100644 index 0000000000..44a9a6b11e Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0410.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0411.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0411.lmp new file mode 100644 index 0000000000..f7c64829f8 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0411.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0412.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0412.lmp new file mode 100644 index 0000000000..4dfcab56f5 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0412.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0413.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0413.lmp new file mode 100644 index 0000000000..b40403b665 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0413.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0414.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0414.lmp new file mode 100644 index 0000000000..23e2073ada Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0414.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0415.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0415.lmp new file mode 100644 index 0000000000..1b86650ee8 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0415.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0416.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0416.lmp new file mode 100644 index 0000000000..26481f37d6 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0416.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0417.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0417.lmp new file mode 100644 index 0000000000..ca45943844 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0417.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0418.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0418.lmp new file mode 100644 index 0000000000..88528c9153 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0418.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0419.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0419.lmp new file mode 100644 index 0000000000..266504b61a Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0419.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041A.lmp new file mode 100644 index 0000000000..217478999e Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041A.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041B.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041B.lmp new file mode 100644 index 0000000000..1b7c3c2d6b Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041B.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041C.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041C.lmp new file mode 100644 index 0000000000..d521c4cbf5 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041C.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041D.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041D.lmp new file mode 100644 index 0000000000..202efca513 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041D.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041E.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041E.lmp new file mode 100644 index 0000000000..dc7ee6af7b Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041E.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041F.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041F.lmp new file mode 100644 index 0000000000..1d03f947ee Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041F.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0420.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0420.lmp new file mode 100644 index 0000000000..d83561cb36 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0420.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0421.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0421.lmp new file mode 100644 index 0000000000..0ac0c5b092 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0421.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0422.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0422.lmp new file mode 100644 index 0000000000..24c47f31d3 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0422.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0423.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0423.lmp new file mode 100644 index 0000000000..a24240dff5 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0423.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0424.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0424.lmp new file mode 100644 index 0000000000..1043a50edb Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0424.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0425.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0425.lmp new file mode 100644 index 0000000000..c409c5c309 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0425.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0426.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0426.lmp new file mode 100644 index 0000000000..d2d623c4c7 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0426.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0427.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0427.lmp new file mode 100644 index 0000000000..bba0bab24c Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0427.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0428.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0428.lmp new file mode 100644 index 0000000000..c0a6bf2eef Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0428.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0429.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0429.lmp new file mode 100644 index 0000000000..7e7185e697 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0429.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042A.lmp new file mode 100644 index 0000000000..140c1c1a11 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042A.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042B.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042B.lmp new file mode 100644 index 0000000000..bbf2cfefbf Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042B.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042C.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042C.lmp new file mode 100644 index 0000000000..4e91a02e97 Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042C.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042D.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042D.lmp new file mode 100644 index 0000000000..e50cdd903c Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042D.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042E.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042E.lmp new file mode 100644 index 0000000000..3c5e8beb4c Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042E.lmp differ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042F.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042F.lmp new file mode 100644 index 0000000000..cfa4e9201a Binary files /dev/null and b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042F.lmp differ diff --git a/wadsrc_extra/static/language.enu b/wadsrc_extra/static/language.enu index a5780be758..ce0a737250 100644 --- a/wadsrc_extra/static/language.enu +++ b/wadsrc_extra/static/language.enu @@ -1,1127 +1,1537 @@ -[enu default] +[default] // Strings from Hexen's IWAD scripts. Technically they are not needed here for English, they are mainly meant to be documentation for translating. + +TXT_HEXEN_MAP01 = "WINNOWING HALL"; +TXT_HEXEN_MAP02 = "SEVEN PORTALS"; +TXT_HEXEN_MAP03 = "GUARDIAN OF ICE"; +TXT_HEXEN_MAP04 = "GUARDIAN OF FIRE"; +TXT_HEXEN_MAP05 = "GUARDIAN OF STEEL"; +TXT_HEXEN_MAP06 = "BRIGHT CRUCIBLE"; +TXT_HEXEN_MAP13 = "SHADOW WOOD"; +TXT_HEXEN_MAP08 = "DARKMERE"; +TXT_HEXEN_MAP09 = "CAVES OF CIRCE"; +TXT_HEXEN_MAP10 = "WASTELANDS"; +TXT_HEXEN_MAP11 = "SACRED GROVE"; +TXT_HEXEN_MAP12 = "HYPOSTYLE"; +TXT_HEXEN_MAP27 = "HERESIARCH'S SEMINARY"; +TXT_HEXEN_MAP28 = "DRAGON CHAPEL"; +TXT_HEXEN_MAP30 = "GRIFFIN CHAPEL"; +TXT_HEXEN_MAP31 = "DEATHWIND CHAPEL"; +TXT_HEXEN_MAP32 = "ORCHARD OF LAMENTATIONS"; +TXT_HEXEN_MAP33 = "SILENT REFECTORY"; +TXT_HEXEN_MAP34 = "WOLF CHAPEL"; +TXT_HEXEN_MAP21 = "FORSAKEN OUTPOST"; +TXT_HEXEN_MAP22 = "CASTLE OF GRIEF"; +TXT_HEXEN_MAP23 = "GIBBET"; +TXT_HEXEN_MAP24 = "EFFLUVIUM"; +TXT_HEXEN_MAP25 = "DUNGEONS"; +TXT_HEXEN_MAP26 = "DESOLATE GARDEN"; +TXT_HEXEN_MAP35 = "NECROPOLIS"; +TXT_HEXEN_MAP36 = "ZEDEK'S TOMB"; +TXT_HEXEN_MAP37 = "MENELKIR'S TOMB"; +TXT_HEXEN_MAP38 = "TRADUCTUS' TOMB"; +TXT_HEXEN_MAP39 = "VIVARIUM"; +TXT_HEXEN_MAP40 = "DARK CRUCIBLE"; + +TXT_HEXEN_CLUS1MSG = "having passed the seven portals\n" + "which sealed this realm, a vast\n" + "domain of harsh wilderness stretches\n" + "before you. fire, ice and steel have\n" + "tested you, but greater challenges\n" + "remain ahead. the dense tangle of\n" + "forest surely hides hostile eyes,\n" + "but what lies beyond will be worse.\n" + "\n" + "barren desert, dank swamps and\n" + "musty caverns bar your way, but you\n" + "cannot let anything keep you from\n" + "your fate, even if you might come\n" + "to wish that it would.\n" + "\n" + "and beyond, flickering in the\n" + "distance, the ever-shifting walls\n" + "of the hypostyle seem to mock\n" + "your every effort."; -TXT_ACS_map01_5_THEDO = "THE DOOR IS LOCKED"; -TXT_ACS_map02_9_GREET = "GREETINGS, MORTAL"; -TXT_ACS_map02_11_AREYO = "ARE YOU READY TO DIE?"; -TXT_ACS_map02_20_ADOOR = "A DOOR OPENED ON THE GUARDIAN OF ICE"; -TXT_ACS_map03_12_THISP = "THIS PATH IS BARRED"; -TXT_ACS_map04_9_ONEHA = "ONE HALF OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map04_10_ONTHE = "ON THE SEVEN PORTALS"; -TXT_ACS_map04_11_ONETH = "ONE THIRD OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map04_12_STAIR = "STAIRS HAVE RISEN ON THE SEVEN PORTALS"; -TXT_ACS_map05_6_ONETH = "ONE THIRD OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map05_7_ONTHE = "ON THE SEVEN PORTALS"; -TXT_ACS_map05_8_STAIR = "STAIRS HAVE RISEN ON THE SEVEN PORTALS"; -TXT_ACS_map05_9_YOUHA = "YOU HAVE TO FIND ANOTHER SWITCH..."; -TXT_ACS_map05_10_STONE = "STONES GRIND ON THE SEVEN PORTALS"; -TXT_ACS_map08_6_ONESI = "ONE SIXTH OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map08_7_ONTHE = "ON THE SHADOW WOOD"; -TXT_ACS_map08_10_THEDO = "THE DOOR IS BARRED FROM THE INSIDE"; -TXT_ACS_map08_11_YOUHE = "YOU HEAR A DOOR OPEN IN THE DISTANCE"; -TXT_ACS_map09_6_ONESI = "ONE SIXTH OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map09_7_ONTHE = "ON THE SHADOW WOOD"; -TXT_ACS_map10_6_ONESI = "ONE SIXTH OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map10_7_ONTHE = "ON THE SHADOW WOOD"; -TXT_ACS_map11_0_ETTIN = " ETTINS LEFT"; -TXT_ACS_map11_1_YOUWA = "YOU WAITED TOO LONG, NOW YOU DIE!"; -TXT_ACS_map11_7_ADOOR = "A DOOR OPENED ON THE FORSAKEN OUTPOST"; -TXT_ACS_map12_9_THISD = "THIS DOOR WON'T OPEN YET"; -TXT_ACS_map13_11_MYSER = "MY SERVANTS CAN SMELL YOUR BLOOD, HUMAN"; -TXT_ACS_map21_0_ADOOR = "A DOOR OPENED IN THE GIBBET"; -TXT_ACS_map21_2_THEDO = "THE DOOR IS BARRED FROM THE INSIDE"; -TXT_ACS_map22_3_APLAT = "A PLATFORM HAS LOWERED IN THE TOWER"; -TXT_ACS_map22_27_YOUHA = "YOU HAVE PLAYED THIS GAME TOO LONG, MORTAL..."; -TXT_ACS_map22_29_ITHIN = "I THINK I SHALL REMOVE YOU FROM THE BOARD"; -TXT_ACS_map23_10_YOUHE = "YOU HEAR A DOOR OPEN UPSTAIRS"; -TXT_ACS_map27_8_WORSH = "WORSHIP ME, AND I MAY YET BE MERCIFUL"; -TXT_ACS_map27_10_THENA = "THEN AGAIN, MAYBE NOT"; -TXT_ACS_map28_6_ONENI = "ONE NINTH OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map28_7_ONTHE = "ON THE MONASTERY"; -TXT_ACS_map30_6_ONENI = "ONE NINTH OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map30_7_ONTHE = "ON THE MONASTERY"; -TXT_ACS_map34_1_ONENI = "ONE NINTH OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map34_2_ONTHE = "ON THE MONASTERY"; -TXT_ACS_map35_0_THEPO = "THE PORTAL HAS BEEN SEALED"; -TXT_ACS_map35_1_CHOOS = "CHOOSE YOUR FATE"; -TXT_ACS_map35_3_THEDO = "THE DOOR IS BARRED FROM THE INSIDE"; -TXT_ACS_map35_12_AREYO = "ARE YOU STRONG ENOUGH"; -TXT_ACS_map35_14_TOFAC = "TO FACE YOUR OWN MASTERS?"; +TXT_HEXEN_CLUS2MSG = "your mind still reeling from your\n" + "encounters within the hypostyle, you\n" + "stagger toward what you hope is\n" + "a way out. things seem to move faster\n" + "and faster, your vision blurs and\n" + "begins to fade...\n" + "as the world collapses around you,\n" + "the brightness of a teleportal\n" + "engulfs you. a flash of light, and then\n" + "you climb wearily to your feet.\n" + "\n" + "you stand atop a high tower, and\n" + "from below come the screams of the\n" + "damned. you step forward, and\n" + "instantly the sound of demonic\n" + "chanting chills your blood.\n" + "by all the gods of death! what place\n" + "have you come to? by all the gods of\n" + "pain, how will you ever find your\n" + "way out?"; -// Deathkings texts +TXT_HEXEN_CLUS3MSG = "the mightiest weapons and artifacts\n" + "of the ancients barely sufficed to\n" + "defeat the heresiarch and his\n" + "minions, but now their foul remains\n" + "lie strewn at your feet. gathering\n" + "the last of your strength, you\n" + "prepare to enter the portal which\n" + "leads from the heresiarch's inner\n" + "sanctum.\n" + "\n" + "above you, the ramparts of an\n" + "immense castle loom. silent towers\n" + "and bare walls surround a single\n" + "spire of black stone, which squats\n" + "in the center of the castle like a\n" + "brooding giant. fire and shadow\n" + "twist behind gaping windows, dozens\n" + "of baleful eyes glaring down upon\n" + "you.\n" + "somewhere within, your enemies are\n" + "waiting..."; -TXT_ACS_map33_6_YOUDA = "YOU DARE BATTLE IN THE READY ROOM?"; -TXT_ACS_map33_7_FORTH = "FOR THAT, YOU SHALL DIE!"; -TXT_ACS_map41_6_THEWA = "THE WATERFALL IS OPEN"; -TXT_ACS_map41_7_THEWA = "THE WATERFALL IS BLOCKED"; -TXT_ACS_map41_8_ADOOR = "A DOOR HAS OPENED IN THE CHAPEL"; -TXT_ACS_map42_4_NOWTH = "NOW THAT'S ODD..."; -TXT_ACS_map44_1_THREE = "THREE MORE PARTS OF THE PUZZLE REMAIN"; -TXT_ACS_map44_2_TWOMO = "TWO MORE PARTS OF THE PUZZLE REMAIN"; -TXT_ACS_map44_3_ONEMO = "ONE MORE PART OF THE PUZZLE REMAINS"; -TXT_ACS_map44_4_THEPU = "THE PUZZLE IS COMPLETE"; -TXT_ACS_map44_6_YOUHA = "YOU HAVE NOT COMPLETED THE PUZZLE"; -TXT_ACS_map44_8_THEFL = "THE FLOOR IS NOT SAFE!"; -TXT_ACS_map44_10_ONETH = "ONE THIRD OF THE PUZZLE IS SOLVED"; -TXT_ACS_map44_11_TWOTH = "TWO THIRDS OF THE PUZZLE IS SOLVED"; -TXT_ACS_map45_1_YOUHE = "YOU HEAR A PLATFORM MOVING IN THE DISTANCE"; -TXT_ACS_map46_0_ITISD = "IT IS DONE..."; -TXT_ACS_map46_1_YOUHA = "YOU HAVE NOT COMPLETED THE PUZZLE"; -TXT_ACS_map46_2_I'MWA = "I'M WARNING YOU..."; -TXT_ACS_map46_3_STUBB = "STUBBORN, AREN'T YOU?"; -TXT_ACS_map46_4_ANDST = "AND STUPID, TOO"; -TXT_ACS_map46_8_ONEFO = "ONE FOURTH OF THIS PUZZLE IS COMPLETE"; -TXT_ACS_map46_9_BADCH = "BAD CHOICE..."; -TXT_ACS_map47_2_THESY = "THE SYMBOLS ARE NOT ALIGNED"; -TXT_ACS_map48_2_THEDO = "THE DOOR WON'T OPEN FROM THIS SIDE"; -TXT_ACS_map50_1_THEDO = "THE DOOR IS BARRED FROM THE OUTSIDE"; -TXT_ACS_map51_5_SACRI = "SACRILEGE !"; -TXT_ACS_map51_6_YOUHA = "YOU HAVE DEFILED ERIC'S TOMB !!"; -TXT_ACS_map51_7_ANDNO = "AND NOW YOU DIE !!!"; -TXT_ACS_map51_8_ONETH = "ONE THIRD OF THE PUZZLE IS SOLVED"; -TXT_ACS_map51_9_TWOTH = "TWO THIRDS OF THE PUZZLE IS SOLVED"; -TXT_ACS_map51_10_THECR = "THE CRYPT IS OPEN"; -TXT_ACS_map51_11_BEWAR = "BEWARE THE SPIDER'S TOMB"; -TXT_ACS_map51_13_YOUHE = "YOU HEAR A PLATFORM RISE OUTSIDE"; -TXT_ACS_map51_14_DOYOU = "DO YOU FEEL LUCKY?"; -TXT_ACS_map51_15_YOUGU = "YOU GUESSED WRONG!"; -TXT_ACS_map51_16_GOODG = "GOOD GUESS"; -TXT_ACS_map51_17_CANYO = "CAN YOU DO ALL THE SCRIPTING FOR MY LEVEL?"; -TXT_ACS_map51_18_DON'T = "DON'T TOUCH MY GLOPPY"; -TXT_ACS_map51_19_VORPA = "VORPAL ?!?!?!"; -TXT_ACS_map51_20_GIMME = "GIMME SOME SUGAR, BABY"; -TXT_ACS_map51_21_DUHUH = "DUH-UHHH..."; -TXT_ACS_map51_22_FILMI = "FILM IN AN HOUR?"; -TXT_ACS_map51_23_IDON' = "I DON'T EVEN GET MY OWN TOMBSTONE - CF"; -TXT_ACS_map51_24_LETNO = "LET NO BLOOD BE SPILT"; -TXT_ACS_map51_25_LETNO = "LET NO HAND BE RAISED IN ANGER"; -TXT_ACS_map52_9_WHODA = "WHO DARES DISTURB OUR SLUMBER?"; -TXT_ACS_map52_10_THEWA = "THE WAY IS OPEN"; -TXT_ACS_map53_2_YOUHA = "YOU HAVE "; -TXT_ACS_map53_3_SWITC = " SWITCHES LEFT"; -TXT_ACS_map53_4_YOUHA = "YOU HAVE ONLY "; -TXT_ACS_map53_5_SWITC = " SWITCH LEFT"; -TXT_ACS_map53_6_THEEX = "THE EXIT IS OPEN"; -TXT_ACS_map54_1_THEDO = "THE DOORS WON'T OPEN FROM THIS SIDE"; -TXT_ACS_map54_4_THEDO = "THE DOORS ARE OPEN..."; -TXT_ACS_map54_5_IFYOU = "...IF YOU ARE READY"; -TXT_ACS_map54_9_ADOOR = "A DOOR HAS OPENED"; -TXT_ACS_map54_10_ONTHE = "ON THE CHANTRY"; -TXT_ACS_map54_11_ABRID = "A BRIDGE HAS BEEN BUILT"; -TXT_ACS_map54_12_ONTHE = "ON THE ABATTOIR"; -TXT_ACS_map54_13_ASTAI = "A STAIR HAS BEEN BUILT"; -TXT_ACS_map54_14_ONTHE = "ON THE DARK WATCH"; -TXT_ACS_map54_15_ONEGE = "ONE GEAR HAS BEEN PLACED"; -TXT_ACS_map54_16_GEARS = " GEARS HAVE BEEN PLACED"; -TXT_ACS_map54_17_ABARR = "A BARRICADE HAS OPENED"; -TXT_ACS_map54_18_ONTHE = "ON THE CLOACA"; -TXT_ACS_map54_20_THEWA = "THE WAY BACK IS OPEN"; -TXT_ACS_map55_9_THEDO = "THE DOOR IS BARRED FROM THE INSIDE"; -TXT_ACS_map56_0_YOUDA = "YOU DARE PLUNDER THE TOMB"; -TXT_ACS_map56_1_OFTHE = "OF THE EXECUTIONER?"; -TXT_ACS_map56_2_PREPA = "PREPARE TO DIE"; -TXT_ACS_map59_1_YOUHA = "YOU HAVE "; -TXT_ACS_map59_2_MORES = " MORE SWITCHES TO FIND"; -TXT_ACS_map59_3_YOUHA = "YOU HAVE ONLY "; -TXT_ACS_map59_4_SWITC = " SWITCH LEFT"; -TXT_ACS_map59_5_THEWA = "THE WAY TO THE TOWER IS OPEN"; -TXT_ACS_map60_3_THEWA = "THE WAY IS OPEN"; +TXT_HEXEN_CLUS4MSG = "\"... and he shall journey into the\n" + "realms of the dead, and contest with\n" + "the forces therein, unto the very\n" + "gates of despair. but whether he\n" + "shall return again to the world of\n" + "light, no man knows.\"\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "damn."; + +TXT_HEXEN_WIN1MSG = "with a scream of agony you are\n" + "wrenched from this world into\n" + "another, every part of your body\n" + "wreathed in mystic fire. when your\n" + "vision clears, you find yourself\n" + "standing in a great hall, filled\n" + "with ghostly echoes and menacing\n" + "shadows. in the distance you can\n" + "see a raised dais, and upon it the\n" + "only source of light in this world."; -// All content from Strife's IWAD dialogues +TXT_HEXEN_WIN2MSG = " this can only be the chaos sphere,\n" + "the source of korax's power. with\n" + "this, you can create worlds... or\n" + "destroy them. by rights of battle\n" + "and conquest it is yours, and with\n" + "trembling hands you reach to grasp\n" + "it. perhaps, now, a new player will\n" + "join the cosmic game of power. like\n" + "the pawn who is promoted to queen,\n" + "suddenly the very reaches of the\n" + "board seem to be within your grasp."; -TXT_DLG_SCRIPT01_d0_IDONT = "I DON'T WANT ANY TROUBLE, STAY AWAY FROM ME. I'VE HAD ENOUGH TROUBLE WITH WHAT THAT BASTARD HARRIS DID TO ME. HE PROMISED ME MONEY, INSTEAD I GET TO LOOK FORWARD TO BEING "QUESTIONED" BY THE PROGRAMMER."; +TXT_HEXEN_WIN3MSG = "\n" + "but there are other players mightier\n" + "than you, and who can know their\n" + "next moves?"; -TXT_DLG_SCRIPT02_d0_ILLHE = "I'LL HELP YOU IF YOU HELP ME. FIVE PIECES OF GOLD AND I'LL TELL ALL I KNOW."; -TXT_RPLY0_SCRIPT02_d0_HERES = "HERE'S THE GOLD."; -TXT_RYES0_SCRIPT02_d0_BESTE = "BE STEALTHY WHEN YOU KILL, YOU WON'T SET OFF ALARMS."; -TXT_RNO0_SCRIPT02_d0_WELLI = "WELL, I WON'T BE TELLING YOU ANYTHING FOR FREE!"; -TXT_DLG_SCRIPT02_d1516_HAVEY = "HAVE YOU BY ANY CHANCE GOT ANOTHER 5 GOLD ON YOU?"; -TXT_RPLY0_SCRIPT02_d1516_5GOLD = "5 GOLD."; -TXT_RYES0_SCRIPT02_d1516_WELLP = "WELL, POISON BOLTS CAN KILL THE GUARDS INSTANTLY AND WON'T SET OFF THE ALARMS."; -TXT_RNO0_SCRIPT02_d1516_NOSIR = "NO SIR, I WON'T BE TELLING YOU ANYTHING FOR FREE!"; -TXT_DLG_SCRIPT02_d3032_YOUVE = "YOU'VE WRUNG THE LAST BIT OF GOSSIP OUT OF ME ALREADY!"; -TXT_DLG_SCRIPT02_d4548_WHATC = "WHAT CAN I GET FOR YOU?"; -TXT_RPLY0_SCRIPT02_d4548_ASSAU = "ASSAULT GUN"; -TXT_RYES0_SCRIPT02_d4548_HEREY = "HERE YOU GO."; -TXT_RNO0_SCRIPT02_d4548_YOUCA = "YOU CAN'T AFFORD THAT RIGHT NOW."; -TXT_RPLY1_SCRIPT02_d4548_CLIPO = "CLIP OF BULLETS"; -TXT_RYES1_SCRIPT02_d4548_THANK = "THANKS."; -TXT_RNO1_SCRIPT02_d4548_COMEO = "COME ON, 10 GOLD."; -TXT_RPLY2_SCRIPT02_d4548_AMMOB = "AMMO BOX"; -TXT_RYES2_SCRIPT02_d4548_HERES = "HERE'S YOUR AMMO."; -TXT_RNO2_SCRIPT02_d4548_MAYBE = "MAYBE SOME OTHER TIME."; -TXT_DLG_SCRIPT02_d6064_GOODN = "GOOD NEWS FROM THE FRONT FOR A CHANGE. MACIL SENT YOU FOR A REWARD AND TRAINING. HE'S INSTRUCTED ME TO GIVE THEM TO YOU."; -TXT_RPLY0_SCRIPT02_d6064_THANK = "THANKS."; -TXT_RYES0_SCRIPT02_d6064_GLADT = "GLAD TO BE OF SERVICE."; -TXT_DLG_SCRIPT02_d7580_ALLRI = "ALL RIGHT, HERE'S A FEW POINTERS ON WHAT TO DO: DON'T GET IN THE WAY OF CRUSADERS: FIRING SHORT BURSTS FROM YOUR ASSAULT GUN KEEPS IT ON TARGET."; -TXT_RPLY0_SCRIPT02_d7580_ISTHA = "IS THAT IT?"; -TXT_RYES0_SCRIPT02_d7580_LOOKY = "LOOK, YOU'LL LEARN MORE LATER."; -TXT_DLG_SCRIPT02_d9096_ITHIN = "I THINK I CAN CONVERT A FLAMETHROWER FROM ONE OF THE CRUSADERS FOR USE BY A HUMAN. OH, ANYTHING ELSE I CAN GET YOU?"; -TXT_RPLY0_SCRIPT02_d9096_FLAME = "FLAMETHROWER."; -TXT_RYES0_SCRIPT02_d9096_IKNEW = "I KNEW THAT'D WORK! HERE YOU GO, TAKE HER FOR A SPIN!"; -TXT_RNO0_SCRIPT02_d9096_LISTE = "LISTEN, I CAN'T MAKE ANYTHING WITHOUT THE RIGHT PARTS!"; -TXT_RPLY1_SCRIPT02_d9096_ASSAU = "ASSAULT GUN"; -TXT_RYES1_SCRIPT02_d9096_WELLH = "WELL, HERE YOU GO SIR!"; -TXT_RNO1_SCRIPT02_d9096_OBVIO = "OBVIOUSLY, YOU CAN'T AFFORD THAT RIGHT NOW."; -TXT_RPLY2_SCRIPT02_d9096_CLIPO = "CLIP OF BULLETS"; -TXT_RYES2_SCRIPT02_d9096_THANK = "THANKS."; -TXT_RNO2_SCRIPT02_d9096_COMEO = "COME ON, 10 GOLD."; -TXT_RPLY3_SCRIPT02_d9096_AMMOB = "AMMO BOX"; -TXT_RYES3_SCRIPT02_d9096_HERES = "HERE'S YOUR AMMO."; -TXT_RNO3_SCRIPT02_d9096_MAYBE = "MAYBE SOME OTHER TIME. GOODBYE!"; -TXT_DLG_SCRIPT02_d10612_NOWTH = "NOW THAT YOU HAVE THE FLAMETHROWER, IS THERE ANYTHING ELSE I CAN GET YOU?"; -TXT_RPLY0_SCRIPT02_d10612_ASSAU = "ASSAULT GUN"; -TXT_RYES0_SCRIPT02_d10612_HEREY = "HERE YOU GO."; -TXT_RNO0_SCRIPT02_d10612_YOUCA = "YOU CAN'T AFFORD THAT RIGHT NOW."; -TXT_RPLY1_SCRIPT02_d10612_CLIPO = "CLIP OF BULLETS"; -TXT_RYES1_SCRIPT02_d10612_THANK = "THANKS."; -TXT_RNO1_SCRIPT02_d10612_COMEO = "COME ON, 10 GOLD."; -TXT_RPLY2_SCRIPT02_d10612_AMMOB = "AMMO BOX"; -TXT_RYES2_SCRIPT02_d10612_HERES = "HERE'S YOUR AMMO."; -TXT_RNO2_SCRIPT02_d10612_MAYBE = "MAYBE SOME OTHER TIME."; -TXT_DLG_SCRIPT02_d12128_NOWTH = "NOW THAT YOU HAVE THE FLAMETHROWER, IS THERE ANYTHING ELSE I CAN GET YOU?"; -TXT_RPLY0_SCRIPT02_d12128_CLIPO = "CLIP OF BULLETS"; -TXT_RYES0_SCRIPT02_d12128_THANK = "THANKS."; -TXT_RNO0_SCRIPT02_d12128_COMEO = "COME ON, 10 GOLD."; -TXT_RPLY1_SCRIPT02_d12128_AMMOB = "AMMO BOX"; -TXT_RYES1_SCRIPT02_d12128_HERES = "HERE'S YOUR AMMO."; -TXT_RNO1_SCRIPT02_d12128_MAYBE = "MAYBE SOME OTHER TIME."; -TXT_RPLY2_SCRIPT02_d12128_PHOSP = "PHOSPHOR GRENADES"; -TXT_RYES2_SCRIPT02_d12128_THANK = "THANKS."; -TXT_RNO2_SCRIPT02_d12128_YOUDO = "YOU DON'T HAVE ENOUGH"; -TXT_RPLY3_SCRIPT02_d12128_POISO = "POISON BOLTS"; -TXT_RYES3_SCRIPT02_d12128_WORTH = "WORTH EVERY GOLD!"; -TXT_RNO3_SCRIPT02_d12128_COMEO = "COME ON, 200 GOLD!"; -TXT_DLG_SCRIPT02_d13644_ICANT = "I CAN'T BELIEVE THAT I GOT STUCK WITH THIS DUTY. THEY SAY THAT SOMETHING EVIL CAME UP OUT OF THIS SEWER GATE... NOW I GET TO STAND HERE UNTIL IT COMES UP AGAIN!"; -TXT_RPLY0_SCRIPT02_d13644_WHATG = "WHAT GATE?"; -TXT_RYES0_SCRIPT02_d13644_THESE = "THE SEWER OVERFLOW GATE."; -TXT_DLG_SCRIPT02_d15160_HELLO = "HELLO FRIEND. WHAT CAN I GET FOR YOU?"; -TXT_RPLY0_SCRIPT02_d15160_ELECT = "ELECTRIC BOLTS"; -TXT_RYES0_SCRIPT02_d15160_YOUGO = "you got the ELECTRIC BOLTS."; -TXT_RPLY1_SCRIPT02_d15160_AMMOS = "AMMO SATCHEL"; -TXT_RYES1_SCRIPT02_d15160_THANK = "THANK YOU. ANYTHING ELSE?"; -TXT_RNO1_SCRIPT02_d15160_YOUCA = "YOU CAN'T AFFORD THAT, GOOD DAY."; -TXT_DLG_SCRIPT02_d16676_WHATC = "WHAT CAN I GET FOR YOU?"; -TXT_RPLY0_SCRIPT02_d16676_ELECT = "ELECTRIC BOLTS"; -TXT_RYES0_SCRIPT02_d16676_YOUGO = "you got the ELECTRIC BOLTS."; -TXT_RPLY1_SCRIPT02_d16676_AMMOS = "AMMO SATCHEL"; -TXT_RYES1_SCRIPT02_d16676_THANK = "THANK YOU, ANYTHING ELSE?"; -TXT_RNO1_SCRIPT02_d16676_YOUCA = "YOU CAN'T AFFORD THAT, GOOD DAY TO YOU!"; -TXT_DLG_SCRIPT02_d18192_WELCO = "WELCOME. WHAT MAY I SHOW YOU?"; -TXT_RPLY0_SCRIPT02_d18192_ENVIR = "ENVIRONMENTAL SUIT"; -TXT_RYES0_SCRIPT02_d18192_WELLH = "WELL, HERE YOU ARE."; -TXT_RNO0_SCRIPT02_d18192_IMSOR = "I'M SORRY BUT YOU DON'T HAVE ENOUGH MONEY FOR THAT."; -TXT_RPLY1_SCRIPT02_d18192_LEATH = "LEATHER ARMOR"; -TXT_RYES1_SCRIPT02_d18192_HEREY = "HERE YOU ARE."; -TXT_RNO1_SCRIPT02_d18192_PERHA = "PERHAPS SOME OTHER TIME?"; -TXT_RPLY2_SCRIPT02_d18192_METAL = "METAL ARMOR"; -TXT_RYES2_SCRIPT02_d18192_WEARI = "WEAR IT IN GOOD HEALTH."; -TXT_RNO2_SCRIPT02_d18192_COMEB = "COME BACK WHEN YOU CAN AFFORD TO BUY SOMETHING YOU LOUT!"; -TXT_DLG_SCRIPT02_d19708_WELCO = "WELCOME. WHAT MAY I SHOW YOU?"; -TXT_RPLY0_SCRIPT02_d19708_ENVIR = "ENVIRONMENTAL SUIT"; -TXT_RYES0_SCRIPT02_d19708_WELLH = "WELL, HERE YOU ARE."; -TXT_RNO0_SCRIPT02_d19708_IMSOR = "I'M SORRY BUT YOU DON'T HAVE ENOUGH MONEY FOR THAT."; -TXT_RPLY1_SCRIPT02_d19708_LEATH = "LEATHER ARMOR"; -TXT_RYES1_SCRIPT02_d19708_HEREY = "HERE YOU ARE."; -TXT_RNO1_SCRIPT02_d19708_PERHA = "PERHAPS SOME OTHER TIME?"; -TXT_RPLY2_SCRIPT02_d19708_METAL = "METAL ARMOR"; -TXT_RYES2_SCRIPT02_d19708_WEARI = "WEAR IT IN GOOD HEALTH."; -TXT_RNO2_SCRIPT02_d19708_COMEB = "COME BACK WHEN YOU CAN AFFORD TO BUY SOMETHING YOU LOUT!"; -TXT_DLG_SCRIPT02_d21224_HOWMA = "HOW MAY I ASSIST YOU?"; -TXT_RPLY0_SCRIPT02_d21224_MEDPA = "MED PATCH"; -TXT_RYES0_SCRIPT02_d21224_HERES = "HERE'S YOUR PATCH."; -TXT_RNO0_SCRIPT02_d21224_YOUNE = "YOU NEED 10 GOLD FOR THAT."; -TXT_RPLY1_SCRIPT02_d21224_MEDIC = "MEDICAL KIT"; -TXT_RYES1_SCRIPT02_d21224_THANK = "THANK YOU."; -TXT_RNO1_SCRIPT02_d21224_IWISH = "I WISH I COULD GIVE THEM AWAY, BUT THEY COST 25 GOLD."; -TXT_RPLY2_SCRIPT02_d21224_FIELD = "FIELD SURGERY KIT"; -TXT_RYES2_SCRIPT02_d21224_THERE = "THERE YOU GO. TAKE CARE NOW."; -TXT_RNO2_SCRIPT02_d21224_WELLM = "WELL, MAYBE YOU CAN AFFORD SOME MED PATCHES?"; -TXT_DLG_SCRIPT02_d22740_IHOPE = "I HOPE MACIL KNOWS WHAT HE'S DOING. IF THE ORDER FINDS OUT I'M HELPING THE FRONT I'M AS GOOD AS DEAD... NOT THAT THIS MATTERS TO YOU ANY. THE FRONT'S MEDIC GAVE ME AN UPGRADE CHIP FOR YOU, ARE YOU READY? "; -TXT_RPLY0_SCRIPT02_d22740_YESIM = "YES, I'M READY."; -TXT_RYES0_SCRIPT02_d22740_WELLT = "WELL THEN, THIS WON'T TAKE BUT A SECOND. THERE, DONE ALREADY."; -TXT_DLG_SCRIPT02_d24256_HOWMA = "HOW MAY I ASSIST YOU?"; -TXT_RPLY0_SCRIPT02_d24256_MEDPA = "MED PATCH"; -TXT_RYES0_SCRIPT02_d24256_HERES = "HERE'S YOUR PATCH."; -TXT_RNO0_SCRIPT02_d24256_YOUNE = "YOU NEED 10 GOLD FOR THAT."; -TXT_RPLY1_SCRIPT02_d24256_MEDIC = "MEDICAL KIT"; -TXT_RYES1_SCRIPT02_d24256_THANK = "THANK YOU."; -TXT_RNO1_SCRIPT02_d24256_IWISH = "I WISH I COULD GIVE THEM AWAY, BUT THEY COST 25 GOLD."; -TXT_RPLY2_SCRIPT02_d24256_FIELD = "FIELD SURGERY KIT"; -TXT_RYES2_SCRIPT02_d24256_THERE = "THERE YOU GO. TAKE CARE NOW."; -TXT_RNO2_SCRIPT02_d24256_WELLM = "WELL, MAYBE YOU CAN AFFORD SOME MED PATCHES?"; -TXT_DLG_SCRIPT02_d25772_HELLO = "HELLO STRANGER, I HAVEN'T SEEN YOU AROUND HERE BEFORE. LET ME GIVE YOU A PIECE OF FREE ADVICE. I'D BE CAREFUL IF I WERE YOU. THE ORDER DOES NOT TOLERATE FREE WILL, AND THEIR JUSTICE IS SWIFT."; -TXT_RPLY0_SCRIPT02_d25772_WHATS = "WHAT'S THE WORD?"; -TXT_RYES0_SCRIPT02_d25772_THEWO = "THE WORD IS... THE SEWERS HOLD MORE THAN JUST RATS AND ROBOTS."; -TXT_DLG_SCRIPT02_d27288_WHATC = "WHAT CAN I DO FOR YOU NOW?"; -TXT_RPLY0_SCRIPT02_d27288_MOREI = "MORE INFO."; -TXT_RYES0_SCRIPT02_d27288_THEGO = "THE GOVERNOR IS A SIMPLE REMINDER TO US THAT WE AREN'T FREE PEOPLE ANYMORE."; -TXT_RNO0_SCRIPT02_d27288_COMEB = "COME BACK WHEN YOU GET SOME GOLD."; -TXT_DLG_SCRIPT02_d28804_WELLY = "WELL, YOU'RE ASKING A LOT OF QUESTIONS FOR SOMEONE WHO'S NOT TRYING TO DIE. MAKE SURE YOU DON'T GO AND GET YOURSELF KILLED, OR WORSE."; -TXT_RPLY0_SCRIPT02_d28804_MOREI = "MORE INFO."; -TXT_RYES0_SCRIPT02_d28804_THERE = "THERE'S MORE TO THE ORDER THAN MEETS THE EYE."; -TXT_RNO0_SCRIPT02_d28804_WELLT = "WE'LL TALK WHEN YOU GET GOLD!"; -TXT_DLG_SCRIPT02_d30320_THATS = "THAT'S IT FRIEND, THE WELL OF KNOWLEDGE HAS RUN DRY. I'VE TOLD YOU MORE THAN I SHOULD HAVE ANYWAY. GOOD LUCK... AND DON'T COME BACK."; -TXT_DLG_SCRIPT02_d31836_HEYIM = "HEY, I'M ONLY HERE IN CASE OF AN EMERGENCY. IF THE CORE BREACHES, THEN I MAKE SURE NO ONE GETS IN... OR OUT."; -TXT_DLG_SCRIPT02_d33352_WATCH = "WATCH YOUR STEP, PEASANT!"; -TXT_DLG_SCRIPT02_d34868_WEREG = "WE'RE GOING TO KILL YOU! "; -TXT_DLG_SCRIPT02_d36384_WHOIN = "WHO IN THE BLAZES ARE YOU? NO ONE'S SUPPOSED TO BE LOITERING ABOUT IN THIS AREA!"; -TXT_DLG_SCRIPT02_d37900_YOUTH = "YOU THERE, NOBODY'S ALLOWED IN HERE. MOVE ALONG!"; -TXT_DLG_SCRIPT02_d39416_IRALE = "IRALE WILL SET YOU RIGHT UP!"; -TXT_DLG_SCRIPT02_d40932_IMKIN = "I'M KINDA A TALENT BROKER FOR THE REBELS. A GUY WHO'S AS GOOD AS YOU COULD MAKE A LOT OF GOLD... IF YOU HOOKED UP WITH THE RIGHT PEOPLE."; -TXT_RPLY0_SCRIPT02_d40932_IMINT = "I'M INTERESTED."; -TXT_RPLY1_SCRIPT02_d40932_SCREW = "SCREW THE REBELS!"; -TXT_DLG_SCRIPT02_d42448_NONOS = "NO, NO SECOND CHANCE. OH GUARDS, KILL HIM."; -TXT_DLG_SCRIPT02_d43964_GOODC = "GOOD CHOICE. THE ORDER'S SANCTUARY BY THE RIVER IS THEIR UNOFFICIAL TORTURE CHAMBER. HIDDEN INSIDE THERE'S A GOLDEN CHALICE. YOU SWIPE IT AND REAP YOUR REWARD."; -TXT_RPLY0_SCRIPT02_d43964_HOWAM = "HOW AM I SUPPOSED TO DO THAT?"; -TXT_DLG_SCRIPT02_d45480_HERES = "HERE'S A CROSSBOW, JUST AIM STRAIGHT AND --SPLAT--. REMEMBER, GRAB THE FANCY CUP AND GET TO THE TAVERN."; -TXT_RPLY0_SCRIPT02_d45480_COOLI = "COOL. I'll get it."; -TXT_DLG_SCRIPT02_d46996_WHATA = "WHAT ARE YOU WAITING FOR? BRING ME THAT CHALICE."; -TXT_DLG_SCRIPT02_d48512_HEYIK = "HEY, I KNOW, KINDA LOOKS LIKE A SET-UP. I WOULD NEVER DO THAT TO SUCH A GREAT KILLING MACHINE. GOT THE ITEM? GREAT! NOW GET READY, GOLD AND GLORY JUST LIKE I PROMISED. TAKE THIS KEY AND THE GOVERNOR WILL REWARD YOU."; -TXT_RPLY0_SCRIPT02_d48512_HEDBE = "HE'D BETTER. FOR YOUR SAKE!"; -TXT_RPLY1_SCRIPT02_d48512_WHATW = "WHAT! WHERE'S MY MONEY?"; -TXT_DLG_SCRIPT02_d50028_GETLO = "GET LOST KID, YOU BOTHER ME."; -TXT_DLG_SCRIPT02_d51544_NOSEC = "NO SECOND CHANCE. OH GUARDS, KILL HIM."; -TXT_DLG_SCRIPT02_d53060_FIRST = "FIRST THEY SLAUGHTER THOUSANDS, NOW THEY WANT ALL ABLE-BODIED PEASANTS FOR UNSPECIFIED "TESTS". HOW DOES THE ORDER EXPECT ME TO KEEP THE PEACE? WHAT THE HELL DO YOU WANT?"; -TXT_RPLY0_SCRIPT02_d53060_APRIS = "A PRISON PASS, LET'S DEAL."; -TXT_DLG_SCRIPT02_d54576_ILIKE = "I LIKE YOU ALREADY. I HAVE TWO CHORES THAT I DON'T WANT TO DO MYSELF. ONE IS MESSY, THE OTHER BLOODY."; -TXT_RPLY0_SCRIPT02_d54576_CALLM = "CALL ME THE CLEANER"; -TXT_RPLY1_SCRIPT02_d54576_IMNOT = "I'M NOT SQUEAMISH"; -TXT_DLG_SCRIPT02_d56092_ONEOF = "ONE OF MY MINIONS IS STEALING POWER WITH A TAP ON THE MAINS SOMEWHERE. FIND IT AND TRUNCATE HIS SUPPLY AND I'LL PROVIDE YOU WITH WHAT YOU WANT. BRING ME SOMETHING AS A TOKEN."; -TXT_RPLY0_SCRIPT02_d56092_WHERE = "WHERE DO I FIND THIS TAP?"; -TXT_DLG_SCRIPT02_d57608_IFIKN = "IF I KNEW, IT WOULDN'T BE A CHORE NOW WOULD IT? USE YOUR CHARM, BUT SHUT OFF HIS SUPPLY."; -TXT_DLG_SCRIPT02_d59124_TELLY = "TELL YOU WHAT, THERE'S A LYING SACK NAMED DERWIN WHO HAS BEEN SELLING CHILDREN TO THE ORDER. I WON'T TOLERATE THAT KIND OF DEPRAVITY. NOT WITHOUT MY CUT. DERWIN WORKS IN THE WAREHOUSE. KILL HIM AND BRING ME HIS, EAR, AND I'LL SEE WHAT I CAN DO."; -TXT_RPLY0_SCRIPT02_d59124_HOWDO = "HOW DO I GET IN?"; -TXT_DLG_SCRIPT02_d60640_THISK = "THIS KEY WILL GET YOU INTO THE POWER STATION. ON SECOND THOUGHT, CUT OFF THE EAR AND THEN KILL HIM. MUCH BETTER."; -TXT_DLG_SCRIPT02_d62156_OHIJU = "OH, I JUST LOVE SOUVENIRS. HERE, THIS WILL GET YOU INTO THE PRISON. TALK TO WARDEN MONTAG. WHATEVER YOU DO AFTER THAT, I DON'T WANT TO KNOW."; -TXT_RPLY0_SCRIPT02_d62156_THANK = "THANKS."; -TXT_DLG_SCRIPT02_d63672_GIVEY = "GIVE YOU A HINT. WHEN I STOP TALKING TO YOU, YOU LEAVE."; -TXT_DLG_SCRIPT02_d65188_DOYOU = "DO YOU HAVE GOOD NEWS FOR ME? I'M ALL EARS."; -TXT_RPLY0_SCRIPT02_d65188_THEDE = "THE DEED IS DONE!"; -TXT_DLG_SCRIPT02_d66704_OHIJU = "OH, I JUST LOVE SOUVENIRS. HERE, THIS WILL GET YOU INTO THE PRISON. TALK TO WARDEN MONTAG. WHATEVER YOU DO AFTER THAT, I DON'T WANT TO KNOW."; -TXT_RPLY0_SCRIPT02_d66704_FINEB = "FINE BY ME."; -TXT_DLG_SCRIPT02_d68220_SOYOU = "SO YOU'RE THE FOOL WHO STOLE THE CHALICE? I'M GOING TO HAVE YOU ARRESTED AS A REBEL THIEF... THEREBY ENHANCING MY POSITION WITH THE ORDER. HOW DOES IT FEEL TO BE AN UNWITTING PAWN? I'LL GIVE YOU A HINT, IT'S GONNA' HURT. "; -TXT_RPLY0_SCRIPT02_d68220_ITSUC = "IT SUCKS!"; -TXT_RYES0_SCRIPT02_d68220_FORYO = "FOR YOU IT DOES."; -TXT_RPLY1_SCRIPT02_d68220_HARRI = "HARRIS PROMISED ME MONEY!"; -TXT_RYES1_SCRIPT02_d68220_TOOBA = "TOO BAD. THE ONLY THING YOU'RE GETTING IS DEAD!"; -TXT_DLG_SCRIPT02_d69736_INASM = "IN A SMALL WORLD, WORD TRAVELS FAST. I HEAR YOU JUST REMOVED SOME OBSTACLES FROM YOUR PATH. NICE WORK. ARE YOU INTERESTED IN SOME MORE LUCRATIVE PROJECTS?"; -TXT_RPLY0_SCRIPT02_d69736_SUREW = "SURE, WHY NOT."; -TXT_RPLY1_SCRIPT02_d69736_NOTHA = "NO THANKS."; -TXT_RYES1_SCRIPT02_d69736_THENG = "THEN GET LOST!"; -TXT_DLG_SCRIPT02_d71252_FOOLG = "FOOL! GUARDS, RID ME OF THIS MEDDLESOME PEON."; -TXT_DLG_SCRIPT02_d72768_GOODS = "GOOD. SOME UH, FRIENDS OF MINE NEED SOMEONE SILENCED. BELDIN IS BEING HELD BY THE ORDER IN THEIR SANCTUARY. THERE'S A RARELY USED ENTRANCE BY A SMALL PIER OFF THE RIVER WHICH IS UNGUARDED. GET IN, SHUT HIM UP, AND BRING HIS RING BACK TO ME AS PROOF."; -TXT_RPLY0_SCRIPT02_d72768_WILLI = "WILL IT BE WORTH THE EFFORT?"; -TXT_DLG_SCRIPT02_d74284_ILLGU = "I'LL GUARANTEE 50 GOLD AND IF YOU RETURN WITHOUT SETTING OFF EVERY ALARM IN TOWN, THERE'S THE CHANCE TO EARN MUCH, MUCH MORE, AND HERE'S A LITTLE HELPER THAT SHOULD GIVE YOU AN EDGE."; -TXT_RPLY0_SCRIPT02_d74284_THANK = "THANKS, I'll Need it."; -TXT_DLG_SCRIPT02_d75800_GOODR = "GOOD. REMEMBER, HIS SILENCE IS GOLDEN."; -TXT_RPLY0_SCRIPT02_d75800_ILLGE = "I'LL GET HIM."; -TXT_DLG_SCRIPT02_d77316_MISSI = "MISSION ACCOMPLISHED? YOU HAVE THE RING OF THE TRAITOR?"; -TXT_RPLY0_SCRIPT02_d77316_HESDE = "HE'S DEAD, WHERE'S MY MONEY?"; -TXT_RNO0_SCRIPT02_d77316_LIARG = "LIAR! Go get the ring!"; -TXT_DLG_SCRIPT02_d78832_HEREY = "HERE, YOU EARNED IT. THE TRAITOR YOU KILLED WAS ABOUT TO REVEAL THE LOCATION OF THE FRONT. YOU SAVED LIVES. HOW WOULD YOU LIKE TO EARN MORE GOLD, AND A FUTURE FREE FROM TYRANNY?"; -TXT_RPLY0_SCRIPT02_d78832_TELLM = "TELL ME MORE."; -TXT_RPLY1_SCRIPT02_d78832_NOTMY = "NOT MY STYLE."; -TXT_DLG_SCRIPT02_d80348_IHAVE = "I HAVE A BUSINESS RELATIONSHIP WITH THE FRONT'S LEADER, MACIL. I KNOW HE NEEDS AN INCISIVE FELLOW LIKE YOURSELF, AND HE PAYS WELL. TAKE THIS RECOVERED COM UNIT AND YOU'LL BE LED TO, SHALL WE SAY, OPPORTUNITIES."; -TXT_RPLY0_SCRIPT02_d80348_THANK = "THANKS."; -TXT_DLG_SCRIPT02_d81864_GETGO = "GET GOING. IF YOU HANG AROUND HERE, WE'RE BOTH DEAD."; -TXT_DLG_SCRIPT02_d83380_APITY = "A PITY, BUT NOW THAT YOU KNOW ABOUT MY FRIENDS, I MUST KILL YOU. GUARDS, TAKE OUT THIS TRASH!"; -TXT_DLG_SCRIPT02_d84896_FOOLG = "FOOL. GUARDS! RID ME OF MEDDLESOME PEON."; -TXT_DLG_SCRIPT02_d86412_WALKA = "WALK AWAY, BOY, JUST WALK AWAY."; -TXT_DLG_SCRIPT02_d87928_WHATA = "WHAT ARE YOU DOING HERE?"; -TXT_RPLY0_SCRIPT02_d87928_HEYIN = "HEY, I NEED GOLD!"; -TXT_DLG_SCRIPT02_d89444_BLACK = "BLACKBIRD TOLD YOU THE CODE, HUH? LET ME SHUT OFF THE ALARM. MACIL IS ONE FLIGHT DOWN."; -TXT_RPLY0_SCRIPT02_d89444_THANK = "THANKS."; -TXT_DLG_SCRIPT02_d90960_WALKA = "WALK AWAY, BOY, JUST WALK AWAY."; -TXT_DLG_SCRIPT02_d92476_DOYOU = "DO YOU HAVE AN APPOINTMENT WITH THE GOVERNOR? "; -TXT_RPLY0_SCRIPT02_d92476_OFCOU = "OF COURSE!"; -TXT_RPLY1_SCRIPT02_d92476_NOAND = "NO, AND I DON'T NEED ONE!"; -TXT_DLG_SCRIPT02_d93992_SORRY = "SORRY! I DIDN'T MEAN... PLEASE GO RIGHT UP."; -TXT_RPLY0_SCRIPT02_d93992_IKNEW = "I KNEW YOU'D SAY THAT."; -TXT_DLG_SCRIPT02_d95508_IFYOU = "IF YOU'RE IN SUCH A HURRY, DON'T WASTE YOUR TIME WITH ME."; -TXT_DLG_SCRIPT02_d97024_RELEA = "RELEASE ME, LEAVE AN OLD MAN ALONE."; -TXT_DLG_SCRIPT02_d98540_YOUSE = "YOU SEEK WISDOM, MY SON? THE ORDER HAS SEEN TO IT THAT WE ONLY ASK ONE QUESTION, "WHY?""; -TXT_RPLY0_SCRIPT02_d98540_WHERE = "WHERE'S THE POWER COUPLING?"; -TXT_RPLY1_SCRIPT02_d98540_WHERE = "WHERE'S THE ORDER'S MAIN?"; -TXT_RPLY2_SCRIPT02_d98540_WHERE = "WHERE'S THE ILLEGAL TAP?"; -TXT_DLG_SCRIPT02_d100056_ILLTE = "I'LL TELL YOU WHERE IT IS, BUT I DON'T KNOW WHOSE COUPLING YOU'LL BE TAMPERING WITH. IT'S RIGHT HERE IN THE SEWAGE PLANT."; -TXT_RPLY0_SCRIPT02_d100056_THANK = "THANKS"; -TXT_DLG_SCRIPT02_d101572_THATS = "THAT'S RIGHT HERE IN THE SEWAGE PLANT. BUT IT'S THE FRONT'S COUPLING. WHOEVER TOLD YOU THAT IT WAS THE ORDER'S WAS WRONG."; -TXT_RPLY0_SCRIPT02_d101572_THANK = "THANKS"; -TXT_DLG_SCRIPT02_d103088_IFYOU = "IF YOU SAY IT'S ILLEGAL I WANT NOTHING TO DO WITH YOU. I HAVE ENOUGH TROUBLE AS IT IS."; -TXT_RPLY0_SCRIPT02_d103088_THANK = "THANKS"; -TXT_DLG_SCRIPT02_d104604_RELEA = "RELEASE ME, LEAVE AN OLD MAN ALONE."; +TXT_HEXDD_MAP41 = "RUINED VILLAGE"; +TXT_HEXDD_MAP42 = "BLIGHT"; +TXT_HEXDD_MAP43 = "SUMP"; +TXT_HEXDD_MAP44 = "CATACOMB"; +TXT_HEXDD_MAP45 = "BADLANDS"; +TXT_HEXDD_MAP46 = "BRACKENWOOD"; +TXT_HEXDD_MAP47 = "PYRE"; +TXT_HEXDD_MAP48 = "CONSTABLE'S GATE"; +TXT_HEXDD_MAP49 = "TREASURY"; +TXT_HEXDD_MAP50 = "MARKET PLACE"; +TXT_HEXDD_MAP51 = "LOCUS REQUIESCAT"; +TXT_HEXDD_MAP52 = "ORDEAL"; +TXT_HEXDD_MAP53 = "ARMORY"; +TXT_HEXDD_MAP54 = "NAVE"; +TXT_HEXDD_MAP55 = "CHANTRY"; +TXT_HEXDD_MAP56 = "ABATTOIR"; +TXT_HEXDD_MAP57 = "DARK WATCH"; +TXT_HEXDD_MAP58 = "CLOACA"; +TXT_HEXDD_MAP59 = "ICE HOLD"; +TXT_HEXDD_MAP60 = "DARK CITADEL"; +TXT_HEXDD_MAP33 = "TRANSIT"; +TXT_HEXDD_MAP34 = "OVER N UNDER"; +TXT_HEXDD_MAP35 = "DEATHFOG"; +TXT_HEXDD_MAP36 = "CASTLE OF PAIN"; +TXT_HEXDD_MAP37 = "SEWER PIT"; +TXT_HEXDD_MAP38 = "THE ROSE"; -TXT_DLG_SCRIPT03_d0_WELCO = "WELCOME TO THE LAST FLICKER OF HOPE. ONLY WE HAVE THE FREE WILL TO OPPOSE THE ORDER. WE HAVE THE SHARPEST SCIENTIFIC MINDS, AND MANY ABLE BODIES, BUT WE LACK THAT ONE REAL, UH... "PROBLEM SOLVER", WHO WILL GIVE US THE EDGE WE NEED. HELP US."; -TXT_RPLY0_SCRIPT03_d0_ALLRI = "ALL RIGHT, I ACCEPT."; -TXT_RPLY1_SCRIPT03_d0_NOTHA = "NO THANKS!"; -TXT_DLG_SCRIPT03_d1516_YOUMI = "YOU MIGHT WANT TO RECONSIDER, SEEING THAT YOU'RE SURROUNDED BY HEAVILY ARMED ANGRY REBELS."; -TXT_RPLY0_SCRIPT03_d1516_ALLRI = "ALL RIGHT, I'M IN!"; -TXT_RPLY1_SCRIPT03_d1516_NOTHA = "NO THANKS."; -TXT_DLG_SCRIPT03_d3032_THEND = "THEN DIE IN SHAME AND DISHONOR."; -TXT_DLG_SCRIPT03_d4548_GOODB = "GOOD, BLACKBIRD WILL CONTINUE TO BE YOUR GUIDE. SHE'S TAKEN QUITE A SHINE TO YOU. TOGETHER YOU'VE GOT TO UNLOCK THE SECRETS OF THE ORDER AND THEIR INHUMAN SERVANTS. GET INSIDE AND TAKE THEM DOWN."; -TXT_RPLY0_SCRIPT03_d4548_WHERE = "WHERE DO I START?"; -TXT_DLG_SCRIPT03_d6064_FRANK = "FRANKLY THE SITUATION IS A MESS. YOU MUST ACCOMPLISH SEVERAL MISSIONS TO PREPARE THE WAY FOR MORE ATTACKS ON THE ORDER. OUR LAST RAID WAS A DISASTER AND MOST OF OUR TROOPS WERE CAPTURED. I NEED YOU TO FREE THESE PRISONERS."; -TXT_RPLY0_SCRIPT03_d6064_ITHIN = "I THINK I CAN HANDLE IT."; -TXT_DLG_SCRIPT03_d7580_TAKET = "TAKE THIS MONEY AND VISIT IRALE WHO SUPPLIES OUR WEAPONS. THEN, THIS KEY WILL GET YOU IN TO SEE THE GOVERNOR. HE'S A CORRUPT PUPPET OF THE ORDER, BUT HE LOVES TO MAKE DEALS. DO WHATEVER YOU NEED TO FREE OUR BROTHERS IN ARMS."; -TXT_RPLY0_SCRIPT03_d7580_ILLSE = "I'LL SEE TO IT."; -TXT_DLG_SCRIPT03_d9096_FIGHT = "FIGHT FOR THE FRONT AND FREEDOM. MOVE OUT."; -TXT_DLG_SCRIPT03_d10612_THEPR = "THE PRISONERS HAVE BEEN WELCOMED BACK, THANKS TO YOU. HERE'S SOME GOLD, GO VISIT THE MEDIC AND THE WEAPONS TRAINER AND THEN, I HAVE HIGHER GOALS FOR YOU."; -TXT_RPLY0_SCRIPT03_d10612_IWILL = "I WILL. WHAT'S NEXT?"; -TXT_DLG_SCRIPT03_d12128_ASING = "A SINGLE CRYSTAL RUNS THE POWER GRID WHICH DRIVES THE ORDER'S SHIELDS. DESTROY THAT CRYSTAL AND YOU WILL PUNCH HUGE HOLES IN THE ORDER'S DEFENSES. BLACKBIRD WILL LEAD YOU TO A SPY WHO HAS A WAY IN, GOOD LUCK."; -TXT_RPLY0_SCRIPT03_d12128_WELLG = "WE'LL GET IT."; -TXT_DLG_SCRIPT03_d13644_FIGHT = "FIGHT FOR THE FRONT AND FREEDOM. MOVE OUT."; -TXT_DLG_SCRIPT03_d15160_YOUVE = "YOU'VE EXCEEDED ALL OF OUR EXPECTATIONS. BECAUSE OF YOUR DARING OUR TROOPS ARE ON THE MOVE. I WANT YOU TWO TO JOIN THE ASSAULT, WITH A SPECIFIC TARGET. TAKE OUT THE PROGRAMMER. IT'S TIME TO REVEAL WHAT WE'VE FOUND OUT ABOUT THIS LAYER OF THE ORDER."; -TXT_RPLY0_SCRIPT03_d15160_TELLM = "TELL ME WHAT WE KNOW."; -TXT_DLG_SCRIPT03_d16676_THEPR = "THE PROGRAMMER'S LAIR IS IN THE CASTLE. NOW, SEE THE MEDIC, GRAB SOME AMMO AND GO GET HIM."; -TXT_RPLY0_SCRIPT03_d16676_LETME = "LET ME AT 'EM!"; -TXT_DLG_SCRIPT03_d18192_FIGHT = "FIGHT FOR THE FRONT AND FREEDOM. MOVE OUT."; -TXT_DLG_SCRIPT03_d19708_REMEM = "REMEMBER WHAT THE TOWN HALL LOOKED LIKE? THAT'S A GENTLE REMINDER OF WHAT THEY'RE WILLING TO DO TO GET AT US. BE CAREFUL."; -TXT_DLG_SCRIPT03_d21224_TALKT = "TALK TO MACIL. HE'LL BE ABLE TO HELP YOU."; -TXT_DLG_SCRIPT03_d22740_IVEHE = "I'VE HEARD THAT MACIL'S GOT A PLAN TO SUBVERT THE ORDER. IT HAD BETTER BE GOOD. ONE MORE FAILURE AND WE'RE ALL JUST DEAD MEAT."; -TXT_DLG_SCRIPT03_d24256_AFEWO = "A FEW OF THESE BARRELS DUMPED INTO THEIR WATER SUPPLY SHOULD EVEN THE ODDS A LITTLE."; -TXT_DLG_SCRIPT03_d25772_SOYOU = "SO YOU'RE THE NEW OPERATIVE? THANKS, WITHOUT YOU, WE'D ALL BE DEAD RIGHT NOW."; -TXT_DLG_SCRIPT03_d27288_IMWOR = "I'M WORKING ON SOMETHING THAT WILL GIVE US AN EDGE. IT WILL INCREASE YOUR STAMINA AND COMPLETELY JACK YOU UP. I'VE ALMOST GOT ALL THE BUGS WORKED OUT. CAN I DO SOMETHING FOR YOU?"; -TXT_RPLY0_SCRIPT03_d27288_PATCH = "PATCH ME UP."; -TXT_RYES0_SCRIPT03_d27288_BOYYO = "BOY, YOU'RE A REAL MESS. I'LL SEE WHAT I CAN DO."; -TXT_RPLY1_SCRIPT03_d27288_STAMI = "STAMINA IMPLANT?"; -TXT_RYES1_SCRIPT03_d27288_ALLRI = "ALL RIGHT, THIS WON'T TAKE BUT A MOMENT."; -TXT_RNO1_SCRIPT03_d27288_ITSNO = "IT'S NOT DONE YET."; -TXT_DLG_SCRIPT03_d28804_HEYIM = "HEY, I'M WORKING ON AN UPDATED VERSION OF YOUR IMPLANT. IS THERE ANYTHING ELSE I CAN DO?"; -TXT_RPLY0_SCRIPT03_d28804_PATCH = "PATCH ME UP."; -TXT_RYES0_SCRIPT03_d28804_WELLA = "WELL AT LEAST YOUR SEEING ACTION."; -TXT_RPLY1_SCRIPT03_d28804_IMPLA = "IMPLANT UPGRADE?"; -TXT_RYES1_SCRIPT03_d28804_GOODT = "GOOD THING, NEVER CAN BE TOO SAFE."; -TXT_RNO1_SCRIPT03_d28804_IMALM = "I'M ALMOST FINISHED, BUT NOT QUITE."; -TXT_DLG_SCRIPT03_d30320_ALLRI = "ALL RIGHT, I'VE ALMOST GOT EVERYTHING WORKING PERFECTLY. THERE WERE A FEW PROBLEMS LEFT TO GET RID OF. DO YOU NEED ANYTHING ELSE? "; -TXT_RPLY0_SCRIPT03_d30320_PATCH = "PATCH ME UP."; -TXT_RYES0_SCRIPT03_d30320_WHATH = "WHAT HAVE YOU BEEN TRYING TO DO? GO HEAD TO HEAD WITH A CRUSADER?"; -TXT_RPLY1_SCRIPT03_d30320_IMPLA = "IMPLANT UPGRADE?."; -TXT_RYES1_SCRIPT03_d30320_THATS = "THAT SHOULD DO IT FOR YOU."; -TXT_RNO1_SCRIPT03_d30320_LETME = "LET ME RUN SOME MORE TESTS FIRST."; -TXT_DLG_SCRIPT03_d31836_THATS = "THAT'S ALL I CAN DO ON THE IMPLANT RIGHT NOW. MAYBE SOME HEALING?"; -TXT_RPLY0_SCRIPT03_d31836_YEAH = "YEAH."; -TXT_RYES0_SCRIPT03_d31836_BOYYO = "BOY, YOU'RE A REAL MESS. I'LL SEE WHAT I CAN DO."; -TXT_DLG_SCRIPT03_d33352_WHATC = "WHAT CAN I DO FOR YOU?"; -TXT_RPLY0_SCRIPT03_d33352_IMOUT = "I'M OUT OF BULLETS."; -TXT_RYES0_SCRIPT03_d33352_HERES = "HERE'S SOME AMMO FOR YOU. DON'T WASTE IT."; -TXT_RPLY1_SCRIPT03_d33352_TEACH = "TEACH ME."; -TXT_RYES1_SCRIPT03_d33352_ALLRI = "ALL RIGHT, I'LL JUST SHOW YOU A FEW LITTLE POINTERS."; -TXT_RNO1_SCRIPT03_d33352_YOURE = "YOU'RE NOT READY YET."; -TXT_DLG_SCRIPT03_d34868_BACKA = "BACK AGAIN? WHAT DO YOU NEED?"; -TXT_RPLY0_SCRIPT03_d34868_IMOUT = "I'M OUT OF BULLETS."; -TXT_RYES0_SCRIPT03_d34868_HERES = "HERE'S SOME AMMO FOR YOU. DON'T WASTE IT."; -TXT_RNO0_SCRIPT03_d34868_YOUVE = "YOU'VE GOT ENOUGH AMMO."; -TXT_RPLY1_SCRIPT03_d34868_TEACH = "TEACH ME."; -TXT_RYES1_SCRIPT03_d34868_ALLRI = "ALL RIGHT, THIS SHOULD KEEP YOU GOING FOR A WHILE."; -TXT_RNO1_SCRIPT03_d34868_SORRY = "SORRY, CAN'T. I'M JUST FOLLOWING MACIL'S ORDERS."; -TXT_DLG_SCRIPT03_d36384_WELLW = "WELL WHICH IS IT, BULLETS OR TRAINING? I CAN'T WAIT TO GET MY HANDS ON THOSE NEW WEAPONS WE CAPTURED. A LITTLE BIT OF TRAINING AND THEN A LOT OF REVENGE."; -TXT_RPLY0_SCRIPT03_d36384_IMOUT = "I'M OUT OF AMMO."; -TXT_RYES0_SCRIPT03_d36384_HERES = "HERE'S SOME AMMO FOR YOU. DON'T WASTE IT."; -TXT_RNO0_SCRIPT03_d36384_YOUVE = "YOU'VE GOT ENOUGH AMMO."; -TXT_RPLY1_SCRIPT03_d36384_TEACH = "TEACH ME."; -TXT_RYES1_SCRIPT03_d36384_OKTAK = "O.K. TAKE WHAT YOU'VE LEARNED HERE AND SHOW THOSE ORDER CLODS THE WAY TO HELL."; -TXT_RNO1_SCRIPT03_d36384_COMEB = "COME BACK LATER, WHEN MACIL SAYS IT'S TIME."; -TXT_DLG_SCRIPT03_d37900_IVETA = "I'VE TAUGHT YOU EVERYTHING I CAN RIGHT NOW. GIVE ME SOME TIME TO PUT THE NEW WEAPONS THROUGH THEIR PACES. THAT IS UNLESS YOU'RE OUT OF BULLETS."; -TXT_RPLY0_SCRIPT03_d37900_YESIA = "YES I AM."; -TXT_RYES0_SCRIPT03_d37900_HEREY = "HERE YOU GO."; -TXT_DLG_SCRIPT03_d39416_DONTG = "DON'T GET TRIGGER HAPPY IN THE TOWN. YOU'LL SET OFF THE ALARM AND THEY'LL START SENDING IN GUARDS FROM THE CASTLE. "; -TXT_DLG_SCRIPT03_d40932_WELCO = "WELCOME, WE CAN ALWAYS USE MORE HELP."; -TXT_DLG_SCRIPT03_d42448_WHENI = "WHEN I WAS STILL IN ACTION WE HAD THE CHANCE TO EXAMINE AN ACOLYTE BEFORE THE REINFORCEMENTS ARRIVED. LISTEN, THEY'RE NOT HUMAN."; -TXT_DLG_SCRIPT03_d43964_WERET = "WE'RE TRYING TO FIND WHERE THE CASTLE GATE MECHANISMS ARE, BUT SO FAR WE'VE HAD NO LUCK."; -TXT_DLG_SCRIPT03_d45480_DONTG = "DON'T GET CAUGHT. I'VE HEARD HORROR STORIES ABOUT WHAT THEY DO TO OUR PEOPLE AFTER THEY'RE IMPRISONED. THEY JUST DISAPPEAR... WITHOUT A TRACE."; -TXT_DLG_SCRIPT03_d46996_HERES = "HERE'S SOME ADVICE, IF YOU EVER SEE ANY OF THE ORDER'S "TIN SOLDIERS" GO IN THE OTHER DIRECTION. THEY'RE FAST AND BRUTAL."; -TXT_DLG_SCRIPT03_d48512_LEAVE = "LEAVE ME BE. I'M DOING SOMETHING FOR MACIL."; +TXT_HEXDD_CLUS1MSG = "wiping a trembling hand across your\n" + "bleeding face, you try to clear\n" + "your mind for what lies ahead...\n" + "\n" + "...and forget what lies behind.\n" + "\n" + "in the distance, the stark ramparts\n" + "of a great castle complex seem to\n" + "rend the sky above, and the stench\n" + "of decay wafts from the violated\n" + "graves of uncounted dead.\n" + "\n" + "carefully counting what little\n" + "remains of your artifacts, you try\n" + "to reassure yourself that it will\n" + "be enough. after all, it has to be\n" + "enough, doesn't it?\n" + "\n" + "\n" + "doesn't it?"; + + + // +TXT_HEXDD_CLUS2MSG = "surely the souls of the damned inhabit\n" + "this world, for nothing fair or good\n" + "could survive here for long.\n" + "\n" + "but what has passed before can only\n" + "be a pale shadow of what bars your\n" + "passage now: the dark citadel itself.\n" + "\n" + "the grim bulk of the cathedral blocks\n" + "all but fragmentary glimpses of the\n" + "citadel proper, but what can be seen\n" + "speaks in sibilant whispers of cold,\n" + "lingering death...\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "...for the fortunate."; -TXT_DLG_SCRIPT04_d0_SORRY = "SORRY, NO. YOU DO NOT HAVE CLEARANCE."; -TXT_DLG_SCRIPT04_d1516_STOPS = "STOP! SHOW ME YOUR ID BADGE."; -TXT_RPLY0_SCRIPT04_d1516_HERES = "HERE'S MY I.D."; -TXT_DLG_SCRIPT04_d3032_OHOKS = "OH, OK. SURE GO AHEAD. HAVE A NICE DAY."; -TXT_DLG_SCRIPT04_d4548_DERWI = "DERWIN? YEAH, HE'S DOWN IN THE WAREHOUSE, BUT YOU'RE NOT GETTING IN UNLESS YOU'RE CLEARED."; -TXT_RPLY0_SCRIPT04_d4548_IVEGO = "I'VE GOT CLEARANCE."; -TXT_DLG_SCRIPT04_d6064_GOON = "GO ON."; -TXT_RPLY0_SCRIPT04_d6064_DOYOU = "DO YOU KNOW WHERE HE IS?"; -TXT_DLG_SCRIPT04_d7580_IDONT = "I DON'T KNOW WHERE ANYBODY IS. I JUST KEEP THE LID ON THE RAT TRAP."; -TXT_DLG_SCRIPT04_d9096_YOUAR = "YOU ARE AN UNPLEASANT DISTRACTION."; -TXT_DLG_SCRIPT04_d10612_MOVEA = "MOVE ALONG OR TASTE METAL."; -TXT_DLG_SCRIPT04_d12128_PASSY = "PASS YOUR ID THROUGH HERE FOR ACCESS."; -TXT_DLG_SCRIPT04_d13644_GETBA = "GET BACK TO WORK, NOW!"; -TXT_DLG_SCRIPT04_d15160_GETBA = "GET BACK TO WORK, NOW!"; -TXT_DLG_SCRIPT04_d16676_WEVEB = "WE'VE BEEN RUNNING AROUND THE CLOCK FOR WEEKS WITH NO DOWN TIME. I'D SAY THAT THE ORDER IS PLANNING A SUPPRESSION RAID ON THE FRONT."; -TXT_DLG_SCRIPT04_d18192_OHDAM = "OH, DAMN. THE GOVERNOR SENT YOU. I WAS GOING TO GIVE HIM HIS CUT, REALLY I WAS. OK, LISTEN. I'VE GOT A BUNDLE STASHED. IT'S YOURS IF YOU LOOK THE OTHER WAY."; -TXT_RPLY0_SCRIPT04_d18192_ALLRI = "ALL RIGHT, I'LL LET YOU GO."; -TXT_RPLY1_SCRIPT04_d18192_SORRY = "SORRY, NOTHING PERSONAL."; -TXT_DLG_SCRIPT04_d19708_NUTSI = "NUTS, IF I'M GOING DOWN, THEN SO ARE YOU. GUARDS!!"; -TXT_DLG_SCRIPT04_d21224_BUSIN = "BUSINESS MY ASS. HELP, GUARDS, I'VE GOT A LIVE ONE."; -TXT_DLG_SCRIPT04_d22740_AHIGO = "AH, I GOT WORD FROM MACIL THAT YOU'D BE COMING. I HAVE A WAY TO GET YOU INSIDE THE POWER STATION, BUT IT'S ON THE RISKY SIDE."; -TXT_RPLY0_SCRIPT04_d22740_ILLTA = "I'LL TAKE MY CHANCES."; -TXT_DLG_SCRIPT04_d24256_ALLRI = "ALL RIGHT, I STOLE AN I.D. FROM THE CORPSE OF SOME FOOL WHO FELL INTO THE REACTOR'S COOLANT PIT. --BLAT-- INSTANT DEEP FRY."; -TXT_RPLY0_SCRIPT04_d24256_WHATS = "WHAT SHOULD I DO ONCE I'M IN?"; -TXT_DLG_SCRIPT04_d25772_TELLW = "TELL WHOEVER ASKS THAT YOU'RE THE REPLACEMENT WORKER FOR MR. CRISPY. IT'S JUST DUMB ENOUGH TO WORK. OH, AND YOU MIGHT WANT TO CHECK OUT THE STOREROOM THAT'S RIGHT ABOVE US."; -TXT_RPLY0_SCRIPT04_d25772_BOYIH = "BOY I HOPE THIS I.D. WORKS."; -TXT_DLG_SCRIPT04_d27288_GETOU = "GET OUT OF HERE, UNLESS YOU WANT TO END UP MR. DEAD."; -TXT_DLG_SCRIPT04_d28804_HEYLE = "HEY, LEAVE ME ALONE. IF THEY CATCH US WASTING TIME WE GET DEAD, OR EXTRA WORK."; -TXT_DLG_SCRIPT04_d30320_SUCHP = "SUCH PRESSURE, AT THIS RATE WE'LL BE BACK TO NORMAL SHIFTS SOON. WE'RE PUMPING TONS OF POWER TO THE CASTLE AND I'M ALMOST FINISHED LOGGING THOSE NEW WEAPONS."; -TXT_RPLY0_SCRIPT04_d30320_WEAPO = "WEAPONS?"; -TXT_DLG_SCRIPT04_d31836_WHATD = "WHAT DO YOU THINK, WE'RE BACKED UP ON SOCKS?"; -TXT_RPLY0_SCRIPT04_d31836_WHATK = "WHAT KIND OF WEAPONS?"; -TXT_DLG_SCRIPT04_d33352_AREYO = "ARE YOU DEAF? I JUST TOLD YOU HOW BUSY I AM. GET BACK TO WORK."; -TXT_DLG_SCRIPT04_d34868_WHOAR = "WHO ARE YOU? ONLY CLEARANCE LEVEL TWO PERSONNEL ARE PERMITTED IN THIS AREA."; -TXT_RPLY0_SCRIPT04_d34868_IMTHE = "I'M THE REPLACEMENT WORKER."; -TXT_DLG_SCRIPT04_d36384_ABOUT = "ABOUT TIME YOU SHOWED UP. GO TALK WITH KETRICK IN THE CORE. OH, AND TAKE THIS KEY CARD. DON'T WANT YOU GETTING SHOT ON YOUR FIRST DAY, HUH?"; -TXT_RPLY0_SCRIPT04_d36384_WHERE = "WHERE'S THE POWER CRYSTAL?"; -TXT_DLG_SCRIPT04_d37900_IFYOU = "IF YOU DON'T GET TO WORK, YOU'LL GET SHOT ANYWAY. MOVE YOUR TUNIC."; -TXT_DLG_SCRIPT04_d39416_IDONT = "I DON'T MEAN TO SOUND ALARMIST, BUT IF THEY KEEP PUSHING THE POWER CRYSTAL THIS HARD IT'S GONNA FLAW, AND THEN SHATTER, AND THEN *BOOM*! ...JUST A THOUGHT."; -TXT_DLG_SCRIPT04_d40932_LETME = "LET ME BE QUITE CLEAR. IF THIS TERMINAL LOCKS UP AGAIN, THE COOLANT LEVEL WILL DROP AND WE'LL ALL HAVE TO ANSWER TO THE PROGRAMMER. IF WE SURVIVE."; -TXT_DLG_SCRIPT04_d42448_YOUYE = "YOU! YEAH, YOU. YOU AREN'T CLEARED FOR THIS AREA. LET ME HAVE YOUR KEY CARD, FAST. I'M IN SUCH A BAD MOOD!"; -TXT_RPLY0_SCRIPT04_d42448_HEREH = "HERE, HERE'S MY CARD."; -TXT_DLG_SCRIPT04_d43964_THISI = "THIS IS GARBAGE! WAIT HERE. OH SCREW IT. GUARDS KILL THIS INTRUDER!"; -TXT_DLG_SCRIPT04_d45480_WORKS = "WORK, SLEEP, GET TORTURED, WHAT A LIFE. SAY, YOU THE REPLACEMENT FOR THE CARELESS PIT DIVER?"; -TXT_RPLY0_SCRIPT04_d45480_YEAHC = "YEAH, CAN'T WAIT TO START."; -TXT_DLG_SCRIPT04_d46996_YEAHR = "YEAH, RIGHT. OK, GET YOUR ASS TO WORK."; -TXT_RPLY0_SCRIPT04_d46996_WHERE = "WHERE'S THE CRYSTAL?"; -TXT_DLG_SCRIPT04_d48512_GOTAL = "GO TALK TO KETRICK. BRING THE WALKWAY UP USING THE SWITCHES, THEN USE THIS I.D. FOR THE ELEVATOR."; -TXT_RPLY0_SCRIPT04_d48512_WHERE = "WHERE'S THE CRYSTAL AGAIN?"; -TXT_DLG_SCRIPT04_d50028_NONEO = "NONE OF YOUR BUSINESS, GO TALK TO KETRICK."; -TXT_RPLY0_SCRIPT04_d50028_OK = "OK."; -TXT_DLG_SCRIPT04_d51544_IFITS = "IF IT'S BUSY WORK YOU WANT, GO STARE AT THAT SCREEN FOR A WHILE, IT'LL BORE YOU TO TEARS."; -TXT_DLG_SCRIPT04_d53060_THEAL = "THE ALMIGHTY PROGRAMMER IS SO PARANOID OF INFILTRATION THAT HE'S LOCKED UP THE COMPUTER CORE. HOW AM I SUPPOSED TO GET MY WORK DONE? THE ONLY WAY IN IS THE SUICIDE RUN."; -TXT_RPLY0_SCRIPT04_d53060_SUICI = "SUICIDE RUN? WHAT'S THAT?"; -TXT_DLG_SCRIPT04_d54576_ITSAS = "IT'S A SURE-FIRE WAY TO GET KILLED, BUT THAT'S NOT IMPORTANT RIGHT NOW. GO DOWN THE LIFT IF YOU'RE SO INCLINED."; + // +TXT_HEXDD_WIN1MSG = "once again you find yourself in the\n" + "great hall of the chaos sphere, as\n" + "if no time had passed from when\n" + "last you moved among these shadows.\n" + "\n" + "but something is eerily different,\n" + "a silence where once had been soft\n" + "whispers, a sense of being watched\n" + "by hidden eyes...\n" + "\n" + "...eyes which shield a malefic\n" + "intent."; -TXT_DLG_SCRIPT05_d0_HALTN = "HALT. NO ONE GETS THROUGH HERE WITHOUT AUTHORIZATION FROM THE WARDEN OR THE GOVERNOR."; -TXT_RPLY0_SCRIPT05_d0_HERES = "HERE'S MY PASS, LET ME IN."; -TXT_DLG_SCRIPT05_d1516_OKBUT = "OK, BUT TALK ONLY TO THE WARDEN."; -TXT_DLG_SCRIPT05_d3032_DOILO = "DO I LOOK LIKE THE WARDEN TO YOU? KEEP MOVING, THIS AREA'S OFF LIMITS."; -TXT_DLG_SCRIPT05_d4548_THEOR = "THE ORDER'S WRATH WILL RAIN DOWN ON THESE SERVANTS UNTIL THEY BEG FOR DEATH."; -TXT_DLG_SCRIPT05_d6064_IDONT = "I DON'T CARE IF MOUREL GAVE YOU A PASS. THIS IS MY PRISON. MY KEY IS THE ONLY WAY IN OR OUT, AND I'M NOT TAKING ANY CHANCES. THE ORDER DOES NOT TOLERATE MISTAKES."; -TXT_RPLY0_SCRIPT05_d6064_GIVEM = "GIVE ME THE DAMN KEY!"; -TXT_DLG_SCRIPT05_d7580_OVERM = "OVER MY DEAD BODY!"; -TXT_RPLY0_SCRIPT05_d7580_GREAT = "GREAT IDEA!"; -TXT_DLG_SCRIPT05_d9096_SHACK = "SHACKLES OR CHAINS, I WANT YOU TO HANG AROUND."; -TXT_DLG_SCRIPT05_d10612_IDONT = "I DON'T KNOW HOW YOU MANAGED TO GET PAST THE GUARDS AND THE WARDEN, BUT I HOPE YOU LIKE THE DECOR, BECAUSE YOU JUST MOVED IN."; -TXT_RPLY0_SCRIPT05_d10612_FREEM = "FREE MY COMRADES OR DIE!"; -TXT_DLG_SCRIPT05_d12128_KILLM = "KILL ME AND YOU'LL NEVER SET ANYONE FREE. I POSSESS THE ONLY PATTERN KEY THAT WILL UNLOCK THE CELLS."; -TXT_RPLY0_SCRIPT05_d12128_CANYO = "CAN YOU LEND ME A HAND THEN?"; -TXT_DLG_SCRIPT05_d13644_MOVEA = "MOVE ALONG OR JOIN YOUR FRIENDS."; -TXT_DLG_SCRIPT05_d15160_DONTJ = "DON'T JUST STAND THERE, GET US OUT OF HERE!"; -TXT_DLG_SCRIPT05_d16676_THESK = "THE SKY, I WANT TO SEE THE SKY."; -TXT_DLG_SCRIPT05_d18192_FIVEF = "FIVE FEET BY FOUR FEET, FIVE FEET BY FOUR FEET, FIVE FEET BY FOUR FEET."; -TXT_DLG_SCRIPT05_d19708_DONTR = "DON'T RELEASE ME IF THE ORDER'S STILL IN CHARGE. I CAN'T STAND THE TERROR."; -TXT_DLG_SCRIPT05_d21224_IDONT = "I DON'T WANT TO BITCH, BUT IT'S ABOUT TIME MACIL SENT SOMEONE TO GET US OUT."; -TXT_DLG_SCRIPT05_d22740_IDGIV = "I'D GIVE ANYTHING FOR JUST A CRUST OF BREAD. I'M SO HUNGRY."; + // + +TXT_HEXDD_WIN2MSG = "once before you grasped the chaos\n" + "sphere, held it within trembling\n" + "hands. now your hands tremble with\n" + "something more than avarice, and\n" + "dread meshes with the hunger for\n" + "power.\n" + "\n" + "if even the power of the sphere is\n" + "not enough to protect you from the\n" + "forces of darkness, perhaps it is\n" + "better left untouched, its promise\n" + "left unkept.\n" + "\n" + "\n" + "\n" + "but then, you never were one to\n" + "back down from a challenge..."; + +// + +TXT_HEXDD_WIN3MSG = "\n" + "...and other players await.\n" + "\n" + ""; -TXT_DLG_SCRIPT06_d0_AHASU = "AH, A SURFACER IN NEED OF A FAVOR. DOWN HERE YOU DO A FAVOR TO GET A FAVOR AND I NEED THE TOWN ENTRANCE THAT IS OUR PATH TO FOOD OPENED. THE ORDER HAS IT SEALED AND GUARDED."; -TXT_RPLY0_SCRIPT06_d0_WHERE = "WHERE IS THE GATE MECHANISM?"; -TXT_DLG_SCRIPT06_d1516_DOMYF = "DO MY FAVOR FIRST, OR YOU'LL GET SQUAT FROM ME."; -TXT_RPLY0_SCRIPT06_d1516_HOWWI = "HOW WILL YOU KNOW IT'S OPEN?"; -TXT_DLG_SCRIPT06_d3032_BRING = "BRING ME BACK THE GUARD'S UNIFORM. THAT WAY ONE OF MY RATFELLOWS CAN WEAR IT AND NO ONE WILL TRY TO SHUT THE DOOR AGAIN."; -TXT_RPLY0_SCRIPT06_d3032_YOUWA = "YOU WANT HIS UNIFORM?"; -TXT_DLG_SCRIPT06_d4548_OPENT = "OPEN THE DOOR, BRING ME THE UNIFORM AND WE TRADE. OTHERWISE, PISS OFF."; -TXT_DLG_SCRIPT06_d6064_HAVEY = "HAVE YOU BROUGHT ME WHAT I WANT?"; -TXT_RPLY0_SCRIPT06_d6064_HOWAB = "HOW ABOUT THIS UNIFORM?"; -TXT_RNO0_SCRIPT06_d6064_BRING = "BRING ME THE UNIFORM."; -TXT_DLG_SCRIPT06_d7580_GOODH = "GOOD. HERE'S SOMETHING EXTRA. MY FELLOWS TORE THIS OFF OF A FALLEN CRUSADER, IT'S THE PARTS THAT MAKE UP A FLAMETHROWER. NOW IRALE CAN MAKE ONE FOR YOU. YOU CAN HAVE SUCH FUN."; -TXT_RPLY0_SCRIPT06_d7580_WHERE = "WHERE'S THE GATE MECHANISM?"; -TXT_DLG_SCRIPT06_d9096_YOUHA = "YOU HAVE TO ENTER ANOTHER PART OF THE SEWERS. TO GET THERE YOU MUST ENTER THE CASTLE FROM A SEWER MAINTENANCE DOOR AND DRAIN THE FLUID RECLAMATION TANK. AT THE BOTTOM IS THE HIDDEN ENTRANCE TO SEWERS, AND RIGHT BEYOND THAT IS THE MANUAL GATE CONTROL."; -TXT_RPLY0_SCRIPT06_d9096_ANYTH = "ANYTHING ELSE YOU CAN DO?"; -TXT_DLG_SCRIPT06_d10612_GOODL = "GOOD LUCK. I'VE OPENED SEVERAL OF OUR TUNNELS FOR YOU. IT SHOULD MAKE YOUR TASK EASIER. OH, SIZE TEN, PERFECT! ...BUT DREADFUL COLORS."; -TXT_RPLY0_SCRIPT06_d10612_THANK = "THANKS FOR YOUR HELP."; -TXT_DLG_SCRIPT06_d12128_YOUGI = "YOU GIVE ME NOTHING, YOU GET NOTHING."; -TXT_DLG_SCRIPT06_d13644_WERAN = "WERAN WILL SAVE US. HE'S NEVER FAILED US YET."; -TXT_DLG_SCRIPT06_d15160_IFYOU = "IF YOU SEEK AN ANSWER TO YOUR PROBLEM, FIND WERAN. "; -TXT_DLG_SCRIPT06_d16676_LONGL = "LONG LIVE THE FRONT? THAT'S ALL CRAP. WE'RE ALL JUST WAITING TO DIE. "; -TXT_DLG_SCRIPT06_d18192_WITHO = "WITH OUR PASSAGE TO THE SURFACE SEALED, WE CAN'T EVEN FEED OURSELVES."; -TXT_DLG_SCRIPT06_d19708_FOODD = "FOOD, DO YOU HAVE ANY FOOD? PLEASE HELP US."; -TXT_DLG_SCRIPT06_d21224_THISI = "THIS IS MY REWARD FOR LETTING PRISONERS ESCAPE, GUARDING THE SEWERS. IF I EVER FIND THE GUY WHO BROKE THEM OUT, I'LL SLAUGHTER HIM."; -TXT_DLG_SCRIPT06_d22740_WEVEG = "WE'VE GOT THOSE LITTLE BEGGARS JUST WHERE WE WANT THEM. FEW MORE DAYS OF THIS, AND THEY'LL HAVE STARVED THEMSELVES INTO OBLIVION."; -TXT_DLG_SCRIPT06_d24256_WHATS = "WHAT'S YOUR CLEARANCE? THERE'S NO UNAUTHORIZED PERSONNEL ALLOWED UP HERE."; - -TXT_DLG_SCRIPT07_d0_WHATT = "WHAT THE HELL? WHO OPENED THE GATES? SOUND THE ALARM!!!"; -TXT_DLG_SCRIPT07_d1516_THERE = "THERE'S ANOTHER WAY INTO THE SEWERS, THROW THAT SWITCH AND THEN GO UP AND PURGE THE RECLAMATION TANK."; -TXT_DLG_SCRIPT07_d3032_WHATT = "WHAT THE HELL'S YOUR PROBLEM. IF THE PROGRAMMER COMES UP FROM HIS AUDIENCE CHAMBER, YOU'RE DEAD."; -TXT_DLG_SCRIPT07_d4548_HEYYO = "HEY, YOU'RE NOT CLEARED TO GO DOWN THERE."; -TXT_DLG_SCRIPT07_d6064_PROGR = "PROGRAMMER? WHO TOLD YOU THAT? THERE IS NO PROGRAMMER. THAT STORY WAS SPREAD AGES AGO. DON'T TELL ME THE FRONT ACTUALLY BELIEVED THAT CRAP. IDIOTS."; -TXT_RPLY0_SCRIPT07_d6064_WELLW = "WELL, WHAT'S THE TRUTH THEN?"; -TXT_DLG_SCRIPT07_d7580_ITOLD = "I TOLD YOU ALL I KNOW. YOU ARE WASTING YOUR TIME."; -TXT_DLG_SCRIPT07_d9096_FIGHT = "FIGHT ON, WE WILL TRIUMPH. THIS DAY WILL BELONG TO US!"; -TXT_DLG_SCRIPT07_d10612_FIGHT = "FIGHT ON, WE WILL TRIUMPH. THIS DAY WILL BELONG TO US!"; -TXT_DLG_SCRIPT07_d12128_FIGHT = "FIGHT ON, WE WILL TRIUMPH. THIS DAY WILL BELONG TO US!"; -TXT_DLG_SCRIPT07_d13644_FIGHT = "FIGHT ON, WE WILL TRIUMPH. THIS DAY WILL BELONG TO US!"; -TXT_DLG_SCRIPT07_d15160_FIGHT = "FIGHT ON, WE WILL TRIUMPH. THIS DAY WILL BELONG TO US!"; -TXT_DLG_SCRIPT07_d16676_FIGHT = "FIGHT ON, WE WILL TRIUMPH. THIS DAY WILL BELONG TO US!"; - -TXT_DLG_SCRIPT08_d0_YOUKI = "YOU KILLED ALL THE GUARDS. DON'T HURT ME. I TOLD HIM THIS WAS A DUMB IDEA. THE REAL PROGRAMMER'S IN THE KEEP. HERE, TAKE THIS KEY."; -TXT_RPLY0_SCRIPT08_d0_YOURE = "YOU'RE THE PROGRAMMER!"; -TXT_DLG_SCRIPT08_d1516_DOILO = "DO I LOOK LIKE I WIELD ULTIMATE POWER? THE ORDER USES US ALL. NOW GO, I'M DEAD ALREADY."; -TXT_DLG_SCRIPT08_d3032_POWER = "POWER IS THE KEY!"; - -TXT_DLG_SCRIPT10_d0_GOODY = "GOOD, YOU'RE CONSCIOUS AGAIN. WHEN YOU GRABBED THAT ITEM THE PROGRAMMER DROPPED YOU LET LOOSE SOME TERRIBLE SECRETS."; -TXT_RPLY0_SCRIPT10_d0_WHATK = "WHAT KIND OF SECRETS. "; -TXT_DLG_SCRIPT10_d1516_WEHAV = "WE HAVE NO IDEA WHERE THIS WEAPON CAME FROM, BUT WE MUST FIND OUT. YOU HAVE WRESTED ONE FROM THE ORDER, BUT WE MUST HAVE ALL FIVE. WE HAVE REACHED THE LIMITS OF MY KNOWLEDGE. SEEK OUT THE ORACLE AND ASK IT FOR HELP."; -TXT_RPLY0_SCRIPT10_d1516_IMGON = "I'M GONNA NEED MORE SUPPLIES."; -TXT_DLG_SCRIPT10_d3032_HERES = "HERE'S SOME GOLD. GO VISIT THE MEDIC AND THE WEAPONS TRAINER AND THEN, MOVE OUT!"; -TXT_RPLY0_SCRIPT10_d3032_RIGHT = "RIGHT!"; -TXT_DLG_SCRIPT10_d4548_FIGHT = "FIGHT FOR THE FRONT AND FREEDOM. MOVE OUT."; -TXT_DLG_SCRIPT10_d6064_WHATP = "What prompts your return? Are you hurt? There's no time to lose, continue with your mission. Complete the SIGIL."; -TXT_RPLY0_SCRIPT10_d6064_THEOR = "The Oracle says YOU must die!"; + +TXT_ACS_map01_5_THEDO = "The door is locked"; +TXT_ACS_map02_9_GREET = "Greetings, mortal"; +TXT_ACS_map02_11_AREYO = "Are you ready to die?"; +TXT_ACS_map02_20_ADOOR = "A door opened on the Guardian of Ice"; +TXT_ACS_map03_12_THISP = "This path is barred"; +TXT_ACS_map04_9_ONEHA = "One half of the puzzle has been solved"; +TXT_ACS_map04_10_ONTHE = "on the Seven Portals"; +TXT_ACS_map04_11_ONETH = "One third of the puzzle has been solved"; +TXT_ACS_map04_12_STAIR = "Stairs have risen on the Seven Portals"; +TXT_ACS_map05_6_ONETH = "One third of the puzzle has been solved"; +TXT_ACS_map05_7_ONTHE = "On the Seven Portals"; +TXT_ACS_map05_8_STAIR = "Stairs have risen on the Seven Portals"; +TXT_ACS_map05_9_YOUHA = "You have to find another switch..."; +TXT_ACS_map05_10_STONE = "Stones grind on the Seven Portals"; +TXT_ACS_map08_6_ONESI = "One sixth of the puzzle has been solved"; +TXT_ACS_map08_7_ONTHE = "On the Shadow Wood"; +TXT_ACS_map08_10_THEDO = "The door is barred from the inside"; +TXT_ACS_map08_11_YOUHE = "You hear a door open in the distance"; +TXT_ACS_map09_6_ONESI = "One sixth of the puzzle has been solved"; +TXT_ACS_map09_7_ONTHE = "On the Shadow Wood"; +TXT_ACS_map10_6_ONESI = "One sixth of the puzzle has been solved"; +TXT_ACS_map10_7_ONTHE = "On the Shadow Wood"; +TXT_ACS_map11_0_ETTIN = " ettins left"; +TXT_ACS_map11_1_YOUWA = "You waited too long, now you die!"; +TXT_ACS_map11_7_ADOOR = "A door opened on the Forsaken Outpost"; +TXT_ACS_map12_9_THISD = "This door won't open yet"; +TXT_ACS_map13_11_MYSER = "My servants can smell your blood, human"; +TXT_ACS_map21_0_ADOOR = "A door opened in the Gibbet"; +TXT_ACS_map21_2_THEDO = "The door is barred from the inside"; +TXT_ACS_map22_3_APLAT = "A platform has lowered in the tower"; +TXT_ACS_map22_27_YOUHA = "You have played this game too long, mortal..."; +TXT_ACS_map22_29_ITHIN = "I think I shall remove you from the board"; +TXT_ACS_map23_10_YOUHE = "You hear a door open upstairs"; +TXT_ACS_map27_8_WORSH = "Worship me, and I may yet be merciful"; +TXT_ACS_map27_10_THENA = "Then again, maybe not"; +TXT_ACS_map28_6_ONENI = "One ninth of the puzzle has been solved"; +TXT_ACS_map28_7_ONTHE = "On the Monastery"; +TXT_ACS_map30_6_ONENI = "One ninth of the puzzle has been solved"; +TXT_ACS_map30_7_ONTHE = "On the Monastery"; +TXT_ACS_map34_1_ONENI = "One ninth of the puzzle has been solved"; +TXT_ACS_map34_2_ONTHE = "On the Monastery"; +TXT_ACS_map35_0_THEPO = "The portal has been sealed"; +TXT_ACS_map35_1_CHOOS = "Choose your fate"; +TXT_ACS_map35_3_THEDO = "The door is barred from the inside"; +TXT_ACS_map35_12_AREYO = "Are you strong enough"; +TXT_ACS_map35_14_TOFAC = "To face your own masters?"; + +// Deathkings texts + +TXT_ACS_map33_6_YOUDA = "You dare battle in the ready room?"; +TXT_ACS_map33_7_FORTH = "For that, you shall die!"; +TXT_ACS_map41_6_THEWA = "The waterfall is open"; +TXT_ACS_map41_7_THEWA = "The waterfall is blocked"; +TXT_ACS_map41_8_ADOOR = "A door has opened in the chapel"; +TXT_ACS_map42_4_NOWTH = "Now that's odd..."; +TXT_ACS_map44_1_THREE = "Three more parts of the puzzle remain"; +TXT_ACS_map44_2_TWOMO = "Two more parts of the puzzle remain"; +TXT_ACS_map44_3_ONEMO = "One more part of the puzzle remains"; +TXT_ACS_map44_4_THEPU = "The puzzle is complete"; +TXT_ACS_map44_6_YOUHA = "You have not completed the puzzle"; +TXT_ACS_map44_8_THEFL = "The floor is not safe!"; +TXT_ACS_map44_10_ONETH = "One third of the puzzle is solved"; +TXT_ACS_map44_11_TWOTH = "Two thirds of the puzzle is solved"; +TXT_ACS_map45_1_YOUHE = "You hear a platform moving in the distance"; +TXT_ACS_map46_0_ITISD = "It is done..."; +TXT_ACS_map46_1_YOUHA = "You have not completed the puzzle"; +TXT_ACS_map46_2_IMWAR = "I'm warning you..."; +TXT_ACS_map46_3_STUBB = "Stubborn, aren't you?"; +TXT_ACS_map46_4_ANDST = "And stupid, too"; +TXT_ACS_map46_8_ONEFO = "One fourth of this puzzle is complete"; +TXT_ACS_map46_9_BADCH = "Bad choice..."; +TXT_ACS_map47_2_THESY = "The symbols are not aligned"; +TXT_ACS_map48_2_THEDO = "The door won't open from this side"; +TXT_ACS_map50_1_THEDO = "The door is barred from the outside"; +TXT_ACS_map51_5_SACRI = "Sacrilege !"; +TXT_ACS_map51_6_YOUHA = "You have defiled eric's tomb !!"; +TXT_ACS_map51_7_ANDNO = "And now you die !!!"; +TXT_ACS_map51_8_ONETH = "One third of the puzzle is solved"; +TXT_ACS_map51_9_TWOTH = "Two thirds of the puzzle is solved"; +TXT_ACS_map51_10_THECR = "The crypt is open"; +TXT_ACS_map51_11_BEWAR = "Beware the spider's tomb"; +TXT_ACS_map51_13_YOUHE = "You hear a platform rise outside"; +TXT_ACS_map51_14_DOYOU = "Do you feel lucky?"; +TXT_ACS_map51_15_YOUGU = "You guessed wrong!"; +TXT_ACS_map51_16_GOODG = "Good guess"; +TXT_ACS_map51_17_CANYO = "Can you do all the scripting for my level?"; +TXT_ACS_map51_18_DONTT = "Don't touch my gloppy"; +TXT_ACS_map51_19_VORPA = "Vorpal ?!?!?!"; +TXT_ACS_map51_20_GIMME = "Gimme some sugar, baby"; +TXT_ACS_map51_21_DUHUH = "Duh-uhhh..."; +TXT_ACS_map51_22_FILMI = "Film in an hour?"; +TXT_ACS_map51_23_IDONT = "I don't even get my own tombstone - cf"; +TXT_ACS_map51_24_LETNO = "Let no blood be spilt"; +TXT_ACS_map51_25_LETNO = "Let no hand be raised in anger"; +TXT_ACS_map52_9_WHODA = "Who dares disturb our slumber?"; +TXT_ACS_map52_10_THEWA = "The way is open"; +TXT_ACS_map53_2_YOUHA = "You have "; +TXT_ACS_map53_3_SWITC = " switches left"; +TXT_ACS_map53_4_YOUHA = "You have only "; +TXT_ACS_map53_5_SWITC = " switch left"; +TXT_ACS_map53_6_THEEX = "The exit is open"; +TXT_ACS_map54_1_THEDO = "The doors won't open from this side"; +TXT_ACS_map54_4_THEDO = "The doors are open..."; +TXT_ACS_map54_5_IFYOU = "...If you are ready"; +TXT_ACS_map54_9_ADOOR = "A door has opened"; +TXT_ACS_map54_10_ONTHE = "On the Chantry"; +TXT_ACS_map54_11_ABRID = "A bridge has been built"; +TXT_ACS_map54_12_ONTHE = "On the Abattoir"; +TXT_ACS_map54_13_ASTAI = "A stair has been built"; +TXT_ACS_map54_14_ONTHE = "On the Dark Watch"; +TXT_ACS_map54_15_ONEGE = "One gear has been placed"; +TXT_ACS_map54_16_GEARS = " gears have been placed"; +TXT_ACS_map54_17_ABARR = "A barricade has opened"; +TXT_ACS_map54_18_ONTHE = "On the Cloaca"; +TXT_ACS_map54_20_THEWA = "The way back is open"; +TXT_ACS_map55_9_THEDO = "The door is barred from the inside"; +TXT_ACS_map56_0_YOUDA = "You dare plunder the tomb"; +TXT_ACS_map56_1_OFTHE = "of the executioner?"; +TXT_ACS_map56_2_PREPA = "Prepare to die"; +TXT_ACS_map59_1_YOUHA = "You have "; +TXT_ACS_map59_2_MORES = " more switches to find"; +TXT_ACS_map59_3_YOUHA = "You have only "; +TXT_ACS_map59_4_SWITC = " switch left"; +TXT_ACS_map59_5_THEWA = "The way to the tower is open"; +TXT_ACS_map60_3_THEWA = "The way is open"; + +// All content from Strife's IWAD dialogues + +TXT_DLG_SCRIPT01_d0_IDONT = "I don't want any trouble, stay away from me. I've had enough trouble with what that bastard Harris did to me. He promised me money, instead I get to look forward to being "Questioned" by the Programmer."; + +TXT_DLG_SCRIPT02_d0_ILLHE = "I'll help you if you help me. Five pieces of gold and I'll tell all I know."; +TXT_RPLY0_SCRIPT02_d0_HERES = "Here's the gold."; +TXT_RYES0_SCRIPT02_d0_BESTE = "Be stealthy when you kill, you won't set off alarms."; +TXT_RNO0_SCRIPT02_d0_WELLI = "Well, I won't be telling you anything for free!"; +TXT_DLG_SCRIPT02_d1516_HAVEY = "Have you by any chance got another 5 gold on you?"; +TXT_RPLY0_SCRIPT02_d1516_5GOLD = "5 gold."; +TXT_RYES0_SCRIPT02_d1516_WELLP = "Well, poison bolts can kill the guards instantly and won't set off the alarms."; +TXT_RNO0_SCRIPT02_d1516_NOSIR = "No sir, I won't be telling you anything for free!"; +TXT_DLG_SCRIPT02_d3032_YOUVE = "You've wrung the last bit of gossip out of me already!"; +TXT_DLG_SCRIPT02_d4548_WHATC = "What can I get for you?"; +TXT_RPLY0_SCRIPT02_d4548_ASSAU = "Assault gun"; +TXT_RYES0_SCRIPT02_d4548_HEREY = "Here you go."; +TXT_RNO0_SCRIPT02_d4548_YOUCA = "You can't afford that right now."; +TXT_RPLY1_SCRIPT02_d4548_CLIPO = "Clip of bullets"; +TXT_RYES1_SCRIPT02_d4548_THANK = "Thanks."; +TXT_RNO1_SCRIPT02_d4548_COMEO = "Come on, 10 gold."; +TXT_RPLY2_SCRIPT02_d4548_AMMOB = "Ammo box"; +TXT_RYES2_SCRIPT02_d4548_HERES = "Here's your ammo."; +TXT_RNO2_SCRIPT02_d4548_MAYBE = "Maybe some other time."; +TXT_DLG_SCRIPT02_d6064_GOODN = "Good news from the front for a change. Macil sent you for a reward and training. He's instructed me to give them to you."; +TXT_RPLY0_SCRIPT02_d6064_THANK = "Thanks."; +TXT_RYES0_SCRIPT02_d6064_GLADT = "Glad to be of service."; +TXT_DLG_SCRIPT02_d7580_ALLRI = "All right, here's a few pointers on what to do: don't get in the way of crusaders: firing short bursts from your assault gun keeps it on target."; +TXT_RPLY0_SCRIPT02_d7580_ISTHA = "Is that it?"; +TXT_RYES0_SCRIPT02_d7580_LOOKY = "Look, you'll learn more later."; +TXT_DLG_SCRIPT02_d9096_ITHIN = "I think I can convert a flamethrower from one of the crusaders for use by a human. Oh, anything else I can get you?"; +TXT_RPLY0_SCRIPT02_d9096_FLAME = "Flamethrower."; +TXT_RYES0_SCRIPT02_d9096_IKNEW = "I knew that'd work! Here you go, take her for a spin!"; +TXT_RNO0_SCRIPT02_d9096_LISTE = "Listen, I can't make anything without the right parts!"; +TXT_RPLY1_SCRIPT02_d9096_ASSAU = "Assault gun"; +TXT_RYES1_SCRIPT02_d9096_WELLH = "Well, here you go sir!"; +TXT_RNO1_SCRIPT02_d9096_OBVIO = "Obviously, you can't afford that right now."; +TXT_RPLY2_SCRIPT02_d9096_CLIPO = "Clip of bullets"; +TXT_RYES2_SCRIPT02_d9096_THANK = "Thanks."; +TXT_RNO2_SCRIPT02_d9096_COMEO = "Come on, 10 gold."; +TXT_RPLY3_SCRIPT02_d9096_AMMOB = "Ammo box"; +TXT_RYES3_SCRIPT02_d9096_HERES = "Here's your ammo."; +TXT_RNO3_SCRIPT02_d9096_MAYBE = "Maybe some other time. Goodbye!"; +TXT_DLG_SCRIPT02_d10612_NOWTH = "Now that you have the flamethrower, is there anything else I can get you?"; +TXT_RPLY0_SCRIPT02_d10612_ASSAU = "Assault gun"; +TXT_RYES0_SCRIPT02_d10612_HEREY = "Here you go."; +TXT_RNO0_SCRIPT02_d10612_YOUCA = "You can't afford that right now."; +TXT_RPLY1_SCRIPT02_d10612_CLIPO = "Clip of bullets"; +TXT_RYES1_SCRIPT02_d10612_THANK = "Thanks."; +TXT_RNO1_SCRIPT02_d10612_COMEO = "Come on, 10 gold."; +TXT_RPLY2_SCRIPT02_d10612_AMMOB = "Ammo box"; +TXT_RYES2_SCRIPT02_d10612_HERES = "Here's your ammo."; +TXT_RNO2_SCRIPT02_d10612_MAYBE = "Maybe some other time."; +TXT_DLG_SCRIPT02_d12128_NOWTH = "Now that you have the flamethrower, is there anything else I can get you?"; +TXT_RPLY0_SCRIPT02_d12128_CLIPO = "Clip of bullets"; +TXT_RYES0_SCRIPT02_d12128_THANK = "Thanks."; +TXT_RNO0_SCRIPT02_d12128_COMEO = "Come on, 10 gold."; +TXT_RPLY1_SCRIPT02_d12128_AMMOB = "Ammo box"; +TXT_RYES1_SCRIPT02_d12128_HERES = "Here's your ammo."; +TXT_RNO1_SCRIPT02_d12128_MAYBE = "Maybe some other time."; +TXT_RPLY2_SCRIPT02_d12128_PHOSP = "Phosphor grenades"; +TXT_RYES2_SCRIPT02_d12128_THANK = "Thanks."; +TXT_RNO2_SCRIPT02_d12128_YOUDO = "You don't have enough"; +TXT_RPLY3_SCRIPT02_d12128_POISO = "Poison bolts"; +TXT_RYES3_SCRIPT02_d12128_WORTH = "Worth every gold!"; +TXT_RNO3_SCRIPT02_d12128_COMEO = "Come on, 200 gold!"; +TXT_DLG_SCRIPT02_d13644_ICANT = "I can't believe that I got stuck with this duty. They say that something evil came up out of this sewer gate... Now I get to stand here until it comes up again!"; +TXT_RPLY0_SCRIPT02_d13644_WHATG = "What gate?"; +TXT_RYES0_SCRIPT02_d13644_THESE = "The sewer overflow gate."; +TXT_DLG_SCRIPT02_d15160_HELLO = "Hello friend. What can I get for you?"; +TXT_RPLY0_SCRIPT02_d15160_ELECT = "Electric bolts"; +TXT_RYES0_SCRIPT02_d15160_YOUGO = "You got the electric bolts."; +TXT_RPLY1_SCRIPT02_d15160_AMMOS = "Ammo satchel"; +TXT_RNO0_SCRIPT02_d15160_NOYOU = "No. You don't have what I want for the electric bolts!"; +TXT_RNO0_SCRIPT02_d16676_NOYOU = "No. You don't have what I want for the electric bolts!"; +TXT_RYES1_SCRIPT02_d15160_THANK = "Thank you. Anything else?"; +TXT_RNO1_SCRIPT02_d15160_YOUCA = "You can't afford that, good day."; +TXT_DLG_SCRIPT02_d16676_WHATC = "What can I get for you?"; +TXT_RPLY0_SCRIPT02_d16676_ELECT = "Electric bolts"; +TXT_RYES0_SCRIPT02_d16676_YOUGO = "You got the electric bolts."; +TXT_RPLY1_SCRIPT02_d16676_AMMOS = "Ammo satchel"; +TXT_RYES1_SCRIPT02_d16676_THANK = "Thank you, anything else?"; +TXT_RNO1_SCRIPT02_d16676_YOUCA = "You can't afford that, good day to you!"; +TXT_DLG_SCRIPT02_d18192_WELCO = "Welcome. What may I show you?"; +TXT_RPLY0_SCRIPT02_d18192_ENVIR = "Environmental suit"; +TXT_RYES0_SCRIPT02_d18192_WELLH = "Well, here you are."; +TXT_RNO0_SCRIPT02_d18192_IMSOR = "I'm sorry but you don't have enough money for that."; +TXT_RPLY1_SCRIPT02_d18192_LEATH = "Leather armor"; +TXT_RYES1_SCRIPT02_d18192_HEREY = "Here you are."; +TXT_RNO1_SCRIPT02_d18192_PERHA = "Perhaps some other time?"; +TXT_RPLY2_SCRIPT02_d18192_METAL = "Metal armor"; +TXT_RYES2_SCRIPT02_d18192_WEARI = "Wear it in good health."; +TXT_RNO2_SCRIPT02_d18192_COMEB = "Come back when you can afford to buy something you lout!"; +TXT_DLG_SCRIPT02_d19708_WELCO = "Welcome. What may I show you?"; +TXT_RPLY0_SCRIPT02_d19708_ENVIR = "Environmental suit"; +TXT_RYES0_SCRIPT02_d19708_WELLH = "Well, here you are."; +TXT_RNO0_SCRIPT02_d19708_IMSOR = "I'm sorry but you don't have enough money for that."; +TXT_RPLY1_SCRIPT02_d19708_LEATH = "Leather armor"; +TXT_RYES1_SCRIPT02_d19708_HEREY = "Here you are."; +TXT_RNO1_SCRIPT02_d19708_PERHA = "Perhaps some other time?"; +TXT_RPLY2_SCRIPT02_d19708_METAL = "Metal armor"; +TXT_RYES2_SCRIPT02_d19708_WEARI = "Wear it in good health."; +TXT_RNO2_SCRIPT02_d19708_COMEB = "Come back when you can afford to buy something you lout!"; +TXT_DLG_SCRIPT02_d21224_HOWMA = "How may I assist you?"; +TXT_RPLY0_SCRIPT02_d21224_MEDPA = "Med patch"; +TXT_RYES0_SCRIPT02_d21224_HERES = "Here's your patch."; +TXT_RNO0_SCRIPT02_d21224_YOUNE = "You need 10 gold for that."; +TXT_RPLY1_SCRIPT02_d21224_MEDIC = "Medical kit"; +TXT_RYES1_SCRIPT02_d21224_THANK = "Thank you."; +TXT_RNO1_SCRIPT02_d21224_IWISH = "I wish I could give them away, but they cost 25 gold."; +TXT_RPLY2_SCRIPT02_d21224_FIELD = "Field surgery kit"; +TXT_RYES2_SCRIPT02_d21224_THERE = "There you go. Take care now."; +TXT_RNO2_SCRIPT02_d21224_WELLM = "Well, maybe you can afford some med patches?"; +TXT_DLG_SCRIPT02_d22740_IHOPE = "I hope Macil knows what he's doing. If the order finds out I'm helping the front I'm as good as dead... Not that this matters to you any. The front's medic gave me an upgrade chip for you, are you ready? "; +TXT_RPLY0_SCRIPT02_d22740_YESIM = "Yes, I'm ready."; +TXT_RYES0_SCRIPT02_d22740_WELLT = "Well then, this won't take but a second. There, done already."; +TXT_DLG_SCRIPT02_d24256_HOWMA = "How may I assist you?"; +TXT_RPLY0_SCRIPT02_d24256_MEDPA = "Med patch"; +TXT_RYES0_SCRIPT02_d24256_HERES = "Here's your patch."; +TXT_RNO0_SCRIPT02_d24256_YOUNE = "You need 10 gold for that."; +TXT_RPLY1_SCRIPT02_d24256_MEDIC = "Medical kit"; +TXT_RYES1_SCRIPT02_d24256_THANK = "Thank you."; +TXT_RNO1_SCRIPT02_d24256_IWISH = "I wish I could give them away, but they cost 25 gold."; +TXT_RPLY2_SCRIPT02_d24256_FIELD = "Field surgery kit"; +TXT_RYES2_SCRIPT02_d24256_THERE = "There you go. Take care now."; +TXT_RNO2_SCRIPT02_d24256_WELLM = "Well, maybe you can afford some med patches?"; +TXT_DLG_SCRIPT02_d25772_HELLO = "Hello stranger, I haven't seen you around here before. Let me give you a piece of free advice. I'd be careful if I were you. The order does not tolerate free will, and their justice is swift."; +TXT_RPLY0_SCRIPT02_d25772_WHATS = "What's the word?"; +TXT_RYES0_SCRIPT02_d25772_THEWO = "The word is... The sewers hold more than just rats and robots."; +TXT_DLG_SCRIPT02_d27288_WHATC = "What can I do for you now?"; +TXT_RPLY0_SCRIPT02_d27288_MOREI = "More info."; +TXT_RYES0_SCRIPT02_d27288_THEGO = "The governor is a simple reminder to us that we aren't free people anymore."; +TXT_RNO0_SCRIPT02_d27288_COMEB = "Come back when you get some gold."; +TXT_DLG_SCRIPT02_d28804_WELLY = "Well, you're asking a lot of questions for someone who's not trying to die. Make sure you don't go and get yourself killed, or worse."; +TXT_RPLY0_SCRIPT02_d28804_MOREI = "More info."; +TXT_RYES0_SCRIPT02_d28804_THERE = "There's more to the order than meets the eye."; +TXT_RNO0_SCRIPT02_d28804_WELLT = "We'll talk when you get gold!"; +TXT_DLG_SCRIPT02_d30320_THATS = "That's it friend, the well of knowledge has run dry. I've told you more than I should have anyway. Good luck... And don't come back."; +TXT_DLG_SCRIPT02_d31836_HEYIM = "Hey, I'm only here in case of an emergency. If the core breaches, then I make sure no one gets in... Or out."; +TXT_DLG_SCRIPT02_d33352_WATCH = "Watch your step, peasant!"; +TXT_DLG_SCRIPT02_d34868_WEREG = "We're going to kill you! "; +TXT_DLG_SCRIPT02_d36384_WHOIN = "Who in the blazes are you? No one's supposed to be loitering about in this area!"; +TXT_DLG_SCRIPT02_d37900_YOUTH = "You there, nobody's allowed in here. Move along!"; +TXT_DLG_SCRIPT02_d39416_IRALE = "Irale will set you right up!"; +TXT_DLG_SCRIPT02_d40932_IMKIN = "I'm kinda a talent broker for the rebels. A guy who's as good as you could make a lot of gold... If you hooked up with the right people."; +TXT_RPLY0_SCRIPT02_d40932_IMINT = "I'm interested."; +TXT_RPLY1_SCRIPT02_d40932_SCREW = "Screw the rebels!"; +TXT_DLG_SCRIPT02_d42448_NONOS = "No, no second chance. Oh guards, kill him."; +TXT_DLG_SCRIPT02_d43964_GOODC = "Good choice. The order's sanctuary by the river is their unofficial torture chamber. Hidden inside there's a golden chalice. You swipe it and reap your reward."; +TXT_RPLY0_SCRIPT02_d43964_HOWAM = "How am I supposed to do that?"; +TXT_DLG_SCRIPT02_d45480_HERES = "Here's a crossbow, just aim straight and --splat--. Remember, grab the fancy cup and get to the tavern."; +TXT_RPLY0_SCRIPT02_d45480_COOLI = "Cool. I'll get it."; +TXT_DLG_SCRIPT02_d46996_WHATA = "What are you waiting for? Bring me that chalice."; +TXT_DLG_SCRIPT02_d48512_HEYIK = "Hey, I know, kinda looks like a set-up. I would never do that to such a great killing machine. Got the item? Great! Now get ready, gold and glory just like I promised. Take this key and the governor will reward you."; +TXT_RPLY0_SCRIPT02_d48512_HEDBE = "He'd better. For your sake!"; +TXT_RPLY1_SCRIPT02_d48512_WHATW = "What! Where's my money?"; +TXT_DLG_SCRIPT02_d50028_GETLO = "Get lost kid, you bother me."; +TXT_DLG_SCRIPT02_d51544_NOSEC = "No second chance. Oh guards, kill him."; +TXT_DLG_SCRIPT02_d53060_FIRST = "First they slaughter thousands, now they want all able-bodied peasants for unspecified 'Tests'. How does the order expect me to keep the peace? What the hell do you want?"; +TXT_RPLY0_SCRIPT02_d53060_APRIS = "A prison pass, let's deal."; +TXT_DLG_SCRIPT02_d54576_ILIKE = "I like you already. I have two chores that I don't want to do myself. One is messy, the other bloody."; +TXT_RPLY0_SCRIPT02_d54576_CALLM = "Call me the cleaner"; +TXT_RPLY1_SCRIPT02_d54576_IMNOT = "I'm not squeamish"; +TXT_DLG_SCRIPT02_d56092_ONEOF = "One of my minions is stealing power with a tap on the mains somewhere. Find it and truncate his supply and I'll provide you with what you want. Bring me something as a token."; +TXT_RPLY0_SCRIPT02_d56092_WHERE = "Where do I find this tap?"; +TXT_DLG_SCRIPT02_d57608_IFIKN = "If I knew, it wouldn't be a chore now would it? Use your charm, but shut off his supply."; +TXT_DLG_SCRIPT02_d59124_TELLY = "Tell you what, there's a lying sack named Derwin who has been selling children to the order. I won't tolerate that kind of depravity. Not without my cut. Derwin works in the warehouse. Kill him and bring me his, ear, and I'll see what I can do."; +TXT_RPLY0_SCRIPT02_d59124_HOWDO = "How do I get in?"; +TXT_DLG_SCRIPT02_d60640_THISK = "This key will get you into the power station. On second thought, cut off the ear and then kill him. Much better."; +TXT_DLG_SCRIPT02_d62156_OHIJU = "Oh, I just love souvenirs. Here, this will get you into the prison. Talk to Warden Montag. Whatever you do after that, I don't want to know."; +TXT_RPLY0_SCRIPT02_d62156_THANK = "Thanks."; +TXT_DLG_SCRIPT02_d63672_GIVEY = "Give you a hint. When I stop talking to you, you leave."; +TXT_DLG_SCRIPT02_d65188_DOYOU = "Do you have good news for me? I'm all ears."; +TXT_RPLY0_SCRIPT02_d65188_THEDE = "The deed is done!"; +TXT_DLG_SCRIPT02_d66704_OHIJU = "Oh, I just love souvenirs. Here, this will get you into the prison. Talk to Warden Montag. Whatever you do after that, I don't want to know."; +TXT_RPLY0_SCRIPT02_d66704_FINEB = "Fine by me."; +TXT_DLG_SCRIPT02_d68220_SOYOU = "So you're the fool who stole the chalice? I'm going to have you arrested as a rebel thief... Thereby enhancing my position with the order. How does it feel to be an unwitting pawn? I'll give you a hint, it's gonna' hurt. "; +TXT_RPLY0_SCRIPT02_d68220_ITSUC = "It sucks!"; +TXT_RYES0_SCRIPT02_d68220_FORYO = "For you it does."; +TXT_RPLY1_SCRIPT02_d68220_HARRI = "Harris promised me money!"; +TXT_RYES1_SCRIPT02_d68220_TOOBA = "Too bad. The only thing you're getting is dead!"; +TXT_DLG_SCRIPT02_d69736_INASM = "In a small world, word travels fast. I hear you just removed some obstacles from your path. Nice work. Are you interested in some more lucrative projects?"; +TXT_RPLY0_SCRIPT02_d69736_SUREW = "Sure, why not."; +TXT_RPLY1_SCRIPT02_d69736_NOTHA = "No thanks."; +TXT_RYES1_SCRIPT02_d69736_THENG = "Then get lost!"; +TXT_DLG_SCRIPT02_d71252_FOOLG = "Fool! Guards, rid me of this meddlesome peon."; +TXT_DLG_SCRIPT02_d72768_GOODS = "Good. Some uh, friends of mine need someone silenced. Beldin is being held by the order in their sanctuary. There's a rarely used entrance by a small pier off the river which is unguarded. Get in, shut him up, and bring his ring back to me as proof."; +TXT_RPLY0_SCRIPT02_d72768_WILLI = "Will it be worth the effort?"; +TXT_DLG_SCRIPT02_d74284_ILLGU = "I'll guarantee 50 gold and if you return without setting off every alarm in town, there's the chance to earn much, much more, and here's a little helper that should give you an edge."; +TXT_RPLY0_SCRIPT02_d74284_THANK = "Thanks, I'll need it."; +TXT_DLG_SCRIPT02_d75800_GOODR = "Good. Remember, his silence is golden."; +TXT_RPLY0_SCRIPT02_d75800_ILLGE = "I'll get him."; +TXT_DLG_SCRIPT02_d77316_MISSI = "Mission accomplished? You have the ring of the traitor?"; +TXT_RPLY0_SCRIPT02_d77316_HESDE = "He's dead, where's my money?"; +TXT_RNO0_SCRIPT02_d77316_LIARG = "Liar! Go get the ring!"; +TXT_DLG_SCRIPT02_d78832_HEREY = "Here, you earned it. The traitor you killed was about to reveal the location of the front. You saved lives. How would you like to earn more gold, and a future free from tyranny?"; +TXT_RPLY0_SCRIPT02_d78832_TELLM = "Tell me more."; +TXT_RPLY1_SCRIPT02_d78832_NOTMY = "Not my style."; +TXT_DLG_SCRIPT02_d80348_IHAVE = "I have a business relationship with the front's leader, Macil. I know he needs an incisive fellow like yourself, and he pays well. Take this recovered com unit and you'll be led to, shall we say, opportunities."; +TXT_RPLY0_SCRIPT02_d80348_THANK = "Thanks."; +TXT_DLG_SCRIPT02_d81864_GETGO = "Get going. If you hang around here, we're both dead."; +TXT_DLG_SCRIPT02_d83380_APITY = "A pity, but now that you know about my friends, I must kill you. Guards, take out this trash!"; +TXT_DLG_SCRIPT02_d84896_FOOLG = "Fool. Guards! Rid me of meddlesome peon."; +TXT_DLG_SCRIPT02_d86412_WALKA = "Walk away, boy, just walk away."; +TXT_DLG_SCRIPT02_d87928_WHATA = "What are you doing here?"; +TXT_RPLY0_SCRIPT02_d87928_HEYIN = "Hey, I need gold!"; +TXT_DLG_SCRIPT02_d89444_BLACK = "Blackbird told you the code, huh? Let me shut off the alarm. Macil is one flight down."; +TXT_RPLY0_SCRIPT02_d89444_THANK = "Thanks."; +TXT_DLG_SCRIPT02_d90960_WALKA = "Walk away, boy, just walk away."; +TXT_DLG_SCRIPT02_d92476_DOYOU = "Do you have an appointment with the governor? "; +TXT_RPLY0_SCRIPT02_d92476_OFCOU = "Of course!"; +TXT_RPLY1_SCRIPT02_d92476_NOAND = "No, and I don't need one!"; +TXT_DLG_SCRIPT02_d93992_SORRY = "Sorry! I didn't mean... Please go right up."; +TXT_RPLY0_SCRIPT02_d93992_IKNEW = "I knew you'd say that."; +TXT_DLG_SCRIPT02_d95508_IFYOU = "If you're in such a hurry, don't waste your time with me."; +TXT_DLG_SCRIPT02_d97024_RELEA = "Release me, leave an old man alone."; +TXT_DLG_SCRIPT02_d98540_YOUSE = "You seek wisdom, my son? The order has seen to it that we only ask one question, 'Why?'"; +TXT_RPLY0_SCRIPT02_d98540_WHERE = "Where's the power coupling?"; +TXT_RPLY1_SCRIPT02_d98540_WHERE = "Where's the order's main?"; +TXT_RPLY2_SCRIPT02_d98540_WHERE = "Where's the illegal tap?"; +TXT_DLG_SCRIPT02_d100056_ILLTE = "I'll tell you where it is, but I don't know whose coupling you'll be tampering with. It's right here in the sewage plant."; +TXT_RPLY0_SCRIPT02_d100056_THANK = "Thanks"; +TXT_DLG_SCRIPT02_d101572_THATS = "That's right here in the sewage plant. But it's the front's coupling. Whoever told you that it was the order's was wrong."; +TXT_RPLY0_SCRIPT02_d101572_THANK = "Thanks"; +TXT_DLG_SCRIPT02_d103088_IFYOU = "If you say it's illegal I want nothing to do with you. I have enough trouble as it is."; +TXT_RPLY0_SCRIPT02_d103088_THANK = "Thanks"; +TXT_DLG_SCRIPT02_d104604_RELEA = "Release me, leave an old man alone."; + +TXT_DLG_SCRIPT03_d0_WELCO = "Welcome to the last flicker of hope. Only we have the free will to oppose the order. We have the sharpest scientific minds, and many able bodies, but we lack that one real, uh... "Problem solver", who will give us the edge we need. Help us."; +TXT_RPLY0_SCRIPT03_d0_ALLRI = "All right, I accept."; +TXT_RPLY1_SCRIPT03_d0_NOTHA = "No thanks!"; +TXT_DLG_SCRIPT03_d1516_YOUMI = "You might want to reconsider, seeing that you're surrounded by heavily armed angry rebels."; +TXT_RPLY0_SCRIPT03_d1516_ALLRI = "All right, I'm in!"; +TXT_RPLY1_SCRIPT03_d1516_NOTHA = "No thanks."; +TXT_DLG_SCRIPT03_d3032_THEND = "Then die in shame and dishonor."; +TXT_DLG_SCRIPT03_d4548_GOODB = "Good, Blackbird will continue to be your guide. She's taken quite a shine to you. Together you've got to unlock the secrets of the order and their inhuman servants. Get inside and take them down."; +TXT_RPLY0_SCRIPT03_d4548_WHERE = "Where do I start?"; +TXT_DLG_SCRIPT03_d6064_FRANK = "Frankly the situation is a mess. You must accomplish several missions to prepare the way for more attacks on the order. Our last raid was a disaster and most of our troops were captured. I need you to free these prisoners."; +TXT_RPLY0_SCRIPT03_d6064_ITHIN = "I think I can handle it."; +TXT_DLG_SCRIPT03_d7580_TAKET = "Take this money and visit Irale who supplies our weapons. Then, this key will get you in to see the governor. He's a corrupt puppet of the order, but he loves to make deals. Do whatever you need to free our brothers in arms."; +TXT_RPLY0_SCRIPT03_d7580_ILLSE = "I'll see to it."; +TXT_DLG_SCRIPT03_d9096_FIGHT = "Fight for the front and freedom. Move out."; +TXT_DLG_SCRIPT03_d10612_THEPR = "The prisoners have been welcomed back, thanks to you. Here's some gold, go visit the medic and the weapons trainer and then, I have higher goals for you."; +TXT_RPLY0_SCRIPT03_d10612_IWILL = "I will. What's next?"; +TXT_DLG_SCRIPT03_d12128_ASING = "A single crystal runs the power grid which drives the order's shields. Destroy that crystal and you will punch huge holes in the order's defenses. Blackbird will lead you to a spy who has a way in, good luck."; +TXT_RPLY0_SCRIPT03_d12128_WELLG = "We'll get it."; +TXT_DLG_SCRIPT03_d13644_FIGHT = "Fight for the front and freedom. Move out."; +TXT_DLG_SCRIPT03_d15160_YOUVE = "You've exceeded all of our expectations. Because of your daring our troops are on the move. I want you two to join the assault, with a specific target. Take out the Programmer. It's time to reveal what we've found out about this layer of the order."; +TXT_RPLY0_SCRIPT03_d15160_TELLM = "Tell me what we know."; +TXT_DLG_SCRIPT03_d16676_THEPR = "The Programmer's lair is in the castle. Now, see the medic, grab some ammo and go get him."; +TXT_RPLY0_SCRIPT03_d16676_LETME = "Let me at 'em!"; +TXT_DLG_SCRIPT03_d18192_FIGHT = "Fight for the front and freedom. Move out."; +TXT_DLG_SCRIPT03_d19708_REMEM = "Remember what the town hall looked like? That's a gentle reminder of what they're willing to do to get at us. Be careful."; +TXT_DLG_SCRIPT03_d21224_TALKT = "Talk to Macil. He'll be able to help you."; +TXT_DLG_SCRIPT03_d22740_IVEHE = "I've heard that Macil's got a plan to subvert the order. It had better be good. One more failure and we're all just dead meat."; +TXT_DLG_SCRIPT03_d24256_AFEWO = "A few of these barrels dumped into their water supply should even the odds a little."; +TXT_DLG_SCRIPT03_d25772_SOYOU = "So you're the new operative? Thanks, without you, we'd all be dead right now."; +TXT_DLG_SCRIPT03_d27288_IMWOR = "I'm working on something that will give us an edge. It will increase your stamina and completely jack you up. I've almost got all the bugs worked out. Can I do something for you?"; +TXT_RPLY0_SCRIPT03_d27288_PATCH = "Patch me up."; +TXT_RYES0_SCRIPT03_d27288_BOYYO = "Boy, you're a real mess. I'll see what I can do."; +TXT_RPLY1_SCRIPT03_d27288_STAMI = "Stamina implant?"; +TXT_RYES1_SCRIPT03_d27288_ALLRI = "All right, this won't take but a moment."; +TXT_RNO1_SCRIPT03_d27288_ITSNO = "It's not done yet."; +TXT_DLG_SCRIPT03_d28804_HEYIM = "Hey, I'm working on an updated version of your implant. Is there anything else I can do?"; +TXT_RPLY0_SCRIPT03_d28804_PATCH = "Patch me up."; +TXT_RYES0_SCRIPT03_d28804_WELLA = "Well at least your seeing action."; +TXT_RPLY1_SCRIPT03_d28804_IMPLA = "Implant upgrade?"; +TXT_RYES1_SCRIPT03_d28804_GOODT = "Good thing, never can be too safe."; +TXT_RNO1_SCRIPT03_d28804_IMALM = "I'm almost finished, but not quite."; +TXT_DLG_SCRIPT03_d30320_ALLRI = "All right, I've almost got everything working perfectly. There were a few problems left to get rid of. Do you need anything else? "; +TXT_RPLY0_SCRIPT03_d30320_PATCH = "Patch me up."; +TXT_RYES0_SCRIPT03_d30320_WHATH = "What have you been trying to do? Go head to head with a crusader?"; +TXT_RPLY1_SCRIPT03_d30320_IMPLA = "Implant upgrade?."; +TXT_RYES1_SCRIPT03_d30320_THATS = "That should do it for you."; +TXT_RNO1_SCRIPT03_d30320_LETME = "Let me run some more tests first."; +TXT_DLG_SCRIPT03_d31836_THATS = "That's all I can do on the implant right now. Maybe some healing?"; +TXT_RPLY0_SCRIPT03_d31836_YEAH = "Yeah."; +TXT_RYES0_SCRIPT03_d31836_BOYYO = "Boy, you're a real mess. I'll see what I can do."; +TXT_DLG_SCRIPT03_d33352_WHATC = "What can I do for you?"; +TXT_RPLY0_SCRIPT03_d33352_IMOUT = "I'm out of bullets."; +TXT_RYES0_SCRIPT03_d33352_HERES = "Here's some ammo for you. Don't waste it."; +TXT_RPLY1_SCRIPT03_d33352_TEACH = "Teach me."; +TXT_RYES1_SCRIPT03_d33352_ALLRI = "All right, I'll just show you a few little pointers."; +TXT_RNO1_SCRIPT03_d33352_YOURE = "You're not ready yet."; +TXT_DLG_SCRIPT03_d34868_BACKA = "Back again? What do you need?"; +TXT_RPLY0_SCRIPT03_d34868_IMOUT = "I'm out of bullets."; +TXT_RYES0_SCRIPT03_d34868_HERES = "Here's some ammo for you. Don't waste it."; +TXT_RNO0_SCRIPT03_d34868_YOUVE = "You've got enough ammo."; +TXT_RPLY1_SCRIPT03_d34868_TEACH = "Teach me."; +TXT_RYES1_SCRIPT03_d34868_ALLRI = "All right, this should keep you going for a while."; +TXT_RNO1_SCRIPT03_d34868_SORRY = "Sorry, can't. I'm just following Macil's orders."; +TXT_DLG_SCRIPT03_d36384_WELLW = "Well which is it, bullets or training? I can't wait to get my hands on those new weapons we captured. A little bit of training and then a lot of revenge."; +TXT_RPLY0_SCRIPT03_d36384_IMOUT = "I'm out of ammo."; +TXT_RYES0_SCRIPT03_d36384_HERES = "Here's some ammo for you. Don't waste it."; +TXT_RNO0_SCRIPT03_d36384_YOUVE = "You've got enough ammo."; +TXT_RPLY1_SCRIPT03_d36384_TEACH = "Teach me."; +TXT_RYES1_SCRIPT03_d36384_OKTAK = "O.K. Take what you've learned here and show those order clods the way to hell."; +TXT_RNO1_SCRIPT03_d36384_COMEB = "Come back later, when Macil says it's time."; +TXT_DLG_SCRIPT03_d37900_IVETA = "I've taught you everything I can right now. Give me some time to put the new weapons through their paces. That is unless you're out of bullets."; +TXT_RPLY0_SCRIPT03_d37900_YESIA = "Yes I am."; +TXT_RYES0_SCRIPT03_d37900_HEREY = "Here you go."; +TXT_DLG_SCRIPT03_d39416_DONTG = "Don't get trigger happy in the town. You'll set off the alarm and they'll start sending in guards from the castle. "; +TXT_DLG_SCRIPT03_d40932_WELCO = "Welcome, we can always use more help."; +TXT_DLG_SCRIPT03_d42448_WHENI = "When I was still in action we had the chance to examine an acolyte before the reinforcements arrived. Listen, they're not human."; +TXT_DLG_SCRIPT03_d43964_WERET = "We're trying to find where the castle gate mechanisms are, but so far we've had no luck."; +TXT_DLG_SCRIPT03_d45480_DONTG = "Don't get caught. I've heard horror stories about what they do to our people after they're imprisoned. They just disappear... Without a trace."; +TXT_DLG_SCRIPT03_d46996_HERES = "Here's some advice, if you ever see any of the order's "Tin soldiers" go in the other direction. They're fast and brutal."; +TXT_DLG_SCRIPT03_d48512_LEAVE = "Leave me be. I'm doing something for Macil."; + +TXT_DLG_SCRIPT04_d0_SORRY = "Sorry, no. You do not have clearance."; +TXT_DLG_SCRIPT04_d1516_STOPS = "Stop! Show me your id badge."; +TXT_RPLY0_SCRIPT04_d1516_HERES = "Here's my I.D."; +TXT_DLG_SCRIPT04_d3032_OHOKS = "Oh, ok. Sure go ahead. Have a nice day."; +TXT_DLG_SCRIPT04_d4548_DERWI = "Derwin? Yeah, he's down in the warehouse, but you're not getting in unless you're cleared."; +TXT_RPLY0_SCRIPT04_d4548_IVEGO = "I've got clearance."; +TXT_DLG_SCRIPT04_d6064_GOON = "Go on."; +TXT_RPLY0_SCRIPT04_d6064_DOYOU = "Do you know where he is?"; +TXT_DLG_SCRIPT04_d7580_IDONT = "I don't know where anybody is. I just keep the lid on the rat trap."; +TXT_DLG_SCRIPT04_d9096_YOUAR = "You are an unpleasant distraction."; +TXT_DLG_SCRIPT04_d10612_MOVEA = "Move along or taste metal."; +TXT_DLG_SCRIPT04_d12128_PASSY = "Pass your id through here for access."; +TXT_DLG_SCRIPT04_d13644_GETBA = "Get back to work, now!"; +TXT_DLG_SCRIPT04_d15160_GETBA = "Get back to work, now!"; +TXT_DLG_SCRIPT04_d16676_WEVEB = "We've been running around the clock for weeks with no down time. I'd say that the order is planning a suppression raid on the front."; +TXT_DLG_SCRIPT04_d18192_OHDAM = "Oh, damn. The governor sent you. I was going to give him his cut, really I was. Ok, listen. I've got a bundle stashed. It's yours if you look the other way."; +TXT_RPLY0_SCRIPT04_d18192_ALLRI = "All right, I'll let you go."; +TXT_RPLY1_SCRIPT04_d18192_SORRY = "Sorry, nothing personal."; +TXT_DLG_SCRIPT04_d19708_NUTSI = "Nuts, if I'm going down, then so are you. Guards!!"; +TXT_DLG_SCRIPT04_d21224_BUSIN = "Business my ass. Help, guards, I've got a live one."; +TXT_DLG_SCRIPT04_d22740_AHIGO = "Ah, I got word from Macil that you'd be coming. I have a way to get you inside the power station, but it's on the risky side."; +TXT_RPLY0_SCRIPT04_d22740_ILLTA = "I'll take my chances."; +TXT_DLG_SCRIPT04_d24256_ALLRI = "All right, I stole an I.D. From the corpse of some fool who fell into the reactor's coolant pit. --blat-- instant deep fry."; +TXT_RPLY0_SCRIPT04_d24256_WHATS = "What should I do once I'm in?"; +TXT_DLG_SCRIPT04_d25772_TELLW = "Tell whoever asks that you're the replacement worker for mr. Crispy. It's just dumb enough to work. Oh, and you might want to check out the storeroom that's right above us."; +TXT_RPLY0_SCRIPT04_d25772_BOYIH = "Boy I hope this I.D. Works."; +TXT_DLG_SCRIPT04_d27288_GETOU = "Get out of here, unless you want to end up mr. Dead."; +TXT_DLG_SCRIPT04_d28804_HEYLE = "Hey, leave me alone. If they catch us wasting time we get dead, or extra work."; +TXT_DLG_SCRIPT04_d30320_SUCHP = "Such pressure, at this rate we'll be back to normal shifts soon. We're pumping tons of power to the castle and I'm almost finished logging those new weapons."; +TXT_RPLY0_SCRIPT04_d30320_WEAPO = "Weapons?"; +TXT_DLG_SCRIPT04_d31836_WHATD = "What do you think, we're backed up on socks?"; +TXT_RPLY0_SCRIPT04_d31836_WHATK = "What kind of weapons?"; +TXT_DLG_SCRIPT04_d33352_AREYO = "Are you deaf? I just told you how busy I am. Get back to work."; +TXT_DLG_SCRIPT04_d34868_WHOAR = "Who are you? Only clearance level two personnel are permitted in this area."; +TXT_RPLY0_SCRIPT04_d34868_IMTHE = "I'm the replacement worker."; +TXT_DLG_SCRIPT04_d36384_ABOUT = "About time you showed up. Go talk with Ketrick in the core. Oh, and take this key card. Don't want you getting shot on your first day, huh?"; +TXT_RPLY0_SCRIPT04_d36384_WHERE = "Where's the power crystal?"; +TXT_DLG_SCRIPT04_d37900_IFYOU = "If you don't get to work, you'll get shot anyway. Move your tunic."; +TXT_DLG_SCRIPT04_d39416_IDONT = "I don't mean to sound alarmist, but if they keep pushing the power crystal this hard it's gonna flaw, and then shatter, and then *boom*! ...Just a thought."; +TXT_DLG_SCRIPT04_d40932_LETME = "Let me be quite clear. If this terminal locks up again, the coolant level will drop and we'll all have to answer to the Programmer. If we survive."; +TXT_DLG_SCRIPT04_d42448_YOUYE = "You! Yeah, you. You aren't cleared for this area. Let me have your key card, fast. I'm in such a bad mood!"; +TXT_RPLY0_SCRIPT04_d42448_HEREH = "Here, here's my card."; +TXT_DLG_SCRIPT04_d43964_THISI = "This is garbage! Wait here. Oh screw it. Guards kill this intruder!"; +TXT_DLG_SCRIPT04_d45480_WORKS = "Work, sleep, get tortured, what a life. Say, you the replacement for the careless pit diver?"; +TXT_RPLY0_SCRIPT04_d45480_YEAHC = "Yeah, can't wait to start."; +TXT_DLG_SCRIPT04_d46996_YEAHR = "Yeah, right. Ok, get your ass to work."; +TXT_RPLY0_SCRIPT04_d46996_WHERE = "Where's the crystal?"; +TXT_DLG_SCRIPT04_d48512_GOTAL = "Go talk to Ketrick. Bring the walkway up using the switches, then use this I.D. For the elevator."; +TXT_RPLY0_SCRIPT04_d48512_WHERE = "Where's the crystal again?"; +TXT_DLG_SCRIPT04_d50028_NONEO = "None of your business, go talk to Ketrick."; +TXT_RPLY0_SCRIPT04_d50028_OK = "Ok."; +TXT_DLG_SCRIPT04_d51544_IFITS = "If it's busy work you want, go stare at that screen for a while, it'll bore you to tears."; +TXT_DLG_SCRIPT04_d53060_THEAL = "The almighty Programmer is so paranoid of infiltration that he's locked up the computer core. How am I supposed to get my work done? The only way in is the suicide run."; +TXT_RPLY0_SCRIPT04_d53060_SUICI = "Suicide run? What's that?"; +TXT_DLG_SCRIPT04_d54576_ITSAS = "It's a sure-fire way to get killed, but that's not important right now. Go down the lift if you're so inclined."; + +TXT_DLG_SCRIPT05_d0_HALTN = "Halt. No one gets through here without authorization from the Warden or the governor."; +TXT_RPLY0_SCRIPT05_d0_HERES = "Here's my pass, let me in."; +TXT_DLG_SCRIPT05_d1516_OKBUT = "Ok, but talk only to the Warden."; +TXT_DLG_SCRIPT05_d3032_DOILO = "Do I look like the Warden to you? Keep moving, this area's off limits."; +TXT_DLG_SCRIPT05_d4548_THEOR = "The order's wrath will rain down on these servants until they beg for death."; +TXT_DLG_SCRIPT05_d6064_IDONT = "I don't care if Mourel gave you a pass. This is my prison. My key is the only way in or out, and I'm not taking any chances. The order does not tolerate mistakes."; +TXT_RPLY0_SCRIPT05_d6064_GIVEM = "Give me the damn key!"; +TXT_DLG_SCRIPT05_d7580_OVERM = "Over my dead body!"; +TXT_RPLY0_SCRIPT05_d7580_GREAT = "Great idea!"; +TXT_DLG_SCRIPT05_d9096_SHACK = "Shackles or chains, I want you to hang around."; +TXT_DLG_SCRIPT05_d10612_IDONT = "I don't know how you managed to get past the guards and the Warden, but I hope you like the decor, because you just moved in."; +TXT_RPLY0_SCRIPT05_d10612_FREEM = "Free my comrades or die!"; +TXT_DLG_SCRIPT05_d12128_KILLM = "Kill me and you'll never set anyone free. I possess the only pattern key that will unlock the cells."; +TXT_RPLY0_SCRIPT05_d12128_CANYO = "Can you lend me a hand then?"; +TXT_DLG_SCRIPT05_d13644_MOVEA = "Move along or join your friends."; +TXT_DLG_SCRIPT05_d15160_DONTJ = "Don't just stand there, get us out of here!"; +TXT_DLG_SCRIPT05_d16676_THESK = "The sky, I want to see the sky."; +TXT_DLG_SCRIPT05_d18192_FIVEF = "Five feet by four feet, five feet by four feet, five feet by four feet."; +TXT_DLG_SCRIPT05_d19708_DONTR = "Don't release me if the order's still in charge. I can't stand the terror."; +TXT_DLG_SCRIPT05_d21224_IDONT = "I don't want to bitch, but it's about time Macil sent someone to get us out."; +TXT_DLG_SCRIPT05_d22740_IDGIV = "I'd give anything for just a crust of bread. I'm so hungry."; + +TXT_DLG_SCRIPT06_d0_AHASU = "Ah, a surfacer in need of a favor. Down here you do a favor to get a favor and I need the town entrance that is our path to food opened. The order has it sealed and guarded."; +TXT_RPLY0_SCRIPT06_d0_WHERE = "Where is the gate mechanism?"; +TXT_DLG_SCRIPT06_d1516_DOMYF = "Do my favor first, or you'll get squat from me."; +TXT_RPLY0_SCRIPT06_d1516_HOWWI = "How will you know it's open?"; +TXT_DLG_SCRIPT06_d3032_BRING = "Bring me back the guard's uniform. That way one of my ratfellows can wear it and no one will try to shut the door again."; +TXT_RPLY0_SCRIPT06_d3032_YOUWA = "You want his uniform?"; +TXT_DLG_SCRIPT06_d4548_OPENT = "Open the door, bring me the uniform and we trade. Otherwise, piss off."; +TXT_DLG_SCRIPT06_d6064_HAVEY = "Have you brought me what I want?"; +TXT_RPLY0_SCRIPT06_d6064_HOWAB = "How about this uniform?"; +TXT_RNO0_SCRIPT06_d6064_BRING = "Bring me the uniform."; +TXT_DLG_SCRIPT06_d7580_GOODH = "Good. Here's something extra. My fellows tore this off of a fallen crusader, it's the parts that make up a flamethrower. Now Irale can make one for you. You can have such fun."; +TXT_RPLY0_SCRIPT06_d7580_WHERE = "Where's the gate mechanism?"; +TXT_DLG_SCRIPT06_d9096_YOUHA = "You have to enter another part of the sewers. To get there you must enter the castle from a sewer maintenance door and drain the fluid reclamation tank. At the bottom is the hidden entrance to sewers, and right beyond that is the manual gate control."; +TXT_RPLY0_SCRIPT06_d9096_ANYTH = "Anything else you can do?"; +TXT_DLG_SCRIPT06_d10612_GOODL = "Good luck. I've opened several of our tunnels for you. It should make your task easier. Oh, size ten, perfect! ...But dreadful colors."; +TXT_RPLY0_SCRIPT06_d10612_THANK = "Thanks for your help."; +TXT_DLG_SCRIPT06_d12128_YOUGI = "You give me nothing, you get nothing."; +TXT_DLG_SCRIPT06_d13644_WERAN = "Weran will save us. He's never failed us yet."; +TXT_DLG_SCRIPT06_d15160_IFYOU = "If you seek an answer to your problem, find weran. "; +TXT_DLG_SCRIPT06_d16676_LONGL = "Long live the front? That's all crap. We're all just waiting to die. "; +TXT_DLG_SCRIPT06_d18192_WITHO = "With our passage to the surface sealed, we can't even feed ourselves."; +TXT_DLG_SCRIPT06_d19708_FOODD = "Food, do you have any food? Please help us."; +TXT_DLG_SCRIPT06_d21224_THISI = "This is my reward for letting prisoners escape, guarding the sewers. If I ever find the guy who broke them out, I'll slaughter him."; +TXT_DLG_SCRIPT06_d22740_WEVEG = "We've got those little beggars just where we want them. Few more days of this, and they'll have starved themselves into oblivion."; +TXT_DLG_SCRIPT06_d24256_WHATS = "What's your clearance? There's no unauthorized personnel allowed up here."; + +TXT_DLG_SCRIPT07_d0_WHATT = "What the hell? Who opened the gates? Sound the alarm!!!"; +TXT_DLG_SCRIPT07_d1516_THERE = "There's another way into the sewers, throw that switch and then go up and purge the reclamation tank."; +TXT_DLG_SCRIPT07_d3032_WHATT = "What the hell's your problem. If the Programmer comes up from his audience chamber, you're dead."; +TXT_DLG_SCRIPT07_d4548_HEYYO = "Hey, you're not cleared to go down there."; +TXT_DLG_SCRIPT07_d6064_PROGR = "Programmer? Who told you that? There is no Programmer. That story was spread ages ago. Don't tell me the front actually believed that crap. Idiots."; +TXT_RPLY0_SCRIPT07_d6064_WELLW = "Well, what's the truth then?"; +TXT_DLG_SCRIPT07_d7580_ITOLD = "I told you all I know. You are wasting your time."; +TXT_DLG_SCRIPT07_d9096_FIGHT = "Fight on, we will triumph. This day will belong to us!"; +TXT_DLG_SCRIPT07_d10612_FIGHT = "Fight on, we will triumph. This day will belong to us!"; +TXT_DLG_SCRIPT07_d12128_FIGHT = "Fight on, we will triumph. This day will belong to us!"; +TXT_DLG_SCRIPT07_d13644_FIGHT = "Fight on, we will triumph. This day will belong to us!"; +TXT_DLG_SCRIPT07_d15160_FIGHT = "Fight on, we will triumph. This day will belong to us!"; +TXT_DLG_SCRIPT07_d16676_FIGHT = "Fight on, we will triumph. This day will belong to us!"; + +TXT_DLG_SCRIPT08_d0_YOUKI = "You killed all the guards. Don't hurt me. I told him this was a dumb idea. The real Programmer's in the keep. Here, take this key."; +TXT_RPLY0_SCRIPT08_d0_YOURE = "You're the Programmer!"; +TXT_DLG_SCRIPT08_d1516_DOILO = "Do I look like I wield ultimate power? The order uses us all. Now go, I'm dead already."; +TXT_DLG_SCRIPT08_d3032_POWER = "Power is the key!"; + +TXT_DLG_SCRIPT10_d0_GOODY = "Good, you're conscious again. When you grabbed that item the Programmer dropped you let loose some terrible secrets."; +TXT_RPLY0_SCRIPT10_d0_WHATK = "What kind of secrets. "; +TXT_DLG_SCRIPT10_d1516_WEHAV = "We have no idea where this weapon came from, but we must find out. You have wrested one from the order, but we must have all five. We have reached the limits of my knowledge. Seek out the Oracle and ask it for help."; +TXT_RPLY0_SCRIPT10_d1516_IMGON = "I'm gonna need more supplies."; +TXT_DLG_SCRIPT10_d3032_HERES = "Here's some gold. Go visit the medic and the weapons trainer and then, move out!"; +TXT_RPLY0_SCRIPT10_d3032_RIGHT = "Right!"; +TXT_DLG_SCRIPT10_d4548_FIGHT = "Fight for the front and freedom. Move out."; +TXT_DLG_SCRIPT10_d6064_WHATP = "What prompts your return? Are you hurt? There's no time to lose, continue with your mission. Complete the Sigil."; +TXT_RPLY0_SCRIPT10_d6064_THEOR = "The Oracle says you must die!"; TXT_DLG_SCRIPT10_d7580_IHAVE = "I have sworn myself to freedom. It is the Oracle who holds the third piece. There's your traitor."; -TXT_RPLY0_SCRIPT10_d7580_THEOR = "THE ORACLE WILL DIE THEN!"; -TXT_RPLY1_SCRIPT10_d7580_ITHIN = "I THINK YOU'RE THE TRAITOR!"; -TXT_DLG_SCRIPT10_d9096_SPIRI = "Spirit of the one god avenge me and turn this world into dust."; -TXT_DLG_SCRIPT10_d10612_YOUHA = "You have made the right decision. Its clear that the ORACLE is controlled by whatever evil is driving The ORDER. Return to it and claim the third piece of the SIGIL."; -TXT_DLG_SCRIPT10_d12128_THERE = "There seems no end to the horror we face. We have found out that The Order is NOT killing our people. it is transforming them, into bio-mechanical soldiers. Find the facility where this is being done and CLOSE IT, permanently."; -TXT_RPLY0_SCRIPT10_d12128_WHERE = "WHERE IS THIS LOCATED?"; -TXT_DLG_SCRIPT10_d13644_ONEOF = "One of our captains, RICHTER, is waiting for you by the waterfall in the commons. He has seen the facility and can guide you inside. Stop this atrocity, now."; -TXT_RPLY0_SCRIPT10_d13644_THEYL = "THEY'LL PAY FOR THIS!"; -TXT_DLG_SCRIPT10_d15160_FIGHT = "FIGHT FOR THE FRONT AND FREEDOM. MOVE OUT."; -TXT_DLG_SCRIPT10_d16676_IAMTH = "I am the one God... I need his spirit to be free so that I can leave my body, and join him in flight. You have no idea what you possess... and what terror you face... the one God must be free... and he will reward me... I will be ONE..."; -TXT_RPLY0_SCRIPT10_d16676_IWILL = "I WILL DESTROY YOU!"; -TXT_DLG_SCRIPT10_d18192_GLADT = "GLAD TO SEE YOU MADE IT. WHAT DO YOU NEED? "; -TXT_RPLY0_SCRIPT10_d18192_HEALM = "HEAL ME."; -TXT_RYES0_SCRIPT10_d18192_WELLL = "WELL, LETS GET YOU FIXED UP."; -TXT_RNO0_SCRIPT10_d18192_YOURE = "YOU'RE FINE."; -TXT_RPLY1_SCRIPT10_d18192_ANYTH = "ANYTHING NEW?"; -TXT_RYES1_SCRIPT10_d18192_YESIV = "YES, I'VE GOT SOME NEW HARDWARE FOR YOU."; -TXT_RNO1_SCRIPT10_d18192_NOPEI = "NOPE, I'M WORKING ON IT THOUGH."; -TXT_DLG_SCRIPT10_d19708_WHATC = "WHAT CAN I DO FOR YOU NOW? FERIS IS DECRYPTING SOME REALLY COMPLEX FILES, BUT IT'S ALL WORTH IT. THERE'S ALREADY SOME INFORMATION THAT I'LL BE ABLE TO APPLY TO THE NEXT VERSION OF THE STAMINA IMPLANT."; -TXT_RPLY0_SCRIPT10_d19708_HEALM = "HEAL ME."; -TXT_RYES0_SCRIPT10_d19708_YOUSH = "YOU SHOULD LEARN TO BE A LITTLE MORE CAREFUL."; -TXT_RPLY1_SCRIPT10_d19708_WHENW = "WHEN WILL THAT BE READY?"; -TXT_RYES1_SCRIPT10_d19708_ITSRE = "IT'S READY NOW. THIS WON'T TAKE BUT A MOMENT."; -TXT_RNO1_SCRIPT10_d19708_SOON = "SOON."; -TXT_DLG_SCRIPT10_d21224_ITHIN = "I THINK I FOUND A GLITCH IN YOUR IMPLANT HARDWARE. FERIS IS HELPING ME DESIGN A RETROFIT THAT WILL TAKE CARE OF IT AND BOOST THE SPEED OF YOUR HARDWARE A LITTLE. IS THERE SOMETHING I CAN DO FOR YOU?"; -TXT_RPLY0_SCRIPT10_d21224_PATCH = "PATCH ME UP."; -TXT_RYES0_SCRIPT10_d21224_THERE = "THERE, AS GOOD AS NEW I GUESS."; -TXT_RPLY1_SCRIPT10_d21224_RETRO = "RETROFIT?"; -TXT_RYES1_SCRIPT10_d21224_AHNOW = "AH, NOW WE'RE COOKING."; -TXT_RNO1_SCRIPT10_d21224_ILLHA = "I'LL HAVE IT AS SOON AS FERIS FINISHES IT."; -TXT_DLG_SCRIPT10_d22740_HOWSI = "HOW'S IT GOING? MAN, SOME OF THIS NEW TECHNOLOGY IS SIMPLY AMAZING. THIS SHOULD ALSO HELP WITH YOUR IMPLANT. I'VE GOT A COUPLE IDEAS THAT I'M SKETCHING OUT AND I'LL HAVE THEM READY SOON. WHAT CAN I DO FOR YOU, MAYBE SOME HEALING?"; -TXT_RPLY0_SCRIPT10_d22740_YESHE = "YES, HEAL ME."; -TXT_RYES0_SCRIPT10_d22740_ALLRI = "ALL RIGHT, HERE YOU GO."; -TXT_RPLY1_SCRIPT10_d22740_HOWAB = "HOW ABOUT THAT NEW TECH?"; -TXT_RYES1_SCRIPT10_d22740_LETME = "LET ME KNOW HOW THIS WORKS."; -TXT_RNO1_SCRIPT10_d22740_IMNOT = "I'M NOT DONE DESIGNING IT YET."; -TXT_DLG_SCRIPT10_d24256_BACKA = "BACK AGAIN, DON'T YOU EVER TIRE OF THIS? I'VE GOT SOME GOOD NEWS, FERIS FOUND A WAY TO INCREASE THE OUTPUT OF YOUR IMPLANT. HE GAVE THE SPECS TO ME AND I'M TRYING TO GET IT TO BLEND WITH YOUR PHYSIOLOGY. I'M FORCE GROWING SOME TISSUE, TOTALLY NEW STUFF HERE, I HOPE IT TAKES. DO YOU NEED HEALING?"; -TXT_RPLY0_SCRIPT10_d24256_YESHE = "YES, HEAL ME."; -TXT_RYES0_SCRIPT10_d24256_DONEN = "DONE, NOW TAKE CARE OF YOURSELF."; -TXT_RPLY1_SCRIPT10_d24256_WHENW = "WHEN WILL YOU BE DONE?"; -TXT_RYES1_SCRIPT10_d24256_NOWHE = "NOW. HEY GREAT, IT WORKED!"; -TXT_RNO1_SCRIPT10_d24256_IMWAI = "I'M WAITING ON THE TISSUE TO FINISH ITS GROWTH CYCLE."; -TXT_DLG_SCRIPT10_d25772_WELLI = "WELL, I'M BACK UP TO MY OLD TRICKS AGAIN, I'M STILL WORKING ON YOUR IMPLANTS. DID YOU KNOW THAT MACIL HAS NOW AUTHORIZED THEM FOR EVERYONE? NO, HUH? IT'S BECAUSE YOU TURNED OUT SO WELL. ANYTHING I CAN DO FOR YOU?"; -TXT_RPLY0_SCRIPT10_d25772_HELPM = "HELP ME OUT HERE."; -TXT_RYES0_SCRIPT10_d25772_THATS = "THAT'S ALL I CAN DO."; -TXT_RPLY1_SCRIPT10_d25772_NEWIM = "NEW IMPLANT?"; -TXT_RYES1_SCRIPT10_d25772_YEPMY = "YEP, MY BEST ONE YET."; -TXT_RNO1_SCRIPT10_d25772_SORRY = "SORRY, BUT YOU JUST HAVE TO WAIT."; -TXT_DLG_SCRIPT10_d27288_THISI = "THIS IS IT, FERIS HAS MANAGED TO DRAIN EVERYTHING HE COULD OUT OF ALL THE DATA WE HAVE, THIS WILL THE BEST, AND LAST IMPLANT UPGRADE. IT WILL BE SORT OF DEPRESSING, SEEING MY BEST CREATION REACH ITS PEAK. WELL, AT LEAST THE REST OF THIS CREW WILL KEEP ME OCCUPIED."; -TXT_RPLY0_SCRIPT10_d27288_COULD = "COULD YOU HEAL ME?"; -TXT_RYES0_SCRIPT10_d27288_THERE = "THERE, YOU'RE ALL SET NOW."; -TXT_DLG_SCRIPT10_d28804_ITSTH = "IT'S THE HERO. GREAT JOB! WHAT CAN I GET FOR YOU? WE'VE GOT A LITTLE LARGER SELECTION NOW THAT WE HAVE ALL THE ORDINANCE FROM THE CASTLE. IF YOU NEED TO BUY SOME AMMO TALK TO JUSTIN. HE'LL TAKE CARE OF YOU. "; -TXT_RPLY0_SCRIPT10_d28804_IMOUT = "I'M OUT OF BULLETS."; -TXT_RYES0_SCRIPT10_d28804_HERES = "HERE'S SOME AMMO FOR YOU. DON'T WASTE IT."; -TXT_RPLY1_SCRIPT10_d28804_TEACH = "TEACH ME."; -TXT_RYES1_SCRIPT10_d28804_NOWAF = "NOW, A FEW TIPS ON THE BIG GUNS."; -TXT_RNO1_SCRIPT10_d28804_YOURE = "YOU'RE NOT READY YET."; -TXT_DLG_SCRIPT10_d30320_HOWST = "HOW'S THE WAR EFFORT? NEVERMIND, IF WE'RE STILL HERE, IT MUST BE GOING FINE. WHAT CAN I DO FOR YOU?"; -TXT_RPLY0_SCRIPT10_d30320_IRANO = "I RAN OUT OF BULLETS."; -TXT_RYES0_SCRIPT10_d30320_THATS = "THAT SHOULD HELP."; -TXT_RNO0_SCRIPT10_d30320_YOUVE = "YOU'VE GOT ENOUGH AMMO."; -TXT_RPLY1_SCRIPT10_d30320_TEACH = "TEACH ME."; -TXT_RYES1_SCRIPT10_d30320_HEREI = "HERE, I'LL SHOW YOU A FEW TRICKS OF THE TRADE."; -TXT_RNO1_SCRIPT10_d30320_YOURE = "YOU'RE NOT READY YET."; -TXT_DLG_SCRIPT10_d31836_WELLH = "WELL HAVE YOU COME FOR TUTELAGE OR IS IT SOME AMMO YOU'RE LOOKING FOR? DON'T THINK THAT I'M DONE WITH YOU YET. I'VE STILL GOT A FEW TRICKS UP MY SLEEVE."; -TXT_RPLY0_SCRIPT10_d31836_ITSAM = "IT'S AMMO FOR NOW."; -TXT_RYES0_SCRIPT10_d31836_HERES = "HERE'S SOME AMMO FOR YOU. DON'T WASTE IT."; -TXT_RNO0_SCRIPT10_d31836_YOUVE = "YOU'VE GOT ENOUGH AMMO."; -TXT_RPLY1_SCRIPT10_d31836_TEACH = "TEACH ME."; -TXT_RYES1_SCRIPT10_d31836_TIMEF = "TIME FOR THE ADVANCED LESSONS."; -TXT_RNO1_SCRIPT10_d31836_YOURE = "YOU'RE NOT READY YET."; -TXT_DLG_SCRIPT10_d33352_WELLW = "WELL, WHAT IS IT NOW? DON'T YOU EVER TAKE A BREAK? I'M GLAD THAT YOU'RE STILL BREATHING. I'D HATE FOR MY FAVORITE STUDENT TO COME BACK LOOKING OUT FROM THE INSIDE OF A BODY BAG."; -TXT_RPLY0_SCRIPT10_d33352_INEED = "I NEED SOME MORE BULLETS."; -TXT_RYES0_SCRIPT10_d33352_THERE = "THERE, DON'T WASTE IT."; -TXT_RNO0_SCRIPT10_d33352_YOUHA = "YOU HAVE ENOUGH."; -TXT_RPLY1_SCRIPT10_d33352_WHATC = "WHAT CAN YOU TEACH ME?"; -TXT_RYES1_SCRIPT10_d33352_DONTG = "DON'T GET SNIPPY, YOU'VE STILL SOME ROOM TO GROW."; -TXT_RNO1_SCRIPT10_d33352_NOTHI = "NOTHING UNTIL YOU'RE READY."; -TXT_DLG_SCRIPT10_d34868_LOOKW = "LOOK WHO'S BACK, WHAT'S ON YOUR MIND? I KNOW IT'S BEEN HARD, BUT ALL OF US APPRECIATE YOUR EFFORTS, BELIEVE ME."; -TXT_RPLY0_SCRIPT10_d34868_IVERU = "I'VE RUN OUT OF BULLETS."; -TXT_RYES0_SCRIPT10_d34868_WHATE = "WHAT ELSE IS NEW, HERE YOU GO."; -TXT_RNO0_SCRIPT10_d34868_YOUHA = "YOU HAVE MORE THAN I CAN GIVE YOU."; -TXT_RPLY1_SCRIPT10_d34868_TEACH = "TEACH ME WHAT YOU CAN."; -TXT_RYES1_SCRIPT10_d34868_ALLRI = "ALL RIGHT, HERE'S SOME POINTERS."; -TXT_RNO1_SCRIPT10_d34868_NOTRI = "NOT RIGHT NOW."; -TXT_DLG_SCRIPT10_d36384_WHATI = "WHAT IS IT YOU NEED? I HOPE THAT YOU'RE GIVING THE ORDER A TASTE OF THE KIND OF PAIN THAT WE HAVE BEEN FEELING FOR YEARS."; -TXT_RPLY0_SCRIPT10_d36384_SOMEA = "SOME AMMO."; -TXT_RYES0_SCRIPT10_d36384_THERE = "THERE YOU GO, DON'T WASTE IT."; -TXT_RNO0_SCRIPT10_d36384_YOUVE = "YOU'VE GOT ENOUGH AMMO."; -TXT_RPLY1_SCRIPT10_d36384_TEACH = "TEACH ME."; -TXT_RYES1_SCRIPT10_d36384_AFEWM = "A FEW MORE LESSONS AND YOU'LL KNOW ALL THAT I CAN TEACH."; -TXT_RNO1_SCRIPT10_d36384_YOURE = "YOU'RE NOT READY YET."; -TXT_DLG_SCRIPT10_d37900_ICANT = "I CAN'T BELIEVE THAT WE'RE STILL AROUND, YOU AND I. THERE'S JUST TOO MANY OF US THAT HAVE PASSED SINCE THE BEGINNING. WHAT CAN I DO FOR YOU FRIEND?"; -TXT_RPLY0_SCRIPT10_d37900_IMOUT = "I'M OUT OF BULLETS."; -TXT_RYES0_SCRIPT10_d37900_HEREU = "HERE, USE THEM TO KEEP YOU IN GOOD HEALTH."; -TXT_RNO0_SCRIPT10_d37900_YOUHA = "YOU HAVE ENOUGH."; -TXT_RPLY1_SCRIPT10_d37900_TEACH = "TEACH ME."; -TXT_RYES1_SCRIPT10_d37900_WELLT = "WELL, THAT'S IT, YOU'RE DONE. I CAN TEACH NO MORE."; -TXT_RNO1_SCRIPT10_d37900_RETUR = "RETURN AFTER MACIL TELLS YOU IT'S TIME."; -TXT_DLG_SCRIPT10_d39416_IVETA = "I'VE TAUGHT YOU EVERYTHING I CAN RIGHT NOW. I'VE GIVEN YOU ALL THAT YOU SHOULD EVER NEED, UNLESS YOU'RE OUT OF BULLETS. THOSE I CAN STILL HELP YOU WITH."; -TXT_RPLY0_SCRIPT10_d39416_YESIA = "YES I AM."; -TXT_RYES0_SCRIPT10_d39416_HEREY = "HERE YOU GO. "; -TXT_DLG_SCRIPT10_d40932_CHECK = "CHECK OUT WHAT'S NEW, THE TELEPORTER BEACON. WHEN YOU USE THE BEACON, WE'LL TRACK THE SIGNAL AND SEND HELP. IS THERE SOMETHING I CAN GET YOU?"; -TXT_RPLY0_SCRIPT10_d40932_BOXOF = "BOX OF ROCKETS"; -TXT_RYES0_SCRIPT10_d40932_THERE = "THERE YOU GO."; -TXT_RNO0_SCRIPT10_d40932_YOUCA = "YOU CAN'T AFFORD THAT!"; -TXT_RPLY1_SCRIPT10_d40932_HEGRE = "H-E GRENADES."; -TXT_RYES1_SCRIPT10_d40932_HEREY = "HERE YOU GO."; -TXT_RNO1_SCRIPT10_d40932_COMEB = "COME BACK WHEN YOU HAVE ENOUGH MONEY."; -TXT_RPLY2_SCRIPT10_d40932_ENERG = "ENERGY POD"; -TXT_RYES2_SCRIPT10_d40932_HERES = "HERE'S YOUR ENERGY POD"; -TXT_RNO2_SCRIPT10_d40932_YOUDO = "YOU DON'T HAVE ENOUGH FOR THAT."; -TXT_RPLY3_SCRIPT10_d40932_TELEP = "TELEPORTER BEACON"; -TXT_RYES3_SCRIPT10_d40932_HELPW = "HELP, WHEN AND WHERE YOU NEED IT."; -TXT_RNO3_SCRIPT10_d40932_SORRY = "SORRY, NO CHARITY."; -TXT_DLG_SCRIPT10_d42448_NOWTH = "NOW THAT WE ACTUALLY HAVE THE CASTLE UNDER CONTROL, WE HAVE TO BE EXTRA VIGILANT TO KEEP IT. THE ORDER'S PROBABLY GETTING READY TO STRIKE BACK RIGHT NOW."; -TXT_DLG_SCRIPT10_d43964_BECAR = "BE CAREFUL OUT THERE."; -TXT_DLG_SCRIPT10_d45480_KEEPU = "KEEP UP THE GREAT WORK, WE COULDN'T HAVE DONE IT WITHOUT YOU."; -TXT_DLG_SCRIPT10_d46996_WHATI = "WHAT IS THE WISDOM YOU SEEK?"; -TXT_RPLY0_SCRIPT10_d46996_THESI = "THE SIGIL OF THE ONE GOD."; -TXT_RYES0_SCRIPT10_d46996_THERE = "THE REMAINING PIECES LIE WRAPPED IN THE ARMS IN DARKNESS."; -TXT_DLG_SCRIPT10_d48512_THESE = "THE SECOND PIECE OF THE SIGIL LIES AT THE HEART OF THE CRIMSON AND OBSIDIAN TOWER. BE WARNED, THERE THE DRAGON AWAITS YOU. THE TIME OF YOUR COMING HAS BEEN FORETOLD. SEEK THE TOWER, YOUR PRIZE LIES WITHIN."; -TXT_RPLY0_SCRIPT10_d48512_WHATA = "WHAT ABOUT THE OTHER PIECES?"; -TXT_RYES0_SCRIPT10_d48512_RETUR = "RETURN AFTER YOU HAVE BESTED THE DRAGON."; -TXT_DLG_SCRIPT10_d50028_HEY = "HEY."; -TXT_RPLY0_SCRIPT10_d50028_STUFF = "STUFF"; -TXT_RYES0_SCRIPT10_d50028_HEREY = "HERE YOU GO."; -TXT_DLG_SCRIPT10_d51544_HEY = "HEY."; - +TXT_RPLY0_SCRIPT10_d7580_THEOR = "The Oracle will die then!"; +TXT_RPLY1_SCRIPT10_d7580_ITHIN = "I think you're the traitor!"; +TXT_DLG_SCRIPT10_d9096_SPIRI = "Spirit of the One God avenge me and turn this world into dust."; +TXT_DLG_SCRIPT10_d10612_YOUHA = "You have made the right decision. Its clear that the Oracle is controlled by whatever evil is driving the order. Return to it and claim the third piece of the Sigil."; +TXT_DLG_SCRIPT10_d12128_THERE = "There seems no end to the horror we face. We have found out that the order is not killing our people. It is transforming them, into bio-mechanical soldiers. Find the facility where this is being done and close it, permanently."; +TXT_RPLY0_SCRIPT10_d12128_WHERE = "Where is this located?"; +TXT_DLG_SCRIPT10_d13644_ONEOF = "One of our captains, Richter, is waiting for you by the waterfall in the commons. He has seen the facility and can guide you inside. Stop this atrocity, now."; +TXT_RPLY0_SCRIPT10_d13644_THEYL = "They'll pay for this!"; +TXT_DLG_SCRIPT10_d15160_FIGHT = "Fight for the front and freedom. Move out."; +TXT_DLG_SCRIPT10_d16676_IAMTH = "I am the One God... I need his spirit to be free so that I can leave my body, and join him in flight. You have no idea what you possess... And what terror you face... The One God must be free... And he will reward me... I will be one..."; +TXT_RPLY0_SCRIPT10_d16676_IWILL = "I will destroy you!"; +TXT_DLG_SCRIPT10_d18192_GLADT = "Glad to see you made it. What do you need? "; +TXT_RPLY0_SCRIPT10_d18192_HEALM = "Heal me."; +TXT_RYES0_SCRIPT10_d18192_WELLL = "Well, lets get you fixed up."; +TXT_RNO0_SCRIPT10_d18192_YOURE = "You're fine."; +TXT_RPLY1_SCRIPT10_d18192_ANYTH = "Anything new?"; +TXT_RYES1_SCRIPT10_d18192_YESIV = "Yes, I've got some new hardware for you."; +TXT_RNO1_SCRIPT10_d18192_NOPEI = "Nope, I'm working on it though."; +TXT_DLG_SCRIPT10_d19708_WHATC = "What can I do for you now? Feris is decrypting some really complex files, but it's all worth it. There's already some information that I'll be able to apply to the next version of the stamina implant."; +TXT_RPLY0_SCRIPT10_d19708_HEALM = "Heal me."; +TXT_RYES0_SCRIPT10_d19708_YOUSH = "You should learn to be a little more careful."; +TXT_RPLY1_SCRIPT10_d19708_WHENW = "When will that be ready?"; +TXT_RYES1_SCRIPT10_d19708_ITSRE = "It's ready now. This won't take but a moment."; +TXT_RNO1_SCRIPT10_d19708_SOON = "Soon."; +TXT_DLG_SCRIPT10_d21224_ITHIN = "I think I found a glitch in your implant hardware. Feris is helping me design a retrofit that will take care of it and boost the speed of your hardware a little. Is there something I can do for you?"; +TXT_RPLY0_SCRIPT10_d21224_PATCH = "Patch me up."; +TXT_RYES0_SCRIPT10_d21224_THERE = "There, as good as new I guess."; +TXT_RPLY1_SCRIPT10_d21224_RETRO = "Retrofit?"; +TXT_RYES1_SCRIPT10_d21224_AHNOW = "Ah, now we're cooking."; +TXT_RNO1_SCRIPT10_d21224_ILLHA = "I'll have it as soon as Feris finishes it."; +TXT_DLG_SCRIPT10_d22740_HOWSI = "How's it going? Man, some of this new technology is simply amazing. This should also help with your implant. I've got a couple ideas that I'm sketching out and I'll have them ready soon. What can I do for you, maybe some healing?"; +TXT_RPLY0_SCRIPT10_d22740_YESHE = "Yes, heal me."; +TXT_RYES0_SCRIPT10_d22740_ALLRI = "All right, here you go."; +TXT_RPLY1_SCRIPT10_d22740_HOWAB = "How about that new tech?"; +TXT_RYES1_SCRIPT10_d22740_LETME = "Let me know how this works."; +TXT_RNO1_SCRIPT10_d22740_IMNOT = "I'm not done designing it yet."; +TXT_DLG_SCRIPT10_d24256_BACKA = "Back again, don't you ever tire of this? I've got some good news, Feris found a way to increase the output of your implant. He gave the specs to me and I'm trying to get it to blend with your physiology. I'm force growing some tissue, totally new stuff here, I hope it takes. Do you need healing?"; +TXT_RPLY0_SCRIPT10_d24256_YESHE = "Yes, heal me."; +TXT_RYES0_SCRIPT10_d24256_DONEN = "Done, now take care of yourself."; +TXT_RPLY1_SCRIPT10_d24256_WHENW = "When will you be done?"; +TXT_RYES1_SCRIPT10_d24256_NOWHE = "Now. Hey great, it worked!"; +TXT_RNO1_SCRIPT10_d24256_IMWAI = "I'm waiting on the tissue to finish its growth cycle."; +TXT_DLG_SCRIPT10_d25772_WELLI = "Well, I'm back up to my old tricks again, I'm still working on your implants. Did you know that Macil has now authorized them for everyone? No, huh? It's because you turned out so well. Anything I can do for you?"; +TXT_RPLY0_SCRIPT10_d25772_HELPM = "Help me out here."; +TXT_RYES0_SCRIPT10_d25772_THATS = "That's all I can do."; +TXT_RPLY1_SCRIPT10_d25772_NEWIM = "New implant?"; +TXT_RYES1_SCRIPT10_d25772_YEPMY = "Yep, my best one yet."; +TXT_RNO1_SCRIPT10_d25772_SORRY = "Sorry, but you just have to wait."; +TXT_DLG_SCRIPT10_d27288_THISI = "This is it, Feris has managed to drain everything he could out of all the data we have, this will the best, and last implant upgrade. It will be sort of depressing, seeing my best creation reach its peak. Well, at least the rest of this crew will keep me occupied."; +TXT_RPLY0_SCRIPT10_d27288_COULD = "Could you heal me?"; +TXT_RYES0_SCRIPT10_d27288_THERE = "There, you're all set now."; +TXT_DLG_SCRIPT10_d28804_ITSTH = "It's the hero. Great job! What can I get for you? We've got a little larger selection now that we have all the ordinance from the castle. If you need to buy some ammo talk to justin. He'll take care of you. "; +TXT_RPLY0_SCRIPT10_d28804_IMOUT = "I'm out of bullets."; +TXT_RYES0_SCRIPT10_d28804_HERES = "Here's some ammo for you. Don't waste it."; +TXT_RPLY1_SCRIPT10_d28804_TEACH = "Teach me."; +TXT_RYES1_SCRIPT10_d28804_NOWAF = "Now, a few tips on the big guns."; +TXT_RNO1_SCRIPT10_d28804_YOURE = "You're not ready yet."; +TXT_DLG_SCRIPT10_d30320_HOWST = "How's the war effort? Nevermind, if we're still here, it must be going fine. What can I do for you?"; +TXT_RPLY0_SCRIPT10_d30320_IRANO = "I ran out of bullets."; +TXT_RYES0_SCRIPT10_d30320_THATS = "That should help."; +TXT_RNO0_SCRIPT10_d30320_YOUVE = "You've got enough ammo."; +TXT_RPLY1_SCRIPT10_d30320_TEACH = "Teach me."; +TXT_RYES1_SCRIPT10_d30320_HEREI = "Here, I'll show you a few tricks of the trade."; +TXT_RNO1_SCRIPT10_d30320_YOURE = "You're not ready yet."; +TXT_DLG_SCRIPT10_d31836_WELLH = "Well have you come for tutelage or is it some ammo you're looking for? Don't think that I'm done with you yet. I've still got a few tricks up my sleeve."; +TXT_RPLY0_SCRIPT10_d31836_ITSAM = "It's ammo for now."; +TXT_RYES0_SCRIPT10_d31836_HERES = "Here's some ammo for you. Don't waste it."; +TXT_RNO0_SCRIPT10_d31836_YOUVE = "You've got enough ammo."; +TXT_RPLY1_SCRIPT10_d31836_TEACH = "Teach me."; +TXT_RYES1_SCRIPT10_d31836_TIMEF = "Time for the advanced lessons."; +TXT_RNO1_SCRIPT10_d31836_YOURE = "You're not ready yet."; +TXT_DLG_SCRIPT10_d33352_WELLW = "Well, what is it now? Don't you ever take a break? I'm glad that you're still breathing. I'd hate for my favorite student to come back looking out from the inside of a body bag."; +TXT_RPLY0_SCRIPT10_d33352_INEED = "I need some more bullets."; +TXT_RYES0_SCRIPT10_d33352_THERE = "There, don't waste it."; +TXT_RNO0_SCRIPT10_d33352_YOUHA = "You have enough."; +TXT_RPLY1_SCRIPT10_d33352_WHATC = "What can you teach me?"; +TXT_RYES1_SCRIPT10_d33352_DONTG = "Don't get snippy, you've still some room to grow."; +TXT_RNO1_SCRIPT10_d33352_NOTHI = "Nothing until you're ready."; +TXT_DLG_SCRIPT10_d34868_LOOKW = "Look who's back, what's on your mind? I know it's been hard, but all of us appreciate your efforts, believe me."; +TXT_RPLY0_SCRIPT10_d34868_IVERU = "I've run out of bullets."; +TXT_RYES0_SCRIPT10_d34868_WHATE = "What else is new, here you go."; +TXT_RNO0_SCRIPT10_d34868_YOUHA = "You have more than I can give you."; +TXT_RPLY1_SCRIPT10_d34868_TEACH = "Teach me what you can."; +TXT_RYES1_SCRIPT10_d34868_ALLRI = "All right, here's some pointers."; +TXT_RNO1_SCRIPT10_d34868_NOTRI = "Not right now."; +TXT_DLG_SCRIPT10_d36384_WHATI = "What is it you need? I hope that you're giving the order a taste of the kind of pain that we have been feeling for years."; +TXT_RPLY0_SCRIPT10_d36384_SOMEA = "Some ammo."; +TXT_RYES0_SCRIPT10_d36384_THERE = "There you go, don't waste it."; +TXT_RNO0_SCRIPT10_d36384_YOUVE = "You've got enough ammo."; +TXT_RPLY1_SCRIPT10_d36384_TEACH = "Teach me."; +TXT_RYES1_SCRIPT10_d36384_AFEWM = "A few more lessons and you'll know all that I can teach."; +TXT_RNO1_SCRIPT10_d36384_YOURE = "You're not ready yet."; +TXT_DLG_SCRIPT10_d37900_ICANT = "I can't believe that we're still around, you and I. There's just too many of us that have passed since the beginning. What can I do for you friend?"; +TXT_RPLY0_SCRIPT10_d37900_IMOUT = "I'm out of bullets."; +TXT_RYES0_SCRIPT10_d37900_HEREU = "Here, use them to keep you in good health."; +TXT_RNO0_SCRIPT10_d37900_YOUHA = "You have enough."; +TXT_RPLY1_SCRIPT10_d37900_TEACH = "Teach me."; +TXT_RYES1_SCRIPT10_d37900_WELLT = "Well, that's it, you're done. I can teach no more."; +TXT_RNO1_SCRIPT10_d37900_RETUR = "Return after Macil tells you it's time."; +TXT_DLG_SCRIPT10_d39416_IVETA = "I've taught you everything I can right now. I've given you all that you should ever need, unless you're out of bullets. Those I can still help you with."; +TXT_RPLY0_SCRIPT10_d39416_YESIA = "Yes I am."; +TXT_RYES0_SCRIPT10_d39416_HEREY = "Here you go. "; +TXT_DLG_SCRIPT10_d40932_CHECK = "Check out what's new, the teleporter beacon. When you use the beacon, we'll track the signal and send help. Is there something I can get you?"; +TXT_RPLY0_SCRIPT10_d40932_BOXOF = "Box of rockets"; +TXT_RYES0_SCRIPT10_d40932_THERE = "There you go."; +TXT_RNO0_SCRIPT10_d40932_YOUCA = "You can't afford that!"; +TXT_RPLY1_SCRIPT10_d40932_HEGRE = "H-e grenades."; +TXT_RYES1_SCRIPT10_d40932_HEREY = "Here you go."; +TXT_RNO1_SCRIPT10_d40932_COMEB = "Come back when you have enough money."; +TXT_RPLY2_SCRIPT10_d40932_ENERG = "Energy pod"; +TXT_RYES2_SCRIPT10_d40932_HERES = "Here's your energy pod"; +TXT_RNO2_SCRIPT10_d40932_YOUDO = "You don't have enough for that."; +TXT_RPLY3_SCRIPT10_d40932_TELEP = "Teleporter beacon"; +TXT_RYES3_SCRIPT10_d40932_HELPW = "Help, when and where you need it."; +TXT_RNO3_SCRIPT10_d40932_SORRY = "Sorry, no charity."; +TXT_DLG_SCRIPT10_d42448_NOWTH = "Now that we actually have the castle under control, we have to be extra vigilant to keep it. The order's probably getting ready to strike back right now."; +TXT_DLG_SCRIPT10_d43964_BECAR = "Be careful out there."; +TXT_DLG_SCRIPT10_d45480_KEEPU = "Keep up the great work, we couldn't have done it without you."; +TXT_DLG_SCRIPT10_d46996_WHATI = "What is the wisdom you seek?"; +TXT_RPLY0_SCRIPT10_d46996_THESI = "The Sigil of the One God."; +TXT_RYES0_SCRIPT10_d46996_THERE = "The remaining pieces lie wrapped in the arms in darkness."; +TXT_DLG_SCRIPT10_d48512_THESE = "The second piece of the Sigil lies at the heart of the crimson and obsidian tower. Be warned, there the dragon awaits you. The time of your coming has been foretold. Seek the tower, your prize lies within."; +TXT_RPLY0_SCRIPT10_d48512_WHATA = "What about the other pieces?"; +TXT_RYES0_SCRIPT10_d48512_RETUR = "Return after you have bested the dragon."; +TXT_DLG_SCRIPT10_d50028_HEY = "Hey."; +TXT_RPLY0_SCRIPT10_d50028_STUFF = "Stuff"; +TXT_RYES0_SCRIPT10_d50028_HEREY = "Here you go."; +TXT_DLG_SCRIPT10_d51544_HEY = "Hey."; + TXT_DLG_SCRIPT11_d0_IMTHE = "I'm the keymaster."; -TXT_DLG_SCRIPT11_d1516_ALOTO = "A LOT OF PEOPLE WOULD SAY THIS IS A THANKLESS AND INSIGNIFICANT JOB. BUT IT'S NOT, IN FACT..."; -TXT_RPLY0_SCRIPT11_d1516_GIVEM = "GIVE ME THE KEY!"; -TXT_DLG_SCRIPT11_d3032_OKBUT = "OK, BUT REMEMBER, I'M THE KEYMASTER."; -TXT_RPLY0_SCRIPT11_d3032_OKPAL = "OK PAL, WHATEVER."; +TXT_DLG_SCRIPT11_d1516_ALOTO = "A lot of people would say this is a thankless and insignificant job. But it's not, in fact..."; +TXT_RPLY0_SCRIPT11_d1516_GIVEM = "Give me the key!"; +TXT_DLG_SCRIPT11_d3032_OKBUT = "Ok, but remember, I'm the keymaster."; +TXT_RPLY0_SCRIPT11_d3032_OKPAL = "Ok pal, whatever."; TXT_DLG_SCRIPT11_d4548_IMTHE = "I'm the keymaster."; -TXT_DLG_SCRIPT11_d6064_DIETR = "DIE TRAITOR!"; -TXT_DLG_SCRIPT11_d7580_DIETR = "DIE TRAITOR!"; -TXT_DLG_SCRIPT11_d9096_HAVEY = "HAVE YOU COME TO GLOAT? EVEN THOUGH WE'RE BEHIND THESE BARS, AS LONG AS WE HOLD ON, YOU STILL LOSE."; -TXT_DLG_SCRIPT11_d10612_LETUS = "LET US OUT OF HERE!"; -TXT_DLG_SCRIPT11_d12128_LEAVE = "LEAVE ME ALONE!"; - -TXT_DLG_SCRIPT12_d0_WHATI = "WHAT IS THE WISDOM YOU SEEK, SIMPLE ONE?"; -TXT_RPLY0_SCRIPT12_d0_THESI = "THE SIGIL OF THE ONE GOD."; -TXT_DLG_SCRIPT12_d1516_IFEEL = "I FEEL ONE FRAGMENT RESONATE WITHIN YOU. THE SECOND LIES AT THE HEART OF THE CRIMSON AND OBSIDIAN TOWER. THERE YOU MUST COMBAT THE BISHOP, WHO IS AWARE, AND AWAITS YOU. YOU WILL FIND HIM BY FOLLOWING HIS SYMBOL OF POWER. TAKE THIS TOKEN TO THE KEYMASTER. RETURN TO ME AFTER YOU HAVE SLAIN THE BEAST."; -TXT_RPLY0_SCRIPT12_d1516_ILLBE = "I'LL BE BACK."; -TXT_DLG_SCRIPT12_d3032_ALTHO = "ALTHOUGH THE BISHOP IS FORMIDABLE, THIS QUEST IS SLIGHT. RETURN TO ME WHEN YOU POSSESS THE NEXT FRAGMENT."; +TXT_DLG_SCRIPT11_d6064_DIETR = "Die traitor!"; +TXT_DLG_SCRIPT11_d7580_DIETR = "Die traitor!"; +TXT_DLG_SCRIPT11_d9096_HAVEY = "Have you come to gloat? Even though we're behind these bars, as long as we hold on, you still lose."; +TXT_DLG_SCRIPT11_d10612_LETUS = "Let us out of here!"; +TXT_DLG_SCRIPT11_d12128_LEAVE = "Leave me alone!"; + +TXT_DLG_SCRIPT12_d0_WHATI = "What is the wisdom you seek, simple one?"; +TXT_RPLY0_SCRIPT12_d0_THESI = "The Sigil of the One God."; +TXT_DLG_SCRIPT12_d1516_IFEEL = "I feel one fragment resonate within you. The second lies at the heart of the crimson and obsidian tower. There you must combat the Bishop, who is aware, and awaits you. You will find him by following his symbol of power. Take this token to the keymaster. Return to me after you have slain the beast."; +TXT_RPLY0_SCRIPT12_d1516_ILLBE = "I'll be back."; +TXT_DLG_SCRIPT12_d3032_ALTHO = "Although the Bishop is formidable, this quest is slight. Return to me when you possess the next fragment."; TXT_DLG_SCRIPT12_d4548_YOURN = "Your next challenge will test your spirit. The third piece is held by your own leader. He is the same as that which he sends you to kill."; -TXT_RPLY0_SCRIPT12_d4548_MACIL = "MACIL? A TRAITOR?"; +TXT_RPLY0_SCRIPT12_d4548_MACIL = "Macil? A traitor?"; TXT_DLG_SCRIPT12_d6064_YOURB = "Your blind faith has allowed him to advance to his goals with each piece you gain. Confront him and resolve your fate."; -TXT_RPLY0_SCRIPT12_d6064_ALLRI = "ALL RIGHT, IT IS MACIL."; -TXT_RPLY1_SCRIPT12_d6064_ITSYO = "IT'S YOU I DON'T TRUST."; -TXT_DLG_SCRIPT12_d7580_WHATE = "Whatever choice you make your kind shall perish under the will of the one god."; -TXT_RPLY0_SCRIPT12_d7580_ILLBE = "I'LL BE BACK WHEN MACIL'S DEAD."; -TXT_RPLY1_SCRIPT12_d7580_ICANT = "I CAN'T LET THAT HAPPEN."; -TXT_DLG_SCRIPT12_d9096_THERI = "THE RIVER OF TIME MOVES FOREVER ONWARD, WHILE YOU STAND STILL."; -TXT_DLG_SCRIPT12_d10612_YOUHA = "You have cut the cancer from your body, but your heart still beats. Next you must find the surgeon who butchers and controls your people, The LoreMaster. Stop him, and the next piece will be yours."; -TXT_RPLY0_SCRIPT12_d10612_WHERE = "WHERE DO I FIND HIM?"; -TXT_DLG_SCRIPT12_d12128_USETH = "Use the Teleporter behind the door I just opened to reach The LoreMaster. When he is dead, use the same device to return to me."; -TXT_RPLY0_SCRIPT12_d12128_ILLBE = "I'LL BE BACK, WITH HIS PIECE!"; -TXT_DLG_SCRIPT12_d13644_THERI = "THE RIVER OF TIME MOVES FOREVER ONWARD, WHILE YOU STAND STILL."; -TXT_DLG_SCRIPT12_d15160_PITIF = "Pitiful man, you have done what thousands have failed to do... you bring me the power of the SIGIL, the voice of the one God."; -TXT_RPLY0_SCRIPT12_d15160_IDONT = "I DON'T UNDERSTAND."; -TXT_DLG_SCRIPT12_d16676_THESI = "The SIGIL will open the door and free the spirit which will cleanse this planet and let me live forever. I will strip this world of its energies and find new worlds to conquer."; -TXT_RPLY0_SCRIPT12_d16676_ICANT = "I CAN'T LET YOU DO THAT."; -TXT_DLG_SCRIPT12_d18192_YOUCA = "YOU CAN IF YOU'RE DEAD."; -TXT_DLG_SCRIPT12_d19708_THESE = "THE SECOND PIECE OF THE SIGIL LIES AT THE HEART OF THE CRIMSON AND OBSIDIAN TOWER. BE WARNED, THERE THE DRAGON AWAITS YOU. THE TIME OF YOUR COMING HAS BEEN FORETOLD. SEEK THE TOWER, YOUR PRIZE LIES WITHIN."; -TXT_RPLY0_SCRIPT12_d19708_WHATA = "WHAT ABOUT THE OTHER PIECES?"; -TXT_RYES0_SCRIPT12_d19708_RETUR = "RETURN AFTER YOU HAVE BESTED THE DRAGON."; -TXT_DLG_SCRIPT12_d21224_HAVEY = "HAVE YOU BRAVED THE FURY OF THE DRAGON?"; -TXT_RPLY0_SCRIPT12_d21224_YES = "YES."; -TXT_RYES0_SCRIPT12_d21224_THENE = "THE NEXT CHALLENGE MAY PROVE YOUR GREATEST."; -TXT_RNO0_SCRIPT12_d21224_DONOT = "DO NOT RETURN UNTIL YOUR TASK IS FINISHED."; -TXT_RPLY1_SCRIPT12_d21224_NOIHA = "NO, I HAVEN'T"; -TXT_RYES1_SCRIPT12_d21224_SEEKT = "SEEK THE CRIMSON AND OBSIDIAN TOWER."; -TXT_DLG_SCRIPT12_d22740_THETH = "THE THIRD PIECE LIES AT THE HEART OF YOUR OWN. THE UNKNOWING BETRAYAL OF YOUR PEOPLE SHOULD CEASE BEFORE YOUR ACTIONS DESTROY THEM."; -TXT_RPLY0_SCRIPT12_d22740_WHATA = "WHAT ARE YOU TALKING ABOUT?"; -TXT_RYES0_SCRIPT12_d22740_YOUAR = "YOU ARE A SIMPLE PAWN IN THIS GAME."; -TXT_DLG_SCRIPT12_d24256_THETH = "THE THIRD PIECE IS HELD BY YOUR OWN LEADER, MACIL. HE IS THE SAME AS THAT WHICH HE SENDS YOU TO KILL. YOUR UNWAVERING FAITH HAS ALLOWED HIM TO STEP CLOSER TO COMPLETING HIS GOALS WITH EACH PIECE YOU WIN. HE MUST BE DESTROYED BEFORE HE IS ABLE TO OBTAIN ALL THE PIECES."; -TXT_RPLY0_SCRIPT12_d24256_WHATI = "WHAT IF HE GETS THEM ALL?"; -TXT_RYES0_SCRIPT12_d24256_THENH = "THEN HE WILL SHED HIS CLOAK OF LIES AND REVEAL HIS TRUE FACE."; -TXT_DLG_SCRIPT12_d25772_HEAND = "HE AND I, LIKE THE OTHERS, ARE THE LAST OF A RACE THAT USED TO RULE THIS WORLD. THEY CHOOSE TO USE THEIR POWER AGAINST HUMANS, I USE MINE TO HELP THEM. WITHOUT YOUR PEOPLE WE COULD NOT SURVIVE."; -TXT_RPLY0_SCRIPT12_d25772_WHYSH = "WHY SHOULD I TRUST YOU?"; -TXT_RYES0_SCRIPT12_d25772_BECAU = "BECAUSE I AM SPEAKING THE TRUTH."; -TXT_DLG_SCRIPT12_d27288_WREST = "WREST FROM MACIL, HIS SIGIL PIECE. RETURN WITH IT HERE AND I WILL GRANT YOU THE SAME REWARD AS HE. YOU MAY KEEP BOTH THE SIGIL PIECES AND THE KNOWLEDGE THAT YOU ARE HELPING YOUR PEOPLE INSTEAD OF WORKING TO DESTROY THEM. YOU MUST CHOOSE, I CANNOT LET YOU DEPART IF YOU STILL BELONG TO HIM."; -TXT_RPLY0_SCRIPT12_d27288_ALLRI = "ALL RIGHT, I'M IN."; -TXT_RYES0_SCRIPT12_d27288_RETUR = "RETURN HERE WHEN HE'S DEAD."; -TXT_RPLY1_SCRIPT12_d27288_IDONT = "I DON'T BELIEVE YOU."; -TXT_RYES1_SCRIPT12_d27288_THENY = "THEN YOU MUST DIE!"; -TXT_DLG_SCRIPT12_d28804_HAVEY = "HAVE YOU DESTROYED THE BETRAYER?"; -TXT_RPLY0_SCRIPT12_d28804_YESMA = "YES, MACIL IS GONE."; -TXT_RYES0_SCRIPT12_d28804_HERES = "HERE'S YOUR REWARD."; -TXT_RNO0_SCRIPT12_d28804_YOUMU = "YOU MUST FIRST ELIMINATE MACIL."; -TXT_DLG_SCRIPT12_d30320_NOWTH = "NOW THAT YOU HAVE CLEANSED THE POISON FROM YOUR PEOPLE, YOUR JOURNEY ON THE PATH TO FREEDOM CAN CONTINUE UNBURDENED. HERE ARE YOUR REWARDS, AS PROMISED TO YOU. RETURN TO YOUR FRIENDS TO REDEEM THEM. THE FUTURE HOLDS GREATER DANGER, BUT ALSO GREATER REWARDS."; -TXT_RPLY0_SCRIPT12_d30320_WHATS = "WHAT SORT OF REWARDS."; -TXT_RYES0_SCRIPT12_d30320_FREED = "FREEDOM AND PEACE."; -TXT_DLG_SCRIPT12_d31836_REWAR = "REWARDS THAT DWARF ALL THOSE THAT HAVE COME BEFORE. WITH NO LEADER, YOUR MOVEMENT MAY FLOUNDER. THE FAITH OF YOUR PEOPLE, WHICH YOU ONCE STRODE UPON TO VICTORY, HAS BEEN AS BADLY BATTERED AS THEIR PHYSICAL FORMS. THEY NEED YOUR REASSURANCE AND SUPPORT."; -TXT_RPLY0_SCRIPT12_d31836_HOWDO = "HOW DO YOU FIGURE THAT?"; -TXT_RYES0_SCRIPT12_d31836_YOUAR = "YOU ARE THE ONE WHO EXPOSED THE FRAUD AND WHO HOLDS THE SIGIL PIECES."; -TXT_DLG_SCRIPT12_d33352_THERE = "THE RESTORATION OF FAITH SHOULD BEGIN WITH THE RETRIEVAL OF THE THIRD PIECE. THE DARKEST HEART OF MY PEOPLE CLINGS TO THIS PIECE, ONE WHO REVELS IN SUBVERTING YOUR RACE AND REJOICES IN THE DEGRADATION OF THOSE WHO REFUSE TO JOIN HIM."; -TXT_RPLY0_SCRIPT12_d33352_WHERE = "WHERE CAN I FIND HIM?"; -TXT_RYES0_SCRIPT12_d33352_HENEV = "HE NEVER LEAVES HIS LABORATORIES ON THE OTHER SIDE OF THE FACTORY."; -TXT_DLG_SCRIPT12_d34868_THEUN = "THE UNFORTUNATE TRUTH IS WHAT LIES BETWEEN HE AND YOU. THE ORDER'S GREATEST CONCENTRATION OF FORCES INCLUDING, WHERE THEY ARE BUILT, BRED, AND WORSHIP. YOU MUST FIND YOUR WAY THROUGH THIS MAZE, FIND AND DESTROY THE LORE MASTER. BRING HIS PIECE BACK TO ME AND I WILL REWARD YOU."; -TXT_RPLY0_SCRIPT12_d34868_HOWAB = "HOW ABOUT SOME HELP?"; -TXT_RYES0_SCRIPT12_d34868_IWILL = "I WILL BE WITH YOU."; -TXT_DLG_SCRIPT12_d36384_THERE = "THERE ARE WAYS FOR ME TO COMMUNICATE WITH YOU, THERE ARE THOSE WITH MINDS WEAKER THAN MOST, I WILL SPEAK TO YOU THROUGH THEM. LOOK FOR THE FIRST OF THESE IN THE ORDER'S TOWN. THAT IS ALL I MAY DO RIGHT NOW."; -TXT_RPLY0_SCRIPT12_d36384_HOWWI = "HOW WILL I KNOW WHERE TO LOOK?"; -TXT_RYES0_SCRIPT12_d36384_NEART = "NEAR THE WATER FALL."; -TXT_DLG_SCRIPT12_d37900_HAVEY = "HAVE YOU DESTROYED THE LORE MASTER?"; -TXT_RPLY0_SCRIPT12_d37900_YESHE = "YES, HE'S GONE."; -TXT_RYES0_SCRIPT12_d37900_YOURR = "YOUR REWARDS CANNOT DO JUSTICE FOR THIS ACCOMPLISHMENT."; -TXT_RNO0_SCRIPT12_d37900_YOUMU = "YOU MUST FINISH HIM FIRST."; -TXT_RPLY1_SCRIPT12_d37900_NOIHA = "NO I HAVEN'T KILLED HIM, YET."; -TXT_RYES1_SCRIPT12_d37900_THEND = "THEN DO NOT RETURN UNTIL THAT IS DONE."; -TXT_DLG_SCRIPT12_d39416_ICANN = "I CANNOT THANK YOU ENOUGH, NOW I SHALL WIELD ALL THE POWER OF THE ONE GOD AND USE IT TO CRUSH YOU AND YOUR ENTIRE RACE."; -TXT_RPLY0_SCRIPT12_d39416_WHATA = "WHAT ABOUT PEACE AND goodwill?"; -TXT_RYES0_SCRIPT12_d39416_IDIOT = "IDIOT, THERE CAN BE NO PEACE AS LONG AS THE ONE GOD EXISTS!"; -TXT_DLG_SCRIPT12_d40932_ITCRE = "IT CREATED US TO HELP REAP THIS PLANETS ENERGIES AND FREE IT AND OURSELVES FROM THIS MISERABLE PIT. IT EXISTS, AND NOW I SHALL TAKE ITS PLACE AND RULE THIS WORLD! THE SIGIL WILL OPEN THE DOOR, AND WHEN I FINISH, I WILL HAVE EARNED MY OWN FREEDOM!"; -TXT_RPLY0_SCRIPT12_d40932_ICANT = "I CAN'T LET YOU DO THIS."; -TXT_RYES0_SCRIPT12_d40932_TRYAN = "TRY AND STOP ME PITIFUL MEAT BEING!"; - -TXT_DLG_SCRIPT14_d0_AREYO = "ARE YOU HERE TO FREE US? BECAUSE I'VE BEEN GOOD, THEY TOOK MY IMPLANT OUT. I STILL HAVE TO STAY DOWN HERE AND WIPE UP THE DROOL THOUGH."; -TXT_RPLY0_SCRIPT14_d0_YESIM = "YES, I'M HERE TO FREE YOU."; -TXT_RYES0_SCRIPT14_d0_YOUME = "YOU MEAN IT?"; -TXT_DLG_SCRIPT14_d1516_ICANT = "I CAN'T HELP NOBODY ELSE. NOT UNTIL YOU BLOW UP THE TRANSMITTER. THAT'S WHAT'S BEHIND THE FORCEFIELD UPSTAIRS. MY JOB IS TO CHECK ON THE CONVEYORS TO MAKE SURE THEY AREN'T JAMMED. NOT ANYMORE!"; -TXT_RPLY0_SCRIPT14_d1516_THATS = "THAT'S RIGHT, YOU'RE SAVED!"; -TXT_RYES0_SCRIPT14_d1516_OHTHA = "OH, THANK YOU!"; -TXT_DLG_SCRIPT14_d3032_WEREF = "WE'RE FREE!! WE'RE FREE!! WE'RE FREE!!"; -TXT_DLG_SCRIPT14_d4548_MUSTM = "MUST MINE MORE ORE!"; -TXT_DLG_SCRIPT14_d6064_WEREF = "WE'RE FREE!! WE'RE FREE!! WE'RE FREE!!"; -TXT_DLG_SCRIPT14_d7580_MUSTM = "MUST MINE MORE ORE!"; -TXT_DLG_SCRIPT14_d9096_WEREF = "WE'RE FREE!! WE'RE FREE!! WE'RE FREE!!"; -TXT_DLG_SCRIPT14_d10612_MUSTM = "MUST MINE MORE ORE!"; -TXT_DLG_SCRIPT14_d12128_WEREF = "WE'RE FREE!! WE'RE FREE!! WE'RE FREE!!"; - -TXT_DLG_SCRIPT15_d0_WHATA = "WHAT ARE YOU DOING HERE?"; -TXT_RPLY0_SCRIPT15_d0_ROUTI = "ROUTINE INSPECTION."; -TXT_RYES0_SCRIPT15_d0_ALLRI = "ALL RIGHT, CARRY ON."; -TXT_DLG_SCRIPT15_d1516_NOTHI = "NOTHING TO REPORT HERE. EVERYTHING IS WORKING FINE. IF ANYTHING GOES WRONG, I'LL BE SURE TO REPORT IT."; -TXT_DLG_SCRIPT15_d3032_SIRTH = "SIR, THERE WAS A PROBLEM EARLIER, BUT IT WAS TAKEN CARE OF."; - +TXT_RPLY0_SCRIPT12_d6064_ALLRI = "All right, it is Macil."; +TXT_RPLY1_SCRIPT12_d6064_ITSYO = "It's you I don't trust."; +TXT_DLG_SCRIPT12_d7580_WHATE = "Whatever choice you make your kind shall perish under the will of the One God."; +TXT_RPLY0_SCRIPT12_d7580_ILLBE = "I'll be back when Macil's dead."; +TXT_RPLY1_SCRIPT12_d7580_ICANT = "I can't let that happen."; +TXT_DLG_SCRIPT12_d9096_THERI = "The river of time moves forever onward, while you stand still."; +TXT_DLG_SCRIPT12_d10612_YOUHA = "You have cut the cancer from your body, but your heart still beats. Next you must find the surgeon who butchers and controls your people, the Loremaster. Stop him, and the next piece will be yours."; +TXT_RPLY0_SCRIPT12_d10612_WHERE = "Where do I find him?"; +TXT_DLG_SCRIPT12_d12128_USETH = "Use the teleporter behind the door I just opened to reach the Loremaster. When he is dead, use the same device to return to me."; +TXT_RPLY0_SCRIPT12_d12128_ILLBE = "I'll be back, with his piece!"; +TXT_DLG_SCRIPT12_d13644_THERI = "The river of time moves forever onward, while you stand still."; +TXT_DLG_SCRIPT12_d15160_PITIF = "Pitiful man, you have done what thousands have failed to do... You bring me the power of the Sigil, the voice of the One God."; +TXT_RPLY0_SCRIPT12_d15160_IDONT = "I don't understand."; +TXT_DLG_SCRIPT12_d16676_THESI = "The Sigil will open the door and free the spirit which will cleanse this planet and let me live forever. I will strip this world of its energies and find new worlds to conquer."; +TXT_RPLY0_SCRIPT12_d16676_ICANT = "I can't let you do that."; +TXT_DLG_SCRIPT12_d18192_YOUCA = "You can if you're dead."; +TXT_DLG_SCRIPT12_d19708_THESE = "The second piece of the Sigil lies at the heart of the crimson and obsidian tower. Be warned, there the dragon awaits you. The time of your coming has been foretold. Seek the tower, your prize lies within."; +TXT_RPLY0_SCRIPT12_d19708_WHATA = "What about the other pieces?"; +TXT_RYES0_SCRIPT12_d19708_RETUR = "Return after you have bested the dragon."; +TXT_DLG_SCRIPT12_d21224_HAVEY = "Have you braved the fury of the dragon?"; +TXT_RPLY0_SCRIPT12_d21224_YES = "Yes."; +TXT_RYES0_SCRIPT12_d21224_THENE = "The next challenge may prove your greatest."; +TXT_RNO0_SCRIPT12_d21224_DONOT = "Do not return until your task is finished."; +TXT_RPLY1_SCRIPT12_d21224_NOIHA = "No, I haven't"; +TXT_RYES1_SCRIPT12_d21224_SEEKT = "Seek the crimson and obsidian tower."; +TXT_DLG_SCRIPT12_d22740_THETH = "The third piece lies at the heart of your own. The unknowing betrayal of your people should cease before your actions destroy them."; +TXT_RPLY0_SCRIPT12_d22740_WHATA = "What are you talking about?"; +TXT_RYES0_SCRIPT12_d22740_YOUAR = "You are a simple pawn in this game."; +TXT_DLG_SCRIPT12_d24256_THETH = "The third piece is held by your own leader, Macil. He is the same as that which he sends you to kill. Your unwavering faith has allowed him to step closer to completing his goals with each piece you win. He must be destroyed before he is able to obtain all the pieces."; +TXT_RPLY0_SCRIPT12_d24256_WHATI = "What if he gets them all?"; +TXT_RYES0_SCRIPT12_d24256_THENH = "Then he will shed his cloak of lies and reveal his true face."; +TXT_DLG_SCRIPT12_d25772_HEAND = "He and I, like the others, are the last of a race that used to rule this world. They choose to use their power against humans, I use mine to help them. Without your people we could not survive."; +TXT_RPLY0_SCRIPT12_d25772_WHYSH = "Why should I trust you?"; +TXT_RYES0_SCRIPT12_d25772_BECAU = "Because I am speaking the truth."; +TXT_DLG_SCRIPT12_d27288_WREST = "Wrest from Macil, his Sigil piece. Return with it here and I will grant you the same reward as he. You may keep both the Sigil pieces and the knowledge that you are helping your people instead of working to destroy them. You must choose, I cannot let you depart if you still belong to him."; +TXT_RPLY0_SCRIPT12_d27288_ALLRI = "All right, I'm in."; +TXT_RYES0_SCRIPT12_d27288_RETUR = "Return here when he's dead."; +TXT_RPLY1_SCRIPT12_d27288_IDONT = "I don't believe you."; +TXT_RYES1_SCRIPT12_d27288_THENY = "Then you must die!"; +TXT_DLG_SCRIPT12_d28804_HAVEY = "Have you destroyed the betrayer?"; +TXT_RPLY0_SCRIPT12_d28804_YESMA = "Yes, Macil is gone."; +TXT_RYES0_SCRIPT12_d28804_HERES = "Here's your reward."; +TXT_RNO0_SCRIPT12_d28804_YOUMU = "You must first eliminate Macil."; +TXT_DLG_SCRIPT12_d30320_NOWTH = "Now that you have cleansed the poison from your people, your journey on the path to freedom can continue unburdened. Here are your rewards, as promised to you. Return to your friends to redeem them. The future holds greater danger, but also greater rewards."; +TXT_RPLY0_SCRIPT12_d30320_WHATS = "What sort of rewards."; +TXT_RYES0_SCRIPT12_d30320_FREED = "Freedom and peace."; +TXT_DLG_SCRIPT12_d31836_REWAR = "Rewards that dwarf all those that have come before. With no leader, your movement may flounder. The faith of your people, which you once strode upon to victory, has been as badly battered as their physical forms. They need your reassurance and support."; +TXT_RPLY0_SCRIPT12_d31836_HOWDO = "How do you figure that?"; +TXT_RYES0_SCRIPT12_d31836_YOUAR = "You are the one who exposed the fraud and who holds the Sigil pieces."; +TXT_DLG_SCRIPT12_d33352_THERE = "The restoration of faith should begin with the retrieval of the third piece. The darkest heart of my people clings to this piece, one who revels in subverting your race and rejoices in the degradation of those who refuse to join him."; +TXT_RPLY0_SCRIPT12_d33352_WHERE = "Where can I find him?"; +TXT_RYES0_SCRIPT12_d33352_HENEV = "He never leaves his laboratories on the other side of the factory."; +TXT_DLG_SCRIPT12_d34868_THEUN = "The unfortunate truth is what lies between he and you. The order's greatest concentration of forces including, where they are built, bred, and worship. You must find your way through this maze, find and destroy the lore master. Bring his piece back to me and I will reward you."; +TXT_RPLY0_SCRIPT12_d34868_HOWAB = "How about some help?"; +TXT_RYES0_SCRIPT12_d34868_IWILL = "I will be with you."; +TXT_DLG_SCRIPT12_d36384_THERE = "There are ways for me to communicate with you, there are those with minds weaker than most, I will speak to you through them. Look for the first of these in the order's town. That is all I may do right now."; +TXT_RPLY0_SCRIPT12_d36384_HOWWI = "How will I know where to look?"; +TXT_RYES0_SCRIPT12_d36384_NEART = "Near the water fall."; +TXT_DLG_SCRIPT12_d37900_HAVEY = "Have you destroyed the lore master?"; +TXT_RPLY0_SCRIPT12_d37900_YESHE = "Yes, he's gone."; +TXT_RYES0_SCRIPT12_d37900_YOURR = "Your rewards cannot do justice for this accomplishment."; +TXT_RNO0_SCRIPT12_d37900_YOUMU = "You must finish him first."; +TXT_RPLY1_SCRIPT12_d37900_NOIHA = "No I haven't killed him, yet."; +TXT_RYES1_SCRIPT12_d37900_THEND = "Then do not return until that is done."; +TXT_DLG_SCRIPT12_d39416_ICANN = "I cannot thank you enough, now I shall wield all the power of the One God and use it to crush you and your entire race."; +TXT_RPLY0_SCRIPT12_d39416_WHATA = "What about peace and goodwill?"; +TXT_RYES0_SCRIPT12_d39416_IDIOT = "Idiot, there can be no peace as long as the One God exists!"; +TXT_DLG_SCRIPT12_d40932_ITCRE = "It created us to help reap this planets energies and free it and ourselves from this miserable pit. It exists, and now I shall take its place and rule this world! The Sigil will open the door, and when I finish, I will have earned my own freedom!"; +TXT_RPLY0_SCRIPT12_d40932_ICANT = "I can't let you do this."; +TXT_RYES0_SCRIPT12_d40932_TRYAN = "Try and stop me pitiful meat being!"; + +TXT_DLG_SCRIPT14_d0_AREYO = "Are you here to free us? Because I've been good, they took my implant out. I still have to stay down here and wipe up the drool though."; +TXT_RPLY0_SCRIPT14_d0_YESIM = "Yes, I'm here to free you."; +TXT_RYES0_SCRIPT14_d0_YOUME = "You mean it?"; +TXT_DLG_SCRIPT14_d1516_ICANT = "I can't help nobody else. Not until you blow up the transmitter. That's what's behind the forcefield upstairs. My job is to check on the conveyors to make sure they aren't jammed. Not anymore!"; +TXT_RPLY0_SCRIPT14_d1516_THATS = "That's right, you're saved!"; +TXT_RYES0_SCRIPT14_d1516_OHTHA = "Oh, thank you!"; +TXT_DLG_SCRIPT14_d3032_WEREF = "We're free!! We're free!! We're free!!"; +TXT_DLG_SCRIPT14_d4548_MUSTM = "Must mine more ore!"; +TXT_DLG_SCRIPT14_d6064_WEREF = "We're free!! We're free!! We're free!!"; +TXT_DLG_SCRIPT14_d7580_MUSTM = "Must mine more ore!"; +TXT_DLG_SCRIPT14_d9096_WEREF = "We're free!! We're free!! We're free!!"; +TXT_DLG_SCRIPT14_d10612_MUSTM = "Must mine more ore!"; +TXT_DLG_SCRIPT14_d12128_WEREF = "We're free!! We're free!! We're free!!"; + +TXT_DLG_SCRIPT15_d0_WHATA = "What are you doing here?"; +TXT_RPLY0_SCRIPT15_d0_ROUTI = "Routine inspection."; +TXT_RYES0_SCRIPT15_d0_ALLRI = "All right, carry on."; +TXT_DLG_SCRIPT15_d1516_NOTHI = "Nothing to report here. Everything is working fine. If anything goes wrong, I'll be sure to report it."; +TXT_DLG_SCRIPT15_d3032_SIRTH = "Sir, there was a problem earlier, but it was taken care of."; + TXT_DLG_SCRIPT17_d0_MOVEA = "Move along or taste metal."; -TXT_DLG_SCRIPT17_d1516_IDCHE = "I.D. check."; -TXT_RPLY0_SCRIPT17_d1516_HEREI = "HERE, I'M IN A HURRY."; -TXT_DLG_SCRIPT17_d3032_STOPW = "Stop waving your ID in my face and go in."; -TXT_DLG_SCRIPT17_d4548_NOTHI = "NOTHING TO SEE HERE. MOVE ALONG."; +TXT_DLG_SCRIPT17_d1516_IDCHE = "I.D. Check."; +TXT_RPLY0_SCRIPT17_d1516_HEREI = "Here, I'm in a hurry."; +TXT_DLG_SCRIPT17_d3032_STOPW = "Stop waving your id in my face and go in."; +TXT_DLG_SCRIPT17_d4548_NOTHI = "Nothing to see here. Move along."; TXT_DLG_SCRIPT17_d6064_WHATA = "What a healthy specimen. You don't need my help, do you?"; -TXT_RPLY0_SCRIPT17_d6064_WELLY = "WELL, YES. MACIL SENT ME."; -TXT_DLG_SCRIPT17_d7580_SHHHH = "Shhhh... keep it quiet, unless you want us both killed. Now, what can I do for you?"; -TXT_RPLY0_SCRIPT17_d7580_TELLM = "Tell me how to find The Bishop."; -TXT_DLG_SCRIPT17_d9096_OHHHI = "Ohhh, I knew you would ask me for that. Look behind you. That's the entrance to The Bishop's Citadel. It's guarded by a force field that is only shut off for official visitors, Not you."; -TXT_RPLY0_SCRIPT17_d9096_IMUST = "I must kill The Bishop."; -TXT_DLG_SCRIPT17_d10612_OHSUR = "OH, Sure YOU DO. First, fight your way into the Security Complex and use the Teleporter. And this might be more to your liking, destroy the computer in Central Administration. No computer, no force field."; -TXT_RPLY0_SCRIPT17_d10612_GREAT = "GREAT, THAT SOUNDS EASY."; -TXT_DLG_SCRIPT17_d12128_THERE = "There's an advantage to destroying the Computer, that's where the plans to the Tower are kept. Can you say, Five Finger Discount? HEH HEH!"; -TXT_RPLY0_SCRIPT17_d12128_ANYTH = "ANYTHING ELSE?"; -TXT_DLG_SCRIPT17_d13644_OHWEL = "OH WELL, Word has it that the Bailey's warehouse received a shipment of Maulers, that's the weapon that VAPORIZES."; -TXT_RPLY0_SCRIPT17_d13644_ISTHA = "IS THAT IT, NOW?"; -TXT_DLG_SCRIPT17_d15160_DONTY = "Don't you know the meaning of the words "get lost"?"; -TXT_DLG_SCRIPT17_d16676_TALKT = "TALK TO QUINCY FIRST. I'M NOT ALLOWED TO HELP ANYONE UNLESS HE SAYS IT'S OK."; -TXT_DLG_SCRIPT17_d18192_HOWHO = "HOW HOW CAN I HELP YOU TODAY?"; -TXT_RPLY0_SCRIPT17_d18192_MEDPA = "MED PATCH"; -TXT_RYES0_SCRIPT17_d18192_HERES = "HERE'S YOUR PATCH."; -TXT_RNO0_SCRIPT17_d18192_THATI = "THAT IS 15 GOLD MY FRIEND."; -TXT_RPLY1_SCRIPT17_d18192_MEDIC = "MEDICAL KIT"; -TXT_RYES1_SCRIPT17_d18192_HERES = "HERE'S YOUR MEDICAL KIT."; -TXT_RNO1_SCRIPT17_d18192_YOURE = "YOU'RE A BIT LOW ON FUNDS FOR THAT."; -TXT_RPLY2_SCRIPT17_d18192_FIELD = "FIELD SURGERY KIT"; -TXT_RYES2_SCRIPT17_d18192_ONEFI = "ONE FIELD SURGERY KIT, DONE."; -TXT_RNO2_SCRIPT17_d18192_COMEB = "COME BACK WHEN YOU HAVE MONEY!"; - -TXT_DLG_SCRIPT18_d0_WHATI = "WHAT IS IT?"; -TXT_RPLY0_SCRIPT18_d0_JUSTL = "JUST LOOKING AROUND."; -TXT_RYES0_SCRIPT18_d0_JUSTK = "JUST KEEP OUT OF THE WAY."; -TXT_DLG_SCRIPT18_d1516_THETE = "THE TEMPLARS WILL BE HERE SOON TO PICK UP THEIR NEW MAULERS. IF YOU GET IN THEIR WAY YOU'RE A DEAD MAN."; -TXT_RPLY0_SCRIPT18_d1516_MAULE = "MAULERS?"; -TXT_RYES0_SCRIPT18_d1516_THETE = "THE TEMPLAR'S FAVORITE WEAPON."; -TXT_DLG_SCRIPT18_d3032_THEYC = "THEY CAME IN EARLIER. THAT'S WHAT ALL THE SECURITY'S ABOUT. I GOT A CHANCE TO LOOK AT THEM WHEN I LOCKED UP. NOBODY'S SUPPOSED TO GO IN OR OUT OF THERE UNTIL THE REST OF THE PLATOON COMES TO CLAIM THEIR WEAPONS."; - -TXT_DLG_SCRIPT19_d0_THISI = "THIS IS WHERE YOU GET THE PLANS FOR THE CENTRAL ADMINISTRATION."; - -// MAP22 only has scripts in SVE -TXT_DLG_SCRIPT22_d0_IRUNT = "I RUN THIS PLACE. MY JOB IS TO BUILD THE RAW PARTS NEEDED FOR THE LOREMASTER'S ROBOT DESIGNS. IF YOU'RE NOT HERE ON OFFICIAL BUSINESS, THEN I'M AFRAID I DON'T HAVE TIME TO TALK."; -TXT_RPLY0_SCRIPT22_d0_IAMON = "I AM ON OFFICIAL BUSINESS."; -TXT_DLG_SCRIPT22_d1516_SOYOU = "SO YOU'VE SPOKEN WITH TIMOTHY, I SEE. HE AND I HAVE WORKED TOGETHER TO TRY TO UNRAVEL THE MYSTERIES OF THE ORDER, BEFORE IT'S TOO LATE FOR US ALL. MAYBE YOU CAN HELP US. I'VE OPENED THE DOOR TO THE PRODUCTION SECTOR."; -TXT_RPLY0_SCRIPT22_d1516_DOYOU = "DO YOU KNOW WHAT'S INSIDE?"; -TXT_DLG_SCRIPT22_d3032_ITSAT = "IT'S A TOP SECRET AREA. NOT ONLY IS THE ORDER BREEDING SOME KIND OF... CREATURE IN THERE, I'VE SEEN WITH MY OWN EYES A STRANGE ARTIFACT CALLED A "TALISMAN." NOBODY'S ALLOWED NEAR IT. RUMOR IS THAT IT HOLDS GREAT POWER IF UNITED WITH TWO OTHERS OF ITS KIND."; -TXT_RPLY0_SCRIPT22_d3032_ISUPP = "I SUPPOSE YOU WANT THIS THING?"; -TXT_DLG_SCRIPT22_d4548_NOIFY = "NO! IF YOU CAN FIND IT, IT'S YOURS TO KEEP. MAYBE YOU CAN USE IT TO HELP FREE US FROM OUR OPPRESSION. I'D WISH YOU LUCK, BUT YOU'RE GOING TO NEED A LOT MORE THAN THAT IF YOU GO IN THERE..."; -TXT_RPLY0_SCRIPT22_d4548_WHATS = "WHAT'S ALL THIS ABOUT THE PAST?"; -TXT_DLG_SCRIPT22_d6064_YOUVE = "YOU'VE SURELY SEEN THE OTHER RUINS NEARBY. IT SEEMS THAT THE "COMET" WHICH CRASHED ON OUR PLANET IS ACTUALLY A SPACE SHIP, AND BELIEVE IT OR NOT, IT ORIGINATED ON THIS VERY WORLD A LONG TIME AGO."; -TXT_RPLY0_SCRIPT22_d6064_SOTHE = "SO THE SPECTRES, THE ONE GOD..."; -TXT_DLG_SCRIPT22_d7580_THEYA = "THEY ARE CREATURES WHO ONCE RULED THIS WORLD AND ARE BENT ON CONSUMING ITS LIFE. THE ANCIENTS MANAGED TO SEAL THEM AWAY, BUT GAVE THEIR LIVES IN THE PROCESS. I'M AFRAID THAT'S ALL I KNOW."; -TXT_RPLY0_SCRIPT22_d7580_THANK = "THANKS... I'LL DO WHAT I CAN."; -TXT_DLG_SCRIPT22_d9096_GODSP = "GODSPEED, FRIEND."; -TXT_DLG_SCRIPT22_d10612_TALKT = "TALK TO THE MASTER SMITHY IF YOU HAVE QUESTIONS. ALL I DO IS PUT LABELS ON THE CRATES."; - -TXT_DLG_SCRIPT23_d0_WHATC = "WHAT CAN I GET YOU, CITIZEN?"; -TXT_RPLY0_SCRIPT23_d0_AMMOB = "AMMO BOX"; -TXT_RYES0_SCRIPT23_d0_HERES = "HERE'S YOUR AMMO."; -TXT_RNO0_SCRIPT23_d0_YOUDO = "YOU DON'T HAVE ENOUGH FOR THAT!"; -TXT_RPLY1_SCRIPT23_d0_CRATE = "CRATE OF MISSILES"; -TXT_RYES1_SCRIPT23_d0_HEREC = "HERE, CITIZEN."; -TXT_RNO1_SCRIPT23_d0_ITS85 = "IT'S 85 GOLD, CITIZEN!"; -TXT_RPLY2_SCRIPT23_d0_HEGRE = "H-E GRENADES"; -TXT_RYES2_SCRIPT23_d0_HEREA = "HERE ARE YOUR GRENADES."; -TXT_RNO2_SCRIPT23_d0_THEYA = "THEY ARE 100 GOLD, FRIEND."; -TXT_RPLY3_SCRIPT23_d0_ENERG = "ENERGY POD"; -TXT_RYES3_SCRIPT23_d0_HEREY = "HERE YOU ARE."; -TXT_RNO3_SCRIPT23_d0_THATS = "THAT'S 135 GOLD, SORRY."; -TXT_DLG_SCRIPT23_d1516_WHATC = "WHAT CAN I ASSIST YOU WITH?"; -TXT_RPLY0_SCRIPT23_d1516_LEATH = "LEATHER ARMOR"; -TXT_RYES0_SCRIPT23_d1516_HEREI = "HERE IT IS CITIZEN."; -TXT_RNO0_SCRIPT23_d1516_THERE = "THERE'S NO CHARITY GIVEN HERE!"; -TXT_RPLY1_SCRIPT23_d1516_METAL = "METAL ARMOR"; -TXT_RYES1_SCRIPT23_d1516_ANEXC = "AN EXCELLENT CHOICE CITIZEN."; -TXT_RNO1_SCRIPT23_d1516_YOUDO = "YOU DON'T HAVE ENOUGH FOR THIS!"; -TXT_RPLY2_SCRIPT23_d1516_ENVIR = "ENVIRONMENTAL SUIT"; -TXT_RYES2_SCRIPT23_d1516_HEREY = "HERE YOU ARE."; -TXT_RNO2_SCRIPT23_d1516_NOMON = "NO MONEY, NO SUIT."; -TXT_RPLY3_SCRIPT23_d1516_SOMET = "SOMETHING DIFFERENT?"; -TXT_RYES3_SCRIPT23_d1516_GOTHR = "GO THROUGH THE DOOR DOWN THE HALL."; -TXT_RNO3_SCRIPT23_d1516_YOUMU = "YOU MUST PAY IF YOU WANT TO PLAY."; -TXT_DLG_SCRIPT23_d3032_WHATC = "WHAT CAN I GET YOU?"; -TXT_RPLY0_SCRIPT23_d3032_LEATH = "LEATHER ARMOR"; -TXT_RYES0_SCRIPT23_d3032_HEREI = "HERE IT IS CITIZEN."; -TXT_RNO0_SCRIPT23_d3032_THERE = "THERE'S NO CHARITY GIVEN HERE!"; -TXT_RPLY1_SCRIPT23_d3032_METAL = "METAL ARMOR"; -TXT_RYES1_SCRIPT23_d3032_ANEXC = "AN EXCELLENT CHOICE CITIZEN."; -TXT_RNO1_SCRIPT23_d3032_YOUDO = "YOU DON'T HAVE ENOUGH FOR THIS!"; -TXT_RPLY2_SCRIPT23_d3032_ENVIR = "ENVIRONMENTAL SUIT"; -TXT_RYES2_SCRIPT23_d3032_HEREY = "HERE YOU ARE."; -TXT_RNO2_SCRIPT23_d3032_NOMON = "NO MONEY, NO SUIT."; -TXT_DLG_SCRIPT23_d4548_HOWCA = "HOW CAN I HELP YOU TODAY?"; -TXT_RPLY0_SCRIPT23_d4548_MEDPA = "MED PATCH"; -TXT_RYES0_SCRIPT23_d4548_HERES = "HERE'S YOUR PATCH."; -TXT_RNO0_SCRIPT23_d4548_THATI = "THAT IS 15 GOLD MY FRIEND."; -TXT_RPLY1_SCRIPT23_d4548_MEDIC = "MEDICAL KIT"; -TXT_RYES1_SCRIPT23_d4548_HERES = "HERE'S YOUR MEDICAL KIT."; -TXT_RNO1_SCRIPT23_d4548_YOURA = "YOUR A BIT LOW ON FUNDS FOR THAT."; -TXT_RPLY2_SCRIPT23_d4548_FIELD = "FIELD SURGERY KIT"; -TXT_RYES2_SCRIPT23_d4548_ONEFI = "ONE FIELD SURGERY KIT."; -TXT_RNO2_SCRIPT23_d4548_COMEB = "COME BACK WHEN YOU HAVE MONEY!"; -TXT_DLG_SCRIPT23_d6064_HELLO = "HELLO FRIEND, WHAT CAN I GET YOU?"; -TXT_RPLY0_SCRIPT23_d6064_INFOR = "INFORMATION"; -TXT_RYES0_SCRIPT23_d6064_IVENE = "I'VE NEVER SEEN ANYONE GO IN OR OUT OF THE FACTORY, THE FORCEFIELD'S ALWAYS UP."; -TXT_RNO0_SCRIPT23_d6064_NOMON = "NO MONEY, NO INFO."; -TXT_DLG_SCRIPT23_d7580_YESWH = "YES, WHAT WOULD YOU LIKE?"; -TXT_RPLY0_SCRIPT23_d7580_MOREI = "MORE INFO."; -TXT_RYES0_SCRIPT23_d7580_THEFA = "THE FACTORY'S BUILT ON THE COMET'S IMPACT SITE. I DON'T THINK IT'S BY CHANCE."; -TXT_RNO0_SCRIPT23_d7580_COMEO = "COME ON, IT'S A MEASLY 5 GOLD."; -TXT_DLG_SCRIPT23_d9096_HELLO = "HELLO AGAIN, WHAT'LL IT BE?"; -TXT_RPLY0_SCRIPT23_d9096_MOREI = "MORE INFO."; -TXT_RYES0_SCRIPT23_d9096_THEFA = "THE FACTORY CLOSED WHEN THE ORDER UNVEILED IT'S NEW HORROR: THE INQUISITOR."; -TXT_RNO0_SCRIPT23_d9096_5GOLD = "5 GOLD PLEASE."; -TXT_DLG_SCRIPT23_d10612_THATS = "THAT'S ALL I KNOW. EVEN BARTENDERS RUN OUT OF STUFF TO SAY, SORRY."; -TXT_DLG_SCRIPT23_d12128_HELLO = "HELLO."; -TXT_RPLY0_SCRIPT23_d12128_WHATA = "WHAT ARE YOU DOING?"; -TXT_RYES0_SCRIPT23_d12128_IMDOI = "I'M DOING STUFF, GO AWAY!"; -TXT_DLG_SCRIPT23_d13644_NOWWH = "NOW, WHAT CAN I HELP YOU WITH?"; -TXT_RPLY0_SCRIPT23_d13644_SHADO = "SHADOW ARMOR?"; -TXT_RYES0_SCRIPT23_d13644_AHHTO = "AHH, TO BE HEARD, BUT NOT SEEN!"; -TXT_RNO0_SCRIPT23_d13644_GETOU = "GET OUT OF HERE, COME BACK WHEN YOU HAVE SOME CASH."; -TXT_DLG_SCRIPT23_d15160_THANK = "Thank deus you got here. To enter the Factory you need a Key. We stole it but our agent is missing in the web of catacombs under the Order's stronghold. I have sent ten good men into those tunnels to find him, and none have returned. SOMETHING is down there!"; +TXT_RPLY0_SCRIPT17_d6064_WELLY = "Well, yes. Macil sent me."; +TXT_DLG_SCRIPT17_d7580_SHHHH = "Shhhh... Keep it quiet, unless you want us both killed. Now, what can I do for you?"; +TXT_RPLY0_SCRIPT17_d7580_TELLM = "Tell me how to find the Bishop."; +TXT_DLG_SCRIPT17_d9096_OHHHI = "Ohhh, I knew you would ask me for that. Look behind you. That's the entrance to the Bishop's citadel. It's guarded by a force field that is only shut off for official visitors, not you."; +TXT_RPLY0_SCRIPT17_d9096_IMUST = "I must kill the Bishop."; +TXT_DLG_SCRIPT17_d10612_OHSUR = "Oh, sure you do. First, fight your way into the security complex and use the teleporter. And this might be more to your liking, destroy the computer in central administration. No computer, no force field."; +TXT_RPLY0_SCRIPT17_d10612_GREAT = "Great, that sounds easy."; +TXT_DLG_SCRIPT17_d12128_THERE = "There's an advantage to destroying the computer, that's where the plans to the tower are kept. Can you say, five finger discount? Heh heh!"; +TXT_RPLY0_SCRIPT17_d12128_ANYTH = "Anything else?"; +TXT_DLG_SCRIPT17_d13644_OHWEL = "Oh well, word has it that the bailey's warehouse received a shipment of maulers, that's the weapon that vaporizes."; +TXT_RPLY0_SCRIPT17_d13644_ISTHA = "Is that it, now?"; +TXT_DLG_SCRIPT17_d15160_DONTY = "Don't you know the meaning of the words "Get lost"?"; +TXT_DLG_SCRIPT17_d16676_TALKT = "Talk to quincy first. I'm not allowed to help anyone unless he says it's ok."; +TXT_DLG_SCRIPT17_d18192_HOWHO = "How how can I help you today?"; +TXT_RPLY0_SCRIPT17_d18192_MEDPA = "Med patch"; +TXT_RYES0_SCRIPT17_d18192_HERES = "Here's your patch."; +TXT_RNO0_SCRIPT17_d18192_THATI = "That is 15 gold my friend."; +TXT_RPLY1_SCRIPT17_d18192_MEDIC = "Medical kit"; +TXT_RYES1_SCRIPT17_d18192_HERES = "Here's your medical kit."; +TXT_RNO1_SCRIPT17_d18192_YOURE = "You're a bit low on funds for that."; +TXT_RPLY2_SCRIPT17_d18192_FIELD = "Field surgery kit"; +TXT_RYES2_SCRIPT17_d18192_ONEFI = "One field surgery kit, done."; +TXT_RNO2_SCRIPT17_d18192_COMEB = "Come back when you have money!"; + +TXT_DLG_SCRIPT18_d0_WHATI = "What is it?"; +TXT_RPLY0_SCRIPT18_d0_JUSTL = "Just looking around."; +TXT_RYES0_SCRIPT18_d0_JUSTK = "Just keep out of the way."; +TXT_DLG_SCRIPT18_d1516_THETE = "The templars will be here soon to pick up their new maulers. If you get in their way you're a dead man."; +TXT_RPLY0_SCRIPT18_d1516_MAULE = "Maulers?"; +TXT_RYES0_SCRIPT18_d1516_THETE = "The templar's favorite weapon."; +TXT_DLG_SCRIPT18_d3032_THEYC = "They came in earlier. That's what all the security's about. I got a chance to look at them when I locked up. Nobody's supposed to go in or out of there until the rest of the platoon comes to claim their weapons."; + +TXT_DLG_SCRIPT19_d0_THISI = "This is where you get the plans for the central administration."; + +// MAP22 only has scripts in SVE +TXT_DLG_SCRIPT22_d0_IRUNT = "I run this place. My job is to build the raw parts needed for the Loremaster's robot designs. If you're not here on official business, then I'm afraid I don't have time to talk."; +TXT_RPLY0_SCRIPT22_d0_IAMON = "I am on official business."; +TXT_DLG_SCRIPT22_d1516_SOYOU = "So you've spoken with timothy, I see. He and I have worked together to try to unravel the mysteries of the order, before it's too late for us all. Maybe you can help us. I've opened the door to the production sector."; +TXT_RPLY0_SCRIPT22_d1516_DOYOU = "Do you know what's inside?"; +TXT_DLG_SCRIPT22_d3032_ITSAT = "It's a top secret area. Not only is the order breeding some kind of... Creature in there, I've seen with my own eyes a strange artifact called a "Talisman." nobody's allowed near it. Rumor is that it holds great power if united with two others of its kind."; +TXT_RPLY0_SCRIPT22_d3032_ISUPP = "I suppose you want this thing?"; +TXT_DLG_SCRIPT22_d4548_NOIFY = "No! If you can find it, it's yours to keep. Maybe you can use it to help free us from our oppression. I'd wish you luck, but you're going to need a lot more than that if you go in there..."; +TXT_RPLY0_SCRIPT22_d4548_WHATS = "What's all this about the past?"; +TXT_DLG_SCRIPT22_d6064_YOUVE = "You've surely seen the other ruins nearby. It seems that the "Comet" which crashed on our planet is actually a space ship, and believe it or not, it originated on this very world a long time ago."; +TXT_RPLY0_SCRIPT22_d6064_SOTHE = "So the spectres, the One God..."; +TXT_DLG_SCRIPT22_d7580_THEYA = "They are creatures who once ruled this world and are bent on consuming its life. The ancients managed to seal them away, but gave their lives in the process. I'm afraid that's all I know."; +TXT_RPLY0_SCRIPT22_d7580_THANK = "Thanks... I'll do what I can."; +TXT_DLG_SCRIPT22_d9096_GODSP = "Godspeed, friend."; +TXT_DLG_SCRIPT22_d10612_TALKT = "Talk to the master smithy if you have questions. All I do is put labels on the crates."; + +TXT_DLG_SCRIPT23_d0_WHATC = "What can I get you, citizen?"; +TXT_RPLY0_SCRIPT23_d0_AMMOB = "Ammo box"; +TXT_RYES0_SCRIPT23_d0_HERES = "Here's your ammo."; +TXT_RNO0_SCRIPT23_d0_YOUDO = "You don't have enough for that!"; +TXT_RPLY1_SCRIPT23_d0_CRATE = "Crate of missiles"; +TXT_RYES1_SCRIPT23_d0_HEREC = "Here, citizen."; +TXT_RNO1_SCRIPT23_d0_ITS85 = "It's 85 gold, citizen!"; +TXT_RPLY2_SCRIPT23_d0_HEGRE = "H-e grenades"; +TXT_RYES2_SCRIPT23_d0_HEREA = "Here are your grenades."; +TXT_RNO2_SCRIPT23_d0_THEYA = "They are 100 gold, friend."; +TXT_RPLY3_SCRIPT23_d0_ENERG = "Energy pod"; +TXT_RYES3_SCRIPT23_d0_HEREY = "Here you are."; +TXT_RNO3_SCRIPT23_d0_THATS = "That's 135 gold, sorry."; +TXT_DLG_SCRIPT23_d1516_WHATC = "What can I assist you with?"; +TXT_RPLY0_SCRIPT23_d1516_LEATH = "Leather armor"; +TXT_RYES0_SCRIPT23_d1516_HEREI = "Here it is citizen."; +TXT_RNO0_SCRIPT23_d1516_THERE = "There's no charity given here!"; +TXT_RPLY1_SCRIPT23_d1516_METAL = "Metal armor"; +TXT_RYES1_SCRIPT23_d1516_ANEXC = "An excellent choice citizen."; +TXT_RNO1_SCRIPT23_d1516_YOUDO = "You don't have enough for this!"; +TXT_RPLY2_SCRIPT23_d1516_ENVIR = "Environmental suit"; +TXT_RYES2_SCRIPT23_d1516_HEREY = "Here you are."; +TXT_RNO2_SCRIPT23_d1516_NOMON = "No money, no suit."; +TXT_RPLY3_SCRIPT23_d1516_SOMET = "Something different?"; +TXT_RYES3_SCRIPT23_d1516_GOTHR = "Go through the door down the hall."; +TXT_RNO3_SCRIPT23_d1516_YOUMU = "You must pay if you want to play."; +TXT_DLG_SCRIPT23_d3032_WHATC = "What can I get you?"; +TXT_RPLY0_SCRIPT23_d3032_LEATH = "Leather armor"; +TXT_RYES0_SCRIPT23_d3032_HEREI = "Here it is citizen."; +TXT_RNO0_SCRIPT23_d3032_THERE = "There's no charity given here!"; +TXT_RPLY1_SCRIPT23_d3032_METAL = "Metal armor"; +TXT_RYES1_SCRIPT23_d3032_ANEXC = "An excellent choice citizen."; +TXT_RNO1_SCRIPT23_d3032_YOUDO = "You don't have enough for this!"; +TXT_RPLY2_SCRIPT23_d3032_ENVIR = "Environmental suit"; +TXT_RYES2_SCRIPT23_d3032_HEREY = "Here you are."; +TXT_RNO2_SCRIPT23_d3032_NOMON = "No money, no suit."; +TXT_DLG_SCRIPT23_d4548_HOWCA = "How can I help you today?"; +TXT_RPLY0_SCRIPT23_d4548_MEDPA = "Med patch"; +TXT_RYES0_SCRIPT23_d4548_HERES = "Here's your patch."; +TXT_RNO0_SCRIPT23_d4548_THATI = "That is 15 gold my friend."; +TXT_RPLY1_SCRIPT23_d4548_MEDIC = "Medical kit"; +TXT_RYES1_SCRIPT23_d4548_HERES = "Here's your medical kit."; +TXT_RNO1_SCRIPT23_d4548_YOURA = "Your a bit low on funds for that."; +TXT_RPLY2_SCRIPT23_d4548_FIELD = "Field surgery kit"; +TXT_RYES2_SCRIPT23_d4548_ONEFI = "One field surgery kit."; +TXT_RNO2_SCRIPT23_d4548_COMEB = "Come back when you have money!"; +TXT_DLG_SCRIPT23_d6064_HELLO = "Hello friend, what can I get you?"; +TXT_RPLY0_SCRIPT23_d6064_INFOR = "Information"; +TXT_RYES0_SCRIPT23_d6064_IVENE = "I've never seen anyone go in or out of the factory, the forcefield's always up."; +TXT_RNO0_SCRIPT23_d6064_NOMON = "No money, no info."; +TXT_DLG_SCRIPT23_d7580_YESWH = "Yes, what would you like?"; +TXT_RPLY0_SCRIPT23_d7580_MOREI = "More info."; +TXT_RYES0_SCRIPT23_d7580_THEFA = "The factory's built on the comet's impact site. I don't think it's by chance."; +TXT_RNO0_SCRIPT23_d7580_COMEO = "Come on, it's a measly 5 gold."; +TXT_DLG_SCRIPT23_d9096_HELLO = "Hello again, what'll it be?"; +TXT_RPLY0_SCRIPT23_d9096_MOREI = "More info."; +TXT_RYES0_SCRIPT23_d9096_THEFA = "The factory closed when the order unveiled it's new horror: the inquisitor."; +TXT_RNO0_SCRIPT23_d9096_5GOLD = "5 gold please."; +TXT_DLG_SCRIPT23_d10612_THATS = "That's all I know. Even bartenders run out of stuff to say, sorry."; +TXT_DLG_SCRIPT23_d12128_HELLO = "Hello."; +TXT_RPLY0_SCRIPT23_d12128_WHATA = "What are you doing?"; +TXT_RYES0_SCRIPT23_d12128_IMDOI = "I'm doing stuff, go away!"; +TXT_DLG_SCRIPT23_d13644_NOWWH = "Now, what can I help you with?"; +TXT_RPLY0_SCRIPT23_d13644_SHADO = "Shadow armor?"; +TXT_RYES0_SCRIPT23_d13644_AHHTO = "Ahh, to be heard, but not seen!"; +TXT_RNO0_SCRIPT23_d13644_GETOU = "Get out of here, come back when you have some cash."; +TXT_DLG_SCRIPT23_d15160_THANK = "Thank deus you got here. To enter the factory you need a key. We stole it but our agent is missing in the web of catacombs under the order's stronghold. I have sent ten good men into those tunnels to find him, and none have returned. Something is down there!"; TXT_RPLY0_SCRIPT23_d15160_WHATI = "What is it? Human or... ?"; -TXT_DLG_SCRIPT23_d16676_NOTDE = "NOT. Definitely NOT. Whatever it is, YOU must fight it to retrieve the key. I'll open the catacombs' entrance. When you've got it, the Factory is next to the mines. Hurry, each second counts."; -TXT_RPLY0_SCRIPT23_d16676_SOMET = "SOMETHING INHUMAN, EH?, GREAT."; -TXT_DLG_SCRIPT23_d18192_YOURE = "You're wasting time AND lives! Move!"; - -// New/moved content from SVE: -TXT_DLG_SCRIPT23_d10612_CANIB = "CAN I BE OF MORE HELP?"; -TXT_RPLY0_SCRIPT23_d10612_MOREI = "MORE INFO."; -TXT_RYES0_SCRIPT23_d10612_LOOKF = "LOOK FOR TIMOTHY. I'VE HEARD HE KNOWS SOME OF THE ORDER'S SECRETS."; -TXT_RNO0_SCRIPT23_d10612_JUSTA = "JUST ANOTHER 5 GOLD."; -TXT_DLG_SCRIPT23_d12128_THATS = "THAT'S ALL I KNOW. EVEN BARTENDERS RUN OUT OF STUFF TO SAY, SORRY."; -TXT_DLG_SCRIPT23_d13644_HELLO = "HELLO."; -TXT_RPLY0_SCRIPT23_d13644_WHATA = "WHAT ARE YOU DOING?"; -TXT_RYES0_SCRIPT23_d13644_IMDOI = "I'M DOING STUFF, GO AWAY!"; -TXT_DLG_SCRIPT23_d15160_IFYOU = "IF YOU HAVE THIS MUCH TIME TO WASTE, SEE IF YOU CAN FIND THE BLUE CHALICE. MY STUDIES ON THE ORDER SUGGEST THEY HAVE HIDDEN IT SOMEWHERE IN THE MANUFACTURING SECTOR OF THE FACTORY. THIS ARTIFACT WOULD BE OF GREAT VALUE TO ME, SO, BRING IT TO ME, AND I'LL HELP YOU OUT."; -TXT_DLG_SCRIPT23_d16676_YOUFO = "YOU FOUND THE BLUE CHALICE! OK, GIVE IT TO ME FIRST, AND WE'LL TRADE."; -TXT_RPLY0_SCRIPT23_d16676_TAKEI = "TAKE IT, IT'S BAD LUCK ANYWAY."; -TXT_RPLY1_SCRIPT23_d16676_SCREW = "SCREW YOU, I'M KEEPING IT."; -TXT_RYES1_SCRIPT23_d16676_THENI = "THEN I'M NOT GIVING YOU ANYTHING. GET LOST!"; -TXT_DLG_SCRIPT23_d18192_LOCAT = "LOCATE THE FORGE. THE INFORMATION I JUST GAVE YOU SHOULD HELP YOU ENTER A SECRETIVE SECTOR OF THE FACTORY. ONE OF THE FORGE WORKERS CAN OPEN THE DOOR."; -TXT_RPLY0_SCRIPT23_d18192_WHATC = "WHAT CAN I FIND THERE?"; -TXT_DLG_SCRIPT23_d19708_MYRES = "MY RESEARCH SUGGESTS THAT SOME DARK POWER FROM THE ANCIENT PAST IS HIDDEN THERE. BE CAREFUL!"; -TXT_DLG_SCRIPT23_d21224_THATB = "THAT BLUE CHALICE, HOW'D YOU COME BY IT? I'VE BEEN RESEARCHING THE ORDER AND THEIR LINKS TO THE DISTANT PAST, AND THAT ARTIFACT WOULD HELP ME. LET'S MAKE A DEAL. GIVE ME THE CHALICE, AND I'LL GIVE YOU SOME INFO."; -TXT_RPLY0_SCRIPT23_d21224_TAKEI = "TAKE IT, IT'S BAD LUCK ANYWAY."; -TXT_RPLY1_SCRIPT23_d21224_SCREW = "SCREW YOU, I'M KEEPING IT."; -TXT_RYES1_SCRIPT23_d21224_THENI = "THEN I'M NOT GIVING YOU ANYTHING. GET LOST!"; -TXT_DLG_SCRIPT23_d22740_NOWWH = "NOW, WHAT CAN I HELP YOU WITH?"; -TXT_RPLY0_SCRIPT23_d22740_SHADO = "SHADOW ARMOR?"; -TXT_RYES0_SCRIPT23_d22740_AHHTO = "AHH, TO BE HEARD, BUT NOT SEEN!"; -TXT_RNO0_SCRIPT23_d22740_GETOU = "GET OUT OF HERE, COME BACK WHEN YOU HAVE SOME CASH."; -TXT_DLG_SCRIPT23_d24256_THANK = "Thank deus you got here. To enter the Factory you need a Key. We stole it but our agent is missing in the web of catacombs under the Order's stronghold. I have sent ten good men into those tunnels to find him, and none have returned. SOMETHING is down there!"; +TXT_DLG_SCRIPT23_d16676_NOTDE = "Not. Definitely not. Whatever it is, you must fight it to retrieve the key. I'll open the catacombs' entrance. When you've got it, the factory is next to the mines. Hurry, each second counts."; +TXT_RPLY0_SCRIPT23_d16676_SOMET = "Something inhuman, eh?, great."; +TXT_DLG_SCRIPT23_d18192_YOURE = "You're wasting time and lives! Move!"; + +// New/moved content from SVE: +TXT_DLG_SCRIPT23_d10612_CANIB = "Can I be of more help?"; +TXT_RPLY0_SCRIPT23_d10612_MOREI = "More info."; +TXT_RYES0_SCRIPT23_d10612_LOOKF = "Look for timothy. I've heard he knows some of the order's secrets."; +TXT_RNO0_SCRIPT23_d10612_JUSTA = "Just another 5 gold."; +TXT_DLG_SCRIPT23_d12128_THATS = "That's all I know. Even bartenders run out of stuff to say, sorry."; +TXT_DLG_SCRIPT23_d13644_HELLO = "Hello."; +TXT_RPLY0_SCRIPT23_d13644_WHATA = "What are you doing?"; +TXT_RYES0_SCRIPT23_d13644_IMDOI = "I'm doing stuff, go away!"; +TXT_DLG_SCRIPT23_d15160_IFYOU = "If you have this much time to waste, see if you can find the blue chalice. My studies on the order suggest they have hidden it somewhere in the manufacturing sector of the factory. This artifact would be of great value to me, so, bring it to me, and I'll help you out."; +TXT_DLG_SCRIPT23_d16676_YOUFO = "You found the blue chalice! Ok, give it to me first, and we'll trade."; +TXT_RPLY0_SCRIPT23_d16676_TAKEI = "Take it, it's bad luck anyway."; +TXT_RPLY1_SCRIPT23_d16676_SCREW = "Screw you, I'm keeping it."; +TXT_RYES1_SCRIPT23_d16676_THENI = "Then I'm not giving you anything. Get lost!"; +TXT_DLG_SCRIPT23_d18192_LOCAT = "Locate the forge. The information I just gave you should help you enter a secretive sector of the factory. One of the forge workers can open the door."; +TXT_RPLY0_SCRIPT23_d18192_WHATC = "What can I find there?"; +TXT_DLG_SCRIPT23_d19708_MYRES = "My research suggests that some dark power from the ancient past is hidden there. Be careful!"; +TXT_DLG_SCRIPT23_d21224_THATB = "That blue chalice, how'd you come by it? I've been researching the order and their links to the distant past, and that artifact would help me. Let's make a deal. Give me the chalice, and I'll give you some info."; +TXT_RPLY0_SCRIPT23_d21224_TAKEI = "Take it, it's bad luck anyway."; +TXT_RPLY1_SCRIPT23_d21224_SCREW = "Screw you, I'm keeping it."; +TXT_RYES1_SCRIPT23_d21224_THENI = "Then I'm not giving you anything. Get lost!"; +TXT_DLG_SCRIPT23_d22740_NOWWH = "Now, what can I help you with?"; +TXT_RPLY0_SCRIPT23_d22740_SHADO = "Shadow armor?"; +TXT_RYES0_SCRIPT23_d22740_AHHTO = "Ahh, to be heard, but not seen!"; +TXT_RNO0_SCRIPT23_d22740_GETOU = "Get out of here, come back when you have some cash."; +TXT_DLG_SCRIPT23_d24256_THANK = "Thank deus you got here. To enter the factory you need a key. We stole it but our agent is missing in the web of catacombs under the order's stronghold. I have sent ten good men into those tunnels to find him, and none have returned. Something is down there!"; TXT_RPLY0_SCRIPT23_d24256_WHATI = "What is it? Human or... ?"; -TXT_DLG_SCRIPT23_d25772_NOTDE = "NOT. Definitely NOT. Whatever it is, YOU must fight it to retrieve the key. I'll open the catacombs' entrance. When you've got it, the Factory is next to the mines. Hurry, each second counts."; -TXT_RPLY0_SCRIPT23_d25772_SOMET = "SOMETHING INHUMAN, EH?, GREAT."; -TXT_DLG_SCRIPT23_d27288_YOURE = "You're wasting time AND lives! Move!"; - -TXT_DLG_SCRIPT27_d0_THEMA = "THE MASTER DOESN'T LIKE VISITORS. HE LIKES ALL OF HIS WORK TO REMAIN UNDISTURBED. I'VE GOT TO GO GET FRESH PARTS FROM THE STORAGE ROOM. I THINK HE SAID A LEG AND AN ARM. OH, WELL NO TIME TO TALK ANYMORE. I'D LEAVE BEFORE HE FINDS YOU."; -TXT_RPLY0_SCRIPT27_d0_WHYST = "WHY'S THAT."; -TXT_RYES0_SCRIPT27_d0_BECAU = "BECAUSE, I TOLD YOU HE DOESN'T LIKE VISITORS!"; -TXT_DLG_SCRIPT27_d1516_YOUKN = "YOU KNOW, YOU'RE ABOUT THE RIGHT SIZE FOR ONE OF THE ACOLYTE'S UNIFORMS."; - -TXT_DLG_SCRIPT31_d0_OHNOI = "OH NO, I'M NOT THE REAL PROGRAMMER, HE'S HIDING. CONTINUE PAST THE GUARD TRAINING AREA, VERY TOUGH. IF YOU SURVIVE, YOU MIGHT BE ABLE TO TALK TO HIM. OR KILL HIM."; -TXT_RPLY0_SCRIPT31_d0_WHOAR = "WHO ARE YOU?"; -TXT_DLG_SCRIPT31_d1516_YOULL = "YOU'LL NEVER FIND ANYTHING IF YOU HANG AROUND HERE."; - -TXT_DLG_SCRIPT32_d0_PISSO = "PISS OFF PEASANT!"; -TXT_DLG_SCRIPT32_d1516_DIELI = "DIE LITTLE MAN!"; -TXT_DLG_SCRIPT32_d3032_FINAL = "FINALLY I CAN GET OUT OF THIS CELL."; -TXT_RPLY0_SCRIPT32_d3032_WHYAR = "WHY ARE YOU IN HERE?"; -TXT_RYES0_SCRIPT32_d3032_IWASF = "I WAS FRAMED."; -TXT_DLG_SCRIPT32_d4548_HARRI = "HARRIS SAID THAT I WAS PLOTTING TO KILL THE GOVERNOR. I WOULD NEVER HARM A SOUL."; - -TXT_DLG_SCRIPT33_d0_BECAR = "BE CAREFUL OUT THERE."; -TXT_DLG_SCRIPT33_d1516_SAYFR = "SAY FRIEND, I'LL HELP YOU, IF YOU HELP ME. GIVE ME 5 GOLD AND I'LL TELL YOU WHAT I KNOW."; -TXT_RPLY0_SCRIPT33_d1516_HERES = "HERE'S THE GOLD."; -TXT_RYES0_SCRIPT33_d1516_IFYOU = "IF YOU PUNCH SOMEONE, YOU WON'T SET OFF THE ALARMS."; -TXT_RNO0_SCRIPT33_d1516_IWONT = "I WON'T TELL YOU ANYTHING FOR FREE!"; -TXT_DLG_SCRIPT33_d3032_IVEAL = "I'VE ALREADY TOLD YOU WHAT I KNOW."; -TXT_DLG_SCRIPT33_d4548_HELLO = "HELLO FRIEND. WHAT CAN I GET FOR YOU?"; -TXT_RPLY0_SCRIPT33_d4548_ELECT = "ELECTRIC BOLTS"; -TXT_RYES0_SCRIPT33_d4548_ONEQU = "ONE QUARREL IT IS."; -TXT_RNO0_SCRIPT33_d4548_YOURE = "YOU'RE BROKE!"; -TXT_RPLY1_SCRIPT33_d4548_10ROU = "10 ROUND CLIP"; -TXT_RYES1_SCRIPT33_d4548_HERES = "HERE'S YOUR AMMO"; -TXT_RNO1_SCRIPT33_d4548_SORRY = "SORRY, NO MONEY, NO BULLETS."; -TXT_RPLY2_SCRIPT33_d4548_50ROU = "50 ROUND BOX"; -TXT_RYES2_SCRIPT33_d4548_HEREY = "HERE YOU GO"; -TXT_RNO2_SCRIPT33_d4548_YOUDO = "YOU DON'T HAVE ENOUGH GOLD!"; -TXT_RPLY3_SCRIPT33_d4548_AMMOS = "AMMO SATCHEL"; -TXT_RYES3_SCRIPT33_d4548_THANK = "THANK YOU, ANYTHING ELSE?"; -TXT_RNO3_SCRIPT33_d4548_YOUCA = "YOU CAN'T AFFORD THAT, GOOD DAY."; -TXT_DLG_SCRIPT33_d6064_WELCO = "WELCOME. WHAT MAY I SHOW YOU?"; -TXT_RPLY0_SCRIPT33_d6064_ENVIR = "ENVIRONMENTAL SUIT"; -TXT_RYES0_SCRIPT33_d6064_HEREY = "HERE YOU ARE."; -TXT_RNO0_SCRIPT33_d6064_YOUDO = "YOU DON'T HAVE ENOUGH MONEY FOR THAT."; -TXT_RPLY1_SCRIPT33_d6064_LEATH = "LEATHER ARMOR."; -TXT_RYES1_SCRIPT33_d6064_HEREY = "HERE YOU ARE."; -TXT_RNO1_SCRIPT33_d6064_PERHA = "PERHAPS SOME OTHER TIME?"; -TXT_RPLY2_SCRIPT33_d6064_METAL = "METAL ARMOR"; -TXT_RYES2_SCRIPT33_d6064_WEARI = "WEAR IT IN GOOD HEALTH."; -TXT_RNO2_SCRIPT33_d6064_COMEB = "COME BACK WHEN YOU CAN AFFORD IT."; -TXT_DLG_SCRIPT33_d7580_HOWMA = "HOW MAY I ASSIST YOU?"; -TXT_RPLY0_SCRIPT33_d7580_MEDPA = "MED PATCH"; -TXT_RYES0_SCRIPT33_d7580_HERES = "HERE'S YOUR PATCH KIT."; -TXT_RNO0_SCRIPT33_d7580_YOUNE = "YOU NEED 10 GOLD FOR THAT."; -TXT_RPLY1_SCRIPT33_d7580_FIELD = "FIELD SURGERY KIT"; -TXT_RYES1_SCRIPT33_d7580_THANK = "THANK YOU."; -TXT_RNO1_SCRIPT33_d7580_IWISH = "I WISH I COULD GIVE THEM AWAY, BUT THEY COST 25 GOLD."; -TXT_RPLY2_SCRIPT33_d7580_HEALI = "HEALING"; -TXT_RYES2_SCRIPT33_d7580_THERE = "THERE YOU GO. TAKE CARE NOW."; -TXT_RNO2_SCRIPT33_d7580_WELLM = "WELL, MAYBE YOU CAN AFFORD SOME MED PATCHES?"; -TXT_DLG_SCRIPT33_d9096_HELLO = "HELLO FRIEND, I HAVEN'T SEEN YOU AROUND HERE BEFORE. ALL I CAN SAY IS THAT I'D BE CAREFUL IF I WERE YOU, THERE'S A LOT GOING ON AND IT'S BETTER IF YOU DON'T GET IN THE WAY."; -TXT_RPLY0_SCRIPT33_d9096_INFOR = "INFORMATION"; -TXT_RYES0_SCRIPT33_d9096_THESE = "THE SEWERS HOLD MORE THAN JUST RATS AND ROBOTS."; -TXT_RNO0_SCRIPT33_d9096_HEYAG = "HEY A GUY'S GOT TO MAKE SOME MONEY. YOU THINK THESE JOKERS TIP WELL?"; -TXT_DLG_SCRIPT33_d10612_BACKA = "BACK AGAIN HUH? WELL, AT LEAST YOU KNOW ENOUGH TO KEEP YOUR OWN SKIN INTACT. WHAT CAN I DO FOR YOU NOW?"; -TXT_RPLY0_SCRIPT33_d10612_MOREI = "MORE INFO"; -TXT_RYES0_SCRIPT33_d10612_THEGO = "THE GOVERNOR IS A SIMPLE REMINDER OF THE ORDER'S INFLUENCE."; -TXT_RNO0_SCRIPT33_d10612_COMEB = "COME BACK IF YOU CHANGE YOUR MIND."; -TXT_DLG_SCRIPT33_d12128_WELLY = "WELL, YOU'RE SURE ASKING A LOT OF QUESTIONS FOR SOMEONE WHO'S LIVED THIS LONG. THAT'S OK THOUGH, I'D RATHER TALK TO SOMEONE LIKE YOU THAN MOST OF THIS LOT."; -TXT_RPLY0_SCRIPT33_d12128_MOREI = "MORE INFO."; -TXT_RYES0_SCRIPT33_d12128_THERE = "THERE'S MORE TO THE ORDER THAN WHAT GOES ON AROUND HERE."; -TXT_RNO0_SCRIPT33_d12128_COMEB = "COME BACK IF YOU CHANGE YOUR MIND."; -TXT_DLG_SCRIPT33_d13644_THATS = "THAT'S IT FRIEND, THE WELL OF KNOWLEDGE HAS BEEN TAPPED. I'VE TOLD YOU MORE THAN I SHOULD HAVE ANYWAY."; -TXT_DLG_SCRIPT33_d15160_HARDT = "HARD TO SHOP FOR NEW TOYS... WHEN YOU'RE BROKE. RUN A LITTLE ERRAND FOR ME AND YOU'LL GET MORE THAN YOU COULD EVER SPEND. I'LL MAKE YOU A RICH MAN."; -TXT_RPLY0_SCRIPT33_d15160_IGOTN = "I GOT NOTHING BETTER TO DO."; -TXT_RPLY1_SCRIPT33_d15160_NOTHA = "NO THANKS."; -TXT_RYES1_SCRIPT33_d15160_NOBOD = "NOBODY WALKS AWAY FROM ME!"; -TXT_DLG_SCRIPT33_d16676_GOODC = "GOOD CHOICE. THE ORDER'S SANCTUARY BY THE RIVER IS THEIR UNOFFICIAL TORTURE CHAMBER. HIDDEN INSIDE THERE'S A GOLDEN CHALICE. YOU SWIPE IT, YOU MEET ME AT THE TAVERN, AND REAP YOUR REWARD."; -TXT_RPLY0_SCRIPT33_d16676_HOWAM = "HOW AM I SUPPOSED TO DO THAT?"; -TXT_RPLY1_SCRIPT33_d16676_LETME = "LET ME THINK ABOUT IT."; -TXT_RYES1_SCRIPT33_d16676_SORRY = "SORRY, NO SECOND CHANCES. OH, GUARDS, KILL HIM!"; -TXT_DLG_SCRIPT33_d18192_HERES = "HERE'S A CROSSBOW, JUST AIM STRAIGHT AND -- SPLAT!--. REMEMBER, GRAB THE FANCY CUP AND MEET ME AT THE TAVERN."; -TXT_RPLY0_SCRIPT33_d18192_ILLSE = "I'LL SEE YOU THERE."; -TXT_DLG_SCRIPT33_d19708_WHATA = "WHAT ARE YOU WAITING FOR? DON'T WORRY, I'LL CLEAN UP THE BODIES, JUST BRING ME THAT CHALICE!"; -TXT_DLG_SCRIPT33_d21224_GUARD = "GUARDS! KILL THE TRAITOR!"; -TXT_DLG_SCRIPT33_d22740_HEYIK = "HEY, I KNOW WHAT YOU'RE THINKING, KINDA LOOKS LIKE A SETUP, I WOULD NEVER DO THAT TO SUCH A KILLING MACHINE, I MEAN IT. WHEW, ALL THIS FUSS OVER A CUP, WEIRD. NOW GET READY, GOLD AND GLORY, LIKE I PROMISED. TAKE THIS KEY AND THE GOVERNOR HIMSELF WILL REWARD YOU."; -TXT_RPLY0_SCRIPT33_d22740_GREAT = "GREAT, I CAN'T WAIT!"; -TXT_RNO0_SCRIPT33_d22740_NOCHA = "NO CHALICE, NO MONEY!"; -TXT_RPLY1_SCRIPT33_d22740_ILLKE = "I'LL KEEP THE CHALICE, THANKS."; -TXT_RYES1_SCRIPT33_d22740_KEEPI = "KEEP IT? I THINK NOT!"; -TXT_DLG_SCRIPT33_d24256_WHATA = "WHAT ARE YOU WAITING FOR? THE GOVERNOR HIMSELF WILL REWARD YOU."; -TXT_DLG_SCRIPT33_d25772_DIETR = "DIE TRAITOR! "; -TXT_DLG_SCRIPT33_d27288_SOYOU = "SO YOU'RE THE FOOL WHO STOLE THE CHALICE? I'M GOING TO HAVE YOU ARRESTED AS A REBEL THIEF... THEREBY ENHANCING MY POSITION WITH THE ORDER. HOW DOES IT FEEL TO BE AN UNWITTING PAWN? "; -TXT_RPLY0_SCRIPT33_d27288_ITSUC = "IT SUCKS!"; -TXT_RYES0_SCRIPT33_d27288_FORYO = "FOR YOU IT DOES."; -TXT_RPLY1_SCRIPT33_d27288_HARRI = "HARRIS PROMISED ME MONEY!"; -TXT_RYES1_SCRIPT33_d27288_TOOBA = "TOO BAD. THE ONLY THING YOU'RE GETTING IS DEATH!"; -TXT_DLG_SCRIPT33_d28804_WEREG = "WE'RE GOING TO KILL YOU!"; -TXT_DLG_SCRIPT33_d30320_GETOU = "GET OUT OF HERE!"; -TXT_DLG_SCRIPT33_d31836_WEREG = "WE'RE GOING TO KILL YOU!"; -TXT_DLG_SCRIPT33_d33352_GETOU = "GET OUT OF HERE!"; - -TXT_DLG_SCRIPT34_d0_WHATA = "WHAT A PERFECT PLACE FOR US, UNDER THE OLD TOWN HALL. THE ORDER THINKS THEY'VE WIPED US OUT, BUT ALL IT WAS IS A REMINDER TO US OF WHAT CAN HAPPEN WHEN YOU BECOME CARELESS. "; -TXT_DLG_SCRIPT34_d1516_TALKT = "TALK TO MACIL, HE'LL BE ABLE TO HELP YOU."; -TXT_DLG_SCRIPT34_d3032_IVEHE = "I'VE HEARD THAT MACIL'S GOING TO START SOMETHING AGAIN SOON. WE NEED A BIG HIT AFTER THE LAST FIASCO. ONE MORE LIKE THAT AND WE'LL BE TOO WEAK TO CONTINUE."; -TXT_DLG_SCRIPT34_d4548_AFEWO = "A FEW OF THESE BARRELS DUMPED INTO THEIR WATER SUPPLY SHOULD EVEN THE ODDS A LITTLE. "; -TXT_DLG_SCRIPT34_d6064_IMWOR = "I'M WORKING ON SOMETHING THAT WILL GIVE US AN EDGE. IT WILL INCREASE YOUR STAMINA AND COMPLETELY JACK YOU UP. I'VE ALMOST GOT ALL THE BUGS WORKED OUT. CAN I DO SOMETHING FOR YOU? "; -TXT_RPLY0_SCRIPT34_d6064_PATCH = "PATCH ME UP."; -TXT_RYES0_SCRIPT34_d6064_BOYYO = "BOY, YOU'RE A REAL MESS. I'LL SEE WHAT I CAN DO."; -TXT_RPLY1_SCRIPT34_d6064_STAMI = "STAMINA IMPLANT?"; -TXT_RYES1_SCRIPT34_d6064_ALLRI = "ALL RIGHT THIS WON'T TAKE BUT A MOMENT."; -TXT_RNO1_SCRIPT34_d6064_ITSNO = "IT'S NOT DONE YET."; -TXT_DLG_SCRIPT34_d7580_HEYIM = "HEY, I'M WORKING ON AN UPDATED VERSION OF YOUR IMPLANT. IS THERE ANYTHING ELSE I CAN DO?"; -TXT_RPLY0_SCRIPT34_d7580_PATCH = "PATCH ME UP."; -TXT_RYES0_SCRIPT34_d7580_WELLA = "WELL AT LEAST YOU'RE SEEING ACTION."; -TXT_RPLY1_SCRIPT34_d7580_IMPLA = "IMPLANT UPGRADE?"; -TXT_RYES1_SCRIPT34_d7580_GOODT = "GOOD THING, NEVER CAN BE TOO SAFE."; -TXT_RNO1_SCRIPT34_d7580_IMALM = "I'M ALMOST FINISHED, BUT NOT QUITE."; -TXT_DLG_SCRIPT34_d9096_ALLRI = "ALL RIGHT, THIS IS IT. I'VE ALMOST GOT EVERYTHING WORKING PERFECTLY. THERE WERE A FEW PROBLEMS LEFT TO FIX, DO YOU NEED ANYTHING ELSE? "; -TXT_RPLY0_SCRIPT34_d9096_PATCH = "PATCH ME UP."; -TXT_RYES0_SCRIPT34_d9096_WHATH = "WHAT HAVE YOU BEEN TRYING TO DO? GO HEAD TO HEAD WITH A CRUSADER?"; -TXT_RPLY1_SCRIPT34_d9096_IMPLA = "IMPLANT UPGRADE?."; -TXT_RYES1_SCRIPT34_d9096_THATS = "THAT SHOULD DO IT FOR YOU."; -TXT_RNO1_SCRIPT34_d9096_LETME = "LET ME RUN SOME MORE TESTS FIRST."; -TXT_DLG_SCRIPT34_d10612_THATS = "THAT'S ALL I CAN DO ON THE IMPLANT RIGHT NOW. MAYBE SOME HEALING?"; -TXT_RPLY0_SCRIPT34_d10612_YEAH = "YEAH."; -TXT_RYES0_SCRIPT34_d10612_BOYYO = "BOY, YOU'RE A REAL MESS. I'LL SEE WHAT I CAN DO."; -TXT_DLG_SCRIPT34_d12128_WHATC = "WHAT CAN I DO FOR YOU?"; -TXT_RPLY0_SCRIPT34_d12128_IMOUT = "I'M OUT OF BULLETS."; -TXT_RYES0_SCRIPT34_d12128_HERES = "HERE'S SOME AMMO FOR YOU. DON'T WASTE IT."; -TXT_RPLY1_SCRIPT34_d12128_TEACH = "TEACH ME."; -TXT_RYES1_SCRIPT34_d12128_ALLRI = "ALL RIGHT, I'LL JUST SHOW YOU A FEW LITTLE POINTERS."; -TXT_RNO1_SCRIPT34_d12128_YOURE = "YOU'RE NOT READY YET."; -TXT_DLG_SCRIPT34_d13644_BACKA = "BACK AGAIN? WHAT DO YOU NEED?"; -TXT_RPLY0_SCRIPT34_d13644_IMOUT = "I'M OUT OF BULLETS."; -TXT_RYES0_SCRIPT34_d13644_HERES = "HERE'S SOME AMMO FOR YOU. DON'T WASTE IT."; -TXT_RNO0_SCRIPT34_d13644_YOUVE = "YOU'VE GOT ENOUGH AMMO."; -TXT_RPLY1_SCRIPT34_d13644_TEACH = "TEACH ME."; -TXT_RYES1_SCRIPT34_d13644_ALLRI = "ALL RIGHT, THIS SHOULD KEEP YOU GOING FOR A WHILE."; -TXT_RNO1_SCRIPT34_d13644_SORRY = "SORRY, CAN'T. I'M JUST FOLLOWING MACIL'S ORDERS."; -TXT_DLG_SCRIPT34_d15160_WELLW = "WELL WHICH IS IT, BULLETS OR TRAINING? I CAN'T WAIT TO GET MY HANDS ON THOSE NEW WEAPONS WE CAPTURED. ONCE I GET DONE WITH THEM, I'LL BE ABLE TO BEGIN TRAINING EVERYONE ELSE."; -TXT_RPLY0_SCRIPT34_d15160_IMOUT = "I'M OUT OF AMMO."; -TXT_RYES0_SCRIPT34_d15160_HERES = "HERE'S SOME AMMO FOR YOU. DON'T WASTE IT."; -TXT_RNO0_SCRIPT34_d15160_YOUVE = "YOU'VE GOT ENOUGH AMMO."; -TXT_RPLY1_SCRIPT34_d15160_TEACH = "TEACH ME."; -TXT_RYES1_SCRIPT34_d15160_OKTAK = "O.K. TAKE WHAT YOU'VE LEARNED AND SHOW THOSE ORDER BASTARDS THE WAY TO HELL."; -TXT_RNO1_SCRIPT34_d15160_COMEB = "COME BACK LATER, WHEN MACIL SAYS IT'S TIME."; -TXT_DLG_SCRIPT34_d16676_IVETA = "I'VE TAUGHT YOU EVERYTHING I CAN RIGHT NOW. GIVE ME SOME TIME TO PUT THE NEW WEAPONS THROUGH THEIR PACES. THAT IS UNLESS YOU'RE OUT OF BULLETS."; -TXT_RPLY0_SCRIPT34_d16676_YESIA = "YES I AM."; -TXT_RYES0_SCRIPT34_d16676_HEREY = "HERE YOU GO."; -TXT_DLG_SCRIPT34_d18192_DONTG = "DON'T GET TRIGGER HAPPY IN THE TOWN, YOU'LL SET OFF THE ALARM AND THEY WILL START SENDING IN GUARDS FROM THE CASTLE."; -TXT_DLG_SCRIPT34_d19708_WELCO = "WELCOME, WE CAN ALWAYS USE MORE HELP."; -TXT_DLG_SCRIPT34_d21224_WHENI = "WHEN I WAS STILL IN ACTION WE HAD THE CHANCE TO EXAMINE AN ACOLYTE BEFORE THE REINFORCEMENTS ARRIVED, THEY'RE NOT HUMAN I TELL YOU."; -TXT_DLG_SCRIPT34_d22740_WERET = "WE'RE TRYING TO FIND WHERE THE CASTLE GATE MECHANISMS ARE, BUT SO FAR WE'VE HAD NO LUCK."; -TXT_DLG_SCRIPT34_d24256_DONTG = "DON'T GET CAUGHT. I'VE HEARD HORROR STORIES ABOUT WHAT THEY DO TO OUR PEOPLE AFTER THEY'RE IMPRISONED. THEY JUST DISAPPEAR, NO TRACES, NOTHING. "; -TXT_DLG_SCRIPT34_d25772_HERES = "HERE'S SOME ADVICE, IF YOU EVER SEE ANY OF THE ORDER'S TIN SOLDIERS, RUN THE OTHER WAY. I ESPECIALLY DON'T LIKE THE REAVERS, THOSE THINGS ARE JUST DAMNED FAST!"; -TXT_DLG_SCRIPT34_d27288_WELCO = "WELCOME TO THE LAST FLICKER OF HOPE. ONLY WE HAVE THE FREE WILL TO OPPOSE THE ORDER. WE HAVE THE SHARPEST SCIENTIFIC MINDS, AND MANY ABLE BODIES. BUT WE LACK THAT ONE REAL PROBLEM SOLVER, WHO WILL GIVE US THE EDGE WE NEED."; -TXT_RPLY0_SCRIPT34_d27288_WHATW = "WHAT WILL I NEED TO DO? "; -TXT_DLG_SCRIPT34_d28804_HELPU = "HELP US. HELP US STEAL THEIR TECHNOLOGY. FREE OUR COMRADES. FIGHT THESE TWISTED PSYCHOPATHS TO THE DEATH. I'M ASKING YOU TO RISK YOUR LIFE FOR THE TRUTH."; -TXT_RPLY0_SCRIPT34_d28804_IMWIT = "I'M WITH YOU!"; -TXT_DLG_SCRIPT34_d30320_GOODB = "GOOD. BLACKBIRD WILL CONTINUE TO BE YOUR GUIDE. SHE'S TAKEN QUITE A SHINE TO YOU. TOGETHER, YOU'VE GOT TO UNLOCK THE SECRETS OF THE ORDER AND THEIR INHUMAN SERVANTS. THERE'S A PRESENCE THAT LURKS JUST OUTSIDE OUR UNDERSTANDING WHICH GUIDES THEIR TERROR. GET INSIDE AND TAKE THEM DOWN. "; -TXT_RPLY0_SCRIPT34_d30320_LETME = "LET ME AT 'EM!"; -TXT_RYES0_SCRIPT34_d30320_THATS = "THAT'S THE SPIRIT."; -TXT_DLG_SCRIPT34_d31836_WELCO = "WELCOME FRIEND!"; +TXT_DLG_SCRIPT23_d25772_NOTDE = "Not. Definitely not. Whatever it is, you must fight it to retrieve the key. I'll open the catacombs' entrance. When you've got it, the factory is next to the mines. Hurry, each second counts."; +TXT_RPLY0_SCRIPT23_d25772_SOMET = "Something inhuman, eh?, great."; +TXT_DLG_SCRIPT23_d27288_YOURE = "You're wasting time and lives! Move!"; + +TXT_DLG_SCRIPT27_d0_THEMA = "The master doesn't like visitors. He likes all of his work to remain undisturbed. I've got to go get fresh parts from the storage room. I think he said a leg and an arm. Oh, well no time to talk anymore. I'd leave before he finds you."; +TXT_RPLY0_SCRIPT27_d0_WHYST = "Why's that."; +TXT_RYES0_SCRIPT27_d0_BECAU = "Because, I told you he doesn't like visitors!"; +TXT_DLG_SCRIPT27_d1516_YOUKN = "You know, you're about the right size for one of the acolyte's uniforms."; + +TXT_DLG_SCRIPT31_d0_OHNOI = "Oh no, I'm not the real Programmer, he's hiding. Continue past the guard training area, very tough. If you survive, you might be able to talk to him. Or kill him."; +TXT_RPLY0_SCRIPT31_d0_WHOAR = "Who are you?"; +TXT_DLG_SCRIPT31_d1516_YOULL = "You'll never find anything if you hang around here."; + +TXT_DLG_SCRIPT32_d0_PISSO = "Piss off peasant!"; +TXT_DLG_SCRIPT32_d1516_DIELI = "Die little man!"; +TXT_DLG_SCRIPT32_d3032_FINAL = "Finally I can get out of this cell."; +TXT_RPLY0_SCRIPT32_d3032_WHYAR = "Why are you in here?"; +TXT_RYES0_SCRIPT32_d3032_IWASF = "I was framed."; +TXT_DLG_SCRIPT32_d4548_HARRI = "Harris said that I was plotting to kill the governor. I would never harm a soul."; + +TXT_DLG_SCRIPT33_d0_BECAR = "Be careful out there."; +TXT_DLG_SCRIPT33_d1516_SAYFR = "Say friend, I'll help you, if you help me. Give me 5 gold and I'll tell you what I know."; +TXT_RPLY0_SCRIPT33_d1516_HERES = "Here's the gold."; +TXT_RYES0_SCRIPT33_d1516_IFYOU = "If you punch someone, you won't set off the alarms."; +TXT_RNO0_SCRIPT33_d1516_IWONT = "I won't tell you anything for free!"; +TXT_DLG_SCRIPT33_d3032_IVEAL = "I've already told you what I know."; +TXT_DLG_SCRIPT33_d4548_HELLO = "Hello friend. What can I get for you?"; +TXT_RPLY0_SCRIPT33_d4548_ELECT = "Electric bolts"; +TXT_RYES0_SCRIPT33_d4548_ONEQU = "One quarrel it is."; +TXT_RNO0_SCRIPT33_d4548_YOURE = "You're broke!"; +TXT_RPLY1_SCRIPT33_d4548_10ROU = "10 round clip"; +TXT_RYES1_SCRIPT33_d4548_HERES = "Here's your ammo"; +TXT_RNO1_SCRIPT33_d4548_SORRY = "Sorry, no money, no bullets."; +TXT_RPLY2_SCRIPT33_d4548_50ROU = "50 round box"; +TXT_RYES2_SCRIPT33_d4548_HEREY = "Here you go"; +TXT_RNO2_SCRIPT33_d4548_YOUDO = "You don't have enough gold!"; +TXT_RPLY3_SCRIPT33_d4548_AMMOS = "Ammo satchel"; +TXT_RYES3_SCRIPT33_d4548_THANK = "Thank you, anything else?"; +TXT_RNO3_SCRIPT33_d4548_YOUCA = "You can't afford that, good day."; +TXT_DLG_SCRIPT33_d6064_WELCO = "Welcome. What may I show you?"; +TXT_RPLY0_SCRIPT33_d6064_ENVIR = "Environmental suit"; +TXT_RYES0_SCRIPT33_d6064_HEREY = "Here you are."; +TXT_RNO0_SCRIPT33_d6064_YOUDO = "You don't have enough money for that."; +TXT_RPLY1_SCRIPT33_d6064_LEATH = "Leather armor."; +TXT_RYES1_SCRIPT33_d6064_HEREY = "Here you are."; +TXT_RNO1_SCRIPT33_d6064_PERHA = "Perhaps some other time?"; +TXT_RPLY2_SCRIPT33_d6064_METAL = "Metal armor"; +TXT_RYES2_SCRIPT33_d6064_WEARI = "Wear it in good health."; +TXT_RNO2_SCRIPT33_d6064_COMEB = "Come back when you can afford it."; +TXT_DLG_SCRIPT33_d7580_HOWMA = "How may I assist you?"; +TXT_RPLY0_SCRIPT33_d7580_MEDPA = "Med patch"; +TXT_RYES0_SCRIPT33_d7580_HERES = "Here's your patch kit."; +TXT_RNO0_SCRIPT33_d7580_YOUNE = "You need 10 gold for that."; +TXT_RPLY1_SCRIPT33_d7580_FIELD = "Field surgery kit"; +TXT_RYES1_SCRIPT33_d7580_THANK = "Thank you."; +TXT_RNO1_SCRIPT33_d7580_IWISH = "I wish I could give them away, but they cost 25 gold."; +TXT_RPLY2_SCRIPT33_d7580_HEALI = "Healing"; +TXT_RYES2_SCRIPT33_d7580_THERE = "There you go. Take care now."; +TXT_RNO2_SCRIPT33_d7580_WELLM = "Well, maybe you can afford some med patches?"; +TXT_DLG_SCRIPT33_d9096_HELLO = "Hello friend, I haven't seen you around here before. All I can say is that I'd be careful if I were you, there's a lot going on and it's better if you don't get in the way."; +TXT_RPLY0_SCRIPT33_d9096_INFOR = "Information"; +TXT_RYES0_SCRIPT33_d9096_THESE = "The sewers hold more than just rats and robots."; +TXT_RNO0_SCRIPT33_d9096_HEYAG = "Hey a guy's got to make some money. You think these jokers tip well?"; +TXT_DLG_SCRIPT33_d10612_BACKA = "Back again huh? Well, at least you know enough to keep your own skin intact. What can I do for you now?"; +TXT_RPLY0_SCRIPT33_d10612_MOREI = "More info"; +TXT_RYES0_SCRIPT33_d10612_THEGO = "The governor is a simple reminder of the order's influence."; +TXT_RNO0_SCRIPT33_d10612_COMEB = "Come back if you change your mind."; +TXT_DLG_SCRIPT33_d12128_WELLY = "Well, you're sure asking a lot of questions for someone who's lived this long. That's ok though, I'd rather talk to someone like you than most of this lot."; +TXT_RPLY0_SCRIPT33_d12128_MOREI = "More info."; +TXT_RYES0_SCRIPT33_d12128_THERE = "There's more to the order than what goes on around here."; +TXT_RNO0_SCRIPT33_d12128_COMEB = "Come back if you change your mind."; +TXT_DLG_SCRIPT33_d13644_THATS = "That's it friend, the well of knowledge has been tapped. I've told you more than I should have anyway."; +TXT_DLG_SCRIPT33_d15160_HARDT = "Hard to shop for new toys... When you're broke. Run a little errand for me and you'll get more than you could ever spend. I'll make you a rich man."; +TXT_RPLY0_SCRIPT33_d15160_IGOTN = "I got nothing better to do."; +TXT_RPLY1_SCRIPT33_d15160_NOTHA = "No thanks."; +TXT_RYES1_SCRIPT33_d15160_NOBOD = "Nobody walks away from me!"; +TXT_DLG_SCRIPT33_d16676_GOODC = "Good choice. The order's sanctuary by the river is their unofficial torture chamber. Hidden inside there's a golden chalice. You swipe it, you meet me at the tavern, and reap your reward."; +TXT_RPLY0_SCRIPT33_d16676_HOWAM = "How am I supposed to do that?"; +TXT_RPLY1_SCRIPT33_d16676_LETME = "Let me think about it."; +TXT_RYES1_SCRIPT33_d16676_SORRY = "Sorry, no second chances. Oh, guards, kill him!"; +TXT_DLG_SCRIPT33_d18192_HERES = "Here's a crossbow, just aim straight and -- splat!--. Remember, grab the fancy cup and meet me at the tavern."; +TXT_RPLY0_SCRIPT33_d18192_ILLSE = "I'll see you there."; +TXT_DLG_SCRIPT33_d19708_WHATA = "What are you waiting for? Don't worry, I'll clean up the bodies, just bring me that chalice!"; +TXT_DLG_SCRIPT33_d21224_GUARD = "Guards! Kill the traitor!"; +TXT_DLG_SCRIPT33_d22740_HEYIK = "Hey, I know what you're thinking, kinda looks like a setup, I would never do that to such a killing machine, I mean it. Whew, all this fuss over a cup, weird. Now get ready, gold and glory, like I promised. Take this key and the governor himself will reward you."; +TXT_RPLY0_SCRIPT33_d22740_GREAT = "Great, I can't wait!"; +TXT_RNO0_SCRIPT33_d22740_NOCHA = "No chalice, no money!"; +TXT_RPLY1_SCRIPT33_d22740_ILLKE = "I'll keep the chalice, thanks."; +TXT_RYES1_SCRIPT33_d22740_KEEPI = "Keep it? I think not!"; +TXT_DLG_SCRIPT33_d24256_WHATA = "What are you waiting for? The governor himself will reward you."; +TXT_DLG_SCRIPT33_d25772_DIETR = "Die traitor! "; +TXT_DLG_SCRIPT33_d27288_SOYOU = "So you're the fool who stole the chalice? I'm going to have you arrested as a rebel thief... Thereby enhancing my position with the order. How does it feel to be an unwitting pawn? "; +TXT_RPLY0_SCRIPT33_d27288_ITSUC = "It sucks!"; +TXT_RYES0_SCRIPT33_d27288_FORYO = "For you it does."; +TXT_RPLY1_SCRIPT33_d27288_HARRI = "Harris promised me money!"; +TXT_RYES1_SCRIPT33_d27288_TOOBA = "Too bad. The only thing you're getting is death!"; +TXT_DLG_SCRIPT33_d28804_WEREG = "We're going to kill you!"; +TXT_DLG_SCRIPT33_d30320_GETOU = "Get out of here!"; +TXT_DLG_SCRIPT33_d31836_WEREG = "We're going to kill you!"; +TXT_DLG_SCRIPT33_d33352_GETOU = "Get out of here!"; + +TXT_DLG_SCRIPT34_d0_WHATA = "What a perfect place for us, under the old town hall. The order thinks they've wiped us out, but all it was is a reminder to us of what can happen when you become careless. "; +TXT_DLG_SCRIPT34_d1516_TALKT = "Talk to Macil, he'll be able to help you."; +TXT_DLG_SCRIPT34_d3032_IVEHE = "I've heard that Macil's going to start something again soon. We need a big hit after the last fiasco. One more like that and we'll be too weak to continue."; +TXT_DLG_SCRIPT34_d4548_AFEWO = "A few of these barrels dumped into their water supply should even the odds a little. "; +TXT_DLG_SCRIPT34_d6064_IMWOR = "I'm working on something that will give us an edge. It will increase your stamina and completely jack you up. I've almost got all the bugs worked out. Can I do something for you? "; +TXT_RPLY0_SCRIPT34_d6064_PATCH = "Patch me up."; +TXT_RYES0_SCRIPT34_d6064_BOYYO = "Boy, you're a real mess. I'll see what I can do."; +TXT_RPLY1_SCRIPT34_d6064_STAMI = "Stamina implant?"; +TXT_RYES1_SCRIPT34_d6064_ALLRI = "All right this won't take but a moment."; +TXT_RNO1_SCRIPT34_d6064_ITSNO = "It's not done yet."; +TXT_DLG_SCRIPT34_d7580_HEYIM = "Hey, I'm working on an updated version of your implant. Is there anything else I can do?"; +TXT_RPLY0_SCRIPT34_d7580_PATCH = "Patch me up."; +TXT_RYES0_SCRIPT34_d7580_WELLA = "Well at least you're seeing action."; +TXT_RPLY1_SCRIPT34_d7580_IMPLA = "Implant upgrade?"; +TXT_RYES1_SCRIPT34_d7580_GOODT = "Good thing, never can be too safe."; +TXT_RNO1_SCRIPT34_d7580_IMALM = "I'm almost finished, but not quite."; +TXT_DLG_SCRIPT34_d9096_ALLRI = "All right, this is it. I've almost got everything working perfectly. There were a few problems left to fix, do you need anything else? "; +TXT_RPLY0_SCRIPT34_d9096_PATCH = "Patch me up."; +TXT_RYES0_SCRIPT34_d9096_WHATH = "What have you been trying to do? Go head to head with a crusader?"; +TXT_RPLY1_SCRIPT34_d9096_IMPLA = "Implant upgrade?."; +TXT_RYES1_SCRIPT34_d9096_THATS = "That should do it for you."; +TXT_RNO1_SCRIPT34_d9096_LETME = "Let me run some more tests first."; +TXT_DLG_SCRIPT34_d10612_THATS = "That's all I can do on the implant right now. Maybe some healing?"; +TXT_RPLY0_SCRIPT34_d10612_YEAH = "Yeah."; +TXT_RYES0_SCRIPT34_d10612_BOYYO = "Boy, you're a real mess. I'll see what I can do."; +TXT_DLG_SCRIPT34_d12128_WHATC = "What can I do for you?"; +TXT_RPLY0_SCRIPT34_d12128_IMOUT = "I'm out of bullets."; +TXT_RYES0_SCRIPT34_d12128_HERES = "Here's some ammo for you. Don't waste it."; +TXT_RPLY1_SCRIPT34_d12128_TEACH = "Teach me."; +TXT_RYES1_SCRIPT34_d12128_ALLRI = "All right, I'll just show you a few little pointers."; +TXT_RNO1_SCRIPT34_d12128_YOURE = "You're not ready yet."; +TXT_DLG_SCRIPT34_d13644_BACKA = "Back again? What do you need?"; +TXT_RPLY0_SCRIPT34_d13644_IMOUT = "I'm out of bullets."; +TXT_RYES0_SCRIPT34_d13644_HERES = "Here's some ammo for you. Don't waste it."; +TXT_RNO0_SCRIPT34_d13644_YOUVE = "You've got enough ammo."; +TXT_RPLY1_SCRIPT34_d13644_TEACH = "Teach me."; +TXT_RYES1_SCRIPT34_d13644_ALLRI = "All right, this should keep you going for a while."; +TXT_RNO1_SCRIPT34_d13644_SORRY = "Sorry, can't. I'm just following Macil's orders."; +TXT_DLG_SCRIPT34_d15160_WELLW = "Well which is it, bullets or training? I can't wait to get my hands on those new weapons we captured. Once I get done with them, I'll be able to begin training everyone else."; +TXT_RPLY0_SCRIPT34_d15160_IMOUT = "I'm out of ammo."; +TXT_RYES0_SCRIPT34_d15160_HERES = "Here's some ammo for you. Don't waste it."; +TXT_RNO0_SCRIPT34_d15160_YOUVE = "You've got enough ammo."; +TXT_RPLY1_SCRIPT34_d15160_TEACH = "Teach me."; +TXT_RYES1_SCRIPT34_d15160_OKTAK = "O.K. Take what you've learned and show those order bastards the way to hell."; +TXT_RNO1_SCRIPT34_d15160_COMEB = "Come back later, when Macil says it's time."; +TXT_DLG_SCRIPT34_d16676_IVETA = "I've taught you everything I can right now. Give me some time to put the new weapons through their paces. That is unless you're out of bullets."; +TXT_RPLY0_SCRIPT34_d16676_YESIA = "Yes I am."; +TXT_RYES0_SCRIPT34_d16676_HEREY = "Here you go."; +TXT_DLG_SCRIPT34_d18192_DONTG = "Don't get trigger happy in the town, you'll set off the alarm and they will start sending in guards from the castle."; +TXT_DLG_SCRIPT34_d19708_WELCO = "Welcome, we can always use more help."; +TXT_DLG_SCRIPT34_d21224_WHENI = "When I was still in action we had the chance to examine an acolyte before the reinforcements arrived, they're not human I tell you."; +TXT_DLG_SCRIPT34_d22740_WERET = "We're trying to find where the castle gate mechanisms are, but so far we've had no luck."; +TXT_DLG_SCRIPT34_d24256_DONTG = "Don't get caught. I've heard horror stories about what they do to our people after they're imprisoned. They just disappear, no traces, nothing. "; +TXT_DLG_SCRIPT34_d25772_HERES = "Here's some advice, if you ever see any of the order's tin soldiers, run the other way. I especially don't like the reavers, those things are just damned fast!"; +TXT_DLG_SCRIPT34_d27288_WELCO = "Welcome to the last flicker of hope. Only we have the free will to oppose the order. We have the sharpest scientific minds, and many able bodies. But we lack that one real problem solver, who will give us the edge we need."; +TXT_RPLY0_SCRIPT34_d27288_WHATW = "What will I need to do? "; +TXT_DLG_SCRIPT34_d28804_HELPU = "Help us. Help us steal their technology. Free our comrades. Fight these twisted psychopaths to the death. I'm asking you to risk your life for the truth."; +TXT_RPLY0_SCRIPT34_d28804_IMWIT = "I'm with you!"; +TXT_DLG_SCRIPT34_d30320_GOODB = "Good. Blackbird will continue to be your guide. She's taken quite a shine to you. Together, you've got to unlock the secrets of the order and their inhuman servants. There's a presence that lurks just outside our understanding which guides their terror. Get inside and take them down. "; +TXT_RPLY0_SCRIPT34_d30320_LETME = "Let me at 'em!"; +TXT_RYES0_SCRIPT34_d30320_THATS = "That's the spirit."; +TXT_DLG_SCRIPT34_d31836_WELCO = "Welcome friend!"; + +// Strife's log texts + +TXT_ILOG1 = "Hello? Command, a com unit has just been activated... Am receiving visuals and sound from... Somebody... Hey you, get out of there now... And drop the chalice!"; +TXT_ILOG2 = "Listen, this com unit tells me that you're 100% human. I've been ordered to bring you in, we're talking trust here. Betray me and pay. Oh, and by the way, you can call me Blackbird."; +$ifgame(strifeteaser) TXT_ILOG2 = "Listen, this com-unit tells me that you're 100% human. You might be one of us, and maybe we can try and trust each other. Consider this test, there's a flamethrower in the governor's mansion. Get it, and I'll lead you to us"; +TXT_ILOG3 = "Head over to the old town hall. Macil had a tunnel built that lets us get in and out without the acolytes' knowledge."; +TXT_ILOG4 = "Go through the door on your left, then the one on the right. The guard's name is geoff. Tell him you need gold."; +TXT_ILOG5 = "Don't enter the town hall. It's not safe anymore, our cover's been blown. Kill all the big robots, the 'crusaders' and I'll guide you to us."; +TXT_ILOG6 = "The door next to the weapons shop will open once all the crusaders are dead. Inside the store room there's a teleporter, use it, and it'll bring you to us"; +TXT_ILOG7 = "The door next to the weapons shop will open once all the crusaders are dead. Inside the store room there's a teleporter, use it, and it'll bring you to us"; +TXT_ILOG8 = "Kill as many of the big robots, crusaders, as you can. When you're done, I'll guide you to Macil"; +TXT_ILOG9 = "Go through the door, and talk to Macil."; +TXT_ILOG10 = "Find the power tap on the mains, and shut it off. Bring something back to the governor as proof. Find Macguffin, and talk to him."; +TXT_ILOG11 = "Find the power tap on the mains, and shut it off. Bring something back to the governor as proof. Find Macguffin, and talk to him. He's up by the sewage treatment plant, in the 'bum hole', down the stairs."; +TXT_ILOG13 = "You idiot! You've shut off the power to the jamming circuits we use to conceal our base from the order. Head to the town hall and take out the scanning crew, now! Then, go back to the governor and give him the broken coupling."; +TXT_ILOG14 = "Ok, 'trust no one' is the name of the game! Let's get that prison pass from the governor. Take the broken coupling to him."; +TXT_ILOG15 = "Good move! The governor is a liar. That's our power coupling. We're using it to hide the base from the order. Take this broken coupling back to him and let's get that pass."; +TXT_ILOG18 = "Use the Warden's key to get into the prison cell blocks and find a way to free the prisoners."; +TXT_ILOG19 = "Find a way to free the prisoners. Find a way to open the hand scanner switch."; +TXT_ILOG20 = "Find a way to free the prisoners. Use the judge's hand to operate the hand scanner switch."; +TXT_ILOG21 = "Way to go my friend. Good work freeing the prisoners. Jump on one of the teleporters and it will bring you back to base."; +TXT_ILOG22 = "Destroy the power crystal that runs the power grid which drives the order's shields. Go visit worner, a spy we recruited in the warehouse of the power station."; +TXT_ILOG24 = "Let's get lost. There's more fun to come."; +TXT_ILOG25 = "One more adventure before command feels it's safe to attack the castle. Macil's arranged for Irale to give you gold and some training. After you visit him, see the medic in town for strength."; +TXT_ILOG26 = "Visit Irale and the medic in town for gold and training, then find the sewers. Head along the river across from the governor's mansion."; +TXT_ILOG28 = "We're looking for weran, who calls himself the rat king. I'm sure it's descriptive as well as colorful."; +TXT_ILOG33 = "Take the flamethrower parts to Irale. Drain the reclamation tank. At the bottom is a hidden entrance to the sewers. The gate controls are down there, somewhere. Destroy them."; +TXT_ILOG37 = "Command, he's done it! The gates are open. Send in the shock troops and tell Macil we're coming in! Let's get back to the front base."; +TXT_ILOG38 = "Join the assault on the castle. Find and take out the Programmer. We have conflicting reports about his location. One says he in a computer room, another hiding in a sub-level temple, and yet another at the end of a long hallway."; +TXT_ILOG45 = "Find the Programmer and kill him."; +TXT_ILOG46 = "Seek out the Oracle and ask it about the other Sigil pieces. The Oracle resides in the borderlands, just outside of town. Cross the river, head towards the castle and go left through the archway."; +TXT_ILOG47 = "Seek out the Oracle and ask it about the other Sigil pieces. The Oracle's temple is in the borderlands, on the outskirts of town."; +TXT_ILOG48 = "Seek out the Oracle and ask it about the other Sigil pieces. Take your reward and go across to the medic and weapons trainer for health and training. The Oracle's temple is in the borderlands, on the outskirts of town."; +TXT_ILOG50 = "Seek out the Oracle's temple and ask it about the other Sigil pieces. Here it is. I'm recording everything. It's not that I don't have faith that you'll survive. It's just that we can't let the order control the Sigil."; +TXT_ILOG56 = "The second piece lies at the heart of the crimson and obsidian tower. There you will find the Bishop. The Bishop is the order's military leader. We off him and we score twice. Take the Oracle's token to the key master in the borderlands."; +TXT_ILOG57 = "The Bishop is going to be heavily guarded, so why don't we swipe a uniform and blend in? Locate the Bishop. Once you have destroyed him, return to the Oracle."; +TXT_ILOG59 = "I just got word that we have an informer inside the fortress. Let's head for the hospital. He works there. After that, locate the Bishop and destroy him. Once he's dead return to the Oracle."; +TXT_ILOG64 = "Don't give up. This is it. Straight ahead. Jump on the teleporter to central administration and destroy the computer core. This will kill the force field on the entrance to the Bishop's tower. Once he's dead, return to the Oracle."; +TXT_ILOG70 = "Very impressive. Lets blow it up. That should take care of the force field. Let's get back to the bailey, then off to the tower and the Bishop."; +TXT_ILOG74 = "Bravo, another piece of the Sigil! Did you see that weird spectre that came out of the Bishop's body? Where have I seen that before? Let's get back to the Oracle."; +TXT_ILOG75 = "Judgment call time... The Oracle wanted us back for another visit, but now that we've got two pieces, we might want to return to base."; +TXT_ILOG76 = "I have a report that the spectral energy we found near the Bishop is also present by the Oracle, let's be careful"; +TXT_ILOG79 = "Richter has taken over command of our forces. It looks like Macil has been deceiving us all along. His true allegiance was to the order. What a snake. Let's get back to the Oracle."; +TXT_ILOG83 = "Another Sigil peice. We are one step closer to freedom. And you are one step closer to me. Let's get back to the Oracle!"; +TXT_ILOG85 = "You wield the power of the complete Sigil. What do you say we get some closure. Let's see what the Loremaster's been protecting."; +TXT_ILOG87 = "Well, so much for prognostication. Hold it, Macil is calling us back. Let's get out of here in one piece."; +TXT_ILOG88 = "I'm sorry, after being up to my hips in blood I can't think of anything witty to say right now. Let's just get back to Macil."; +TXT_ILOG89 = "The factory is next to the mines. Richter must mean the mines of degnin. The degnin ore is magnetic and explosive, just the thing for shutting down force fields. Let's get that key from the catacombs, and then off to the mines for some ore."; +TXT_ILOG93 = "The factory is next to the mines. The degnin ore is magnetic and explosive, just the thing for shutting down force fields. Let's get that key from the catacombs, and then we go down for some ore. This must be the ruins Richter's agents were searching for, be careful."; +TXT_ILOG95 = "The factory is next to the mines. The degnin ore is magnetic and explosive, just the thing for shutting down force fields. My friend, whatever it is we're fighting, it's more than just the order. Back to the commons then off to the mines. We need ore."; +TXT_ILOG96 = "The factory is next to the mines. The degnin ore is magnetic and explosive, just the thing for shutting down force fields. Without letting down your guard, look for deposits of ore."; +TXT_ILOG97 = "Without letting down your guard, look for deposits of ore. These poor souls are drones. Their synaptic functions are being jammed by rc implants. We destroy the transmitter, and they're free."; +TXT_ILOG99 = "The factory is next to the mines. Without letting down your guard, look for deposits of ore. My suggestion is, toss the ore at the force field and then blast it, the resulting compression should create a magnetic blanket and turn off the lights."; +TXT_ILOG100 = "Now on to the factory. Exit the mines and you can't miss it. Let's find that machine and shut it down!"; +TXT_ILOG102 = "I'm reading massive neural wave distortions from straight ahead. I think we've found it. Let's get in there and shut it down!"; +TXT_ILOG103 = "Just when I think we've seen it all! They go in human and come out... I dont even want to think about it. Destroy this horror!"; +TXT_ILOG104 = "Macil's gone nuts. He just knowingly sent 200 men to their deaths. I want vengeance! For the dead and for the living dead! Let's get back and find out what's going on."; +TXT_ILOG106 = "The factory leads to a 'lab', and they're getting a Sigil piece power signature from within. Back to the factory and our next step to freedom."; +TXT_ILOG120 = "Find the Bishop and destroy him! Once he's dead, return to the Oracle."; +TXT_ILOG122 = "The Loremaster's lab is beyond the teleporter that just opened. Let's go find out what he was just yapping about.And our next step to freedom."; +TXT_ILOG211 = "Come on, let's get the hell out of here. The force field is down, off to the Bishop's tower. Once he's dead, get back to the Oracle."; +TXT_ILOG1001 = "Find the sanctuary by the river. Steal the chalice from inside. Bring it to Harris in the tavern."; +TXT_ILOG1002 = "Find the governor. Talk to him about your reward."; +TXT_ILOG1003 = "Find the sanctuary by the river. Inside someone called beldin is being held. Shut him up, and bring his ring back to rowan as proof."; +TXT_ILOG1004 = "Find the location of the front and talk to Macil."; +TXT_ILOG1005 = "Go down the stairs, find and talk to Macil."; +TXT_ILOG1006 = "Visit Irale, the front's weapons supplier in town. He's behind the door next to the weapons shop. Then, use the key Macil gave you to talk to the governor."; +TXT_ILOG1007 = "Find the power tap on the mains, and shut it off. Bring something back to the governor as proof."; +TXT_ILOG1008 = "Find Derwin in the warehouse of the power station. Kill him, and bring Mourel his ear."; +TXT_ILOG1009 = "Use the pass Mourel gave you to get into the prison. Once inside, talk to Warden Montag. Find a way to free the prisoners."; +TXT_ILOG1010 = "Use the Warden's key to get into the prison cell blocks and find a way to free the prisoners."; +TXT_ILOG1011 = "Destroy the power crystal that runs the power grid which drives the order's shields. Go visit worner, a spy we recruited in the warehouse of the power station. Don't forget to visit the medic and the weapons trainer before you go"; +TXT_ILOG1012 = "Destroy the power crystal that runs the power grid which drives the order's shields. Use the I.D. To get into the power station. You may want to check out the storeroom above worner."; +TXT_ILOG1013 = "Destroy the power crystal that runs the power grid which drives the order's shields. Go talk to Ketrick in the core area."; +TXT_ILOG1014 = "Destroy the power crystal. Go talk to Ketrick, bring the walkway up using the switches, then use this id for the elevator."; +TXT_ILOG1015 = "Find the town entrance that the order has guarded. Open the door and bring the guard's uniform back to weran."; +TXT_ILOG1016 = "Take the flamethrower parts to Irale. Find the sewer maintenance door. Find and drain the reclamation tank inside the castle. At the bottom is a hidden entrance to the sewers. Down that entrance is where the gate controls are, somewhere."; +TXT_ILOG1017 = "Join the assault on the castle. Find and take out the Programmer. See the medic and the weapons trainer. Spend everything you've got. This is going to be a hell of a fight."; +TXT_ILOG1018 = "Use the key the false Programmer gave you to open an entrance to the Programmer's keep. It has to be where he's hiding. Find the Programmer and kill him."; +TXT_ILOG1019 = "Seek out the Oracle and ask it about the other Sigil pieces. Take your reward and go across to the medic and weapons trainer for health and training."; +TXT_ILOG1020 = "The second piece lies at the heart of the crimson and obsidian tower. There you must find the Bishop, who awaits you. Take the Oracle's token to the key master in the borderlands. Once you have destroyed the Bishop, return to the Oracle."; +TXT_ILOG1021 = "Find the crimson and obsidian tower. Use the id key the key master gave you to enter the tower. Once inside you must locate the Bishop. Once you have destroyed the Bishop, return to the Oracle."; +TXT_ILOG1022 = "Find the security complex, fight through there and use the teleporter to central administration. Destroy the computer core in central administration. This will kill the force field on the Bishop's tower. Once the Bishop's dead, return to the Oracle."; +TXT_ILOG1023 = "Your next challenge will test your spirit. The third piece is held by your own leader. He is the same as that which he sends you to kill. Confront him and resolve your fate."; +TXT_ILOG1024 = "It is the Oracle who holds the third piece. There's your traitor. Return to the Oracle, and take him down. Return to me when it's dead."; +TXT_ILOG1025 = "You have cut the cancer from your body, but your heart still beats. Next you must find the surgeon who butchers and controls your people.... The Loremaster. Stop him, and the next piece will be yours."; +TXT_ILOG1026 = "Next you must find the surgeon who butchers and controls your people.... The Loremaster. Stop him, and the next piece will be yours. Use the teleporter I opened to reach him. When he's dead, use the same device to return to me."; +TXT_ILOG1027 = "You have chosen wisely. The third piece is held by your own leader. Destroy that which hides within your heart and return to me."; +TXT_ILOG1028 = "We've found out that the order is transforming our people into bio-mechanical soldiers. Find the facility where this is being done and close it, permanently! Find Richter in the commons, near the waterfall and he'll tell you how to stop this atrocity."; +TXT_ILOG1029 = "To enter the factory, you need a key. We stole one, but the agent who had it is missing in the catacombs underneath the commons. There's something down there taking our men. Whatever it is, you have to find it and retrieve the key. When you've got it, the factory is next to the mines."; +TXT_ILOG1101 = "Find the chalice in the sanctuary chapel and bring it to Harris upstairs in the tavern."; +TXT_ILOG1102 = "Find the governor's mansion and talk to the governor to get your reward"; +TXT_ILOG1201 = "Congratulations! You have earned our gratitude. Visit the medic and weapons trainer and they will get you ready for what lies ahead. Feel free to wander around within the base."; + +// Strife's character names + +TXT_SPEAKER_ORDER_SERGEANT = "Order Sergeant"; +TXT_SPEAKER_ROWAN = "Rowan"; +TXT_SPEAKER_FERIS = "Feris"; +TXT_SPEAKER_PRISON_GUARD = "Prison Guard"; +TXT_SPEAKER_JUSTIN = "Justin"; +TXT_SPEAKER_MACIL = "Macil"; +TXT_SPEAKER_ASSISTANT = "Assistant"; +TXT_SPEAKER_KEY_MASTER = "Key Master"; +TXT_SPEAKER_BODYGUARD = "Bodyguard"; +TXT_SPEAKER_INTERROGATOR = "Interrogator"; +TXT_SPEAKER_WARDEN_MONTAG = "Warden Montag"; +TXT_SPEAKER_RICHTER = "Richter"; +TXT_SPEAKER_MACIL_S_ADVISOR = "Macil's Advisor"; +TXT_SPEAKER_JUDGE_WOLENICK = "Judge Wolenick"; +TXT_SPEAKER_TEVICK = "Tevick"; +TXT_SPEAKER_HARRIS = "Harris"; +TXT_SPEAKER_FOREMAN = "Foreman"; +TXT_SPEAKER_PRISONER = "Prisoner"; +TXT_SPEAKER_SAMMIS = "Sammis"; +TXT_SPEAKER_WEAPON_SMITH = "Weapon Smith"; +TXT_SPEAKER_REACTOR_GUARD = "Reactor Guard"; +TXT_SPEAKER_APPRENTICE = "Apprentice"; +TXT_SPEAKER_DOOR_GUARD = "Door Guard"; +TXT_SPEAKER_MASTER_SMITHY = "Master Smithy"; +TXT_SPEAKER_WAREHOUSE_GUARD = "Warehouse Guard"; +TXT_SPEAKER_BARKEEP = "Barkeep"; +TXT_SPEAKER_TIMOTHY = "Timothy"; +TXT_SPEAKER_JAMES = "James"; +TXT_SPEAKER_WORNER = "Worner"; +TXT_SPEAKER_BAILEY_GUARD = "Bailey Guard"; +TXT_SPEAKER_DRONE = "Drone"; +TXT_SPEAKER_FRONT_GUARD = "Front Guard"; +TXT_SPEAKER_QUINCY = "Quincy"; +TXT_SPEAKER_SERGEANT = "Sergeant"; +TXT_SPEAKER_TEMPLE_GUARD = "Temple Guard"; +TXT_SPEAKER_ORACLE = "Oracle"; +TXT_SPEAKER_ULAINE = "Ulaine"; +TXT_SPEAKER_FRONT_SOLDIER = "Front Soldier"; +TXT_SPEAKER_PROGRAMMER = "Programmer"; +TXT_SPEAKER_MEDIC = "Medic"; +TXT_SPEAKER_WATCHMAN = "Watchman"; +TXT_SPEAKER_KETRICK = "Ketrick"; +TXT_SPEAKER_WERAN = "Weran"; +TXT_SPEAKER_ADVISOR = "Advisor"; +TXT_SPEAKER_GEOFF = "Geoff"; +TXT_SPEAKER_OVERSEER = "Overseer"; +TXT_SPEAKER_SECURITY_COMPLE = "Security Comple"; +TXT_SPEAKER_COMPUTER_TECH = "Computer Tech"; +TXT_SPEAKER_MACGUFFIN = "Macguffin"; +TXT_SPEAKER_ARION = "Arion"; +TXT_SPEAKER_DOCK_WORKER = "Dock Worker"; +TXT_SPEAKER_IRALE = "Irale"; +TXT_SPEAKER_CORE_GUARD = "Core Guard"; +TXT_SPEAKER_SEWER_GUARD = "Sewer Guard"; +TXT_SPEAKER_TECHNICIAN = "Technician"; +TXT_SPEAKER_GUARD = "Guard"; +TXT_SPEAKER_PEASANT = "Peasant"; +TXT_SPEAKER_ARMORER = "Armorer"; +TXT_SPEAKER_BELDIN = "Beldin"; +TXT_SPEAKER_GERARD = "Gerard"; +TXT_SPEAKER_GOVERNOR_MOUREL = "Governor Mourel"; +TXT_SPEAKER_BOWYER = "Bowyer"; +TXT_SPEAKER_DERWIN = "Derwin"; diff --git a/wadsrc_extra/static/sbigfont.lmp b/wadsrc_extra/static/sbigfont.lmp deleted file mode 100644 index 937a92b357..0000000000 Binary files a/wadsrc_extra/static/sbigfont.lmp and /dev/null differ