From 495298079bf32312a5acace2f277057ed643524a Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 6 Feb 2019 13:59:41 +0100 Subject: [PATCH 01/95] - rewrote the language table so that it doesn't have to reload everything on a language change. It now reads everything into a two-dimensional TMap and creates a list of mappings that apply to the current setting. The constant need for reloading was the main blocker in redesigning how Dehacked strings get inserted. Currently they override everything, but IWAD-based Dehacked text shouldn't block PWAD overrides from PWADs' LANGUAGE lumps and instead be treated as coming from an [en default] block. This also renames the main block from [enu default] to [en default], because it should be treated as the English default for all English locales and not just make it fall through to the base default as it did before. --- src/d_main.cpp | 2 +- src/doomstat.cpp | 4 +- src/gamedata/d_dehacked.cpp | 27 ++-- src/gamedata/stringtable.cpp | 293 +++++++---------------------------- src/gamedata/stringtable.h | 35 +++-- wadsrc/static/language.enu | 2 +- 6 files changed, 90 insertions(+), 273 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index a2c758e0bc..b6c7237043 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -2427,7 +2427,7 @@ void D_DoomMain (void) } // [RH] Initialize localizable strings. - GStrings.LoadStrings (false); + GStrings.LoadStrings (); V_InitFontColors (); 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/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/stringtable.cpp b/src/gamedata/stringtable.cpp index fc5e7ea8af..2fd41e94b8 100644 --- a/src/gamedata/stringtable.cpp +++ b/src/gamedata/stringtable.cpp @@ -43,119 +43,31 @@ #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); } + 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 +76,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(MAKE_ID('*', 0, 0, 0)); } else if (len == 7 && stricmp (sc.String, "default") == 0) { - inCode = MAKE_ID('*','*',0,0); + activeMaps.Push(MAKE_ID('*', '*', 0, 0)); } else { @@ -184,31 +97,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,7 +118,7 @@ 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"); @@ -234,20 +130,7 @@ void FStringTable::LoadLanguage (int lumpnum, uint32_t code, bool exactMatch, in } - 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 +141,36 @@ 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) + // Insert the string into all relevant tables. + for (auto map : activeMaps) { - 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; + 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.Find(list) == currentLanguageSet.Size()) + currentLanguageSet.Push(list); + }; + + checkone(MAKE_ID('*', '*', '*', 0)); + checkone(MAKE_ID('*', 0, 0, 0)); + for (int i = 0; i < 4; ++i) + { + checkone(LanguageIDs[i]); + checkone(LanguageIDs[i] & MAKE_ID(0xff, 0xff, 0, 0)); + } + checkone(MAKE_ID('*', '*', 0, 0)); +} + // Replace \ escape sequences in a string with the escaped characters. size_t FStringTable::ProcessEscapes (char *iptr) { @@ -321,27 +201,20 @@ size_t FStringTable::ProcessEscapes (char *iptr) // Finds a string by name and returns its value const char *FStringTable::operator[] (const char *name) const { - if (name == NULL) + if (name == nullptr || *name == 0) { - return NULL; + return nullptr; } - uint32_t bucket = MakeKey (name) & (HASH_SIZE - 1); - StringEntry *entry = Buckets[bucket]; - - while (entry != NULL) + FName nm(name, true); + if (nm != NAME_None) { - int cmpval = stricmp (entry->Name, name); - if (cmpval == 0) + for (auto map : currentLanguageSet) { - return entry->String; + auto item = map->CheckKey(nm); + if (item) return item->GetChars(); } - if (cmpval == 1) - { - return NULL; - } - entry = entry->Next; } - return NULL; + return nullptr; } // Finds a string by name and returns its value. If the string does @@ -352,75 +225,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..1c479ba5a5 100644 --- a/src/gamedata/stringtable.h +++ b/src/gamedata/stringtable.h @@ -44,34 +44,41 @@ #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; + using LangMap = TMap; - FStringTable (); - ~FStringTable (); - - void LoadStrings (bool enuOnly); + void LoadStrings (); + void UpdateLanguage(); + StringMap GetDefaultStrings() { return allStrings[MAKE_ID('*', '*', 0, 0)]; } // Dehacked needs these for comparison + void SetDehackedStrings(StringMap && map) + { + allStrings.Insert(MAKE_ID('*', '*', '*', 0), map); + UpdateLanguage(); + } 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); - 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/wadsrc/static/language.enu b/wadsrc/static/language.enu index 54cb51ef14..7ad4b6ca7c 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] +[en default] SECRETMESSAGE = "A secret is revealed!"; From 4d2bb11317e1b6a9b0c774cc8b902f00b914d153 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 7 Feb 2019 13:12:39 +0100 Subject: [PATCH 02/95] - reworked font loader to make adding multi-lump fonts easier. A multi-lump font can be created by putting all characters into a subdirectory of fonts/ with the intended name. Each character needs to be named by its character index as hex number. So far this is only active for the predefined small fonts --- src/gamedata/w_wad.cpp | 37 +++++++ src/gamedata/w_wad.h | 7 ++ src/scripting/thingdef_data.cpp | 5 +- src/scripting/vm/jit_move.cpp | 2 +- src/scripting/vm/vm.h | 2 +- src/scripting/vmthunks.cpp | 2 +- src/utility/zstring.cpp | 8 +- src/utility/zstring.h | 4 +- src/v_font.cpp | 101 ++++++++++++------ src/v_font.h | 2 +- .../defsmallfont/009F.lmp} | Bin .../game-doom/fonts/defsmallfont/00AB.lmp | Bin 0 -> 89 bytes .../game-doom/fonts/defsmallfont/00BB.lmp | Bin 0 -> 89 bytes .../defsmallfont/00BF.lmp} | Bin .../defsmallfont/00C0.lmp} | Bin .../defsmallfont/00C1.lmp} | Bin .../defsmallfont/00C2.lmp} | Bin .../defsmallfont/00C3.lmp} | Bin .../defsmallfont/00C4.lmp} | Bin .../defsmallfont/00C5.lmp} | Bin .../defsmallfont/00C7.lmp} | Bin .../defsmallfont/00C8.lmp} | Bin .../defsmallfont/00C9.lmp} | Bin .../defsmallfont/00CA.lmp} | Bin .../defsmallfont/00CD.lmp} | Bin .../defsmallfont/00CE.lmp} | Bin .../defsmallfont/00CF.lmp} | Bin .../defsmallfont/00D1.lmp} | Bin .../defsmallfont/00D3.lmp} | Bin .../defsmallfont/00D4.lmp} | Bin .../defsmallfont/00D5.lmp} | Bin .../defsmallfont/00D6.lmp} | Bin .../defsmallfont/00D9.lmp} | Bin .../defsmallfont/00DA.lmp} | Bin .../defsmallfont/00DB.lmp} | Bin .../defsmallfont/00DC.lmp} | Bin .../defsmallfont/00DF.lmp} | Bin .../game-doom/fonts/defsmallfont/0178.lmp | Bin 0 -> 126 bytes .../game-doom/fonts/defsmallfont/0401.lmp | Bin 0 -> 140 bytes .../game-doom/fonts/defsmallfont/0410.lmp | Bin 0 -> 132 bytes .../game-doom/fonts/defsmallfont/0411.lmp | Bin 0 -> 137 bytes .../game-doom/fonts/defsmallfont/0412.lmp | Bin 0 -> 137 bytes .../game-doom/fonts/defsmallfont/0413.lmp | Bin 0 -> 120 bytes .../game-doom/fonts/defsmallfont/0414.lmp | Bin 0 -> 146 bytes .../game-doom/fonts/defsmallfont/0415.lmp | Bin 0 -> 130 bytes .../game-doom/fonts/defsmallfont/0416.lmp | Bin 0 -> 208 bytes .../game-doom/fonts/defsmallfont/0417.lmp | Bin 0 -> 134 bytes .../game-doom/fonts/defsmallfont/0418.lmp | Bin 0 -> 134 bytes .../game-doom/fonts/defsmallfont/0419.lmp | Bin 0 -> 137 bytes .../game-doom/fonts/defsmallfont/041A.lmp | Bin 0 -> 138 bytes .../game-doom/fonts/defsmallfont/041B.lmp | Bin 0 -> 144 bytes .../game-doom/fonts/defsmallfont/041C.lmp | Bin 0 -> 145 bytes .../game-doom/fonts/defsmallfont/041D.lmp | Bin 0 -> 136 bytes .../game-doom/fonts/defsmallfont/041E.lmp | Bin 0 -> 124 bytes .../game-doom/fonts/defsmallfont/041F.lmp | Bin 0 -> 136 bytes .../game-doom/fonts/defsmallfont/0420.lmp | Bin 0 -> 126 bytes .../game-doom/fonts/defsmallfont/0421.lmp | Bin 0 -> 139 bytes .../game-doom/fonts/defsmallfont/0422.lmp | Bin 0 -> 120 bytes .../game-doom/fonts/defsmallfont/0423.lmp | Bin 0 -> 128 bytes .../game-doom/fonts/defsmallfont/0424.lmp | Bin 0 -> 152 bytes .../game-doom/fonts/defsmallfont/0425.lmp | Bin 0 -> 158 bytes .../game-doom/fonts/defsmallfont/0426.lmp | Bin 0 -> 149 bytes .../game-doom/fonts/defsmallfont/0427.lmp | Bin 0 -> 111 bytes .../game-doom/fonts/defsmallfont/0428.lmp | Bin 0 -> 168 bytes .../game-doom/fonts/defsmallfont/0429.lmp | Bin 0 -> 181 bytes .../game-doom/fonts/defsmallfont/042A.lmp | Bin 0 -> 148 bytes .../game-doom/fonts/defsmallfont/042B.lmp | Bin 0 -> 177 bytes .../game-doom/fonts/defsmallfont/042C.lmp | Bin 0 -> 124 bytes .../game-doom/fonts/defsmallfont/042D.lmp | Bin 0 -> 131 bytes .../game-doom/fonts/defsmallfont/042E.lmp | Bin 0 -> 176 bytes .../game-doom/fonts/defsmallfont/042F.lmp | Bin 0 -> 138 bytes .../game-doom/fonts/defsmallfont/2014.lmp | Bin 0 -> 188 bytes .../game-doom/fonts/defsmallfont/201C.lmp | Bin 0 -> 98 bytes .../game-doom/fonts/defsmallfont/201E.lmp | Bin 0 -> 98 bytes .../defsmallfont/005C.lmp} | Bin .../defsmallfont/005D.lmp} | Bin .../defsmallfont/005E.lmp} | Bin .../defsmallfont/005F.lmp} | Bin .../defsmallfont/00C4.lmp} | Bin .../defsmallfont/00C5.lmp} | Bin .../defsmallfont/00D6.lmp} | Bin .../defsmallfont/00DC.lmp} | Bin .../defsmallfont/00DF.lmp} | Bin 83 files changed, 123 insertions(+), 47 deletions(-) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn159.lmp => fonts/defsmallfont/009F.lmp} (100%) create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00AB.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00BB.lmp rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn191.lmp => fonts/defsmallfont/00BF.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn192.lmp => fonts/defsmallfont/00C0.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn193.lmp => fonts/defsmallfont/00C1.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn194.lmp => fonts/defsmallfont/00C2.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn195.lmp => fonts/defsmallfont/00C3.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn196.lmp => fonts/defsmallfont/00C4.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn197.lmp => fonts/defsmallfont/00C5.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn199.lmp => fonts/defsmallfont/00C7.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn200.lmp => fonts/defsmallfont/00C8.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn201.lmp => fonts/defsmallfont/00C9.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn202.lmp => fonts/defsmallfont/00CA.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn205.lmp => fonts/defsmallfont/00CD.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn206.lmp => fonts/defsmallfont/00CE.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn207.lmp => fonts/defsmallfont/00CF.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn209.lmp => fonts/defsmallfont/00D1.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn211.lmp => fonts/defsmallfont/00D3.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn212.lmp => fonts/defsmallfont/00D4.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn213.lmp => fonts/defsmallfont/00D5.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn214.lmp => fonts/defsmallfont/00D6.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn217.lmp => fonts/defsmallfont/00D9.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn218.lmp => fonts/defsmallfont/00DA.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn219.lmp => fonts/defsmallfont/00DB.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn220.lmp => fonts/defsmallfont/00DC.lmp} (100%) rename wadsrc_extra/static/filter/game-doom/{graphics/stcfn223.lmp => fonts/defsmallfont/00DF.lmp} (100%) create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0178.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0401.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0410.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0411.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0412.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0413.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0414.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0415.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0416.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0417.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0418.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0419.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041A.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041B.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041C.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041D.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041E.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041F.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0420.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0421.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0422.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0423.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0424.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0425.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0426.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0427.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0428.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0429.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042A.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042B.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042C.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042D.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042E.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042F.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/2014.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/201C.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/201E.lmp rename wadsrc_extra/static/filter/game-raven/{graphics/fonta60.lmp => fonts/defsmallfont/005C.lmp} (100%) rename wadsrc_extra/static/filter/game-raven/{graphics/fonta61.lmp => fonts/defsmallfont/005D.lmp} (100%) rename wadsrc_extra/static/filter/game-raven/{graphics/fonta62.lmp => fonts/defsmallfont/005E.lmp} (100%) rename wadsrc_extra/static/filter/game-raven/{graphics/fonta63.lmp => fonts/defsmallfont/005F.lmp} (100%) rename wadsrc_extra/static/filter/game-raven/{graphics/fonta164.lmp => fonts/defsmallfont/00C4.lmp} (100%) rename wadsrc_extra/static/filter/game-raven/{graphics/fonta165.lmp => fonts/defsmallfont/00C5.lmp} (100%) rename wadsrc_extra/static/filter/game-raven/{graphics/fonta182.lmp => fonts/defsmallfont/00D6.lmp} (100%) rename wadsrc_extra/static/filter/game-raven/{graphics/fonta188.lmp => fonts/defsmallfont/00DC.lmp} (100%) rename wadsrc_extra/static/filter/game-raven/{graphics/fonta191.lmp => fonts/defsmallfont/00DF.lmp} (100%) diff --git a/src/gamedata/w_wad.cpp b/src/gamedata/w_wad.cpp index 9564bb5ace..5057963962 100644 --- a/src/gamedata/w_wad.cpp +++ b/src/gamedata/w_wad.cpp @@ -1260,6 +1260,43 @@ FResourceLump *FWadCollection::GetLumpRecord(int lump) const return LumpInfo[lump].lump; } +//========================================================================== +// +// GetLumpsInFolder +// +// Gets all lumps within a single folder in the hierarchy. +// +//========================================================================== + +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) 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 (Wads.CheckNumForFullName(LumpInfo[i].lump->FullName) == i) + { + result.Push({ LumpInfo[i].lump->FullName.GetChars(), 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..469b3f6684 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) const; bool IsEncryptedFile(int lump) const; diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index 4a73214ab7..d4a67339c9 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 { 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 653bc2d98e..f171f33ac6 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -257,7 +257,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) diff --git a/src/utility/zstring.cpp b/src/utility/zstring.cpp index ff17fd607e..0eb8fe67d6 100644 --- a/src/utility/zstring.cpp +++ b/src/utility/zstring.cpp @@ -1130,14 +1130,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 diff --git a/src/utility/zstring.h b/src/utility/zstring.h index 334fbcb1f1..2924de96d5 100644 --- a/src/utility/zstring.h +++ b/src/utility/zstring.h @@ -299,8 +299,8 @@ 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; } diff --git a/src/v_font.cpp b/src/v_font.cpp index dffdc88841..9b10ba2bb3 100644 --- a/src/v_font.cpp +++ b/src/v_font.cpp @@ -305,21 +305,16 @@ FFont *V_GetFont(const char *name) // //========================================================================== -FFont::FFont (const char *name, const char *nametemplate, int first, int count, int start, int fdlump, int spacewidth, bool notranslate) +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]; - 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; @@ -333,10 +328,13 @@ FFont::FFont (const char *name, const char *nametemplate, int first, int count, maxyoffs = 0; - for (i = 0; i < count; i++) + TMap charMap; + int minchar = INT_MAX; + int maxchar = INT_MIN; + for (i = 0; i < lcount; i++) { - charLumps[i] = nullptr; - mysnprintf (buffer, countof(buffer), nametemplate, i + start); + int position = '!' + i; + mysnprintf(buffer, countof(buffer), nametemplate, i + start); lump = TexMan.CheckForTexture(buffer, ETextureType::MiscPatch); if (doomtemplate && lump.isValid() && i + start == 121) @@ -349,21 +347,55 @@ FFont::FFont (const char *name, const char *nametemplate, int first, int count, !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; + position = 124; } } - if (lump.isValid()) { - FTexture *pic = TexMan.GetTexture(lump); + if (position < minchar) minchar = position; + if (position > maxchar) maxchar = position; + charMap.Insert(position, TexMan.GetTexture(lump)); + } + } + if (filetemplate != nullptr) + { + TArray folderdata; + FStringf path("fonts/%s/", filetemplate); + if (Wads.GetLumpsInFolder(path, folderdata)) + { + // 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; + charMap.Insert((int)position, TexMan.GetTexture(lump)); + } + } + } + } + } + + FirstChar = minchar; + LastChar = maxchar; + auto count = maxchar - minchar + 1; + Chars.Resize(count); + + for (i = 0; i < count; i++) + { + auto lump = charMap.CheckKey(FirstChar + i); + if (lump != nullptr) + { + FTexture *pic = *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(); @@ -371,27 +403,26 @@ FFont::FFont (const char *name, const char *nametemplate, int first, int count, { maxyoffs = yoffs; } - height += abs (yoffs); + height += abs(yoffs); if (height > FontHeight) { FontHeight = height; } } - } - - if (charLumps[i] != nullptr) - { - charLumps[i]->SetUseType(ETextureType::FontChar); + pic->SetUseType(ETextureType::FontChar); if (!noTranslate) { - Chars[i].OriginalPic = charLumps[i]; - Chars[i].TranslatedPic = new FImageTexture(new FFontChar1 (charLumps[i]->GetImage()), ""); - Chars[i].TranslatedPic->Scale = charLumps[i]->Scale; + Chars[i].OriginalPic = pic; + Chars[i].TranslatedPic = new FImageTexture(new FFontChar1 (pic->GetImage()), ""); + Chars[i].TranslatedPic->Scale = pic->Scale; Chars[i].TranslatedPic->SetUseType(ETextureType::FontChar); TexMan.AddTexture(Chars[i].TranslatedPic); } - else Chars[i].TranslatedPic = charLumps[i]; + else + { + Chars[i].TranslatedPic = pic; + } Chars[i].XMove = Chars[i].TranslatedPic->GetDisplayWidth(); } @@ -406,9 +437,9 @@ FFont::FFont (const char *name, const char *nametemplate, int first, int count, { SpaceWidth = spacewidth; } - else if ('N'-first >= 0 && 'N'-first < count && Chars['N' - first].TranslatedPic != nullptr) + else if ('N'-FirstChar >= 0 && 'N'-FirstChar < count && Chars['N' - FirstChar].TranslatedPic != nullptr) { - SpaceWidth = (Chars['N' - first].XMove + 1) / 2; + SpaceWidth = (Chars['N' - FirstChar].XMove + 1) / 2; } else { @@ -1826,7 +1857,7 @@ void V_InitCustomFonts() } if (format == 1) { - FFont *fnt = new FFont (namebuffer, templatebuf, first, count, start, llump, spacewidth, donttranslate); + FFont *fnt = new FFont (namebuffer, templatebuf, nullptr, first, count, start, llump, spacewidth, donttranslate); fnt->SetCursor(cursor); } else if (format == 2) @@ -2228,19 +2259,19 @@ void V_InitFonts() } else if (Wads.CheckNumForName ("FONTA_S") >= 0) { - SmallFont = new FFont ("SmallFont", "FONTA%02u", HU_FONTSTART, HU_FONTSIZE, 1, -1); + SmallFont = new FFont ("SmallFont", "FONTA%02u", "defsmallfont", HU_FONTSTART, HU_FONTSIZE, 1, -1); SmallFont->SetCursor('['); } else { - SmallFont = new FFont ("SmallFont", "STCFN%.3d", HU_FONTSTART, HU_FONTSIZE, HU_FONTSTART, -1); + SmallFont = new FFont ("SmallFont", "STCFN%.3d", "defsmallfont", 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); + SmallFont2 = new FFont ("SmallFont2", "STBFN%.3d", "defsmallfont2", HU_FONTSTART, HU_FONTSIZE, HU_FONTSTART, -1); } else { @@ -2271,7 +2302,7 @@ void V_InitFonts() } else { - BigFont = new FFont ("BigFont", "FONTB%02u", HU_FONTSTART, HU_FONTSIZE, 1, -1); + BigFont = new FFont ("BigFont", "FONTB%02u", "defbigfont", HU_FONTSTART, HU_FONTSIZE, 1, -1); } } } diff --git a/src/v_font.h b/src/v_font.h index 7e83735320..d67b1d8994 100644 --- a/src/v_font.h +++ b/src/v_font.h @@ -79,7 +79,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; 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 0000000000000000000000000000000000000000..b7804d21b7ddf8fb172f19375ef5cc285cfe89c6 GIT binary patch literal 89 zcmXZRF%Ez*3`0@3RXGO}BY$OP=Cr64#|sW(c#e}S>XIT>=VrSdcG_jN08ttYPj$GN Qf8)tt-bU6?^-lXTUdad(NdN!< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..179e0ac79f392301d18e8701bcf54629b43313d8 GIT binary patch literal 89 zcmXAeu?@f=5CaVe=EwrbC3R{_Hbp^<_xOpWvrcwF24ME6t7zgCT?~OpCEYe;^5Z72 Px%@V{WFh%Wi^2B;p>`8; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d57a2dd3eb335f4a3bfa23a61f8c8d938968c634 GIT binary patch literal 126 zcmd;J;9y{2U}Vq$k_JF*1;p+^91O(qK%4`_WkAfxtPcYJ8Cdo8x9V>Ju{iYgH|uZS j3KnK$2T>chZwE?1+1r3JU`1PDia>fd>u&=oftm&YiTEC1 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9eedf12eda0fc5f80bccdf86497c6d900f92a682 GIT binary patch literal 140 zcmYj}(FuS+3`2XI;*H{8Z~zx@0S9ma7jP+S(Yo9j`=f=I5_qIY5s@T4b08y`$V?Wp rl8xjBaW!@P_vy?k1u)pIY*7^MYAj(n{P-+`{w!RtmAI1I7-oF{0OutX literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f805e3aa6e7adc3137e6363869ed1032dcdf0a61 GIT binary patch literal 132 zcmd;JU}pdU4InlGVp|~g1maL2P6XmyAg%;rCRTk2_|M3uufJ={mM!}F{~6fz^|x=? fzI{8Cy-9y7ND){Zg}n`-e%ods0IC5Q0|Ea5&V(a5 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..af5f0f468cd6c2c4b156383e4c6bf51172f56b77 GIT binary patch literal 137 zcmd;JU}pdU4InlFVh14h0pbWCP66TqAg%#o26lZI_zz-l-Uohn31lP-nEVd_y#plb literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..201c48199f67f2751e99d709e84a318ed27919de GIT binary patch literal 137 zcmd;JU}pdU4InlFVh14h0pbWCP66TqAg%#o26lZI_zz-l)8D>ztG+&%y;* mMxe|lD0|bct-E0CjhnY_hN;=PQ-Awzpc+OdkdZ84@;?BE<0SR~ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a33bd8ef648f5ca349871f15a8c7d6f8b0c3b25a GIT binary patch literal 120 zcmd;JU}pdU4InlFVh14h0pbWCP5|NzAT9u626lZI_zz-l1p$41Fni0^t=qOk*&89M Q{xdM^>jT+XX`qt-0RDpGx@7V5X2YXr|n~}L>kqk|a88QUR5R3>RzY$gC{tTov#U!AT9%9CT4vQ_|M3yufKEqE+C769mv|eY3p_< jd+TN(fU>vj+_G~kl)YJhtNs=!dx!o`eVBT%c|dUh>Kh|t literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dc873e301d21ea709ae2f8cd9aa27789d01aae53 GIT binary patch literal 208 zcmZwB!41MN4259}ih5y}ckKdfzyJ)u01UtY4A233ZXKsRGg$c(1&ITezSvS;S&9!TTjpOXmh5vHcP2IteHq2-;8_S{$)H; TtS#@WBA1yx^s=sA{eI;Gs&Y69 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ff1ee0248c7c99cfc2728c2ae3fe60ceda85df03 GIT binary patch literal 134 zcmd;JU}pdU4InlJVn-nM1>#5`P6gsZAg%^t1}1$VUS@rdI>hA)wm>7XZuz-mF0CA!rcmMzZ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7410e87a7d9670c9913f71f4a323685389a8968c GIT binary patch literal 134 zcmd;JU}pdU4InlKVtXL=2I6oaP6pz9Ag%^tMmBvY_|L$uufJ<65a{cJ*;}@5*}enH i*5AE-$8IQl*Ou)dEf6)^HgDPlWpCcRc`H~A!bkvhlO@{# literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b22264c4ab927d2e02be5b645a31b872df8367e0 GIT binary patch literal 137 zcmd;J;9y{2U}Vq$lEy%655zt|90|l}KwJdGbwJF-rVj=G8QJyqcWng%ef|Fo96-@6 rTeocA0p)Df-@SduZkWujE!#o5z*@F!+q`KLl)ZWL=B*$_j0jT!>SiYd literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..46423d78f08e5df072c416620979383a84884278 GIT binary patch literal 138 zcmd;JU}pdU4InlFVh14h0pbWCP6FaQAg%>s26lZI_zz-l2LXM3Fni;cO`A4D+4}lh nKIlf1AEO3y=b9U;?RS1(W{)Y8oOP literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..af8759ef399971468d5ac49d8c7e7e420e2f3bf4 GIT binary patch literal 144 zcmd;NU}pdU9UwLaVp|~g0OAlJP5|N@Ag%!779eJ2(g%Y7OspVk7m&rsrmw#P2!Kom kc76R#Teof724!yrslmqHx_vub{gzFeHbd1wl=qciWtT9EPdI;%Lx}7M6I!-`Hz00k$nU74LWv_N!XYFvj6}9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fa6e340dd7e5b71355a0a4fc5d828729c5cfad78 GIT binary patch literal 136 zcmd;JU}pdU4InlFVh14h0pbWCP66TqAg%#o26lZI_zz-l0Req|FnjyAT9x7CT4vQ_|M3yufJ=@E+C769mv|ebu)~; aai{*yjZkqAdkaj>)~(w?Y7jbMW&r>YvLa&u literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a478a2da247ac45f016de2ae2cd7e64aea11a6f6 GIT binary patch literal 136 zcmd;JU}pdU4InlFVh14h0pbWCP66TqAg%#o26lZI_zz-l0Req|2zxsaK-pU%s=(qX W?5*3k?|`b=v}Mz#%}_Sf(Ek7|=Oc*# literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..52061d8ebb3936a5e154a1d49714bafeb75079d4 GIT binary patch literal 126 zcmd;JU}pdU4InlFVh14h0pbWCP6FZ_AT9%926lZI_zz-l*Wb8ttG+&%y$OlEQGX*y d-G2sFef^DlH^W$4VXR$ScLBv1nZbtr2LQWFAN&9S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3e350d77e489680104eb8e25fc7b7512ccff9d56 GIT binary patch literal 139 zcmd;JU}pdU4InlEVk;na1L7bcjsxOcAg%#oCT4vQ_|M3yufKE0E+C76U0;9K=B=Ay m?9D*-R;c(!pi&_I&j8c~q*)*on7akS-3FBfDg?;_!G8dil_5|7 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2798a47b3a2d1d2d029e9680b68f9bc263b073e4 GIT binary patch literal 120 zcmd;JU}pdU4InlEVhbR40pb84jsfBfAT9u624;N__z$8tfM|9w4G{yfH*N(2sQAWB Un>THSvbTV>LG%IHVErI-0LfAu1^@s6 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..429c6a52e5d4e37e70eb17f1022cbcdfee5d92d5 GIT binary patch literal 128 zcmd;JU}pdU4InlHVkaQ>1L7zkP6gt8Ag%yn24;N_U}XZ4{~6fz^*3(O*WV6fZ{DiE i70L$6YzK?8fs}6C1`=k~*WUzG0%WlOSzsZEdH(^S_8$TO literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bc5b528c3e2f50486ddc839e571da1808f1649c4 GIT binary patch literal 152 zcmd;LU}pdU10c2lVkaQ>0pbWCP66TqAg%%8HXxn=#7xZkAn>1&6-aJ|u{Lkr3KU~t l2lBT9A(XvwD-gign>KF(Du=1r0n@o-E075>4J-yT9{|qKCkg-n literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ad72667cb50a2fa348669e4166d82ed0293748a0 GIT binary patch literal 158 zcmd;NU}pdU9U!&@VhMNw1(O#rF{83fXRVhI4n|0q!a literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..475944d63629829f0d15920b9903abe839d29d67 GIT binary patch literal 149 zcmd;N;9vj&9U!& aAbZQ^jhkTNTQ+arvIV3XtOle+|33gSlp7@g literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..adeadc5edb2672454f029d4ba9f8df94d8cf5b39 GIT binary patch literal 168 zcmd;LU}pdU10c2mVh^IAZ`KT2|zpth#A=RVchAnpL-DL}jsh}Quz1G_#9{0FhOfPlU}n7thc vU~G`0tw`c9_U28SwrqlmBdgf~)C*R_p|1~8vwb^A5s(80APyT7i1{A?d)YIb literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5df82d312140562b9d270b58851562729eb3ea45 GIT binary patch literal 148 zcmd;LU}pdU10c2lVh14h0pbWCP66TqAg%)979j2gVg_b?5cm(Gw}WVQef`Z~At-w* s5J1H@Zr-|e3zV&|zfFG=kj=!ZufKH{oV6Jw&&&ceYd4U=!UQ%O04a4QN&o-= literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..250c4f7edb62bb677afbdebd09c6c8ec5f2e2eba GIT binary patch literal 177 zcmd;PU}pdU6Cic~Vjm!m0OAxN&I95KAZ`TWULc+c#7lvgfn6U4{)5+5gR-vnecvFht@-34cD2FWwC=<9Fa4Oa*@4{X485P*tr+_ZVqW;8VbOd2qg literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..74f90b8b0cf46f86bbe0639f998f20b4f4adb648 GIT binary patch literal 124 zcmd;JU}pdU4InlFVh14h0pbWCP6FZ_AT9-B26lZI_zz-l-U#5`P6gsZAg%^t1}1$VUS@rdIZr=rDF)@RT)c+3v7z!cI literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bd3aeb4d1e40f53c15e65bcdd5caa0833b462fca GIT binary patch literal 176 zcmd;PU}pdU6Cic~Vjm!m0OAxN&I95qAZ`QVNkBXgh*tnH1G_#9{0FhOgMhw1n7wh+ z=1rTSY<+zo3&>_<)z{y(c^6c4*XFHo_Qsw1J2%2~0@+(&YPN3O4pI-+xdX&vVg_6J F9{`KUGd=(S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8573a46b9cffd001f72cba215266118b52f34afb GIT binary patch literal 138 zcmd;JU}pdU4InlHVkaQ>1L7zkP6Og1Ag%*qMkakAU||N4`u`c&_4T*w>u=o(WpC2o mxDm$QsK0RsOwGn!8{z6VZru!5zkTcGT|h-(b3h7!;6DH*?j#fd literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..14e398c7cb6eb87695f34f1b360c725c8b6994d1 GIT binary patch literal 188 zcmd;QU}j)o`1juhNcsSA2oT2raS9OU0C5Qr*8p(~5cdG_6d;}h#7ls94G?buVg_b? O5cm(GH`0j)*#`j0@GQ{) literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..255833abf9b6571f2ed1bb37bcc9be1c195e7315 GIT binary patch literal 98 zcmZQ)U||3O6(H6HVlyDN2VxH(4g}&TAZB3E2ZR40# Date: Thu, 7 Feb 2019 13:49:54 +0100 Subject: [PATCH 03/95] - fixed lowercase handling of non-basic-latin characters and added Undead's Russian translation. The added table may be overkill but this way the font engine is prepared for things to come. Currently the text placement in the menu seems a bit broken, that's a task for later. --- src/v_font.cpp | 703 ++++++++- wadsrc/static/language.rus | 2960 ++++++++++++++++++++++++++++++++++++ 2 files changed, 3658 insertions(+), 5 deletions(-) create mode 100644 wadsrc/static/language.rus diff --git a/src/v_font.cpp b/src/v_font.cpp index 9b10ba2bb3..0b4ebd9a04 100644 --- a/src/v_font.cpp +++ b/src/v_font.cpp @@ -206,12 +206,703 @@ static 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; + } +} + + static bool myislower(int code) { - if (code >= 'a' && code <= 'z') - return true; - if (code != 0xF7 && code != 0xFF && (code & 0xE0) == 0xE0) - return true; + if (code >= 0 && code < 65536) return islowermap[code]; return false; } @@ -260,6 +951,7 @@ static int stripaccent(int code) return 'Y' + (code & 0x20); if (acode == 0xDE) // Thorn return 'P' + (code & 0x20); // well, it sort of looks like a 'P' + // fixme: codes above 0x100 not supported yet! return code; } @@ -747,7 +1439,7 @@ int FFont::GetCharCode(int code, bool needpic) const // Try converting lowercase characters to uppercase. if (myislower(code)) { - code -= 32; + code = upperforlower[code]; if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) { return code; @@ -2246,6 +2938,7 @@ EColorRange V_ParseFontColor (const uint8_t *&color_value, int normalcolor, int void V_InitFonts() { + InitLowerUpper(); V_InitCustomFonts (); // load the heads-up font diff --git a/wadsrc/static/language.rus b/wadsrc/static/language.rus new file mode 100644 index 0000000000..d43087eeb7 --- /dev/null +++ b/wadsrc/static/language.rus @@ -0,0 +1,2960 @@ +/* РуÑÑкий Ñзык */ + +[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 = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ требуютÑÑ Ð²Ñе ключи"; + +// 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 = "ДоÑтигнут лимит фрагов."; +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 золотых"; +TAG_QUEST4 = "задание4"; +TAG_QUEST5 = "задание5"; +TAG_QUEST6 = "задание4"; + +// 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_PALLETEHACK = "DirectDraw хак палитры"; // Ðе иÑпользуетÑÑ +DSPLYMNU_ATTACHEDSURFACES = "ИÑпользовать прикрепленные поверхноÑти"; // Ðе иÑпользуетÑÑ +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."; + +// 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"; +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 = "Язык"; From b1820039d754478cda4d166f29422f7c12cde2e4 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 9 Feb 2019 12:52:50 +0100 Subject: [PATCH 04/95] - exported Strife's log texts to the string table. This is dpne as a two-stage approach. TXT_LOGTEXTxxx will always take precedence over the log lumps, and TXT_ILOGxxx will only replace the original IWAD content. This is so that PWADs replacing these lumps don't get overridden by the default texts. --- src/gamedata/stringtable.cpp | 18 ++++-- src/p_user.cpp | 33 ++++++++--- wadsrc_extra/static/language.enu | 94 ++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 11 deletions(-) diff --git a/src/gamedata/stringtable.cpp b/src/gamedata/stringtable.cpp index 2fd41e94b8..95c2e754ed 100644 --- a/src/gamedata/stringtable.cpp +++ b/src/gamedata/stringtable.cpp @@ -124,7 +124,14 @@ void FStringTable::LoadLanguage (int lumpnum) 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(); @@ -141,10 +148,13 @@ void FStringTable::LoadLanguage (int lumpnum) strText += sc.String; sc.MustGetString (); } - // Insert the string into all relevant tables. - for (auto map : activeMaps) + if (!skip) { - allStrings[map].Insert(strName, strText); + // Insert the string into all relevant tables. + for (auto map : activeMaps) + { + allStrings[map].Insert(strName, strText); + } } } } 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/wadsrc_extra/static/language.enu b/wadsrc_extra/static/language.enu index a5780be758..18de988596 100644 --- a/wadsrc_extra/static/language.enu +++ b/wadsrc_extra/static/language.enu @@ -1125,3 +1125,97 @@ TXT_DLG_SCRIPT34_d30320_GOODB = "GOOD. BLACKBIRD WILL CONTINUE TO BE YOUR GUIDE. 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."; From e57b16b9e72cb8abe521e5ef5a0ba66591bd5adc Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 9 Feb 2019 13:15:30 +0100 Subject: [PATCH 05/95] - exported the character names of Strife's dialogues. --- src/p_conversation.cpp | 24 +++++++++++- wadsrc_extra/static/language.enu | 66 ++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index cd6b7b803a..7b2e08b6ad 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -370,7 +370,17 @@ static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, const char *nam // The speaker's name, if any. speech.Sound[0] = 0; //speech.Name[16] = 0; - node->SpeakerName = speech.Name; + if (name && speech.Name[0]) + { + FString label = speech.Name; + label.ReplaceChars(' ', '_'); + label.ReplaceChars('\'', '_'); + node->SpeakerName.Format("$TXT_SPEAKER_%s", label.GetChars()); + } + else + { + node->SpeakerName = speech.Name; + } // The item the speaker should drop when killed. node->DropType = GetStrifeType(speech.DropType); @@ -459,7 +469,17 @@ static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, const char *nam // The speaker's name, if any. speech.Dialogue[0] = 0; //speech.Name[16] = 0; - node->SpeakerName = speech.Name; + if (name && speech.Name[0]) + { + FString label = speech.Name; + label.ReplaceChars(' ', '_'); + label.ReplaceChars('\'', '_'); + node->SpeakerName.Format("$TXT_SPEAKER_%s", label.GetChars()); + } + else + { + node->SpeakerName = speech.Name; + } // The item the speaker should drop when killed. node->DropType = GetStrifeType (speech.DropType); diff --git a/wadsrc_extra/static/language.enu b/wadsrc_extra/static/language.enu index 18de988596..0e8daea0bf 100644 --- a/wadsrc_extra/static/language.enu +++ b/wadsrc_extra/static/language.enu @@ -1219,3 +1219,69 @@ TXT_ILOG1029 = "TO ENTER THE FACTORY, YOU NEED A KEY. WE STOLE ONE, BUT THE AGEN 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"; From c51ae7523fdc951040352ae3f6210350d9b10ac6 Mon Sep 17 00:00:00 2001 From: Sasha Red Date: Sat, 9 Feb 2019 19:50:35 +0100 Subject: [PATCH 06/95] Added Russian Unicode alphabet for Hexen, Heretic, and Strife MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The BIGFONT system works in both Heretic and Hexen; however, as Doom and Strife still depend on a lump format, they lack it. (Also renamed the “game-raven†directory to “game-hereticâ€â€”the lumps in that folder are made for the Heretic palette, and become riddled with artifacts when loaded in Hexen). --- .../filter/game-heretic/fonts/defbigfont/0410.lmp | Bin 0 -> 256 bytes .../filter/game-heretic/fonts/defbigfont/0411.lmp | Bin 0 -> 254 bytes .../filter/game-heretic/fonts/defbigfont/0412.lmp | Bin 0 -> 260 bytes .../filter/game-heretic/fonts/defbigfont/0413.lmp | Bin 0 -> 217 bytes .../filter/game-heretic/fonts/defbigfont/0414.lmp | Bin 0 -> 317 bytes .../filter/game-heretic/fonts/defbigfont/0415.lmp | Bin 0 -> 228 bytes .../filter/game-heretic/fonts/defbigfont/0416.lmp | Bin 0 -> 385 bytes .../filter/game-heretic/fonts/defbigfont/0417.lmp | Bin 0 -> 234 bytes .../filter/game-heretic/fonts/defbigfont/0418.lmp | Bin 0 -> 276 bytes .../filter/game-heretic/fonts/defbigfont/0419.lmp | Bin 0 -> 300 bytes .../filter/game-heretic/fonts/defbigfont/041A.lmp | Bin 0 -> 274 bytes .../filter/game-heretic/fonts/defbigfont/041B.lmp | Bin 0 -> 250 bytes .../filter/game-heretic/fonts/defbigfont/041C.lmp | Bin 0 -> 337 bytes .../filter/game-heretic/fonts/defbigfont/041D.lmp | Bin 0 -> 288 bytes .../filter/game-heretic/fonts/defbigfont/041E.lmp | Bin 0 -> 260 bytes .../filter/game-heretic/fonts/defbigfont/041F.lmp | Bin 0 -> 298 bytes .../filter/game-heretic/fonts/defbigfont/0420.lmp | Bin 0 -> 304 bytes .../filter/game-heretic/fonts/defbigfont/0421.lmp | Bin 0 -> 216 bytes .../filter/game-heretic/fonts/defbigfont/0422.lmp | Bin 0 -> 214 bytes .../filter/game-heretic/fonts/defbigfont/0423.lmp | Bin 0 -> 232 bytes .../filter/game-heretic/fonts/defbigfont/0424.lmp | Bin 0 -> 416 bytes .../filter/game-heretic/fonts/defbigfont/0425.lmp | Bin 0 -> 249 bytes .../filter/game-heretic/fonts/defbigfont/0426.lmp | Bin 0 -> 298 bytes .../filter/game-heretic/fonts/defbigfont/0427.lmp | Bin 0 -> 252 bytes .../filter/game-heretic/fonts/defbigfont/0428.lmp | Bin 0 -> 405 bytes .../filter/game-heretic/fonts/defbigfont/0429.lmp | Bin 0 -> 440 bytes .../filter/game-heretic/fonts/defbigfont/042A.lmp | Bin 0 -> 258 bytes .../filter/game-heretic/fonts/defbigfont/042B.lmp | Bin 0 -> 367 bytes .../filter/game-heretic/fonts/defbigfont/042C.lmp | Bin 0 -> 231 bytes .../filter/game-heretic/fonts/defbigfont/042D.lmp | Bin 0 -> 258 bytes .../filter/game-heretic/fonts/defbigfont/042E.lmp | Bin 0 -> 392 bytes .../filter/game-heretic/fonts/defbigfont/042F.lmp | Bin 0 -> 270 bytes .../fonts/defsmallfont/005C.lmp | Bin .../fonts/defsmallfont/005D.lmp | Bin .../fonts/defsmallfont/005E.lmp | Bin .../fonts/defsmallfont/005F.lmp | Bin .../game-heretic/fonts/defsmallfont/00AB.lmp | Bin 0 -> 112 bytes .../game-heretic/fonts/defsmallfont/00BB.lmp | Bin 0 -> 112 bytes .../fonts/defsmallfont/00C4.lmp | Bin .../fonts/defsmallfont/00C5.lmp | Bin .../fonts/defsmallfont/00D6.lmp | Bin .../fonts/defsmallfont/00DC.lmp | Bin .../fonts/defsmallfont/00DF.lmp | Bin .../game-heretic/fonts/defsmallfont/0401.lmp | Bin 0 -> 168 bytes .../game-heretic/fonts/defsmallfont/0410.lmp | Bin 0 -> 148 bytes .../game-heretic/fonts/defsmallfont/0411.lmp | Bin 0 -> 158 bytes .../game-heretic/fonts/defsmallfont/0412.lmp | Bin 0 -> 142 bytes .../game-heretic/fonts/defsmallfont/0413.lmp | Bin 0 -> 120 bytes .../game-heretic/fonts/defsmallfont/0414.lmp | Bin 0 -> 163 bytes .../game-heretic/fonts/defsmallfont/0415.lmp | Bin 0 -> 148 bytes .../game-heretic/fonts/defsmallfont/0416.lmp | Bin 0 -> 196 bytes .../game-heretic/fonts/defsmallfont/0417.lmp | Bin 0 -> 138 bytes .../game-heretic/fonts/defsmallfont/0418.lmp | Bin 0 -> 130 bytes .../game-heretic/fonts/defsmallfont/0419.lmp | Bin 0 -> 133 bytes .../game-heretic/fonts/defsmallfont/041A.lmp | Bin 0 -> 138 bytes .../game-heretic/fonts/defsmallfont/041B.lmp | Bin 0 -> 137 bytes .../game-heretic/fonts/defsmallfont/041C.lmp | Bin 0 -> 142 bytes .../game-heretic/fonts/defsmallfont/041D.lmp | Bin 0 -> 132 bytes .../game-heretic/fonts/defsmallfont/041E.lmp | Bin 0 -> 144 bytes .../game-heretic/fonts/defsmallfont/041F.lmp | Bin 0 -> 130 bytes .../game-heretic/fonts/defsmallfont/0420.lmp | Bin 0 -> 152 bytes .../game-heretic/fonts/defsmallfont/0421.lmp | Bin 0 -> 152 bytes .../game-heretic/fonts/defsmallfont/0422.lmp | Bin 0 -> 130 bytes .../game-heretic/fonts/defsmallfont/0423.lmp | Bin 0 -> 152 bytes .../game-heretic/fonts/defsmallfont/0424.lmp | Bin 0 -> 184 bytes .../game-heretic/fonts/defsmallfont/0425.lmp | Bin 0 -> 156 bytes .../game-heretic/fonts/defsmallfont/0426.lmp | Bin 0 -> 144 bytes .../game-heretic/fonts/defsmallfont/0427.lmp | Bin 0 -> 119 bytes .../game-heretic/fonts/defsmallfont/0428.lmp | Bin 0 -> 160 bytes .../game-heretic/fonts/defsmallfont/0429.lmp | Bin 0 -> 174 bytes .../game-heretic/fonts/defsmallfont/042A.lmp | Bin 0 -> 135 bytes .../game-heretic/fonts/defsmallfont/042B.lmp | Bin 0 -> 178 bytes .../game-heretic/fonts/defsmallfont/042C.lmp | Bin 0 -> 125 bytes .../game-heretic/fonts/defsmallfont/042D.lmp | Bin 0 -> 129 bytes .../game-heretic/fonts/defsmallfont/042E.lmp | Bin 0 -> 176 bytes .../game-heretic/fonts/defsmallfont/042F.lmp | Bin 0 -> 132 bytes .../game-heretic/fonts/defsmallfont/2014.lmp | Bin 0 -> 188 bytes .../game-heretic/fonts/defsmallfont/201C.lmp | Bin 0 -> 105 bytes .../game-heretic/fonts/defsmallfont/201E.lmp | Bin 0 -> 104 bytes .../filter/game-hexen/fonts/defbigfont/0410.lmp | Bin 0 -> 256 bytes .../filter/game-hexen/fonts/defbigfont/0411.lmp | Bin 0 -> 254 bytes .../filter/game-hexen/fonts/defbigfont/0412.lmp | Bin 0 -> 260 bytes .../filter/game-hexen/fonts/defbigfont/0413.lmp | Bin 0 -> 217 bytes .../filter/game-hexen/fonts/defbigfont/0414.lmp | Bin 0 -> 317 bytes .../filter/game-hexen/fonts/defbigfont/0415.lmp | Bin 0 -> 228 bytes .../filter/game-hexen/fonts/defbigfont/0416.lmp | Bin 0 -> 385 bytes .../filter/game-hexen/fonts/defbigfont/0417.lmp | Bin 0 -> 234 bytes .../filter/game-hexen/fonts/defbigfont/0418.lmp | Bin 0 -> 276 bytes .../filter/game-hexen/fonts/defbigfont/0419.lmp | Bin 0 -> 300 bytes .../filter/game-hexen/fonts/defbigfont/041A.lmp | Bin 0 -> 274 bytes .../filter/game-hexen/fonts/defbigfont/041B.lmp | Bin 0 -> 250 bytes .../filter/game-hexen/fonts/defbigfont/041C.lmp | Bin 0 -> 337 bytes .../filter/game-hexen/fonts/defbigfont/041D.lmp | Bin 0 -> 288 bytes .../filter/game-hexen/fonts/defbigfont/041E.lmp | Bin 0 -> 260 bytes .../filter/game-hexen/fonts/defbigfont/041F.lmp | Bin 0 -> 298 bytes .../filter/game-hexen/fonts/defbigfont/0420.lmp | Bin 0 -> 304 bytes .../filter/game-hexen/fonts/defbigfont/0421.lmp | Bin 0 -> 215 bytes .../filter/game-hexen/fonts/defbigfont/0422.lmp | Bin 0 -> 214 bytes .../filter/game-hexen/fonts/defbigfont/0423.lmp | Bin 0 -> 232 bytes .../filter/game-hexen/fonts/defbigfont/0424.lmp | Bin 0 -> 416 bytes .../filter/game-hexen/fonts/defbigfont/0425.lmp | Bin 0 -> 249 bytes .../filter/game-hexen/fonts/defbigfont/0426.lmp | Bin 0 -> 298 bytes .../filter/game-hexen/fonts/defbigfont/0427.lmp | Bin 0 -> 252 bytes .../filter/game-hexen/fonts/defbigfont/0428.lmp | Bin 0 -> 405 bytes .../filter/game-hexen/fonts/defbigfont/0429.lmp | Bin 0 -> 440 bytes .../filter/game-hexen/fonts/defbigfont/042A.lmp | Bin 0 -> 258 bytes .../filter/game-hexen/fonts/defbigfont/042B.lmp | Bin 0 -> 367 bytes .../filter/game-hexen/fonts/defbigfont/042C.lmp | Bin 0 -> 231 bytes .../filter/game-hexen/fonts/defbigfont/042D.lmp | Bin 0 -> 258 bytes .../filter/game-hexen/fonts/defbigfont/042E.lmp | Bin 0 -> 392 bytes .../filter/game-hexen/fonts/defbigfont/042F.lmp | Bin 0 -> 270 bytes .../filter/game-hexen/fonts/defsmallfont/00AB.lmp | Bin 0 -> 112 bytes .../filter/game-hexen/fonts/defsmallfont/00BB.lmp | Bin 0 -> 112 bytes .../filter/game-hexen/fonts/defsmallfont/0401.lmp | Bin 0 -> 168 bytes .../filter/game-hexen/fonts/defsmallfont/0410.lmp | Bin 0 -> 148 bytes .../filter/game-hexen/fonts/defsmallfont/0411.lmp | Bin 0 -> 158 bytes .../filter/game-hexen/fonts/defsmallfont/0412.lmp | Bin 0 -> 142 bytes .../filter/game-hexen/fonts/defsmallfont/0413.lmp | Bin 0 -> 120 bytes .../filter/game-hexen/fonts/defsmallfont/0414.lmp | Bin 0 -> 163 bytes .../filter/game-hexen/fonts/defsmallfont/0415.lmp | Bin 0 -> 148 bytes .../filter/game-hexen/fonts/defsmallfont/0416.lmp | Bin 0 -> 196 bytes .../filter/game-hexen/fonts/defsmallfont/0417.lmp | Bin 0 -> 138 bytes .../filter/game-hexen/fonts/defsmallfont/0418.lmp | Bin 0 -> 130 bytes .../filter/game-hexen/fonts/defsmallfont/0419.lmp | Bin 0 -> 133 bytes .../filter/game-hexen/fonts/defsmallfont/041A.lmp | Bin 0 -> 138 bytes .../filter/game-hexen/fonts/defsmallfont/041B.lmp | Bin 0 -> 137 bytes .../filter/game-hexen/fonts/defsmallfont/041C.lmp | Bin 0 -> 142 bytes .../filter/game-hexen/fonts/defsmallfont/041D.lmp | Bin 0 -> 128 bytes .../filter/game-hexen/fonts/defsmallfont/041E.lmp | Bin 0 -> 144 bytes .../filter/game-hexen/fonts/defsmallfont/041F.lmp | Bin 0 -> 130 bytes .../filter/game-hexen/fonts/defsmallfont/0420.lmp | Bin 0 -> 152 bytes .../filter/game-hexen/fonts/defsmallfont/0421.lmp | Bin 0 -> 152 bytes .../filter/game-hexen/fonts/defsmallfont/0422.lmp | Bin 0 -> 130 bytes .../filter/game-hexen/fonts/defsmallfont/0423.lmp | Bin 0 -> 152 bytes .../filter/game-hexen/fonts/defsmallfont/0424.lmp | Bin 0 -> 184 bytes .../filter/game-hexen/fonts/defsmallfont/0425.lmp | Bin 0 -> 156 bytes .../filter/game-hexen/fonts/defsmallfont/0426.lmp | Bin 0 -> 144 bytes .../filter/game-hexen/fonts/defsmallfont/0427.lmp | Bin 0 -> 119 bytes .../filter/game-hexen/fonts/defsmallfont/0428.lmp | Bin 0 -> 160 bytes .../filter/game-hexen/fonts/defsmallfont/0429.lmp | Bin 0 -> 174 bytes .../filter/game-hexen/fonts/defsmallfont/042A.lmp | Bin 0 -> 135 bytes .../filter/game-hexen/fonts/defsmallfont/042B.lmp | Bin 0 -> 178 bytes .../filter/game-hexen/fonts/defsmallfont/042C.lmp | Bin 0 -> 125 bytes .../filter/game-hexen/fonts/defsmallfont/042D.lmp | Bin 0 -> 129 bytes .../filter/game-hexen/fonts/defsmallfont/042E.lmp | Bin 0 -> 176 bytes .../filter/game-hexen/fonts/defsmallfont/042F.lmp | Bin 0 -> 132 bytes .../filter/game-hexen/fonts/defsmallfont/2014.lmp | Bin 0 -> 188 bytes .../filter/game-hexen/fonts/defsmallfont/201C.lmp | Bin 0 -> 105 bytes .../filter/game-hexen/fonts/defsmallfont/201E.lmp | Bin 0 -> 104 bytes .../game-strife/fonts/defsmallfont/00AB.lmp | Bin 0 -> 89 bytes .../game-strife/fonts/defsmallfont/00BB.lmp | Bin 0 -> 89 bytes .../game-strife/fonts/defsmallfont/0401.lmp | Bin 0 -> 145 bytes .../game-strife/fonts/defsmallfont/0410.lmp | Bin 0 -> 168 bytes .../game-strife/fonts/defsmallfont/0411.lmp | Bin 0 -> 147 bytes .../game-strife/fonts/defsmallfont/0412.lmp | Bin 0 -> 137 bytes .../game-strife/fonts/defsmallfont/0413.lmp | Bin 0 -> 120 bytes .../game-strife/fonts/defsmallfont/0414.lmp | Bin 0 -> 186 bytes .../game-strife/fonts/defsmallfont/0415.lmp | Bin 0 -> 143 bytes .../game-strife/fonts/defsmallfont/0416.lmp | Bin 0 -> 204 bytes .../game-strife/fonts/defsmallfont/0417.lmp | Bin 0 -> 133 bytes .../game-strife/fonts/defsmallfont/0418.lmp | Bin 0 -> 169 bytes .../game-strife/fonts/defsmallfont/0419.lmp | Bin 0 -> 175 bytes .../game-strife/fonts/defsmallfont/041A.lmp | Bin 0 -> 126 bytes .../game-strife/fonts/defsmallfont/041B.lmp | Bin 0 -> 143 bytes .../game-strife/fonts/defsmallfont/041C.lmp | Bin 0 -> 182 bytes .../game-strife/fonts/defsmallfont/041D.lmp | Bin 0 -> 108 bytes .../game-strife/fonts/defsmallfont/041E.lmp | Bin 0 -> 142 bytes .../game-strife/fonts/defsmallfont/041F.lmp | Bin 0 -> 148 bytes .../game-strife/fonts/defsmallfont/0420.lmp | Bin 0 -> 138 bytes .../game-strife/fonts/defsmallfont/0421.lmp | Bin 0 -> 150 bytes .../game-strife/fonts/defsmallfont/0422.lmp | Bin 0 -> 122 bytes .../game-strife/fonts/defsmallfont/0423.lmp | Bin 0 -> 142 bytes .../game-strife/fonts/defsmallfont/0424.lmp | Bin 0 -> 152 bytes .../game-strife/fonts/defsmallfont/0425.lmp | Bin 0 -> 127 bytes .../game-strife/fonts/defsmallfont/0426.lmp | Bin 0 -> 164 bytes .../game-strife/fonts/defsmallfont/0427.lmp | Bin 0 -> 139 bytes .../game-strife/fonts/defsmallfont/0428.lmp | Bin 0 -> 198 bytes .../game-strife/fonts/defsmallfont/0429.lmp | Bin 0 -> 213 bytes .../game-strife/fonts/defsmallfont/042A.lmp | Bin 0 -> 160 bytes .../game-strife/fonts/defsmallfont/042B.lmp | Bin 0 -> 188 bytes .../game-strife/fonts/defsmallfont/042C.lmp | Bin 0 -> 136 bytes .../game-strife/fonts/defsmallfont/042D.lmp | Bin 0 -> 146 bytes .../game-strife/fonts/defsmallfont/042E.lmp | Bin 0 -> 215 bytes .../game-strife/fonts/defsmallfont/042F.lmp | Bin 0 -> 150 bytes .../game-strife/fonts/defsmallfont/2014.lmp | Bin 0 -> 188 bytes .../game-strife/fonts/defsmallfont2/0410.lmp | Bin 0 -> 96 bytes .../game-strife/fonts/defsmallfont2/0411.lmp | Bin 0 -> 107 bytes .../game-strife/fonts/defsmallfont2/0412.lmp | Bin 0 -> 89 bytes .../game-strife/fonts/defsmallfont2/0413.lmp | Bin 0 -> 95 bytes .../game-strife/fonts/defsmallfont2/0414.lmp | Bin 0 -> 138 bytes .../game-strife/fonts/defsmallfont2/0415.lmp | Bin 0 -> 89 bytes .../game-strife/fonts/defsmallfont2/0416.lmp | Bin 0 -> 169 bytes .../game-strife/fonts/defsmallfont2/0417.lmp | Bin 0 -> 113 bytes .../game-strife/fonts/defsmallfont2/0418.lmp | Bin 0 -> 120 bytes .../game-strife/fonts/defsmallfont2/0419.lmp | Bin 0 -> 127 bytes .../game-strife/fonts/defsmallfont2/041A.lmp | Bin 0 -> 98 bytes .../game-strife/fonts/defsmallfont2/041B.lmp | Bin 0 -> 116 bytes .../game-strife/fonts/defsmallfont2/041C.lmp | Bin 0 -> 131 bytes .../game-strife/fonts/defsmallfont2/041D.lmp | Bin 0 -> 84 bytes .../game-strife/fonts/defsmallfont2/041E.lmp | Bin 0 -> 111 bytes .../game-strife/fonts/defsmallfont2/041F.lmp | Bin 0 -> 105 bytes .../game-strife/fonts/defsmallfont2/0420.lmp | Bin 0 -> 101 bytes .../game-strife/fonts/defsmallfont2/0421.lmp | Bin 0 -> 86 bytes .../game-strife/fonts/defsmallfont2/0422.lmp | Bin 0 -> 87 bytes .../game-strife/fonts/defsmallfont2/0423.lmp | Bin 0 -> 119 bytes .../game-strife/fonts/defsmallfont2/0424.lmp | Bin 0 -> 122 bytes .../game-strife/fonts/defsmallfont2/0425.lmp | Bin 0 -> 122 bytes .../game-strife/fonts/defsmallfont2/0426.lmp | Bin 0 -> 117 bytes .../game-strife/fonts/defsmallfont2/0427.lmp | Bin 0 -> 96 bytes .../game-strife/fonts/defsmallfont2/0428.lmp | Bin 0 -> 139 bytes .../game-strife/fonts/defsmallfont2/0429.lmp | Bin 0 -> 150 bytes .../game-strife/fonts/defsmallfont2/042A.lmp | Bin 0 -> 109 bytes .../game-strife/fonts/defsmallfont2/042B.lmp | Bin 0 -> 142 bytes .../game-strife/fonts/defsmallfont2/042C.lmp | Bin 0 -> 99 bytes .../game-strife/fonts/defsmallfont2/042D.lmp | Bin 0 -> 97 bytes .../game-strife/fonts/defsmallfont2/042E.lmp | Bin 0 -> 168 bytes .../game-strife/fonts/defsmallfont2/042F.lmp | Bin 0 -> 110 bytes 217 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0410.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0411.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0412.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0413.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0414.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0415.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0416.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0417.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0418.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0419.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041A.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041B.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041C.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041D.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041E.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/041F.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0420.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0421.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0422.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0423.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0424.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0425.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0426.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0427.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0428.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0429.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042A.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042B.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042C.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042D.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042E.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042F.lmp rename wadsrc_extra/static/filter/{game-raven => game-heretic}/fonts/defsmallfont/005C.lmp (100%) rename wadsrc_extra/static/filter/{game-raven => game-heretic}/fonts/defsmallfont/005D.lmp (100%) rename wadsrc_extra/static/filter/{game-raven => game-heretic}/fonts/defsmallfont/005E.lmp (100%) rename wadsrc_extra/static/filter/{game-raven => game-heretic}/fonts/defsmallfont/005F.lmp (100%) create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00AB.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00BB.lmp rename wadsrc_extra/static/filter/{game-raven => game-heretic}/fonts/defsmallfont/00C4.lmp (100%) rename wadsrc_extra/static/filter/{game-raven => game-heretic}/fonts/defsmallfont/00C5.lmp (100%) rename wadsrc_extra/static/filter/{game-raven => game-heretic}/fonts/defsmallfont/00D6.lmp (100%) rename wadsrc_extra/static/filter/{game-raven => game-heretic}/fonts/defsmallfont/00DC.lmp (100%) rename wadsrc_extra/static/filter/{game-raven => game-heretic}/fonts/defsmallfont/00DF.lmp (100%) create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0401.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0410.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0411.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0412.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0413.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0414.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0415.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0416.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0417.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0418.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0419.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041A.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041B.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041C.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041D.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041E.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041F.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0420.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0421.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0422.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0423.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0424.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0425.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0426.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0427.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0428.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0429.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042A.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042B.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042C.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042D.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042E.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042F.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/2014.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/201C.lmp create mode 100644 wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/201E.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0410.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0411.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0412.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0413.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0414.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0415.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0416.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0417.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0418.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0419.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041A.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041B.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041C.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041D.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041E.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/041F.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0420.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0421.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0422.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0423.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0424.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0425.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0426.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0427.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0428.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0429.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042A.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042B.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042C.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042D.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042E.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042F.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00AB.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00BB.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0401.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0410.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0411.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0412.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0413.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0414.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0415.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0416.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0417.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0418.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0419.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041A.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041B.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041C.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041D.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041E.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041F.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0420.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0421.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0422.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0423.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0424.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0425.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0426.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0427.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0428.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0429.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042A.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042B.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042C.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042D.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042E.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042F.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/2014.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/201C.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/201E.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/00AB.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/00BB.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0401.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0410.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0411.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0412.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0413.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0414.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0415.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0416.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0417.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0418.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0419.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041A.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041B.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041C.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041D.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041E.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041F.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0420.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0421.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0422.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0423.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0424.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0425.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0426.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0427.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0428.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0429.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042A.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042B.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042C.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042D.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042E.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042F.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/2014.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0410.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0411.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0412.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0413.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0414.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0415.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0416.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0417.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0418.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0419.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041A.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041B.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041C.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041D.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041E.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/041F.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0420.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0421.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0422.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0423.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0424.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0425.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0426.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0427.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0428.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0429.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042A.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042B.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042C.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042D.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042E.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/042F.lmp 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 0000000000000000000000000000000000000000..2ffcdb6b902a17dc800cb00b719908ebe44fdff0 GIT binary patch literal 256 zcmXwz%?-jZ3`Wz^Ru!S!aAydXUWs5<>XZ zGvkF^$&K8}gFMNLyvdiWWSVk@0V1_K0LXcqMXb0P?==h}j+Dk3__(o>g<()NZPKim zib9nV*riKKNp~rn*#qv8acgIyO>&II-mJ-m?R@3tQrtHq!VfhKY%98x2&Zxzb55=O KF=ydvf$1NLl9jjs literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bf333fc4b13d5d8c7afba5232f69fbf0ac9ca784 GIT binary patch literal 254 zcmXAj(G9{d3`Enk70}Xc*nkz7ff<;AA((RDXGRoui~Jj7GH#7BHZoJcQT^xkH*I|6PwXERlxh6QN7t5>iZ(lWCw6*RMRHzpc6 zM_Ja;n>jEwWK(U`umiL+Zw5$d J98==j{{iCrk=pKeP0$22P=FmDTLL8@q%cV&EIlh8Pdp{8A%t%` zqhG)k+`t`d-~pcC1suG=2gF3AS|T&ISVVS5neVQ(wy-jrtBOcxC?al{RMm7Uc=a7b zG*m{+Y@E literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..36ad9318778d128e71c13967a374e69cf2831c82 GIT binary patch literal 217 zcmXYq!41Md3JD4OGCBFK-^PeRgU=3gc6Jnmh06R(q6DM1ISO z`wSPj!VT{5fG51*4IlV|Y*clTA;MJ;TeDJQW-vMPY$vD ioN`)AHHHq2N)4o|M|GOIYSp)M4=ZDDMsnSHZutY{ae4&+ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6bc728471a8d0b80165bcea1760217a8603c3792 GIT binary patch literal 317 zcmXYr-3`Jp41|-WAdyyT#Sm=34!rWt3T(g#tiT9tzy>@v{z+j4Hb8`PAkvq{=j+*{ z8=Z6SvctUx2XF)@a0VA}1vhX9Pw)aCu=dVvz!r3E&Z;SuxKtGp!n5s}MTLp2oTd_@ zNX~PHftgFwiBvN_LR38b%7nv~K*a?Uc-5xFg1~AzzFQX7EHkotiW4+wp&&~D(8wwUu>W4^OTM$rSEp) ze5Aq~0@+KcrIzUZf4y literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..494b23530eca33b1a6ca5ff0f315825a89af65b8 GIT binary patch literal 385 zcmZvY&20if428Y0%kq;wao|h=^gs{L01^!#Q2{;BLkh?_E#$EF^9(m?;EFW7StPPi z80oXdPh6R8R%A^!WKWKy7^niXfxB6f zl1TujL-z~7+$=JmlfwfF!o5$=u{ zyY7uD+cGDf3#9>KFg%aH6qvz5y;IydEk99hwQbYyi2mU0i(dP_-nswxL$1JjEBLdY E2Z0XSQvd(} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8f206672bfaecb85c91f62245d1a33e1647a6de8 GIT binary patch literal 234 zcmXYr+Y!Pb6hwgp$3)YM{}y2rc3~MdVGXw6C-(uV#hG}*_;KLwva^>tEFpyNcHz9j z4es!OC%oVdA6Owp5jjOw-Qplp&2lmmnUktJo@%W%CwH?6!L@~vAVW^Ix=-W&RtmOi zbJaYwhMq_{^6!_DkN9k}-m#diY-+O3pjX#511QKo0wg7ZQX3i%vdsz(kv3`X5nttr@dJssbyv&sJI83 zwf{5Bsw&&kFkAZsnNo*~G4~0Rc-nUE8PJYEFi5H5Qql$UCZ44~YFkAiInwcgHZu<| Lfh|TlTmG)=WC00&1WJYM=%>;7$qDz{Oge&sRj`Vhjm z9LXm*!v(HzgF8In2`_lV2ig@WrsS$!qiR+{FEZqT7>9A37G*RycQ>mUkLpB~X^6$+ zGFxk**O*sl<(HHqWZ1=_uz_GZo>rl!ole6xDD9b~D!XE+ypyhKLc-Y`YPu US5$?IbKbYy{cr2!fUSP`18%0D82|tP literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bb676ac532fe8f1bc87f8ce681f8af8abdb5527b GIT binary patch literal 250 zcmXAiyAi@L5JV+|&CjMLN2KI5KnFBHP6yOL4b&j%PI62Mgv^L{wq~AYccr^My1_a3 zt0VUb&TxS%+~5umc)|{R-|M_r&L#a5z{I$hEN;c zu#(L9&Wt3JZ6-!7Yu%7iQOTuDC6|f)OTwh8%~RtB8f~>o5Y+(m`=z8a32$L0&+^s~Os!3CNCXF%M$@|Dj zVw4JrNGWN7P_mhML2J-@$~zR3__|yOxgVH{-cOb&_hSgLT=OuB(CFM>_Umm*^tS&H nt4d{9Rr#zb6#*|8;6P`YvXgU?D06L=-HIeMBVUy|roKWShHJ(+ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e887cff9450d9d6926ae965b7fdac870164adc09 GIT binary patch literal 288 zcmXwz%MHRX5JcCCazJt@fNE%f7N~(5sDT=CqzGErf9}-41<8yZVe47;YBbMBT8QY| z&NwgN3U1&I9$*De@B$3p-~$eY=mg5d?5eehNGsKB%go3vw@_`gh(x-(VY``OVwTab zz-?sQV?;&_HMB6Rs+glxgt^TV!d(EHG0&4Ko`0!(hJ^>byHpheRQ9z?5$S(`7?UB5 U2y~9Xn3T%gWkV^5)WR_T0J)T_KmY&$ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cbd53e0dc809cd1e94659ed4a01fef128d0069ee GIT binary patch literal 260 zcmW-b-3`Jp420dLsnVcs#5)VH0VA*jGcW@yFanS9Px8P9EP#X*&WZFz@%hfqPCF6( z`VsdDoWTWL!42HO13bYCyuk;2!Lo{2HDT@{skU0HDT+CpHB(g^<#a&LU81HUoubFI zl!ON)Bq(}TO4%0lY$)cVU12sGG3GHp2Y6wbqUzY5=UP?!w8A-rEigAk<~$U9r1_SR Pd^qNMvBXkXa60_~&s&oc literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a137d9f9db096abf68bd22f7bfd80da4be70b740 GIT binary patch literal 298 zcmXw!Z4Cl342HYFKkjgV7Yv{Q4QN0E8cqQUkkGGf2GBr4a=h)1ZBMf{-Jb18GZB5) zGvWnY!42HO11#VPUO>Sce88a)odE5aU3DsEw$g0YdTXsB_U4|Iij5m4;?`5KLnT&J z+-tT(8!j8CTxA=~EA7o{dN?!Hk&W}J%?;Wf;c%^?JxOUbDeEf%vXsz@qHHK(K{5h{YJ zN~2nB!3EV#OhQ#oj7m~#_WR|L5aFLfs7)86jT*i6QZkUsw#CT|dUHe=tS{RlqloRm h(1eN2-QcvC=WHMFgNO+RWxEn#fyKM_9YwSq-4Ct5wygjF literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ee9724f75752b9f475f0ef21d17f4f0077fa21f2 GIT binary patch literal 216 zcmXwy>kYy%420b#K`oDM_|F1tzzWR33e3O?jKBuSKD+5GNa4yu$`|D>_T5HyBJyf` z-Uo6dCvqkiawRu%ClB%@dF5W`DS(y+KBowGv(~RE!r?rW-4>`}s^$n+ZIXd$28Lqh t5gd`sjcPXX$3I2^BJgvTrH&5sRL8`crKK<*j2-)LYc~5!&Zkb7syFv;b#nj! literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d4b5a366fe3865368bff3c07fc59792763aee4c3 GIT binary patch literal 214 zcmXAju?<2o5JOM=p9=my)YP<0zzod541WeDprxk!IiJHUNWm8@z3Adt=NxP?vu{7@ zJc+Zoh^x4XyI93TJjF}Ag%yBgt=$UQ0^8PYZjGM9L`JRq9pK(=i3m2OQ=f?8AP@lt l&_)K(J&g>*R$@y>1+F2hMWyM`d4S@pxFVKS!+@2QzF@H04fXr+NRdUHv(l{V=T_C>P0>R zM9$eG7{Gu9i#zn)IbLmVUNAuBIqDmo)>b!(i?d^ z-`Jn0GL=%U>xuIP&hQEs_<&FN0)ubZHKjbl5uV@~&hQ2oc!!~nm}j%K+mpD*l9zT2 z5_dC$wYgVa!mSeKwXV(1455k~1`(~Mx;BGZ%#_BSQmWdHmLhkZ$oApX6!rg8&?00S{O}0uoSw1q8Hrd)Ie>29mO+$u!y7w41{*gz)Vr z-e+ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0777d13d07f29f7e6a153cda709f2d40c12f8fc8 GIT binary patch literal 298 zcmXAi!BGP-5Co+<^EsP3p1g^LCmE0eF*pXtz>^FJf%j@>S9T0!;Hsk~B(?HlxKK>x|oIgURUYbd(Uf6%5rKgdq{%uULK{M z5ekr6Ly1W0F+W-In literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c6525098b07e5e8245c729320e8ca125e9729cb8 GIT binary patch literal 405 zcmZvXv2DXJ5JgGIm1K2+S4f!+vVvQe&ISgufdOxj89YPEY>-hiiA&en}pLxf74+l8H8=T=CKHw9+;2Tykgbh5x6FkEfUf>l@5WAGLlsOI} zQ?1peYK8AG=4@3&Sv)zTh*VQAkwsB88jKD$Ka~=vvsXc%`wpMxPmZM2cXVPF*Q(Xr zo6X%zY3^oNnz}+u6I$t_6g>G$Ei=V+N=sPI(pp-a``?RmA1rU;egpsG7}@jwM)J5e Mre8P?*EnM53#oqd<^TWy literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5225c051b863f73d7236f9be5d10b02aaa57e0fc GIT binary patch literal 440 zcmZvXF;2rk5Jh)orE!dsijpf(as#eFOG$2k#0^qXQ&S?2KuJHlGqX8C&JZD)w_`vl z82fqc@7e!nFVi-q^flk}e1J#T!wbB@2YiCT5l%4Wl&;_!Zr~Q~UFgs5ZAK)kQIL8k`Q6*d@a55>?UXalohhlcOTzKqqE- zGHV{*Ea6^jcX!9qEfiY1(90I3;>llXnJG^qOIRt|TY6mh{}&fNSf0iG1pdV_a^(Gv e6mfk_=XjeeB6HrHWh$pd8&||?;cd+TUHJxaA_wXK literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..852b17a2dcc83666cb80aa71b532c7d70bc9bbb1 GIT binary patch literal 258 zcmXYru@S;B3`HFhlH3t86BQ*bE3gAQumdwN0TWQjmYj+O7=VT|PX^yTS^rzIG>18a z@F_du9u9DX6P)1!SGd6)9`J-0yrF4gjHPK+&F{|4vL}<`ESY1PFv2XNJQ_CPXT_*X z)rP76D$AM@-H!jX6=6h7UJ%{s+mvXVR`tDSbarLFK;O9%*|Z{6kM!_+-EJ6Mm?e=i JuE~|k@&y5flFa}B literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3af92647e3921c85297d707e6eec8cdf9911f48b GIT binary patch literal 367 zcmYL^&20if3`S>n`IBJDAr+*C)Q}F4IHZDz8mJ*Xqy{RW0wj;^Sx#wy0yv=Ic{frl zy^%l9XUl#~+mzCy?sz}p07v+SA2`7oF7OLCxI@>Z^a5}24j-_GFKAm4)!MGjhM^E{ znsaUXoSiU>XR6>BrBgFJX)EHzRLv|H+e9*$Gm)2zk@f#?ElP4g*(ATQk74xRwbBrSz>Q z_A|MVE4h(7d5|Z0kvI8}jpQt1R`Up~>%wxFYTX@GodrbuZ|G>!xdT0E7V!mU0D=}1 tQI>^4W78Eg#-`lvT>+L*?s40P5*Z60g&vsUcZBHs5bh>YhXZHOS$~x9gfRdB literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..32668b119d2615e570d74563bcb2d212286f35ad GIT binary patch literal 258 zcmX|)%MAiC5JR*1AcB^DI8g*mPz7C322Icc^UdC9fIAXWZ~zhMMPtX#%wZcsc=a9b zJve|PIDs>`fGfCxJ9vO6h!ZpSDKWchiK@&sntePGcP~(?HMKU(kP(C~(cP>jyotaS zX(m!)YseyFP(PcfpsYkS6DhhqtW_5$9Y6lV(`>f5H`h@n>Tv_3VGCA3CX_ILMP4b6 K48LF-Gln;L431&| literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5259b879dc78e52cdd2151013a6d336c7d7933ef GIT binary patch literal 392 zcmXYsu~Ee^42B&ie)mY=RkX~&3XDKW#~l;E0u;=^4$MGFPbW*VnSc>!IP)oo@4h7Z z{p*)}FMr~f9A%CSa^RFQF*%^DNRLDicpean%g)|yA` zyt;QL5E*6OxC@s?rjDsZn~9w9frMo$(W@fs!d)yf6_4mpV(Y!F);)il@kVZ8jmX_{ hW95+#ICo*4Ywfhm>#nd!k15MB!pV)I6n;xN;}3oL;|~A; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..15f2155dadf782545e655397ac4b62d4d27fef33 GIT binary patch literal 270 zcmYL@$qfQA3`L#EXpmsi5hpsJ23nv7dY}Y~pau@{7H+h_8Oi(%0xUht>$eLPB6`IZ zeh2p80FK}U&fo&B;07Mx334Ku6EjC1RlTWh1`*X5CJ{F?)phO#jWjbma(5MTk)Xni zfLZ&T)EYF3G-IA76fp)_%Ggj{p=0{Z%~lYF*5@=8-12sB&D8WS?cP5C%XKWEjkqhz P@(%v~S)^2Jox6)S;iH+n literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/005C.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/005C.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/005C.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/005C.lmp diff --git a/wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/005D.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/005D.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/005D.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/005D.lmp diff --git a/wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/005E.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/005E.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/005E.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/005E.lmp diff --git a/wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/005F.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/005F.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/005F.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 0000000000000000000000000000000000000000..d91f95bbed922b6e306419c05ca848e9234891d2 GIT binary patch literal 112 zcmW-Xu?>JQ5CfkC%R8irB2iINGXMjy0sF7ObD=oa5ezF`vPcZJlLj6h^7=aDLi-4FUiF literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dde0867e4dd9f9d8ba6a27e0597c40fed70f260a GIT binary patch literal 112 zcmW-X!3}^w2n0FK4L#iFVqyb!U;!53+o%1%#X-oh3v5`J*_#`4hXYQy;D!gxRpmjY cb!kdVNv+(p($eoImUlKq3=N!$wqc^ zkds{GCY=WacwBFDszpTr3TjT{_^Ck(GLk7_KGV-4mK5FD|6NH)pBEu|5JVTuu%eGF3kg|P+LWm|Kn}nS=;=8Cw~l#4M60(m`yI^9>|0;tH_Y&X z1yK3~h%8}Xu>lLP01L1H3rGREd$sCp{up7t;qe%zH#f6So!JXk zY}oO_8wXC9ON`vT8Y`xF4iZ_4Jm!4$WR3XuMbn+#QwbIN<{_mViSxGO-|t7)5b77I CLJ`CO literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2db9bdd386060ff27dc368d8bdee9e00a8b169b1 GIT binary patch literal 120 zcmXYnI|_g>5Cs?H@jO5XX@b~!01w~+JbV_DHQSU(X$Wm0Y1P7_yF&I+nS0VX4!;nwl$jBohQv%EMgU# z*u^1EaS2xg1abvn9FjJZ9AfbP-N}TA@c9u^^v;I6T CG7-uE literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fc520b5b19361f4f8a8f963989aba597fc3b027a GIT binary patch literal 196 zcmXAi!3hE}5JeMqKmQ^KLl`8m1iSEV2V20NJzIbUc=l`oc3^YHKiRvia^QhlJdbF0Gz f+=?BCK|<>8y2VuNDuxof;u{0z{pvZZhlu_MYB3ly literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..35ffaa7df7ebe74fc2518dab6e9c5a693b2be7bc GIT binary patch literal 138 zcmXYp(FuS+3`2XTCH@_Vlycy||IXk54&VR|;J2Gwb7IR2p$!=XBJ#vSUCBmva*&f; v4fg%z@ mB4V;oHY>a3scfQc@F?@Mc|M7x%<9x>;*-D57Phu literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6448b522859b71e19e4a010a01e8876bcaa7f3a8 GIT binary patch literal 137 zcmXYnF$#b%5Ckv6xmXDz5`+}#t*q_st?hk)5Af&430TbDvNxT{%-*t)D{QdC0ViB= v!vh}Ny)=X?(LyWDDMhJR>z>mbS&etbsH2os^HGGfEXtRY~9sMca@sg~?R{=32D+sW&vi@fP67sSVVj}G9U^b8? k#19r{2g*o*l!3*O*|Jiy@`_OPQa}wNKsAi4AoU;<0qi0V%m4rY literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a240e32e90849f7efe30eb663cf8f25d2f7865dc GIT binary patch literal 144 zcmXYpO9}!p5JcO=qHz@nA%uXq9&qW}19$*$-~l{<>$&x0-UJt~yP!T7b2HndfCm{#3Y%zP2sEB;Fkvkl4!UZ=x q@WS9Y1ru`3DTdZnWAMwYYBD+(tA#>My<(S~a_P%D^w{lReP}<{{}09h literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6052e03f892ed4256bee13f983ba0d026b5ebfe3 GIT binary patch literal 152 zcmd;N;9y{2`1fB2NLm818xRKraXb*`0dW-&w*m14AZFlTWo2iD;Qt_wqP(nxmAEJ&OYs8&n_q?w7C I9c0CS06dQpKL7v# literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a1347eb8012703f58fce197f6d24bc633d2f7fa7 GIT binary patch literal 152 zcmXYqI}U>|5JWfN(TWyXR)l0BdP-^zkOSlf+<*h5&Y@$T9g4Rz`yb5B>{nLe20Ogq z4F{a?fiHBusU90;D8B zTy}PLWqDRv5q5SUo0U~wQC@@}C=S*j1=au*Rg@Bwm4&L76=LNVgBk>+K?Z>}AX&ix E0DkQe>i_@% literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a395fc8ef1a718eb51bec491ae4f3c913652e4b7 GIT binary patch literal 144 zcmXYpK?;LF3`L{x8(kHO$Pkb)`>uO{9-#Z~dw^cR19<69pJ>PnkMNVx1~dD$JM#fg zc)=S!@P!pN=yX;ych9n9k#H%dxdh%_NVwAdP-!_6S!)Js8@P-z#k^-YrEgbUJwLtu E0o)Z53;+NC literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..62c603421fa6aa4f859691423d23570a0b99d5b2 GIT binary patch literal 119 zcmXYnF$#b%5Ckt0SsxIB2oloSrM0%T_5nV?|98eY@L-O)+nr2i_V$h4V21-vxZs8d j!Z0%3qO>k9T(!7`h!z)bROlu?l~}^1l;@oO1`+lFR>Thy literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dad0cc925b0c9e38abb2fe355152df9b416ceb91 GIT binary patch literal 160 zcmXYqF$#b%3`Nr+1{|eB2n6X3oIQXCaCdii_W&Ni<63`83$Ofymt-U%qOUIaSFnK{ z9N+{OxWNNnkhs4}!d%=`nUO_`X?El^G{Z#@MY<7P%~Qx-nA;q)o0~z7eGVmZyMmhQ E4=HmLJpcdz literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..54134a5d6de13260465bbfc86f962f1687989d74 GIT binary patch literal 174 zcmXwyK?=e^3`H|Snu3c$DKZ3t^bW3j01x24`|i8<0A9cYcuU7OqXu61`Fwtk(u>Hu zT-Xa-;RY*gu)`f5@Prp6tz)W1SaW#JW@xk7^Az~0YmvXKiRPN+Y5d9-IR84r!@YL& TszJn09Eozij00K^v|ITAcPp{_9!6RbBLDyZ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b3b73944ee4e56d09b91b0f62049e11c3a7549c6 GIT binary patch literal 178 zcmd;PU}s=p`1jugNIC$q4-iKHaWW9+0dXY|Hvw@U5YGbQWkAfp&dLfzAp9T1R+N{O z5QDPCB*a8SfNVxKR#sUsf-~9K!Avn(Ss|bTCKgs!F@C5nkZC{wHceJaRtjdCh!DS! MI#3_T7AW`+0I)w6FaQ7m literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d723760fabe836a9102fd8afa162998eebc772ca GIT binary patch literal 125 zcmd;JU}s=p`1fA}NSXk#0}%TFaX1hs0dX!6mjN*YJ1Z*?f$)D2TTxzCLJZ0llMoXT l0kRp{SXpJk2+m|@2Q$TFWrctWm{?d@#rS~?W+rx!K>&(!4~YN( literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5d85497888f174603a30fc8d52ead25e5512eb00 GIT binary patch literal 129 zcmYL>!3lsc5CkvEvc5x*BM|)hw*U*U01L1H-!^YtCE&pg8cJueCxJUH?WQs}F_0%8K2e0oBi2wiq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b685b3fde02e52dc4c441c04e9047b64cd7d6fbc GIT binary patch literal 176 zcmd;PU}s=p`1jugNIC$q4-iKHaS9OU0dW-&w*m1aAf5-rD}b1RofQN?TBYLYhDp6Ei#5J^+K47E1sC literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a954e2a5923f795d96cdfbe893227e14c4b41f58 GIT binary patch literal 132 zcmXwxu?>JQ3xD?Hisg zb=1>9BTY2ZLMv^w(?KU)Bo2V8e_O{^zp9pDTY&-y@4u?%VOxPL-doeSt^CnHv^pC+ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0317cfd0a011a6ab60228e93e1aae5a0748774f4 GIT binary patch literal 105 zcmXZSArgQ<3`5btZl*XKgU5hFVsSVmmiylTwfr3rugx^=lqEf7X0F(<o@$_6On!AWi^cMrKwJ_|L$?%Bn2I&i)@Hzz?FCz~YQd S?CdaUSs()>tqG-Bfyw~I+Y7S* literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..02de944a24fe170c2bfde90f93fe7aff88a61053 GIT binary patch literal 256 zcmXwz+YQ1n3`Nt@Ru!S!@Xrt|!4fRN5Fxg%EQfDqUO95Aq~$@*!Wcl4;5r28h(|03hda7O~=Hyw@;@I8qvC;N`|j7KTC9v`MpK zDhgFfV3#f_CEcZPW)HYW#;u)+Hpwv-d$T4Nw)2&nOL5Phu1F5)U~;w~QICEnsAz9LSf7cY8Gv)Ua2x16(?Dp11$wBFS#SPf~JS(XZ#*|{4N zjhv$_Yv|1!7$RB998HOwrpRs4)N4xn+iN~K9264JjFf5@-R1T=qaCuTwrbb`+L<>4 Kq%@8xaqa(ret0JU literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8306ce47064e920e447a6cee07a0560f9432dff4 GIT binary patch literal 260 zcmX|)-3dZ542AoH`fz*qaR66v24`>vm+&d1A%xrqXK)5ra0C(RX$uCv(43s+l(2>n zzU_#90%vdmS8xM&@BmNn0&nmEF%hYj$jmJkkFOA8UhJ_3o_ IVK--LKb<~)>;M1& literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..102a117953d6ca74c21aa5cfb2d65e269a45dabb GIT binary patch literal 217 zcmXYq!3_d23_nuODZ)ffd(~8PYr(XYr>*WdEM}f#)>MZRL!}#Ln}aew ha?){cq6{4pnVLvvk4UXUdG;O5Len^^lH9hD>wj%UWsm>> literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2a11c2bd86394a785ca656e3f01ba032243679ba GIT binary patch literal 317 zcmXYr!41MN3`LWsAdyyT#Sm=34qUmj0vj*_D{!r1%UCIAHedx-U;{+>4n%rs{Qdjw z(T&czciG|Ig9A8%6F7qlxPm))fG2o?4_JHWHed_7HfPn8N?fXn2;tfG%%Z}?R!&n1 zQ6%R%!@$g?=|rj-A0a9per3X8OQ7O{3A}1kVnN`)jsXtyTbn3`-#FjHrg^?)g$#Sm rtFthGtDrjDN;b6$gC%fXv4&ttKOhFb+aa?-Ydng$fMA`{h1xA&@Vc2@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..754a65dc0cbe6cb6c7762693ad2bd3178be42cc6 GIT binary patch literal 228 zcmXYq(G9{d3`El;r41F^@XY{BzzFQX77S7OEX!)YS%D2$1*x1XBE8r?+vh2rQcBP2Jed#jF+)%17>bs0X(9qpi-fhSdExS``6km^1jski&n>x}QluippkW literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4070b046373984e4f5b7de8830f3ee758f106ed4 GIT binary patch literal 385 zcmZvY-KhdW42840d;PiYlMg;yfIZlQHXzu5a4WC}TUe4q7)J2f7OcS3?Xvm_;x z0F3+YM}WCmWIih0qi3PYLNFUvRG_L!ei&n5`5?cdmihy;5T5sv6`@s&32=;Xcf{Cs zuT|NWIq_U5H4ua0dHkio3=Zn8;?8OLiE5)wlink`gR?Js?fUx9{nrn<0_&{cV?Pf& CzqD=u literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c06bf6134c38905e884f7f86766808436a1dc968 GIT binary patch literal 234 zcmXYr(G9{d3`CQ(LA20a_-6=~U<<}zhsd_9DE(yxHeeQ{@*45+65r)?&K#By!gsrH zUf~9Jc)$|`Uhswwq$nb%sH$5WM5ZPq&$vz2WPVLcYl?kk0Rrz?GF#%OGE+vU*zaL6Ls^$%`; BYdHV_ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..83c0424dd2480b3cd6f6b1659bbe72df1e7295d2 GIT binary patch literal 276 zcmXwz%MAiC3`8C6EiBZ;kq&5q8mNI9I9j%4S>6LBPy;nk14zqwBNDwh{$wTx+7r=t zJ>oopGq`{&xPd!h@BmNn0&nmEb0caKv#YMHn=P3cO9oP!MIzlS+^zbwH%lb7%uECo z_dv7ue}-9AWm_6%Yo8!f>TogUK4B71+s-`$+7So_DOFrbx?tYKv-C%8t0*K#IzG^5 O=HVr<#Yl&XApQWBp@?Mw literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a46915f32e500b42e2aa69c002679f3026671362 GIT binary patch literal 300 zcmXAj(G5Z&3`HTlFBN0r3J&6@8@PfqID=c5G_+|NbPAVn21j@v-h&(pZMnDmbVw=9 z^O^GkSGd6)9`J-WeBcW|$T_7WoM0*OEv2}#xk?k z$hZf^vDcoQRkc(RLR*%G*_?`dcdrFWloAn%VQeCm;!w+(57U;;z%zniSg3LtmIIN+ c6s=_ta?2Qs%i6LIHtj@K`^F@Es#rDR9}l3B=Kufz literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..caa995e1bcf251cf929cd1e76d1319203cd82474 GIT binary patch literal 274 zcmXYr+YQ1n3`Ij*%A@K=Ou!7xzzod52K+>}WkqSfnSmvkfj^{hQflc~_Vsn*F^nOE zZ#j|AaDgk_;0_OPc)|L-U^iji?qgIwV2Icvn(ca# UdPP;ZIHg0!-T$^uj@aslKd6m^b^rhX literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e3488d6553b2e40f212e1a34139ffb902bfa4f70 GIT binary patch literal 250 zcmXAi%MHRX5Jc@j!Y`pFPF%Uu03FZ(cRJu|*{hXtN}vW>pahOc=51o>Su}QS(|iq*PRLDPzfHWdEEnscQ4oxPeAnZCF%&AEWSLdRNMuT?o|1 K>EL@G==uYI1b0IK literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5e681a7770b3201814d55c2fa5ceb17e0ecdc09a GIT binary patch literal 337 zcmYk0!3_c-5Jh3vy}24&um)T3W&^fh4c1@}UI#0!5d~+TVuAcgFSS;b1{U`ib(F3B9m&;l%}LHW;=Qx zIZ2FCArUDhEf7jJD_+nVw4U+~#U#Ei7eekAOhxZUOO*Q|gjlY5F^JIU++X(VZA$dE p{}8K6Wmr}DtSJ=%FBsrJXPL62bCM`?ZI<1VBs3#ml{%)rLLVTbqzV84 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4f1c7fdd9a054bacf74cc17225ceba9593cd5f26 GIT binary patch literal 288 zcmXwz(FsB^3`J8O??Y%Ez-e5-6`a8toWU7F5<Fejxl57|@-BDFBgKe}~|X8-^I literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a34f0ba08aae14829b166b5cd9e416814549c754 GIT binary patch literal 260 zcmW-b(G9{d3`E_gL2Xbs;-3ZBfDzb%8JHllEi1}DBQOISumBQLI6Kmd;`5!IopvJn zjT7!OxPU9Tfjf8r1yAq-Z}0(MupC6JnJ|yEs`l2JDT=w6byHP~ayp{tE>TmFLD^$k z>xu^?Bq)1UYTXv}EEMz6t}vTLj5+3)1TQR8R*mgtZcTMe2RK965_3mnE}`Hf-M6IG Ohhwf6ORkj#XV4$nOnL19 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..796c87220f4452f0d3758c9ec68f7eabaab624a7 GIT binary patch literal 298 zcmXw!(G3D242Dbe%{w=67Z-2_XK)5*aE0174dEV~z!{vu8B9#@Z#jXlp-tg~J2Xm*bSxpaTraH25UbVSFyM#EcQK{onw1h(>Q<(qn5E+iAI5GuOFa=w1i5x46(hD0f0y8iJ2Na%*m1o6Yj=!^Y zqjT}PNitEm{d_kQc0>gB`t|i z5mZ$g)oKeasBUBus&Zmfl3KIh&5wi#{}e)Px)^QL;H{UEfm}8%PG+z$M}*$`vMn-* k*bWR$nAqGkPP2K=_5t6Em|#%0OA!{Bz3ZZ*h_<8q0V(R1ZU6uP literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..79cd7ca15afdb401daed6d4fb2633a86eaa0289c GIT binary patch literal 215 zcmXwy*$o0Q3`CPnf;Jr8@J|DDKnv7B3)H}m<*}@2mlEiJevrZ}hm>b|Cbnl2b|HjU z-?JXbk(|hxT*#H&$eldMljN1zG&cu&8re2?Gu1w|!= literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..85b3bdb279e8bdafeb012ac69933da3930178e12 GIT binary patch literal 232 zcmXYq(G9{d3`89ew6y)`Fbu#BEWs8m!2kp}tb!D-6;fVgpU=M0W;6S? zv;K>?ikrBLhj9oB DhzM_G literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fbd50a9d8cfe1453613852239096e69b972e6e1a GIT binary patch literal 416 zcmY+9%S{9^42CnW)$YKFxl_h=KnE*vqJixI(ZM#rjicpQ*2q%Jo01Ft2rOc4i1wY6HPy8l%wncA_LNf9cC-|^=|r|icPW^IPr}2U zZJ~LYRGs2q82{3*Oes$bzftX9J^gT%OWpMDDc20qEfEo1Z2i&&T5Q%DR=;i9oW>c3 ihm;ODuQ`7Xyp7Me?r7RkHPeJ9-Ch~`$LP>=NC#i)IL=i7 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1e48b4d2a3fbd30cc42b7609fe4f1fa3031c9b19 GIT binary patch literal 249 zcmW-a(Fp=E5JYn^C!C4>Sb!baf<4%RC0IeoF2l0thb`EHC0K(HCl`2uc|$TK9771d ze&T&57jh*xawiYc$cwzmhkVHtMQSaRi1d(DpVC^6fNBr3*%Qo%9k33ucVD3pSrXuA zt%qXfR8V)!`mzgl$O literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9c2225658a6e13e54825beabd8c69a46992cc1f2 GIT binary patch literal 298 zcmXAi!EFN}5Jf@jT-LERN1t6wj_JTHq=wXx8gdvhU!xH|ri9dx8r*@U&4U0Bn9uP4 zR$fXekNuVX4X*GGAMgoZAozwK_=P(hYAI*9KwZqjeXpx@>%Hf#CuMnVEqh3U@m@|+ z&j-~`U#01P2>gyLhuBXk4Vuck4jJ%M&K7 H3^nHuihOuy literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c944d9286b76c6b203664055243616c64e805cbe GIT binary patch literal 405 zcmZvXy=?%-%83>6W2)T2a4YERJaBbl7i5EL5 zOx<_Fy`$cvp3^d=bRBoRU*Q1n@Bsp6_=GR`h6_C9lveNpYuLaR_V5Nr$b*R0I_A0R zskP>(=9TZXEXA9uv3N>BQEhHfs*_^oG&mh>aY}^KC90y2vjLy(PmYSr20Agz3$y0o z%@*#pc6WCy-9n+I3%zVoDxUnMrkV0WWC|-qdrOZC|3`7*gXO=t-@tnuBS+qCq=@Td M#)b3zFOJyp2TX{`6#xJL literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b06c17ea43aaee80772e077942f0829718cf1646 GIT binary patch literal 440 zcmZvXF;2rk5Jh)o(KwDmMadOX<_5V!+LUkuByK=SO+DHjjYgXrq~r!%fioZ^^L7j< zMaF(!`+N5P*}HU`Qu>~cJRjf*Uf>NJ&hQQ&@Cjcq<&^GW3p?1u0UqHQUO}Ki9z?9x zIj>Yttu;S2uY9LJo!s4Gv!HS2`fc=OOFfxYjNR&xS5E^vh#+~EOFc)=T*CdOErR@MCO%q)8{DbA8PrU@g=BFdv-6Mj~V zx>RkL`meIADbeltPg@a2#N-9hoxV+pwrN%0dq!th<_q+lE0IkrQuRm=zt`=C!G&28 KDdU=4sVrZCCVAcf literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ad857bb1b1d9cffc0852d0099d235f884f2bfb8a GIT binary patch literal 367 zcmYL^&1nNc3`S>n;~#L=KDdI^;2PXPAcs^CQiE%74?c*I5W^Z$fh%wcZomcP5GGH% z1`FPxPxDDg+q6z8{ndBgPxyud9N`2%aDgk_;10jgH7RZ24R)}H5BP$%6;ZA2%4`@4 z;ifs)rq9_4vv{Toj!`-_!;{t`UQE@@g0W2`6B>pbm3gO1+iN@i&pWdc%02#GLW!(8 z28CYI!*mO=ScGs_k-D6b8_qhd+c!eq^t7=voX^9+71P!XFfHz7ti%^m=MO(}ib ziTzA2MS7Ie?v!?&K>AUtB6;a0SJ0b uL|GOFjm=QZ7+Z3`4+W^9+~c+nB{CO23OzBy?+7uDA>2)*O$W}Pv;6?3M{Rll literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..839bd6177c636ec3a7e0b8698911b2ce973cc2a4 GIT binary patch literal 258 zcmX|);R!-9421jISF!Tk$6pTN5>DY3&JdCiLL9*r+`t9=F9`LjV&N;f>s_;?ZA$6Y zcewZ90FK}U&cMJG+`t_?z!T(&nfp|jUA1Oa=9bMqo`}0wDAiUXhM8srp=)+GYXxs2 za7DsIYK}k_8H4)SL=|NvYBQ0d+tXV0;-urpe|TEVF7Dwv%0xYHU<9^c1!O@9^H_qI~@{B6SPxtTRQ jcT0_xM_O?1!a9}GX_?ktVUg}r=7Wcm>qXA|R^^O8qjS5a literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fe9c4a19f7f31b8cb4cb9951e98c0332f1f88df4 GIT binary patch literal 270 zcmYL@+X(_e3`H|L%P#0nM}FCXHQ0hR*nUkE-5Ow}Xgk43mhPnd&C@f<{`H9l5)Txkyl9 zM!>9nPHGJrMVc{B6N(svEM;t{&ghtabF&$u(E6OFf?M9Mt(ltsrQQ1nV7-n7v=Mh@ QS>M6mKZ}%VtxI?D1{tV-3IG5A literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f61074ffeeafa5e4f39292f95cb0f35e550a2d6f GIT binary patch literal 112 zcmW-Xu?>JQ5CfkC%S%K`3Mxu!24Da-VE+|(E)-{)GSa*iB~k9yjs=D{QdC z9Ukz67aX!A_mNIg?^kIUgI+GB{WMi|>g>+`h@s5(%s3RtglxV2%_VAlFEH|(;Q9kO CDH3P^ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fafa685af34fe425733f46c1afd685757f173392 GIT binary patch literal 158 zcmXZU!41MN5ClLw2^;&11a_}m{Aqv&Xn+Q&fD+QMSr8}9<8F1ELk{1$$W?A~ zmxny%C2!eeoJi2U4~A55GlstYAq=31D1__D?DdG@ysVk5Cg!Kki2woe;2^ZPQCyNpa2RWBqXH&0PrJ%S$o|_M#Opjd?%Z2vDG%) o?XXA*?1{`Pk{rjOHNYMC*77NmyEH)JfA7dfI)VEBnh#jQ{`u literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..faac470b0c7e4c804ab674fbbe764c94b382c446 GIT binary patch literal 163 zcmWm5yA1*{5CqVL(~T`cBxL(!*=Q#sBP6E)8lV6QpaB}70eU?%7rfPeW)Bw4Y#mqC zo809gPkG5(KJt~H%#%CZ$6ke=QwU=h+|Rw`3otB_y)LC}8PlNxsHA$bX{lKu_uiJg XFh&hPN~e<3_Mr<1FGt1Z380pLRcaVb literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..76977e17dc4029d326f290bac2139129d16f59d7 GIT binary patch literal 148 zcmXwy!3}^g3P@&r$}UPqFJ>O=cv-&ri@szM02Qe?CV<`K~702G6PYRBv!VaY!uQge>f^Gr<`1 z9Vh0QE_9_E-RVJ3deNIU`jEA%>Sqk&R6DRZU@tOE0M;(8#yG48%3AoydJ(Mx@Lsj` pLvM36h}4wRk$cw1sD%TbR7BvGcX`ND zUh|&xi@SCpy!&;2R`;##(vF|l`Wm{Y0<0R0JX_93 F?H}N$6Wjm* literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..425e0b6098880f3bd2816c41bd35fccc5fc6f273 GIT binary patch literal 130 zcmXxcu?c`c5Jb@xWX=ZU^pI2L5>s;vumE!lumHPv9R-88!SLC}f|=bu>n^g&Cc7MR v$|Y4@3JAD?%qb6~TL4lUyZp|9L?M#)N(qs_TJt#hH2!&PW3T*8Kz*b?g3A-j literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4e4cf9e537942a4666cfeccb8485b16462b8c0b9 GIT binary patch literal 133 zcmWm6!3~2z3`9{ciUyw}p-on3LE}rVxl;fQq=6Jb0W@!h!?S$&8aFqy%#ZF@HreGT ze>voo;Sm7>SwQyIXEMte(Wd%Z^qT`6LCk8*$tQ_UcU9!F=6Y9U1X`WyThX8)P@~KX D!Nn9h literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d818ea6e888ed2161da152918a864871f7b456f3 GIT binary patch literal 138 zcmXZU!41Md5Cgys7kqgmp*x}|MBYydpnw#>pEm{20kyOEqC940tt=0g&FmMe?n5?t z%1hqzk*`=L!9f_7-Ir;sWzS@}-Y%5ZxKLFXK^&n&;Yba@VgG5g>b8s?%`a3#ZAU)CK;+^6%$;2kLw|pM00HM96Qy D1{)M$ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1eafc124ada9cd8c108958b81fb3d474f9ccc948 GIT binary patch literal 142 zcmW-ZJqiLb5QS%zonR}3ge7F*r4pJA5QX8R;BWzh5(DO4qpbrtfVH&)IDq4eFT~;_FPA@b5=7*!3*U`)I_RW} vZhFXhKw&_Y0F<1DXvVFY#@Mf_wG|0%DbE^0Yx9)L{I?V1$UmGngLYgWM(Yx) literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5162a1aeea7a0e73cf6438fec49a09609930702e GIT binary patch literal 144 zcmXYpu?<2o3`9-B*U5DhMTsJ4Q&3Vf00XcA126zJTa*8YD4u<`@9ZWs`_2pX3OBgJ z1D^1LH+&#ON$&HoN#|arX)IbvBQ5RTne$KMY|@cd{x&aa01yHa!D~vWp@wL(0A_HKn9{D03!ZX^_*gwOAY9798{NobTWTk&JxW4 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b757ad836b4b10d1be737bad8a30f562b97b5c36 GIT binary patch literal 152 zcmXAi%ME}q3`0{sGC3nu6`_^^SbzmsfC1Qm0T_TY6H}aWc!?b+ib^LUZ(dkevXPw} z?{+4J4ppo6MGov1-v%Ows191%kKZs#bfE EKV9Dv+5i9m literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4c4572395ec1e21ddd517750a7e07bcef35deb72 GIT binary patch literal 152 zcmXYq%MpVx3`7NSW=92NJkBtN0yuJ}fE17p=zsz^Q*_L;!{KT5Tggpk_A4`SffYXR zg$;H%;Dr7mxm3ERH0C#%Nt#kjvE}ZWy7k#a12WVRn*L>WZ>~5fkN2&Ys=x0rhZ+jM EE@e*<_5c6? literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..74b9733b77b75281c180c6e8395fd1077bb2df04 GIT binary patch literal 130 zcmW;E%ME}q3^{4r=@_75D&m#uEep literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8e60a4301b16a49e5843cec7229030fc81059fd1 GIT binary patch literal 152 zcmXAg(G9{d5JTNG;CcXr8lj{EFhDn81QuWb2H>AxCg$*ok9W4^v#H*+@+ z^E5B>HXnl`k%x(7U?w-R{v}YQK3qCm0t>me?jS`D*!p(K!q&UCraww!^povW$#a@g H@;UGWI~x+8 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..86d320a70a46b4864a785bd81c6ef5ecb6afc97d GIT binary patch literal 184 zcmXZVu?<2o5ChO7LRJd;e4^;`I6Dba~_r>&{4=4$z=EDeVw5Uc&ke( cTKUHselaaM=(Db+=H67EA1y^kN)hUR0ggHx6aWAK literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b5197cff1b176433e175bc91891af3bf4bd83bfe GIT binary patch literal 156 zcmYj~u?>JQ3VU3#x57ZUDw5_k&3EBFp)*2gxFG)rId$ z8|`$^n?CfVADxssckp_Z>^_^8a@P^FmdSvc_zAd0u#9Mlr(346g%fxjFLv7uQ&VMF OGGL5o-`9Ifv@L%Vycik) literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3cb13cee702eddce47ecffce8b6c176b96795bc8 GIT binary patch literal 174 zcmXZUK?(vf38TFKA0#y-Rx5x?z9zu}Gt zo_OJn556eH_7=0d%IpZ@21`vf7$00 ACjbBd literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..462243946aacd27bb8f3b05bf5639213fa736488 GIT binary patch literal 178 zcmXxd!3hE}5Czatck%t-yu|ttvISmKk033jxetTMu&tQ#|7h6#VOJ??zReO_N4mss7 um)v5B41xntECIi-FS&LyFL|ET8vtHMm2}V}>NUGhdT4v{Gm@oiBNQ*^?Ggb1 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c8036ec795a63da4dddf94fc8660cbaa5c5eba01 GIT binary patch literal 129 zcmXZS%MFAu5ChQ3B1{^HBBBT+&t>lvKmim$0TjTQ<_TuChi7>{(FQZS+gG{BDx2(b x$SIeEK(c?M*+9-9MnK(tLS^}NvO-gg+5aBMt)`wWmiy$A3BSw8YP#k+#|V76ptzp-g|dC6No za>yxPnI`~`nFPiJvY@n_hb6Lm^Fj_o#7e&lQ_QRy7Oz*fh+s{OE5VO&m-B literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9bdbbeeea394ad04df7ccadbd5e79f5d5fa90ec8 GIT binary patch literal 105 zcmd;JU||3O4InlIVk;na0%A`f4glgvAWj5g1{O|Eb|CoAz{1Y1Aj8S|pOKlJT^K|& XfyEh_KnftzazF-1S_4Y61C;>))vXK( literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..222edb99612ec162fe8261b4180cf87ced9db52c GIT binary patch literal 104 zcmXZRArgQv5JS;GI}=u;Kp`uUSR4+C<^DH7mEQsJHap3nEa|C*yJEwR11B!rP>Qf! amFy*=D%ZGQodSPkL; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a165eb46a41e005a4043ccc638db0ebf11420400 GIT binary patch literal 89 zcmXYlI}!j86a$0d94e(+t&RI1z_`Z~pJJ0u5+VSztSq96Cb}5HJCf!CIn{`#*S90@ LTkrGQ3^#29NEH{v literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cb65859818dafc36bf998d73d5def5f37847b7b6 GIT binary patch literal 89 zcmXAdF%G~W48#r)yrUoJ+`03O{C`3HM=)t3pDYh`Nf8%&!vilECa9WgxuI@%ME})2nEr@ZtTUo1$g9O0p2aZ0xZBXg+AE9Pb8USczgz_k~P8vGc2&e20I*Z nf)sr#q?)N-ptw7l0Zw9md&jz||FO~L3R5opJAHnJ^eNE*!#6T6 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fce62590595c22bacf05e59f3adc71b6e7adcf8b GIT binary patch literal 168 zcmX|(%L#x$3n>;2vNH38QCYWJ?6*k!6 xfDOik7P*~~opj^1-@LwSWLL(e#%;{RFI+krAkvnc3U>3D6)G5a&Mtrc*E8 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e18f7b5154e729746761122dbddfce8d3ca4625e GIT binary patch literal 137 zcmd;NU}pdU9U!&KR$Ry`KP~_kSivpi&kP@gD%zFDwE8 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d98da187731e14a21e88b297007cc81c01b9b9ba GIT binary patch literal 120 zcmd;JU}pdU4InlFVh14h0pbWCP5|NzAT9u626k^4_zz+~dJF{K-eC6QCqMvWLsb1| SVD|O~%OlZXH9$TP{09IoP9tOh literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..581393ea2edf4fe5177c8f6b93b7dda83388f0fd GIT binary patch literal 186 zcmd;P;9vj&6Ckz)Vox9r1L9;L&IjT;AnpR<=|H>$h&KW;3yU`x{AXkb(~lo}d;e$P z0J0xFe*E|el=JAxlP5q4pbStIhyhl`45nEi6si=^0HAh|VGz@R`kx?-28uob84b4_ E01byfr~m)} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2005d323250f8011f930e004969bb5066dc1eda1 GIT binary patch literal 143 zcmd;NU}pdU9UwLXVn-nM1>#5`P6gsZAg%@Cb|7Y8^@f1|3~b)sj~+h;^8PchdwV~A gg2V>#VB+47fe@+&$a(^216d$8&_F1Q8Eo=@0J0D*T>t<8 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6eb55cab7041502a74a06826a2c716a38b2e6a01 GIT binary patch literal 204 zcmY+8OAUZ95CxZCxF84voZb}y2;htW1aL+G0&swrwm!;~PXe3FcALz;wz1k$wa`Hi z1B@`i3=6EV!43ylE~>hEv_f)H$>F7FwG_O3cxEn)idjWRxDDs2*TzWp-;g8awL^+z NvmpC^>Wcq<;{-A@LW2MR literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..adc404bbd6ad4d9f87558c35d7e8fdb209810e5b GIT binary patch literal 133 zcmd;JU}pdU4InlEVjCd#0OAlJP5|N@Ag%yn7G?%-Z*PYGK;=N%+xroe{Rqf<3}rtC bvaqqAJO)CT-Y4EqK;|$q0nK4x0h9j$@jW9e literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..faafe75294b6c2c4f29b9d463610a80f15715361 GIT binary patch literal 169 zcmd;L;9vj&10c2mVh1-Fz_G5e)Jd!yuHEfCr_Th r*+4~)p8&;~SRo9c3O1-1kjViQ1nL3-C0S0OSX*52{OFujFI=ks6iv$r-S$Q|u;eZn^ wxZ!~WFX$A9iu*647^^q4>Sb<~Y_?A*z}p+le)8n;lP4fH8%POI V6e0{#fl%TNQNj#1g#|+W2LM-sC-ndT literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f59666bcea68e0ef9adb7051ce4923884bcbf76e GIT binary patch literal 143 zcmXwwyA6Oa3JQ3JdL?)PFffY8` x;eZn^xZ#25O3E!B{wm42xT={|Hy(-0z*#Qd^1L6oM4H8QLVvsx|t2YGvXJGgCe)Jd!yuHEfCr=(fc>-jE SRR9IO|1&Xrdn06@fMo$m79b@6 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..11f11bd0b7f80d8af9479195dea65ea070450a61 GIT binary patch literal 142 zcmd;LU}pdU10c2pVizC|0OA-Z&IZ!uK->((AT^9E-eB;bfelDMdJH7~Gq3|$PoBWp kKn95OpMlxi8%VQ2D6ldh_wf^`mM4!vOrSE5Nl(B`0D^ieT>t<8 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8279a0f2d63b8f0ce8051932f72da92e0a75f91c GIT binary patch literal 148 zcmd;NU}pdU9U!&t#3>@BY@E^o^^cV!Zy}_KvPe1_1fhzpZ fz~=1@Q~_25WIlQP7_0=y^ad&R{?Et)QTiVM{y;2a literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..02f86dce7642cb521cf5a8103ee65d7988e7d325 GIT binary patch literal 150 zcmd;NU}pdU9UwLXVn-nM1>#5`&H&Jg3_TAa=EYOx;P-luyJ}4X`i~s-t literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8a9f3ef490c07c92356b07cf507e07fd7c118bbd GIT binary patch literal 142 zcmXxcF%Ezr425A((ZtiZIeLJXxH~($x;lDK;2!uFVv{c|56bK&XSHC(h8+h^T)6Sz ph3iBW*Gtj*Amt>57W=Ut2}&2Fl=43@sCZu2$kw9W**~?n{SQ;|DT4q2 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4ff0d0dbbe372ffdccdda079998f568ec4605d6d GIT binary patch literal 152 zcmd;LU}pdU10c2lVkaQ>0pbWCP66TqAg%%8HXxn=#Ei_|An>1o6-YjUu^v5n3=(7a k_I?b6U{Meo1YqJ%9zS^kW5d({%>W9+Oan5!|HI4&0LgDKw*UYD literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0b4813be9bcf5984edbbddea8aa752263a4c03fd GIT binary patch literal 127 zcmXwwyA6Oq3`4``bd16RY(VFRnwkNa`I0@37Z8zNV#W4i)pAzYV21-vxZsBLY!p-8 h-EESZG;>_)R;6%xpofzBSI+zMTVw=H2REx3dH{piCDH%@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a6ea425ab89643b1f10295dab8ff1d4f96d6e56a GIT binary patch literal 164 zcmd;L;9vj&10c2mVh1-Fz_G5e)Jd!yuHEfCqMvW lgA{?-EX)uZrVlL70oMoA2;_h@!el@?pF9C+WdSjP3;=oPHtPTY literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7e770826e7338a0fb1e9028ae15aaad6d4f7d3ac GIT binary patch literal 139 zcmXYnyA6Oa3-p0PIS=Rm67)q; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7585e2f74f0d28d90dc195c4250c6384f1d48ced GIT binary patch literal 213 zcmd;O;9vj&8zA-o;t(KC0OA}VE(hXfAnpg^SwOrDh&KW8ejq*r#0>1-Fz_G5e)Jd! zyuHEfCqMvWgA{?-jBH@#Fkx)U(Uib+qL|L%?F}^@XcdqH0#BX*&1YeOaQ*`TvNd&9tg5c|<%An^7E jv!4I~j15u*Vl%OVXiU}_6C9f4D4Xq`w^7=2*`R2Wj_Y8 b2(h0$e*E|e%$z4rfK2cIjI0ndz5fFM$h-lW_6CZA*g)kFHdqN<7^w9z2tbuT0Rbo*W;_7wJ~80{ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b153f0aeb8d300cd3efdb366ba7a8590c5298d99 GIT binary patch literal 188 zcmd;QU}j)o`1juhNcsSA2oT2raS9OU0C5Qr*8p(~5cdG_6d;}h#7ls94G?buVg_b! T5cm(G9}}RTK;JQ3aBzYP+~5IY nYRx@{T&o?;RYQsyUFq2j8y=FVjQ{s9(QmY^UYQ=gSl MAIM__k<4Hw030I_DF6Tf literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..26481f37d62248145ff46e2d405241d967faea52 GIT binary patch literal 169 zcmXBMF%H8Z3_APtI}^kdSJ=_v&kxPUi799?R3yd z7k%lbhkhgpz>?g(O9omi#mrTEs;$A4Q!YTfQn`mka-GwNsm7Lt5(S$v9kE$lvX2iF IQ#G#s2giscX#fBK literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ca45943844fce6a4afd81889f485ca473da4107c GIT binary patch literal 113 zcmZw5F%E!02t-lX;Cc}&8xCM^&n%_2_rC!Sy(I5v!Y)(#4m#BuoZR+Ce?*DJ`rn?UgTnJe-E4O09jsqudJb0lhZ{9Bj X52H*mRhf6oDr%mg!ga*ogE7Si)lL<6 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..266504b61aa0e115cf1dea97d1f9d2e5c5b8a835 GIT binary patch literal 127 zcmZw8u?m1N3F4um*xtt&hCDHyw=sg3m3>0Swuu-<=$wggHF2WriV1S gS4V51`AcRY3SdfR4(n$Ita^_+^J#>?UayRa7bu|{D*ylh literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..217478999eed07c43ed6ade2cccd3fefd85695f0 GIT binary patch literal 98 zcmZQ)U}FFQ6(H6FVoM-)hVs3DbSMxrum%MM1_g(N{AXZ;u=Mr+GqURI2k8UBey Yk(nVd2#IE30jdH?VAaUP!T`|*0IiW1umAu6 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..202efca5134e6cd23d72996a60e375db4ad82de1 GIT binary patch literal 84 zcmZQ)U}FFQ6(H6FVoM-)M&f$`*$k{fL4iTRAtC=6*dQ!@{r`-t`uaioK=7Z5DG0~_ J3xN3g{{f*}4$}Yt literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dc7ee6af7b04d6cdb84a106083f4d434b7d7c1e9 GIT binary patch literal 111 zcmXYoF%G~m2m=XeqCBM=oxAq|aacR||1Y4XD$-$NnITw}s4LHa=OpMfPP U2*d<40znK$=0Gsb!~|9V0P*Y;od5s; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0ac0c5b092b53e0a9a6b7b9b4447949305c32b4a GIT binary patch literal 86 zcmZQ$U}FFQ1t8W0Vq+k-gJN$W&A<{A6c`j7{GWjp%m@kj&%hQGq_3|ZqObp-feFN9 QVG03p7#V@0tRUh)0PeI8o&W#< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..24c47f31d3a36712b3b945e20b5d66f9fc0ddd49 GIT binary patch literal 87 zcmXYlF%Ez*6hiqX){8iG`RVNLUhMs^g49a#!h-_^GpDJhnakY&?rsE0VIwnzo$P$Z O5X!Q7TJwt{+C(*yrSIB;}zc1XR!-PO_muL%}j32A4mrdepEjdnWdqMIIi$sIsi hi9kf!7}27&v`NL;ds_XIN=983`3OCF0aOgG{Q;6P8O{Iz literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c409c5c3090058bb8a9b29fc92e658d86572bc4c GIT binary patch literal 122 zcmXZTArgQv3`Ef-P^L%0Md8u7Bo$~p_m^Rz?aWIeek)ddZ=;FfVzWYq_P Q5FiUl5Q#~gJkW^$0AZdUCIA2c literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7e7185e697c4a632d0475666d9d34ad6091e4787 GIT binary patch literal 150 zcmd;LU}pdU10c2nVpkyc2jVCoP6gt8Ag%)9Rv_*NVg}ZrpunKukdXfjY!H^d{(nYR YeIN({vXBIkm_*8lhW=+|0-5w50GCuD4gdfE literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..140c1c1a1119190b60cc12f01c570c88f6a9be45 GIT binary patch literal 109 zcmYMoI}U(Q2t-lved1EAq_wxUa3Hpp?tcY1FBXy+#UDOCrMMe!)v;fBLKbZR literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bbf2cfefbf22cdfcb86b5c4c6c29e03f08793c58 GIT binary patch literal 142 zcmZ|Gp$>pB3`Nn7Z3up*Xgr$GPGFHJG@kz+cR`?Na@vL;=&sBZTK|3L$oT<{Z62@y literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4e91a02e97fbda992277048fa53d78ac9d873d07 GIT binary patch literal 99 zcmZQ)U}FFQ6(H6FVoM-)24Wu|4h7;^AZB0<3JMGg4hi|szy@LI>;GqD)z=Tw4*{~6 VSb`9YV2}tib8xUekY-^7kpRa06bJwS literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e50cdd903ca34b10310f08137c19f607796bba10 GIT binary patch literal 97 zcmXxXF%p0<2t-jxlylfyP}|!(*=*ze4-%I`W*&UP!fFmV<&s+-dBq&S<|LPOAoVmd Tb6M1ve-6w_--jwyt!wLkmPivF literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3c5e8beb4ccee0b0398ccd1919d9917f3848b29e GIT binary patch literal 168 zcmZY1F%Ezr5Jb@d#KyyHV{LCKQd--40WV;0?M?MVV~iv(8Q5hywJN8_fDsuBR&3aD u;KT(*r76u>H=k>=8qJa!(FHN)>9fZump!j!YP|lJx6H-TP`Z3j?R)@7xgHe& literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cfa4e9201af99bcf5c881234fc2a5afbccc9037d GIT binary patch literal 110 zcmY+)yA6Oq3 Date: Sat, 9 Feb 2019 23:57:05 +0100 Subject: [PATCH 07/95] - re-added the existing characters of the Raven font for Hexen and fixed the palette for the Cyrillic ones. These were identical with the Heretic versions. --- .../game-hexen/fonts/defsmallfont/005C.lmp | Bin 0 -> 92 bytes .../game-hexen/fonts/defsmallfont/005D.lmp | Bin 0 -> 92 bytes .../game-hexen/fonts/defsmallfont/005E.lmp | Bin 0 -> 28 bytes .../game-hexen/fonts/defsmallfont/005F.lmp | Bin 0 -> 92 bytes .../game-hexen/fonts/defsmallfont/00AB.lmp | Bin 112 -> 112 bytes .../game-hexen/fonts/defsmallfont/00BB.lmp | Bin 112 -> 112 bytes .../game-hexen/fonts/defsmallfont/00C4.lmp | Bin 0 -> 168 bytes .../game-hexen/fonts/defsmallfont/00C5.lmp | Bin 0 -> 165 bytes .../game-hexen/fonts/defsmallfont/00D6.lmp | Bin 0 -> 171 bytes .../game-hexen/fonts/defsmallfont/00DC.lmp | Bin 0 -> 173 bytes .../game-hexen/fonts/defsmallfont/00DF.lmp | Bin 0 -> 163 bytes .../game-hexen/fonts/defsmallfont/0410.lmp | Bin 148 -> 147 bytes .../game-hexen/fonts/defsmallfont/0411.lmp | Bin 158 -> 158 bytes .../game-hexen/fonts/defsmallfont/0412.lmp | Bin 142 -> 142 bytes .../game-hexen/fonts/defsmallfont/0413.lmp | Bin 120 -> 120 bytes .../game-hexen/fonts/defsmallfont/0414.lmp | Bin 163 -> 163 bytes .../game-hexen/fonts/defsmallfont/0415.lmp | Bin 148 -> 145 bytes .../game-hexen/fonts/defsmallfont/0416.lmp | Bin 196 -> 196 bytes .../game-hexen/fonts/defsmallfont/0417.lmp | Bin 138 -> 138 bytes .../game-hexen/fonts/defsmallfont/0418.lmp | Bin 130 -> 130 bytes .../game-hexen/fonts/defsmallfont/0419.lmp | Bin 133 -> 133 bytes .../game-hexen/fonts/defsmallfont/041A.lmp | Bin 138 -> 138 bytes .../game-hexen/fonts/defsmallfont/041B.lmp | Bin 137 -> 137 bytes .../game-hexen/fonts/defsmallfont/041C.lmp | Bin 142 -> 142 bytes .../game-hexen/fonts/defsmallfont/041D.lmp | Bin 128 -> 132 bytes .../game-hexen/fonts/defsmallfont/041E.lmp | Bin 144 -> 143 bytes .../game-hexen/fonts/defsmallfont/041F.lmp | Bin 130 -> 130 bytes .../game-hexen/fonts/defsmallfont/0420.lmp | Bin 152 -> 152 bytes .../game-hexen/fonts/defsmallfont/0421.lmp | Bin 152 -> 149 bytes .../game-hexen/fonts/defsmallfont/0422.lmp | Bin 130 -> 130 bytes .../game-hexen/fonts/defsmallfont/0423.lmp | Bin 152 -> 151 bytes .../game-hexen/fonts/defsmallfont/0424.lmp | Bin 184 -> 184 bytes .../game-hexen/fonts/defsmallfont/0425.lmp | Bin 156 -> 154 bytes .../game-hexen/fonts/defsmallfont/0426.lmp | Bin 144 -> 144 bytes .../game-hexen/fonts/defsmallfont/0427.lmp | Bin 119 -> 119 bytes .../game-hexen/fonts/defsmallfont/0428.lmp | Bin 160 -> 160 bytes .../game-hexen/fonts/defsmallfont/0429.lmp | Bin 174 -> 174 bytes .../game-hexen/fonts/defsmallfont/042A.lmp | Bin 135 -> 135 bytes .../game-hexen/fonts/defsmallfont/042B.lmp | Bin 178 -> 178 bytes .../game-hexen/fonts/defsmallfont/042C.lmp | Bin 125 -> 125 bytes .../game-hexen/fonts/defsmallfont/042D.lmp | Bin 129 -> 129 bytes .../game-hexen/fonts/defsmallfont/042E.lmp | Bin 176 -> 176 bytes .../game-hexen/fonts/defsmallfont/042F.lmp | Bin 132 -> 132 bytes .../game-hexen/fonts/defsmallfont/2014.lmp | Bin 188 -> 188 bytes .../game-hexen/fonts/defsmallfont/201C.lmp | Bin 105 -> 105 bytes .../game-hexen/fonts/defsmallfont/201E.lmp | Bin 104 -> 104 bytes 46 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/005C.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/005D.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/005E.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/005F.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00C4.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00C5.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00D6.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00DC.lmp create mode 100644 wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00DF.lmp 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 0000000000000000000000000000000000000000..bddfa8a356d3542f0d4f946cd8431283e4b0e644 GIT binary patch literal 92 zcmZQ)U}j)o`1M}}Na_Hw2@u-=u?rCU0C5NqGcYSDDJd)e2hj>(T3J~h%9m480*Wgu P%YbPmB`GKk)bSqxQNRyR literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bddfa8a356d3542f0d4f946cd8431283e4b0e644 GIT binary patch literal 92 zcmZQ)U}j)o`1M}}Na_Hw2@u-=u?rCU0C5NqGcYSDDJd)e2hj>(T3J~h%9m480*Wgu P%YbPmB`GKk)bSqxQNRyR literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..79af547de8ebf5d4232e43fd1232807c8d6efe62 GIT binary patch literal 28 XcmZQ#U}OLR0U#CwF&O^?0fYnqF7gN@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bddfa8a356d3542f0d4f946cd8431283e4b0e644 GIT binary patch literal 92 zcmZQ)U}j)o`1M}}Na_Hw2@u-=u?rCU0C5NqGcYSDDJd)e2hj>(T3J~h%9m480*Wgu P%YbPmB`GKk)bSqxQNRyR literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00AB.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00AB.lmp index f61074ffeeafa5e4f39292f95cb0f35e550a2d6f..19da358e41c956215ab37e505c89cb6b7079ae99 100644 GIT binary patch delta 79 zcmW-X!41G535*_!poNBz2Ex*Do+^Zfi!*#Nt4BNZMUvI!>8NT LkSfv<(ue8;_?-(I diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00BB.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00BB.lmp index 22c382b519fd51fd879f06fd1d866633be4aaa37..16eb6067b3fa889fd534306e1071b803c45bd91c 100644 GIT binary patch delta 79 zcmW-X(G9>L6auT(bO{riBk3@m#!=i@dBO)rV2t_wST)O9SAh<9MAS#(wc&6#dS0nY Mjb_SzMwS$x4PQ79wg3PC delta 79 zcmW-X$q@h{5CXlrCJC$bWiUo#C}!-!G7oxybMD$$C8U=s3}`mL%9uL%c?ea%Ohl)P Kik9}8z4-vD7YiK# 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 0000000000000000000000000000000000000000..e93ede5533fcd387e6c3ddd5ab41dc67334b0c04 GIT binary patch literal 168 zcmX}l%ME}a5Cl--FH(RZ5F%vu>d_LczzS@^2CTpeY!+vY3VFbi9k9k49TUy8&`KNa zbkIo`H8lW{Vk+J07ASe-Vk|Hsd*{0pU*~<@CMd;6n^g Lqh(S*;HS@Ma;~cq~46!eorRFU* P9Zn3bS{S3|H?H~**1;I5 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2fc034052addd5b1275f22cee32b499f9dd098e7 GIT binary patch literal 171 zcmXYq(Fwya5JQiqlz0GRVvGa2p9H!=7w80?pc{08PS6FitMhDn@DKt?7c5x6J3QbC zFL=WTzVL$sY?55MB64pwOI2FSA~g$A^qlr>AI=FDauIi-kfj@v{!tetEq#SzRW7v< Q8JlEM+`5_i3jc<*6B*|i)&Kwi literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1a06ecd1de1212da82f0ada72b700a43b60d5f93 GIT binary patch literal 173 zcmX}k(Fp=E5QO1yN5m8m!Uf44|2_#eU;|cQ1-4)bR$v8|8fU}lz_$=KvnizDxyV&+ za+ilZ1wEZt)DQ!u<1V3HC3EaR5oWKcOz%o1G*T%vhtp%EXyvR=tp-kHO2Cfyg_; M9)GSa*iB~k9yjs=D{QdC z9Ukz67aX!A_mNIg?^kIUgI+GB{WMi|>g>+`h@s5(%s3RtglxV2%_VAlFEH|(;Q9kO CDH3P^ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0411.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0411.lmp index fafa685af34fe425733f46c1afd685757f173392..fb5961475be6f675e4186af5cfbad29cbf13e329 100644 GIT binary patch delta 98 zcmXYoK?;B{5Cgkf!9GBiEsH{O@}{5hUHXB3wYDPUkRg*IMealJoOGgB3)tGt$ASt42ZGa_O1%aX&_sF0lrKUT>t<8 delta 98 zcmXZT%L#xm6hzTHKV#eqnjjB_nFh2O>(U0&YINc9a=68c-G|{h)3wZGwMcH*!4%^c kfO99-UosqYpoUTM#JqZzYG}z!b{(0fVW?)3`bPS;7iLxvy#N3J diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0412.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0412.lmp index a6a381d438a255fa7cc51fc5122d33db53c5b6d8..6b966352fc86a0fb20b8c5dd891c950a28882807 100644 GIT binary patch delta 101 zcmXYpOA3H65JMd)dIBjULkr2OJ5S`1iZ`zDvj{vM;dSeF9VY>h9MeihjeP^eKzMe4 dy%<^hd_n!0Y$Z_SZ2_7`(|u0rJ&k07aRc|}6czvg delta 101 zcmXAhK?;B{5CdH)vFC!cm8FI32YiuFD*jm4dPo?CkRe0v^NIwc*|ThB+V$8;XHrY9 fWqLr7J(#|s^JlZv6wSSWOjVQ5*FfU?2tw}{mCh0o diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0413.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0413.lmp index 036e8ab110cc2ebe2d286ebf1a6f102eb4803f3a..0a45b8110e0dedb4bc042b1614c7772419d91242 100644 GIT binary patch delta 81 zcmb=Zn4sgMq@=6_1pgV>m6YV=<)oybYz0YiNpWRmpt!QKoRTs~(SHVJB_*&tkd}n< K#i2A%!G8d<-Vovd delta 81 zcmXYlyA6Oa3`CKT&TL@fB0+a8qhz3r!N$ZyRPQs!b9e9{%-+q&)@lTh4qU}gm(ryQ QiQnJJAd^7(+ZO@lpIbl*t{Y}!me5l4emHM-^p;Lw sOo8mRP@&r$}UPqFJ>O=cv-&ri@szM02Qe?CV<`K~702G6PYRBv!oI9xv(A<+*NPghbYcV&srWTD3_f p0x(P#5>VRF%5o>vtmiVwY5cCKuly@3vVVmQP+(mP;{{e17&HI? delta 124 zcmXYp!3hH~5CgqjtaAg4Z7}B`y;4o8NgpZd`f}Egj~FC0x83%Ae}I)v>6#e5lx10J xS0jS}c1W?4V?O7IHl0BC>aX}&E`=?MAhLP?yQ;HpS2{=s9tYrCXp-`d^#iS56?*^x diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0417.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0417.lmp index c8ec4da94140e116c5d009b40e1c135d676ed55a..2efe76f16e873a730640e062d9062c99c24d8c9c 100644 GIT binary patch delta 81 zcmXZSF$#b{3`9{QiYE|B2o`^;y@j<$+sYfSDVAv-!|&GZd*0Thu^dtooKU8eT+^-_ SpG|mr)Nea@jj@`f%_#n+6A$zN delta 81 zcmW;CK?;B{5CcG0H1=E&+okl7e8jU)>&YM2MM7W*88+;_pPZ$+98!bx1j3}F;UdF8 WO+A|akJnZ_cH7Ak;apA9W(CS4nI{7=K{j?wq%^#%43wnQE(jt{a>PQcVyk`_pn<9T0mzu(jT`ZSn=T$`Szp diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041B.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041B.lmp index 7acf74f2a087e5726f0aae215f1574f41d1aed86..77aef63b31b1f4d7c0f1ec85cbe9cd4884cb5232 100644 GIT binary patch delta 92 zcmXYnK?;B{5Cgl1))$Dhl%*sm@BNC8>dhao5rrIv$t+uT&kFz@2rFcFZ)Btb4DU@g ZWub~!l7p%xx9_h%w|eZS63bMe#RFgl5>5aB delta 92 zcmXBLK?;B%6og^l!qIgQp~ypKuFzFFl)G+hR=eRF{$a!J^8zRbra@}%Rhj{0_g0sN b2=v697fM~=i|PN%w}D!YeOsMHi4Zv-{SFW& diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041C.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041C.lmp index 1eafc124ada9cd8c108958b81fb3d474f9ccc948..a7202cdb993d8130027fca94f8518618aa44ad1b 100644 GIT binary patch delta 101 zcmXYpK?=Yi5Ch$o))&a4$QH6EZ@#EclK$AH(wssv$&evWzX1nkh`?1#*56y!)ad1O fubGU`Z3iqRMnnzNTA9_-ScmwLs%v$yku9vJ-uj|GN&4e$^b$fc$%rF<&kO5j9+KJBYLVpuEs}4* hBYJPesJ`utb7n+TVQlA0wbhe#NRt#R{=32s}c|>D=GbFU{_L-my?ndS5^kI nfhJA5QX8R;BWzh5(DO4qpbrtfVH&)IDq4eFT~;_FPA@b5=7*!3*U`)I_RW} vZhFXhKw&_Y0F<1DXvVFY#@Mf_wG|0%DbE^0Yx9)L{I?V1$UmGngLYgWM(Yx) diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041E.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041E.lmp index 5162a1aeea7a0e73cf6438fec49a09609930702e..c25542b7257cc5bdb0157a74175083a8fec8f9e7 100644 GIT binary patch delta 104 zcmXYp!3}^g3^t4L~(y15R&1BnG>cUM8zL e_xf>W4y+vZYt+$Lo)tfw=lRHLCoNf(LZlZ&)ejW_ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041F.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/041F.lmp index 4fb74bf3f04b1b60306ff515901d85bcac3b5f89..da4b9f7297fa41f294781a6b75c8d010e6e6e7de 100644 GIT binary patch delta 93 zcmZo-Y+{_C6Q-oBq@?tpfn7;SK~6?W63kXsmXZ_~)l^pg&%manBn4Ce5(YA5piH1@ Xc{v$5d8kg1Msc8OMplqK(7^uyW4#hU delta 93 zcmXBLu?>JQ3`EhS;OLQ1NMt4G+-4pI$^>j|EYtns{gqdK=L02RX(#V4twyW1TFyh& a639jb0U-F(_2|+^Xu!v-xXv5hDrq18OAr(Q diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0420.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0420.lmp index b757ad836b4b10d1be737bad8a30f562b97b5c36..108eb57ae689d8157ee06de9d1ff4dae3b8ae227 100644 GIT binary patch literal 152 zcmXBN%ME}a5CqWm7qtLmAOy^CGO+<0umKCO0}HSK&sHqX;^Dy#1EH5rMBcP;U1_78 z4m#6c0PDLFB-s%`nas3 Gevv+yz8IGP literal 152 zcmXAi%ME}q3`0{sGC3nu6`_^^SbzmsfC1Qm0T_TY6H}aWc!?b+ib^LUZ(dkevXPw} z?{+4J4ppo6MGov1-v%Ows191%kKZs#bfE EKV9Dv+5i9m diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0421.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0421.lmp index 4c4572395ec1e21ddd517750a7e07bcef35deb72..a02f2d1efcca902207321a25da87e4e97282993c 100644 GIT binary patch literal 149 zcmXYpyA6Oa3`89WLJWYSpeUeoOG(WD48R6#zyQc2LsmXr&KWZ>~5fkN2&Ys=x0rhZ+jM EE@e*<_5c6? diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0422.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0422.lmp index 74b9733b77b75281c180c6e8395fd1077bb2df04..db269314b1f67b33981b8d60b8ad3997ea97ff2f 100644 GIT binary patch delta 93 zcmXww%L#xm5CvUPtUy9!NnqYJ^;l3Uu;aJ}JiYI9>-Mx8#2zdd0#uBpt delta 93 zcmW-Y!3}^Q5Cl1+D-9S#2_(B;>#-mzuw%UNn`CCXb^D$d7-5xK1vVo&!cG>5B}Qi; bl{Q>DOXrdDEzRZvk>?H6c}G8NAwBp38odxs diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0423.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0423.lmp index 8e60a4301b16a49e5843cec7229030fc81059fd1..7978f087d9e1091c0d100ea23574bef12b8525f9 100644 GIT binary patch delta 112 zcmXAgOAdfA5JEe(elB248`B!tdoOR}PH#KXxPeE2*B-miiv&gk;9-ye={FCFtWBk| j%)AxCg$*ok9W4^v#H*+@+ z^E5B>HXnl`k%x(7U?w-R{v}YQK3qCm0t>me?jS`D*!p(K!q&UCraww!^povW$#a@g H@;UGWI~x+8 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0424.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0424.lmp index 86d320a70a46b4864a785bd81c6ef5ecb6afc97d..09a6efc882f182abf2d71ce6539c974c968a9e22 100644 GIT binary patch literal 184 zcmYMtyA47y425A6A#@A+C{g5Goh(5|OHa=NEWiRRKu=H0f|#F|i1bCaW1XyRGP6f) zxVPA0j{}Z4;fxEexZ#eJq%mT#l-#ATl{A<7E4x&AwrLD?WpQYv?#=uBZM@Zz^M9>< W)<`18UvtXl&iwsRAtzEIQt<>-;vYT$ delta 133 zcmXYq!41PO3?N3G`A_lWerU7;6Q diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0425.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0425.lmp index b5197cff1b176433e175bc91891af3bf4bd83bfe..bef7228e58452017ad9329d99f3d9fc31a8e03d8 100644 GIT binary patch literal 154 zcmd;NU}s=p`1fB2NSXt&8xRKpaU2k50C5QrHvn-z5Hm6=DJijni2n@CN=gb!N-RK1 z3dChsR{k%qBqt7}7}%AR>IjCwmQ6)`Ds6jv)WDr;b G!U_QLB^e9= literal 156 zcmYj~u?>JQ3H8cO{U4ufc7EE9KV!Z delta 80 zcmW-X!3}^Q5CkECr3BOv@3Q-~6APjZJI2$`W->c-KGzMbRHSo!P)WBzu3Si1s9b^O UEmVpzk6Q|s`gZL7FGvwlyob3DMgRZ+ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0428.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0428.lmp index 93d87c12448bee30f1ac80f0e677a5cfe001b6c9..7467d1268e9dc453aa9bce5f373b1bc81e852efe 100644 GIT binary patch literal 160 zcmXYqF$#b%3`NsH3+_@VA(rF<&K|%6xVyW%djJpMajn0#ffqjEB^k&Q(VJ)V1*~8L zJ2=1zE^vbfxK97dmh0X9|`qW}N^ delta 125 zcmXYpQ3}H_3`3K_w0svzsWD!VF42?i96d>{n0aCTlApvIb=3R%fC6TDkv-f@$}Dxa tBa&B;0E1ldw^&rNW4A@K2H$^2c(}JVO9LV&e&$nC4q@L?{(LBJegUc07AOD! diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042A.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042A.lmp index 520a4c03be73b7383af086fd9e3013e2e183ce8f..dd96c4ee25674ffff36d6489406df43cebd1b261 100644 GIT binary patch delta 87 zcmZo?Y-gNc9-yS8q^zX$pMhOTNlso)N)pPJl#&z|2eKL2fZ|{TXDTa$nUZpHqCf>q QEJ{j}nm`6KlQPI40RFfUivR!s delta 87 zcmW-X!3lss5Ch#);x!<*-eZOA%L;76uI_8c8iYW?WQGlUt{X&>@3aDOM0Y@&^uD(y ZZXg2+G^HrD{?sEj31yLd>Yhuc>I14C4|M_+Q&}0zl$4Vb1u9@-QBsoBgz5sB1_WRe^?_`Gg8u-2Z5^`! delta 127 zcmXwxQ3`+{5JWX%^ji>7Y>N>(L?`PQouv!fve4h-@n&BC`scdA2uv4%W0zKq$=Yfu r${v6aVn_-oF`BKLWO6R6#!0~iasbqUy-An;zm=TwIfi*^qS5>SeV!Ex diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042C.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042C.lmp index 8323fe38a2e0eb32c4d6827aeef8ced3b17d2a06..288cdd3838eeaf3289ed9ab236df1cf60ded1d40 100644 GIT binary patch delta 84 zcmb=eouKEhq@=8*^q+xUNl8IoPD&EWmXwkd7YDK#*_4#zzzEJ%Rt7UA<>W+x3Yb`w Olq5BQ3}z-}kU;?Ej1fx! delta 84 zcmW;CK?;B{5CcH154Y(_d4NF!m=kN@G WBSDD}-N$O=8Hcn=*CF*KxkvqS7!K$F diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042D.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042D.lmp index c8036ec795a63da4dddf94fc8660cbaa5c5eba01..7877d45c5aee322fd682f5a867306b9377668dee 100644 GIT binary patch delta 54 zcmZo(YM?4)fJTTy#ewollFG_J6M<@E TkjbfGj3vWw3n!Fw7j< delta 129 zcmXYo%ME}a5JW|G7&#k4G(^mvtia-|!cy!I*U#%RoTppxPYBS|`#9@8@jI%RnKSes4Rc7{8`0Wj6mjbJ~o0AEO2B1_@&m5&!@I diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042F.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042F.lmp index efaf819f915949679fc7deb0ad112b7e5827c8ba..425e8d91a365576a00552a9670779611c840e97f 100644 GIT binary patch delta 97 zcmXxc(FuSs3yhz+O(5QWnl@P?PDCzW^EPPF yp~rv`6J{(}v0=x76XI0W%s=&^)vspdJIAUPoIdwo&GL7SRn5XaHVtzuKl&T7b|V-7 literal 188 zcmY+-Ar62r3_#H)OGOoy5CR+qi9{liNF)-8L?V$$u1CfPHi3BiY1(9oI1#yg&D)?w yhaLk)Oqj7?#fBXRPKZ-gGyl|wR==8+?;NXIaQfVTHOt>QRy7Oz*fh+s{OE5VO&m-B diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/201C.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/201C.lmp index 9bdbbeeea394ad04df7ccadbd5e79f5d5fa90ec8..18f38ddddbf1cbfaa7a91bd19132891cdb80ea10 100644 GIT binary patch literal 105 zcmXYnArgQv5Ca3P;0qvgrZ^-PSBJ#%{~w^rc0g>BxxGnQ($fmL!43yhIN^dDlp<_5 ZB_g6J+sn!rM$V?X|8#HkT>fG6_X1V~6KMbd literal 105 zcmd;JU||3O4InlIVk;na0%A`f4glgvAWj5g1{O|Eb|CoAz{1Y1Aj8S|pOKlJT^K|& XfyEh_KnftzazF-1S_4Y61C;>))vXK( diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/201E.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/201E.lmp index 222edb99612ec162fe8261b4180cf87ced9db52c..16271f778572d7b0af324bf1195364f6e9e25754 100644 GIT binary patch literal 104 zcmd;JU||3O4InlEVoM-)1Y!>$_6On!AWi^cMrI`t_|L!sBxID8|APcHK{OLsoRLXc R873_UWPqeKptKTD832Pw5m^8L literal 104 zcmXZRArgQv5JS;GI}=u;Kp`uUSR4+C<^DH7mEQsJHap3nEa|C*yJEwR11B!rP>Qf! amFy*=D%ZGQodSPkL; From 993a16787cb405d86525d92084ff410a6f6e2da9 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 10 Feb 2019 09:59:05 +0100 Subject: [PATCH 08/95] - removed the special exception for those weird "No..." messages and moved the only one that isn't garbage to the language lump. --- src/p_conversation.cpp | 12 ++---------- wadsrc_extra/static/language.enu | 2 ++ 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index 7b2e08b6ad..d5514c09b6 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -599,16 +599,8 @@ static void ParseReplies (const char *name, int pos, FStrifeDialogueReply **repl } 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; - } - + FStringf label("$TXT_RNO%d_%s_d%d_%s", j, name, pos, TokenFromString(rsp->No).GetChars()); + reply->QuickNo = label; } else { diff --git a/wadsrc_extra/static/language.enu b/wadsrc_extra/static/language.enu index 0e8daea0bf..3b67e30543 100644 --- a/wadsrc_extra/static/language.enu +++ b/wadsrc_extra/static/language.enu @@ -200,6 +200,8 @@ 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?"; From dab7d37a02238dbc5b99daf426556ba6c730d213 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 10 Feb 2019 10:21:51 +0100 Subject: [PATCH 09/95] - use proper casing for the game texts so that they can also work with a complete font. --- wadsrc_extra/static/language.enu | 2550 +++++++++++++++--------------- 1 file changed, 1275 insertions(+), 1275 deletions(-) diff --git a/wadsrc_extra/static/language.enu b/wadsrc_extra/static/language.enu index 3b67e30543..0bf31292b0 100644 --- a/wadsrc_extra/static/language.enu +++ b/wadsrc_extra/static/language.enu @@ -2,1288 +2,1288 @@ // Strings from Hexen's IWAD scripts. Technically they are not needed here for English, they are mainly meant to be documentation for translating. -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_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"; - -// 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_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_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"; + +// 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!"; - -// 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_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"; +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"; From afc17d6bcc15d683dc3a5d76f3335f3bf22c39be Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 10 Feb 2019 13:59:26 +0100 Subject: [PATCH 10/95] - removed $ from string label. --- wadsrc_extra/static/language.enu | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wadsrc_extra/static/language.enu b/wadsrc_extra/static/language.enu index 0bf31292b0..7edb1df536 100644 --- a/wadsrc_extra/static/language.enu +++ b/wadsrc_extra/static/language.enu @@ -200,8 +200,8 @@ 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_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?"; From 4bacde36c05febe0a0285b6fe614efa3f381a299 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 11 Feb 2019 00:26:47 +0100 Subject: [PATCH 11/95] - moved Strife's map names to the string table. --- wadsrc/static/language.enu | 40 ++++++++++++++++ wadsrc/static/mapinfo/strife.txt | 78 ++++++++++++++++---------------- 2 files changed, 79 insertions(+), 39 deletions(-) diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index 7ad4b6ca7c..a7f0b63220 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -2943,3 +2943,43 @@ 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"; 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" } From 3a440a5fa738dcd83c9aa931270f223547bcaa69 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 11 Feb 2019 00:43:57 +0100 Subject: [PATCH 12/95] - moved the displayed text in strfhelp.o to the string table. --- .../static/filter/game-strife/acs/strfhelp.o | Bin 3288 -> 3196 bytes wadsrc/static/language.enu | 6 ++++++ wadsrc/static/strifehelp.acs | 12 ++++++------ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/wadsrc/static/filter/game-strife/acs/strfhelp.o b/wadsrc/static/filter/game-strife/acs/strfhelp.o index 521d8871455b1583c77450c88d8e22cfebb852a6..483056f7bf4d94f1c78aaa1aeac84e2b58d0a0f4 100644 GIT binary patch delta 503 zcmX}oF^CgE6vpwlyNQA!SemF{3PZ#~%yC+o$g-K}nq)WZ&V>scgcQo1Xk}7ZMFq7G z1X)lU16D!7LeePMD5SG65KxO0fkUv->aYpue+}Hg@0&OCW~P{L*<~haJE8R6Ca0z` zjJ}%Z$h1`>+tw-ao>j6+i(&N1DyJ%oVQW2|5E)5yJaIJ2Cw?c?Vx-2IVU8d8g+KU<1D42P96=5RoWXfqgo1|_wy=#J?&6_U5P3#1!aID#7wlq* z6u)x}Yvb<+ADCKi>W-&WrQ=+->#n2ZbpO`XYu%k2vfuHWb{PI&R)hFtGjK!SQ^9Jl xqCy?`?f3=XYpFo1AetS@orteHexq4enw}19*K@r~64u%cPoFK0ucRIu{{XE(Wk3J` delta 605 zcmY+=J!lj`6u|MfyLSjDDMXO?1-qaaO%ug5f?_<4NH`Tw?>sAqy-99i-92abf+^%c zR1igrMF?71ND5I1SBQlm>4Hrxf@!y~5mc}XvB>}ML^AMuGw|NLH_V^mwcW*ua#dCq zi(hQ3o_)2)i9^m5vEhsm?>Q%(vw1yRa!zeOm)C2@hYBJKlI<(($qp8N6(;kA$=+~r z-s;Yi=&$pCHyN=+&Y*(p@DX7S_wfub@EVKwh-IuI#}BNdXp8K?ejLU)CQv~G8nf85eK`H*gan?%)9)JEI~m zIlRFVKI0oKe#OHWPNRk=z13|G?QSFPxRKUPH*IOxZ>ccwwd=`|PNJt(5XzSPC8PXM zyO&jxc>Tl?HK?cy7O}r5NeQx7wjj2W?ZMf+&b)TxGP9>Qtk0@#@%7k>1bJQ)?4b CLX0{9 diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index a7f0b63220..736c578e0a 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -2983,3 +2983,9 @@ 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"; 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 { From 6d19374ae866699321d1dda318a0c9d495fc3d72 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 11 Feb 2019 00:46:13 +0100 Subject: [PATCH 13/95] Only replace Strife dialogue content if the default strings from zd_extra.pk3 are present. If not, use the dialogue file's content directly. --- src/gamedata/stringtable.cpp | 26 ++++++++++++++++++++++++++ src/gamedata/stringtable.h | 1 + src/p_conversation.cpp | 13 +++++++++---- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/gamedata/stringtable.cpp b/src/gamedata/stringtable.cpp index 95c2e754ed..1afc68e439 100644 --- a/src/gamedata/stringtable.cpp +++ b/src/gamedata/stringtable.cpp @@ -208,6 +208,32 @@ size_t FStringTable::ProcessEscapes (char *iptr) return optr - sptr; } +bool FStringTable::exists(const char *name) +{ + // 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 false; + } + FName nm(name, true); + if (nm != NAME_None) + { + uint32_t defaultStrings[] = { MAKE_ID('*', '*', '*', 0), MAKE_ID('*', 0, 0, 0), MAKE_ID('*', '*', 0, 0) }; + + for (auto mapid : defaultStrings) + { + auto map = allStrings.CheckKey(mapid); + if (map) + { + auto item = map->CheckKey(nm); + if (item) return true; + } + } + } + return false; +} + // Finds a string by name and returns its value const char *FStringTable::operator[] (const char *name) const { diff --git a/src/gamedata/stringtable.h b/src/gamedata/stringtable.h index 1c479ba5a5..11416367c1 100644 --- a/src/gamedata/stringtable.h +++ b/src/gamedata/stringtable.h @@ -71,6 +71,7 @@ public: const char *operator() (const char *name) const; // Never returns NULL const char *operator[] (const char *name) const; // Can return NULL + bool exists(const char *name); private: diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index d5514c09b6..957f3b0a2f 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -352,7 +352,7 @@ static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, const char *nam if (name) { FStringf label("$TXT_DLG_%s_d%d_%s", name, int(pos), TokenFromString(speech.Dialogue).GetChars()); - node->Dialogue = label; + node->Dialogue = GStrings.exists(label)? label : FString(speech.Dialogue); } else { @@ -376,6 +376,8 @@ static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, const char *nam label.ReplaceChars(' ', '_'); label.ReplaceChars('\'', '_'); node->SpeakerName.Format("$TXT_SPEAKER_%s", label.GetChars()); + if (!GStrings.exists(node->SpeakerName)) node->SpeakerName = speech.Name; + } else { @@ -446,7 +448,7 @@ static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, const char *nam if (name) { FStringf label("$TXT_DLG_%s_d%d_%s", name, pos, TokenFromString(speech.Dialogue).GetChars()); - node->Dialogue = label; + node->Dialogue = GStrings.exists(label)? label : FString(speech.Dialogue); } else { @@ -475,6 +477,7 @@ static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, const char *nam label.ReplaceChars(' ', '_'); label.ReplaceChars('\'', '_'); node->SpeakerName.Format("$TXT_SPEAKER_%s", label.GetChars()); + if (!GStrings.exists(node->SpeakerName)) node->SpeakerName = speech.Name; } else { @@ -566,6 +569,8 @@ static void ParseReplies (const char *name, int pos, FStrifeDialogueReply **repl if (name) { FStringf label("$TXT_RPLY%d_%s_d%d_%s", j, name, pos, TokenFromString(rsp->Reply).GetChars()); + reply->Reply = GStrings.exists(label)? label : FString(rsp->Reply); + reply->Reply = label; } else @@ -590,7 +595,7 @@ static void ParseReplies (const char *name, int pos, FStrifeDialogueReply **repl if (name) { FStringf label("$TXT_RYES%d_%s_d%d_%s", j, name, pos, TokenFromString(rsp->Yes).GetChars()); - reply->QuickYes = label; + reply->QuickYes = GStrings.exists(label)? label : FString(rsp->Yes); } else { @@ -600,7 +605,7 @@ static void ParseReplies (const char *name, int pos, FStrifeDialogueReply **repl if (reply->ItemCheck[0].Item != 0) { FStringf label("$TXT_RNO%d_%s_d%d_%s", j, name, pos, TokenFromString(rsp->No).GetChars()); - reply->QuickNo = label; + reply->QuickNo = GStrings.exists(label)? label : FString(rsp->No); } else { From e4690b4cd89e514f7317a256c1958234ab27bd03 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 11 Feb 2019 01:33:09 +0100 Subject: [PATCH 14/95] - exported all Hexen map names and intermission texts to the language table. As IWAD content this is in zd_extra.pk3. --- src/gamedata/g_mapinfo.cpp | 41 +++- src/gamedata/g_mapinfo.h | 21 +- src/intermission/intermission_parse.cpp | 17 +- wadsrc_extra/static/language.enu | 256 +++++++++++++++++++++++- 4 files changed, 320 insertions(+), 15 deletions(-) diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index f5f45fdca2..77a942127a 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -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, false); + 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, sc.String); + if (GStrings.exists(key)) + { + clusterinfo->ExitText = key; + clusterinfo->flags &= ~CLUSTER_EXITTEXTINLUMP; + clusterinfo->flags |= CLUSTER_LOOKUPEXITTEXT; + } + } + } + + } CheckEndOfFile("cluster"); } @@ -1900,8 +1922,25 @@ level_info_t *FMapInfoParser::ParseMapHeader(level_info_t &defaultinfo) { sc.MustGetString (); levelinfo->flags |= LEVEL_LOOKUPLEVELNAME; + levelinfo->LevelName = sc.String; + } + else if (HexenHack) + { + levelinfo->LevelName = sc.String; + + // 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..bb6ae9886d 100644 --- a/src/gamedata/g_mapinfo.h +++ b/src/gamedata/g_mapinfo.h @@ -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/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/wadsrc_extra/static/language.enu b/wadsrc_extra/static/language.enu index 7edb1df536..36290df475 100644 --- a/wadsrc_extra/static/language.enu +++ b/wadsrc_extra/static/language.enu @@ -1,7 +1,255 @@ -[enu default] +[en 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_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?"; + +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_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."; + +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_HEXEN_WIN3MSG = "\n" + "but there are other players mightier\n" + "than you, and who can know their\n" + "next moves?"; + +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_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_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_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_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?"; @@ -68,7 +316,7 @@ 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_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"; @@ -88,12 +336,12 @@ 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_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_IDON' = "I don't even get my own tombstone - cf"; +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?"; From fe981c68d36ea511ce756615353bc717b517a37e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 11 Feb 2019 01:58:51 +0100 Subject: [PATCH 15/95] - changed font loader to detect fonts in folders and to find all default fonts in folders. --- src/v_font.cpp | 125 +++++++++++++++++++++++++++---------------------- 1 file changed, 68 insertions(+), 57 deletions(-) diff --git a/src/v_font.cpp b/src/v_font.cpp index 0b4ebd9a04..e7b2fd522a 100644 --- a/src/v_font.cpp +++ b/src/v_font.cpp @@ -961,10 +961,22 @@ FFont *V_GetFont(const char *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)) + { + // 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(name, true); - if (lump != -1) + if (lump != -1 && Wads.GetLumpFile(lump) >= folderfile) { uint32_t head; { @@ -974,19 +986,24 @@ FFont *V_GetFont(const char *name) 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); + return new FSingleLumpFont (name, lump); } } - if (font == nullptr) + FTextureID picnum = TexMan.CheckForTexture (name, ETextureType::Any); + if (picnum.isValid()) { - FTextureID picnum = TexMan.CheckForTexture (name, ETextureType::Any); - if (picnum.isValid()) + FTexture *tex = TexMan.GetTexture(picnum); + if (tex && tex->GetSourceLump() >= folderfile) { - font = new FSinglePicFont (name); + return new FSinglePicFont (name); } } + if (folderdata.Size() > 0) + { + return new FFont(name, nullptr, path, HU_FONTSTART, HU_FONTSIZE, 1, -1); + } } - return font; + return nullptr; } //========================================================================== @@ -1023,30 +1040,33 @@ FFont::FFont (const char *name, const char *nametemplate, const char *filetempla TMap charMap; int minchar = INT_MAX; int maxchar = INT_MIN; - for (i = 0; i < lcount; i++) + if (nametemplate != nullptr) { - 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()) + for (i = 0; i < lcount; i++) { - if (position < minchar) minchar = position; - if (position > maxchar) maxchar = position; - charMap.Insert(position, TexMan.GetTexture(lump)); + 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 (filetemplate != nullptr) @@ -1061,7 +1081,7 @@ FFont::FFont (const char *name, const char *nametemplate, const char *filetempla char *endp; auto base = ExtractFileBase(entry.name); auto position = strtoll(base.GetChars(), &endp, 16); - if ((*endp == 0 || *endp == '.' && position >= '!' && position < 0xffff)) + if ((*endp == 0 || (*endp == '.' && position >= '!' && position < 0xffff))) { auto lump = TexMan.CheckForTexture(entry.name, ETextureType::MiscPatch); if (lump.isValid()) @@ -1658,7 +1678,7 @@ FSingleLumpFont::FSingleLumpFont (const char *name, int lump) : FFont(lump) 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); + I_Error ("%s is not a recognizable font", name); } else { @@ -2942,7 +2962,7 @@ void V_InitFonts() V_InitCustomFonts (); // load the heads-up font - if (!(SmallFont = FFont::FindFont("SmallFont"))) + if (!(SmallFont = V_GetFont("SmallFont"))) { int i; @@ -2960,7 +2980,7 @@ void V_InitFonts() SmallFont = new FFont ("SmallFont", "STCFN%.3d", "defsmallfont", HU_FONTSTART, HU_FONTSIZE, HU_FONTSTART, -1); } } - if (!(SmallFont2 = FFont::FindFont("SmallFont2"))) // Only used by Strife + if (!(SmallFont2 = V_GetFont("SmallFont2"))) // Only used by Strife { if (Wads.CheckNumForName ("STBFN033", ns_graphics) >= 0) { @@ -2971,37 +2991,28 @@ void V_InitFonts() SmallFont2 = SmallFont; } } - if (!(BigFont = FFont::FindFont("BigFont"))) + if (!(BigFont = V_GetFont("BigFont"))) { - int lump = Wads.CheckNumForName("BIGFONT"); - if (lump >= 0) + const char *bigfontname = (gameinfo.gametype & GAME_DoomChex)? "DBIGFONT" : (gameinfo.gametype == GAME_Strife)? "SBIGFONT" : "HBIGFONT"; + try { - BigFont = new FSingleLumpFont("BigFont", lump); + BigFont = new FSingleLumpFont ("BigFont", Wads.CheckNumForName(bigfontname)); } - else if (gameinfo.gametype & GAME_DoomChex) + catch (CRecoverableError &err) { - 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", "defbigfont", HU_FONTSTART, HU_FONTSIZE, 1, -1); - } + BigFont = new FFont ("BigFont", (gameinfo.gametype & GAME_Raven)? "FONTB%02u" : nullptr, "defbigfont", HU_FONTSTART, HU_FONTSIZE, 1, -1); } } - if (!(ConFont = FFont::FindFont("ConsoleFont"))) + if (!(ConFont = V_GetFont("ConsoleFont"))) { - ConFont = new FSingleLumpFont ("ConsoleFont", Wads.GetNumForName ("CONFONT")); + try + { + ConFont = new FSingleLumpFont ("ConsoleFont", Wads.GetNumForName ("CONFONT")); + } + catch (CRecoverableError &err) + { + ConFont = new FFont ("ConsoleFont", nullptr, "defbigfont", HU_FONTSTART, HU_FONTSIZE, 1, -1); + } } if (!(IntermissionFont = FFont::FindFont("IntermissionFont"))) { From 0b8fb3ac1a29289b81448b00973fe34081b322fd Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 12 Feb 2019 00:19:44 +0100 Subject: [PATCH 16/95] - cleanup of font init to have less special cases To make things easier, DBIGFONT, SBIGFONT and HBIGFONT will now be renamed in the lump directory to make things a bit easier to handle. Another change is to make font folders atomic units to prevent cross-pollution between incompatible fonts. The only exception to this are the def* folders because they need to piece together their fonts from both zd_extra.pk3 and the IWADs. --- src/gamedata/g_mapinfo.cpp | 2 +- src/gamedata/w_wad.cpp | 32 ++++++++- src/gamedata/w_wad.h | 2 +- src/menu/menudef.cpp | 2 +- src/v_font.cpp | 67 +++++++++--------- src/v_font.h | 2 +- .../game-doomstrifechex/bigfont.lmp} | Bin wadsrc/static/sbigfont.lmp | Bin 6253 -> 0 bytes 8 files changed, 66 insertions(+), 41 deletions(-) rename wadsrc/static/{dbigfont.lmp => filter/game-doomstrifechex/bigfont.lmp} (100%) delete mode 100644 wadsrc/static/sbigfont.lmp diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index 77a942127a..c7e20de09b 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; diff --git a/src/gamedata/w_wad.cpp b/src/gamedata/w_wad.cpp index 5057963962..3ef9a7640f 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"); + } } } @@ -1265,6 +1271,8 @@ FResourceLump *FWadCollection::GetLumpRecord(int lump) const // 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. // //========================================================================== @@ -1275,7 +1283,7 @@ static int folderentrycmp(const void *a, const void *b) return strcmp(A->name, B->name); } -unsigned FWadCollection::GetLumpsInFolder(const char *inpath, TArray &result) const +unsigned FWadCollection::GetLumpsInFolder(const char *inpath, TArray &result, bool atomic) const { FString path = inpath; FixPathSeperator(path); @@ -1287,13 +1295,31 @@ unsigned FWadCollection::GetLumpsInFolder(const char *inpath, TArrayFullName.IndexOf(path) == 0) { // Only if it hasn't been replaced. - if (Wads.CheckNumForFullName(LumpInfo[i].lump->FullName) == i) + if ((unsigned)Wads.CheckNumForFullName(LumpInfo[i].lump->FullName) == i) { result.Push({ LumpInfo[i].lump->FullName.GetChars(), i }); } } } - qsort(result.Data(), result.Size(), sizeof(FolderEntry), folderentrycmp); + 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 ((int)result[i].lumpnum != maxfile) result.Delete(i); + } + } + qsort(result.Data(), result.Size(), sizeof(FolderEntry), folderentrycmp); + } return result.Size(); } diff --git a/src/gamedata/w_wad.h b/src/gamedata/w_wad.h index 469b3f6684..4f6740a0ec 100644 --- a/src/gamedata/w_wad.h +++ b/src/gamedata/w_wad.h @@ -179,7 +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) const; + unsigned GetLumpsInFolder(const char *path, TArray &result, bool atomic) const; bool IsEncryptedFile(int lump) const; diff --git a/src/menu/menudef.cpp b/src/menu/menudef.cpp index 409db4ba3d..2b6301653d 100644 --- a/src/menu/menudef.cpp +++ b/src/menu/menudef.cpp @@ -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); diff --git a/src/v_font.cpp b/src/v_font.cpp index e7b2fd522a..598f7d6ea2 100644 --- a/src/v_font.cpp +++ b/src/v_font.cpp @@ -955,7 +955,7 @@ static int stripaccent(int code) return code; } -FFont *V_GetFont(const char *name) +FFont *V_GetFont(const char *name, const char *fontlumpname) { FFont *font = FFont::FindFont (name); if (font == nullptr) @@ -967,14 +967,14 @@ FFont *V_GetFont(const char *name) 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)) + 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(name, true); + lump = Wads.CheckNumForFullName(fontlumpname? fontlumpname : name, true); if (lump != -1 && Wads.GetLumpFile(lump) >= folderfile) { @@ -1003,7 +1003,7 @@ FFont *V_GetFont(const char *name) return new FFont(name, nullptr, path, HU_FONTSTART, HU_FONTSIZE, 1, -1); } } - return nullptr; + return font; } //========================================================================== @@ -1073,7 +1073,9 @@ FFont::FFont (const char *name, const char *nametemplate, const char *filetempla { TArray folderdata; FStringf path("fonts/%s/", filetemplate); - if (Wads.GetLumpsInFolder(path, folderdata)) + // 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. + if (Wads.GetLumpsInFolder(path, folderdata, nametemplate == nullptr)) { // all valid lumps must be named with a hex number that represents its Unicode character index. for (auto &entry : folderdata) @@ -2962,20 +2964,14 @@ void V_InitFonts() V_InitCustomFonts (); // load the heads-up font - if (!(SmallFont = V_GetFont("SmallFont"))) + if (!(SmallFont = V_GetFont("SmallFont", "SMALLFNT"))) { - int i; - - if ((i = Wads.CheckNumForName("SMALLFNT")) >= 0) - { - SmallFont = new FSingleLumpFont("SmallFont", i); - } - else if (Wads.CheckNumForName ("FONTA_S") >= 0) + if (Wads.CheckNumForName ("FONTA_S") >= 0) { SmallFont = new FFont ("SmallFont", "FONTA%02u", "defsmallfont", HU_FONTSTART, HU_FONTSIZE, 1, -1); SmallFont->SetCursor('['); } - else + else if (Wads.CheckNumForName ("STCFN033", ns_graphics) >= 0) { SmallFont = new FFont ("SmallFont", "STCFN%.3d", "defsmallfont", HU_FONTSTART, HU_FONTSIZE, HU_FONTSTART, -1); } @@ -2986,33 +2982,17 @@ void V_InitFonts() { SmallFont2 = new FFont ("SmallFont2", "STBFN%.3d", "defsmallfont2", HU_FONTSTART, HU_FONTSIZE, HU_FONTSTART, -1); } - else - { - SmallFont2 = SmallFont; - } } if (!(BigFont = V_GetFont("BigFont"))) { - const char *bigfontname = (gameinfo.gametype & GAME_DoomChex)? "DBIGFONT" : (gameinfo.gametype == GAME_Strife)? "SBIGFONT" : "HBIGFONT"; - try + if (gameinfo.gametype & GAME_Raven) { - BigFont = new FSingleLumpFont ("BigFont", Wads.CheckNumForName(bigfontname)); - } - catch (CRecoverableError &err) - { - BigFont = new FFont ("BigFont", (gameinfo.gametype & GAME_Raven)? "FONTB%02u" : nullptr, "defbigfont", HU_FONTSTART, HU_FONTSIZE, 1, -1); + BigFont = new FFont ("BigFont", "FONTB%02u", "defbigfont", HU_FONTSTART, HU_FONTSIZE, 1, -1); } } - if (!(ConFont = V_GetFont("ConsoleFont"))) + if (!(ConFont = V_GetFont("ConsoleFont", "CONFONT"))) { - try - { - ConFont = new FSingleLumpFont ("ConsoleFont", Wads.GetNumForName ("CONFONT")); - } - catch (CRecoverableError &err) - { - ConFont = new FFont ("ConsoleFont", nullptr, "defbigfont", HU_FONTSTART, HU_FONTSIZE, 1, -1); - } + ConFont = SmallFont; } if (!(IntermissionFont = FFont::FindFont("IntermissionFont"))) { @@ -3025,6 +3005,25 @@ void V_InitFonts() 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() diff --git a/src/v_font.h b/src/v_font.h index d67b1d8994..de2482d99e 100644 --- a/src/v_font.h +++ b/src/v_font.h @@ -150,7 +150,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/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/sbigfont.lmp b/wadsrc/static/sbigfont.lmp deleted file mode 100644 index 6502551e3bd6539a67667feed0a7fc97675b52ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6253 zcmb7|NslDO6~`m8x~jTnx@RVZ^I(G|q_I<0S-uzqC>eGL_RJm-n-FLukPr+zV&C`e z$bqv@{t*5K_Q|s3FTla}iEX;4yDBr%zyFJ@o<(B|)SZ?hH?_ZsjZXNo$+s!bxqo9fb~C=t+yPs8*d1d1A-Ca<@D{xz_8f6J zqd8-T?b{K?5AhtabqAO;f%;K*%sF@X@ZqCJk6wQH4ZFt+(BF+wHgCe#aem z+#eume*5ir-g)QUci(;Q zz4zXK|NRd>_~642Km6#Uk3RnR<4->MPKL7mlFTVKV%P+tD>Z`B5{`%`b zpFH^|xA1Nj^WMiiE4+_IQF>pL<=lIIDt@aFysu)|^L^;+-j70EH>`5IzITpwdJ6hJ z=cR{c0WF^BCcgBJr*l2id;b^LyN($hBkP*t{CrOP0Nc^7D!xVE|5i`uCv%wKzbiZM z=T(HA`4T>8RH5@bJblAdJ&%X6>4c~xeP9!#i$(OmdTva)V`%^!oA z_gM`?>Z<2XL9_EM3$q{=*G+Gp6;UcJT-h=M6~@x}r5no@r8VXZARA~~%pwEi&f zrmjPkv$NFI`EjV&)JMKfwLAOOT{EqlS{-W^RV|zD7;6bIo5OB;8A!4LApgKdt!HI7 z>tRfw?EJ+tkY)-XGK;-nNxcXYT{uu{H}+--IT1o6#6k;!m|tw`i`>?iMr|O2Ihhc8 z@9K`RYA@N)H zcc^a&=)!7_o0(OvcTS80n>c4g1{$Nlq#gWv01~KiW9g-9b&!4*E)2y|0Q&VtZ1UL z#7xs+Uo%fJl3ikH<^gQ#3EUbC>06kohlP2yJ_VlkEIzjxU;6RDQTYpltZ^vlLP{LV zs@p5(dU+nq_09GL>2*XQ45Gj_@rj)Ls3H)8Ek4F@>U>%mCKYe8))LKK%Dxs)Ehx%| z6%?g3`Ih?8uZunPtJWN75k^T!g;~tI=83lE-myuRi(7iP9+`3CXf}#q;1nv9h=c}_ zi$VIYss#qg(A+6+#)u6z#WAz3#A^@7L_sLY+MVb@DZ|-B>yV6mmI{{`I}&}RyFKWf z(V`F|y8N20hvWd=}u&Z@xJneIO~l2<)CFGE}~yUBdjks zl4fixZGb0ZbWjlme~^_F-Zy-ZHcs=ouf}xqd06_N(p|I3OJwLUcyuM%Dv6}GZpeAGHSotOcsN<|sLy7pDR+_~a(OJaz1JK?o4sA2adQZF`)}Pf1HZ}$bv@|Ot zF=WPJL-0rGS<_VeZ*f}Fmo?Z?^h6w!G0^3kWg%fOVo{Nli50;W{MLtv)pCxYH7t!` zteL_K9te%rLRf8YIf_zhM;*7L44xIS>gRpARuFK&$F!K?fGltQW(8;jlT3LX)U4r< zSs5ELnr-9-rM_CHLn)J$z{Ap(*q}!;j|7u7myzGvW<*xE>SBlCLKOynUe4zRA5|Fg z^(qTxMhOxGSOz4Z;DCIjY^achX!Z3{K1vM{nQ0wjTgWtE~T?;x*gNiXNskmtZdT7Sj z^?yqCgGYyj441^}-~p%%Lb>@4AedK6Y0QkK&?lq)TcL9$5hX!s68Wn50ddBOWLFYs zp@*$1Ae8x|190wxRxeUl>9sUcI>_Ll7zn0!IT{?Shc^<#F^|76gA2dm$r z|B=$^X}>N5p!eEfHj!TFEsSS56w##tL(N!jkk@<7dh$3k&!{$USM@B9Q)-hY!5aqe za~#Av1hrOWr|Qmg;SHAd;q5@s&xZG6|B!MqR+CwPGke%ZN~ID=;X#x)zTL5iU?8;~G|A;2RZ)Qkm5otYpZN zyNawtSJ_R*jm;D$;I(F22GZl!g7p{%2`xUD#CVatrAKK*nzZ)?v+~H7p;qpuMy9q$ z-Fc~a2&%V@@Y1i%av;*VOK}V8ICE3Mif&M(VI#JnU&ioj`t&kohm2edoGm=ag0$sP z2V_pcs0r4Ofnx~Mn$o&`_&ur*__0Jxc7{g7XLK-xN2vo{ScKHU)3A$X@ids7!7TbH z)>(o!sPOIJRbG@zG(m*#vWA%{mK2~WO5t&3CYb}AqykB?1uo&mEY*gwaFV8^LX+Z< z1wu}W6`N)yHbI1~Enq4$^@LTDx6ekiqUg#)^TJ@1(L-hPt{M~eydUilnkRU|46QCK zDbNwK>X3Np!0LG&MZW6CA@XHqy}R$^idbuCN^n*tk*6y!_sDwCIM|Q7zRa|_f+zdI zaXmCUq;C{7QtX;EA}6IN$y2ifGigL`nS9sAtRP>>8&~oIn6Pe~bS#1I z3!jxaNoN`aaqM9U900+G5_rcgL`vW-t)H5}(V-G}QuFPE@5w=U05vM7=>he2Mt0bKaw+~9&%Ak_(ly6nSf*Ihj zqXHpEw;p`4jG|>$zo71v^%m6k#v)PJynI2ZRmJZ(Nz1);lGufdWLJeA=|zz_GnX*c ztm8pc6!?qMO<(*@K&k@2s{~3(MhDU>9hHIjmO@~PkXn)=reaT{fJ)#;i@!ow1VXr} zC{?99tGelDl}>GImq}X^i~|69TPafaQTTIiN$n3*0c0GCiJ^qGd!8)E0T@hY4o%5Z zM>kk1Ae9-U?E%)VbeCT{zyr zlW48#YjH)FqX+~J($c&4qii`$q;A{w zvD7h8nY#DWlmc|YL;b5^%M+2FF43$i=~8{6j3IEhVF#Bo(5P-q8G`t+^_}MgLEPOS z+9QI6{fa8l4$eC4q)k&HovJQ@l5#XprCpyZ5J24`trFWF5^@38?n(P#0ox2QE?}abYewMx4i?xZiadB>?wOoFnUuvS$EJ vbQc*ogp&a#!c1%a(`A2kf5X9t`!W@;>F|Sxaayxnu1iepp^HVC=%4PtKO0?4 From 32f0e650fa8295d126b6bdd7f4390d0919da22be Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 12 Feb 2019 20:56:08 +0100 Subject: [PATCH 17/95] - added Doom and Strife BigFont characters. This isn't tested! --- wadsrc_extra/static/dbigfont.lmp | Bin 6671 -> 0 bytes .../filter/game-doomchex/fonts/bigfont/0021.lmp | Bin 0 -> 134 bytes .../filter/game-doomchex/fonts/bigfont/0022.lmp | Bin 0 -> 133 bytes .../filter/game-doomchex/fonts/bigfont/0023.lmp | Bin 0 -> 251 bytes .../filter/game-doomchex/fonts/bigfont/0024.lmp | Bin 0 -> 327 bytes .../filter/game-doomchex/fonts/bigfont/0025.lmp | Bin 0 -> 263 bytes .../filter/game-doomchex/fonts/bigfont/0027.lmp | Bin 0 -> 92 bytes .../filter/game-doomchex/fonts/bigfont/0028.lmp | Bin 0 -> 158 bytes .../filter/game-doomchex/fonts/bigfont/0029.lmp | Bin 0 -> 158 bytes .../filter/game-doomchex/fonts/bigfont/002A.lmp | Bin 0 -> 160 bytes .../filter/game-doomchex/fonts/bigfont/002B.lmp | Bin 0 -> 120 bytes .../filter/game-doomchex/fonts/bigfont/002C.lmp | Bin 0 -> 75 bytes .../filter/game-doomchex/fonts/bigfont/002D.lmp | Bin 0 -> 80 bytes .../filter/game-doomchex/fonts/bigfont/002E.lmp | Bin 0 -> 74 bytes .../filter/game-doomchex/fonts/bigfont/002F.lmp | Bin 0 -> 191 bytes .../filter/game-doomchex/fonts/bigfont/0030.lmp | Bin 0 -> 227 bytes .../filter/game-doomchex/fonts/bigfont/0031.lmp | Bin 0 -> 135 bytes .../filter/game-doomchex/fonts/bigfont/0032.lmp | Bin 0 -> 243 bytes .../filter/game-doomchex/fonts/bigfont/0033.lmp | Bin 0 -> 233 bytes .../filter/game-doomchex/fonts/bigfont/0034.lmp | Bin 0 -> 211 bytes .../filter/game-doomchex/fonts/bigfont/0035.lmp | Bin 0 -> 241 bytes .../filter/game-doomchex/fonts/bigfont/0036.lmp | Bin 0 -> 235 bytes .../filter/game-doomchex/fonts/bigfont/0037.lmp | Bin 0 -> 188 bytes .../filter/game-doomchex/fonts/bigfont/0038.lmp | Bin 0 -> 231 bytes .../filter/game-doomchex/fonts/bigfont/0039.lmp | Bin 0 -> 232 bytes .../filter/game-doomchex/fonts/bigfont/003A.lmp | Bin 0 -> 105 bytes .../filter/game-doomchex/fonts/bigfont/003B.lmp | Bin 0 -> 106 bytes .../filter/game-doomchex/fonts/bigfont/003C.lmp | Bin 0 -> 161 bytes .../filter/game-doomchex/fonts/bigfont/003D.lmp | Bin 0 -> 92 bytes .../filter/game-doomchex/fonts/bigfont/003E.lmp | Bin 0 -> 161 bytes .../filter/game-doomchex/fonts/bigfont/003F.lmp | Bin 0 -> 252 bytes .../filter/game-doomchex/fonts/bigfont/0041.lmp | Bin 0 -> 278 bytes .../filter/game-doomchex/fonts/bigfont/0042.lmp | Bin 0 -> 319 bytes .../filter/game-doomchex/fonts/bigfont/0043.lmp | Bin 0 -> 286 bytes .../filter/game-doomchex/fonts/bigfont/0044.lmp | Bin 0 -> 307 bytes .../filter/game-doomchex/fonts/bigfont/0045.lmp | Bin 0 -> 286 bytes .../filter/game-doomchex/fonts/bigfont/0046.lmp | Bin 0 -> 216 bytes .../filter/game-doomchex/fonts/bigfont/0047.lmp | Bin 0 -> 346 bytes .../filter/game-doomchex/fonts/bigfont/0048.lmp | Bin 0 -> 299 bytes .../filter/game-doomchex/fonts/bigfont/0049.lmp | Bin 0 -> 134 bytes .../filter/game-doomchex/fonts/bigfont/004A.lmp | Bin 0 -> 194 bytes .../filter/game-doomchex/fonts/bigfont/004B.lmp | Bin 0 -> 318 bytes .../filter/game-doomchex/fonts/bigfont/004C.lmp | Bin 0 -> 194 bytes .../filter/game-doomchex/fonts/bigfont/004D.lmp | Bin 0 -> 316 bytes .../filter/game-doomchex/fonts/bigfont/004E.lmp | Bin 0 -> 316 bytes .../filter/game-doomchex/fonts/bigfont/004F.lmp | Bin 0 -> 333 bytes .../filter/game-doomchex/fonts/bigfont/0050.lmp | Bin 0 -> 264 bytes .../filter/game-doomchex/fonts/bigfont/0051.lmp | Bin 0 -> 346 bytes .../filter/game-doomchex/fonts/bigfont/0052.lmp | Bin 0 -> 310 bytes .../filter/game-doomchex/fonts/bigfont/0053.lmp | Bin 0 -> 327 bytes .../filter/game-doomchex/fonts/bigfont/0054.lmp | Bin 0 -> 212 bytes .../filter/game-doomchex/fonts/bigfont/0055.lmp | Bin 0 -> 296 bytes .../filter/game-doomchex/fonts/bigfont/0056.lmp | Bin 0 -> 278 bytes .../filter/game-doomchex/fonts/bigfont/0057.lmp | Bin 0 -> 308 bytes .../filter/game-doomchex/fonts/bigfont/0058.lmp | Bin 0 -> 290 bytes .../filter/game-doomchex/fonts/bigfont/0059.lmp | Bin 0 -> 262 bytes .../filter/game-doomchex/fonts/bigfont/005A.lmp | Bin 0 -> 366 bytes .../filter/game-doomchex/fonts/bigfont/005B.lmp | Bin 0 -> 218 bytes .../filter/game-doomchex/fonts/bigfont/005C.lmp | Bin 0 -> 191 bytes .../filter/game-doomchex/fonts/bigfont/005D.lmp | Bin 0 -> 218 bytes .../filter/game-doomchex/fonts/bigfont/005E.lmp | Bin 0 -> 183 bytes .../filter/game-doomchex/fonts/bigfont/005F.lmp | Bin 0 -> 80 bytes .../filter/game-doomchex/fonts/bigfont/0060.lmp | Bin 0 -> 92 bytes .../filter/game-strife/fonts/bigfont/0021.lmp | Bin 0 -> 205 bytes .../filter/game-strife/fonts/bigfont/0022.lmp | Bin 0 -> 217 bytes .../filter/game-strife/fonts/bigfont/0025.lmp | Bin 0 -> 346 bytes .../filter/game-strife/fonts/bigfont/0027.lmp | Bin 0 -> 120 bytes .../filter/game-strife/fonts/bigfont/002B.lmp | Bin 0 -> 146 bytes .../filter/game-strife/fonts/bigfont/002C.lmp | Bin 0 -> 117 bytes .../filter/game-strife/fonts/bigfont/002D.lmp | Bin 0 -> 130 bytes .../filter/game-strife/fonts/bigfont/002E.lmp | Bin 0 -> 101 bytes .../filter/game-strife/fonts/bigfont/002F.lmp | Bin 0 -> 231 bytes .../filter/game-strife/fonts/bigfont/0030.lmp | Bin 0 -> 414 bytes .../filter/game-strife/fonts/bigfont/0031.lmp | Bin 0 -> 198 bytes .../filter/game-strife/fonts/bigfont/0032.lmp | Bin 0 -> 397 bytes .../filter/game-strife/fonts/bigfont/0033.lmp | Bin 0 -> 334 bytes .../filter/game-strife/fonts/bigfont/0034.lmp | Bin 0 -> 361 bytes .../filter/game-strife/fonts/bigfont/0035.lmp | Bin 0 -> 366 bytes .../filter/game-strife/fonts/bigfont/0036.lmp | Bin 0 -> 385 bytes .../filter/game-strife/fonts/bigfont/0037.lmp | Bin 0 -> 322 bytes .../filter/game-strife/fonts/bigfont/0038.lmp | Bin 0 -> 372 bytes .../filter/game-strife/fonts/bigfont/0039.lmp | Bin 0 -> 352 bytes .../filter/game-strife/fonts/bigfont/003A.lmp | Bin 0 -> 159 bytes .../filter/game-strife/fonts/bigfont/003B.lmp | Bin 0 -> 175 bytes .../filter/game-strife/fonts/bigfont/0041.lmp | Bin 0 -> 421 bytes .../filter/game-strife/fonts/bigfont/0042.lmp | Bin 0 -> 377 bytes .../filter/game-strife/fonts/bigfont/0043.lmp | Bin 0 -> 309 bytes .../filter/game-strife/fonts/bigfont/0044.lmp | Bin 0 -> 415 bytes .../filter/game-strife/fonts/bigfont/0045.lmp | Bin 0 -> 304 bytes .../filter/game-strife/fonts/bigfont/0046.lmp | Bin 0 -> 306 bytes .../filter/game-strife/fonts/bigfont/0047.lmp | Bin 0 -> 415 bytes .../filter/game-strife/fonts/bigfont/0048.lmp | Bin 0 -> 372 bytes .../filter/game-strife/fonts/bigfont/0049.lmp | Bin 0 -> 176 bytes .../filter/game-strife/fonts/bigfont/004A.lmp | Bin 0 -> 223 bytes .../filter/game-strife/fonts/bigfont/004B.lmp | Bin 0 -> 368 bytes .../filter/game-strife/fonts/bigfont/004C.lmp | Bin 0 -> 246 bytes .../filter/game-strife/fonts/bigfont/004D.lmp | Bin 0 -> 487 bytes .../filter/game-strife/fonts/bigfont/004E.lmp | Bin 0 -> 389 bytes .../filter/game-strife/fonts/bigfont/004F.lmp | Bin 0 -> 414 bytes .../filter/game-strife/fonts/bigfont/0050.lmp | Bin 0 -> 405 bytes .../filter/game-strife/fonts/bigfont/0051.lmp | Bin 0 -> 405 bytes .../filter/game-strife/fonts/bigfont/0052.lmp | Bin 0 -> 380 bytes .../filter/game-strife/fonts/bigfont/0053.lmp | Bin 0 -> 355 bytes .../filter/game-strife/fonts/bigfont/0054.lmp | Bin 0 -> 342 bytes .../filter/game-strife/fonts/bigfont/0055.lmp | Bin 0 -> 343 bytes .../filter/game-strife/fonts/bigfont/0056.lmp | Bin 0 -> 329 bytes .../filter/game-strife/fonts/bigfont/0057.lmp | Bin 0 -> 472 bytes .../filter/game-strife/fonts/bigfont/0058.lmp | Bin 0 -> 436 bytes .../filter/game-strife/fonts/bigfont/0059.lmp | Bin 0 -> 387 bytes .../filter/game-strife/fonts/bigfont/005A.lmp | Bin 0 -> 434 bytes wadsrc_extra/static/sbigfont.lmp | Bin 7452 -> 0 bytes 111 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 wadsrc_extra/static/dbigfont.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0021.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0022.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0023.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0024.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0025.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0027.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0028.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0029.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002D.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0030.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0031.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0032.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0033.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0034.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0035.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0036.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0037.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0038.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0039.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003D.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0041.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0042.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0043.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0044.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0045.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0046.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0047.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0048.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0049.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004D.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0050.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0051.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0052.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0053.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0054.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0055.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0056.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0057.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0058.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0059.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005D.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0060.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0021.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0022.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0025.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0027.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/002B.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/002C.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/002D.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/002E.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/002F.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0030.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0031.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0032.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0033.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0034.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0035.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0036.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0037.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0038.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0039.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/003A.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/003B.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0041.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0042.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0043.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0044.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0045.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0046.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0047.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0048.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0049.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/004A.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/004B.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/004C.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/004D.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/004E.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/004F.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0050.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0051.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0052.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0053.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0054.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0055.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0056.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0057.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0058.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0059.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/005A.lmp delete mode 100644 wadsrc_extra/static/sbigfont.lmp diff --git a/wadsrc_extra/static/dbigfont.lmp b/wadsrc_extra/static/dbigfont.lmp deleted file mode 100644 index b44080a5a8107ae41b3925545b32d2096d25f0a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6671 zcmcJUJ&f$OcE?H1&WFV1irgWkSxVy<$4*|lAPJBr=?uh$fw*+xCV(gb@)Iut4L@O=EwpSpkd z`rrTMwfdufQ0fIe&pWkIRyo!1Q>s!s{%U@k^5^K=^84lATCEwm;djG34SzS~cda~k zna`J>SAm{TMo6Fh-IQz1YVwmgUQ&Pi$}6wD`s%B%z4qGcufP7r8*jY%=9_Q5_13dz z&)$Cf?RVaJ=iPVTeeb>Z-hco74?g(d!w*0F=%bH5{`lihKKbO+Pe1+av(G;N{PQoq z_~Oeizx?W}ufG2J>uu!LQH`!;~XNFNli2-^G|BNyfdnusXDEU@64!b z<1+I8P)2QBr!^g;@%x>-P3flTQZ^bT!en%FI2nB%k*>SRSbex{_NnU*ZOWt3A<>cO zm|3CAtl!+R!p>NWT-V5=^<<1zX!CosQYPlHf1!(AaI&|q^YvlhSi4za4@c9q-aeVF zYwx^nZ>o{Ge}(pKxI6ZJ*F|Pl#_sGcH+Hx4zGmvt)OQG#zh+K7nm@hsR@dHHcGeHW zU4OSvd*9T?*xK3M^|f`}Gz!f`%cRfhtXKOs>q*_}ln+{0)-kV6``l;-%xbNZ+c)}D z1h-v;wY>;-vtFJwjR;#kG<3<-w@MHDMr17uV6ui)R$TEVACu>v?^4CBZet@hX~F*Nj|SGjz@rqo!M5i%`YeL>T?GxsAo#`c|C94D?%;Fy4!UbqttUnaHP7_RK`6ib1eZWU0}7r~XaGsB05DNeyF31)eMQ8}+2;R_EbK|HpqD zL|QFVs|PjeM|D*k|0Mnur!S8FKYM(=cwF8p?tWrEarGl}KM?v)*wdIiOvl?+QZ^h~ zLNFvOA6gRauL5otQTkdSARI(=sfhR&_x>nWLBtj#Ol~Gn+MEx`xh zB9S$#V2;B;-!XI@I)vDf?SIad{bMoIQ6}foy4<>49(I|OMhP#@Kbr^U!b^ENZu=yg zaCUMlpJK$<(eUJC=Fl^d$=xvI7!%9I=pC8J!_NCNQxM^vH&%U&{dlxE)VtaS#@Od& zjT@8t{&*ZjCBxfiK%4QE^Mu4?RvSDws*O2je~}2wA^|j;%A!rRCKNl6Db4j(aHh6( zJ#C0I*~FRcplW`Rv@m^+qNRXmpNLkJDF5rEB04mU%m|K&0#NpuWA7gHmTE{rrDEQtE#nXRah^d-6a4Y&5?EVMfd;WouH$OUa^i zNx1?~1sKX*iWQK$0F?+yid7M$e3dy!n=^C%hS*(e)3$ja%J)9?Pv*JcB)wPW06GXZ zH+g>%qHD_&dwUa@=xDs%QeJ^FyDb$Zxb04$3zzpJ@sChDvsAxTv3_;hs z+990idE)w{X0r*g@0sGvgm49K>l8#e%Uk3%#f2#;)y78v`p-~F3WlMKS>PZ@FHPW& zp*6h%aW-`pGU7rIJPCbX<_j_(R+RZ_v(P&4rOsa!dUrxP8DS$0{HPc7?E3*Qp_mev z)#&D|JBKlBPMQ1GhCD!L!q}@}>JKSnW)m==XD2?9V$8Z`%w)CT`S<3Yt6urBpNFdNuoy#X5_R?)M=Y?V z2eWob$jqtOHT9yqPr$agE%icV1fDO=Otb7rtj?-3m_1SxySA6|iWNGH0O1W{FcN(9 zv%4xwi#9(P;pnl0< zW`;o$1exkCWm{5>O*$E|<|!M1q9F8(U@cL6!kj1eDw#NoM}6wX{(v!AQQTZr;`Fjz zlAyY0j2QX*l3=VdLN=}}q!7uPI1H3go8Xetgn-LLnIJfum)+8;LS2!>eO`JAg-wYC z^eK7#+=z#n)styRmR!ODc*rll_Fw}|qMhEF7!cP>^K3RGnlvVl70B?I%9|lfc67Va zkkmetrk(USoK%*$G$XkyEBc(vitKv<1vE1&`6poXWNt&ooX{^eiZ|H3!FRKHQA#3m zEnbJ($h91Hd_r5cVDXy()EWChmjr><o!2H58+t%XjtqYyC?`=-cu{u&3BWJTC&4xELq;8t*68b`A)YWrg?!EF%t;^Thxu$DCpXW^%F;)Dr^++5}~` zc1v53f@F0RK=B4A<`PO0C+q|cO=zJVBo?J{;p7VjQofjGF^Xs_Q37BLgJjmV@khxl z53iMg{k4flj>}jeNd$`@j|FxBnsRP4;aIZb6yG2o!%^T6oT9U%62(g!&8!@(`=y;E zrYRDab}em?F~i7vG_RM#07EFyg2QtDl4|jQX~8O&&%;Vqom4XQ05oGb%Rv#W6t11> zGkXkPLcw+bw}g}{^_G2Ink9e8{7aJwWY;)U24hfxKN34JRV15a<~sCg8a5e!cq!tu znca@GBgoMDgnA3U{UN5Y5~e}b%P&byFC2qYOraTo>(GPeg=V0+y8aKiOqcj!OA6%S^z}AGA&VgKaRMs40hRDf_UUp+7?@N{s>a z{p8lvP$K5uaMsK5-fWAfFwl7b1+ttKaSw%+Ll~JO&=R^NCw5C768I8x_{8FWiLM`; z1eK5{IlGlYMg5g?GDowYJ{8^k;!{xtTiE^hsR)e#BB+IUg7gd&(|L(~d{pu0DAPnB z+miz%;BjyMSiTDpPt<*sr$S3Vsxp+SP66gqhFIeFMteBv)L(Oot?L*$&|>nlS*2ch zl@wIW5eY7Yf!O_}&=bDpiR8KnFo_ zoTMo)Vg7l`Q?0>^rR>o=RC2KYwGm!f}#3gB} ziYVGtlp+*-b_wu6ek2RQ$x>%1$2{h_r1XR^#Vy+K zIG0%@S{&pD7IKEb6D$RRShJEy>VO{)N8g%`vO}SHM8x(Ll=%Ub_*_@)w~Bp2_!}UQ zumYQ9P5D(D0X%6h-%9I>)unCv;Q8P{@}Nzi$oVO})?sJqhvRiY03VQ}jlU>jWHTg{ z;woX=XAFa(OWUT5{;Xz&bQj}R?Cy$B5F0kV)EfENAXfZ!?ickWcqICwXp`V!0%nwP zj%h3{xULO+eGB@vV~-btEMMfHb*NrAv1nZQun2_-i-5P6!>3T*6NIUdIGN=_dYQ%g09u}iiF-`j z;a<|XQ+QlM6|?T~%?<>_0fqW?*pXCScpo3Jh5qp1@3gPOrni&{G{>N8f9Y| zlWR+M#F9jAl_D{da1o%+55n9@a`ExMdcva?Xd)3rI0?oW}u9epRPsO#lD@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4c5e89e5cd853ace2014bc33d330b3e3c4c5610f GIT binary patch literal 263 zcmXYr%?ScA6oj+Cx}Y6dfhP|*$8(S-qfu!X&Q_ihXJU=6n5Db8dQ_>$oxyf<63 zF*-Z4Cj+^WJDJIYJjsi^$%lN&j}#?%x=J^qsR4He)_e~`7N-EL8Vc8EV@IHEf!=#h zwajRe2p5W4F?hvFak@^7rQ#SAixfwG=+gdZB%GtrYE_7)0j%YG8FfhQj#;QeG)wI~ F;}4#7PI>?U literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..334d9fb7871d0f1bfdc1d6ed3e16753432bfb367 GIT binary patch literal 92 zcmd;N;9&p(9U#^PVm%->1!8+3_5|V}AdUj!XdwRopP4BW2>vs$f~a^XD=-|)V#&-5 Pj0OoYgCsNm|NjpFeEt^i literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..abbf0207feecb78c20d1e471ae6081ffdfba101e GIT binary patch literal 158 zcmXAh(G7zz3`A4NN2nO2zg?gk^aBtiLb1{o@!^xYLRaX>a0W}yr#qhJS(Elg@@$ Q?J^Kd#TvERwV`mf9bo@0$N&HU literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..071c23b82b73e9e7ca0c17b8c2d2b384f1214ca4 GIT binary patch literal 158 zcmXZU!41MN3s;!UqqdNnpWi>MezO^o8tL{5% OpLyMxU`f1=Hhcgs;4W1=9Yn=sWoBi8*(q5W zS+P*@n8c){D43e?@JP7&@bGXLJ1`_P49EfNWyuQ641=<>GFh^K;6KQoET9+wBDpQy literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..121e96def0a4e39eb5960b450eb1702129605a6b GIT binary patch literal 120 zcmd;J;9&p(4InlEVhbR40pb84jsfBfAT9u6R_06)_z$9!vaMzSc~I*gq1jCaaA~I T!HF>zdb7UQEyt&G!SebKIubXg literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b9d9cda5ee8b08b9ed51f2b599fc81d4f6fd2be4 GIT binary patch literal 227 zcmY+8(Fwya3`CvAAEC`ST_76-V8XheId~Qv=aVj> z4X!KbKo3SRg9SXm6THA1e88!(zt-w(Hf&O}HMC|a6XlHOz8gIuAaYC7ZbU>~>Gvg? kxzS+e(h-NM)BYyxtDh@cMN^- z8sG#923NSj9Ukz67rY@vtJQVeX|{&mOcvUdWhzZbXL>C~d8m%aC2LW={0SrW3Fpr- p;)-(wQHIQ-}xPmLVf-AT}H|Q?yy(aeHOUTDvPOf#9 zGr5pE8Oe*h$%lN&k4$7HuEv(8+=~hS08I1)u!);w;dc>AL#@#QH5-=PD8l3}u6%Ud g`&1^K#3Y*H@E5%VRgGCxN8l+TnBw5j!JGi|MRP@ZX@+aIW_Np%1K literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6ca4a42c1808da78b43bf1028d9b42d2e5fe102c GIT binary patch literal 235 zcmX|*;RymU427%IL%bWu1>8W6kZ_c8^zZxW3a;P^uHXvp;4;0J!#40i`sI;y3{&vB zk{h{`LLTHvUgS+a!xBzKU5wQf+Fag<2&6eDSlu~GtIMaON0I;l literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5dd89f0853960b6e7dacb2ca7615a9a05f37e5f0 GIT binary patch literal 188 zcmXxc!3lsc3n!= LY4^6P%X*d%_8~WL literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6001da43b28bb21c8360d9e3060174f3adac822d GIT binary patch literal 231 zcmZ9G-3bCg420Jo5cJBi0~6ANivvo71;P>`0w5YJ5EKs) K0MY+Z^aB7pD;r?| literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5123a31637d47549858087bf75b78eac6b6e1486 GIT binary patch literal 106 zcmZQ&;9&p(86egKVk;o_2I3eXW@gF)0#2q(Ao$P3l9d&ioR!7Fl9?F+69`L$2!tj= URRqOD1OnrM0#NS&~wSb18@8W*mdm5%M?N)JPLc NkLPFu|B=TE^$%5*Erb97 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..490e93009ee697c82dd34d7e6074de88c97c6397 GIT binary patch literal 92 zcmZQ$;9&p(1t8V}ViO>?17Zgz9U)=UWa4`PL7MrLM0Sus#nP-Zxk6_6PSW@Tl8 HwfqMF{n;2k literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..457a38e95cf4b303ee19d1de2037486b98b372ca GIT binary patch literal 161 zcmXBLO%8%E5CvdL`LU6scmuBBiWn6TYSD(g*?0mE;M%2!t#5RaFEj6@by<_??5L$Z zd3w;3Ui79984DfvU&$1}VFEVX^A$*@1iFq*&0~zKR$JiIp94m}F3h=O_QNH_85Aq~0@+KehC1!>^eG(x8S=6T_DxhwMHO`|Tv=Q<653I6v z=+JZ}XaKuY?8gne-N5r!K5E%0hkLUCoH`k{G^!#JQk5op=OukLnbW8yIV~^$0I{x4 A;s5{u literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b46cd6825aa8334fda43bb5169dc4e76bf299d70 GIT binary patch literal 278 zcmYL@!41MN3`J9_suU`*6h|(tR1(RNqJ&d!Y`_Ezzyd753ar2itiZ86he|kl(f{9$ zm7VF0)*cRUgal`}z!h$AhX*|21#kF3TN%^US!-?^Ztqb|i;7}Z*PUu_he2?wO)+*F zBk^3(Ox{`db3F4-iZ<(}HGcupnpb`R literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6eeb6c20dda6271ba931b75b347ccbb5a7f74bef GIT binary patch literal 319 zcmY+9;RymU427%y5ad8ta07>MfHqK4NTJ*bLMCtpS8xSaa0ORz1y`sqcURQFN8#&B z;B8&!Y>ps;Gq`{&xPd!(fG2o?H>hB@aBdF{z;*gJ)kG?)g2{vGC6+`6owWDyvWpyJ*ucm=QE6}*C1=oP$z5Z|Ohs2^Tu`e*)- zwe(`zz!na0ge%r_LCk#UxuX+rin ySHq{19rDu#S3Sv&x-StLSB=421jCxy#tTF~8GxTr6)rezIBK8P7YRX@T`d0-2 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0d982445c42073eeae1431f0b0d1d75562239330 GIT binary patch literal 307 zcmZvW(Fp=E5JdO%J`Opw0voUn3owBtfh>f}hp-jcf-TsBE!cuB*n%y@+2c;{!+}R; zhh(xl>dABj49?&JuHXjl-~pcC1>T^7Z9}vN2SB~*T7Rk*NC8}o;L92R#>87*Nzrdl)Ztz^n5f1bBmmvm-+1p~x20O4brD-fNviAw= Q*Hwp?C1-f8Em}?W1Nq`#GXMYp literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4978d853cb8bf6130dd7100fa7dd74ae819f303a GIT binary patch literal 286 zcmY+9!3n}Z5JfkVgGjU{uO73o&O!o13?Alg3$|bjwqOgkkQQt~h;Nf@z=5~J{F(n@ z53X{lj&OoAT;T?Hc)$~0@P+|C@P&QhTv^&w<7P|mR6E*O?96(NF-p@fV1>2{Gb3C2HQwb0TT`Q6b@CGo#hWmA^ad@7La_h< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a20ccd8b848c74ed8740327281500a8d38532a2d GIT binary patch literal 346 zcmY+8%?ZLl5Joo=Q9=$@U=bD}9(M&vAcMJTkz`Dt1Z}qEqIHwi8(m%!tRin zWEYm;IsgJEa0VA}1vhX95AXyp@CF~S-Gs0QVJUyAZfJIyS)Qh5kg2M0Vk@N^*j0pO z7@}q#v*Rz~t(<#zo##>rOB+_txYLI5fe6>t>ILnL_ti6gW90-9MIA<>)fHt#@LzF_ JNU!T>{Q`?(U9|uJ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..df39d837b0842a54015d5d55b1a3bc9742ba84f2 GIT binary patch literal 134 zcmZQ$;9&p(1t2yAVkaOD2I3STE(Kx+o=g<*A0!YR9}^!R9}^Rkn3)L{2#QZkOiYT8 d4v&Wk0OjK2lj7kjVv;~Ak`m)#T98fs4*+P>DBA!4 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..20867d6c301e8f12edc6c753c90d2638b8cca800 GIT binary patch literal 194 zcmX|(F$%*l3`IR;Xh@FJwQJXsLO>9MkTPlQ6>^0fAxG%_+Goc^;)(x1_8-!i%G}`r zPk4cV!3Q?j;eapPx~TIjLNua^cWz?7k|NT0KIZDQv|w>}Q+M?iOk$>)t-%m6t9i~M Qr8MDftzT%w_g5wE549vZvH$=8 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..878e0a12e56b60a46b0b012c792204f52f1ccc79 GIT binary patch literal 318 zcmY+8!41MN3`NrxS_(aIWdtT*1&&Q5D?yG_0VlHpE3g79aAp7|U<6iRfbtz$BrH8C z{y+Zq(lkbE3wGcH&fo&B;0EsC0iNIm-k{2iS%Ed!0Mp1{^(q7o+(nL|6G?&%&N@fl z$3bWvwHD<@!Bb#j4!;pi^+R-DOhs(6@(M4{q;pv<(h`yTrYutD$XUzdnn0cC=7S0d nY4w7#M0AWt)h5vPA{9JhJbF`z;Li+(PgA)bQ9})I=c(&Ixr<MFYnKG_C!C2-+zTjC%!-$ExQVm#E Piue}6w%Jp96Z>@CK_xqO literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f456db472815e9a07ca67be8677c506499048a75 GIT binary patch literal 316 zcmZ9H!3hFE3`J-4Am|=!z!L1k<2o=Tkif9Bh@=Bsumwx701L1H3$O%R@UZ@@E{cH% z;b;EOWEtw literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5b8d9e51109342adfccf8bc74761640e8381cfac GIT binary patch literal 316 zcmY+9!41MN3`NsYK!P4vfDzb(BaLL)QX^IA1$hHjU2}P&~*{&d)4G>)e{Me z2y-_Vm|2*-4^tr$lTaH%M8QTx^h=(b%5^^5-D33An6Jz?&FGgacw#@z%P%SS*$P3V bZ3WHqkJT*vGA(Hfd7nEh1!9=S6#pT=qRe16 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..72018c6c4e6fecb6740dd2544254bc753b620b16 GIT binary patch literal 333 zcmYk1u?+$-3`KM3iW9nqk`35^1t=*lks?RBNRdP3k_}ja6Nr;0uP%m_0avBRGM+ml|a=AajfnsdQVBY(2u} zR!)w{J3FH^qevn`Z*Vp>!4Wz|h^heB2~I=H#rzA^Lj_FKj&-C7?xLpJ!AplnuHX8A mCy@|!t-8lNr<6Fc3c5D7;+z?uFIP}VDAjPekQrW5*1Lago@Fio literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2cd8a4f6c529f5da3a47f3754dba8fcc6de33b59 GIT binary patch literal 264 zcmY+;(FwvZ5XSK+B0dyna)jm}B+x>*`gG5(;0mtb0xsYJF5m(#(D(RHTNMv}B=_Zx zcJCTj>i~}dC!BG?6*t`Rz!NWwC~%GaRjEOz$eML9n*x6{^POtXIS1LSZ6(C-L=8L% z=QPnKR%mJ!x8t=3;oNZfHN42Q$5==~;-^VTM7m{1V~E0^mDScvQ>xeXX8FP!CwNog literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..87ac1caa54ea5f3649d6bee57542b2e050f4eede GIT binary patch literal 346 zcmYk1!41MN3`NrlAq2fJ02?p@8^EEB6s1xtMGmJN*?<*TffZPR71)6tIE3d=5SCtD z|2V(DYttC512~9qf-_v;3OBgJ1D^1LrZQ#&TiC%KX0uc(*9*Fg<4DWZGNsr#s*BUu zTJN3h21e7Q6uf7*w_TV7>)A}n`y$}l;GUu63mjpm2gST;K{fxWfPsc)|-7jdMHLgKO=l#vaDXNd3^WkZg7`*o1y^tdS8xSaa0NH0??SH!KXSRe zyO-OW)<~R5AUAR+5Aq~0@+KehB|l=VF$Z!aC$ie0#%?|*+W*eC<@>IKxvR)ESP6^e;0+;n?qaR)so5ogs<1T+~GrVH}63h5pLV c(R%r5UIQiNoT@E%C``7pRVmeH-n7w;|Ks##PXGV_ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bec0000cc76fc6639d7a6cd811d9a2372b414469 GIT binary patch literal 212 zcmd;K;9&p(3m|p`VlN;L2I3STE(PK?Af67yD}Z<>5FY~K(?HC?k_iU?L5!HB%uFyN z5X|7o%nXQtNQ21#3}At9Fo=kU2?PWN1pskS3``&>C?Y&O6d@285gic|6B7;B5(v}_ Q14z~Z9S{z407&{j0Fcr@?f?J) literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..70077961d90ee5f83bd9884c96748fc0e3ecc813 GIT binary patch literal 296 zcmZ9HJqiLb5QRsuSTu#b7qWDVU?2m-BqB`j5xjy|u(h?d-79znk07isG0Nh=2YGLP zvm!?&Ho${DID!*6gA2HV8@Pi3JirsYfSVDm0d@9^krrlAQ_4BP9BFCRr%xOvS`l2d zGm``%95^?lP4m6N=;mhI@1w`i>i9COr2Jo#va~6zB3LZ3R^SdVku@oYQc&*NL1S^v Otv9<L52_IpuD0ZI{(|jvs5>x ObvtPj?ChGFe(?cdoK&R% literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d357b40535e2524155127f8d2ca5e538b92e9389 GIT binary patch literal 308 zcmY+9;RymU427#62zo#K;|T8J-xf*>354sxNj7i=S8xCaZ~zBz00(dd2RL7fiWm6c zHGMBlH?DP7dyv2Z9Ki{k!3A8w4cx&4Ji!YzGv~Ho2i!{kYIJMWOhimMcdDanReef{ zVo0fc8VLr`(_1JU;`Fl0XAR-R$zp3ZYu7J9&^Nd675CGv{{16|h)O+u#;J+W{r_T7bbVfu^Cd;-L=S zqzdpMB(7b@$|#6eO??+rq>ya@3NiJGw}!j~RO2c2-$bKY#V&dgRX$`ocMc*yojIL7 ZWu8qJt>tD%CWo{tRLruBmW#hHeE_MfSUCUy literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a0fe436bc5a51359b45c0c25d955def77c710a27 GIT binary patch literal 262 zcmXwz%MAiC3`7IVM|=*H#W7wfvQbuwb~*V%0hB-oTLBf&0VPlXcg|c{#))F-Ni(v? z_QCC))e(4b0%vdmS8xL(xPu3Hf){v$5BP!~aE)3`ZlM|m6HAEHn_8)Qj#;iDDTwLW zPPJ``x*XJLzJ=!)Q$JX~*YqA^70qUuc$fPTVXKAz=`kV`#CAiJotoGHi@74T#*L u0}xcNcx`zQ&gPKpN*yaWURTOWxT?gcQk7R>^{!`-X2r|2i2e>0dd45I(ry9( literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c70dd0a6b66a0bca3b5576a17c203f7e0275d883 GIT binary patch literal 218 zcmd;L;9&p(10Z$;;vgVS2I3MRZUy3LK)f7?cL4E8AZFmnL;?Rn0x^jo5Fa0($jl5D z2#t@4iHVK~kBHCAga`onG11Wx(J+DNnD}^*w)iBdmWV`%xgh#K150LRD3HMcrNIJ$ TK)oOV5RF{`WCBP92>b^CwunJ4 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..46366390db76392f0f0109e4fd33ac11306704c0 GIT binary patch literal 191 zcmXZVu?oU46h`6HHm!obk)x|niV%W?l7bd4xVyW%yLWc=@$~$`3kN6u1 VZDG=9oj2=aKx;1bXR!I7{sA!2H>Lmp literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1edf456b6dc540b03e1b017ccba90da841acef1d GIT binary patch literal 218 zcmZvU!3lsc5Crq^A!0GMU>;AT23$|bjwqR9pH_@L9lZCn5b*^{J07ekN z3O2BV1DxOjH*k%Wv~OpMxR_C}i||?n`$zO<0TYIu9Yhk5SyiRnfbjE##2DoL;iu@C QkiL~gH8I~xJz3xU05)bq3jhEB literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..acbb1414a9667671c46f05c46fc279c5659857be GIT binary patch literal 183 zcmY+-KMz1a42R*vor!N`Gn%e(F%WxqyWMWK8ht}viN8&r^p~b-bCa2~3Y4f&qlaR^ zhzT17dq1_5|W!AdUj!XdwRopMg0O1pYIyWM&3NgBYwpMtD4w Pm6-`*F*AYH{QnOCdy5wF literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a9e3359f3978a798bbe1ba27b90dc2268b9ebf6f GIT binary patch literal 205 zcmZQ)5N7}Z6(F_(;t(Lt0pb=Qo)5%3fS8fH4;kE#V(a{$Fb>}HSzl;Z>EfOLR3jBHSYpo(DPm^$EQfh>esf@C?uNdUcC BPZ0nB literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f0493e20d56a98b652e17049e333f4633b0b98fa GIT binary patch literal 346 zcmZ9I$qm9V6a}+53u}(tsDisMC}9iYKmim%0|X~Q9DWZpK@ZeG6Lb*9Y*P5rSoYX{ zUJ_^I*qXuycCd#tT;K{fxWfY?*Kx)$ffTl&JfQ|IP2(#OV?_GC$dR!Zij-+ew-+#z zw_P{Ft@6BRt?b0?S$*_3Ft&1uwF&PNBUH7(Srrmh%^4Y!c$#Vgrt2As>kO6FMS)aS pX4sM&hgzHU`hfP)rxgFE3AMUvEmpjw&Tzlfz{iMu4h~;G@dR&war^)P literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c7ec832e8e8edab83598711cac9e9bbdfd169ed2 GIT binary patch literal 120 zcmZQ)5N7}Z6(H6JVjCd#1mZ9tP6FaQAZBFigM$AI9DRN5t*tFB&3%0kj;EKm4>AWL W!wysilxYE}04=#tS3t<+_bO7W`GYkL# literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..68679e25817bec3a86e7738f70469f7ab5c1e9ec GIT binary patch literal 117 zcmZQ)5N7}Z6(BYQVp|~g0^)EWP6py!Am(SX2Ld6cJ|Otd$8K-m)YJz=egAnm?Co3p e{F?lbI6y8)2B-=s17`EFf^>jH`I&*{0BHb?2VyTE4h7;kAm(SX2ZH~6EcW(IO+W@Oo4tLDpI;+RCR`;{ FCjc?17bO4y literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..578ccac29e426ffcaabbc9d9af50c2ee252546e5 GIT binary patch literal 231 zcmXZW%MF4+7)4>sIDoIXv>_sj%*M3^*nkZn4_Chp*nkbt00p>qX(f6tk>q6VmrOFO zqfMkQqk@ifqBC8nqB}k4Nj(kpqBnhLH8HdA(wSX37v8K6TJwZehETC*saaG0kqQT- qTM1|jB*elV)xd*phlHt+qXsx|+oBOXBec53<6W-h9g8y_f9?mgZ%mumj1~mKG43owKj6t<}rhr@0x(W8(($JUoG1AKxY*pOv?-uiYIg z02X242a33Xgj!mBe0}{us$gQRt$lsXP%&nXzP=7OphBP+FVMbbUq7%~W*{3R-qzR0 g$JW=^M2091ld-u1CWh=4z0M&*_ZU6uP literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ffb1555766c988734fde9bc7c6bf6144aa379769 GIT binary patch literal 397 zcmaiw%MHRX42DzDQeJAgAZB0-PJN~v5j!AO;E*)Q%>%FnLoftGFhlv%fM_WamOfef z{5DbJ2SmnbqD2TJg%I?T z3FLf2RLiQ`_3Ug4%lRK2qp|IwO3tNl9Xd`@->IVHKU_`2x-XaNyeK~opEF6Cz?`tUB00?~5PC*S*g zl6_h&l+=b8awI2mCKqxgH*zNr@+8BKQcJQTYclVGRqF^SOEz&&GLo42AR=N{RRI`} znj2fZwWi*t0p2DG=FJbv&M`nrExMPrau8f@E*=u$pdaI IHT|6R3;yeS2><{9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1545209239fe371100a70e6165a94b4608954475 GIT binary patch literal 361 zcmd;Q5N7}Z7a;Zn;#eTg2jV6mo(jY(fOt0$Uj*XkK>Qbog&7$bG=bP2h(m#xo3#%D z{$va)|M6|jc#sj zZLNKMFd=rZSs*L8*$|?FU^~GCL?Mv*p9Lriv=-Eq#6bEPZ`VO(0=@ps<^}ho_e}P`JqtL#)}CkQmTNpk7pU zZGDu9`84~Y*b6ex#|I|H2X=E?UtbGI4D4hqLTnHZ_w{iDSuM@YAa$%je}e!Il>QF@ DdlQOT literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..14ad06a25468e29b2e635d8474777b9b3bb58c08 GIT binary patch literal 385 zcmaiwyA8rH6h)25mk^L>G6X}=@rxZHYKqiI^oTN!od&%T7=j^Kf*}~eTqjrprQk_N z^1Ht8W6xN|Z0x`R9Ki)#!42HO13bYC3vEdH9O<;6^=YCMC;4N9*gC(9HKAe8 rr}F<=qfwi4H`t%F-L2&Ii}C6%wcCy&qT1fsB*Aj{40{}VU7>jc4`hvG literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..55a6cdc8e8ddc2b094aeef21a3afef87af6b294a GIT binary patch literal 322 zcmWe&5N7}Z4Qboc^DZOB!O5Jhz)?)3W!-* z`oQ2n3tL}bdwW}3Umt|&=8nqbV}&S0mgeCAiZwR@0g5he&c42uW?x@FKd`s}&|t7> zEj~UNg00?|f~{UaLAbH}VC^2BUfwOuFt>8S#9DwN|5<>}0NUW;*$U#YLpWeI$WKs@ Q0G$u?9#8=*GuV{>0CB5ylmGw# literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..767aff8c1e8296b841400a061f2adfe7d9bdeddf GIT binary patch literal 372 zcmWe&5N7}Z4N;!Gf}2I4*-UIfJ3fcO*;-vi=LK+ML-z#s+0dO++5#KAzE48-g# zePF-?rT?>W_w}{4wYK)PG&eW(_5Ek%?dxlI_we*;@$vEX1&Ofm0Y%(ELf&v8eiR`; rurjDvD^OXpuP?G#TVJbpOJ6h9#5}Or0dpS2UQ8!r`U~CX7(oL7$lQi} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7b055262bc492134ec660d90d0022740810cd3a8 GIT binary patch literal 352 zcmbV|%?-jZ3`T>LCLlzC6AN?(MkoOqBqWY3!3z1~<~u_$1VbCR)>qc#Nj;Q?J z^EqUl?B0FaB2?d#)Xx3_O< z>I0&_|7>hPF%M6mC@+V-eT$!8lOI-LpaiOFpcz2bU{ScatRQni>Y$c01MLR#02Z$} A@c;k- literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5f58a6e153cdb8823ec2a4949de559e251292a11 GIT binary patch literal 421 zcmZ{gxedZF6hH$cgewUJ5@H5+pd=g#1r;3?5))8R=Io3_PsC>W0=4ic5r|c&TxT#U2tBWDMSR|~N3POI68yL{T?RjHHeV>GI-9O~s~w$b?UX7> z;!q7!np8IZV?KrSD+GG`s~08#32bitboK2_IJuF8G<1gf*}}!Cfp|iK|uj0z2-@_ z?*7~?jK-23IS@yVO#BA(+Fz}z1 zv#+nct*y1SrKPX$KMOaI=jQI=>E-Ry4C3=3_z(eJBmv(hkP<$y2*?BM0tVo&FD&bSwVuR+Id-kVsIg#fBO3Pm_UB~&kB?QGXN7X BZ?FIW literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5c26d650e6c42bd5bf6cab19dd6cf7bd2c3f84fe GIT binary patch literal 415 zcmZvYO^$*<5JnM3!N2h*CZ57e7(jHuxN_kEj0bSzRvUy(?PlXO<`i=duQ7@9x(UHV zJ9&$GA5>NM*qU1UY+wg_ID{J<~V;SVMa%bLL)ws3$G@sJ(26;$=Z%cf$x_-RdJk{&+QRGZfq)|D%-*O=q$qa z8GcEUwQg^lB)Afhe71B_25eRMK}hn}hZ+94lQR^_gD_m^M%Cbt0TLH2>lK@NX|42? V&C)N|bJ;4Z-^BBnRXtbzi2v4Xmp1?a literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0b6cc0cabfd0bbe4dfb05faf104d8123d891bab5 GIT binary patch literal 304 zcmd;M5N7}Z2O#zZ;us*#0peO9?g!#UK)e-*PXh5>ApQu%EQ|~cVnD18#H<{BaPXgn ztFN!Uy{)aawWX!6?>`GSkn85|;pye=(+uMCAovggUL*nECXf<7un5ou?-n0l6rnz# zP%~7BAEF8><$zcdh&g%sP{4n7 zejvZKwWX!Gxd{yV`u?*C^!2s1d3t&K`1tzz0YMW`kX5j+uif1PO_W6lDC&k=xYZlk zU>1-WK-H~4VYoB?vv7e$+xozwL~~n!M*L^tgz5zu_n(Cg$ZKzF138xkV!?j^2#j)J literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3fcba483780c3d0d3e56deb6823af2fa4f838172 GIT binary patch literal 415 zcmZ9I%MHRX42FZ~ixyho!kHx)ffo7@S5Dj*0Eq?qNN>I(hF}S%U=1cHztg6zi1aDS zXUnm@78}9m1kT_J?m&Vkc!4+gfG_YSLTtef#NYyMpac)#8l+C+IJm2_EO0fpOC+mf zoFqk#r!~hjI`BJ9S(rXi9cq&)6|{;=q-my{v4q=)QN>>rT3SjL;yfU30^;dFyatF50`V0fz6ZoFfcQ5M3otS;r~gf5)iZU z_Mw9REc|_a?d@%Ct*tFB&CN|sO?`b3F*kP)PcLsDA75WTu$TZ)9kLiUL0`Ba*hFuL xi6B8%K8U@o-YrlE{O4rt>jQI|%XGceSds|y;YfDRWb5m1OUmrx=#l_Xl&E3P(%iG7t*Vm71ak%;3aPyH})9T#< zaoK-XUNEB-Xkjy$^`C{muMgxlPp=jqAE?{FVjy?5_O-y=g;k6ls28ZNwXcr{$ZUps afrSlXWM3aIkOei9l?CDiK2`|b_a6XZq>SeP literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0d77c6f92949879e8625fdf4dd5366e01c1e7d19 GIT binary patch literal 246 zcmd;K5N7}Z3n2Ca;y55K0^&9xo(06~fcPK~p8?|QK>P@Z-vTi!Zyzf7&%)o=*WTXN z*4o%E1d=-dUdHYboe-{3}zV`OEw$|2`mgeTBrl!6=h?twZho_gfkB_gfA9-R( z=J5gT0Grp+0ytNhK22L)ZKuZhENf`2& ZMqpaQ!iVV=P!K?!N3|e83sTI02LQZewK)I) literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7756b97b86d4038c1032f5692a00419e5c92cc65 GIT binary patch literal 389 zcmb7<+X=!z5JguoMnPlpWdSL|4t(X&g7zR-fY~HJGDX;gJ=lT;SbznrXJVA#hv2|r zhs*5TJCT_gtrT`}fD@eI0#~@f9UkBy>=_fo91_^V9=xf1m+MC&bzN0uX>Cy)wM1U( zV!2vxk~Gb-JkNiqAsf20I_d?8`oGQ8 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0055e27d817e9a493d52332cc0e9d95ab08b8154 GIT binary patch literal 414 zcmWe;5N7~^5Fm~L;tU`z1L8Iyo&m&bfcO9q-vHuwK+M9(z#s+0MnLQa#8E(;1H?5z z+y%tbfS8N94+Q>mumj1~mKG43owKj6t<}rhr@0x(W8(($JUoG1AKxY*pOv?-uiYIg z02X242a33Xgj!mBe0}{us$gQRt$lsXP%&nXzP=7OphBP+FVMbbUq7%~W*{3R-qzR0 g$JW=^M2091ld-u1CWh=TK&BEW@_UJ}39 zf(cAv3wt=g2@3H0@?E7DiR5{frD>8FbG9W?dIRii zzF4l-ajf-*a(eiq|MB(a_4e84G^H1~_UO)%jL6N6JoTt0{d3{P~u; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0668957059e0686a8cab1315214e7f36666c03e5 GIT binary patch literal 405 zcmZ{g%?*M;5JoZb;~z2T!3HeDv!Jq^D8RdkC78$x-Zs`?5msRn7U3D+vY=?TgsddFAl9M5xP* vK52q? literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f54b5320f89f2faaf873f0ba2c7f66369522d52d GIT binary patch literal 380 zcmb7<%?-jZ3`PT_EkbI`jWatiL(@Xa0EihnM1Feoks%m@9TRaH;yRB&kUDk5)!IFq~ZSck~5YoekptatUQa@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2d5a09c652611a257904fe34150ad916d189fa6a GIT binary patch literal 355 zcmbV{%?*M;5QSG+z(fPy=z$)*89)UO)L;`{_lJ{tEm(v_ScFAb0=`j<9Q5KO-|pty zH`&=#WlCyIT5=#qaw2DPAy;xEcM?pL%1BODq$RTeQp>5VeH;SbIUv=5F*H$3Q*E{u zNO)=XBEtmeO4^-;X?`i4GF6n78^s3a;XbW@xY{(YXGgtt{dO{4QF_3NlY#XY6*1L$ Srsh0Z^ZaedZ%ZwPy?+3aHG_Nr literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..21ee1528024c8f02adb9328546ebb079601ed74a GIT binary patch literal 342 zcmaiwu?@m75Je4gKtjYpqF{v#K@9=oNc8kwuJ4H$qO7=p&!_YcD2q$lMr z-{ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2b700aed42d704deaef6897ea9e3cdc666c6ec7b GIT binary patch literal 329 zcmWe+5N7}ZA0Q3|;zS_M2jY4lo&dy)fOrcK9|7WvK>QGhKLar3J0EiGUkH-zWu)!Yo`^T7DtK21#^<-B069-dy_ zK0dx65mul`UteoW3rGMg!T~g-udlfo$n^uM;N}2wo1h$YNlfjSRZ2#q*?h6|qewgM*YSfeR7r!X6|72672=~G6rN2n6^XV~mP2o?l;}9> wP36-lZ=t<8 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b3e9eca300ceb32a0a198e5562a2db4028646fad GIT binary patch literal 436 zcmWe(5N7~^2p~=c;xZua2I56PybXv?0r5Q`{s6>(fS8Sufk6O>Wq?=@h@F5q42ZLU zxDkk_0r7GmW@qXH0zNSLpN*xjudS`Gj~7TcH}&=XXJzZ_Yj^i(?d#(KvYLH;L4qvo zKtVT%D3A#h^#cp@LxeqB`&xVmiM6+RczU(?`1m$8f$iZ1xuOj$)C^+&=Kz}A>gDYN q^11tt~HbM7c_a4@uzz8su-~<5g>z>L0 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..05b9316e0564e17b4360a2d7b5e487fef91f600a GIT binary patch literal 387 zcmZXQOAY}+5QYacW)P2s#Lf{M!O~;Ku$5TY+S`ehdDxX(xP?QwgCp3FuewJNoqS3E ze?7XY`_918vxY6~-~bo6!VT{5fG1Qdj?;r7j9?5gY+wg_ID%glPEmJ7@|=rT7dcO7 znMk{)5h+|BXJRc+Bsm!~u;yG7DM{iJe&PPvOJjG*KIgM}n35SA&+BOS9BcKqf|f`Y zM(LtVX*AGAY7?s#1XTqZ3nQc|k4n=FBhfj~_QA;NW;rh1HB7Otr1Sg^{k8w+Ps%@f E0a9v+n*aa+ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..592c832e6ef253bd3113f7e1cae199f760ded36c GIT binary patch literal 434 zcmZXQ%?*M;5Jtg(ny6q*j5Sz=$T_BIzUHsIAREW#qJ0pCJEg-zaO z^ENv>^UaKfq1PUcaE1hK@PH@0;0>l}7;{*{3J!3B3tZt2gPyRawRWjmR!GB+OSc`DZMrVNCH3c3Js+1e w4K*(PHc1ow>j$Xc-sxED?BD9qJ7bc9@|w}Bj0j69-s*%1ND8}*(<%4j1CpzqWdHyG literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/sbigfont.lmp b/wadsrc_extra/static/sbigfont.lmp deleted file mode 100644 index 937a92b357d6495d88cbcb972118bd64f025fff3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7452 zcmcJUO{gSS6~}LXRCmAEFEia;-8ESXF5H`C1b1fVECpwo%)I`nt}lQ8bMCEvZ*Y=mbcX7CtKO@==kxzR=e#f6 z{^DnEg-?AsgvSS6Hx1M9SkS+lTvOYHaK=v8&9GoyuF~KZr%ibfJ`+MdpFa`8=R>$1!ky{#?sR%@KL6^? zo8QRu+fP36om;o=JoV(=FFked>D$jebLZ<{dHVUUJ@ex8_g?wlb1&Y#`)v3sVf$Q1u zlkf-DUEp~hc#d#kz}pw|HNTN97W$00+4ACIsrz=LZ(BC=k#5^;7_wD!K3HWH@2;A& zxXYW_Ah&0EGmX1-Ga0Py*=e_F#={NYGi<^%+l&G>ecO?8FOBJZe{I zS1SO@IRT(BA}Bhp^-4jLpPl7O8Lb$E)X7+FGgS^vr)%PG?i-AawVUv`Z$h@2ObCm( z@_NiJ7G%{~jivR--|Ul7OHs-BMsfmMAz zWNAq)$!9t4f|631B?Woz8!|m}soJq`kRZd|IN$PJXPD#b?04afutOtc06>W2Y`MSa zmP3v>teQDzhC>!st^8JF>ozBka>V49^Gb=-hGDi|SJQ5-P$Efdi|K|ff^-`Nw6^20 zIVdHOWe?DVVmlfVhz|;a>_PTMc#DG+`iG?w9yv;R&ir+7&mpzvbAzFTb#^*WJ)`aL zI<+Tq8>%cIhq5)Yc`AV6`?t-0lO1K*9oR~4%0ipC(904 z3oC^ZdkJk2O)>TG4sr440kixuyd5r;$d}@S<<4Vh=P}ftA6Cv1Aur_%qP-&F<@WUf z56ToJh6AH@u0S?zi6aRir#W5mT5d+hCO{+b zUdPq=i{L^qBeG@^HUt3D8KKqVx_9g4c%nET6@@(O%yGcCM}q5zg!%)S=7E`J>!#T% z#i-9FWBN!p39WoJDz7tajWH{dd$%31mo_VVK&J#SjOQ|j=?Qzn(;dNq7 z!M?{@G66|9R!FV3?y2Uyafy%tJ2fY2Z)OeQK2|KP_t8Mjq)E1Eu?@eSY}1SzY-5DK zH3$GROS6nJxWqCQe*5YFNS>X^1BqPCz2-{pB~UB{h>8LLQErkcj^?H^doBDLLNY>I z2?t|Zc{*V&>H#s92=-$XDWB-OK8!D41~!EgJ3MGab5OWzx7rJ?Dt^|ij>63&;u7nE zs~AyhuMvhNf7G2%b~2i1#iW%-u3b3$rvA(gl1#6QxK4pu>)IZQQYUP;cHbvx^9o!_Tm3XEqgf?L9&F3A@T3 zyN(gNFlaO(rm~$umzfcZiF*`en|iF;$m7kact{=?iXO#jmX>YyPWTO`Qqfu65GN0^ zMRRkoh`YzwmGE>}HuALm+ZvGAt-c&0Fal`inUxlx-8DjJVhM*aRdKX4nOfNE02o0= z-;{!)iHx4IyN-xwDJ8u+E(;7PR8ndvmjHAkp(CFJ$PMcjx!KH^Fgv zsxPX@@p!xgX3V&Pn2%-LcfepV^C5C+86ocw>9c_w#7-iHs%IysgljU`BSa7jD3rb0 zlK&lkeJA++sGUP{2_*kLyh4Ih*h`Sy7=c+vTdwSqM;jP4CJj;^u6R$Sv*79qdv%od zYyp(L<4ToBhSQODk1DD@FQ^_U7P*?H247arfAeX1P{AAv)D-9|3aw!=_7E zd)<)U(no@rb$Q3-d0BZoZ(2eC9aqXu%2%|sYMTJJO6{T1L-M~-SZm&|QLYwk)udLH z{ld&IsFnE@`fh&hKwFINJMT`C`Sr{RRy#Mp?|Mpg@W3XBR?&S2z|+JiO^m%n*k>Pv zmyAEXGe!cj>d_LY76&LZm$he56;Z5m6IR{?tSX~`{CFlC9v%3PYT@%^3d{}()d*;f zLCRJviZu;AWJsB_w$E7h(irHGeg1pHK4jl(W>%%&TI&@S7aAd89}RMA+_ zpFkt&922f5x`-NeR62r26?yKe*8OBk+FsFEv!Ua)L^}-*>O}`~s#mG$d9T)S7FN4{U{Ig8khw!5DNgxD z_uHO%M%Xw>B2bsd-Y!;dCx`YACf3?``s*EbU_Z{FOotF41u#F34jK^97(mj{(DayJ z_n5DI*`m#xcun-BjzTa=Tpmm%ow4fatEH`oPC|SuKYBIV*@ULTCkrPv^!_z9{6X?m zLi&{E61{K6taYW@>mh6w2TzgHJmnqN#obCh{G%e+i?bclmp zdDXtnd8t9;njl=;Bx2pnYE42h$flfj8VK_q^BR|qAr9hsVW6(ZrF!HLCpG%2Cs#E3 zst0KFIhk3}d7Xpq6!Lbu>LZ2tj1={*eo7FZ`g`l;X)91v%^PQ{u(lYjtlrkJqo4z` z>{RL9xj((H*y8T@ua#kHYC%*JjWWzT1pw7*mU$XJx|t}$EGKEpEG3&WpNs%KHX(@) zMf&8}n21wf>A`H|ALoIX(EXR3EQGPBl--Mi1Xt->_?%MJaAn11MRWEVj;*;s(%Poe zCnexveZi{Ng33n^=q#hRBT}B*irteMDNbE}_kzU$e6y~ca$sdj*8%TOek6VNc`Z7I@=xB zx5LXu=naNDF}j#thCY?E?0f{pv_6)#{3V5`?3pian3cy4wt)%tHJSx87O+dX!Tq{{ z-P7I+8Qlx6Hzc)%r8;y~_~;n1D3ZL9p4{GNdPLIXR$+tY=Fam3V$|^E|DUe)Y3wak zYyTUPG_{elj6PWV+)MQajk%EPsDRp3qI5$K3sggW@7sj-;_yqN@&$ Date: Wed, 13 Feb 2019 00:02:39 +0100 Subject: [PATCH 18/95] - Fixed loading of folder based fonts and added a config lump per font. This is done by putting a font.inf file into the folder. Current options are "Kerning", "Scale", "FontHeight" and "SpaceWidth" --- src/gamedata/textures/textures.h | 4 + src/gamedata/w_wad.cpp | 2 +- src/v_font.cpp | 133 +++++++++++++++++++++++-------- 3 files changed, 103 insertions(+), 36 deletions(-) diff --git a/src/gamedata/textures/textures.h b/src/gamedata/textures/textures.h index f23d3c3d6b..42affa0366 100644 --- a/src/gamedata/textures/textures.h +++ b/src/gamedata/textures/textures.h @@ -482,6 +482,10 @@ protected: } void SetScaledSize(int fitwidth, int fitheight); + void SetScale(const DVector2 &scale) + { + Scale = scale; + } protected: uint16_t Width, Height; diff --git a/src/gamedata/w_wad.cpp b/src/gamedata/w_wad.cpp index 3ef9a7640f..d20eebe234 100644 --- a/src/gamedata/w_wad.cpp +++ b/src/gamedata/w_wad.cpp @@ -1315,7 +1315,7 @@ unsigned FWadCollection::GetLumpsInFolder(const char *inpath, TArray= 0; i--) { - if ((int)result[i].lumpnum != maxfile) result.Delete(i); + if (Wads.GetLumpFile(result[i].lumpnum) != maxfile) result.Delete(i); } } qsort(result.Data(), result.Size(), sizeof(FolderEntry), folderentrycmp); diff --git a/src/v_font.cpp b/src/v_font.cpp index 598f7d6ea2..d889967669 100644 --- a/src/v_font.cpp +++ b/src/v_font.cpp @@ -1000,7 +1000,7 @@ FFont *V_GetFont(const char *name, const char *fontlumpname) } if (folderdata.Size() > 0) { - return new FFont(name, nullptr, path, HU_FONTSTART, HU_FONTSIZE, 1, -1); + return new FFont(name, nullptr, name, HU_FONTSTART, HU_FONTSIZE, 1, -1); } } return font; @@ -1020,7 +1020,8 @@ FFont::FFont (const char *name, const char *nametemplate, const char *filetempla FTextureID lump; char buffer[12]; int maxyoffs; - bool doomtemplate = gameinfo.gametype & GAME_DoomChex ? strncmp (nametemplate, "STCFN", 5) == 0 : false; + bool doomtemplate = (nametemplate && (gameinfo.gametype & GAME_DoomChex)) ? strncmp (nametemplate, "STCFN", 5) == 0 : false; + DVector2 Scale = { 1, 1 }; noTranslate = notranslate; Lump = fdlump; @@ -1031,6 +1032,8 @@ FFont::FFont (const char *name, const char *nametemplate, const char *filetempla FirstFont = this; Cursor = '_'; ActiveColors = 0; + SpaceWidth = 0; + FontHeight = 0; uint8_t pp = 0; for (auto &p : PatchRemap) p = pp++; translateUntranslated = false; @@ -1040,6 +1043,66 @@ FFont::FFont (const char *name, const char *nametemplate, const char *filetempla 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; + } + } + } + } + } + + if (nametemplate != nullptr) { for (i = 0; i < lcount; i++) @@ -1069,29 +1132,24 @@ FFont::FFont (const char *name, const char *nametemplate, const char *filetempla } } } - if (filetemplate != nullptr) + if (folderdata.Size() > 0) { - TArray folderdata; - 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. - if (Wads.GetLumpsInFolder(path, folderdata, nametemplate == nullptr)) + // all valid lumps must be named with a hex number that represents its Unicode character index. + for (auto &entry : folderdata) { - // 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))) { - 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()) { - 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; - charMap.Insert((int)position, TexMan.GetTexture(lump)); - } + 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); } } } @@ -1101,6 +1159,7 @@ FFont::FFont (const char *name, const char *nametemplate, const char *filetempla LastChar = maxchar; auto count = maxchar - minchar + 1; Chars.Resize(count); + int fontheight = 0; for (i = 0; i < count; i++) { @@ -1118,9 +1177,9 @@ FFont::FFont (const char *name, const char *nametemplate, const char *filetempla maxyoffs = yoffs; } height += abs(yoffs); - if (height > FontHeight) + if (height > fontheight) { - FontHeight = height; + fontheight = height; } } @@ -1146,19 +1205,23 @@ FFont::FFont (const char *name, const char *nametemplate, const char *filetempla Chars[i].XMove = INT_MIN; } } - - if (spacewidth != -1) + + if (SpaceWidth == 0) // An explicit override from the .inf file must always take precedence { - 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 (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(); @@ -2430,7 +2493,7 @@ void FFont::FixXMoves() // Try an uppercase character. if (myislower(i + FirstChar)) { - int upper = i - 32; + int upper = upperforlower[FirstChar + i]; if (upper >= 0) { Chars[i].XMove = Chars[upper].XMove; From 8efc3188b999593485d9db5f1ce21ed02aebb159 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 13 Feb 2019 00:47:03 +0100 Subject: [PATCH 19/95] - fixed map name setup This was broken when localization for Hexen was added. --- src/gamedata/g_mapinfo.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index 73c7aaf42f..826f44181d 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -1925,20 +1925,23 @@ level_info_t *FMapInfoParser::ParseMapHeader(level_info_t &defaultinfo) levelinfo->flags |= LEVEL_LOOKUPLEVELNAME; levelinfo->LevelName = sc.String; } - else if (HexenHack) + else { levelinfo->LevelName = sc.String; - // 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"))) + if (HexenHack) { - FStringf key("TXT_%.5s_%s", fn, levelinfo->MapName.GetChars()); - if (GStrings.exists(key)) + // 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"))) { - levelinfo->flags |= LEVEL_LOOKUPLEVELNAME; - levelinfo->LevelName = key; + FStringf key("TXT_%.5s_%s", fn, levelinfo->MapName.GetChars()); + if (GStrings.exists(key)) + { + levelinfo->flags |= LEVEL_LOOKUPLEVELNAME; + levelinfo->LevelName = key; + } } } } From 5f574033b571b085c7a56867fffb4d259d2f504a Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 14 Feb 2019 14:29:49 +0100 Subject: [PATCH 20/95] pass full Unicode characters to EV_GUI_Char for Linux and macOS. The Linux backend looked like it didn't handle anything non-ASCII at all, but this all needs to be tested. Windows will be a bit more work because it requires using the Unicode API for creating the main window. --- src/posix/cocoa/i_input.mm | 8 +++++--- src/posix/sdl/i_input.cpp | 17 ++++++++++++----- 2 files changed, 17 insertions(+), 8 deletions(-) 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/i_input.cpp b/src/posix/sdl/i_input.cpp index 61a1fe0bef..6ea1cb70db 100644 --- a/src/posix/sdl/i_input.cpp +++ b/src/posix/sdl/i_input.cpp @@ -471,11 +471,18 @@ 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 utf8_decode(const char *src, int *size); + int size; + + int unichar = utf8_decode(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; From 868ac5adf89f4aa2bb63679644424c6846c87bf2 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 14 Feb 2019 22:22:15 +0100 Subject: [PATCH 21/95] - switched the Windows backend to use the Windows Unicode API. With localization for non-Latin languages on the support list the multibyte API doesn't cut it anymore. It neither can handle system text output outside the local code page nor can an ANSI window receive text input outside its own code page. Similar problems exist for file names. With the multibyte API it is impossible to handle any file containing characters outside the active local code page. So as of now, everything that may pass along some Unicode text will use the Unicode API with some text conversion functions. The only places where calls to the multibyte API were left are those where known string literals are passed or where the information is not used for anything but comparing it to other return values from the same API. --- CMakeLists.txt | 4 +- src/c_dispatch.cpp | 12 +- src/d_main.cpp | 2 +- src/d_netinfo.cpp | 2 +- src/g_statusbar/sbarinfo_commands.cpp | 2 +- src/gamedata/resourcefiles/file_lump.cpp | 2 +- src/gamedata/resourcefiles/file_wad.cpp | 2 +- src/gamedata/resourcefiles/resourcefile.cpp | 4 +- .../postprocessing/hw_postprocess.h | 8 +- .../mididevices/music_win_mididevice.cpp | 4 +- src/sound/music_midi_base.cpp | 11 +- src/utility/files.cpp | 15 ++- src/utility/i_module.cpp | 6 +- src/utility/zstring.cpp | 46 +++++++ src/utility/zstring.h | 9 ++ src/v_text.cpp | 41 ++++++ src/version.h | 1 + src/win32/base_sysfb.cpp | 4 +- src/win32/i_cd.cpp | 12 +- src/win32/i_crash.cpp | 58 ++++----- src/win32/i_input.cpp | 10 +- src/win32/i_main.cpp | 86 ++++++------- src/win32/i_specialpaths.cpp | 31 ++--- src/win32/i_system.cpp | 117 ++++++++++-------- src/win32/i_system.h | 26 ++-- src/win32/optwin32.h | 5 - src/win32/st_start.cpp | 11 +- src/win32/win32basevideo.cpp | 8 +- src/win32/win32glvideo.cpp | 12 +- wadsrc/static/language.enu | 2 + 30 files changed, 325 insertions(+), 228 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dc858f3f19..94c79b1093 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -229,9 +229,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/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/d_main.cpp b/src/d_main.cpp index cc684976d1..31e2414182 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -2679,7 +2679,7 @@ void D_DoomMain (void) if (StoredWarp.IsNotEmpty()) { AddCommandString(StoredWarp); - StoredWarp = NULL; + StoredWarp = ""; } } else 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/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/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/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/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/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/zstring.cpp b/src/utility/zstring.cpp index 0eb8fe67d6..0cffb38a2d 100644 --- a/src/utility/zstring.cpp +++ b/src/utility/zstring.cpp @@ -38,6 +38,7 @@ #include // for bad_alloc #include "zstring.h" +#include "v_text.h" FNullStringData FString::NullString = { @@ -1231,6 +1232,51 @@ 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); + } +} + +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); + } + 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 2924de96d5..f2130ab849 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,12 @@ public: FString (const char *copyStr); FString (const char *copyStr, size_t copyLen); FString (char oneChar); + // 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); diff --git a/src/v_text.cpp b/src/v_text.cpp index 345f4b7311..313abb275a 100644 --- a/src/v_text.cpp +++ b/src/v_text.cpp @@ -55,6 +55,8 @@ int ListGetInt(VMVa_List &tags); // 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. +// The long term goal should be to convert all text to UTF-8 on loading and +// make this require pure UTF-8 input. // //========================================================================== @@ -66,6 +68,45 @@ int GetCharFromString(const uint8_t *&string) if (z < 192) { + // Handle Windows 1252 characters + if (z >= 128 && z < 160) + { + static const uint16_t map0x80_0x9f[] = { + 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, + }; + return map0x80_0x9f[z - 128]; + } return z; } else if (z <= 223) diff --git a/src/version.h b/src/version.h index 1336b47c60..2dec05a549 100644 --- a/src/version.h +++ b/src/version.h @@ -100,6 +100,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/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/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..f74fc82640 100644 --- a/src/win32/i_crash.cpp +++ b/src/win32/i_crash.cpp @@ -397,7 +397,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 +405,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 +852,7 @@ HANDLE WriteTextReport () static void AddToolHelp (HANDLE file) { - HMODULE kernel = GetModuleHandle ("kernel32.dll"); + HMODULE kernel = GetModuleHandleA ("kernel32.dll"); if (kernel == NULL) return; @@ -1251,7 +1251,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 +1391,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); } @@ -1939,7 +1939,7 @@ 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); + ShellExecuteA (NULL, "open", BUGS_FORUM_URL, NULL, NULL, 0); SetWindowLongPtr (hDlg, DWLP_MSGRESULT, 1); return TRUE; } @@ -1965,8 +1965,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 +1987,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); @@ -2083,7 +2083,7 @@ static INT_PTR CALLBACK DetailsDlgProc (HWND hDlg, UINT message, WPARAM wParam, SendMessage (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); @@ -2258,7 +2258,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); @@ -3243,21 +3243,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 +3306,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,7 +3314,7 @@ void DisplayCrashLog () } else { - HMODULE uxtheme = LoadLibrary ("uxtheme.dll"); + HMODULE uxtheme = LoadLibraryA ("uxtheme.dll"); if (uxtheme != NULL) { pEnableThemeDialogTexture = (HRESULT (__stdcall *)(HWND,DWORD))GetProcAddress (uxtheme, "EnableThemeDialogTexture"); diff --git a/src/win32/i_input.cpp b/src/win32/i_input.cpp index 990ab416e5..2854290c68 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()); @@ -967,7 +967,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..f3ab51d734 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,10 +144,7 @@ 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 @@ -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)"\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)) @@ -847,7 +844,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 +914,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); @@ -971,12 +964,12 @@ void DoMain (HINSTANCE hInstance) I_FatalError ("Could not register window class"); /* create window */ - char caption[100]; - mysnprintf(caption, countof(caption), "" GAMESIG " %s " X64 " (%s)", GetVersionString(), GetGitTime()); + FStringf caption("" GAMESIG " %s " X64 " (%s)", GetVersionString(), GetGitTime()); + std::wstring wcaption = caption.WideString(); Window = CreateWindowEx( WS_EX_APPWINDOW, (LPCTSTR)WinClassName, - (LPCTSTR)caption, + wcaption.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN, x, y, width, height, (HWND) NULL, @@ -1273,7 +1266,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE nothing, LPSTR cmdline, int n 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 @@ -1357,12 +1350,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..5431f8b5b6 100644 --- a/src/win32/i_system.cpp +++ b/src/win32/i_system.cpp @@ -285,10 +285,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 +444,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,7 +480,7 @@ void I_Error(const char *error, ...) va_start(argptr, error); myvsnprintf(errortext, MAX_ERRORTEXT, error, argptr); va_end(argptr); - OutputDebugString(errortext); + OutputDebugStringA(errortext); throw CRecoverableError(errortext); } @@ -768,7 +768,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 +796,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 +820,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 +1179,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 +1190,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 +1209,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 +1226,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 +1248,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 +1286,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 = "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 +1322,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 +1364,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 +1393,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 +1432,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; } 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/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/wadsrc/static/language.enu b/wadsrc/static/language.enu index 6e8635a15f..d23bfa65b4 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -2990,3 +2990,5 @@ 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."; From 340d7bce8dbe56c44fc3568d00bddd7a26883ff0 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 15 Feb 2019 08:51:41 +0100 Subject: [PATCH 22/95] - added some character counting utilities to FString. --- src/utility/zstring.cpp | 20 ++++++++++++++++++++ src/utility/zstring.h | 2 ++ 2 files changed, 22 insertions(+) diff --git a/src/utility/zstring.cpp b/src/utility/zstring.cpp index 0eb8fe67d6..0e2720da2e 100644 --- a/src/utility/zstring.cpp +++ b/src/utility/zstring.cpp @@ -38,6 +38,7 @@ #include // for bad_alloc #include "zstring.h" +#include "v_text.h" FNullStringData FString::NullString = { @@ -379,6 +380,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) diff --git a/src/utility/zstring.h b/src/utility/zstring.h index 2924de96d5..2ef4ff1967 100644 --- a/src/utility/zstring.h +++ b/src/utility/zstring.h @@ -304,6 +304,8 @@ public: 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; } From c49665684bd5ed0e2902eee7e6bfe55212d51171 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 15 Feb 2019 08:52:56 +0100 Subject: [PATCH 23/95] - fixed DHudMessageTypeOnFadeOut's character counter to be UTF-8 compatible. This was reading the string by byte and not by character and could end up printing incomplete UTF-8 data. --- src/g_statusbar/hudmessages.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/g_statusbar/hudmessages.cpp b/src/g_statusbar/hudmessages.cpp index 11c7aa1a4c..ff9a697921 100644 --- a/src/g_statusbar/hudmessages.cpp +++ b/src/g_statusbar/hudmessages.cpp @@ -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 From 0356c2fc6710a3a2f6241d39633a56b7727ddbd0 Mon Sep 17 00:00:00 2001 From: Ne Mrtvi Date: Fri, 15 Feb 2019 15:31:16 +0100 Subject: [PATCH 24/95] New BIGFONT, uppercase and lowercase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that GZDoom supports uppercase and lowercase characters in the BIGFONT format, this commit actually adds those characters. It contains full support for both the English and Russian (minus the letter Ð) alphabets for both Doom and Strife. As for the existing punctuation graphic lumps in Strife, all extra space is removed, and the sprite offsets are adjusted instead. This also adjusts the English language file so that all menu header texts utilize these new characters. As a tiny extra, it also adds the letter Ð to the Strife smallfont. (Credits to Skulltag for the uppercase B, Amuscaria for the uppercase X and Z, and @jnechaevsky for all Russian characters, taken from Russian Doom!) --- wadsrc/static/language.enu | 52 +++++++++--------- .../game-doomchex/fonts/bigfont/0021.lmp | Bin 134 -> 142 bytes .../game-doomchex/fonts/bigfont/0022.lmp | Bin 133 -> 133 bytes .../game-doomchex/fonts/bigfont/0023.lmp | Bin 251 -> 295 bytes .../game-doomchex/fonts/bigfont/0024.lmp | Bin 327 -> 350 bytes .../game-doomchex/fonts/bigfont/0025.lmp | Bin 263 -> 300 bytes .../game-doomchex/fonts/bigfont/0026.lmp | Bin 0 -> 343 bytes .../game-doomchex/fonts/bigfont/0027.lmp | Bin 92 -> 72 bytes .../game-doomchex/fonts/bigfont/0028.lmp | Bin 158 -> 176 bytes .../game-doomchex/fonts/bigfont/0029.lmp | Bin 158 -> 176 bytes .../game-doomchex/fonts/bigfont/002A.lmp | Bin 160 -> 160 bytes .../game-doomchex/fonts/bigfont/002B.lmp | Bin 120 -> 120 bytes .../game-doomchex/fonts/bigfont/002C.lmp | Bin 75 -> 92 bytes .../game-doomchex/fonts/bigfont/002D.lmp | Bin 80 -> 140 bytes .../game-doomchex/fonts/bigfont/002E.lmp | Bin 74 -> 80 bytes .../game-doomchex/fonts/bigfont/002F.lmp | Bin 191 -> 236 bytes .../game-doomchex/fonts/bigfont/0030.lmp | Bin 227 -> 227 bytes .../game-doomchex/fonts/bigfont/0031.lmp | Bin 135 -> 135 bytes .../game-doomchex/fonts/bigfont/0032.lmp | Bin 243 -> 243 bytes .../game-doomchex/fonts/bigfont/0033.lmp | Bin 233 -> 233 bytes .../game-doomchex/fonts/bigfont/0034.lmp | Bin 211 -> 211 bytes .../game-doomchex/fonts/bigfont/003A.lmp | Bin 105 -> 112 bytes .../game-doomchex/fonts/bigfont/003B.lmp | Bin 106 -> 119 bytes .../game-doomchex/fonts/bigfont/003C.lmp | Bin 161 -> 186 bytes .../game-doomchex/fonts/bigfont/003D.lmp | Bin 92 -> 160 bytes .../game-doomchex/fonts/bigfont/003E.lmp | Bin 161 -> 186 bytes .../game-doomchex/fonts/bigfont/003F.lmp | Bin 252 -> 255 bytes .../game-doomchex/fonts/bigfont/0040.lmp | Bin 0 -> 323 bytes .../game-doomchex/fonts/bigfont/0041.lmp | Bin 278 -> 278 bytes .../game-doomchex/fonts/bigfont/0042.lmp | Bin 319 -> 319 bytes .../game-doomchex/fonts/bigfont/0043.lmp | Bin 286 -> 286 bytes .../game-doomchex/fonts/bigfont/0044.lmp | Bin 307 -> 307 bytes .../game-doomchex/fonts/bigfont/0045.lmp | Bin 286 -> 286 bytes .../game-doomchex/fonts/bigfont/0046.lmp | Bin 216 -> 216 bytes .../game-doomchex/fonts/bigfont/0047.lmp | Bin 346 -> 346 bytes .../game-doomchex/fonts/bigfont/0048.lmp | Bin 299 -> 299 bytes .../game-doomchex/fonts/bigfont/0049.lmp | Bin 134 -> 134 bytes .../game-doomchex/fonts/bigfont/004A.lmp | Bin 194 -> 222 bytes .../game-doomchex/fonts/bigfont/004B.lmp | Bin 318 -> 318 bytes .../game-doomchex/fonts/bigfont/004C.lmp | Bin 194 -> 194 bytes .../game-doomchex/fonts/bigfont/004D.lmp | Bin 316 -> 316 bytes .../game-doomchex/fonts/bigfont/004E.lmp | Bin 316 -> 316 bytes .../game-doomchex/fonts/bigfont/004F.lmp | Bin 333 -> 333 bytes .../game-doomchex/fonts/bigfont/0050.lmp | Bin 264 -> 264 bytes .../game-doomchex/fonts/bigfont/0051.lmp | Bin 346 -> 347 bytes .../game-doomchex/fonts/bigfont/0052.lmp | Bin 310 -> 310 bytes .../game-doomchex/fonts/bigfont/0053.lmp | Bin 327 -> 327 bytes .../game-doomchex/fonts/bigfont/0054.lmp | Bin 212 -> 212 bytes .../game-doomchex/fonts/bigfont/0055.lmp | Bin 296 -> 296 bytes .../game-doomchex/fonts/bigfont/0056.lmp | Bin 278 -> 278 bytes .../game-doomchex/fonts/bigfont/0057.lmp | Bin 308 -> 308 bytes .../game-doomchex/fonts/bigfont/0058.lmp | Bin 290 -> 324 bytes .../game-doomchex/fonts/bigfont/0059.lmp | Bin 262 -> 262 bytes .../game-doomchex/fonts/bigfont/005A.lmp | Bin 366 -> 366 bytes .../game-doomchex/fonts/bigfont/005B.lmp | Bin 218 -> 236 bytes .../game-doomchex/fonts/bigfont/005C.lmp | Bin 191 -> 236 bytes .../game-doomchex/fonts/bigfont/005D.lmp | Bin 218 -> 236 bytes .../game-doomchex/fonts/bigfont/005E.lmp | Bin 183 -> 183 bytes .../game-doomchex/fonts/bigfont/005F.lmp | Bin 80 -> 164 bytes .../game-doomchex/fonts/bigfont/0060.lmp | Bin 92 -> 92 bytes .../game-doomchex/fonts/bigfont/0410.lmp | Bin 0 -> 278 bytes .../game-doomchex/fonts/bigfont/0411.lmp | Bin 0 -> 313 bytes .../game-doomchex/fonts/bigfont/0412.lmp | Bin 0 -> 319 bytes .../game-doomchex/fonts/bigfont/0413.lmp | Bin 0 -> 199 bytes .../game-doomchex/fonts/bigfont/0414.lmp | Bin 0 -> 385 bytes .../game-doomchex/fonts/bigfont/0415.lmp | Bin 0 -> 286 bytes .../game-doomchex/fonts/bigfont/0416.lmp | Bin 0 -> 374 bytes .../game-doomchex/fonts/bigfont/0417.lmp | Bin 0 -> 275 bytes .../game-doomchex/fonts/bigfont/0418.lmp | Bin 0 -> 316 bytes .../game-doomchex/fonts/bigfont/0419.lmp | Bin 0 -> 331 bytes .../game-doomchex/fonts/bigfont/041A.lmp | Bin 0 -> 318 bytes .../game-doomchex/fonts/bigfont/041B.lmp | Bin 0 -> 322 bytes .../game-doomchex/fonts/bigfont/041C.lmp | Bin 0 -> 316 bytes .../game-doomchex/fonts/bigfont/041D.lmp | Bin 0 -> 299 bytes .../game-doomchex/fonts/bigfont/041E.lmp | Bin 0 -> 333 bytes .../game-doomchex/fonts/bigfont/041F.lmp | Bin 0 -> 299 bytes .../game-doomchex/fonts/bigfont/0420.lmp | Bin 0 -> 264 bytes .../game-doomchex/fonts/bigfont/0421.lmp | Bin 0 -> 286 bytes .../game-doomchex/fonts/bigfont/0422.lmp | Bin 0 -> 212 bytes .../game-doomchex/fonts/bigfont/0423.lmp | Bin 0 -> 273 bytes .../game-doomchex/fonts/bigfont/0424.lmp | Bin 0 -> 290 bytes .../game-doomchex/fonts/bigfont/0425.lmp | Bin 0 -> 324 bytes .../game-doomchex/fonts/bigfont/0426.lmp | Bin 0 -> 320 bytes .../game-doomchex/fonts/bigfont/0427.lmp | Bin 0 -> 259 bytes .../game-doomchex/fonts/bigfont/0428.lmp | Bin 0 -> 412 bytes .../game-doomchex/fonts/bigfont/0429.lmp | Bin 0 -> 446 bytes .../game-doomchex/fonts/bigfont/042A.lmp | Bin 0 -> 289 bytes .../game-doomchex/fonts/bigfont/042B.lmp | Bin 0 -> 372 bytes .../game-doomchex/fonts/bigfont/042C.lmp | Bin 0 -> 263 bytes .../game-doomchex/fonts/bigfont/042D.lmp | Bin 0 -> 286 bytes .../game-doomchex/fonts/bigfont/042E.lmp | Bin 0 -> 400 bytes .../game-doomchex/fonts/bigfont/042F.lmp | Bin 0 -> 310 bytes .../game-doomchex/fonts/bigfont/2013.lmp | Bin 0 -> 164 bytes .../game-doomchex/fonts/bigupper/0041.lmp | Bin 0 -> 366 bytes .../game-doomchex/fonts/bigupper/0042.lmp | Bin 0 -> 356 bytes .../game-doomchex/fonts/bigupper/0043.lmp | Bin 0 -> 389 bytes .../game-doomchex/fonts/bigupper/0044.lmp | Bin 0 -> 374 bytes .../game-doomchex/fonts/bigupper/0045.lmp | Bin 0 -> 370 bytes .../game-doomchex/fonts/bigupper/0046.lmp | Bin 0 -> 304 bytes .../game-doomchex/fonts/bigupper/0047.lmp | Bin 0 -> 378 bytes .../game-doomchex/fonts/bigupper/0048.lmp | Bin 0 -> 352 bytes .../game-doomchex/fonts/bigupper/0049.lmp | Bin 0 -> 152 bytes .../game-doomchex/fonts/bigupper/004A.lmp | Bin 0 -> 280 bytes .../game-doomchex/fonts/bigupper/004B.lmp | Bin 0 -> 386 bytes .../game-doomchex/fonts/bigupper/004C.lmp | Bin 0 -> 284 bytes .../game-doomchex/fonts/bigupper/004D.lmp | Bin 0 -> 350 bytes .../game-doomchex/fonts/bigupper/004E.lmp | Bin 0 -> 350 bytes .../game-doomchex/fonts/bigupper/004F.lmp | Bin 0 -> 402 bytes .../game-doomchex/fonts/bigupper/0050.lmp | Bin 0 -> 328 bytes .../game-doomchex/fonts/bigupper/0051.lmp | Bin 0 -> 413 bytes .../game-doomchex/fonts/bigupper/0052.lmp | Bin 0 -> 372 bytes .../game-doomchex/fonts/bigupper/0053.lmp | Bin 0 -> 372 bytes .../game-doomchex/fonts/bigupper/0054.lmp | Bin 0 -> 292 bytes .../game-doomchex/fonts/bigupper/0055.lmp | Bin 0 -> 336 bytes .../game-doomchex/fonts/bigupper/0056.lmp | Bin 0 -> 300 bytes .../game-doomchex/fonts/bigupper/0057.lmp | Bin 0 -> 338 bytes .../game-doomchex/fonts/bigupper/0058.lmp | Bin 0 -> 358 bytes .../game-doomchex/fonts/bigupper/0059.lmp | Bin 0 -> 291 bytes .../game-doomchex/fonts/bigupper/005A.lmp | Bin 0 -> 374 bytes .../game-doomchex/fonts/bigupper/0410.lmp | Bin 0 -> 366 bytes .../game-doomchex/fonts/bigupper/0411.lmp | Bin 0 -> 359 bytes .../game-doomchex/fonts/bigupper/0412.lmp | Bin 0 -> 356 bytes .../game-doomchex/fonts/bigupper/0413.lmp | Bin 0 -> 264 bytes .../game-doomchex/fonts/bigupper/0414.lmp | Bin 0 -> 431 bytes .../game-doomchex/fonts/bigupper/0415.lmp | Bin 0 -> 370 bytes .../game-doomchex/fonts/bigupper/0416.lmp | Bin 0 -> 536 bytes .../game-doomchex/fonts/bigupper/0417.lmp | Bin 0 -> 375 bytes .../game-doomchex/fonts/bigupper/0418.lmp | Bin 0 -> 350 bytes .../game-doomchex/fonts/bigupper/0419.lmp | Bin 0 -> 373 bytes .../game-doomchex/fonts/bigupper/041A.lmp | Bin 0 -> 386 bytes .../game-doomchex/fonts/bigupper/041B.lmp | Bin 0 -> 374 bytes .../game-doomchex/fonts/bigupper/041C.lmp | Bin 0 -> 350 bytes .../game-doomchex/fonts/bigupper/041D.lmp | Bin 0 -> 352 bytes .../game-doomchex/fonts/bigupper/041E.lmp | Bin 0 -> 402 bytes .../game-doomchex/fonts/bigupper/041F.lmp | Bin 0 -> 352 bytes .../game-doomchex/fonts/bigupper/0420.lmp | Bin 0 -> 328 bytes .../game-doomchex/fonts/bigupper/0421.lmp | Bin 0 -> 389 bytes .../game-doomchex/fonts/bigupper/0422.lmp | Bin 0 -> 292 bytes .../game-doomchex/fonts/bigupper/0423.lmp | Bin 0 -> 336 bytes .../game-doomchex/fonts/bigupper/0424.lmp | Bin 0 -> 368 bytes .../game-doomchex/fonts/bigupper/0425.lmp | Bin 0 -> 358 bytes .../game-doomchex/fonts/bigupper/0426.lmp | Bin 0 -> 423 bytes .../game-doomchex/fonts/bigupper/0427.lmp | Bin 0 -> 316 bytes .../game-doomchex/fonts/bigupper/0428.lmp | Bin 0 -> 468 bytes .../game-doomchex/fonts/bigupper/0429.lmp | Bin 0 -> 525 bytes .../game-doomchex/fonts/bigupper/042A.lmp | Bin 0 -> 352 bytes .../game-doomchex/fonts/bigupper/042B.lmp | Bin 0 -> 435 bytes .../game-doomchex/fonts/bigupper/042C.lmp | Bin 0 -> 310 bytes .../game-doomchex/fonts/bigupper/042D.lmp | Bin 0 -> 352 bytes .../game-doomchex/fonts/bigupper/042E.lmp | Bin 0 -> 495 bytes .../game-doomchex/fonts/bigupper/042F.lmp | Bin 0 -> 372 bytes .../filter/game-strife/fonts/bigfont/0021.lmp | Bin 205 -> 205 bytes .../filter/game-strife/fonts/bigfont/0022.lmp | Bin 217 -> 217 bytes .../filter/game-strife/fonts/bigfont/0025.lmp | Bin 346 -> 346 bytes .../filter/game-strife/fonts/bigfont/0027.lmp | Bin 120 -> 120 bytes .../filter/game-strife/fonts/bigfont/002B.lmp | Bin 146 -> 146 bytes .../filter/game-strife/fonts/bigfont/002C.lmp | Bin 117 -> 117 bytes .../filter/game-strife/fonts/bigfont/002D.lmp | Bin 130 -> 130 bytes .../filter/game-strife/fonts/bigfont/002E.lmp | Bin 101 -> 101 bytes .../filter/game-strife/fonts/bigfont/002F.lmp | Bin 231 -> 231 bytes .../filter/game-strife/fonts/bigfont/0030.lmp | Bin 414 -> 414 bytes .../filter/game-strife/fonts/bigfont/0031.lmp | Bin 198 -> 198 bytes .../filter/game-strife/fonts/bigfont/0032.lmp | Bin 397 -> 397 bytes .../filter/game-strife/fonts/bigfont/0033.lmp | Bin 334 -> 334 bytes .../filter/game-strife/fonts/bigfont/0034.lmp | Bin 361 -> 361 bytes .../filter/game-strife/fonts/bigfont/0035.lmp | Bin 366 -> 366 bytes .../filter/game-strife/fonts/bigfont/0036.lmp | Bin 385 -> 385 bytes .../filter/game-strife/fonts/bigfont/0037.lmp | Bin 322 -> 322 bytes .../filter/game-strife/fonts/bigfont/0038.lmp | Bin 372 -> 372 bytes .../filter/game-strife/fonts/bigfont/0039.lmp | Bin 352 -> 352 bytes .../filter/game-strife/fonts/bigfont/003A.lmp | Bin 159 -> 159 bytes .../filter/game-strife/fonts/bigfont/003B.lmp | Bin 175 -> 175 bytes .../filter/game-strife/fonts/bigfont/0041.lmp | Bin 421 -> 421 bytes .../filter/game-strife/fonts/bigfont/0042.lmp | Bin 377 -> 377 bytes .../filter/game-strife/fonts/bigfont/0043.lmp | Bin 309 -> 309 bytes .../filter/game-strife/fonts/bigfont/0044.lmp | Bin 415 -> 415 bytes .../filter/game-strife/fonts/bigfont/0045.lmp | Bin 304 -> 304 bytes .../filter/game-strife/fonts/bigfont/0046.lmp | Bin 306 -> 306 bytes .../filter/game-strife/fonts/bigfont/0047.lmp | Bin 415 -> 415 bytes .../filter/game-strife/fonts/bigfont/0048.lmp | Bin 372 -> 372 bytes .../filter/game-strife/fonts/bigfont/0049.lmp | Bin 176 -> 176 bytes .../filter/game-strife/fonts/bigfont/004A.lmp | Bin 223 -> 223 bytes .../filter/game-strife/fonts/bigfont/004B.lmp | Bin 368 -> 368 bytes .../filter/game-strife/fonts/bigfont/004C.lmp | Bin 246 -> 246 bytes .../filter/game-strife/fonts/bigfont/004D.lmp | Bin 487 -> 487 bytes .../filter/game-strife/fonts/bigfont/004E.lmp | Bin 389 -> 389 bytes .../filter/game-strife/fonts/bigfont/004F.lmp | Bin 414 -> 414 bytes .../filter/game-strife/fonts/bigfont/0050.lmp | Bin 405 -> 405 bytes .../filter/game-strife/fonts/bigfont/0051.lmp | Bin 405 -> 405 bytes .../filter/game-strife/fonts/bigfont/0052.lmp | Bin 380 -> 380 bytes .../filter/game-strife/fonts/bigfont/0053.lmp | Bin 355 -> 355 bytes .../filter/game-strife/fonts/bigfont/0054.lmp | Bin 342 -> 342 bytes .../filter/game-strife/fonts/bigfont/0055.lmp | Bin 343 -> 343 bytes .../filter/game-strife/fonts/bigfont/0056.lmp | Bin 329 -> 329 bytes .../filter/game-strife/fonts/bigfont/0057.lmp | Bin 472 -> 472 bytes .../filter/game-strife/fonts/bigfont/0058.lmp | Bin 436 -> 436 bytes .../filter/game-strife/fonts/bigfont/0059.lmp | Bin 387 -> 387 bytes .../filter/game-strife/fonts/bigfont/005A.lmp | Bin 434 -> 434 bytes .../filter/game-strife/fonts/bigfont/00AB.lmp | Bin 0 -> 316 bytes .../filter/game-strife/fonts/bigfont/00BB.lmp | Bin 0 -> 316 bytes .../filter/game-strife/fonts/bigfont/0410.lmp | Bin 0 -> 421 bytes .../filter/game-strife/fonts/bigfont/0411.lmp | Bin 0 -> 389 bytes .../filter/game-strife/fonts/bigfont/0412.lmp | Bin 0 -> 377 bytes .../filter/game-strife/fonts/bigfont/0413.lmp | Bin 0 -> 291 bytes .../filter/game-strife/fonts/bigfont/0414.lmp | Bin 0 -> 454 bytes .../filter/game-strife/fonts/bigfont/0415.lmp | Bin 0 -> 304 bytes .../filter/game-strife/fonts/bigfont/0416.lmp | Bin 0 -> 532 bytes .../filter/game-strife/fonts/bigfont/0417.lmp | Bin 0 -> 343 bytes .../filter/game-strife/fonts/bigfont/0418.lmp | Bin 0 -> 389 bytes .../filter/game-strife/fonts/bigfont/0419.lmp | Bin 0 -> 431 bytes .../filter/game-strife/fonts/bigfont/041A.lmp | Bin 0 -> 340 bytes .../filter/game-strife/fonts/bigfont/041B.lmp | Bin 0 -> 335 bytes .../filter/game-strife/fonts/bigfont/041C.lmp | Bin 0 -> 487 bytes .../filter/game-strife/fonts/bigfont/041D.lmp | Bin 0 -> 372 bytes .../filter/game-strife/fonts/bigfont/041E.lmp | Bin 0 -> 414 bytes .../filter/game-strife/fonts/bigfont/041F.lmp | Bin 0 -> 374 bytes .../filter/game-strife/fonts/bigfont/0420.lmp | Bin 0 -> 405 bytes .../filter/game-strife/fonts/bigfont/0421.lmp | Bin 0 -> 309 bytes .../filter/game-strife/fonts/bigfont/0422.lmp | Bin 0 -> 342 bytes .../filter/game-strife/fonts/bigfont/0423.lmp | Bin 0 -> 387 bytes .../filter/game-strife/fonts/bigfont/0424.lmp | Bin 0 -> 410 bytes .../filter/game-strife/fonts/bigfont/0425.lmp | Bin 0 -> 436 bytes .../filter/game-strife/fonts/bigfont/0426.lmp | Bin 0 -> 401 bytes .../filter/game-strife/fonts/bigfont/0427.lmp | Bin 0 -> 334 bytes .../filter/game-strife/fonts/bigfont/0428.lmp | Bin 0 -> 534 bytes .../filter/game-strife/fonts/bigfont/0429.lmp | Bin 0 -> 572 bytes .../filter/game-strife/fonts/bigfont/042A.lmp | Bin 0 -> 355 bytes .../filter/game-strife/fonts/bigfont/042B.lmp | Bin 0 -> 482 bytes .../filter/game-strife/fonts/bigfont/042C.lmp | Bin 0 -> 326 bytes .../filter/game-strife/fonts/bigfont/042D.lmp | Bin 0 -> 341 bytes .../filter/game-strife/fonts/bigfont/042E.lmp | Bin 0 -> 570 bytes .../filter/game-strife/fonts/bigfont/042F.lmp | Bin 0 -> 380 bytes .../game-strife/fonts/defsmallfont/0401.lmp | Bin 145 -> 150 bytes 233 files changed, 26 insertions(+), 26 deletions(-) create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0026.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0040.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0410.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0411.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0412.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0413.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0414.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0415.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0416.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0417.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0418.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0419.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041D.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0420.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0421.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0422.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0423.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0424.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0425.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0426.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0427.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0428.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0429.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042D.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/2013.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0041.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0042.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0043.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0044.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0045.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0046.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0047.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0048.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0049.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004D.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/004F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0050.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0051.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0052.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0053.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0054.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0055.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0056.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0057.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0058.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0059.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0410.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0411.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0412.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0413.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0414.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0415.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0416.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0417.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0418.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0419.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041D.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/041F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0420.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0421.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0422.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0423.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0424.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0425.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0426.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0427.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0428.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0429.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042D.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042F.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/00AB.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/00BB.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0410.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0411.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0412.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0413.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0414.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0415.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0416.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0417.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0418.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0419.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/041A.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/041B.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/041C.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/041D.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/041E.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/041F.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0420.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0421.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0422.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0423.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0424.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0425.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0426.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0427.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0428.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/0429.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/042A.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/042B.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/042C.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/042D.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/042E.lmp create mode 100644 wadsrc_extra/static/filter/game-strife/fonts/bigfont/042F.lmp diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index d23bfa65b4..9396e84ff9 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -1720,7 +1720,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"; @@ -1742,7 +1742,7 @@ OPTMNU_REVERB = "Reverb environment editor"; // 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"; @@ -1815,7 +1815,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"; @@ -1834,12 +1834,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"; @@ -1857,7 +1857,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"; @@ -1981,7 +1981,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"; @@ -2005,7 +2005,7 @@ AUTOMAPMNU_PTOVERLAY = "Overlay portals"; AUTOMAPMNU_EMPTYSPACEMARGIN = "Empty space margin"; // Automap Controls -MAPCNTRLMNU_TITLE = "CUSTOMIZE MAP CONTROLS"; +MAPCNTRLMNU_TITLE = "Customize Map Controls"; MAPCNTRLMNU_CONTROLS = "Map Controls"; MAPCNTRLMNU_PANLEFT = "Pan left"; MAPCNTRLMNU_PANRIGHT = "Pan right"; @@ -2021,7 +2021,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"; @@ -2052,7 +2052,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"; @@ -2070,7 +2070,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"; @@ -2080,7 +2080,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"; @@ -2137,7 +2137,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"; @@ -2187,7 +2187,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"; @@ -2204,13 +2204,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"; @@ -2264,7 +2264,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"; @@ -2272,14 +2272,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"; @@ -2308,7 +2308,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"; @@ -2776,13 +2776,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"; @@ -2799,7 +2799,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"; @@ -2810,7 +2810,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"; @@ -2927,7 +2927,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"; diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0021.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0021.lmp index 10cfdff4c37d2081e5aa1ce9f1e84cce2559de3e..c6e74a303b1be511acef2034f6a51f2cadf9db53 100644 GIT binary patch literal 142 zcmZQ$;Aa2<1t8W3VrL)@2jXlXt_NZUt}G<*pMgIsD&j%Kg^%7 zR*e#E!45bufE&1j2Y7-Pc!LjE&6L`J#XO0Y!z!C3sQJ;t7he51#ov zWu%Fm_XoCG*GvZNgv?4kylkVN`Xlb(MY+CX?m`H?vCNlRZwwLGQ`^=|2L9`HsmGDG I;YI!17fqa9G5`Po literal 251 zcmYL@%MAiC3`8R#aaua!&OOA0{e&!p%lJ$Sw7`8^paoi>1@3gPOrni&{G{>N8f9Y| zlWR+M#F9jAxUQ5RudR_YL_@TfX@DXqf+8q_A}E3qvTwWzSo)&q z%ZokFr7NAS1Na64&fo&B;0EsC0iIyBaBc_o;0yeKRiSx}%eAU7i|XgcztVBBg^MxJ zWQlv#(Uq#dJtvBBP_3FYxg;z|BU1U<5hD`FT;wSi*oROwZ5t{J=ludvcdWVVj&Ii_ zmZ6rD4Bp1dIp1Ty#vb7{i%l_D{da1o%+55n9@a`ExMdcva?Xd)3rI0?oW}u9epRPsO#lD@ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0025.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0025.lmp index 4c5e89e5cd853ace2014bc33d330b3e3c4c5610f..f81e36ca3c082a0701c2b9712f7483d1b327e329 100644 GIT binary patch literal 300 zcmYL^I}XAy5JWd54xb>w0XPsPijaZ@R+IuF_6ppAo}Qkbo}QkbJ5Yt0H6klL`FXUq z*K?T(YY8^s2u|P(F5n7o;0_+(30~k0KA=cM7CckhQxYns!+X$avoMEPPHuYC=*U< O^Q?bC95DXnf8+~)!CL+R literal 263 zcmXYr%?ScA6oj+Cx}Y6dfhP|*$8(S-qfu!X&Q_ihXJU=6n5Db8dQ_>$oxyf<63 zF*-Z4Cj+^WJDJIYJjsi^$%lN&j}#?%x=J^qsR4He)_e~`7N-EL8Vc8EV@IHEf!=#h zwajRe2p5W4F?hvFak@^7rQ#SAixfwG=+gdZB%GtrYE_7)0j%YG8FfhQj#;QeG)wI~ F;}4#7PI>?U 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 0000000000000000000000000000000000000000..a5082b02892971d96280facaa18873207ea3475a GIT binary patch literal 343 zcmZvX%?-jZ3`WyG2^FE<7=j@z?hG2#ACA8&&rI*N0 zPHY#fU_K5&fD5>S8@Pi9c!C#rgE(Sr3wB@+jvz_M$0`jMjq#eu8AH@N=ZMB=Lv)g| zRTg2qVFgTOR40|zMlY^X#yKJE&}(C-I^GRLQsNMc6AEe51ULT|9QSploZtR+79}aK s>-JYC9bDU4eJ&;D4)a;>(A*8BP?HM_w!V4Ez030N%G8C?@@z`S4}+_1a{vGU literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0027.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0027.lmp index 334d9fb7871d0f1bfdc1d6ed3e16753432bfb367..66ff537dec5300391ce8f93a32b34a08a73c24d7 100644 GIT binary patch literal 72 zcmZQ&U}XRS86Z{$VqG9M2Vw^xW@gF)g8vMxASxcp3JeFcShBJLqd`K1!8+3_5|V}AdUj!XdwRopP4BW2>vs$f~a^XD=-|)V#&-5 Pj0OoYgCsNm|NjpFeEt^i diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0028.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0028.lmp index abbf0207feecb78c20d1e471ae6081ffdfba101e..447da96021a4ab7213bce487e6119a9d3b527056 100644 GIT binary patch literal 176 zcmd;J;Aa2<4InlFVizC|1L6!It^wi+K)eu$S=h5+;6D>LkeL)49}h%8)_+FctgPgq zu&{_2APP@~iUbBngolLzQA7ezgn>URD?TDTHa0d2h(bdXp<=<|$xw46AnI7MvI1kW SvbaHXEJzVESe^$${RaRY|1|{w literal 158 zcmXAh(G7zz3`A4NN2nO2zg?gk^aBtiLb1{o@!^xYLRaX>a0W}yr#qhJS(Elg@@$ Q?J^Kd#TvERwV`mf9bo@0$N&HU diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0029.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0029.lmp index 071c23b82b73e9e7ca0c17b8c2d2b384f1214ca4..07df3a30d34b730e59c2cfc3e68d27bd6a2afedf 100644 GIT binary patch literal 176 zcmXYp(Fwvp5JXoKP>3OIqyt;<(;vyPSqyji+ppA+8Z5y+&v)jAdCagZbCp4gM!3TR z3^v%|17DEFi*83`Y2BaEy(3>_mVq*@|0nlgsooY1s%m(Cm%mf*ZW?AYY+5gA3QLMO RvXIXmGw~2Dx0gCg{{hv$HNOA= literal 158 zcmXZU!41MN3s;!UqqdNnpWi>MezO^o8tL{5% OpLyMxU`f1=Hhcgs;4W1=9Yn=sWoBi8*(q5W zS+P*@n8c){D43e?@JP7&@bGXLJ1`_P49EfNWyuQ641=<>GFh^K;6KQoET9+wBDpQy diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002B.lmp index 121e96def0a4e39eb5960b450eb1702129605a6b..19a7c987246beb98c6036c832a2f44f5f847d70d 100644 GIT binary patch literal 120 zcmd;JU}s=p`1M}{NE!gK1rWOcaR3m<0C5Ho7XUF6a~25v2hmADnt>g}jRlK=*x}(3 aG4W9G;PA-E2)LRsuo{rQK&XD8z<&T~-Xh2V literal 120 zcmd;J;9&p(4InlEVhbR40pb84jsfBfAT9u6R_06)_z$9!vao21xGz G|Nj6^AQgfD literal 74 zcmZQ$;9&p(1t3-jVgn$y1Y##3_5@;1rc5CC&%u(J8Ic5KgeF26f$=~FRKMzSc~I*gq1jCaaA~I T!HF>zdb7UQEyt&G!SebKIubXg diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0030.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0030.lmp index b9d9cda5ee8b08b9ed51f2b599fc81d4f6fd2be4..d14522144268158ebd2c5e9f7b5a6e22ea792cbf 100644 GIT binary patch literal 227 zcmd;P;9&p(6Cid3;s78{1mYqfZU*8hK)e))w*m2SAif5~OdMHo@Sl+@D=QiT;8XheId~Qv=aVj> z4X!KbKo3SRg9SXm6THA1e88!(zt-w(Hf&O}HMC|a6XlHOz8gIuAaYC7ZbU>~>Gvg? kxzS+e(hBm@Tk8F)ba mh=_=wpwQ5GpaPIUKqwFd0YMCsKzL|qcu*o#0Hz;A{|5lCuqIFd literal 135 zcmZQ);9&p(6(H6IVq+k72I3GPP6gsJAZBLD1cLue%$b=%K$?*|Gm|A6Bm@Tk8F)ba mh=_=wpwQ5GpaPIUKqwFd0YMCsKzL|qcu*o#0Hz;A{|5l4ASNRK diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0032.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0032.lmp index e38b4f3ef1cb7dbcd7d56a0d378891e1f0f6fb6b..4bca64d1924a0dc8aa8412e23684fdf162759cca 100644 GIT binary patch literal 243 zcmYk0;RymU427$dL-59N2mjs`N&;69{bxpS1y^tdS8xS)aFM$&y($Ji+PuEJW*_?C zb$}x%T;T?Hc)$~0@P-eBXtla-J-g$FMq;-eZ={5 q47lRd1P@CPzo8;Jd7x*l-zoz0(K9xzq>{yK$C5R6+qQMVYhD0PT}l-I literal 243 zcmYk0;R(Vp5QU?JBG_@dgMZsVxPu0Y{<{@i!4+J=6-NM)BYyxtDh@cMN^- z8sG#923NSj9Ukz67rY@vtJQVeX|{&mOcvUdWhzZbXL>C~d8m%aC2LW={0SrW3Fpr- p;)-(ULA2VjyAOmVPp^Y{5!fBaxar2qf` literal 233 zcmX|(;R(Vp6ogahkD?vN75uM-8o>wQHIQ-}xPmLVf-AT}H|Q?yy(aeHOUTDvPOf#9 zGr5pE8Oe*h$%lN&k4$7HuEv(8+=~hS08I1)u!);w;dc>AL#@#QH5-=PD8l3}u6%Ud g`&1^K#3Y*H@E5%VRgGCxN8l+TnBw5jN1w`OI V3=&ZhVWz9XqA#Gj_KLUtZ9hu^KHvZV literal 211 zcmX|(!3o1K3`KqLA&`vI1+qXP1|xw5qL&a4kZV@R3SFTqbTRj6ANivvo71;P>`0w5YJ5EKs) K0MY+Z^aB7pD;r?| diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003B.lmp index 5123a31637d47549858087bf75b78eac6b6e1486..b72431f9dbf3760499278abc334d1bae072fb9a3 100644 GIT binary patch literal 119 zcmd;J;AUW8`14-_NNNJH0T4R@aR?Bn0&yu2mjUsAPNpm%_|L!sqO!8sSV3ewR3s)6 bA`%!56NwB5iU8FHMk8xt25HLr|NlP#E59N4 literal 106 zcmZQ&;9&p(86egKVk;o_2I3eXW@gF)0#2q(Ao$P3l9d&ioR!7Fl9?F+69`L$2!tj= URRqOD1OnrM0#Nkw%6P)1! zSD4`eFL=WTzR*>Ywzih;Xw#y0!__@*P0`!k;C{^|Rfm$4<9{1E^0H*9$5~ANB=FHR XMQM+*r+L*#GtGcn@`9txSY-PF;nFp@ delta 112 zcmdnRxR6nklYxf;1ayGd2#BqK*ae6KfH)3_^MJS!h$l_dwX%zhOwCG-O$^V>{Ljdm ol@$~eo0Y{5WTdC1gM?VJvO<6&96&lf5hTEz1p=HvDig>B0I4w?L;wH) diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003D.lmp index 490e93009ee697c82dd34d7e6074de88c97c6397..6fba4f4ddb8f8de08d6ff5e98295e33ac657c469 100644 GIT binary patch literal 160 zcmd;JU}s=p`1M}{NSXt&8xV&AaS9L@191}&PXuBH<}46kfl&WJ+$0DWNP)Sr5H64c gb0Z*JAO+?|LbyN*%ngHZffSe<2;l-LFc--p02YKTivR!s literal 92 zcmZQ$;9&p(1t8V}ViO>?17Zgz9U)=UWa4`PL7MrLM0Sus#nP-Zxk6_6PSW@Tl8 HwfqMF{n;2k diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003E.lmp index 457a38e95cf4b303ee19d1de2037486b98b372ca..2154df1f5f7833548131cfdbd418a53c265d036a 100644 GIT binary patch literal 186 zcmXAj>j}az7)4Y2vK4o616PnDTCFC=HU#bjj^G3i;BSArUp>JO4&S{8@@UQ4q}jk0 zb}+&Np74SZM}tJJXVO`1(9bsc6&upuT@Nyk%EO;6A5zO}n)P8K7hE)ibf)CdWU7oG%sp$~$id58Ey5z~zy@r<25i6v_U?84lj!QeOY;Ap z$!uNktafBiGC7emxsWTlkvn;iCmG3$xK96Sa=q$MNG?2URWBS>J%B@to0sW%iM(v& w=LL^>wzE0az$R5Aq~0@+KehC1!>^eG(x8S=6T_DxhwMHO`|Tv=Q<653I6v z=+JZ}XaKuY?8gne-N5r!K5E%0hkLUCoH`k{G^!#JQk5op=OukLnbW8yIV~^$0I{x4 A;s5{u 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 0000000000000000000000000000000000000000..4b78b26b0222b3643a32374fd61706cf46763b76 GIT binary patch literal 323 zcmYL^%?-jZ424tZfu9~YFajH}1Vd*=!TW}O zuzRnn%+R_DFx6-lgKxiyP+J}pl`?e1BRbh$rBKxkcga7&ougE(jG`T#UI-ll6(Z2yn0%b=4 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0041.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0041.lmp index b46cd6825aa8334fda43bb5169dc4e76bf299d70..a838d54f15ac5bb60421b4fb6a7a0ca98dce5b06 100644 GIT binary patch literal 278 zcmXYp%MHRX5Ja6sQAmhHQyjTOQLwDFWI5vG6CF?i1<(Ku&;l*c0xfV1Z=J05teO4H z!SqJ!2q!qh3|F|p9Ukz67rfyEU-&^&7}HisYiVkJ?@@Jwiegn)t!i(FL2zZ4jh)6w zdnp*s-dVRg&b*VX%`PPgDp^zG2%CbMKBa-dH0R;gm_v{dVx*ZjM(ZdMP0Nia;(5+$ RMzK%n5?S9a%5Kft694*;SKt5u literal 278 zcmYL@!41MN3`J9_suU`*6h|(tR1(RNqJ&d!Y`_Ezzyd753ar2itiZ86he|kl(f{9$ zm7VF0)*cRUgal`}z!h$AhX*|21#kF3TN%^US!-?^Ztqb|i;7}Z*PUu_he2?wO)+*F zBk^3(Ox{`db3F4-iZ<(}HGcupnpb`R diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0042.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0042.lmp index 6eeb6c20dda6271ba931b75b347ccbb5a7f74bef..0700f6020b609e4c2c8f7066923df2be9b78e5bb 100644 GIT binary patch literal 319 zcmY+9;RymU427%y5ad8ta07>MfR<1~Nuk^!{>TEZ;0mtb3a;P^uHXvwzArfW^u^nY%B2Uaslt_LU Xe6k94u~97rB}A;ray3?6Pfz^-#m!|n literal 319 zcmY+9;RymU427%y5ad8ta07>MfHqK4NTJ*bLMCtpS8xSaa0ORz1y`sqcURQFN8#&B z;B8&!Y>ps;Gq`{&xPd!(fG2o?H>hB@aBdF{z;*gJ)kG?)g2{vGC6+`25H5C{wjQNguW@CshRD|iL3&?|TaA-+k2P(QrR^w0bu zYw5+bfh`>12v@kl9Ukz67mVGwy)R1j*QtgOBjYSR(}e7E yu7*!1JLIPgu6mLkbzdSht{Q{42!=JYjUh~i)!D}GXXxLCs}aYbMC=iE)Re!uBUgC< literal 286 zcmZ9GK?=e!5JjibMUm>6+`6owWDyvWpyJ*ucm=QE6}*C1=oP$z5Z|Ohs2^Tu`e*)- zwe(`zz!na0ge%r_LCk#UxuX+rin ySHq{19rDu#S3Sv&x-StLSB=421jCxy#tTF~8GxTr6)rezIBK8P7YRX@T`d0-2 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0044.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0044.lmp index 0d982445c42073eeae1431f0b0d1d75562239330..f3a374dc27abb9317ffd5ec9fae58a27a4fe5926 100644 GIT binary patch literal 307 zcmZvW(Fp=E5JYowABP-Tfel!P1sK8-!Y+i%hsZWy3$|bjwqOgkU<K;Q%};0kWw4j$kMUf>NX*fh@Vz#h0>^{hWt3#5Q7B7^D}c$mnXIL`r0 z6i#s&NX|mCxM8(^3|iGAOgEj?{R=$G>;}!Hl;ALbe;HDQh=MKFtg!=m6HjAFi9%qk QUsoMomYm_WwrDlg4~yPl2mk;8 literal 307 zcmZvW(Fp=E5JdO%J`Opw0voUn3owBtfh>f}hp-jcf-TsBE!cuB*n%y@+2c;{!+}R; zhh(xl>dABj49?&JuHXjl-~pcC1>T^7Z9}vN2SB~*T7Rk*NC8}o;L92R#>87*Nzrdl)Ztz^n5f1bBmmvm-+1p~x20O4brD-fNviAw= Q*Hwp?C1-f8Em}?W1Nq`#GXMYp diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0045.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0045.lmp index 4978d853cb8bf6130dd7100fa7dd74ae819f303a..ed6f0036d65a6bf6efdef18117166fdbeea00cb2 100644 GIT binary patch literal 286 zcmY+9K?=e!5JgkzLZo^ow=PSF!_dM|shh05f>-bgUcoDPgJR#`9l$U{03bS@^6-B F{sDpTTps`c literal 286 zcmY+9!3n}Z5JfkVgGjU{uO73o&O!o13?Alg3$|bjwqOgkkQQt~h;Nf@z=5~J{F(n@ z53X{lj&OoAT;T?Hc)$~0@P+|C@P&QhTv^&w<7P|mR6E*O?96(NF-p@fV1>2{Gb3C2HQwb0TT`Q6b@CGo#hWmA^ae!xLjC{% literal 216 zcmX|(%MHRn3`8B2Lj+q84RB8ot6ga=Sxa*9ofc?;255i=xaLYp%h-HIdXmRuPoO}i zJve|9Sil8b!42HO13bYBUZ5ZJueRA@K8vtORc+l)b!INP1>2{Gb3C2HQwb0TT`Q6b@CGo#hWmA^ad@7La_h< diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0047.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0047.lmp index a20ccd8b848c74ed8740327281500a8d38532a2d..3dccf3651c228ae8a28f3f51caca6fd0b7c60167 100644 GIT binary patch literal 346 zcmY+8?Fqs#5QbB!D5XD~z#$w${Fxw9N)JOqQ7E{9E4YFyxPmLVf37 z^WMkGltyC*4vuhvE8O4?4|u{0-td7UGiD7N*g~FnL-eyHIff8OeO7c`TQ?%rzD-XV zqv2^voZkBoVvMIGNQ;xM_N)R^g`Xw4iAkt1sNg2ykOV8q;VAwbj%(%%o!jjxhq-D} ktrjmo&5xRO&J7o`<}hj2+DY@Q)?U%;(>xuXc4*mu0Zi`Ixz!_Y?72LobJirsYz#DwPb`!!Lgt`2wx}n)+W_ewkL8hw0iLI1wU{?{A zVThV}%#Oc^w{q^?b(%^cENzIMai6!GFay JBE7Dk^$W_8U#JTkz`Dt1Z}qEqIHwi8(m%!tRin zWEYm;IsgJEa0VA}1vhX95AXyp@CF~S-Gs0QVJUyAZfJIyS)Qh5kg2M0Vk@N^*j0pO z7@}q#v*Rz~t(<#zo##>rOB+_txYLI5fe6>t>ILnL_ti6gW90-9MIA<>)fHt#@LzF_ JNU!T>{Q`?(U9|uJ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0049.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0049.lmp index df39d837b0842a54015d5d55b1a3bc9742ba84f2..4110be87cca72285805c2fe8de6bb4a935b4c9e3 100644 GIT binary patch literal 134 zcmZQ$;9&p(1t2yAVkaOD2I3STE(Kx+o-7pbA0!YR9}^!R9}^Rkn3V+<2#!xoOiYT8 d4v&Wk0OjK2lj7kjVv;~Ak`m)#T98fs4*+roDG2}o literal 134 zcmZQ$;9&p(1t2yAVkaOD2I3STE(Kx+o=g<*A0!YR9}^!R9}^Rkn3)L{2#QZkOiYT8 d4v&Wk0OjK2lj7kjVv;~Ak`m)#T98fs4*+P>DBA!4 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004A.lmp index 20867d6c301e8f12edc6c753c90d2638b8cca800..7ad8fbd85c49693a507feb9850c77fadf600486f 100644 GIT binary patch literal 222 zcmYL?Q3?Vv3`7fRS#-UTpZ*Gl5JK6)vcH4>{(1$k;1N86H`o)cld3rI%5>66_o+{z z138itaWat$xsn^XlLvW{7nw<3A++Q*P^K^&K>p4>vJ9AN8`Glt$h2d{!lb_Kh+{0j lpj2uoHbg7!fU}#Kh}icouA*w*=3D+w)yg`bcd_fE9MkTPlQ6>^0fAxG%_+Goc^;)(x1_8-!i%G}`r zPk4cV!3Q?j;eapPx~TIjLNua^cWz?7k|NT0KIZDQv|w>}Q+M?iOk$>)t-%m6t9i~M Qr8MDftzT%w_g5wE549vZvH$=8 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004B.lmp index 878e0a12e56b60a46b0b012c792204f52f1ccc79..f68e086c56fe4e483f7985a7ef0cfbf87bdb1b20 100644 GIT binary patch literal 318 zcmY+8!41MN3`NrxS_&MvG6EB@0>?&?6gR4~WX9gqYsnU*Up)%Zg?uIw@H(=oa literal 318 zcmY+8!41MN3`NrxS_(aIWdtT*1&&Q5D?yG_0VlHpE3g79aAp7|U<6iRfbtz$BrH8C z{y+Zq(lkbE3wGcH&fo&B;0EsC0iNIm-k{2iS%Ed!0Mp1{^(q7o+(nL|6G?&%&N@fl z$3bWvwHD<@!Bb#j4!;pi^+R-DOhs(6@(M4{q;pv<(h`yTrYutD$XUzdnn0cC=7S0d nY4w7#M0AWt)h5vPA{9JhJbF`z;Li+(PgA)bQ9})I=c(&Ixr<PAeIg=)aE QTnuj!Y@0pBH?dFG4O4GBx&QzG literal 194 zcmYMsJqmy@3MFYnKG_C!C2-+zTjC%!-$ExQVm#E Piue}6w%Jp96Z>@CK_xqO diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004D.lmp index f456db472815e9a07ca67be8677c506499048a75..cba4ffc5b28491fbf53b82c7faebbd01eaf0f573 100644 GIT binary patch literal 316 zcmZ9H!3hFE3`J-4Am|=!z!L1kJw_-8;9R%*>=fz-)>>wWzVr%I@(u$Q*k2Qx>L=-@lMl iuuxRp=t7gQ4>?1s3z0EwOPdQ`3|C;|u9WPKzaw9IJ7hrs literal 316 zcmZ9H!3hFE3`J-4Am|=!z!L1k<2o=Tkif9Bh@=Bsumwx701L1H3$O%R@UZ@@E{cH% z;b;EOWEtw diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004E.lmp index 5b8d9e51109342adfccf8bc74761640e8381cfac..bec09015008a39f288409ece71167c7b9740b0b4 100644 GIT binary patch literal 316 zcmYk1!41MN3`NsYKq@`303)ymN2b1y*1L24DaN;LZxHz#)7$t<*0) z>Bn&#|GjIR=>!;Dz!luU9X!AjyucfLz!&^LQ#f}3M^M(fP%3t+q32}P&~*{&d)4G>)e{Me z2y-_Vm|2*-4^tr$lTaH%M8QTx^h=(b%5^^5-D33An6Jz?&FGgacw#@z%P%SS*$P3V bZ3WHqkJT*vGA(Hfd7nEh1!9=S6#pT=qRe16 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004F.lmp index 72018c6c4e6fecb6740dd2544254bc753b620b16..809cd26a996a5b6a6cb6712da41d97af6b77f26b 100644 GIT binary patch literal 333 zcmYk1u?+$-3`KM3iqnaPk`35^1t=*liXtnzNRcBdcWl54tiTGazzVFu3Y6hH7oD*5 zWckPbv3F)`G|s?-46fh??%)BQ;04~`1HNGBjM;+&ID!-Cd#O=212V@LkxDm;Wa|+& zw{mhs-q{(Y*@`40^af{B6C9yags2K|o!~UIT+F{vJygI%?N~>e;4W&a9lUgSmNr;0uP%m_0avBRGM+ml|a=AajfnsdQVBY(2u} zR!)w{J3FH^qevn`Z*Vp>!4Wz|h^heB2~I=H#rzA^Lj_FKj&-C7?xLpJ!AplnuHX8A mCy@|!t-8lNr<6Fc3c5D7;+z?uFIP}VDAjPekQrW5*1Lago@Fio diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0050.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0050.lmp index 2cd8a4f6c529f5da3a47f3754dba8fcc6de33b59..8f9c543f2bb7cf0e4dae19d0d1882526c09c0a91 100644 GIT binary patch literal 264 zcmY+;(FwvZ5XSK+B0dyna)gE>gwR5`;?uplf-AU!3%Gy_xPS||K;Pp(ZB;z@k=&O% z+P!OBtphv;oN&ekSKM&N15dm#qQEuwSEUA>B5T&cYzq9*%y+6i=Nx3Swv`aS6E*N8 zoYO>`SfQy^+>X~Cgmc5?*YG0K9%CT|iJvAV5$Tp4jUftuR#saxO{rejo8=2{Q5RH9 literal 264 zcmY+;(FwvZ5XSK+B0dyna)jm}B+x>*`gG5(;0mtb0xsYJF5m(#(D(RHTNMv}B=_Zx zcJCTj>i~}dC!BG?6*t`Rz!NWwC~%GaRjEOz$eML9n*x6{^POtXIS1LSZ6(C-L=8L% z=QPnKR%mJ!x8t=3;oNZfHN42Q$5==~;-^VTM7m{1V~E0^mDScvQ>xeXX8FP!CwNog diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0051.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0051.lmp index 87ac1caa54ea5f3649d6bee57542b2e050f4eede..ebac5b436974a613f1cde8b9a6d81d9b27ec7be4 100644 GIT binary patch literal 347 zcmYk1$qfQA3`H~S+l4zNPy!vmfl(AiqlpwH;^Z40&;l*c0xi%2HP8c>;W-)*mY$sd zV>`~;tc=D19Ar4d1+H*|J3QbCFL=YUGG+r?*ufq~BPr1hX5N)hji!PFy@W_|9=zfoqWK}V_hwO~xgOtB}OswGKeGGUqE zIF*-O!=>aV=w@Y=wv92SnAE72A}p42PC+|VXWvBhN$&>>niIiak>BsnhuG*3ZK!H~ literal 346 zcmYk1!41MN3`NrlAq2fJ02?p@8^EEB6s1xtMGmJN*?<*TffZPR71)6tIE3d=5SCtD z|2V(DYttC512~9qf-_v;3OBgJ1D^1LrZQ#&TiC%KX0uc(*9*Fg<4DWZGNsr#s*BUu zTJN3h21e7Q6uf7*w_TV7>)A}n`y$}l;snXp0178K!v(HzgF6iHfG50Q(Kxq*J-F6>YAizT%~DP=9?h!IWiwF?fk737 zNf(3aBoqh2*Gh39mKxofrU=#k*I@Hglq8}OzPiUTl5+N5#N+y8Yfw+gl--LDoZ`z- VW3w^qBi@wj`LlWbYPGBnhBxegVW$89 literal 310 zcmZXO+X(_O5Jj^-P;kL7ORy6Q*a-{?Bp~}EOa-=J3$|bbHn0uYf-P9UdJGUu63mjpm2gST;K{fxWfPsc)|-7jdMHLgKO=l#vQ%jEBlIN-s8Dbnnv=x%bY+8}d6C7-5 zIPaYwMJ{ns*bqX`?WHIzI~)on@30g)zwS_lW!{mqqBwMAhZgE`EiS6?<2ZDs(cgF+ c*6T~-B$7gmA=}m*D7N~ml(G*kjb_R7A3FzUI{*Lx literal 327 zcmX|+{RzS_5XBQeihmRYS8xX>aDXNd3^WkZg7`*o1y^tdS8xSaa0NH0??SH!KXSRe zyO-OW)<~R5AUAR+5Aq~0@+KehB|l=VF$Z!aC$ie0#%?|*+W*eC<@>IKxvR)ESP6^e;0+;n?qaR)so5ogs<1T+~GrVH}63h5pLV c(R%r5UIQiNoT@E%C``7pRVmeH-n7w;|Ks##PXGV_ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0054.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0054.lmp index bec0000cc76fc6639d7a6cd811d9a2372b414469..2937370471d6d2b4c2d0d20a7e28d1596df809de 100644 GIT binary patch literal 212 zcmd;K;9&p(3m|p`VlN;L2I3STE(PK?Af67yD}Z<>5FY~K(?HC?k_86;L5!HBtSm4i z5X|7o$_j{tNQ21#3}At9Fo=wY2?PWN2LN$!3``(6I5Ipu6d@28866oD6B7;B5(v}_ Q14z~Z9S{z407&{j0I9%0KmY&$ literal 212 zcmd;K;9&p(3m|p`VlN;L2I3STE(PK?Af67yD}Z<>5FY~K(?HC?k_iU?L5!HB%uFyN z5X|7o%nXQtNQ21#3}At9Fo=kU2?PWN1pskS3``&>C?Y&O6d@285gic|6B7;B5(v}_ Q14z~Z9S{z407&{j0Fcr@?f?J) diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0055.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0055.lmp index 70077961d90ee5f83bd9884c96748fc0e3ecc813..7f26458ed9ef8ae1de9a5f6271c92a00b4b49783 100644 GIT binary patch literal 296 zcmZ9HJqiLb5QRsuSTu#b7qT=(kdT34La>lM6$M-bMR7-ezbgS
X9Ud#Xh literal 296 zcmZ9HJqiLb5QRsuSTu#b7qWDVU?2m-BqB`j5xjy|u(h?d-79znk07isG0Nh=2YGLP zvm!?&Ho${DID!*6gA2HV8@Pi3JirsYfSVDm0d@9^krrlAQ_4BP9BFCRr%xOvS`l2d zGm``%95^?lP4m6N=;mhI@1w`i>i9COr2Jo#va~6zB3LZ3R^SdVku@oYQc&*NL1S^v Otv9yT)`2Xz_hq6USWd3)9XQ|z& O*6XBIaItv9<L52_IpuD0ZI{(|jvs5>x ObvtPj?ChGFe(?cdoK&R% diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0057.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0057.lmp index d357b40535e2524155127f8d2ca5e538b92e9389..286f4109cc12b3f5d8e13c4aa5ccd5bf0aae99aa 100644 GIT binary patch literal 308 zcmY+9;RymU427#62zo#K;|T8J-%?5`34|-h37NnZT)_bxzyTb<0UW>;9N>H@Dqi4& z*Yv$K-MH3S?Lh(ua0DlC1{ZJzH*g0J@B}Z=%$(bT9dIlCtI@4hGZ8W6+^LSPRrM() ziXo-)X(SjZhZw$&Iw5%PdpMdUA~6JpUYKTL>(5Oi_|tg9CRPuzn6_*zrJD@KIS;tB dU8KjQFxQFJ$U|R*MYuY!J$Hg)7E4S&_Xc9iVR`@n literal 308 zcmY+9;RymU427#62zo#K;|T8J-xf*>354sxNj7i=S8xCaZ~zBz00(dd2RL7fiWm6c zHGMBlH?DP7dyv2Z9Ki{k!3A8w4cx&4Ji!YzGv~Ho2i!{kYIJMWOhimMcdDanReef{ zVo0fc8VLrV90&Ktv3{bukDk8n) z{~sr^ccwSGPJqA!F5n7o;0_+(30~k0KA@?L*@FW(0#gfCm-pGMM4ZSLM-rJ$BVr+1 zoGu4zhzPY&;d9h$q|$mn=pzjRh2)*J5kb}EJMW3~LEXZJKz>|IibGVRg>m3%Vpf|! mVrE!QOF;0b8cTpKXynokl?bg8ivKNRmU9^?=%;zm-?(2Tg<$Uh literal 290 zcmY+9(G9{d3`ElwL_rllEW`%1{YfNOG9gl>`(_1JU;`Fl0XAR-R$zp3ZYu7J9&^Nd675CGv{{16|h)O+u#;J+W{r_T7bbVfu^Cd;-L=S zqzdpMB(7b@$|#6eO??+rq>ya@3NiJGw}!j~RO2c2-$bKY#V&dgRX$`ocMc*yojIL7 ZWu8qJt>tD%CWo{tRLruBmW#hHeE_MfSUCUy diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0059.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0059.lmp index a0fe436bc5a51359b45c0c25d955def77c710a27..bdca8e56b72a9beb2b7c8f629d9c6f1d6386e2dc 100644 GIT binary patch literal 262 zcmXwz%MHRn3`7^gM|=*H#W7a2vaF31CER?V07{?(Dxd;7pacrw&Y3G=W}~(Aq#4;` z`w;elbp$mqZ~|v=0atJXcklpD@B(k}0blR~p>oz37VdGNSVD9?)ylorl;s*yqEXLw z?oA`o=Ae)BExe}G^#k+O2BU^*Ib57-2RDtHCNo-Y5{*_i1zZuGdOR*Mr}$AlDLg4m GmaqSjAyB^n literal 262 zcmXwz%MAiC3`7IVM|=*H#W7wfvQbuwb~*V%0hB-oTLBf&0VPlXcg|c{#))F-Ni(v? z_QCC))e(4b0%vdmS8xL(xPu3Hf){v$5BP!~aE)3`ZlM|m6HAEHn_8)Qj#;iDDTwLW zPPJ``x*XJLzJ=!)Q$JX~*#xi10uKR u00h-5URxf7vpFQYQpXC8*Ojsot|~FAROMAzz3UmIS@AM0qQ66hp793+&u)?c literal 366 zcmX|-(FwvZ5QZbz)`vdm5bodzf-gxRB-n}+pYFjO9Ks=7!4+J=6YqA^70qUuc$fPTVXKAz=`kV`#CAiJotoGHi@74T#*L u0}xcNcx`zQ&gPKpN*yaWURTOWxT?gcQk7R>^{!`-X2r|2i2e>0dd45I(ry9( diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005B.lmp index c70dd0a6b66a0bca3b5576a17c203f7e0275d883..c3ea98f5969e07649c082c6921c266fc2d497708 100644 GIT binary patch literal 236 zcmZvU!3lsc3`KkJqz6}V2p8}m1{w(U7#zYO9Ksb`!4({){*?40et0B2lHZ0tSOzcx z0vp)D0Zwp%8$2NN`b{>+$s;03wYXWBIU=->R0maDq*z^K5&xIf?+7IxTXSesXDpr1 QA|^DLu=y{n!Y(ZN1rJ?Hi~s-t literal 218 zcmd;L;9&p(10Z$;;vgVS2I3MRZUy3LK)f7?cL4E8AZFmnL;?Rn0x^jo5Fa0($jl5D z2#t@4iHVK~kBHCAga`onG11Wx(J+DNnD}^*w)iBdmWV`%xgh#K150LRD3HMcrNIJ$ TK)oOV5RF{`WCBP92>b^CwunJ4 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005C.lmp index 46366390db76392f0f0109e4fd33ac11306704c0..5864b535509a7fc49890bec081497a58e6282cec 100644 GIT binary patch literal 236 zcmYMuI}5@v6o%nwFJ3`^mSZVG2@*;XEu6u6u1 VZDG=9oj2=aKx;1bXR!I7{sA!2H>Lmp diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005D.lmp index 1edf456b6dc540b03e1b017ccba90da841acef1d..5ed5da4ddb5756ea0c8b9c420aad0371f9b609d9 100644 GIT binary patch literal 236 zcmZvVu?>JA5Jf4hv|tria0EyQBwRv_-PI1^5DwuG4&gTV50B0tUOstnFdAzlGgyEJ z8`!}CPH=%6JirXxGHF*4VPzH}-GnQjkp2;t+2ceb+iKu45v9^X?Ik#uA`$|YC%xxl Sa2lWc>{?3J^x6J_c6|X_`AI_n literal 218 zcmZvU!3lsc5Crq^A!0GMU>;AT23$|bjwqR9pH_@L9lZCn5b*^{J07ekN z3O2BV1DxOjH*k%Wv~OpMxR_C}i||?n`$zO<0TYIu9Yhk5SyiRnfbjE##2DoL;iu@C QkiL~gH8I~xJz3xU05)bq3jhEB diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005E.lmp index acbb1414a9667671c46f05c46fc279c5659857be..df3d7a49585c5c4fcfa731c1fbdb36f6138789db 100644 GIT binary patch literal 183 zcmY+-D+_>742I$36^sAKW;C7Q!Jyb(w%hGytI>a`?*XrahkcB(| z6J{(}v0+CVDs?20YD14>Ro4=tghAJl!c^6YIATC_VlC15=tTb0&+dERxp_aiex5R1 BGlKvC literal 183 zcmY+-KMz1a42R*vor!N`Gn%e(F%WxqyWMWK8ht}viN8&r^p~b-bCa2~3Y4f&qlaR^ zhzTYDGq=!f?#UG6QR05cKinb7alJy literal 80 tcmZQ$;9&p(1t8V{Vgn$y0AdFq_5fl|<}48S52C}+=pZOR07`?@0RZ-&6Q2M8 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0060.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0060.lmp index 1feb646491c78d20254ec243e8d19cd168979bcc..f8d466f194ff431dd26d6af49bc56ba9270229d9 100644 GIT binary patch delta 54 tcma!vVdi9Doye@KlLZ3*8CbHi0;53;Rv;rh9?Htf0g2LRSc6k7lQ delta 54 tcma!vVdiAunaHfGlL-R<8CWti1EWCg2LRQ46iWaA 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 0000000000000000000000000000000000000000..a838d54f15ac5bb60421b4fb6a7a0ca98dce5b06 GIT binary patch literal 278 zcmXYp%MHRX5Ja6sQAmhHQyjTOQLwDFWI5vG6CF?i1<(Ku&;l*c0xfV1Z=J05teO4H z!SqJ!2q!qh3|F|p9Ukz67rfyEU-&^&7}HisYiVkJ?@@Jwiegn)t!i(FL2zZ4jh)6w zdnp*s-dVRg&b*VX%`PPgDp^zG2%CbMKBa-dH0R;gm_v{dVx*ZjM(ZdMP0Nia;(5+$ RMzK%n5?S9a%5Kft694*;SKt5u literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..228844314fc08a63c3a98de22f81fdb03ffba114 GIT binary patch literal 313 zcmY+9!3hE}5Je*%Jh-4OSb{xRz|3I?!z_d>;vo&#f-TsBE!cuB*n%y@KVc*5z$4`G z^TX`I5PVKRzy(~v4cx&4Ji!aR!3R{ZUxjc0M-YbcH`PTp6EU-KDy0b(5eAlL5g7v& z(=3RYSWUSnIHiflQpn~6BT5i1TPZ;_sY~Hcx{xyxlJoD0xBJ(!EH&a7yHJ#7BlWX} OZQsqzSJ|xFy?z1HD`P+a literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0700f6020b609e4c2c8f7066923df2be9b78e5bb GIT binary patch literal 319 zcmY+9;RymU427%y5ad8ta07>MfR<1~Nuk^!{>TEZ;0mtb3a;P^uHXvwzArfW^u^nY%B2Uaslt_LU Xe6k94u~97rB}A;ray3?6Pfz^-#m!|n literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0fb9a8159ae3c8a991f6b971455f59574cee89bc GIT binary patch literal 199 zcmY++!3lsc429tyyy-Zu-~du81Og#J5Hf))xPn)&UcI_neHDtB@0y8g z7Fc0}9S%6*f*V5TzsV)&Y-TEA=Kh8xYRp7j!$_*aI5k8PY?yt4zkhRR+@qAwa7pzN L@#HO3OIgVeq#ZrF literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0154cda6e418bd2e339089ad9d0c32dfe755d3c2 GIT binary patch literal 385 zcmY+A!EM7Z3`OO%C<3I&p&217bcNh4xP(fGfMFvi_MSsm=m=RMD`bVNkQKUt`=rE0 z`+*0UU-TEHO<0GbH|W9P6TaXGCpg0euJ8>_6T%B@;T3l94j*uU<&)nvmCtb;_wLif z>TX)D_2SvxEN3&#WoK$=kd!1zr#*F`fkLE-bgUcoDPgJR#`9l$U{03bS@^6-B F{sDpTTps`c literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9dc49699250a0607e58ecdd41b6fade798b7ace9 GIT binary patch literal 374 zcmY+A!EM7Z3`ONOM$^Kl9I`+*$O>5?Mv)qZ2oMqs#Na7AbcJq^1-e34=n7q-_vBGd zi>#4qMZiqN81WM&5f!V7OdW8v zno`OdJH0tt?kKMR4$0`m@;8AO6`{Qs^_HEN>=4s9nsX}BCt%#sY!vnT*^`D;3f?_? JD2e&ETmgGGbSD4+ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fcf34cf900f65819a3f76d0c338d0da2ff2082fa GIT binary patch literal 275 zcmYk0!41MN3`J9l1VUvaR^X6>Wm$)s0x1L2eAHG_|$3HcVKu z1|&=ndX_|lu(c&2Nbq`vq!c#t+);#CgrawJ2OPwlGJAu`sR$|(O6#WggLZAyKYDmp AGynhq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5bfa7ebe41d91b864518b7a72bf5ee8f2d006558 GIT binary patch literal 316 zcmYk1!3n}Z5JfjJD#RRYz!L1kW0o)sLl(m3B1{FgU<PcVv7+uvsX6D7|GKtVt$4SQK0cis(^J8YD2I< d>cq@qwdPJW31f%3n@-?~2=(?wUM_yr;RiReV5!;@!3A8w4cx&4Ji!aR!3WfZb9-f{>LmY8~| z3wcm2k~|0^-b>g0Hs(m8F4{(=>JheDt48A9M)*w+cZ4Uc%q^nKj&g%55wWWRt9Hh= mDK$b03HcC`*D5lzSj(kiOTzFl4>?&?6gR4~WX9gqYsnU*Up)%Zg?uIw@H(=oa literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f390db584ed52bccf2a07526b34a018587723a21 GIT binary patch literal 322 zcmYk0!3hE}6htF<5M2;Eum$_@kdK5A5)?fCi!IoKEm(pbc=hVl7Hq-zlHDvj@RFZl zlF7z&rf3fij&Ol1+~5umc)|Jw_-8;9R%*>=fz-)>>wWzVr%I@(u$Q*k2Qx>L=-@lMl iuuxRp=t7gQ4>?1s3z0EwOPdQ`3|C;|u9WPKzaw9IJ7hrs literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b2b14f62c40c3b37e0b9b58fc12189219f7b3121 GIT binary patch literal 299 zcmY+8!3jb!5JV&Vi}1m__1Hl8EMeJ&B_8CH25i9=Y{9EnueM+dw%{$!Cg$M43%f&R zl3kdC>i`Ixz!_Y?72LobJirsYz#DwPb`!!Lgt`2wx}n)+W_ewkL8hw0iLI1wU{?{A zVThV}%#Oc^w{q^?b(%^cENzIMai6!GFay JBE7Dk^$W_8U#e;4W&a9lUgSmBE&HCYy$uRT( zY-NzDJt!RE1ZTLw6>e~c2Rz{gZ`iCvb|6FkQ>l%FVoWKFIk$%QW@>uy>DzE#m9OuO v5K#zy#ky~ib+dy4eMJz_sCu; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8f9c543f2bb7cf0e4dae19d0d1882526c09c0a91 GIT binary patch literal 264 zcmY+;(FwvZ5XSK+B0dyna)gE>gwR5`;?uplf-AU!3%Gy_xPS||K;Pp(ZB;z@k=&O% z+P!OBtphv;oN&ekSKM&N15dm#qQEuwSEUA>B5T&cYzq9*%y+6i=Nx3Swv`aS6E*N8 zoYO>`SfQy^+>X~Cgmc5?*YG0K9%CT|iJvAV5$Tp4jUftuR#saxO{rejo8=2{Q5RH9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..41cd7ec33231df19c5ee3ce52677b0b1b520d50f GIT binary patch literal 286 zcmZ9GK?=e!5JjibMUm>6+`25H5C{wjQNguW@CshRD|iL3&?|TaA-+k2P(QrR^w0bu zYw5+bfh`>12v@kl9Ukz67mVGwy)R1j*QtgOBjYSR(}e7E yu7*!1JLIPgu6mLkbzdSht{Q{42!=JYjUh~i)!D}GXXxLCs}aYbMC=iE)Re!uBUgC< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2937370471d6d2b4c2d0d20a7e28d1596df809de GIT binary patch literal 212 zcmd;K;9&p(3m|p`VlN;L2I3STE(PK?Af67yD}Z<>5FY~K(?HC?k_86;L5!HBtSm4i z5X|7o$_j{tNQ21#3}At9Fo=wY2?PWN2LN$!3``(6I5Ipu6d@28866oD6B7;B5(v}_ Q14z~Z9S{z407&{j0I9%0KmY&$ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d0b804232db88854820303fc949fd71ef945bd2f GIT binary patch literal 273 zcmXYs%?*M;5Jm^^2hf9Md1OO2n+YTYZ%zvqVF`9%0~TNb7GMG1z2X~ilb3zp?9Toi zWG_CB(15}jE^vh#+~EOFc)=S!@CC_4Dv-i_OtLbICzmxcjAnJdENsl0)KRF|I`7z0 z2~jDPbe))|Y-iTCA@nx(139nBsp|$!9*dF|RZZ%_`w8wj-X={Qp5Y-y?Qxl1)tiME SggBq$k82j=<}k1RKkx$>eo?Cc literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..578b1e833d41003a1ad39ff655bba9ba0f37f1f8 GIT binary patch literal 290 zcmY+9!3hE}6hyPSh~Oe#?Z{*1@cD!UmWUUB0XAR>wqOgkU<;OD1K!t3bXWZFAT#+) zCL7neGCKm2$dR1LnOw+~+{m3g$dkNC(>S*#TQYC0&M;e;g&4Eh&@9cev@J#<3TXem z@i0RbD>EM`;wQm%W>JDFVxRZiE(TNpNJ@vFA@C5LHYBE0oWD#8POak8_#k^pVBT0I PGh9o_Qa*=Jj?;(UTa;Jl literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6f45e2b69f72a5f27c383c0a65506120c7289ef5 GIT binary patch literal 324 zcmYL^!41MN3`NsYM5%h<#tLk}3LFzfRunZ7s@0S4?7#}Fzy>V90&Ktv3{bukDk8n) z{~sr^ccwSGPJqA!F5n7o;0_+(30~k0KA@?L*@FW(0#gfCm-pGMM4ZSLM-rJ$BVr+1 zoGu4zhzPY&;d9h$q|$mn=pzjRh2)*J5kb}EJMW3~LEXZJKz>|IibGVRg>m3%Vpf|! mVrE!QOF;0b8cTpKXynokl?bg8ivKNRmU9^?=%;zm-?(2Tg<$Uh literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..90ff891a764d6043ff9c74c2df5006dbb9c7a764 GIT binary patch literal 320 zcmY+8u?a#!42Dk-d4)Xe+`--*Y+rF4A%WxK*<=M*a0OSewRHtoa0Lf={->A1A3jJv zl8{XpL(2gWFmMJJa0NGT2M_QBFYpG-MF?B41A7qG_LsSd#2h0ti<*7K1jCY26c^}O zB*okX2?TK>7k+hWVpy8RlNZOn<0I@MS1qa~iytAas*1k!l}IcF$+d~mOiD(VvtXht TKTD;w|A!T(sm(|7EWiS^w5-4itiTGazyjg>65W?xWdGRT zM;a(}0%ySB0VdZ w#aK!x!rclQT6Vah8b*c^)Y4##W1fO(O^gZVSyhDB<1j>Rfy|bk(c;=$|2NG}2><{9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9169fbb87017baa04af61d08083158ec9dc30c1f GIT binary patch literal 412 zcmZ9F!3hE}5Je++5cKHL7QEVm*9}X^4l@uE*MlixTd)ONum!KSU<xD5pum=Zl1Rc150bGIE-)oC-~yR#wZLE!AE9nMcWc5kb7}TBNaf@8RT26WQ;I=!mr|cnLLcjdBbJB?eH9V|x)4Ms^jvwzFU_okNdN!< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..83539039f998ac5cac98e8459dd54ad392f4ec2d GIT binary patch literal 446 zcmZ9FL280Q3`WON#6@va=n1@n+g?Ej8HSL+IPvdhc3#0Nh&OQ2ed!gt?G<{3ow8A>jE>m@RIZY@&J`p<2YauyM+_iV&AmYmb= zK6=JTDt!kD1aT%8zBHP!bLr#Z9B;ZPgI3jA#IvM>s-mxbA`wePmBGZcHK_$%DT0Zv T{2DV=#|q literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f7f001fdbc313b90754513de0fe83677dceb7782 GIT binary patch literal 289 zcmX|*%?-jZ424rsehwAl%0?XHLlhZDs?wubffZPR6DHi5A)LRkf1Q37KA;|tw=flJ24WhTE|n2t(bymwtMRh NyhZGD+m+qX@&z&vSuOwo literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cb834d363a68321de5b7dab3340b295f4df3a274 GIT binary patch literal 372 zcmY+9!EM7Z3`G?radI$v$pBrUD`W#R4j~XEK&VA88XzlVg{;sOx!x<}vsggxv-)4*1s&U+I)vs?0s{~VF literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6ba6840b5fe16fc7dde338d425518bbe98049c0c GIT binary patch literal 286 zcmX|*!3}~y5JeZmff(Y=er#b6o6Q80353&JZNV07!4_=67Hq)|JgsjQWReHW+s}tn z=!4G%BFu1w8{FXmPk6x_KJbOE3E>Q(wL0B)FD}N}%*8O7RS|U+=`YfLO4kjSu$B&yjNw+@xeq*yzeBR|9{xxV1*q9T$9O3R_+oO4-fDNM|gu1yo1}@ziM5`QbeSb zqGqGuMOCZhD2u=!EwXl$s+x)M<-hVWe&cEpNFYE|0i M$lTAwct{^@zeyB*UjP6A literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9312be6b2b0bc82772b1c76c0e92797e4e0bc2c5 GIT binary patch literal 310 zcmY+8;R(V(427>2QLx}2S8x*tXgIbq;J_~7I2 zC3$z*hbCm50E08QfGfCxJ9vO67{Cj>L0yG#07tN@J!`Wrhx=IV+qL@#m!T*S Y)>-~;37asdv=mHK)$|vco|_;20K$M_2><{9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..22b90ba0f2565530a53f634a4a5c3f194221b271 GIT binary patch literal 164 zcmd;KU}0cj`1#)gNIC+s7Z3*naSRZr0&yM?mjiJF5O)IcBp{v*#0)H1VDKNr2#L+g n0yBc5p^T77C?h-`CIwRy0Fz>YDGq=!f?#UG6QR05cKinb8I~_G literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a017a92cac3506036657fc7933b9b385dcb33283 GIT binary patch literal 366 zcmYL^(MDSL0ASCZ(6>3(T; zO#a(yVfH}K0y`Ze(SK%t&hYV8)B-sXPAo-oRv*}g9VdyLPJ*KNvcryLW9rH|dun!V QHu(j*JkxLZH@DCJ1)rvLx| literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..45e21d75ceef930559c843663ebb570cd7b14a80 GIT binary patch literal 356 zcmZ9I+YQ1n3`JAQ4+7K`n1LC(L5V_SOID+PMGV0Z48af#!4M3=U%5Ah3b1sXma07Sn08g-~oZEptXu$!vCjZAsCz_Z{Ri)3lIL}!p5~C0Hb{)@o zh4gWD{Xo~7g*e}(i;Cr!GdiYDK6ky9x<4*Vy}*U}TwpJn=;j)tYL--El;Wx_K7kV5 fi3mETF-F3MvF2i(^Pq}%2BxuIPQPPSmvMXnJ}Yzf literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b753f018190ec489cab83340e7e734c4ea879f37 GIT binary patch literal 389 zcmX|-!A%1(5JkP41hhmb%7G?mf(AHofoNB(I!v+4JZBlxIXLx}(*uy6*@9X~<+cmLhDL@*VN0uz? zbPy3#7&&UOVy2ogX;Z7H6@;mfW|vKkT*JG&tF>1_b)*69a#icj-2-9pFsVGN_nV63 zRXg8{s+;QjP~ISCnH%Im=dL+=Mc1ja;TSQV(-E@xD?<6*C*|k0OW(x!>|(KqkLspr FyaI@?d4>Q0 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8c02cacf9ad2ae51ce5a8cfa7475f65000d8a923 GIT binary patch literal 374 zcmZvW%LxKO42EaL2P(SOU=h}^*JY7GClDqq9&)k>i?9fbum^jv2T$vt_<$7y-;ntx znPe5pU{L`AM{ojXZ~<3v19$KM%OZp|*nkS`fr3!#Z*=B3iz+cQrIc0OC3AK3K;|y8 zyB%cnbygP%5w|_(liqHG5^hyzNa|M^vgVJ<{i?Awnwuh%ls*%%tXUPxHs7}sV#-W} km)2adP|diB2ddp1&?=JAc7Peo{S$7*uG$SJzP26R6H=yldH?_b literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c9388feec3585803014d8224cdf416573e926dce GIT binary patch literal 370 zcmZvW!3hE}5JhK25foX$9_+ymJb2g;!w@zQT=tX#tid8I!XhlfBJ3glnN9ZOzzf5h zKS}n~lGGVo!3gf)0iNIm-rxhifEuC$ID!+nfC!fBR4XsGXon~@qRY)Lr7?t_nLP(6 zHG!S8))-?047FI1gk(@daqQ7KALXb{J2MTcGqRzFopVz}2Hkw0I{j%kA@Z>!XoUz4(z}VJRAQcY>c10;m^+x z*-%TS12_W(7jOkPa0d_Y1TXLgA24r-wqOVLV7k;=ak9eNi}yGo^s2F0BXC7y!5PLOgjaZjcbMQ4Ztv?dZS{aGS_+`r@We64c`{aa zB=-?j!wFk|Vx^d>is*=&{Wry0sUrbzINA_J@2) zPM&l-;!IJl7q~q|r|+edm-Hx;Sl5PUFN2CHrPyO`sTWBiS$un2@ykkx`rNp4^Emfd GzU?3AOL`;# literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8648b88233dc406485a1022f538719783c7345a4 GIT binary patch literal 352 zcmZ9GK?=e!5Jlsn>-G>H!XvnFVJRYE28IbmAuA8zAv}bKaP8W4*B(Nsf2OI5KRlB8 zd1s@a+V4qH@ksj8;R#ZVQ`Y`Rs7Ogu4;{Fm=)KP>`6Im;_aaX32j5a=9;K literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..10b50e6c43838f84ade7c78cc1eec9c4d1be9a4b GIT binary patch literal 280 zcmYj~F$w}f3`HZTvnaZkvb7RXNg!kxEK+#^FJNuGwTJK!-oZQAu0OMa8+gnA*`N6> zwG^`fTW|ygT)-9Fz#Vkp0iNIm-rxh82~nDQoj%Ro4_09Ml-&0!3NvUC(a??ij#>2l zGwy6PwU|NX$cK^=fxn`5=%`=LH5WToGYc%|xS%z9Q6<9l*J!1}d}4_PTH!K|Fj0=p Ia`Zm@7xKDUZ2$lO literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b2c88a69a753aad79e947bf2c0c5f5e976110383 GIT binary patch literal 386 zcmZ9H!A(Ok42IM8wNOe`i33}(1QT$1ilRiaVnw0&j>HfQ(IGlSk3BO06L5cgNqefL zFZuJwj-4mBb1mMWz!!YO0giBjGyK3W{J}7D?ipU-6-KD=32tY%F*PrVWa*KT)Y?6- zIcHTBi9yURUeT?dVrgo)GYh<4(Tg=&=+)nx zZ_GyD&sw;hZMjW8s)d{{U8xdanQg literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..def2daf69bd04451bd45a3c8e03f1c69342c3344 GIT binary patch literal 284 zcmZvVu?oUK5JcBP5Je+?m92zu9(S-@2nzcT{(~RkM_8w}wzjsm_MBaF!NP$D!^|wZ zrixTsum=K8;0!L{3VLt@cklpD@B(izn-FaPE#z03mLi-In-Z!_E0NlV5WQ3J5beH^ yhP6hOh{vH_de_(t*(i2R#BM$n34fhlXd46Gn&Z?BE_KJ^+Cyo%E!nuUZ}|g7>RM$0 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..222e24e1bc731d756bbded949f79096113156a13 GIT binary patch literal 350 zcmZXQ(Fp=E5JYqO;g_BkVG(xVhaVmxEHQzQa2&c|5f)(&_Fw@PU;!3j51z9jC#XXn z^wTy{nEcE$HKbm05P)>}0?^-LAzk(#DKJ(-pbIoe7HF`O3G{~Npko855- literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c7ad030a3b54d4ad2915998efc59e54a0c0bbf45 GIT binary patch literal 350 zcmZXQ%?ZLl5QR7Xo-|s7Mc9D{Z(#}J3=F$0A`2E_5%ypW7GMDuU;*|Z@y(JP#790D zUgphAvU0UE?Z5$?!3A8w4cx&4Ji!aR!3V4>=Qdyq_F%Ngzv`-G&LIRXPmJkw>Rg?3 z3$YT522D8^kBM3mV)RDyEb2)_;KY=Uux!3ZNQN!lcn(LH1Kv)oW|4?`T52uBXQign v<1neyUBT;__yTs| zzYeDaFi+poYm) zttM9Vd=!z>=*X#_5}&p0TK^NMV|~ zmDw0Q3C3npi=>1J4`z~LPlrg-=3?x94>NpqcV>OcW=kI;!xX9-no{aj?S((pR=!b( zLcO*Q*;^d`I5IRDec7c9!{Fx)8|LCwl5;5+>(`8;S<%^d?bc@8lUuN)9FUx!APF{# QsBd|Gq+I+vZ(Kj%AKT-CU;qFB literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e718b1fb8a4f2e2d6fab270c0594a4babaf9c122 GIT binary patch literal 372 zcmZ9H-w6US490tM2nu?>ID|VmfN$PWN(c#*-jnpnAsoUX9KsFUzzv+?{Q3tu4E(O? zmo)iqXF8MO1QcAs4cx&4Ji!aR!3Q*rF?(uPWeTb}v*a(AyxgUNBdQa!MtM22 x&P=k`5D4L%#rUb&;y+Z#4JoWtX%tcB(c03r*udDR@B-7>LfaOrt7SRy?hE5PcfJ4s literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1e8606805a55cd76b7ae66532816065673b0dd4d GIT binary patch literal 372 zcmYk2%?-jZ424sEO2wgYW(aoR#<5XUMNuq8M&)8gUz?hG2p499lu7uWFv2 zpY3eT#^^Z$3(nvQZr~0c;0a#f4eH969oT~d@ZbXG3n?ehY7r)4k@fN`Nv;}b-uGct z10{jl4nv|Cyg!L_HbOERk;ud_!_m1(3j|9aRP!|YdhOvNKAoCNZRucn_}6T)Fan%b z6ralg8D$Btb7trrlTi90)*h HGdS{L!jR5~+@ yF{ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..009a2052ae27a24918f36319daee5f03ded99e39 GIT binary patch literal 336 zcmZ9HF$w}P5Jh7lh@xxn9Xx}jrLZh9%s|+%DC7>_!9#cmYinz34`IK)WWyqUco1GD zGn2KcOv)aP5a9w>xWOGB@Prq<;RCaYF&o&z4$LC{rZ>wNMN|{oa@CtvjE#smhq5&; zE9)s3B1u)e^EquBLO2ySHrK8@6IAmN0}FSoUZtumyXt1S_xtORxu95Z0HBq5}`|eVN}) zScejOIDo+sPH=_`T;T?Hc)$~0&`v_w!VbbT*BC>Sb4&wb46~d&RdunzH&rv2%bfYr zgyY7l)+bTz%}b^&mRfHjV)Sd~=uRZYeyQ@k$j{8dY}ecpap862MXXCW;cPAo-`iq zXS_8VBee%dZ~`5;fGfCxJ9vO6c!4+gfGjg+0d}ASrbtq~nWRK4VwzIrYf&>;fmO~$ zhS0#y)+up}vDHBx&R2sKW7nP=X)2a*notL3_CLeb?42djJ2FF#$b0tuUyP^R9;-LF admw8y7~)jcg)t)y84-K1@DJ_EHPIK^(OEYD literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bce324bd433311e54f45e42bb173e45059e80123 GIT binary patch literal 374 zcmYL_?Fqs#5QZbve&~;aQ@Dix9KaGPgapEcAb2~tgj2YMLpX#(_#?h|QF`#uthX0ZbqRv*sGxrap@pN|||sBub(x5HSxeb6A`W zsP>&Yy8Id~L3TZ}kCYZGi`qdgQP!;^^AwUyqcdk+05|&#MWX7sx|Glraaz<_+2oU- zBj)u`ry8%dJ_Ok+);Szq3@)5z=P)huWRVnuPqEIUu5QvsROkP!k9ts3e~UC}lrO@& BbYlPj literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a017a92cac3506036657fc7933b9b385dcb33283 GIT binary patch literal 366 zcmYL^(MDSL0ASCZ(6>3(T; zO#a(yVfH}K0y`Ze(SK%t&hYV8)B-sXPAo-oRv*}g9VdyLPJ*KNvcryLW9rH|dun!V QHu(j*JkxLZH@DCJ1)rvLx| literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..205b334e3988ab93d277dcab13cb226a2492e1a6 GIT binary patch literal 359 zcmZ9I!3hE}5Je;Cx(8ufun0@=l)S#RJKt=yBrrYd;rJVbEg0R literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..45e21d75ceef930559c843663ebb570cd7b14a80 GIT binary patch literal 356 zcmZ9I+YQ1n3`JAQ4+7K`n1LC(L5V_SOID+PMGV0Z48af#!4M3=U%5Ah3b1sXma07Sn08g-~oZEptXu$!vCjZAsCz_Z{Ri)3lIL}!p5~C0Hb{)@o zh4gWD{Xo~7g*e}(i;Cr!GdiYDK6ky9x<4*Vy}*U}TwpJn=;j)tYL--El;Wx_K7kV5 fi3mETF-F3MvF2i(^Pq}%2BxuIPQPPSmvMXnJ}Yzf literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9ddbd0bfce42cc29d9fabaa27de582493ddf6e2b GIT binary patch literal 264 zcmZ9_F$w}P5CzaQw(gZY!VcLX3=;@i$(+GMcnA++ZEbCBZEbD#Par{d;4PoeOm-ip z;B$Zl&TxS%+~5umc)|K*4&a?Yyw6tmXNswydQ;y6q1#D_T&(dhgN jyDFmnmh|-hpBi>%l+m>mOHX_p$uBm0Y3#{J?b*5lXXjL- literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ed1d4955f1331d0ef326169c81ebcb46bcf6f826 GIT binary patch literal 431 zcmaKo!EFLD5Je496vQD2aioY8K?P`8jVzBeu{WoI9uPHfpa3L_ND(O_J>+cu*f?Xkjb}KJH(hm5wpl}^SlpoQ)(UsF88QX&AqC2 zK~$$0*1p8d@=q*jkCs$v-Q7LZ3id8&IdmnI35<6CUT3b!S8uK=G1f2jwPkj2@A6z% MWou)uJ9=E_73F)2OaK4? literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c9388feec3585803014d8224cdf416573e926dce GIT binary patch literal 370 zcmZvW!3hE}5JhK25foX$9_+ymJb2g;!w@zQT=tX#tid8I!XhlfBJ3glnN9ZOzzf5h zKS}n~lGGVo!3gf)0iNIm-rxhifEuC$ID!+nfC!fBR4XsGXon~@qRY)Lr7?t_nLP(6 zHG!S8))-?047FI1gk(@daqQ7KALXb{J2MTcGqRzFopVz}2Hkw0I{j%kl5g_v66l5oli!N}0ZtbJtziE=lK+TqGg$3*19j%Lua@-@1=~uYv=T47iVuXzMc+CHPLuU>C G{-ST8|Ed@O literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f3b3427c0d08dc6c433734383ab5dcbc3b3c57d6 GIT binary patch literal 375 zcmZ9I-w6US42OH7;2-4Nz#*JL@X=CAC@mC^d&+}5xPv=5ghM!lL-<&K$@NqWd?EKW zO^$9%Ya|XJf-|^)E4YC>cz`E(fmLJ77VN+t5MW?tJj8M=il}_*m_>zzLKTh5hf%p) zyWCgBs_dXzW+zJH_;Gsb2?u}9s*_XR nb0Y73_SU+D4PyF~V&)tu^)M58g$|?V@(3_orW5)1h34`GdKPtw literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d178e69a984f8c5667fe573de71a7eb0fc96ae5d GIT binary patch literal 350 zcmY+9-w6US490u@ebUn*9KsEJ@a-riCJ%+=axBZN-1iLs+w}{T%EHQ zW+Gh7UVmEC_z;)_4VqY!DvOY`RtLL21pN`xYz{jnwtQN0RV$s8T*O9>Eypyg8DU4y xqB0nD6-+&e2y0Ajdqk1#hy?=)L4?|C0l`XWk7bCpM*OUtl-kp&_z%|Q?Y>#easmJV literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f9a5737cb6fdc8466686f263ec0fc69b44853486 GIT binary patch literal 373 zcmY+9-3h`#5QH!Og5uAMJy?VV_$Y*Mth=z>86+%Nghg0{Jy?WASc30y?o1Gud>5G9 z%ud#B<_ISPAx!cO`4U59cSwx@mHLAD!Rr E2b?N+VE_OC literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b2c88a69a753aad79e947bf2c0c5f5e976110383 GIT binary patch literal 386 zcmZ9H!A(Ok42IM8wNOe`i33}(1QT$1ilRiaVnw0&j>HfQ(IGlSk3BO06L5cgNqefL zFZuJwj-4mBb1mMWz!!YO0giBjGyK3W{J}7D?ipU-6-KD=32tY%F*PrVWa*KT)Y?6- zIcHTBi9yURUeT?dVrgo)GYh<4(Tg=&=+)nx zZ_GyD&sw;hZMjW8s)d{{U8xdanQg literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c9903bfa3ef760a9b92bafcc8018f0a01c406d70 GIT binary patch literal 374 zcmY+9K?=e!5Je;CO0>{JcnA+6g;IuL0z*Pq@em%uLwE@9;2B)Ic5VHWCKf-u@|jHX ze_Pi$QwJDCa0VA}1vhX95AXyp@CF~yuADo7BRGKww(FENnHghB*+et0nUBg>>nw(# zsv(3Je>3mB5Q*5l?g=pwF|+u2Z=X`nV%e@$!)MC-p>9VYpK+mTa;@e j+LF;ibu4?9J`898Q!5R^l7-DW6I8K($tri3=d+u>Z3%f> literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..222e24e1bc731d756bbded949f79096113156a13 GIT binary patch literal 350 zcmZXQ(Fp=E5JYqO;g_BkVG(xVhaVmxEHQzQa2&c|5f)(&_Fw@PU;!3j51z9jC#XXn z^wTy{nEcE$HKbm05P)>}0?^-LAzk(#DKJ(-pbIoe7HF`O3G{~Npko855- literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8648b88233dc406485a1022f538719783c7345a4 GIT binary patch literal 352 zcmZ9GK?=e!5Jlsn>-G>H!XvnFVJRYE28IbmAuA8zAv}bKaP8W4*B(Nsf2OI5KRlB8 zd1s@a+V4qH@ksj8;R#ZVQ`Y`Rs7Ogu4;{eyUBT;__yTs| zzYeDaFi+poYm) zttM9Vd=!z>=*X#1LRUBm;JsVUt#VAq2 zkftnIi3Dc;W_Am+nvza;Sr5N^Dy^|2Bl9klza3n}=H_x2akJKsZR5f(x<>1lK0j;x I=I6buZ?(I!v+4JZBlxIXLx}(*uy6*@9X~<+cmLhDL@*VN0uz? zbPy3#7&&UOVy2ogX;Z7H6@;mfW|vKkT*JG&tF>1_b)*69a#icj-2-9pFsVGN_nV63 zRXg8{s+;QjP~ISCnH%Im=dL+=Mc1ja;TSQV(-E@xD?<6*C*|k0OW(x!>|(KqkLspr FyaI@?d4>Q0 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e332bddddbde9c1b2037e8d665d30b862aa2a5c2 GIT binary patch literal 292 zcmZwBu?@m75CzbqfHtX_h%&}HS*NpfA_avjYKCA4hF}PWUS{L!jR5~+@ yF{ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d8b150ba9596cd079d02d426ea012ebecce1deb5 GIT binary patch literal 336 zcmZ9H%?ZLl5QRrD@h3vO+kq9>fZ#oZVVr>_InKc*timcR!Vav!25i7feES1}10TtI zyZddjrIzBHz!_Y?72LobJirsYz#Du(Gb7r8Jve|Ppvv;ogglh_PdHpJ<8B zRAc)qSEbbdRxzR>@9mSI&GrC?`;es7+C4Cj&OG3b8oG|9?=2fXdG6+5<3 zjH)T+Ts1Yzfr%VTOb4HMH{wH@Co{8fAc;Se_O+W+6=+Xs_Q*x^Q9|%|30_-mCn89Z tRHsqX?9kL!jPS}-6KzLS%#VMIUt%+S+dY6E^JP zz=O@bE*-Js0q1l@G9riN?Zqf9v91>z=(bRUuEJk7Vt^L6o82CPXW+1~m0SiDvGiDq`-5=I%{kj-j}P`?k2_ zV1sC6X3f2*W=V+IR+alU(BU7H_v~2qcD}Sznt|kNEfjXWRaN!{Rm)pyQW|8ybiXgvX@pQGi0} Zl)zB}oM|cJEfR#mwZDx0O&tu|`42V)n4kav literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f3bda565b07af11b047e3753f4e5661c3682a1b2 GIT binary patch literal 525 zcmZXQF-inM5Jg)VK{im>#N0!82qTB0DT*p=YF$D41RHn+1COx59>KsPn0W!?y?~j? z_-pBzLAT(+^qcAF-~TEtQ_LD{zzf)dH}Cc z!8b^!;IjUoA)FR>FQu58uWLQHEF!EJ$z;v3!G));vl>sXSE0UV7G?3amkoi$5H#yUbLtTv7jU-6<1;L76bZ7ej^FC|=i-J2 zq66VEDSH&4P&y}YlmLeycKB|I{=9_2W>Iv784~n7DpppJZE;@fv^5sdU5Q+=7-#qe D=y9x< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..09677b86d852d2b63e96cf6451036ce0fd80a259 GIT binary patch literal 352 zcmYk1%?-jZ426T#mcpeHY`_LgzycgnRZ$dTDKhHG2Zmq>hF}PWUl(DjQiO(WK7gN%%5$Phl zUyYt8BIZOP(433jdly{mtZm~on}}k74YQlQfKiRY^EBm#^)6tQ^}4TIi?rPTORJ}K u#Pe%{bi>DoaKu>pzPb>YqaL2il?YSRJD77-tAf-$%L)QXv~@B5Vg3M_TW#q8 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2774ac0814ad1f2f42fa66af76954dc1062c28b4 GIT binary patch literal 435 zcmZvYJxT;Y5Jp>Y*Hwf~jJ$xksfTcerD%(4Xi7I~Ha9glH8=GT9>N=V18*SXt9CYU zvEV`1*B|wFk=7~V4tDSaFYpHM@ByFj1>bOfl+qvsz4%5jT5HODSPR%VqZUCZd!Ya@1R#wKn?pPg?I=liscW z8opY5HjApe8J1~r+L{-O#_rQ{6&YzbPnIM&d9IFs7we-R?ASG>fElwA`xPaN2(#zR Z-V}*bY+}DIY9Bo`t8;Lo80o(={s8!fjAH-* literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3d7e2c8d27538dbd702b2c89ed0d93f2e21984ca GIT binary patch literal 310 zcmZ9H!41MN3`K(kZQ;@r3vg!(253}8CUT_894&@m2!>#YZomd?zy{pPcdAALOE2>O z@t2d1~e6t+$R!HpD2xv)rmm;)J(} UOjTnF(zetU1SZio>-nG47jCFw=l}o! literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1e7496ab6c2df5395b463d5b7c56c733212361fc GIT binary patch literal 352 zcmZXO?Fqs#5QbAl@B`@r4&e;q0M-z~(LiX(uiL>L9HK)wghM!l|Lc3##v;D(T#_f( z^lDQZ$r*US;0ErX2M_QBFYpHI%9sN3&l%t|-oVx6& zYG&I)X_{Z>JT5L@r?=MqyGHw@3gd0K33%>i_@% literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..24e1880caa49588dede615fcf52c9a70e81ca243 GIT binary patch literal 495 zcmZ9I!AV3x42EaLRZ(Q|Vh0vs58gy%nSq$c9KsxBTM#V4gC%&d1P@l=$+H$<3FDXS zn?($KL*74`{K-2{tK@M98+e3gc!hWPgm3tP4rhy$F5nWbK;Rx8;0a#f4L;xt(yINB z?wU=6nK{;4Xrg%zk)f$dgi>DTI-9ClMNrgP3zICuw?|(dw3bWpC;Nv8g z^|Hk&qbLnIRd=R;42G#x_a{oNQMYVOCbDBsYLt-`Z{kwcA>9t?M)2&3%bj$chqM;z t<6#l6;vb2*6S2-YnxPd&V|9MZcHCH?_;yIy2iva5wYVMYA4QKi`Y!-Sq(}e& literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..488736521ef673cbee2ea7ed9c4e12eca5916e84 GIT binary patch literal 372 zcmYk2(Fp=E42G+SprCg{ID{kk;KNA?r6f>$PZDqkcW?-Ya0oYW12+)PKkbPIKGOW8 z$=|lFaTYtk;0!L{3U1&I9^eUH;0@Y|a~rS)dvFA^nU+}0YgQemD;#@~UQ-fIP$p{# z%o1boJ$V@=77lc<@C?Z{sxe8<0YSCRv>;iPVw5CyDt%;gDTKam9o$m&V44rG1!i3Tr$+0{_lQ&WX!_{ DXE1mR literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0021.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0021.lmp index a9e3359f3978a798bbe1ba27b90dc2268b9ebf6f..8fdf63952e4c9db3d1414b99bf29f093c2d8e1f4 100644 GIT binary patch delta 11 ScmX@hc$Sfwok4ga^C9 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0022.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0022.lmp index a57fe987ba7f0a4449be908483afed9be0dc73cd..fc32c12e6ef373f44c0e98e78309f47cf446865c 100644 GIT binary patch delta 11 Scmcb~c$1Ntmw{s<^EChzBLg=8 delta 11 Scmcb~c$1NtmqC0Y^EChzUjs$} diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0025.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0025.lmp index f0493e20d56a98b652e17049e333f4633b0b98fa..d3c7f950dcc99a2591a4cccbadbbbc780d504b74 100644 GIT binary patch literal 346 zcmZ9I$qm9V6a^h;V-=zSs^IPm3R@C!pa6=X0fGsL!|#D6=z$t&f(i&@2uQ)wSoZk) zc^RmoQtDYv=vT0TEu7&3SGd6)9uRvG&dh<|-07BniWI z$V%39tr(YPS<$GBTkJ_|{SAzqTw-0q=fn_IE^tl-M3r-9*7mibRX)qd8H(%l0%M8- rshyl+58OC1#^(7B?V(Qz{!bI?blE7@yyQ5={Zf4&BT^q6yno^a>CSVx literal 346 zcmZ9I$qm9V6a}+53u}(tsDisMC}9iYKmim%0|X~Q9DWZpK@ZeG6Lb*9Y*P5rSoYX{ zUJ_^I*qXuycCd#tT;K{fxWfY?*Kx)$ffTl&JfQ|IP2(#OV?_GC$dR!Zij-+ew-+#z zw_P{Ft@6BRt?b0?S$*_3Ft&1uwF&PNBUH7(Srrmh%^4Y!c$#Vgrt2As>kO6FMS)aS pX4sM&hgzHU`hfP)rxgFE3AMUvEmpjw&Tzlfz{iMu4h~;G@dR&war^)P diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0027.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0027.lmp index c7ec832e8e8edab83598711cac9e9bbdfd169ed2..bea315b7d8d54e4aadc676c03c7831a64674ac72 100644 GIT binary patch delta 9 Qcmb=ZU}k6Fn8;iT01A!*3;+NC delta 9 Qcmb=ZU}k3!pU7Ma01Ch))pX(ksZiy k^#U^c{xfj)^|iGDIW5gFo`4=#tS3t<+_bO7W`GYkL# diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002C.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002C.lmp index 68679e25817bec3a86e7738f70469f7ab5c1e9ec..f33d3ed5a39197589f65af8dee7be88536b6c83d 100644 GIT binary patch literal 117 zcmZQ);9y{2`21f5NE!mMEf9MFaX1hs192`8Gcnl%0V`7<5d3Fkx3_O<>I0&_{|p@V h_AP#XO@2rmAQvP9R0Wg)vl&@IIzXaK%s_L1Gyq3|BK`mX literal 117 zcmZQ)5N7}Z6(BYQVp|~g0^)EWP6py!Am(SX2Ld6cJ|Otd$8K-m)YJz=egAnm?Co3p e{F?lbI6y8)2B-=s17`EFf^>jH`I&*{0BHbh))pAci)0p9 HFU&LmxFamv literal 130 zcmd;N5N7}Z9UwLVVml!A0OBAZjsfB{AT9vnDj?=$?gN4U9ISnPt*tFEmKVt^uwIyH E0NdXyJ^%m! diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002E.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002E.lmp index e7abfdf9346513ba30ad2bdeb4ae1b0b7c3eaddb..cbaa88f777289028dadf95a0bb9ddfef3043bf73 100644 GIT binary patch literal 101 zcmZQ)U}Iol`21f5NNNMI2@u-@u@?}B0&yG=Gcnl%!GA^;d;6v)AcKL;-oC}puMsB` It`e#f0M)P?2VyTE4h7;kAm(SX2ZH~6EcW(IO+W@Oo4tLDpI;+RCR`;{ FCjc?17bO4y diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002F.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002F.lmp index 578ccac29e426ffcaabbc9d9af50c2ee252546e5..7fb2fb46c1507aa0e29b9eb21c2fa717d74ab34a 100644 GIT binary patch literal 231 zcmXZW%MF4+7)9ZM5kVK)lo3T{5*ct&V-i^scMEA}i-KmFVfTD4Il literal 231 zcmXZW%MF4+7)4>sIDoIXv>_sj%*M3^*nkZn4_Chp*nkbt00p>qX(f6tk>q6VmrOFO zqfMkQqk@ifqBC8nqB}k4Nj(kpqBnhLH8HdA(wSX37v8K6TJwZehETC*saaG0kqQT- qTM1|jB*elV)xd*phlHt+qXsx|+oBOXBec53<6W-h9g8y_f9?mgZ%5h(mA)j=?Fo0V;p0Mk=p` zNMB@svJ%@v8W7Q=SmIuT4cLMloWTWL!42F&;1P|$7{p)&Qm_L@Z~~#v_7u$!x6#_h zL5Ddv^Mz0fnI9pW&X5Y3A#e1U_mfJL#_PkxR%tDyOl*~N#xSeOQJeV?qY$o(|CCJ1 iT0(4n&K$Lvvp?*Qm%nx4T)o@Rnck;<-AR30Zi7#=7?l

mumj1~mKG43owKj6t<}rhr@0x(W8(($JUoG1AKxY*pOv?-uiYIg z02X242a33Xgj!mBe0}{us$gQRt$lsXP%&nXzP=7OphBP+FVMbbUq7%~W*{3R-qzR0 g$JW=^M2091ld-u1CWh=BMfI_V;EzQkMO-(>mFfmUrZyz6DUq6z?+JUwqnFq2J1^fp9J(Ws5 literal 198 zcmd;N5N7}Z9UwLVVmlxX0OAxNt^nd5AYK5(TY#9Ixeo;Xv$6K|wY9YZS**N$eeLcZ wKqeIYXW<8mxB-P)TUwf%o0^({s$gQCUfw=FzP^4Wi?su7LoyF!D+>4z0M&*_ZU6uP diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0032.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0032.lmp index ffb1555766c988734fde9bc7c6bf6144aa379769..b72ebf6c9ee113b74aba140a7bd2ab51f495b340 100644 GIT binary patch literal 397 zcmaiw%?-jZ3`QLaw3I`+Fa%q0>Tk*su>)cS4oREbJOEoT1Vb%2nt&&7ZE$3;DxUJk0xYiOKTf?eIApCux>L gg_zE@5tzgdErxDw-A^6ikufjTEyQzMo4e3F0K1%)lK=n! literal 397 zcmaiw%MHRX42DzDQeJAgAZB0-PJN~v5j!AO;E*)Q%>%FnLoftGFhlv%fM_WamOfef z{5DbJ2SmnbqD2TJg%I?T z3FLf2RLiQ`_3Ug4%lRK2qp|IwO3tNl9Xd`@->IVHKU_`2x-XaNyeK~opEF6CRs56g#1IU@5DdW(lt|_~LkdL8NzcCT z*^+&V6cIhc8mk5ea0DlC1{ZJzH*g0JkS9b7ummeGO&Jx60dw1;NixYi86xjR5W24O z%%gEUG0j^m=uPR_S<638|I<}&r)$%Ey<2VJ>fX)cUwRkEm_d~=R&I$&3uf<~V{44$ L3=>P`pFO+)Qw@By literal 334 zcmb`Cy$!-J5QPmS{1ekrFasmdArf#x#R_ae75}7rVhDy{2!>z?`tUB00?~5PC*S*g zl6_h&l+=b8awI2mCKqxgH*zNr@+8BKQcJQTYclVGRqF^SOEz&&GLo42AR=N{RRI`} znj2fZwWi*t0p2DG=FJbv&M`nrExMPrau8f@E*=u$pdaI IHT|6R3;yeS2><{9 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0034.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0034.lmp index 1545209239fe371100a70e6165a94b4608954475..32bfa8e679770e9414512555c91770db64cfb5b1 100644 GIT binary patch literal 361 zcmd;Q5Mp3p`1{`lNcsVBED+}daT5?v1>zMzyc>uw0`YSo{tLvyj0_B#Kx_}hp+L;R z+6MvuS-8NAmX_w`roO)ajJ#lOTWhPgkB=`%gn_TGucN)a&BN0RMaa#~9jj1lOAC@l zH@CL7*1kTN5Ifi`kQE$k2vI?>onQi@5Xk(`2owcc3v>zCz$PGoiNbC6_4D&1OB8A@ Q(9ckFnfMWIfU^Dr0Qs?t3IG5A literal 361 zcmd;Q5N7}Z7a;Zn;#eTg2jV6mo(jY(fOt0$Uj*XkK>Qbog&7$bG=bP2h(m#xo3#%D z{$va)|M6|jc#sj zZLNKMFd=rZSs*L8*$|?FU^~GCL?Mv*p9Lriv=-KFY*=ntf611)1mL0~6x|ySc5euLUFqb}|+rHi(D&`q+W2mgZ)VI!2(sL4X5F G{|5jG^^5=j literal 366 zcmd;Q5N7}Z7a$G?;yfU30^(^vyb6f-0r4dueg?$9fS8Ywfk6p~O@Y`0h+~16m7@<1 z1eid~|14a6eeLaSZLO^>Eq#6bEPZ`VO(0=@ps<^}ho_e}P`JqtL#)}CkQmTNpk7pU zZGDu9`84~Y*b6ex#|I|H2X=E?UtbGI4D4hqLTnHZ_w{iDSuM@YAa$%je}e!Il>QF@ DdlQOT diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0036.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0036.lmp index 14ad06a25468e29b2e635d8474777b9b3bb58c08..8320dad4276c86ed9b0f4a38e3300d1e7d2ca843 100644 GIT binary patch literal 385 zcmaiwOA5j;5QbA*`#`kd#zS}rcfOhwaqYsj;9gudk8Wg+;2}JOm+%l?K!|@@14}n1UJDf;~8b6NnP>%Z3?|(OM}f ziEM9xY`Iz&oQtX~Z7?LN7au`XaC8-x!!w5oO}G%Hb9qhU9_h8X@fo5Fk^C`2Y@FZ4 uhS0F%)5U+SHmEJQzc?5*-JRs;>*LjJ>ZXlTBIV9pl3+M|h6~fEEwpdKbdL)F literal 385 zcmaiwyA8rH6h)25mk^L>G6X}=@rxZHYKqiI^oTN!od&%T7=j^Kf*}~eTqjrprQk_N z^1Ht8W6xN|Z0x`R9Ki)#!42HO13bYC3vEdH9O<;6^=YCMC;4N9*gC(9HKAe8 rr}F<=qfwi4H`t%F-L2&Ii}C6%wcCy&qT1fsB*Aj{40{}VU7>jc4`hvG diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0037.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0037.lmp index 55a6cdc8e8ddc2b094aeef21a3afef87af6b294a..678cfcf2342e7ba2d7eb41037aeb1de4468b3887 100644 GIT binary patch literal 322 zcmWe&5MW?n`19WbNCpCN3=pRSaWxQ60^(IbydQ|K0P#y8{tLuBj0_BtK&%SH20&~D z#EdL`VDO)Tt*@`Wy{)aU55jbFM`d!cLKGrPb8rB~nwx+CMHf3~UtdeJudkmUSX=;T zFxa#fA0G_CR&PwfRxh9++*p3Fb`MW4@0MnmTe)CjEkKd~3_xc9ZSe4H1##FR955T? TC#Xk&&IfuAsDP0fY|4KCv5s~; literal 322 zcmWe&5N7}Z4Qboc^DZOB!O5Jhz)?)3W!-* z`oQ2n3tL}bdwW}3Umt|&=8nqbV}&S0mgeCAiZwR@0g5he&c42uW?x@FKd`s}&|t7> zEj~UNg00?|f~{UaLAbH}VC^2BUfwOuFt>8S#9DwN|5<>}0NUW;*$U#YLpWeI$WKs@ Q0G$u?9#8=*GuV{>0CB5ylmGw# diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0038.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0038.lmp index 767aff8c1e8296b841400a061f2adfe7d9bdeddf..1a2eaa775191772509a48b03288c7fa71a6596ba 100644 GIT binary patch literal 372 zcmWe&;Adc9`19WbNJav2CJoAa(@eU?5Hg zVrG^;FyMgF|CzY^`r6uBTl-p?o16Oj{xkCS^|iZuczU(?`1tyQL>TyhB5oidZ@3UY uijW^z8C0wlsI1x77g?;WuhqMyubFCM9$4&vIS*nlrjs%Kh3<2VpaB46$cQHZ literal 372 zcmWe&5N7}Z4N;!Gf}2I4*-UIfJ3fcO*;-vi=LK+ML-z#s+0dO++5#KAzE48-g# zePF-?rT?>W_w}{4wYK)PG&eW(_5Ek%?dxlI_we*;@$vEX1&Ofm0Y%(ELf&v8eiR`; rurjDvD^OXpuP?G#TVJbpOJ6h9#5}Or0dpS2UQ8!r`U~CX7(oL7$lQi} diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0039.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0039.lmp index 7b055262bc492134ec660d90d0022740810cd3a8..64b42f3753fa7154f95f362179c505a09f33d14f 100644 GIT binary patch literal 352 zcmbV|%MHRX42GQ+@e~wxULCLlzC6AN?(MkoOqBqWY3!3z1~<~u_$1VbCR)>qc#Nj;Q?J z^EqUl?B0MJ< z+c!1!0a4$71~#CWhbK^!ox|R~#m}$F534Xx0#!B844`VTDBN6DkhvgrP|KNtb_00; DLi#$0 literal 175 zcmZQ)5N7}Z6(BYTVs9W$0^&*_?g!$9K+M6^2L${~_CO#6X8&hr>FaB2?d#)Xx3_O< z>I0&_|7>hPF%M6mC@+V-eT$!8lOI-LpaiOFpcz2bU{ScatRQni>Y$c01MLR#02Z$} A@c;k- diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0041.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0041.lmp index 5f58a6e153cdb8823ec2a4949de559e251292a11..3edbf25aefb46adbbd11bc805b4bac9edec43d4b 100644 GIT binary patch literal 421 zcmZ{gxedZF6hI9jT;XVFn1LNA30Ekn=%|pGfPylKoz6(~v<$%z48aa`Na5KyfRM2C zlCLNGUp>(kLOk*n-!*Ju4+l8I1+H*|JJd=-^kD!)Si%N&AmIonXq7c54=P&6F+qvI zoTiUh7$d4$XPHu3H;9txBS#^!R_AsSIo;*1)oD8aaZ=9aKW;pkT4yVZj(zJKl_}jW zRGKD{ZKg2N6#Zk~iQFp^nZB~H$o-m>Yg#GSf}P51p}za{n~2XSuUXv+%r@AW=^^k4 G`9A@S7n)!I literal 421 zcmZ{gxedZF6hH$cgewUJ5@H5+pd=g#1r;3?5))8R=Io3_PsC>W0=4ic5r|c&TxT#U2tBWDMSR|~N3POI68yL{T?RjHHeV>GI-9O~s~w$b?UX7> z;!q7!np8IZV?KrSD+Mi%zpvzQz`G%~*;KNSn3h0_+vR3zGZFaaXXAP{Oi QLb{+POY}mM^l_*D4y7258UO$Q literal 377 zcmbV|u?@m76hsXqK#>GG`s~08#32bitboK2_IJuF8G<1gf*}}!Cfp|iK|uj0z2-@_ z?*7~?jK-23IS@yV2_IMlWP*>6FNzS* zk`|Z{8$?xK9|zF#W?x@FuwDY9oIv?zbfuiEAVE~^oGd^wxDe1keSKU^AV2LJ E06k1`Qvd(} literal 309 zcmd;M5N7}Z2O#zV;wT`_0^({Q?gionK)e}O#BA(+Fz}z1 zv#+nct*y1SrKPX$KMOaI=jQI=>E-Ry4C3=3_z(eJBmv(hkP<$y2*?BM0tVo&FD&bSwVuR+Id-kVsIg#fBO3Pm_UB~&kB?QGXN7X BZ?FIW diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0044.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0044.lmp index 5c26d650e6c42bd5bf6cab19dd6cf7bd2c3f84fe..867160aec6dadd688de22e07de3873959660007c 100644 GIT binary patch literal 415 zcmZvYL2iOj5QYaWsMV%wdW~Mf2%-h!s*4`LcmOxu)(7Hdc5b|er|=wJ!vw$g2*IS1 zd?fSzFf;FsWh^3Px#Il;YuJK;6P)1!SGd84C-Mms_=XMqLIFqU`dU3@r=yx>#_Uwf zpr@M87hg$YE5A<_yE6Tw_B?)h8K~}O4_4Z$2mD**Gm|8#`&>o@g|nHesqHIviq2zf zpW(YSUE22Il5kH%G6-x^1#ESgh7rkAALaPRPTo+p2%~6b8`Xnb??_xcZ&qyErLD3@ Wc1!;|p3hc!b0NM*qU1UY+wg_ID{J<~V;SVMa%bLL)ws3$G@sJ(26;$=Z%cf$x_-RdJk{&+QRGZfq)|D%-*O=q$qa z8GcEUwQg^lB)Afhe71B_25eRMK}hn}hZ+94lQR^_gD_m^M%Cbt0TLH2>lK@NX|42? V&C)N|bJ;4Z-^BBnRXtbzi2v4Xmp1?a diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0045.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0045.lmp index 0b6cc0cabfd0bbe4dfb05faf104d8123d891bab5..a455336bdc3d8047a3b0892f358b99a698de742e 100644 GIT binary patch literal 304 zcmd;M;Adc9`19WZNcsYC3=ro4aV-${1Mwmt-U`Ggf%q;Ee*|I{Mg|5kAXW!rMvgu> z_|L%A*Vo?O*4EnE($d%WpMe|5b#wRd^z!y;2Jv|ie24%ql7Md$NC_WU1ZaYHi;pjg zP#;jJ87jmNQ3Vz91M5T*>udJKEe5rr59G#Xhz$^Dw1GX+3^t4nXaUe8eSKU^AkqJf JEMUpL{{S#+a{2%O literal 304 zcmd;M5N7}Z2O#zZ;us*#0peO9?g!#UK)e-*PXh5>ApQu%EQ|~cVnD18#H<{BaPXgn ztFN!Uy{)aawWX!6?>`GSkn85|;pye=(+uMCAovggUL*nECXf<7un5ou?-n0l6rnz# zP%~7BAEF8>VAOOU2K&%PGtUP@v z;6F1zkl)(c($d`A1O|P5|Ct2(`r6t&y}W&Ve0}|Zpb03*DA?E6?(Tsm${++3b;B*( z>WyqL1IP@Z>Q<$zcdh&g%sP{4n7 zejvZKwWX!Gxd{yV`u?*C^!2s1d3t&K`1tzz0YMW`kX5j+uif1PO_W6lDC&k=xYZlk zU>1-WK-H~4VYoB?vv7e$+xozwL~~n!M*L^tgz5zu_n(Cg$ZKzF138xkV!?j^2#j)J diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0047.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0047.lmp index 3fcba483780c3d0d3e56deb6823af2fa4f838172..5ec7de00d31728d4fc459045f6d161537b1e8f99 100644 GIT binary patch literal 415 zcmZ9I%MF4+5QY~asNj(_R zf0#fksG+#Gzs$PL#K?4onm2JDwtI6R`|h}7U0Ki7bj*YGjt3KSs7i4IW*wH3K literal 415 zcmZ9I%MHRX42FZ~ixyho!kHx)ffo7@S5Dj*0Eq?qNN>I(hF}S%U=1cHztg6zi1aDS zXUnm@78}9m1kT_J?m&Vkc!4+gfG_YSLTtef#NYyMpac)#8l+C+IJm2_EO0fpOC+mf zoFqk#r!~hjI`BJ9S(rXi9cq&)6|{;=q-my{v4q=)QN>>rT3SjL;yfU30^;dFyatF50`V0fz6ZoFfcQ5M3otS;r~gf5)iZU z_Mw9REc|_a?d@%Ct*tFB&CN|sO?`b3F*kP)PcLsDA75WTu$TZ)9kLiUL0`Ba*hFuL xi6B8%K8U@o-YrlE{O4rt>jQI?c?L?>*t3}5TcSFs2xcqSRqIZ*+`&?jJ)U;0{{moL)`!X literal 176 zcmZQ)5N7}Z6(BYTVjmz*1mZFv?gHX@K+MY5hX($$2=w)}x3{&mwzjl1H#Y%6Umrx! m&E3P(%iG7t*VoSvn;=9bKTtc8O0YtZ7_yN-6IprDEd~I@#XbR2HKENDT}$`GKVwfP(GqZEdZsEiKK>$bxR}9-dy_K0dy_P?h{Zl}Lgh!x{LH W#lSW*@FE)swCz757tBr&{T~1zG*j~c literal 223 zcmd;P5N7}Z6Ckz*VizFx1L6oE&IRHoAf67ytAThQ5MKadL8d++_%FcH*VohpVz2@k zeyA)~0gxIPXz~L~vj7F#+uPb&TU%P1n~??G+&w(KynTFpeW5D(fhv&%L58#NA&Y@+ TX5mFP5NO+fRxX&GAo@Q5igZ#c diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004B.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004B.lmp index 12896e9445c5b5a920d41f4957bf71b7c22d71ab..94a3cf59684caf4c0a881e56d203602a735c18bf 100644 GIT binary patch delta 12 Tcmeys^nr<)k3o1Nb1owQ8C3%- delta 12 Tcmeys^nr<)k3oDRb1owQ8EFGA diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004C.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004C.lmp index 0d77c6f92949879e8625fdf4dd5366e01c1e7d19..6c03cfc75cc9f32fa567c1aeb12262236722d2a9 100644 GIT binary patch literal 246 zcmd;K;Adc9`19WaNO}Qr91s@)aT^fN0^)T*d=QAw0P%GoegwpCftZoE4;B1p;P2~e zZ*OaBZEb03Zfg$7uxw(6IdU^Z!`1<;hECx3ZqL+~mVQDi&h?A|ak1!MB94;1! G_WuAk9$uON literal 246 zcmd;K5N7}Z3n2Ca;y55K0^&9xo(06~fcPK~p8?|QK>P@Z-vTi!Zyzf7&%)o=*WTXN z*4o{3=C30tO>+cK6+1Akv%dwW}3YimnOb8}NuQ(qrM%+1}y)63h($Jf`7 zJTWBm_<(kR&1-3aSpS~^=#chyh!xGvK*9fDr?s^~>;yZ5nFlD|+KO-kD;H3pr3L0B c40%i=Fs)(W!*mNM2%yfRS`eTGDQ3U}03k58*Z=?k literal 487 zcmWe-5N7~^7$D9A;wB)T2E?m?cpng70^+AY{2hon85tO)fLIfVt$^4Eh~t2`5QtlW zcqS091>%E1d=-dUdHYboe-{3}zV`OEw$|2`mgeTBrl!6=h?twZho_gfkB_gfA9-R( z=J5gT0Grp+0ytNhK22L)ZKuZhENf`2& ZMqpaQ!iVV=P!K?!N3|e83sTI02LQZewK)I) diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004E.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004E.lmp index 7756b97b86d4038c1032f5692a00419e5c92cc65..f1ba744b9cde90ffd2daa3ee4fa7a22a6eb41fa8 100644 GIT binary patch literal 389 zcmb7<$qm9l3`IRG;sSxxKoNAnmZb&g0f_?0c0n$JCg_0{D1ZXEA`Qz8{EOe#EDE{1`%vv2X3t2EU+>I_v&Q<@CEJ3znz!T0D3%rg4E_4r!vcvM$T bjygl|$!p1KiM84R{?^*-o9C$Ud|&=_fo91_^V9=xf1m+MC&bzN0uX>Cy)wM1U( zV!2vxk~Gb-JkNiqAsf20I_d?8`oGQ8 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004F.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004F.lmp index 0055e27d817e9a493d52332cc0e9d95ab08b8154..71be6fbd5dcf3ebae65a251b940115706ef53e42 100644 GIT binary patch literal 414 zcmbV|I}XAy42E4=C{Q7U*f<75h(mA)j=?Fo0V;p0Mk=p` zNMB@svJ%@v8W7Q=SmIuT4cLMloWTWL!42F&;1P|$7{p)&Qm_L@Z~~#v_7u$!x6#_h zL5Ddv^Mz0fnI9pW&X5Y3A#e1U_mfJL#_PkxR%tDyOl*~N#xSeOQJeV?qY$o(|CCJ1 iT0(4n&K$Lvvp?*Qm%nx4T)o@Rnck;<-AR30Zi7#=7?l

mumj1~mKG43owKj6t<}rhr@0x(W8(($JUoG1AKxY*pOv?-uiYIg z02X242a33Xgj!mBe0}{us$gQRt$lsXP%&nXzP=7OphBP+FVMbbUq7%~W*{3R-qzR0 g$JW=^M2091ld-u1CWh=+p@`heh;<7GDBuhixWWy@5gEZ4Ca{4W?BNInI0OBzQUcXH&$2X45@SxbR7)A6 zPG|GQaur2!yrwES{E`3Bo5P#qvrjjrc-44hzoTk+5hrhrKNHvYyS0y$la*S#Af7di t%E7qOoIV;kNJkEv;ic5ctkUYKX3wa$cYXSlePig_yro>XW;~ab?*rTzm|*|_ literal 405 zcma)%$qm9V5Jinh!lnoXgeZa{xUt4abbv$&NZi3$PMIz!gEHuX9>TK&BEW@_UJ}39 zf(cAv3wt=g2@3H0@?E7DiR5{frD>8FbG9W?dIRii zzF4l-ajf-*a(eiq|MB(a_4e84G^H1~_UO)%jL6N6JoTt0{d3{P~u; diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0051.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0051.lmp index 0668957059e0686a8cab1315214e7f36666c03e5..8b5d30822788e4c1f4747a0f3a0f57082111e1a9 100644 GIT binary patch literal 405 zcmZ{gO$x#=5JsogA4Em8SMV6FwQA$a1GpDFf?(6MyWkl-gs1Ql9>SeaUmE|xffq85 zFO#$biA3a9Caf!1!xnaMfFqpX3>UaUHxL=Y7*?=>Jv2k>s;swIO_sTR*tRw|^F^XH zU9CeG&u9~s(g!_ji|Ipr8IC8aGSVkAnZ|~3TB)TwC*1IG?WWV-vc=}sdYM+yw``C^ waeVj;(!Hvb$ZNypTBp8T-23MW1$9VS(_`IJg?|Iyq?*IS* literal 405 zcmZ{g%?*M;5JoZb;~z2T!3HeDv!Jq^D8RdkC78$x-Zs`?5msRn7U3D+vY=?TgsddFAl9M5xP* vK52q? diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0052.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0052.lmp index f54b5320f89f2faaf873f0ba2c7f66369522d52d..f1e0a659abac0fe844cccf3962cbcfa4a23e7eb5 100644 GIT binary patch literal 380 zcmb7<+YQ1n3`L!`6ai|>3hclPeL%_ph#5LW9{uzuLoft8Fa%2=q;Qj#s(fPUMA4CD zUvH@(qPMH@orF!#N+#%Qg4F%Pb+>gI5i zvTaZQyD(2q^K$GcEjDY3Stv(~QKhN3UeDYzxHib#H&&KS$TE*&X7Pk?3yJkN@uW1X g@rVe^Y~2{<6@F^CEKVSy)`&FRpF}?6CiXA84^}LVcK`qY literal 380 zcmb7<%?-jZ3`PT_EkbI`jWatiL(@Xa0EihnM1Feoks%m@9TRaH;yRB&kUDk5)!IFq~ZSck~5YoekptatUQa@ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0053.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0053.lmp index 2d5a09c652611a257904fe34150ad916d189fa6a..8e8ff514ed7e20d274f9b8dbf0f73d96404c2c7e 100644 GIT binary patch literal 355 zcmbV{yA8rX42GQt1OXx?JFo*CN&+MlnSmu}?~w}qD=-8@Fa$%e08;o3L8O2NOP}xb zovpJ|Nk!z|u9$1GCkJvQCvqkiawRts1tN2@AWKq{ID*DB)Z9h`z&i&_V!#-hFrg{d z8w-s2Xm%=t8PMdkTMJYDQj)SN%L~^l>zs%CwEp2rQ@y_J^_Jz^>2z7{0jo|2mM?0^ Us>ZV_;mw-owgK1H7OV literal 355 zcmbV{%?*M;5QSG+z(fPy=z$)*89)UO)L;`{_lJ{tEm(v_ScFAb0=`j<9Q5KO-|pty zH`&=#WlCyIT5=#qaw2DPAy;xEcM?pL%1BODq$RTeQp>5VeH;SbIUv=5F*H$3Q*E{u zNO)=XBEtmeO4^-;X?`i4GF6n78^s3a;XbW@xY{(YXGgtt{dO{4QF_3NlY#XY6*1L$ Srsh0Z^ZaedZ%ZwPy?+3aHG_Nr diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0054.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0054.lmp index 21ee1528024c8f02adb9328546ebb079601ed74a..898c3c24967e28ae7fe3c1da057d589b92e89c44 100644 GIT binary patch literal 342 zcmaiw$qm9V5Je}5MVKv8nxF{I5Fob1ojV;+fa8SQ-06WHD1str0%X3&CO3qoXN_OJ z#^dCa6Vc0;*bm?cPT&kK;0kWw4j$kM-k`{cmS6=m$oeeH(~!Asn}#`->y4BOR?3j_ zG)+fW*H*+V3b)%=m4)&&7gKJ7(fXHKq!bzwj50W37o+NT)_?8!2>+O3ur~O0&7qKRYa*olNh_MZ3F8>GpJ2fH^KX? z=e^$UjC0(u_!-7#M@vA17Gtxe(1Z%Xf1P5=hIiKP`ObI*v bCeP%U-1qP4;eawB&&*%Uas0l*HwTqI^v{7# literal 343 zcmZ9Hu?@m76hw_=3k8Cqqi2V#KoYPin1B&j0ozHLh8>uJ4H$qO7=p&!_YcD2q$lMr z-{ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0056.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0056.lmp index 2b700aed42d704deaef6897ea9e3cdc666c6ec7b..4a57ad9a2f7144dd4f59ca88681c577ad86ebee0 100644 GIT binary patch literal 329 zcmWe+;Adc9`19WfNQMG&A`s^TaXk=E0OCbJyakAl0P#g2eh9>$ftZz%fk6z2)qvOp zh#i2Kk);m|{xh)m^|iINwgP$o890G#H+PSg7BG(+!t?ZMZU*ytV0>?%rY4YbUa(dV zPcLsDA779NBT%HTueGHGBmfp+0UFZR*W3)``hiria{#$bP!75zrgls#7%*Ic?o3oq JAbAh&X8`_QGhKLar3J0EiGUkH-zWu)!Yo`^T7DtK21#^<-B069-dy_ zK0dx65mul`UteoW3rGMg!T~g-udlfo$n^uM;N}2wo1h$YNlfjSR(*n*ZISc45%fx>uZ0x^?_ z183mgdGmgraD@f? literal 472 zcmaKo%L&3j6h%i!)F8%XDzE}8aN{@823)!pEWvyxyKDqY5Ntt95UjxltiVM)Gl7^% z#0O__@4R_GPk2Jb7WQy}Bb?z14|u{0-r%%^@L&id7{eMiu!9gzaDf}#!R}^dZ2#q*?h6|qewgM*YSfeR7r!X6|72672=~G6rN2n6^XV~mP2o?l;}9> wP36-lZ=t<8 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0058.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0058.lmp index b3e9eca300ceb32a0a198e5562a2db4028646fad..a447eb80f513e10271448a859fe56a6ead9a2723 100644 GIT binary patch literal 436 zcmaiwI}U(fS8Sufk6O>Wq?=@h@F5q42ZLU zxDkk_0r7GmW@qXH0zNSLpN*xjudS`Gj~7TcH}&=XXJzZ_Yj^i(?d#(KvYLH;L4qvo zKtVT%D3A#h^#cp@LxeqB`&xVmiM6+RczU(?`1m$8f$iZ1xuOj$)C^+&=Kz}A>gDYN q^11tt~HbM7c_a4@uzz8su-~<5g>z>L0 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0059.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0059.lmp index 05b9316e0564e17b4360a2d7b5e487fef91f600a..635bcbcf87d6c41b3a66e806adbd0004dff99a63 100644 GIT binary patch literal 387 zcmZXQO%B087>1`+KPAD!+7TSVl4_N$#KP9zPOOyLeQx0v4&e@tU@58Ro2eisc_#C| z-_LwAJ<~D9Jc|YU3f8cNGhE;bH@L$Ce9xFJ^kD!)NMQ+U*uV}dzOV{E5Xo~6UQOgQ zj*cQ>MI%y}I?l*hRgr9O&4x24nn+2O?(qxrXV0wNA^Vg^llVYpYCW&5-E*w@+X`AD z$2d7m%am$}wo;ooH6^Gj&{&)xRe4m}W*C{yfp!-rPB+VO>8@dl^+`I<@6ccG|NKe$ FM=$$4iY@>E literal 387 zcmZXQOAY}+5QYacW)P2s#Lf{M!O~;Ku$5TY+S`ehdDxX(xP?QwgCp3FuewJNoqS3E ze?7XY`_918vxY6~-~bo6!VT{5fG1Qdj?;r7j9?5gY+wg_ID%glPEmJ7@|=rT7dcO7 znMk{)5h+|BXJRc+Bsm!~u;yG7DM{iJe&PPvOJjG*KIgM}n35SA&+BOS9BcKqf|f`Y zM(LtVX*AGAY7?s#1XTqZ3nQc|k4n=FBhfj~_QA;NW;rh1HB7Otr1Sg^{k8w+Ps%@f E0a9v+n*aa+ diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/005A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/005A.lmp index 592c832e6ef253bd3113f7e1cae199f760ded36c..b9216a5e12375998fbaa7eaba7931513af5c3c20 100644 GIT binary patch literal 434 zcmZXQ%L&3j5QcYsB|bn9EW#qZ#;A#S@M;5IEJ4U?Z*%ct177XIA}qoVg!M~8;v<1? zSiU8*Gyg=5l~OOerS9PfFGw)c5R6oa^-0=Bqc>Bn9KutCtxOmNERBCqzJEbrI*FsP+whDW2c} literal 434 zcmZXQ%?*M;5Jtg(ny6q*j5Sz=$T_BIzUHsIAREW#qJ0pCJEg-zaO z^ENv>^UaKfq1PUcaE1hK@PH@0;0>l}7;{*{3J!3B3tZt2gPyRawRWjmR!GB+OSc`DZMrVNCH3c3Js+1e w4K*(PHc1ow>j$Xc-sxED?BD9qJ7bc9@|w}Bj0j69-s*%1ND8}*(<%4j1CpzqWdHyG 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 0000000000000000000000000000000000000000..24e73edd0ba7c1a25d2c1e6cf0ad9b42ff996eab GIT binary patch literal 316 zcmYk1y$!-J5QQ%ZNrX@&3YK6JoJ66da=`#hK$*XS;s#&_W?%+JU<7KK@WlyWOP}w( zv;9t9OC}=k!LaY)07p2%87^>z8{FXmPk2EXh-_dBNua7j9I3X{MNBOlRFtZAMQKMJ zF3~y0*0^A$+MB#kYb($5e)5uWzB4YTayO>V9QW`1GQE^>h@V=tv!7G*RvYW58o!e; Ux$ipF6xGzV3+791rC%|805^hkivR!s literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7afb1e282167176c3a9252355aaf5302f368d8cd GIT binary patch literal 316 zcmZvX%?-jZ422y^8v&}skpVb!WCi-8PC$oXhBWE%ofv@;n1LCXff0H!kJ3Vsi1fww zll4hnODZCrX8e!jL>xJj3%QaTxswO!$kK>x$d>HLo|qW#XU9e*0opbMz_M$cbAU?9 z@Q~#mO(kLOk*n-!*Ju4+l8I1+H*|JJd=-^kD!)Si%N&AmIonXq7c54=P&6F+qvI zoTiUh7$d4$XPHu3H;9txBS#^!R_AsSIo;*1)oD8aaZ=9aKW;pkT4yVZj(zJKl_}jW zRGKD{ZKg2N6#Zk~iQFp^nZB~H$o-m>Yg#GSf}P51p}za{n~2XSuUXv+%r@AW=^^k4 G`9A@S7n)!I literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c5569beff8b248bc044bfebd4eb9849207e1f4bb GIT binary patch literal 389 zcmWe&;Adc9`19WbNJas19uPMH@iZV_1;qP+_!1C51L9vm%*V*UpajGgKXe_vl)TWf1eOLKD*2=w(q#N6CHJiWYqe0+WVNEZW{=iSoM)P$tBwXY8- z*4Ib2m`_U+vRlCBA>79b^oJWzjGd#U1)C_)cA#H;!G3|OWrv71gFFoqYy%p=0b~FJ P11QAE3=S+#2=yNTGAop- literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ccd15296a879196e60e458030805ec6694a7112b GIT binary patch literal 377 zcmbV|!3n}Z5JhK`2nw25gFVMi%zpvzQz`G%~*;KNSn3h0_+vR3zGZFaaXXAP{Oi QLb{+POY}mM^l_*D4y7258UO$Q literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..944a38c1aa58392e9f77f78c0008a70e9f8aa1c1 GIT binary patch literal 291 zcmd;Q;Adc9`19WdNQMD%77*6~@gyK#2E@C7_$(0L0OH3${0@kJ0x=6C0|P%0O93$> zZyzf7&%oc;*WTXN*4o z_|L%A*Vo?O*4EnE($d%WpMe|5b#wRd^z!y;2Jv|ie24%ql7Md$NC_WU1ZaYHi;pjg zP#;jJ87jmNQ3Vz91M5T*>udJKEe5rr59G#Xhz$^Dw1GX+3^t4nXaUe8eSKU^AkqJf JEMUpL{{S#+a{2%O literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8f128e1554abc563a3f46bf22f87beb121759e3a GIT binary patch literal 532 zcmaixKMsO06o((xh=0TA<{>-;g5U+59bMd=S}5CF-93P#2XOQN?yerdiKPB$qX|Mn zldpaK^2&R(a|(#4G&{@(Ai)V-zzsaW3zT5$5iP(HgkTHy;0PF;!4=%W6TE>hh-*P3*FU#kS?l#S9-;O` EA4mnoIRF3v literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..36751642ac3af62c7629917e79558575646e8887 GIT binary patch literal 343 zcmbV|%?-jZ3`X4_5R^hr%)kl^fM_Z0ffd++1)8LlID8{81VbKk>ZKYa5Bql3m|s`?>vFp*_PXrn1`E#3@|>z1)cmcCSN_If3N-Bb Vh$x}37Dj8oA4mQRFyW(pxEFgCf13aR literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..38e9ad6e72ca85963e0826fe15fa124befbec0bd GIT binary patch literal 389 zcmb7=%MHRX5JcB}lnVrMr3tFw@6Z4eJwOSGTMbHB+Pyhu`04F5#oFEi(L9Fzw z(MY>H>qHU}d3w#eha*@x!5J=ag&W-A0g)1!z!YY%g9E6c`z|jd=gQLBqA(`Uvn+G2 z_U4P_YQ51qO}Bq}@n>G>4XtYM-f3`x(T|)f7@ebgL9-|5F50rxpgS~K5}>Q{DrRuV Z)W|u;YUHegCN1-q+dRHHU-2ca@-L!tlE44} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..08a399b7530fff138b4f6a54eba6fc76fd456e28 GIT binary patch literal 431 zcmb7=%MF4+6aW_m^`IyTWmtw$RPgS_7ECMw*!A`b&>rl;D(t}~)>$M9T#PT7Jxum} zBNZ#9tW9|jZ~_AtxWOGB@B|C7r_>x4u!kdPxPm{CcG&(@#{70JkLemZn;X5 z^=6xfIiRRv jOjH$htB^8o`o=~xRAZxEwNliPzijhN)uDWj*9rRq^bVr` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b140bd30219958477d02b549d43e590eb3524ac9 GIT binary patch literal 340 zcmd;M;Adc9`19WZNCp9M8W2|jaUT#b0^)5zd;*AX0r5K^W@2Pu5CdXeAa(*`M&3SD z@SlOdudltmt*y1SrKP#Ksi~>24?c?L?>qoK}*gS8zc`#dBy;~r*|A&gS z0xf6;3&Gvt>DA)ngYJ&jz7`C3Ad9gB{Qz`tYhND+kl74#G8@EeeSMrj7Sv2e7KjtL JSfK&&9{@w)f{FkD literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0a8c991cca695e6bcc4a239523974830a1384d18 GIT binary patch literal 335 zcmd;Q;Adc9`19WdNCpCNA`lk=aSISn2jW#gycdX10P$@geh{3=C30tO>+cK6+1Akv%dwW}3YimnOb8}NuQ(qrM%+1}y)63h($Jf`7 zJTWBm_<(kR&1-3aSpS~^=#chyh!xGvK*9fDr?s^~>;yZ5nFlD|+KO-kD;H3pr3L0B c40%i=Fs)(W!*mNM2%yfRS`eTGDQ3U}03k58*Z=?k literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a1c28d9ec1ef7ad48c57bd85567f8b01e77b21a0 GIT binary patch literal 372 zcmWe&5MW?n`19WbNJas19uPMH@pK?w1H=b`_zDo;1L7Az{2Pb`7#SE;f!GR&{eU5h(mA)j=?Fo0V;p0Mk=p` zNMB@svJ%@v8W7Q=SmIuT4cLMloWTWL!42F&;1P|$7{p)&Qm_L@Z~~#v_7u$!x6#_h zL5Ddv^Mz0fnI9pW&X5Y3A#e1U_mfJL#_PkxR%tDyOl*~N#xSeOQJeV?qY$o(|CCJ1 iT0(4n&K$Lvvp?*Qm%nx4T)o@Rnck;<-AR30Zi7#=7?l

yM1+xT$d>jU)*3A)2o-!v+9c!jZ}V literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7598665fa5c90a26d45a0ea1422ef9ad2ce61cd3 GIT binary patch literal 405 zcma)%+X=!z5Je|OBSA!BunLRt&u1dofnW)O|GIg6WxB8o%diVe5aQWHG3t*4XOp?R zJ9}>+p@`heh;<7GDBuhixWWy@5gEZ4Ca{4W?BNInI0OBzQUcXH&$2X45@SxbR7)A6 zPG|GQaur2!yrwES{E`3Bo5P#qvrjjrc-44hzoTk+5hrhrKNHvYyS0y$la*S#Af7di t%E7qOoIV;kNJkEv;ic5ctkUYKX3wa$cYXSlePig_yro>XW;~ab?*rTzm|*|_ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6d0285f0378b7e579879640219b2f5585bf10ed3 GIT binary patch literal 309 zcmd;M;Adc9`19WZNcsSA6cA?taWxS40`USM-VDSif%rZUe*t0+Mg|6HAl3n5CiXrU z_|M4M*Vo?G*4o2_IMlWP*>6FNzS* zk`|Z{8$?xK9|zF#W?x@FuwDY9oIv?zbfuiEAVE~^oGd^wxDe1keSKU^AV2LJ E06k1`Qvd(} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..898c3c24967e28ae7fe3c1da057d589b92e89c44 GIT binary patch literal 342 zcmaiw$qm9V5Je}5MVKv8nxF{I5Fob1ojV;+fa8SQ-06WHD1str0%X3&CO3qoXN_OJ z#^dCa6Vc0;*bm?cPT&kK;0kWw4j$kM-k`{cmS6=m$oeeH(~!Asn}#`->y4BOR?3j_ zG)+fW*H*+V3b)%=m4)&&7gKJ7(fXHKq!bz1`+KPAD!+7TSVl4_N$#KP9zPOOyLeQx0v4&e@tU@58Ro2eisc_#C| z-_LwAJ<~D9Jc|YU3f8cNGhE;bH@L$Ce9xFJ^kD!)NMQ+U*uV}dzOV{E5Xo~6UQOgQ zj*cQ>MI%y}I?l*hRgr9O&4x24nn+2O?(qxrXV0wNA^Vg^llVYpYCW&5-E*w@+X`AD z$2d7m%am$}wo;ooH6^Gj&{&)xRe4m}W*C{yfp!-rPB+VO>8@dl^+`I<@6ccG|NKe$ FM=$$4iY@>E literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..69858c5348de6cd5f968334e996c13ead03206a9 GIT binary patch literal 410 zcmWe-;Adc9`13yoNTvXB9uQXnaR(4j1L9>sybXv?0`XlS{s_dZj0_BtK&%VI4nQ0L z#0fy02gEf%+yTUsfS8534+Q=*v-b71wYCCTOzc3Ghlghikj=>1*Vpb2e+Dif&&}P#!_y1Q<%V;;n?cgp_+ZUmV0lKMb`WTV ya9P=~F&TN06#?1*8Test0P1UQYHEUsL0sbPYz)NiKpYLk`9RzR z#Jxbg0Eo8$@d+Tl1H>PIn1zXffswZl75r!5@9S%CZ)w}27xqEnc vdU^Z!`1+D81~(6)myr))X){EKldZ20%ETgz>L@ZCfX(rP+fk5^$BZ8U2WHM! literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2c1db826b77cf9e18dd32bd26d34ed2f93fc3691 GIT binary patch literal 572 zcmb1S5M*Fr`13ypNY(-IBp_Y}#Jhm_91uSO;;%r=z{tQL48-a{Yz@TzK%5N3EAdQ2q|z1$Ax0i3`YT)-9Fz#Tlm6THDNA)0_Gn1MOigCj`#667coY1^g|aWulX zSYrIjQ5hrVy0%{aTFh4KO{KLl+rKlkF;~pihPMf7y%34SC>{K^nr-Zkm%CN6LZt4T X%Dpqj_$`%+#?N_*vhbgx7wX*yUtfd- literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fc54d1d887e6c8abea6ebe511d097c4f34af033a GIT binary patch literal 482 zcmWe*5MW?n`13yjNEQKc8xYR|;&niL2#Bu%@k=270mST#3=CpGtO~@&K z#F;=`2gH+scm)ve0pbfl%*fk^3jQuZMd*f~HvUteF4 zE7{p091xp>6=)gQKQQ|dUjNS^(AU@Aj_h%ezd?dX{)TuQO%NVJ$SPqWgkmJnM9lC8 E0B$U}{Qv*} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..40072466c7260a1b727a82608ed15215723b2fd0 GIT binary patch literal 326 zcmWe&;Adc9`19WbNJas19uPMH@iZV_1;qP+_#zNL0OI#R{11qE85tO)fmj2GO@P=A zh#7hNP{Dr&{=UApw$|2`mgeRr5a{cJh`G6YczSvJ`1tzzkt_x_&%33isR^u?kq=^N zi+4+3A4G_itFMm`*QcckVmCxF+$n6FeSOVv9ykO{oyVzLU2UlY!Gi%AXwN%w3rA SBF-QzPB6wllZF3-Dcl?NZ+>9_ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..af0ceb5c09289e4d7baa7041672af1437af3a8b2 GIT binary patch literal 570 zcmb7=J5s|i6h)t%Kmr*)p@Noz1u(23IP!ZWClUt4od)zq5wRj)?` zqHR;p)T0RdpqHwHP1RKz@L%d5nX}rDb{AjTWcuCh&zaVzZagu;ljN4Qc;AQC14(N7bt76{VQU3!$sJ8Jv5W7lyTWZW$q~%MEifW>%Q|mPm#4 m&cDSV1nwyNj4(!PC|84Xzx#;ozw(#s{66*C7tDRuyV(bNVvQXD literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0401.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0401.lmp index 702b1afea7d75eb776f9e861ca9ecd895b4cc6ee..3f1034f5c64793569efc80e4b5d68365496376c1 100644 GIT binary patch literal 150 zcmYLJQ3%ME})2nEr@ZtTUo1$g9O0p2aZ0xZBXg+AE9Pb8USczgz_k~P8vGc2&e20I*Z nf)sr#q?)N-ptw7l0Zw9md&jz||FO~L3R5opJAHnJ^eNE*!#6T6 From 48f39f2fadfc3233dd96c838a9f6d9a079b05ede Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 15 Feb 2019 19:16:08 +0100 Subject: [PATCH 25/95] - completed the BigUpper font. --- .../filter/game-doomchex/fonts/bigupper/0021.lmp | Bin 0 -> 142 bytes .../filter/game-doomchex/fonts/bigupper/0022.lmp | Bin 0 -> 133 bytes .../filter/game-doomchex/fonts/bigupper/0023.lmp | Bin 0 -> 295 bytes .../filter/game-doomchex/fonts/bigupper/0024.lmp | Bin 0 -> 350 bytes .../filter/game-doomchex/fonts/bigupper/0025.lmp | Bin 0 -> 300 bytes .../filter/game-doomchex/fonts/bigupper/0026.lmp | Bin 0 -> 343 bytes .../filter/game-doomchex/fonts/bigupper/0027.lmp | Bin 0 -> 72 bytes .../filter/game-doomchex/fonts/bigupper/0028.lmp | Bin 0 -> 176 bytes .../filter/game-doomchex/fonts/bigupper/0029.lmp | Bin 0 -> 176 bytes .../filter/game-doomchex/fonts/bigupper/002A.lmp | Bin 0 -> 160 bytes .../filter/game-doomchex/fonts/bigupper/002B.lmp | Bin 0 -> 120 bytes .../filter/game-doomchex/fonts/bigupper/002C.lmp | Bin 0 -> 92 bytes .../filter/game-doomchex/fonts/bigupper/002D.lmp | Bin 0 -> 140 bytes .../filter/game-doomchex/fonts/bigupper/002E.lmp | Bin 0 -> 80 bytes .../filter/game-doomchex/fonts/bigupper/002F.lmp | Bin 0 -> 236 bytes .../filter/game-doomchex/fonts/bigupper/0030.lmp | Bin 0 -> 227 bytes .../filter/game-doomchex/fonts/bigupper/0031.lmp | Bin 0 -> 135 bytes .../filter/game-doomchex/fonts/bigupper/0032.lmp | Bin 0 -> 243 bytes .../filter/game-doomchex/fonts/bigupper/0033.lmp | Bin 0 -> 233 bytes .../filter/game-doomchex/fonts/bigupper/0034.lmp | Bin 0 -> 211 bytes .../filter/game-doomchex/fonts/bigupper/0035.lmp | Bin 0 -> 241 bytes .../filter/game-doomchex/fonts/bigupper/0036.lmp | Bin 0 -> 235 bytes .../filter/game-doomchex/fonts/bigupper/0037.lmp | Bin 0 -> 188 bytes .../filter/game-doomchex/fonts/bigupper/0038.lmp | Bin 0 -> 231 bytes .../filter/game-doomchex/fonts/bigupper/0039.lmp | Bin 0 -> 232 bytes .../filter/game-doomchex/fonts/bigupper/003A.lmp | Bin 0 -> 112 bytes .../filter/game-doomchex/fonts/bigupper/003B.lmp | Bin 0 -> 119 bytes .../filter/game-doomchex/fonts/bigupper/003C.lmp | Bin 0 -> 186 bytes .../filter/game-doomchex/fonts/bigupper/003D.lmp | Bin 0 -> 160 bytes .../filter/game-doomchex/fonts/bigupper/003E.lmp | Bin 0 -> 186 bytes .../filter/game-doomchex/fonts/bigupper/003F.lmp | Bin 0 -> 255 bytes .../filter/game-doomchex/fonts/bigupper/0040.lmp | Bin 0 -> 323 bytes .../filter/game-doomchex/fonts/bigupper/005B.lmp | Bin 0 -> 236 bytes .../filter/game-doomchex/fonts/bigupper/005C.lmp | Bin 0 -> 236 bytes .../filter/game-doomchex/fonts/bigupper/005D.lmp | Bin 0 -> 236 bytes .../filter/game-doomchex/fonts/bigupper/005E.lmp | Bin 0 -> 183 bytes .../filter/game-doomchex/fonts/bigupper/005F.lmp | Bin 0 -> 164 bytes .../filter/game-doomchex/fonts/bigupper/0060.lmp | Bin 0 -> 92 bytes .../filter/game-doomchex/fonts/bigupper/0061.lmp | Bin 0 -> 278 bytes .../filter/game-doomchex/fonts/bigupper/0062.lmp | Bin 0 -> 319 bytes .../filter/game-doomchex/fonts/bigupper/0063.lmp | Bin 0 -> 286 bytes .../filter/game-doomchex/fonts/bigupper/0064.lmp | Bin 0 -> 307 bytes .../filter/game-doomchex/fonts/bigupper/0065.lmp | Bin 0 -> 286 bytes .../filter/game-doomchex/fonts/bigupper/0066.lmp | Bin 0 -> 216 bytes .../filter/game-doomchex/fonts/bigupper/0067.lmp | Bin 0 -> 346 bytes .../filter/game-doomchex/fonts/bigupper/0068.lmp | Bin 0 -> 299 bytes .../filter/game-doomchex/fonts/bigupper/0069.lmp | Bin 0 -> 134 bytes .../filter/game-doomchex/fonts/bigupper/006A.lmp | Bin 0 -> 222 bytes .../filter/game-doomchex/fonts/bigupper/006B.lmp | Bin 0 -> 318 bytes .../filter/game-doomchex/fonts/bigupper/006C.lmp | Bin 0 -> 194 bytes .../filter/game-doomchex/fonts/bigupper/006D.lmp | Bin 0 -> 316 bytes .../filter/game-doomchex/fonts/bigupper/006E.lmp | Bin 0 -> 316 bytes .../filter/game-doomchex/fonts/bigupper/006F.lmp | Bin 0 -> 333 bytes .../filter/game-doomchex/fonts/bigupper/0070.lmp | Bin 0 -> 264 bytes .../filter/game-doomchex/fonts/bigupper/0071.lmp | Bin 0 -> 347 bytes .../filter/game-doomchex/fonts/bigupper/0072.lmp | Bin 0 -> 310 bytes .../filter/game-doomchex/fonts/bigupper/0073.lmp | Bin 0 -> 327 bytes .../filter/game-doomchex/fonts/bigupper/0074.lmp | Bin 0 -> 212 bytes .../filter/game-doomchex/fonts/bigupper/0075.lmp | Bin 0 -> 296 bytes .../filter/game-doomchex/fonts/bigupper/0076.lmp | Bin 0 -> 278 bytes .../filter/game-doomchex/fonts/bigupper/0077.lmp | Bin 0 -> 308 bytes .../filter/game-doomchex/fonts/bigupper/0078.lmp | Bin 0 -> 324 bytes .../filter/game-doomchex/fonts/bigupper/0079.lmp | Bin 0 -> 262 bytes .../filter/game-doomchex/fonts/bigupper/007A.lmp | Bin 0 -> 366 bytes .../filter/game-doomchex/fonts/bigupper/0430.lmp | Bin 0 -> 278 bytes .../filter/game-doomchex/fonts/bigupper/0431.lmp | Bin 0 -> 313 bytes .../filter/game-doomchex/fonts/bigupper/0432.lmp | Bin 0 -> 319 bytes .../filter/game-doomchex/fonts/bigupper/0433.lmp | Bin 0 -> 199 bytes .../filter/game-doomchex/fonts/bigupper/0434.lmp | Bin 0 -> 385 bytes .../filter/game-doomchex/fonts/bigupper/0435.lmp | Bin 0 -> 286 bytes .../filter/game-doomchex/fonts/bigupper/0436.lmp | Bin 0 -> 374 bytes .../filter/game-doomchex/fonts/bigupper/0437.lmp | Bin 0 -> 275 bytes .../filter/game-doomchex/fonts/bigupper/0438.lmp | Bin 0 -> 316 bytes .../filter/game-doomchex/fonts/bigupper/0439.lmp | Bin 0 -> 331 bytes .../filter/game-doomchex/fonts/bigupper/043A.lmp | Bin 0 -> 318 bytes .../filter/game-doomchex/fonts/bigupper/043B.lmp | Bin 0 -> 322 bytes .../filter/game-doomchex/fonts/bigupper/043C.lmp | Bin 0 -> 316 bytes .../filter/game-doomchex/fonts/bigupper/043D.lmp | Bin 0 -> 299 bytes .../filter/game-doomchex/fonts/bigupper/043E.lmp | Bin 0 -> 333 bytes .../filter/game-doomchex/fonts/bigupper/043F.lmp | Bin 0 -> 299 bytes .../filter/game-doomchex/fonts/bigupper/0440.lmp | Bin 0 -> 264 bytes .../filter/game-doomchex/fonts/bigupper/0441.lmp | Bin 0 -> 286 bytes .../filter/game-doomchex/fonts/bigupper/0442.lmp | Bin 0 -> 212 bytes .../filter/game-doomchex/fonts/bigupper/0443.lmp | Bin 0 -> 273 bytes .../filter/game-doomchex/fonts/bigupper/0444.lmp | Bin 0 -> 290 bytes .../filter/game-doomchex/fonts/bigupper/0445.lmp | Bin 0 -> 324 bytes .../filter/game-doomchex/fonts/bigupper/0446.lmp | Bin 0 -> 320 bytes .../filter/game-doomchex/fonts/bigupper/0447.lmp | Bin 0 -> 259 bytes .../filter/game-doomchex/fonts/bigupper/0448.lmp | Bin 0 -> 412 bytes .../filter/game-doomchex/fonts/bigupper/0449.lmp | Bin 0 -> 446 bytes .../filter/game-doomchex/fonts/bigupper/044A.lmp | Bin 0 -> 289 bytes .../filter/game-doomchex/fonts/bigupper/044B.lmp | Bin 0 -> 372 bytes .../filter/game-doomchex/fonts/bigupper/044C.lmp | Bin 0 -> 263 bytes .../filter/game-doomchex/fonts/bigupper/044D.lmp | Bin 0 -> 286 bytes .../filter/game-doomchex/fonts/bigupper/044E.lmp | Bin 0 -> 400 bytes .../filter/game-doomchex/fonts/bigupper/044F.lmp | Bin 0 -> 310 bytes .../filter/game-doomchex/fonts/bigupper/2013.lmp | Bin 0 -> 164 bytes 97 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0021.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0022.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0023.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0024.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0025.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0026.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0027.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0028.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0029.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002D.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0030.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0031.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0032.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0033.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0034.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0035.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0036.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0037.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0038.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0039.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003D.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0040.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005D.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0060.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0061.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0062.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0063.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0064.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0065.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0066.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0067.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0068.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0069.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006D.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0070.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0071.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0072.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0073.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0074.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0075.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0076.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0077.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0078.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0079.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/007A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0430.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0431.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0432.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0433.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0434.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0435.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0436.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0437.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0438.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0439.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043D.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0440.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0441.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0442.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0443.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0444.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0445.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0446.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0447.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0448.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0449.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044D.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/2013.lmp 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 0000000000000000000000000000000000000000..c6e74a303b1be511acef2034f6a51f2cadf9db53 GIT binary patch literal 142 zcmZQ$;Aa2<1t8W3VrL)@2jXlXt_NZUt}G<*pMgIsD&j%Kg^%7 zR*e#E!45bufE&1j2Y7-Pc!LjE&6L`J#XO0Y!z!C3sQJ;t7he51#ov zWu%Fm_XoCG*GvZNgv?4kylkVN`Xlb(MY+CX?m`H?vCNlRZwwLGQ`^=|2L9`HsmGDG I;YI!17fqa9G5`Po literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a58be35fd5410b2da25daa4bc67239cf75d3d543 GIT binary patch literal 350 zcmYL_&5gn^5QPn70qrG6ilB;>xUQ5RudR_YL_@TfX@DXqf+8q_A}E3qvTwWzSo)&q z%ZokFr7NAS1Na64&fo&B;0EsC0iIyBaBc_o;0yeKRiSx}%eAU7i|XgcztVBBg^MxJ zWQlv#(Uq#dJtvBBP_3FYxg;z|BU1U<5hD`FT;wSi*oROwZ5t{J=ludvcdWVVj&Ii_ zmZ6rD4Bp1dIp1Ty#vb7{i%w0XPsPijaZ@R+IuF_6ppAo}Qkbo}QkbJ5Yt0H6klL`FXUq z*K?T(YY8^s2u|P(F5n7o;0_+(30~k0KA=cM7CckhQxYns!+X$avoMEPPHuYC=*U< O^Q?bC95DXnf8+~)!CL+R literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a5082b02892971d96280facaa18873207ea3475a GIT binary patch literal 343 zcmZvX%?-jZ3`WyG2^FE<7=j@z?hG2#ACA8&&rI*N0 zPHY#fU_K5&fD5>S8@Pi9c!C#rgE(Sr3wB@+jvz_M$0`jMjq#eu8AH@N=ZMB=Lv)g| zRTg2qVFgTOR40|zMlY^X#yKJE&}(C-I^GRLQsNMc6AEe51ULT|9QSploZtR+79}aK s>-JYC9bDU4eJ&;D4)a;>(A*8BP?HM_w!V4Ez030N%G8C?@@z`S4}+_1a{vGU literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..66ff537dec5300391ce8f93a32b34a08a73c24d7 GIT binary patch literal 72 zcmZQ&U}XRS86Z{$VqG9M2Vw^xW@gF)g8vMxASxcp3JeFcShBJLqd`KLkeL)49}h%8)_+FctgPgq zu&{_2APP@~iUbBngolLzQA7ezgn>URD?TDTHa0d2h(bdXp<=<|$xw46AnI7MvI1kW SvbaHXEJzVESe^$${RaRY|1|{w literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..07df3a30d34b730e59c2cfc3e68d27bd6a2afedf GIT binary patch literal 176 zcmXYp(Fwvp5JXoKP>3OIqyt;<(;vyPSqyji+ppA+8Z5y+&v)jAdCagZbCp4gM!3TR z3^v%|17DEFi*83`Y2BaEy(3>_mVq*@|0nlgsooY1s%m(Cm%mf*ZW?AYY+5gA3QLMO RvXIXmGw~2Dx0gCg{{hv$HNOA= literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c73734c68eb783c54d055793eec3993e6e8662cc GIT binary patch literal 160 zcmd;LU}s=p`1RiaNLm1~3lIkYaSRY=0C5QrHvn-D5YGT&Cgv;<_|L!&qLSh4#4Hem rh{q%*CPu;3goj7M)rW_N!`Oi#pg}jRlK=*x}(3 aG4W9G;PA-E2)LRsuo{rQK&XD8z<&T~-Xh2V literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6b9ddb14a72463c9b0d3807fb874c2e6de624228 GIT binary patch literal 92 zcmd;NU}a!n`0`%|Na_Ny9uS)Xu{{ub0&x%!M*(p(5dZ(r%#;NL{~1_8R6LXw7!GE! SWMu_LgM^qtl3D-%{|5jgX&CYV literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c9c5d40fcd1ef13490d6064ce8950b6cf00f91f8 GIT binary patch literal 140 zcmd;KU}a!n`1RicNLm816%e}su^$je0C5r!=KygT5H|pE7Z7&?@&Eq}tXU8MW+kR1 cWo3a`q49|rtiVW^7=jg@1k(XF=Kufy0BrXt*8l(j literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e26c79dfa9ab16d998eeb00c560c12cfe5aef97a GIT binary patch literal 80 zcmd;JU}0cj`1)T1NNNJH77!Z)u?-Nr0o21xGz G|Nj6^AQgfD literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f60e5221096f60331203a7c18287a3484a194628 GIT binary patch literal 236 zcmYMuI}5@v6o%nwFJ3`^mSZVG2@*;XEu6uBm@Tk8F)ba mh=_=wpwQ5GpaPIUKqwFd0YMCsKzL|qcu*o#0Hz;A{|5lCuqIFd literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4bca64d1924a0dc8aa8412e23684fdf162759cca GIT binary patch literal 243 zcmYk0;RymU427$dL-59N2mjs`N&;69{bxpS1y^tdS8xS)aFM$&y($Ji+PuEJW*_?C zb$}x%T;T?Hc)$~0@P-eBXtla-J-g$FMq;-eZ={5 q47lRd1P@CPzo8;Jd7x*l-zoz0(K9xzq>{yK$C5R6+qQMVYhD0PT}l-I literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fffcba017a42a3212197d93cce8c5ea7d330aa06 GIT binary patch literal 233 zcmX|(;R(Vp6ojMnN70Vs3jWtZO`#9MYaqf+;0mtb3a;P^-N0Syy(ISFOUTDvj;?c- z6FHL`xswNZk{5ZC4_U~UxCS|Gy;l={1WXJwki}Js@S6y=q1Nbth7C(;RAF)x7e0FK geX5gQViHYp{)<6^s>ULA2VjyAOmVPp^Y{5!fBaxar2qf` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..97a93cdd71a1a0f9ab80a274af6df03727e72aab GIT binary patch literal 211 zcmX|(!3o1K3`KqLA&`vI1+qXP1|xw5qL&bS&owJ#g|5&Qx|sV_IeGAmztGnhreHka z44<&T4es!OCw#*X{K7EQn`R*;;w-g#V4N1w`OI V3=&ZhVWz9XqA#Gj_KLUtZ9hu^KHvZV literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4d98ea367f1615adbf3aaa9131e9936bf5965f12 GIT binary patch literal 241 zcmY+6!3o1K3`Ko#b7{uu3SGb$84-f!JGi|MRP@ZX@+aIW_Np%1K literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6ca4a42c1808da78b43bf1028d9b42d2e5fe102c GIT binary patch literal 235 zcmX|*;RymU427%IL%bWu1>8W6kZ_c8^zZxW3a;P^uHXvp;4;0J!#40i`sI;y3{&vB zk{h{`LLTHvUgS+a!xBzKU5wQf+Fag<2&6eDSlu~GtIMaON0I;l literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5dd89f0853960b6e7dacb2ca7615a9a05f37e5f0 GIT binary patch literal 188 zcmXxc!3lsc3n!= LY4^6P%X*d%_8~WL literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6001da43b28bb21c8360d9e3060174f3adac822d GIT binary patch literal 231 zcmZ9G-3bCg420Jo5cJBi0~kw%6P)1! zSD4`eFL=WTzR*>Ywzih;Xw#y0!__@*P0`!k;C{^|Rfm$4<9{1E^0H*9$5~ANB=FHR XMQM+*r+L*#GtGcn@`9txSY-PF;nFp@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6fba4f4ddb8f8de08d6ff5e98295e33ac657c469 GIT binary patch literal 160 zcmd;JU}s=p`1M}{NSXt&8xV&AaS9L@191}&PXuBH<}46kfl&WJ+$0DWNP)Sr5H64c gb0Z*JAO+?|LbyN*%ngHZffSe<2;l-LFc--p02YKTivR!s literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2154df1f5f7833548131cfdbd418a53c265d036a GIT binary patch literal 186 zcmXAj>j}az7)4Y2vK4o616PnDTCFC=HU#bjj^G3i;BSArUp>JO4&S{8@@UQ4q}jk0 zb}+&Np74SZM}tJJXVO`1(9bsc6&upuT@Nyk%EO;6A5zO}n)P8K7hE)ibf)CdWU7oG%sp$~$id58Ey5z~zy@r<25i6v_U?84lj!QeOY;Ap z$!uNktafBiGC7emxsWTlkvn;iCmG3$xK96Sa=q$MNG?2URWBS>J%B@to0sW%iM(v& w=LL^>wzE0az$Rd*=!TW}O zuzRnn%+R_DFx6-lgKxiyP+J}pl`?e1BRbh$rBKxkcga7&ougE(jG`T#UI-ll6(Z2yn0%b=4 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c3ea98f5969e07649c082c6921c266fc2d497708 GIT binary patch literal 236 zcmZvU!3lsc3`KkJqz6}V2p8}m1{w(U7#zYO9Ksb`!4({){*?40et0B2lHZ0tSOzcx z0vp)D0Zwp%8$2NN`b{>+$s;03wYXWBIU=->R0maDq*z^K5&xIf?+7IxTXSesXDpr1 QA|^DLu=y{n!Y(ZN1rJ?Hi~s-t literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5864b535509a7fc49890bec081497a58e6282cec GIT binary patch literal 236 zcmYMuI}5@v6o%nwFJ3`^mSZVG2@*;XEu6uJA5Jf4hv|tria0EyQBwRv_-PI1^5DwuG4&gTV50B0tUOstnFdAzlGgyEJ z8`!}CPH=%6JirXxGHF*4VPzH}-GnQjkp2;t+2ceb+iKu45v9^X?Ik#uA`$|YC%xxl Sa2lWc>{?3J^x6J_c6|X_`AI_n literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..df3d7a49585c5c4fcfa731c1fbdb36f6138789db GIT binary patch literal 183 zcmY+-D+_>742I$36^sAKW;C7Q!Jyb(w%hGytI>a`?*XrahkcB(| z6J{(}v0+CVDs?20YD14>Ro4=tghAJl!c^6YIATC_VlC15=tTb0&+dERxp_aiex5R1 BGlKvC literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..400fefe10da955b23b3fa9dacacbf0245b39c662 GIT binary patch literal 164 zcmd;KU}0cj`1;=hNIC+s7Z3*naSRZr0&yM?mjiJF5O)IcBp{v*#0)H1VDKNr2#L+g n0yBc5p^T77C?h-`CIwRy0Fz>YDGq=!f?#UG6QR05cKinb7alJy literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f8d466f194ff431dd26d6af49bc56ba9270229d9 GIT binary patch literal 92 zcmd;NU}XRS9U#^PVm%->17dq1_5|W!AdUj!XdwRopMg0G1pYIyWMu_LgBYwpMtD4w Pm6ZizF*AYH{QnOCdpH*X literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a838d54f15ac5bb60421b4fb6a7a0ca98dce5b06 GIT binary patch literal 278 zcmXYp%MHRX5Ja6sQAmhHQyjTOQLwDFWI5vG6CF?i1<(Ku&;l*c0xfV1Z=J05teO4H z!SqJ!2q!qh3|F|p9Ukz67rfyEU-&^&7}HisYiVkJ?@@Jwiegn)t!i(FL2zZ4jh)6w zdnp*s-dVRg&b*VX%`PPgDp^zG2%CbMKBa-dH0R;gm_v{dVx*ZjM(ZdMP0Nia;(5+$ RMzK%n5?S9a%5Kft694*;SKt5u literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0700f6020b609e4c2c8f7066923df2be9b78e5bb GIT binary patch literal 319 zcmY+9;RymU427%y5ad8ta07>MfR<1~Nuk^!{>TEZ;0mtb3a;P^uHXvwzArfW^u^nY%B2Uaslt_LU Xe6k94u~97rB}A;ray3?6Pfz^-#m!|n literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..41cd7ec33231df19c5ee3ce52677b0b1b520d50f GIT binary patch literal 286 zcmZ9GK?=e!5JjibMUm>6+`25H5C{wjQNguW@CshRD|iL3&?|TaA-+k2P(QrR^w0bu zYw5+bfh`>12v@kl9Ukz67mVGwy)R1j*QtgOBjYSR(}e7E yu7*!1JLIPgu6mLkbzdSht{Q{42!=JYjUh~i)!D}GXXxLCs}aYbMC=iE)Re!uBUgC< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f3a374dc27abb9317ffd5ec9fae58a27a4fe5926 GIT binary patch literal 307 zcmZvW(Fp=E5JYowABP-Tfel!P1sK8-!Y+i%hsZWy3$|bjwqOgkU<K;Q%};0kWw4j$kMUf>NX*fh@Vz#h0>^{hWt3#5Q7B7^D}c$mnXIL`r0 z6i#s&NX|mCxM8(^3|iGAOgEj?{R=$G>;}!Hl;ALbe;HDQh=MKFtg!=m6HjAFi9%qk QUsoMomYm_WwrDlg4~yPl2mk;8 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ed6f0036d65a6bf6efdef18117166fdbeea00cb2 GIT binary patch literal 286 zcmY+9K?=e!5JgkzLZo^ow=PSF!_dM|shh05f>-bgUcoDPgJR#`9l$U{03bS@^6-B F{sDpTTps`c literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c79fc8b7978c2b91d4e0722be74c1930a6820f3a GIT binary patch literal 216 zcmX|(%MHRn3`8B2Lj+q84RB8ctJP{PSsUf#b6TJU8lV9h;L0^6Eo1W;=}8`sJ%Iw5 zj^G3?U;!(*f*ZJl2Y7-P*g!w%Uv0O?Jd3bMRc+ltbzv^K1>2{Gb3C2HQwb0TT`Q6b@CGo#hWmA^ae!xLjC{% literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3dccf3651c228ae8a28f3f51caca6fd0b7c60167 GIT binary patch literal 346 zcmY+8?Fqs#5QbB!D5XD~z#$w${Fxw9N)JOqQ7E{9E4YFyxPmLVf37 z^WMkGltyC*4vuhvE8O4?4|u{0-td7UGiD7N*g~FnL-eyHIff8OeO7c`TQ?%rzD-XV zqv2^voZkBoVvMIGNQ;xM_N)R^g`Xw4iAkt1sNg2ykOV8q;VAwbj%(%%o!jjxhq-D} ktrjmo&5xRO&J7o`<}hj2+DY@Q)?U%;(>xuXc4*mu0Zi`Ixz!_Y?72LobJirsYz#DwPb`!!Lgt`2wx}n)+W_ewkL8hw0iLI1wU{?{A zVThV}%#Oc^w{q^?b(%^cENzIMai6!GFay JBE7Dk^$W_8U#{(1$k;1N86H`o)cld3rI%5>66_o+{z z138itaWat$xsn^XlLvW{7nw<3A++Q*P^K^&K>p4>vJ9AN8`Glt$h2d{!lb_Kh+{0j lpj2uoHbg7!fU}#Kh}icouA*w*=3D+w)yg`bcd_fE?&?6gR4~WX9gqYsnU*Up)%Zg?uIw@H(=oa literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..74cd603944ed061ee3d583936fce769c4215c956 GIT binary patch literal 194 zcmYMsJqmy@3PAeIg=)aE QTnuj!Y@0pBH?dFG4O4GBx&QzG literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cba4ffc5b28491fbf53b82c7faebbd01eaf0f573 GIT binary patch literal 316 zcmZ9H!3hFE3`J-4Am|=!z!L1kJw_-8;9R%*>=fz-)>>wWzVr%I@(u$Q*k2Qx>L=-@lMl iuuxRp=t7gQ4>?1s3z0EwOPdQ`3|C;|u9WPKzaw9IJ7hrs literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bec09015008a39f288409ece71167c7b9740b0b4 GIT binary patch literal 316 zcmYk1!41MN3`NsYKq@`303)ymN2b1y*1L24DaN;LZxHz#)7$t<*0) z>Bn&#|GjIR=>!;Dz!luU9X!AjyucfLz!&^LQ#f}3M^M(fP%3t+q3e;4W&a9lUgSmgwR5`;?uplf-AU!3%Gy_xPS||K;Pp(ZB;z@k=&O% z+P!OBtphv;oN&ekSKM&N15dm#qQEuwSEUA>B5T&cYzq9*%y+6i=Nx3Swv`aS6E*N8 zoYO>`SfQy^+>X~Cgmc5?*YG0K9%CT|iJvAV5$Tp4jUftuR#saxO{rejo8=2{Q5RH9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ebac5b436974a613f1cde8b9a6d81d9b27ec7be4 GIT binary patch literal 347 zcmYk1$qfQA3`H~S+l4zNPy!vmfl(AiqlpwH;^Z40&;l*c0xi%2HP8c>;W-)*mY$sd zV>`~;tc=D19Ar4d1+H*|J3QbCFL=YUGG+r?*ufq~BPr1hX5N)hji!PFy@W_|9=zfoqWK}V_hwO~xgOtB}OswGKeGGUqE zIF*-O!=>aV=w@Y=wv92SnAE72A}p42PC+|VXWvBhN$&>>niIiak>BsnhuG*3ZK!H~ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..174b26e0b486405757b8a066992059307f5b5569 GIT binary patch literal 310 zcmZXO+X(_O5Jj^-P;kL7ORy6Q*dYudBq00a$24FIwqOf3U<2ELE!ctutS6BL#eqYZ zJ9lzt>snXp0178K!v(HzgF6iHfG50Q(Kxq*J-F6>YAizT%~DP=9?h!IWiwF?fk737 zNf(3aBoqh2*Gh39mKxofrU=#k*I@Hglq8}OzPiUTl5+N5#N+y8Yfw+gl--LDoZ`z- VW3w^qBi@wj`LlWbYPGBnhBxegVW$89 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..59a40625fad24730dc5c73eca92631615263e317 GIT binary patch literal 327 zcmX|+;R(Vp5Jpp}#UBO172LrI9KaBQlmQ%jEBlIN-s8Dbnnv=x%bY+8}d6C7-5 zIPaYwMJ{ns*bqX`?WHIzI~)on@30g)zwS_lW!{mqqBwMAhZgE`EiS6?<2ZDs(cgF+ c*6T~-B$7gmA=}m*D7N~ml(G*kjb_R7A3FzUI{*Lx literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2937370471d6d2b4c2d0d20a7e28d1596df809de GIT binary patch literal 212 zcmd;K;9&p(3m|p`VlN;L2I3STE(PK?Af67yD}Z<>5FY~K(?HC?k_86;L5!HBtSm4i z5X|7o$_j{tNQ21#3}At9Fo=wY2?PWN2LN$!3``(6I5Ipu6d@28866oD6B7;B5(v}_ Q14z~Z9S{z407&{j0I9%0KmY&$ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7f26458ed9ef8ae1de9a5f6271c92a00b4b49783 GIT binary patch literal 296 zcmZ9HJqiLb5QRsuSTu#b7qT=(kdT34La>lM6$M-bMR7-ezbgS

X9Ud#Xh literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e505086c2bcae4c13110e9e5144779f6d1e0e17f GIT binary patch literal 278 zcmYL^(Fp=E42C1;A>tv9yT)`2Xz_hq6USWd3)9XQ|z& O*6XBIaI;9N>H@Dqi4& z*Yv$K-MH3S?Lh(ua0DlC1{ZJzH*g0J@B}Z=%$(bT9dIlCtI@4hGZ8W6+^LSPRrM() ziXo-)X(SjZhZw$&Iw5%PdpMdUA~6JpUYKTL>(5Oi_|tg9CRPuzn6_*zrJD@KIS;tB dU8KjQFxQFJ$U|R*MYuY!J$Hg)7E4S&_Xc9iVR`@n literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6f45e2b69f72a5f27c383c0a65506120c7289ef5 GIT binary patch literal 324 zcmYL^!41MN3`NsYM5%h<#tLk}3LFzfRunZ7s@0S4?7#}Fzy>V90&Ktv3{bukDk8n) z{~sr^ccwSGPJqA!F5n7o;0_+(30~k0KA@?L*@FW(0#gfCm-pGMM4ZSLM-rJ$BVr+1 zoGu4zhzPY&;d9h$q|$mn=pzjRh2)*J5kb}EJMW3~LEXZJKz>|IibGVRg>m3%Vpf|! mVrE!QOF;0b8cTpKXynokl?bg8ivKNRmU9^?=%;zm-?(2Tg<$Uh literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bdca8e56b72a9beb2b7c8f629d9c6f1d6386e2dc GIT binary patch literal 262 zcmXwz%MHRn3`7^gM|=*H#W7a2vaF31CER?V07{?(Dxd;7pacrw&Y3G=W}~(Aq#4;` z`w;elbp$mqZ~|v=0atJXcklpD@B(k}0blR~p>oz37VdGNSVD9?)ylorl;s*yqEXLw z?oA`o=Ae)BExe}G^#k+O2BU^*Ib57-2RDtHCNo-Y5{*_i1zZuGdOR*Mr}$AlDLg4m GmaqSjAyB^n literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6861783b43184869cac4209c1d7bd307503361b7 GIT binary patch literal 366 zcmX|-(FwvZ5QZbz)`vdm5bodzf-eangxHD{d^&Ikhj0j2a0ORz1y_*zT~ZtPX!yAM zFW0qcjh;Om;R-jn!vmi1f;W8N3!8;8TiC$?PGFXjPg9kzjB4Upq^?D}l(=PO`=YFO zv+6{uMkEC9xXxwjT!@~I(X`xY2tN4u7n)_A6E}-QNEpQC7+Nf2qUW2Y3>#xi10uKR u00h-5URxf7vpFQYQpXC8*Ojsot|~FAROMAzz3UmIS@AM0qQ66hp793+&u)?c literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a838d54f15ac5bb60421b4fb6a7a0ca98dce5b06 GIT binary patch literal 278 zcmXYp%MHRX5Ja6sQAmhHQyjTOQLwDFWI5vG6CF?i1<(Ku&;l*c0xfV1Z=J05teO4H z!SqJ!2q!qh3|F|p9Ukz67rfyEU-&^&7}HisYiVkJ?@@Jwiegn)t!i(FL2zZ4jh)6w zdnp*s-dVRg&b*VX%`PPgDp^zG2%CbMKBa-dH0R;gm_v{dVx*ZjM(ZdMP0Nia;(5+$ RMzK%n5?S9a%5Kft694*;SKt5u literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..228844314fc08a63c3a98de22f81fdb03ffba114 GIT binary patch literal 313 zcmY+9!3hE}5Je*%Jh-4OSb{xRz|3I?!z_d>;vo&#f-TsBE!cuB*n%y@KVc*5z$4`G z^TX`I5PVKRzy(~v4cx&4Ji!aR!3R{ZUxjc0M-YbcH`PTp6EU-KDy0b(5eAlL5g7v& z(=3RYSWUSnIHiflQpn~6BT5i1TPZ;_sY~Hcx{xyxlJoD0xBJ(!EH&a7yHJ#7BlWX} OZQsqzSJ|xFy?z1HD`P+a literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0700f6020b609e4c2c8f7066923df2be9b78e5bb GIT binary patch literal 319 zcmY+9;RymU427%y5ad8ta07>MfR<1~Nuk^!{>TEZ;0mtb3a;P^uHXvwzArfW^u^nY%B2Uaslt_LU Xe6k94u~97rB}A;ray3?6Pfz^-#m!|n literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0fb9a8159ae3c8a991f6b971455f59574cee89bc GIT binary patch literal 199 zcmY++!3lsc429tyyy-Zu-~du81Og#J5Hf))xPn)&UcI_neHDtB@0y8g z7Fc0}9S%6*f*V5TzsV)&Y-TEA=Kh8xYRp7j!$_*aI5k8PY?yt4zkhRR+@qAwa7pzN L@#HO3OIgVeq#ZrF literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0154cda6e418bd2e339089ad9d0c32dfe755d3c2 GIT binary patch literal 385 zcmY+A!EM7Z3`OO%C<3I&p&217bcNh4xP(fGfMFvi_MSsm=m=RMD`bVNkQKUt`=rE0 z`+*0UU-TEHO<0GbH|W9P6TaXGCpg0euJ8>_6T%B@;T3l94j*uU<&)nvmCtb;_wLif z>TX)D_2SvxEN3&#WoK$=kd!1zr#*F`fkLE-bgUcoDPgJR#`9l$U{03bS@^6-B F{sDpTTps`c literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9dc49699250a0607e58ecdd41b6fade798b7ace9 GIT binary patch literal 374 zcmY+A!EM7Z3`ONOM$^Kl9I`+*$O>5?Mv)qZ2oMqs#Na7AbcJq^1-e34=n7q-_vBGd zi>#4qMZiqN81WM&5f!V7OdW8v zno`OdJH0tt?kKMR4$0`m@;8AO6`{Qs^_HEN>=4s9nsX}BCt%#sY!vnT*^`D;3f?_? JD2e&ETmgGGbSD4+ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fcf34cf900f65819a3f76d0c338d0da2ff2082fa GIT binary patch literal 275 zcmYk0!41MN3`J9l1VUvaR^X6>Wm$)s0x1L2eAHG_|$3HcVKu z1|&=ndX_|lu(c&2Nbq`vq!c#t+);#CgrawJ2OPwlGJAu`sR$|(O6#WggLZAyKYDmp AGynhq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5bfa7ebe41d91b864518b7a72bf5ee8f2d006558 GIT binary patch literal 316 zcmYk1!3n}Z5JfjJD#RRYz!L1kW0o)sLl(m3B1{FgU<PcVv7+uvsX6D7|GKtVt$4SQK0cis(^J8YD2I< d>cq@qwdPJW31f%3n@-?~2=(?wUM_yr;RiReV5!;@!3A8w4cx&4Ji!aR!3WfZb9-f{>LmY8~| z3wcm2k~|0^-b>g0Hs(m8F4{(=>JheDt48A9M)*w+cZ4Uc%q^nKj&g%55wWWRt9Hh= mDK$b03HcC`*D5lzSj(kiOTzFl4>?&?6gR4~WX9gqYsnU*Up)%Zg?uIw@H(=oa literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f390db584ed52bccf2a07526b34a018587723a21 GIT binary patch literal 322 zcmYk0!3hE}6htF<5M2;Eum$_@kdK5A5)?fCi!IoKEm(pbc=hVl7Hq-zlHDvj@RFZl zlF7z&rf3fij&Ol1+~5umc)|Jw_-8;9R%*>=fz-)>>wWzVr%I@(u$Q*k2Qx>L=-@lMl iuuxRp=t7gQ4>?1s3z0EwOPdQ`3|C;|u9WPKzaw9IJ7hrs literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b2b14f62c40c3b37e0b9b58fc12189219f7b3121 GIT binary patch literal 299 zcmY+8!3jb!5JV&Vi}1m__1Hl8EMeJ&B_8CH25i9=Y{9EnueM+dw%{$!Cg$M43%f&R zl3kdC>i`Ixz!_Y?72LobJirsYz#DwPb`!!Lgt`2wx}n)+W_ewkL8hw0iLI1wU{?{A zVThV}%#Oc^w{q^?b(%^cENzIMai6!GFay JBE7Dk^$W_8U#e;4W&a9lUgSmBE&HCYy$uRT( zY-NzDJt!RE1ZTLw6>e~c2Rz{gZ`iCvb|6FkQ>l%FVoWKFIk$%QW@>uy>DzE#m9OuO v5K#zy#ky~ib+dy4eMJz_sCu; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8f9c543f2bb7cf0e4dae19d0d1882526c09c0a91 GIT binary patch literal 264 zcmY+;(FwvZ5XSK+B0dyna)gE>gwR5`;?uplf-AU!3%Gy_xPS||K;Pp(ZB;z@k=&O% z+P!OBtphv;oN&ekSKM&N15dm#qQEuwSEUA>B5T&cYzq9*%y+6i=Nx3Swv`aS6E*N8 zoYO>`SfQy^+>X~Cgmc5?*YG0K9%CT|iJvAV5$Tp4jUftuR#saxO{rejo8=2{Q5RH9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..41cd7ec33231df19c5ee3ce52677b0b1b520d50f GIT binary patch literal 286 zcmZ9GK?=e!5JjibMUm>6+`25H5C{wjQNguW@CshRD|iL3&?|TaA-+k2P(QrR^w0bu zYw5+bfh`>12v@kl9Ukz67mVGwy)R1j*QtgOBjYSR(}e7E yu7*!1JLIPgu6mLkbzdSht{Q{42!=JYjUh~i)!D}GXXxLCs}aYbMC=iE)Re!uBUgC< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2937370471d6d2b4c2d0d20a7e28d1596df809de GIT binary patch literal 212 zcmd;K;9&p(3m|p`VlN;L2I3STE(PK?Af67yD}Z<>5FY~K(?HC?k_86;L5!HBtSm4i z5X|7o$_j{tNQ21#3}At9Fo=wY2?PWN2LN$!3``(6I5Ipu6d@28866oD6B7;B5(v}_ Q14z~Z9S{z407&{j0I9%0KmY&$ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d0b804232db88854820303fc949fd71ef945bd2f GIT binary patch literal 273 zcmXYs%?*M;5Jm^^2hf9Md1OO2n+YTYZ%zvqVF`9%0~TNb7GMG1z2X~ilb3zp?9Toi zWG_CB(15}jE^vh#+~EOFc)=S!@CC_4Dv-i_OtLbICzmxcjAnJdENsl0)KRF|I`7z0 z2~jDPbe))|Y-iTCA@nx(139nBsp|$!9*dF|RZZ%_`w8wj-X={Qp5Y-y?Qxl1)tiME SggBq$k82j=<}k1RKkx$>eo?Cc literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..578b1e833d41003a1ad39ff655bba9ba0f37f1f8 GIT binary patch literal 290 zcmY+9!3hE}6hyPSh~Oe#?Z{*1@cD!UmWUUB0XAR>wqOgkU<;OD1K!t3bXWZFAT#+) zCL7neGCKm2$dR1LnOw+~+{m3g$dkNC(>S*#TQYC0&M;e;g&4Eh&@9cev@J#<3TXem z@i0RbD>EM`;wQm%W>JDFVxRZiE(TNpNJ@vFA@C5LHYBE0oWD#8POak8_#k^pVBT0I PGh9o_Qa*=Jj?;(UTa;Jl literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6f45e2b69f72a5f27c383c0a65506120c7289ef5 GIT binary patch literal 324 zcmYL^!41MN3`NsYM5%h<#tLk}3LFzfRunZ7s@0S4?7#}Fzy>V90&Ktv3{bukDk8n) z{~sr^ccwSGPJqA!F5n7o;0_+(30~k0KA@?L*@FW(0#gfCm-pGMM4ZSLM-rJ$BVr+1 zoGu4zhzPY&;d9h$q|$mn=pzjRh2)*J5kb}EJMW3~LEXZJKz>|IibGVRg>m3%Vpf|! mVrE!QOF;0b8cTpKXynokl?bg8ivKNRmU9^?=%;zm-?(2Tg<$Uh literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..90ff891a764d6043ff9c74c2df5006dbb9c7a764 GIT binary patch literal 320 zcmY+8u?a#!42Dk-d4)Xe+`--*Y+rF4A%WxK*<=M*a0OSewRHtoa0Lf={->A1A3jJv zl8{XpL(2gWFmMJJa0NGT2M_QBFYpG-MF?B41A7qG_LsSd#2h0ti<*7K1jCY26c^}O zB*okX2?TK>7k+hWVpy8RlNZOn<0I@MS1qa~iytAas*1k!l}IcF$+d~mOiD(VvtXht TKTD;w|A!T(sm(|7EWiS^w5-4itiTGazyjg>65W?xWdGRT zM;a(}0%ySB0VdZ w#aK!x!rclQT6Vah8b*c^)Y4##W1fO(O^gZVSyhDB<1j>Rfy|bk(c;=$|2NG}2><{9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9169fbb87017baa04af61d08083158ec9dc30c1f GIT binary patch literal 412 zcmZ9F!3hE}5Je++5cKHL7QEVm*9}X^4l@uE*MlixTd)ONum!KSU<xD5pum=Zl1Rc150bGIE-)oC-~yR#wZLE!AE9nMcWc5kb7}TBNaf@8RT26WQ;I=!mr|cnLLcjdBbJB?eH9V|x)4Ms^jvwzFU_okNdN!< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..83539039f998ac5cac98e8459dd54ad392f4ec2d GIT binary patch literal 446 zcmZ9FL280Q3`WON#6@va=n1@n+g?Ej8HSL+IPvdhc3#0Nh&OQ2ed!gt?G<{3ow8A>jE>m@RIZY@&J`p<2YauyM+_iV&AmYmb= zK6=JTDt!kD1aT%8zBHP!bLr#Z9B;ZPgI3jA#IvM>s-mxbA`wePmBGZcHK_$%DT0Zv T{2DV=#|q literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f7f001fdbc313b90754513de0fe83677dceb7782 GIT binary patch literal 289 zcmX|*%?-jZ424rsehwAl%0?XHLlhZDs?wubffZPR6DHi5A)LRkf1Q37KA;|tw=flJ24WhTE|n2t(bymwtMRh NyhZGD+m+qX@&z&vSuOwo literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cb834d363a68321de5b7dab3340b295f4df3a274 GIT binary patch literal 372 zcmY+9!EM7Z3`G?radI$v$pBrUD`W#R4j~XEK&VA88XzlVg{;sOx!x<}vsggxv-)4*1s&U+I)vs?0s{~VF literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6ba6840b5fe16fc7dde338d425518bbe98049c0c GIT binary patch literal 286 zcmX|*!3}~y5JeZmff(Y=er#b6o6Q80353&JZNV07!4_=67Hq)|JgsjQWReHW+s}tn z=!4G%BFu1w8{FXmPk6x_KJbOE3E>Q(wL0B)FD}N}%*8O7RS|U+=`YfLO4kjSu$B&yjNw+@xeq*yzeBR|9{xxV1*q9T$9O3R_+oO4-fDNM|gu1yo1}@ziM5`QbeSb zqGqGuMOCZhD2u=!EwXl$s+x)M<-hVWe&cEpNFYE|0i M$lTAwct{^@zeyB*UjP6A literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9312be6b2b0bc82772b1c76c0e92797e4e0bc2c5 GIT binary patch literal 310 zcmY+8;R(V(427>2QLx}2S8x*tXgIbq;J_~7I2 zC3$z*hbCm50E08QfGfCxJ9vO67{Cj>L0yG#07tN@J!`Wrhx=IV+qL@#m!T*S Y)>-~;37asdv=mHK)$|vco|_;20K$M_2><{9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..22b90ba0f2565530a53f634a4a5c3f194221b271 GIT binary patch literal 164 zcmd;KU}0cj`1#)gNIC+s7Z3*naSRZr0&yM?mjiJF5O)IcBp{v*#0)H1VDKNr2#L+g n0yBc5p^T77C?h-`CIwRy0Fz>YDGq=!f?#UG6QR05cKinb8I~_G literal 0 HcmV?d00001 From b4d96aaef92bbbd4581219c009a0cd1af83e2888 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 15 Feb 2019 22:05:26 +0100 Subject: [PATCH 26/95] - made Windows backend parts of the console Unicode capable. --- src/c_console.cpp | 63 ++++++++++---- src/utility/cmdlib.cpp | 7 ++ src/utility/zstring.cpp | 2 + src/v_font.cpp | 4 +- src/win32/i_system.cpp | 183 ++++++++++++---------------------------- 5 files changed, 113 insertions(+), 146 deletions(-) diff --git a/src/c_console.cpp b/src/c_console.cpp index b25303c266..03687cf833 100644 --- a/src/c_console.cpp +++ b/src/c_console.cpp @@ -798,35 +798,68 @@ void FNotifyBuffer::AddString(int printlevel, FString source) TopGoal = 0; } -void AddToConsole (int printlevel, const char *text) +/* Adds a string to the console and also to the notify buffer */ +int utf8_encode(int32_t codepoint, char *buffer, int *size); +static TArray UTF8String; + +const char *MakeUTF8(const char *outline, int *numchars = nullptr) { - conbuffer->AddText(printlevel, text, Logfile); + UTF8String.Clear(); + const uint8_t *in = (const uint8_t*)outline; + + if (numchars) *numchars = 0; + while (int chr = GetCharFromString(in)) + { + int size = 0; + char 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(); +} + +void AddToConsole (int printlevel, const char *text) +{ + 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(UTF8String.Data()); + + 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; 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/zstring.cpp b/src/utility/zstring.cpp index 5af7d0e491..04e6173f7a 100644 --- a/src/utility/zstring.cpp +++ b/src/utility/zstring.cpp @@ -1264,6 +1264,7 @@ FString::FString(const wchar_t *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; } } @@ -1280,6 +1281,7 @@ FString &FString::operator=(const wchar_t *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; } diff --git a/src/v_font.cpp b/src/v_font.cpp index d889967669..0faa55a8c3 100644 --- a/src/v_font.cpp +++ b/src/v_font.cpp @@ -2494,9 +2494,9 @@ void FFont::FixXMoves() if (myislower(i + FirstChar)) { int upper = upperforlower[FirstChar + i]; - if (upper >= 0) + if (upper >= FirstChar && upper <= LastChar ) { - Chars[i].XMove = Chars[upper].XMove; + Chars[i].XMove = Chars[upper - FirstChar].XMove; continue; } } diff --git a/src/win32/i_system.cpp b/src/win32/i_system.cpp index 5431f8b5b6..0015e69b11 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" @@ -480,79 +481,15 @@ void I_Error(const char *error, ...) va_start(argptr, error); myvsnprintf(errortext, MAX_ERRORTEXT, error, argptr); va_end(argptr); - OutputDebugStringA(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); @@ -1461,10 +1386,10 @@ FString I_GetLongPathName(const 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; From 8018ebfab5fb74e472c98cfaa95540e69c0fee67 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 16 Feb 2019 09:50:00 +0100 Subject: [PATCH 27/95] - use the Unicode version of Windows's clipboard functions. --- src/win32/i_input.cpp | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/src/win32/i_input.cpp b/src/win32/i_input.cpp index 2854290c68..676484a301 100644 --- a/src/win32/i_input.cpp +++ b/src/win32/i_input.cpp @@ -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"); } } From 64685705d02dda246dcfc969b9f2ff7d07873256 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 16 Feb 2019 13:05:19 +0100 Subject: [PATCH 28/95] - made the console Unicode-capable. This also necessitated some character remapping in the console font to move the Windows-1252 extra characters to their proper Unicode code points. --- src/CMakeLists.txt | 1 + src/c_console.cpp | 293 ++++++++++++++++-------------- src/c_consolebuffer.cpp | 3 +- src/posix/sdl/i_input.cpp | 4 +- src/scripting/backend/codegen.cpp | 20 +- src/serializer.cpp | 113 ++---------- src/utility/utf8.cpp | 249 +++++++++++++++++++++++++ src/utility/utf8.h | 8 + src/v_font.cpp | 18 +- src/v_text.cpp | 113 ------------ 10 files changed, 454 insertions(+), 368 deletions(-) create mode 100644 src/utility/utf8.cpp create mode 100644 src/utility/utf8.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1184dd1506..b0789d91eb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1271,6 +1271,7 @@ set (PCH_SOURCES utility/name.cpp utility/s_playlist.cpp utility/v_collection.cpp + utility/utf8.cpp utility/zstrformat.cpp ) diff --git a/src/c_console.cpp b/src/c_console.cpp index 03687cf833..3185267f2a 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,23 @@ struct FCommandBuffer void AddChar(int character) { - ///FIXME: Not Unicode-aware - if (CursorPos == Text.Len()) + uint8_t encoded[5]; + int size; + if (utf8_encode(character, encoded, &size) == 0) { - Text += char(character); + encoded[size] = 0; + if (Text.IsEmpty()) + { + Text = (char*)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 +440,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 +451,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; @@ -798,33 +844,6 @@ void FNotifyBuffer::AddString(int printlevel, FString source) TopGoal = 0; } -/* Adds a string to the console and also to the notify buffer */ -int utf8_encode(int32_t codepoint, char *buffer, int *size); -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; - char 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(); -} - void AddToConsole (int printlevel, const char *text) { conbuffer->AddText(printlevel, MakeUTF8(text), Logfile); @@ -844,7 +863,7 @@ int PrintString (int printlevel, const char *outline) if (printlevel != PRINT_LOG) { - I_PrintStr(UTF8String.Data()); + I_PrintStr(outline); conbuffer->AddText(printlevel, outline, Logfile); if (vidactive && screen && SmallFont) @@ -1242,10 +1261,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) { @@ -1527,7 +1543,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) { @@ -1542,16 +1558,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 @@ -1563,7 +1581,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) { @@ -1589,16 +1607,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 @@ -1639,9 +1653,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 @@ -1696,7 +1710,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; @@ -1939,25 +1953,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. @@ -1980,7 +1996,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; } @@ -1997,25 +2013,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(); } @@ -2028,9 +2044,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; } @@ -2055,7 +2072,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. @@ -2087,9 +2104,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/posix/sdl/i_input.cpp b/src/posix/sdl/i_input.cpp index 6ea1cb70db..10c46a4a45 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 (); @@ -471,10 +472,9 @@ void MessagePump (const SDL_Event &sev) case SDL_TEXTINPUT: if (GUICapture) { - int utf8_decode(const char *src, int *size); int size; - int unichar = utf8_decode(sev.text.text, &size); + int unichar = utf8_decode((const uint8_t*)sev.text.text, &size); if (size != 4) { event.type = EV_GUI_Event; diff --git a/src/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index 878c7beeae..7c8f207d6c 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 == 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; } diff --git a/src/serializer.cpp b/src/serializer.cpp index 7fccd74752..e8a84f353f 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; } diff --git a/src/utility/utf8.cpp b/src/utility/utf8.cpp new file mode 100644 index 0000000000..d6e3e7edf8 --- /dev/null +++ b/src/utility/utf8.cpp @@ -0,0 +1,249 @@ +/* +** 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]; + + if ((c & 0xE0) == 0xC0) + { + r = ((c & 0x1F) << 6) | c1; + if (r >= 128) + { + *size = 2; + return r; + } + return -1; + } + + int c2 = src[2]; + + 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]; + + 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(); +} diff --git a/src/utility/utf8.h b/src/utility/utf8.h new file mode 100644 index 0000000000..60531b12fd --- /dev/null +++ b/src/utility/utf8.h @@ -0,0 +1,8 @@ +#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. + +extern uint16_t win1252map[]; diff --git a/src/v_font.cpp b/src/v_font.cpp index 0faa55a8c3..b1ce4812a7 100644 --- a/src/v_font.cpp +++ b/src/v_font.cpp @@ -91,6 +91,7 @@ The FON2 header is followed by variable length data: #include "v_text.h" #include "vm.h" #include "image.h" +#include "utf8.h" #include "textures/formats/fontchars.h" // MACROS ------------------------------------------------------------------ @@ -1844,7 +1845,10 @@ void FSingleLumpFont::LoadFON1 (int lump, const uint8_t *data) { int w, h; - Chars.Resize(256); + // 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; @@ -1853,10 +1857,20 @@ void FSingleLumpFont::LoadFON1 (int lump, const uint8_t *data) FontHeight = h; SpaceWidth = w; FirstChar = 0; - LastChar = 255; + 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]]); + } + } } //========================================================================== diff --git a/src/v_text.cpp b/src/v_text.cpp index 313abb275a..e7634fa5ed 100644 --- a/src/v_text.cpp +++ b/src/v_text.cpp @@ -49,119 +49,6 @@ 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. -// The long term goal should be to convert all text to UTF-8 on loading and -// make this require pure UTF-8 input. -// -//========================================================================== - -int GetCharFromString(const uint8_t *&string) -{ - int z, y, x; - - z = *string++; - - if (z < 192) - { - // Handle Windows 1252 characters - if (z >= 128 && z < 160) - { - static const uint16_t map0x80_0x9f[] = { - 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, - }; - return map0x80_0x9f[z - 128]; - } - return z; - } - else if (z <= 223) - { - y = *string++; - if (y < 128 || y >= 192) - { - // 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) - { - // not an UTF-8 sequence so return the first byte unchanged - string -= 2; - } - else - { - z = (z - 224) * 4096 + (y - 128) * 64 + (x - 128); - } - } - } - else if (z >= 240) - { - y = *string++; - if (y < 128 || y >= 192) - { - // not an UTF-8 sequence so return the first byte unchanged - string--; - } - else - { - // we do not support 4-Byte UTF-8 here - string += 2; - return '?'; - } - } - return z; -} - //========================================================================== // // DrawChar From 0fc4640cc9fbcced70c365122ecff97278083497 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sat, 16 Feb 2019 11:12:10 -0500 Subject: [PATCH 29/95] - fix building in 32 bit windows --- src/win32/i_system.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win32/i_system.cpp b/src/win32/i_system.cpp index 0015e69b11..f9691146ae 100644 --- a/src/win32/i_system.cpp +++ b/src/win32/i_system.cpp @@ -1219,7 +1219,7 @@ TArray I_GetGogPaths() // 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. - std::wstring gogregistrypath = "Software\\GOG.com\\Games"; + std::wstring gogregistrypath = L"Software\\GOG.com\\Games"; #endif // Look for Ultimate Doom From f472592ec4bca9c915daa7042074422a8cb55b5b Mon Sep 17 00:00:00 2001 From: Nemrtvi Date: Sat, 16 Feb 2019 11:50:57 +0100 Subject: [PATCH 30/95] Fix offsets of all small caps characters These new lumps are shifted downwards by 3 pixels so that they line up with the bottom part of the capital letters. --- .../game-doomchex/fonts/bigupper/0061.lmp | Bin 278 -> 278 bytes .../game-doomchex/fonts/bigupper/0062.lmp | Bin 319 -> 319 bytes .../game-doomchex/fonts/bigupper/0063.lmp | Bin 286 -> 286 bytes .../game-doomchex/fonts/bigupper/0064.lmp | Bin 307 -> 307 bytes .../game-doomchex/fonts/bigupper/0065.lmp | Bin 286 -> 286 bytes .../game-doomchex/fonts/bigupper/0066.lmp | Bin 216 -> 216 bytes .../game-doomchex/fonts/bigupper/0067.lmp | Bin 346 -> 346 bytes .../game-doomchex/fonts/bigupper/0068.lmp | Bin 299 -> 299 bytes .../game-doomchex/fonts/bigupper/0069.lmp | Bin 134 -> 134 bytes .../game-doomchex/fonts/bigupper/006A.lmp | Bin 222 -> 222 bytes .../game-doomchex/fonts/bigupper/006B.lmp | Bin 318 -> 318 bytes .../game-doomchex/fonts/bigupper/006C.lmp | Bin 194 -> 194 bytes .../game-doomchex/fonts/bigupper/006D.lmp | Bin 316 -> 316 bytes .../game-doomchex/fonts/bigupper/006E.lmp | Bin 316 -> 316 bytes .../game-doomchex/fonts/bigupper/006F.lmp | Bin 333 -> 333 bytes .../game-doomchex/fonts/bigupper/0070.lmp | Bin 264 -> 264 bytes .../game-doomchex/fonts/bigupper/0071.lmp | Bin 347 -> 347 bytes .../game-doomchex/fonts/bigupper/0072.lmp | Bin 310 -> 310 bytes .../game-doomchex/fonts/bigupper/0073.lmp | Bin 327 -> 327 bytes .../game-doomchex/fonts/bigupper/0074.lmp | Bin 212 -> 212 bytes .../game-doomchex/fonts/bigupper/0075.lmp | Bin 296 -> 296 bytes .../game-doomchex/fonts/bigupper/0076.lmp | Bin 278 -> 278 bytes .../game-doomchex/fonts/bigupper/0077.lmp | Bin 308 -> 308 bytes .../game-doomchex/fonts/bigupper/0078.lmp | Bin 324 -> 324 bytes .../game-doomchex/fonts/bigupper/0079.lmp | Bin 262 -> 262 bytes .../game-doomchex/fonts/bigupper/007A.lmp | Bin 366 -> 366 bytes .../game-doomchex/fonts/bigupper/0430.lmp | Bin 278 -> 278 bytes .../game-doomchex/fonts/bigupper/0431.lmp | Bin 313 -> 313 bytes .../game-doomchex/fonts/bigupper/0432.lmp | Bin 319 -> 319 bytes .../game-doomchex/fonts/bigupper/0433.lmp | Bin 199 -> 199 bytes .../game-doomchex/fonts/bigupper/0434.lmp | Bin 385 -> 385 bytes .../game-doomchex/fonts/bigupper/0435.lmp | Bin 286 -> 286 bytes .../game-doomchex/fonts/bigupper/0436.lmp | Bin 374 -> 374 bytes .../game-doomchex/fonts/bigupper/0437.lmp | Bin 275 -> 275 bytes .../game-doomchex/fonts/bigupper/0438.lmp | Bin 316 -> 316 bytes .../game-doomchex/fonts/bigupper/0439.lmp | Bin 331 -> 331 bytes .../game-doomchex/fonts/bigupper/043A.lmp | Bin 318 -> 318 bytes .../game-doomchex/fonts/bigupper/043B.lmp | Bin 322 -> 322 bytes .../game-doomchex/fonts/bigupper/043C.lmp | Bin 316 -> 316 bytes .../game-doomchex/fonts/bigupper/043D.lmp | Bin 299 -> 299 bytes .../game-doomchex/fonts/bigupper/043E.lmp | Bin 333 -> 333 bytes .../game-doomchex/fonts/bigupper/043F.lmp | Bin 299 -> 299 bytes .../game-doomchex/fonts/bigupper/0440.lmp | Bin 264 -> 264 bytes .../game-doomchex/fonts/bigupper/0441.lmp | Bin 286 -> 286 bytes .../game-doomchex/fonts/bigupper/0442.lmp | Bin 212 -> 212 bytes .../game-doomchex/fonts/bigupper/0443.lmp | Bin 273 -> 273 bytes .../game-doomchex/fonts/bigupper/0444.lmp | Bin 290 -> 290 bytes .../game-doomchex/fonts/bigupper/0445.lmp | Bin 324 -> 324 bytes .../game-doomchex/fonts/bigupper/0446.lmp | Bin 320 -> 320 bytes .../game-doomchex/fonts/bigupper/0447.lmp | Bin 259 -> 259 bytes .../game-doomchex/fonts/bigupper/0448.lmp | Bin 412 -> 412 bytes .../game-doomchex/fonts/bigupper/0449.lmp | Bin 446 -> 446 bytes .../game-doomchex/fonts/bigupper/044A.lmp | Bin 289 -> 289 bytes .../game-doomchex/fonts/bigupper/044B.lmp | Bin 372 -> 372 bytes .../game-doomchex/fonts/bigupper/044C.lmp | Bin 263 -> 263 bytes .../game-doomchex/fonts/bigupper/044D.lmp | Bin 286 -> 286 bytes .../game-doomchex/fonts/bigupper/044E.lmp | Bin 400 -> 400 bytes .../game-doomchex/fonts/bigupper/044F.lmp | Bin 310 -> 310 bytes 58 files changed, 0 insertions(+), 0 deletions(-) diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0061.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0061.lmp index a838d54f15ac5bb60421b4fb6a7a0ca98dce5b06..7276c0c17270474497c190e928c8347384fbbea5 100644 GIT binary patch delta 17 YcmbQnG>wUapMi&gf#L7}jU0T803w3~7ytkO delta 17 WcmbQnG>wUapMi$~1U7Q;F#-S=ngSdE diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0062.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0062.lmp index 0700f6020b609e4c2c8f7066923df2be9b78e5bb..2baf91394a5b84f1750bed2f78173390470dcf3b 100644 GIT binary patch delta 17 Ycmdnbw4aHCpMi&gf#L7}jU48T04MbXlK=n! delta 17 Wcmdnbw4aHCpMi$~1U7P*GXek|3<8$` diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0063.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0063.lmp index 41cd7ec33231df19c5ee3ce52677b0b1b520d50f..36cf65ef324ead6208c6eecb5da8cb19fddc4980 100644 GIT binary patch delta 17 YcmbQoG>?gckAa7Qf#L7}jT~Z(03(M4F8}}l delta 17 WcmbQoG>?gckAa5)1U7PrF#-S>o&qxf diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0064.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0064.lmp index f3a374dc27abb9317ffd5ec9fae58a27a4fe5926..ffc3e01efd506436f5e918f2e05658b52fc6916e 100644 GIT binary patch delta 17 YcmdnYw3&&6pMi&gf#L7}jU3vH047}oZvX%Q delta 17 WcmdnYw3&&6pMi$~1U7PLGXek`bOLh# diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0065.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0065.lmp index ed6f0036d65a6bf6efdef18117166fdbeea00cb2..62f301d23ccfcc30e89d4cf75e0595542fb71d3a 100644 GIT binary patch delta 17 YcmbQoG>?gckAa7Qf#L7}jT~Z(03(M4F8}}l delta 17 WcmbQoG>?gckAa5)1U7PrF#-S>o&qxf diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0066.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0066.lmp index c79fc8b7978c2b91d4e0722be74c1930a6820f3a..6042a0dd0e730e1023ce4f8849a9ad608dc94943 100644 GIT binary patch delta 16 Xcmcb?c!QCHhk=KIf#L7}i5wRICQJo5 delta 16 Vcmcb?c!QCHhk=Iy1SWD^0013d13Ul# diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0067.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0067.lmp index 3dccf3651c228ae8a28f3f51caca6fd0b7c60167..e220b5d5d549867bf28f792d0f93a3d9f46d95d6 100644 GIT binary patch delta 17 Ycmcb`bc=~YfPsgBf#L7}jT}LY04tXS;7pMi&gf#L7}jU39103}TXR{#J2 delta 17 WcmZ3@w3>;7pMi$~1U7OgGXek_WCB|N diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0069.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0069.lmp index 4110be87cca72285805c2fe8de6bb4a935b4c9e3..4a6c9ed19378e797f09f83f31c9ff1cdd959e05b 100644 GIT binary patch delta 16 XcmZo;Y-8kLW8h(6VEFrgB1atn92^8Z delta 16 UcmZo;Y-8kLW8h%`fr%V-0240)KmY&$ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006A.lmp index 7ad8fbd85c49693a507feb9850c77fadf600486f..4a1d6d2f81614026edf472952eb45ea243b9edff 100644 GIT binary patch delta 16 Xcmcb|c#n~Tmw|_Yf#L7}i5%AeClLip delta 16 Vcmcb|c#n~Tmw|@?1SWD^0{|W*15W?| diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006B.lmp index f68e086c56fe4e483f7985a7ef0cfbf87bdb1b20..9e1141a6012b7f79c00a9a145dfa46b71a873dc8 100644 GIT binary patch delta 17 YcmdnTw2z5HfPsgBf#L7}jT~l-04LuBkpKVy delta 17 WcmdnTw2z5HfPser1U7P*F#-S__5zgv diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006C.lmp index 74cd603944ed061ee3d583936fce769c4215c956..ada0e86e7da0b72d094fa3a79f9aceb7accdeab2 100644 GIT binary patch delta 16 XcmX@ac!-gMn}LUcf#L7}i5$BCBbNmA delta 16 VcmX@ac!-gMn}LS`1SWFq0stDS0{H*{ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006D.lmp index cba4ffc5b28491fbf53b82c7faebbd01eaf0f573..e0d3da89b1cb6ea8bc686aa6d6b2d55d12db8282 100644 GIT binary patch delta 17 YcmdnPw1R{sFW8h(6VEFrgAqOJ>9Df7d delta 16 UcmeBR>R{sFW8h%`frT85027h{;Q#;t diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0071.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0071.lmp index ebac5b436974a613f1cde8b9a6d81d9b27ec7be4..734a4dc8c06eefa50c26fe8fb42ae6092c0114a7 100644 GIT binary patch delta 17 Ycmcc3beoAokb#GRf#L7}jU2&@04v1==>Px# delta 17 Wcmcc3beoAokb#E*1U7O6GXel0+ydwTvfPsgBf#L7}jU0T803weB82|tP delta 17 WcmbQnG>wTvfPser1U7Q;F#-S=rUD%R diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0077.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0077.lmp index 286f4109cc12b3f5d8e13c4aa5ccd5bf0aae99aa..d7225a6fe4908fc65672fca365bd72f1752e496e 100644 GIT binary patch delta 17 YcmdnOw1tU7fPsgBf#L7}jT}0R049qBa{vGU delta 17 WcmdnOw1tU7fPser1U7Q$FaiJ@q5^jS diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0078.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0078.lmp index 6f45e2b69f72a5f27c383c0a65506120c7289ef5..6e0ff784e3a1e200ca9ab3108bf58d491c209e25 100644 GIT binary patch delta 17 YcmX@YbcBgRfPsgBf#L7}jT|jqW}N^ delta 17 WcmX@YbcBgRfPser1U7QmFaiJ_!UCrN diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0079.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0079.lmp index bdca8e56b72a9beb2b7c8f629d9c6f1d6386e2dc..41414336bbfa0948d3f1f7616c2a96b4c026b430 100644 GIT binary patch delta 16 XcmZo;YGdLMVBle3VEFrgBF8@f9VP_G delta 16 UcmZo;YGdLMVBlc@fr%Xd02Da_%m4rY diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/007A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/007A.lmp index 6861783b43184869cac4209c1d7bd307503361b7..c480c79b48cd53c5081e29ba5fe5779df9cc0ac2 100644 GIT binary patch delta 17 YcmaFI^p1%`fPsgBf#L7}jT~u=04_fTApigX delta 17 WcmaFI^p1%`fPser1U7P{F#-T1Rs$sf diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0430.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0430.lmp index a838d54f15ac5bb60421b4fb6a7a0ca98dce5b06..7276c0c17270474497c190e928c8347384fbbea5 100644 GIT binary patch delta 17 YcmbQnG>wUapMi&gf#L7}jU0T803w3~7ytkO delta 17 WcmbQnG>wUapMi$~1U7Q;F#-S=ngSdE diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0431.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0431.lmp index 228844314fc08a63c3a98de22f81fdb03ffba114..813a36ed9f15bef20ede08d99a2d8a82163ffc8f 100644 GIT binary patch delta 17 YcmdnVw3CU0pMi&gf#L7}jU0xI04FH~fdBvi delta 17 WcmdnVw3CU0pMi$~1U7OQG6Db`KmvsT diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0432.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0432.lmp index 0700f6020b609e4c2c8f7066923df2be9b78e5bb..2baf91394a5b84f1750bed2f78173390470dcf3b 100644 GIT binary patch delta 17 Ycmdnbw4aHCpMi&gf#L7}jU48T04MbXlK=n! delta 17 Wcmdnbw4aHCpMi$~1U7P*GXek|3<8$` diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0433.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0433.lmp index 0fb9a8159ae3c8a991f6b971455f59574cee89bc..5bbf3a958c96482b57cb773014a39aa484d0fa7a 100644 GIT binary patch delta 16 XcmX@kc$|@gn}LUcf#L7}i5&X@Br*jA delta 16 VcmX@kc$|@gn}LS`1SWFq2LKyI0|)>B diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0434.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0434.lmp index 0154cda6e418bd2e339089ad9d0c32dfe755d3c2..51baefa4f6d5d5cb0ad38931c89393a5bba99494 100644 GIT binary patch delta 17 YcmZoVX5eFBVEFrgBS$4803jO$VE_OC delta 17 VcmZoVX5eE0fsGuMi~trg0%ZUI diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0435.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0435.lmp index ed6f0036d65a6bf6efdef18117166fdbeea00cb2..62f301d23ccfcc30e89d4cf75e0595542fb71d3a 100644 GIT binary patch delta 17 YcmbQoG>?gckAa7Qf#L7}jT~Z(03(M4F8}}l delta 17 WcmbQoG>?gckAa5)1U7PrF#-S>o&qxf diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0436.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0436.lmp index 9dc49699250a0607e58ecdd41b6fade798b7ace9..b27c9d51f93cb4f750f917d70ab76cafbbde12c6 100644 GIT binary patch delta 17 Ycmeyy^o@x_h=GTJf#L7}jU0K5054|+I{*Lx delta 17 Wcmeyy^o@x_h=GRz1U7QyF#-T2egi)M diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0437.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0437.lmp index fcf34cf900f65819a3f76d0c338d0da2ff2082fa..2d2817921dd24e631f286ffcd817efe9da3d91e1 100644 GIT binary patch delta 17 YcmbQtG?|Hmmw|_Yf#L7}jU3#J03rnh4FCWD delta 17 WcmbQtG?|Hmmw|@?1U7PTGXek?90Cyl diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0438.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0438.lmp index 5bfa7ebe41d91b864518b7a72bf5ee8f2d006558..f32ff0ef642f636d2b3035ca348c0c144741998f 100644 GIT binary patch delta 17 YcmdnPw1;7pMi&gf#L7}jU39103}TXR{#J2 delta 17 WcmZ3@w3>;7pMi$~1U7OgGXek_WCB|N diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043E.lmp index 809cd26a996a5b6a6cb6712da41d97af6b77f26b..efa3f7d5ad04134fafab98c4c6b99e49bd86ecac 100644 GIT binary patch delta 17 YcmX@hbe4%jkb#GRf#L7}jU29w04eDNzW@LL delta 17 WcmX@hbe4%jkb#E*1U7QGG6Db}00P4R diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043F.lmp index c0642613eff653aa348c6fcd6cb31fced1900c8c..ec98576104492b4347d502c1b04116b6e16b3a22 100644 GIT binary patch delta 17 YcmZ3@w3>;7pMi&gf#L7}jU39103}TXR{#J2 delta 17 WcmZ3@w3>;7pMi$~1U7OgGXek_WCB|N diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0440.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0440.lmp index 8f9c543f2bb7cf0e4dae19d0d1882526c09c0a91..f277b466399d770ad00d21581d33d558d60806d7 100644 GIT binary patch delta 16 XcmeBR>R{sFW8h(6VEFrgAqOJ>9Df7d delta 16 UcmeBR>R{sFW8h%`frT85027h{;Q#;t diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0441.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0441.lmp index 41cd7ec33231df19c5ee3ce52677b0b1b520d50f..36cf65ef324ead6208c6eecb5da8cb19fddc4980 100644 GIT binary patch delta 17 YcmbQoG>?gckAa7Qf#L7}jT~Z(03(M4F8}}l delta 17 WcmbQoG>?gckAa5)1U7PrF#-S>o&qxf diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0442.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0442.lmp index 2937370471d6d2b4c2d0d20a7e28d1596df809de..b36a26ea531cf37608dc7547236b6c7bcbfdedd0 100644 GIT binary patch delta 16 Xcmcb@c!iOJhk=KIf#L7}i5zDDCC~*d delta 16 Vcmcb@c!iOJhk=Iy1SWEv0RSB1126yp diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0443.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0443.lmp index d0b804232db88854820303fc949fd71ef945bd2f..ffd1e8cf0baa553f692024427550e7c02323f24d 100644 GIT binary patch delta 17 YcmbQpG?9rzfPsgBf#L7}jU1ee03qcB3IG5A delta 17 WcmbQpG?9rzfPser1U7PTG6Db=`~nUD diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0444.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0444.lmp index 578b1e833d41003a1ad39ff655bba9ba0f37f1f8..8c22d19050bad0ff6e201c9d05db977b55de53b3 100644 GIT binary patch delta 17 YcmZ3)w1|mAfPsgBf#L7}jT};p03;^_Jpcdz delta 17 WcmZ3)w1|mAfPser1U7O=F#-S?J_11i diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0445.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0445.lmp index 6f45e2b69f72a5f27c383c0a65506120c7289ef5..6e0ff784e3a1e200ca9ab3108bf58d491c209e25 100644 GIT binary patch delta 17 YcmX@YbcBgRfPsgBf#L7}jT|jqW}N^ delta 17 WcmX@YbcBgRfPser1U7QmFaiJ_!UCrN diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0446.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0446.lmp index 90ff891a764d6043ff9c74c2df5006dbb9c7a764..2b654869033670dc613099241813c4464425caaf 100644 GIT binary patch delta 17 YcmX@WbbyINfPs&Jf#L7}jT{z?04O&EnE(I) delta 17 WcmX@WbbyINfPs$z1U7P5FaiJ_P6C|( diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0447.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0447.lmp index bf4bbdb26f0d831ae4ef2cbce88966296716d4a4..79491e07ca07874396451cb8f6d3c986938b2d82 100644 GIT binary patch delta 16 XcmZo>YG&f#W8h(6VEFrgBFAq49J2(y delta 16 UcmZo>YG&f#W8h%`fr%Wy0Tado!2kdN diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0448.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0448.lmp index 9169fbb87017baa04af61d08083158ec9dc30c1f..3db8db47f1328bb2e5d74dce0a0b1db6a6e476f7 100644 GIT binary patch delta 17 YcmbQkJcpS>gn@^Ff#L7}jT}=L0VJseu>b%7 delta 17 WcmbQkJcpS>gn@?v1U7O^VFUmfzyh@Z diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0449.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0449.lmp index 83539039f998ac5cac98e8459dd54ad392f4ec2d..737e597c9cd0dcdc2c13e4011e9d2b887c4934e8 100644 GIT binary patch delta 17 YcmdnTypNefjDe4Vf#L7}jU3w;0V!Dp8vpl$W8h(6VEFrgBFBFK9WMmQ delta 16 UcmZo?YG>l$W8h%`fr%Xd0Te<4%>V!Z diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044D.lmp index 6ba6840b5fe16fc7dde338d425518bbe98049c0c..8c4ece81c2d5be7465032914ba2a7630bf99497c 100644 GIT binary patch delta 17 YcmbQoG>?gckAa7Qf#L7}jT~Z(03(M4F8}}l delta 17 WcmbQoG>?gckAa5)1U7PrF#-S>o&qxf diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044E.lmp index 027ddd5d325993ce14c0b8b3c184ee66f6f3e56d..65fb7a720eb79aaba58a1cd16033dcd977f0cff4 100644 GIT binary patch delta 17 YcmbQhJb{@*gn@^Ff#L7}jT{|}03#6ujQ{`u delta 17 WcmbQhJb{@*gn@?v1U7PXFaiJ=C<2iH diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044F.lmp index 9312be6b2b0bc82772b1c76c0e92797e4e0bc2c5..72d254d1b1530cfa6e5e3a1b7895931595ff4ead 100644 GIT binary patch delta 17 YcmdnSw2g^_pMi&gf#L7}jU0N604Bo(cmMzZ delta 17 WcmdnSw2g^_pMi$~1U7Q$F#-S^+5&t4 From 54cb16ad8ef5cb0d9b720f53c3105537304e9106 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 16 Feb 2019 18:49:38 +0100 Subject: [PATCH 31/95] - made the chat input Unicode-capable. Also changed this to use the console font because it is far better equipped with special characters than the small font. --- src/ct_chat.cpp | 126 +++++++++++++++++++++++++++--------------------- 1 file changed, 71 insertions(+), 55 deletions(-) diff --git a/src/ct_chat.cpp b/src/ct_chat.cpp index 31dd40f8a2..1580916e01 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,10 @@ CVAR (Bool, chat_substitution, false, CVAR_ARCHIVE) void CT_Init () { - len = 0; // initialize the queue index + ChatQueue.Clear(); + ChatQueue.Push(0); + CharLen = 0; chatmodeon = 0; - ChatQueue[0] = 0; } //=========================================================================== @@ -141,7 +142,7 @@ bool CT_Responder (event_t *ev) { if (ev->data1 == '\r') { - ShoveChatStr ((char *)ChatQueue, chatmodeon - 1); + ShoveChatStr ((char *)ChatQueue.Data(), chatmodeon - 1); CT_Stop (); return true; } @@ -161,7 +162,7 @@ bool CT_Responder (event_t *ev) else if (ev->data1 == 'C' && (ev->data3 & GKM_CTRL)) #endif // __APPLE__ { - I_PutInClipboard ((char *)ChatQueue); + I_PutInClipboard ((char *)ChatQueue.Data()); return true; } #ifdef __APPLE__ @@ -183,7 +184,7 @@ bool CT_Responder (event_t *ev) } else { - CT_AddChar (char(ev->data1)); + CT_AddChar (ev->data1); } return true; } @@ -206,16 +207,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 +230,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 +246,28 @@ 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-> + // 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 = ChatQueue.Data(); + while(*textp) { - x += SmallFont->GetCharWidth (ChatQueue[i] & 0x7f) * scalex; - } - - if (i >= 0) - { - i++; - } - else - { - i = 0; + auto textw = displayfont->StringWidth(textp); + if (x + textw * scalex < screen_width) break; + GetCharFromString(textp); } // draw the prompt, text, and cursor - ChatQueue[len] = SmallFont->GetCursor(); - ChatQueue[len+1] = '\0'; - screen->DrawText (SmallFont, CR_GREEN, 0, y, prompt, + ChatQueue.Last() = displayfont->GetCursor(); + ChatQueue.Push(0); + 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, (const char *)textp, DTA_VirtualWidth, screen_width, DTA_VirtualHeight, screen_height, DTA_KeepRatio, true, TAG_DONE); - ChatQueue[len] = '\0'; + ChatQueue.Pop(); + ChatQueue.Last() = 0; } if (players[consoleplayer].camera != NULL && @@ -289,12 +287,22 @@ 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; + uint8_t encode[4]; + ChatQueue.Pop(); + if (utf8_encode(c, encode, &size) == 0) + { + for (int i = 0; i < size; i++) + { + ChatQueue.Push(encode[i]); + } + CharLen++; + } + ChatQueue.Push(0); } } @@ -307,9 +315,13 @@ static void CT_AddChar (char c) static void CT_BackSpace () { - if (len) + if (CharLen) { - ChatQueue[--len] = 0; + int endpos = ChatQueue.Size() - 2; + while (endpos > 0 && ChatQueue[endpos] >= 0x80 && ChatQueue[endpos] < 0xc0) endpos--; + ChatQueue[endpos] = 0; + ChatQueue.Clamp(endpos + 1); + CharLen--; } } @@ -322,8 +334,12 @@ static void CT_BackSpace () static void CT_ClearChatMessage () { - ChatQueue[0] = 0; - len = 0; + if (ChatQueue.Size() > 1) + { + ChatQueue.Clamp(1); + ChatQueue[0] = 0; + CharLen = 0; + } } //=========================================================================== @@ -355,11 +371,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 +408,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 +428,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 +436,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 +454,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 +472,7 @@ static bool DoSubstitution (FString &out, const char *in) } } } - else if (len == 0) + else if (ByteLen == 0) { out += '$'; if (*b == '$') @@ -467,7 +483,7 @@ static bool DoSubstitution (FString &out, const char *in) else { out += '$'; - out.AppendCStrPart(a, len); + out.AppendCStrPart(a, ByteLen); } a = b; } From deb233677ee5d48be147a6f0ec134606b06698bb Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 16 Feb 2019 21:29:46 +0100 Subject: [PATCH 32/95] - made the menu's text input handler Unicode capable. Also make sure that the savegame description remains readable. Unlike in-game text this can be done without double-encoding existing UTF-8. --- src/c_console.cpp | 7 ++--- src/ct_chat.cpp | 5 ++- src/events.cpp | 3 +- src/menu/loadsavemenu.cpp | 17 +++++----- src/scripting/thingdef_data.cpp | 14 +++++++++ src/serializer.cpp | 33 ++++++++++++++++++-- src/serializer.h | 1 + src/utility/utf8.cpp | 10 ++++++ src/utility/utf8.h | 1 + src/utility/zstring.cpp | 23 ++++++++++++++ src/utility/zstring.h | 3 ++ wadsrc/static/zscript/base.txt | 2 ++ wadsrc/static/zscript/menu/textentermenu.txt | 22 +++++++------ 13 files changed, 111 insertions(+), 30 deletions(-) diff --git a/src/c_console.cpp b/src/c_console.cpp index 3185267f2a..12d76adba4 100644 --- a/src/c_console.cpp +++ b/src/c_console.cpp @@ -412,14 +412,13 @@ public: void AddChar(int character) { - uint8_t encoded[5]; int size; - if (utf8_encode(character, encoded, &size) == 0) + auto encoded = MakeUTF8(character, &size); + if (*encoded != 0) { - encoded[size] = 0; if (Text.IsEmpty()) { - Text = (char*)encoded; + Text = encoded; } else { diff --git a/src/ct_chat.cpp b/src/ct_chat.cpp index 1580916e01..6628703ab5 100644 --- a/src/ct_chat.cpp +++ b/src/ct_chat.cpp @@ -292,9 +292,8 @@ static void CT_AddChar (int c) if (CharLen < QUEUESIZE-2) { int size; - uint8_t encode[4]; - ChatQueue.Pop(); - if (utf8_encode(c, encode, &size) == 0) + auto encode = MakeUTF8(c, &size); + if (*encode) { for (int i = 0; i < size; i++) { 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/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/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index d4a67339c9..7eed56ad75 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -1158,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/serializer.cpp b/src/serializer.cpp index e8a84f353f..ab66c792a8 100644 --- a/src/serializer.cpp +++ b/src/serializer.cpp @@ -221,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); @@ -813,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. // //========================================================================== @@ -822,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/utility/utf8.cpp b/src/utility/utf8.cpp index d6e3e7edf8..1a8e4648a8 100644 --- a/src/utility/utf8.cpp +++ b/src/utility/utf8.cpp @@ -247,3 +247,13 @@ const char *MakeUTF8(const char *outline, int *numchars = nullptr) 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 index 60531b12fd..cb437a2a1f 100644 --- a/src/utility/utf8.h +++ b/src/utility/utf8.h @@ -4,5 +4,6 @@ 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/zstring.cpp b/src/utility/zstring.cpp index 04e6173f7a..5845d47c32 100644 --- a/src/utility/zstring.cpp +++ b/src/utility/zstring.cpp @@ -39,6 +39,7 @@ #include "zstring.h" #include "v_text.h" +#include "utf8.h" FNullStringData FString::NullString = { @@ -475,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 && Chars[pos] >= 0x80 && 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); diff --git a/src/utility/zstring.h b/src/utility/zstring.h index 4fd756ff51..4c3a3b5413 100644 --- a/src/utility/zstring.h +++ b/src/utility/zstring.h @@ -208,6 +208,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; diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index be73e3f4df..a6c52d03f0 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -894,6 +894,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/menu/textentermenu.txt b/wadsrc/static/zscript/menu/textentermenu.txt index db38896b3d..73ff9ef9de 100644 --- a/wadsrc/static/zscript/menu/textentermenu.txt +++ b/wadsrc/static/zscript/menu/textentermenu.txt @@ -49,6 +49,7 @@ class TextEnterMenu : Menu int InputGridX; int InputGridY; bool AllowColors; + Font displayFont; //============================================================================= // @@ -76,6 +77,7 @@ class TextEnterMenu : Menu InputGridY = 0; } AllowColors = allowcolors; // [TP] + displayFont = SmallFont; } static TextEnterMenu Open(Menu parent, String textbuffer, int maxlen, int sizemode, bool showgrid = false, bool allowcolors = false) @@ -115,9 +117,9 @@ class TextEnterMenu : Menu { mInputGridOkay = false; if (mEnterString.Length() < mEnterSize && - (mSizeMode == 2/*entering player name*/ || SmallFont.StringWidth(mEnterString) < (mEnterSize-1)*8)) + (mSizeMode == 2/*entering player name*/ || displayFont.StringWidth(mEnterString) < (mEnterSize-1)*8)) { - mEnterString.AppendFormat("%c", ev.KeyChar); + mEnterString.AppendCharacter(ev.KeyChar); } return true; } @@ -126,7 +128,7 @@ class TextEnterMenu : Menu { if (mEnterString.Length() > 0) { - mEnterString.Truncate(mEnterString.Length() - 1); + mEnterString.DeleteLastCharacter(); } } else if (ev.Type == UIEvent.Type_KeyDown) @@ -269,7 +271,7 @@ class TextEnterMenu : Menu } } else if (mEnterString.Length() < mEnterSize && - (mSizeMode == 2/*entering player name*/ || SmallFont.StringWidth(mEnterString) < (mEnterSize-1)*8)) + (mSizeMode == 2/*entering player name*/ || displayFont.StringWidth(mEnterString) < (mEnterSize-1)*8)) { mEnterString = mEnterString .. c; } @@ -298,7 +300,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 +321,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 +330,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 +338,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 +348,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); } } From d39a6249428c69ae5c2573571c9ae5de2aa80aa3 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 16 Feb 2019 22:57:02 +0100 Subject: [PATCH 33/95] - fixed the player name display. This was broken by several small unicode-incompatible code fragments. This commit also removes the input limit for the player name and the savegame description. With multibyte encoding, limiting them to a fixed length did not work right. Currently these will just overflow the fields if the text becomes too long, this needs some additional work. --- src/d_player.h | 2 -- src/utility/configfile.cpp | 34 +++++++++---------- src/utility/utf8.cpp | 6 ++-- wadsrc/static/zscript/constants.txt | 1 - wadsrc/static/zscript/menu/loadsavemenu.txt | 5 ++- wadsrc/static/zscript/menu/playercontrols.txt | 6 ++-- 6 files changed, 25 insertions(+), 29 deletions(-) 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/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/utility/utf8.cpp b/src/utility/utf8.cpp index 1a8e4648a8..14f7b79833 100644 --- a/src/utility/utf8.cpp +++ b/src/utility/utf8.cpp @@ -94,7 +94,7 @@ int utf8_decode(const uint8_t *src, int *size) return c; } - int c1 = src[1]; + int c1 = src[1] & 0x3f; if ((c & 0xE0) == 0xC0) { @@ -107,7 +107,7 @@ int utf8_decode(const uint8_t *src, int *size) return -1; } - int c2 = src[2]; + int c2 = src[2] & 0x3f; if ((c & 0xF0) == 0xE0) { @@ -120,7 +120,7 @@ int utf8_decode(const uint8_t *src, int *size) return -1; } - int c3 = src[3]; + int c3 = src[3] & 0x3f; if ((c & 0xF8) == 0xF0) { diff --git a/wadsrc/static/zscript/constants.txt b/wadsrc/static/zscript/constants.txt index 0df0174859..6ac2ddc273 100644 --- a/wadsrc/static/zscript/constants.txt +++ b/wadsrc/static/zscript/constants.txt @@ -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/menu/loadsavemenu.txt b/wadsrc/static/zscript/menu/loadsavemenu.txt index 09cf2a33bb..e6e453d367 100644 --- a/wadsrc/static/zscript/menu/loadsavemenu.txt +++ b/wadsrc/static/zscript/menu/loadsavemenu.txt @@ -460,8 +460,7 @@ class SaveMenu : LoadSaveMenu // // //============================================================================= - const SAVESTRINGSIZE = 32; - + override bool MenuEvent (int mkey, bool fromcontroller) { if (Super.MenuEvent(mkey, fromcontroller)) @@ -476,7 +475,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.Open(self, SavegameString, -1, 1, fromcontroller); mInput.ActivateMenu(); mEntering = true; } diff --git a/wadsrc/static/zscript/menu/playercontrols.txt b/wadsrc/static/zscript/menu/playercontrols.txt index 6b3a9bcf49..70eceb727e 100644 --- a/wadsrc/static/zscript/menu/playercontrols.txt +++ b/wadsrc/static/zscript/menu/playercontrols.txt @@ -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.Open(Menu.GetCurrentMenu(), mPlayerName, -1, 2, fromcontroller); mEnter.ActivateMenu(); return true; } From f512f292707ec9172214fadf731ae22d1cd1f66a Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 17 Feb 2019 08:50:49 +0100 Subject: [PATCH 34/95] - fixed crash log display. This still contained pieces where a multibyte string was passed through SendMessage and WM_SETTEXT. All these have been replaced with SetWindowTextW. This commit also removes the never used crash log upload code and all associated assets because it is extremely unlikely that such a feature will ever be implemented. --- src/win32/boing1.ico | Bin 766 -> 0 bytes src/win32/boing2.ico | Bin 766 -> 0 bytes src/win32/boing3.ico | Bin 766 -> 0 bytes src/win32/boing4.ico | Bin 766 -> 0 bytes src/win32/boing5.ico | Bin 766 -> 0 bytes src/win32/boing6.ico | Bin 766 -> 0 bytes src/win32/boing7.ico | Bin 766 -> 0 bytes src/win32/boing8.ico | Bin 766 -> 0 bytes src/win32/i_crash.cpp | 1079 ++--------------------------------------- src/win32/zdoom.rc | 30 -- 10 files changed, 30 insertions(+), 1079 deletions(-) delete mode 100644 src/win32/boing1.ico delete mode 100644 src/win32/boing2.ico delete mode 100644 src/win32/boing3.ico delete mode 100644 src/win32/boing4.ico delete mode 100644 src/win32/boing5.ico delete mode 100644 src/win32/boing6.ico delete mode 100644 src/win32/boing7.ico delete mode 100644 src/win32/boing8.ico diff --git a/src/win32/boing1.ico b/src/win32/boing1.ico deleted file mode 100644 index ba19283332f9ba4ecdd1b3dd557fa0edf058b526..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmZvaF>-`33`IrAOlB)mr440nu{jz?pmn9IaFi`mQpPixDDTU#ursj{)|aLKjj&nA z9LHDF_=WzknKy&IeJHzCC^F?^(6gsj7*(FBgNH~I&z#n(%IN1j#^ zt8Kj?7ferGVS+mrfj5ql4Gd4U+^1j033d+J!`Lts2`xX-5pUZhcq(kaha@S-0b5yn zBNMUoc^!Vuu0Lk){FMQFxnYZ0k9E^w+%Da*#{oX)bW5x2Z*Yj~8&0^d(%{@p6X`$E CwrOnu diff --git a/src/win32/boing2.ico b/src/win32/boing2.ico deleted file mode 100644 index 083f6b21ca503e6cf88026fc602aceba8bbe5d4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmZvaJx;|i5QH}b38e}ZEh)Lh<7hcTT35b`kMc^&l&pkUzFFt}N!VH2GoGDwoR|&t zWqCEVuP3uN<_}^aK8eAe8ENcYn$$f*%$kp_t5yV^MQe>&Oypw`S`l$WsY*Ix-V;vKw}GoZLg09?pv-?#Wnsp7YSaPO6?}ntYp7{fc9slqn3& zqGNet>|m=p78nhf_m#4;Jn$@9lrZq}qXj%~Av zXI&pn_I79X#Q1`*_$xlyJztF4VPa>8GFyLb+Z5qE1hrO1Wum_pp$O+uN}s>1l!)Tr zl@M;xMq&nIP%`1+(MsWSQKAJUQ3k;kCHCEHAq3OVim)dpr2tHY&^z{hPUg_)xX+dv z;0BYHfqhY@u!abqZ@B9+Y4p`(4~tMIK5$S7dNT^3g`G@`LSF%x?!`|Jls z1kC?sr#RYEL=eaxVFV}*tPONA6T2`g7})a!8W;_D+HMhO5QW|A)>@O~D3fyN|D3ft zqn`S8_%u6zm_6&1@P{j2%})5V-JIK{JNDbaKRHv)zS9*AX}zO~_E~eV&YY8}zW|C? BX|(_V diff --git a/src/win32/boing4.ico b/src/win32/boing4.ico deleted file mode 100644 index d8f60c0d6a9e5a99c8a2a991835ac7e7e4dee092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmZvaJ#ND=429{sK;g-qvesj7ksi%Q$f}7~(NQvH^jHB!+3!hKoB)+fnU8#Y`ZXKq z%kpk&w->V$|4(eezOcbw8ENEt6T4L?vewVmRUSsi$vN{^B7!6^s)sZ0hW~OSWU_P+dOq5#V9jh9mZ{kL!1FQq|z60XI?0`HPk=k|11#`?g-knfb#*Pi5D8~i5=>7Uy zQ6EDskM%kHnw@{lKDd<`d%I%UY{Z83FkYA5*mDCva)#XM#w!}q`bHD&v*utMZBC~C E1ODD>$p8QV diff --git a/src/win32/boing5.ico b/src/win32/boing5.ico deleted file mode 100644 index 085a991116a2abef89dff164c0151287493def78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmZvaF>b>!3`OatK#|Fvx;A5Pksi%Q@XAS7@li5%^jHE#+4m*cPJl|Lq_6+=Y0)+t z=$Ff@seL_}y)l0f7vhr`?3s}Uw>7ET3GGbvv1!tZptD$(g;_gUAIsE=pleIRf30}Q z@SVwYHp(VGm-G_u8BO5{S0%GHU{G_u3mPR{d^J0FoY2kzPD>xm*qSw~=Hb4Q3?-80 zDI8LEJfB%Ltf|Bp6*KBo-r=IHC>virc1#w%VZ*zIYvLzD=1gTBqb@oQ^25N(prp^^ zfl+cnG2*KS1&E530wp!B1{@X+70{tNPU>a-M)2Og08%`36P3FQunnqL8x;y9#|Km< z?_aBHwuwxc%c=ejzh>7Tvv;zN#LJCX%ud8G9l_tFf9$b=?=`~$CQdgz3-l8`|LGD_k@BzfNg2nl9&VIfVE-r z2p6z5F~P*Z`@pz?IS+-qMsd!A15ieJ(arQlL!;%;wzd9M|F3?EGW)PS=FJT(D|3W7B#wZkO)Z;{e}trV7U93mVe;MicF`dT?)g HPg?&0kos&3 diff --git a/src/win32/boing7.ico b/src/win32/boing7.ico deleted file mode 100644 index a5864b22a8ecb608a4b36194acd159e2249dd60f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmZvaF>b^#36dF)enCnsR&@tCZA*LpYSY z;{mu;(-fm3ETmaTIdBw3RJ6q#r{Pn_Ew1FMkpoi`tJ7^bRZlPUbLu8@8Kbs=03CpB z$7)DtN_mt@)fARMY#ONpjIBe6Av_#7iq4m7lN7eyP$j5L3v&ZOjB~1N4bpc%;CUgP zT>JVQe$6gFX75xT@s}&Un)P@$-<{W`H}+`YGpAcyUVlYHTHk1*eNhb_QmaYnKW86p Aw*UYD diff --git a/src/win32/boing8.ico b/src/win32/boing8.ico deleted file mode 100644 index 9fcbc853e97a040a58c6237e4cbc877bc807a089..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmZvaF>=Hp3`ONQGnuVOl{PMOi_Ot|1X?Pt;-hSta?3E233*>)?cJFG0>1Romoa7& zeOX>j?d!?xjr9Xtuup8VXJ#6)TN67@$g}#eb=3}|v)Q(dRi5s{de;u4%cbeR)_W;; zu~K_0rPV=A!X4LeKo*_lDn@N$*PYP(wBwe|5>(>M3~&ov-PHms 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 @@ -1940,17 +1858,12 @@ static INT_PTR CALLBACK OverviewDlgProc (HWND hDlg, UINT message, WPARAM wParam, if (link->msg == WM_LBUTTONDOWN) { ShellExecuteA (NULL, "open", BUGS_FORUM_URL, NULL, NULL, 0); - SetWindowLongPtr (hDlg, DWLP_MSGRESULT, 1); + 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; } @@ -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) { 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); @@ -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 @@ -3320,15 +2308,8 @@ void DisplayCrashLog () 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/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 From 78d0fa926923dd6d34a537c1a6bbfc5c7fe44be0 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 17 Feb 2019 10:10:41 +0100 Subject: [PATCH 35/95] - fixed Windows startup. * the window class name was still ASCII, thanks to some totally pointless and ultimately dangerous type cast to LPCTSTR which rendered all type checks ineffective. * use wWinMain instead of WinMain so that a Unicode argv gets created. For whatever reason, the ANSI startup leaves this variable empty. * added a 'disablecrashlog' CCMD for Windows. It is a lot more useful with a debugger present to get the standard crash notification from the system which allows opening a debugger than the crash log and no option to open a debugger. --- src/win32/i_main.cpp | 37 ++++++++++++++++++++++++++----------- src/win32/resource.h | 10 ---------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/win32/i_main.cpp b/src/win32/i_main.cpp index f3ab51d734..e6a63980c6 100644 --- a/src/win32/i_main.cpp +++ b/src/win32/i_main.cpp @@ -151,7 +151,7 @@ DYN_WIN32_SYM(SHGetKnownFolderPath); // 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; @@ -766,7 +766,7 @@ 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); - SendMessageW (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); @@ -834,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"}); @@ -957,7 +965,7 @@ 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)) @@ -966,9 +974,9 @@ void DoMain (HINSTANCE hInstance) /* create window */ FStringf caption("" GAMESIG " %s " X64 " (%s)", GetVersionString(), GetGitTime()); std::wstring wcaption = caption.WideString(); - Window = CreateWindowEx( + Window = CreateWindowExW( WS_EX_APPWINDOW, - (LPCTSTR)WinClassName, + WinClassName, wcaption.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN, x, y, width, height, @@ -1253,13 +1261,20 @@ 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; @@ -1276,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 (); 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 From d5977e180213cc8f66936f71b170090b152b2dd4 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 17 Feb 2019 10:30:44 +0100 Subject: [PATCH 36/95] - set a kerning of -1 for both BigFonts. --- wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/font.inf | 1 + wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/font.inf | 1 + 2 files changed, 2 insertions(+) create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/font.inf create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/font.inf 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..1794c6c03f --- /dev/null +++ b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/font.inf @@ -0,0 +1 @@ +Kerning -1 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 From 9dfffb6697ddb9065c277b1d30a98a5339bcd0e3 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 17 Feb 2019 11:43:04 +0100 Subject: [PATCH 37/95] - moved font code into a subdirectory. --- src/CMakeLists.txt | 8 +- src/{ => gamedata/fonts}/v_font.cpp | 18 ++- src/{ => gamedata/fonts}/v_font.h | 1 + src/gamedata/fonts/v_text.cpp | 237 ++++++++++++++++++++++++++++ src/{ => gamedata/fonts}/v_text.h | 0 src/{v_text.cpp => v_drawtext.cpp} | 189 ---------------------- 6 files changed, 261 insertions(+), 192 deletions(-) rename src/{ => gamedata/fonts}/v_font.cpp (99%) rename src/{ => gamedata/fonts}/v_font.h (99%) create mode 100644 src/gamedata/fonts/v_text.cpp rename src/{ => gamedata/fonts}/v_text.h (100%) rename src/{v_text.cpp => v_drawtext.cpp} (66%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b0789d91eb..a6b22efdae 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -655,6 +655,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 @@ -966,13 +967,12 @@ set (PCH_SOURCES statistics.cpp stats.cpp v_2ddrawer.cpp + v_drawtext.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 @@ -1125,6 +1125,8 @@ set (PCH_SOURCES gamedata/textures/formats/tgatexture.cpp gamedata/textures/hires/hqresize.cpp gamedata/textures/hires/hirestex.cpp + gamedata/fonts/v_font.cpp + gamedata/fonts/v_text.cpp gamedata/p_xlat.cpp gamedata/xlat/parse_xlat.cpp gamedata/xlat/parsecontext.cpp @@ -1339,6 +1341,7 @@ include_directories( . g_shared gamedata gamedata/textures + gamedata/fonts rendering sound sound/oplsynth @@ -1457,6 +1460,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/.+") diff --git a/src/v_font.cpp b/src/gamedata/fonts/v_font.cpp similarity index 99% rename from src/v_font.cpp rename to src/gamedata/fonts/v_font.cpp index 37a54d3819..7caf60369f 100644 --- a/src/v_font.cpp +++ b/src/gamedata/fonts/v_font.cpp @@ -1098,6 +1098,22 @@ FFont::FFont (const char *name, const char *nametemplate, const char *filetempla 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); + } + } } } } @@ -1701,7 +1717,7 @@ void FFont::LoadTranslations() static_cast(Chars[i].TranslatedPic->GetImage())->SetSourceRemap(PatchRemap); } - BuildTranslations (Luminosity.Data(), identity, &TranslationParms[0][0], ActiveColors, nullptr); + BuildTranslations (Luminosity.Data(), identity, &TranslationParms[TranslationType][0], ActiveColors, nullptr); } //========================================================================== diff --git a/src/v_font.h b/src/gamedata/fonts/v_font.h similarity index 99% rename from src/v_font.h rename to src/gamedata/fonts/v_font.h index de2482d99e..a4bf7c7386 100644 --- a/src/v_font.h +++ b/src/gamedata/fonts/v_font.h @@ -118,6 +118,7 @@ protected: int SpaceWidth; int FontHeight; int GlobalKerning; + int TranslationType = 0; char Cursor; bool noTranslate; bool translateUntranslated; 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/v_text.cpp b/src/v_drawtext.cpp similarity index 66% rename from src/v_text.cpp rename to src/v_drawtext.cpp index e7634fa5ed..1ab1e7c647 100644 --- a/src/v_text.cpp +++ b/src/v_drawtext.cpp @@ -263,192 +263,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)); -} From 7f1f25d99898199be13b6090a2d7a25d99f5b271 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 17 Feb 2019 12:00:04 +0100 Subject: [PATCH 38/95] - split the FSingleLumpFont class into its own file. --- src/CMakeLists.txt | 1 + src/gamedata/fonts/fontinternals.h | 16 + src/gamedata/fonts/singlelumpfont.cpp | 653 ++++++++++++++++++++++++++ src/gamedata/fonts/v_font.cpp | 630 +------------------------ 4 files changed, 681 insertions(+), 619 deletions(-) create mode 100644 src/gamedata/fonts/fontinternals.h create mode 100644 src/gamedata/fonts/singlelumpfont.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a6b22efdae..e55885b01d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1125,6 +1125,7 @@ set (PCH_SOURCES gamedata/textures/formats/tgatexture.cpp gamedata/textures/hires/hqresize.cpp gamedata/textures/hires/hirestex.cpp + gamedata/fonts/singlelumpfont.cpp gamedata/fonts/v_font.cpp gamedata/fonts/v_text.cpp gamedata/p_xlat.cpp diff --git a/src/gamedata/fonts/fontinternals.h b/src/gamedata/fonts/fontinternals.h new file mode 100644 index 0000000000..c64dd54eaf --- /dev/null +++ b/src/gamedata/fonts/fontinternals.h @@ -0,0 +1,16 @@ +#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 +}; + + +extern TArray TranslationParms[2]; 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/v_font.cpp b/src/gamedata/fonts/v_font.cpp index 7caf60369f..8fdf150bdd 100644 --- a/src/gamedata/fonts/v_font.cpp +++ b/src/gamedata/fonts/v_font.cpp @@ -3,7 +3,8 @@ ** Font management ** **--------------------------------------------------------------------------- -** Copyright 1998-2008 Randy Heit +** Copyright 1998-2016 Randy Heit +** Copyright 2005-2019 Christoph Oelckers ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without @@ -32,45 +33,6 @@ ** */ -/* 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 @@ -94,6 +56,8 @@ The FON2 header is followed by variable length data: #include "utf8.h" #include "textures/formats/fontchars.h" +#include "fontinternals.h" + // MACROS ------------------------------------------------------------------ #define DEFAULT_LOG_COLOR PalEntry(223,223,223) @@ -101,49 +65,12 @@ The FON2 header is followed by variable length data: // 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: @@ -201,7 +128,7 @@ int NumTextColors; // PRIVATE DATA DEFINITIONS ------------------------------------------------ -static TArray TranslationParms[2]; +TArray TranslationParms[2]; static TArray TranslationLookup; static TArray TranslationColors; @@ -987,12 +914,13 @@ FFont *V_GetFont(const char *name, const char *fontlumpname) if ((head & MAKE_ID(255,255,255,0)) == MAKE_ID('F','O','N',0) || head == MAKE_ID(0xE1,0xE6,0xD5,0x1A)) { - return new FSingleLumpFont (name, lump); + FFont *CreateSingleLumpFont (const char *fontname, int lump); + return CreateSingleLumpFont (name, lump); } } - FTextureID picnum = TexMan.CheckForTexture (name, ETextureType::Any); - if (picnum.isValid()) - { + FTextureID picnum = TexMan.CheckForTexture (name, ETextureType::Any); + if (picnum.isValid()) + { FTexture *tex = TexMan.GetTexture(picnum); if (tex && tex->GetSourceLump() >= folderfile) { @@ -1002,7 +930,7 @@ FFont *V_GetFont(const char *name, const char *fontlumpname) if (folderdata.Size() > 0) { return new FFont(name, nullptr, name, HU_FONTSTART, HU_FONTSIZE, 1, -1); - } + } } return font; } @@ -1736,542 +1664,6 @@ FFont::FFont (int lump) 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_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; - } -} - //========================================================================== // // FSinglePicFont :: FSinglePicFont From 1f0c01459a73c4dc6ae9d13f9d3def1f380cb0d2 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 17 Feb 2019 12:29:08 +0100 Subject: [PATCH 39/95] - split FSinglePicFont into its own file. --- src/CMakeLists.txt | 1 + src/gamedata/fonts/singlepicfont.cpp | 127 +++++++++++++++++++++++++++ src/gamedata/fonts/v_font.cpp | 86 +----------------- 3 files changed, 130 insertions(+), 84 deletions(-) create mode 100644 src/gamedata/fonts/singlepicfont.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e55885b01d..0bf300a18d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1126,6 +1126,7 @@ set (PCH_SOURCES gamedata/textures/hires/hqresize.cpp gamedata/textures/hires/hirestex.cpp gamedata/fonts/singlelumpfont.cpp + gamedata/fonts/singlepicfont.cpp gamedata/fonts/v_font.cpp gamedata/fonts/v_text.cpp gamedata/p_xlat.cpp 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/v_font.cpp b/src/gamedata/fonts/v_font.cpp index 8fdf150bdd..6a1dc1f70a 100644 --- a/src/gamedata/fonts/v_font.cpp +++ b/src/gamedata/fonts/v_font.cpp @@ -71,19 +71,6 @@ struct TranslationMap int Number; }; -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 { @@ -924,7 +911,8 @@ FFont *V_GetFont(const char *name, const char *fontlumpname) FTexture *tex = TexMan.GetTexture(picnum); if (tex && tex->GetSourceLump() >= folderfile) { - return new FSinglePicFont (name); + FFont *CreateSinglePicFont(const char *name); + return CreateSinglePicFont (name); } } if (folderdata.Size() > 0) @@ -1664,76 +1652,6 @@ FFont::FFont (int lump) for (auto &p : PatchRemap) p = pp++; } -//========================================================================== -// -// 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 From 9102fb86a5a648cf1e02dc735f5e85ad5c9f0b8c Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 17 Feb 2019 12:53:12 +0100 Subject: [PATCH 40/95] - moved FSpecialFont to its own file. --- src/CMakeLists.txt | 1 + src/gamedata/fonts/fontinternals.h | 2 + src/gamedata/fonts/specialfont.cpp | 221 +++++++++++++++++++++++++++++ src/gamedata/fonts/v_font.cpp | 189 ++---------------------- src/gamedata/textures/textures.h | 1 - 5 files changed, 232 insertions(+), 182 deletions(-) create mode 100644 src/gamedata/fonts/specialfont.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0bf300a18d..9005c99db8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1127,6 +1127,7 @@ set (PCH_SOURCES gamedata/textures/hires/hirestex.cpp gamedata/fonts/singlelumpfont.cpp gamedata/fonts/singlepicfont.cpp + gamedata/fonts/specialfont.cpp gamedata/fonts/v_font.cpp gamedata/fonts/v_text.cpp gamedata/p_xlat.cpp diff --git a/src/gamedata/fonts/fontinternals.h b/src/gamedata/fonts/fontinternals.h index c64dd54eaf..b74220c38c 100644 --- a/src/gamedata/fonts/fontinternals.h +++ b/src/gamedata/fonts/fontinternals.h @@ -14,3 +14,5 @@ struct TranslationParm extern TArray TranslationParms[2]; + +void RecordTextureColors (FImageSource *pic, uint8_t *usedcolors); diff --git a/src/gamedata/fonts/specialfont.cpp b/src/gamedata/fonts/specialfont.cpp new file mode 100644 index 0000000000..d90cb330b7 --- /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; + 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 *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 index 6a1dc1f70a..fc7cb44fb4 100644 --- a/src/gamedata/fonts/v_font.cpp +++ b/src/gamedata/fonts/v_font.cpp @@ -65,24 +65,6 @@ // TYPES ------------------------------------------------------------------- void RecordTextureColors (FImageSource *pic, uint8_t *colorsused); -struct TranslationMap -{ - FName Name; - int Number; -}; - -// 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]; @@ -96,6 +78,12 @@ struct TempColorInfo PalEntry LogColor; }; +struct TranslationMap +{ + FName Name; + int Number; +}; + // EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- // PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- @@ -1652,168 +1640,6 @@ FFont::FFont (int lump) for (auto &p : PatchRemap) p = pp++; } -//========================================================================== -// -// 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 @@ -1997,7 +1823,8 @@ void V_InitCustomFonts() } if (count > 0) { - FFont *fnt = new FSpecialFont (namebuffer, first, count, &lumplist[first], notranslate, llump, donttranslate); + 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); } } diff --git a/src/gamedata/textures/textures.h b/src/gamedata/textures/textures.h index 42affa0366..7ecb806219 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: From 0963156c0a3b222998159bb915c70abd8a563d32 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 17 Feb 2019 13:41:04 +0100 Subject: [PATCH 41/95] - did a bit of fine tuning to the character replacement mappings: * prefer accent-less lower case over uppercase letters if an accented lower case letter cannot be found. * added accent-less mappings for Latin Extended 1 (0x100-0x17f) and some easy to handle characters between 0x200 and 0x220. This should allow to display all Eastern European text without empty gaps for missing letters. --- src/gamedata/fonts/v_font.cpp | 123 +++++++++++++++++++--------------- 1 file changed, 70 insertions(+), 53 deletions(-) diff --git a/src/gamedata/fonts/v_font.cpp b/src/gamedata/fonts/v_font.cpp index fc7cb44fb4..9b95876cf7 100644 --- a/src/gamedata/fonts/v_font.cpp +++ b/src/gamedata/fonts/v_font.cpp @@ -809,52 +809,67 @@ static bool myislower(int code) return false; } -// Returns a character without an accent mark. -// FIXME: Only valid for CP-1252; we should go Unicode at some point. +// Returns a character without an accent mark (or one with a similar looking accent in some cases where direct support is unlikely. 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' - // fixme: codes above 0x100 not supported yet! + 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; } @@ -1442,18 +1457,12 @@ int FFont::GetCharCode(int code, bool needpic) const { return code; } - // 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) + + 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)) @@ -1461,6 +1470,14 @@ int FFont::GetCharCode(int code, bool needpic) const 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; } From 95e62e91bb32831888f9557d6152e7529cb3c328 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 17 Feb 2019 13:50:57 +0100 Subject: [PATCH 42/95] - split the FFont base class into its own file. --- src/CMakeLists.txt | 1 + src/gamedata/fonts/font.cpp | 836 +++++++++++++++++++++++++++++ src/gamedata/fonts/fontinternals.h | 26 + src/gamedata/fonts/v_font.cpp | 801 +-------------------------- 4 files changed, 867 insertions(+), 797 deletions(-) create mode 100644 src/gamedata/fonts/font.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9005c99db8..007e3ea12b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1128,6 +1128,7 @@ set (PCH_SOURCES 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 diff --git a/src/gamedata/fonts/font.cpp b/src/gamedata/fonts/font.cpp new file mode 100644 index 0000000000..4b7b5b8da7 --- /dev/null +++ b/src/gamedata/fonts/font.cpp @@ -0,0 +1,836 @@ +/* +** 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" + + + +//========================================================================== +// +// 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; + + 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("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 (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(); +} + +//========================================================================== +// +// 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; + } + + 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; + 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[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 index b74220c38c..1325072993 100644 --- a/src/gamedata/fonts/fontinternals.h +++ b/src/gamedata/fonts/fontinternals.h @@ -12,7 +12,33 @@ struct TranslationParm 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, uint8_t *usedcolors); +bool myislower(int code); +int stripaccent(int code); diff --git a/src/gamedata/fonts/v_font.cpp b/src/gamedata/fonts/v_font.cpp index 9b95876cf7..4dbcc53174 100644 --- a/src/gamedata/fonts/v_font.cpp +++ b/src/gamedata/fonts/v_font.cpp @@ -65,25 +65,6 @@ // TYPES ------------------------------------------------------------------- void RecordTextureColors (FImageSource *pic, uint8_t *colorsused); -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; -}; - // EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- // PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- @@ -104,8 +85,8 @@ int NumTextColors; // PRIVATE DATA DEFINITIONS ------------------------------------------------ TArray TranslationParms[2]; -static TArray TranslationLookup; -static TArray TranslationColors; +TArray TranslationLookup; +TArray TranslationColors; // CODE -------------------------------------------------------------------- @@ -803,7 +784,7 @@ void InitLowerUpper() } -static bool myislower(int code) +bool myislower(int code) { if (code >= 0 && code < 65536) return islowermap[code]; return false; @@ -811,7 +792,7 @@ static bool myislower(int code) // Returns a character without an accent mark (or one with a similar looking accent in some cases where direct support is unlikely. -static int stripaccent(int code) +int stripaccent(int code) { if (code < 0x8a) return code; @@ -926,780 +907,6 @@ FFont *V_GetFont(const char *name, const char *fontlumpname) return font; } -//========================================================================== -// -// 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; - - 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("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 (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(); -} - -//========================================================================== -// -// 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; - } - - 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; - 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[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; - } - } -} - - //========================================================================== // // V_InitCustomFonts From 45d75745f0e0b1914b6671ea34b92b095a961f02 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 17 Feb 2019 19:15:57 +0100 Subject: [PATCH 43/95] - reworked console font loading to use the glyph sheets directly and allowing to load more than one per font. --- src/gamedata/fonts/font.cpp | 304 ++++++++++++++++------- src/gamedata/fonts/v_font.cpp | 45 ++-- src/gamedata/fonts/v_font.h | 4 + wadsrc/static/confont.lmp | Bin 10302 -> 0 bytes wadsrc/static/fonts/consolefont/0000.png | Bin 0 -> 3827 bytes wadsrc/static/fonts/consolefont/0400.png | Bin 0 -> 2073 bytes wadsrc/static/fonts/consolefont/font.inf | 3 + 7 files changed, 239 insertions(+), 117 deletions(-) delete mode 100644 wadsrc/static/confont.lmp create mode 100644 wadsrc/static/fonts/consolefont/0000.png create mode 100644 wadsrc/static/fonts/consolefont/0400.png create mode 100644 wadsrc/static/fonts/consolefont/font.inf diff --git a/src/gamedata/fonts/font.cpp b/src/gamedata/fonts/font.cpp index 4b7b5b8da7..a151f10956 100644 --- a/src/gamedata/fonts/font.cpp +++ b/src/gamedata/fonts/font.cpp @@ -55,6 +55,7 @@ #include "image.h" #include "utf8.h" #include "textures/formats/fontchars.h" +#include "textures/formats/multipatchtexture.h" #include "fontinternals.h" @@ -91,6 +92,7 @@ FFont::FFont (const char *name, const char *nametemplate, const char *filetempla uint8_t pp = 0; for (auto &p : PatchRemap) p = pp++; translateUntranslated = false; + int FixedWidth = 0; maxyoffs = 0; @@ -151,6 +153,14 @@ FFont::FFont (const char *name, const char *nametemplate, const char *filetempla 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); @@ -172,130 +182,236 @@ FFont::FFont (const char *name, const char *nametemplate, const char *filetempla } } - - if (nametemplate != nullptr) + if (FixedWidth > 0) { - 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)); - } - } + ReadSheetFont(folderdata, FixedWidth, FontHeight, Scale); } - if (folderdata.Size() > 0) + else { - // all valid lumps must be named with a hex number that represents its Unicode character index. - for (auto &entry : folderdata) + if (nametemplate != nullptr) { - char *endp; - auto base = ExtractFileBase(entry.name); - auto position = strtoll(base.GetChars(), &endp, 16); - if ((*endp == 0 || (*endp == '.' && position >= '!' && position < 0xffff))) + for (i = 0; i < lcount; i++) { - auto lump = TexMan.CheckForTexture(entry.name, ETextureType::MiscPatch); + 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 ((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); + 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(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 (i = 0; i < count; i++) + for (int 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; - } - } + auto b = pic->Get8BitPixels(false); - 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(); + 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].XMove = width; + } + + if (map1252) + { + // Move the Windows-1252 characters to their proper place. + for (int i = 0x80; i < 0xa0; i++) { - Chars[i].TranslatedPic = nullptr; - Chars[i].XMove = INT_MIN; + 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]); + } } } - - 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(); + SpaceWidth = width; } //========================================================================== diff --git a/src/gamedata/fonts/v_font.cpp b/src/gamedata/fonts/v_font.cpp index 4dbcc53174..4e4a5382f6 100644 --- a/src/gamedata/fonts/v_font.cpp +++ b/src/gamedata/fonts/v_font.cpp @@ -1415,50 +1415,50 @@ EColorRange V_ParseFontColor (const uint8_t *&color_value, int normalcolor, int void V_InitFonts() { InitLowerUpper(); - V_InitCustomFonts (); + V_InitCustomFonts(); // load the heads-up font if (!(SmallFont = V_GetFont("SmallFont", "SMALLFNT"))) { - if (Wads.CheckNumForName ("FONTA_S") >= 0) + if (Wads.CheckNumForName("FONTA_S") >= 0) { - SmallFont = new FFont ("SmallFont", "FONTA%02u", "defsmallfont", HU_FONTSTART, HU_FONTSIZE, 1, -1); + SmallFont = new FFont("SmallFont", "FONTA%02u", "defsmallfont", HU_FONTSTART, HU_FONTSIZE, 1, -1); SmallFont->SetCursor('['); } - else if (Wads.CheckNumForName ("STCFN033", ns_graphics) >= 0) + else if (Wads.CheckNumForName("STCFN033", ns_graphics) >= 0) { - SmallFont = new FFont ("SmallFont", "STCFN%.3d", "defsmallfont", HU_FONTSTART, HU_FONTSIZE, HU_FONTSTART, -1); + 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) + if (Wads.CheckNumForName("STBFN033", ns_graphics) >= 0) { - SmallFont2 = new FFont ("SmallFont2", "STBFN%.3d", "defsmallfont2", HU_FONTSTART, HU_FONTSIZE, HU_FONTSTART, -1); - } + 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); - } + 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; - } } + if (IntermissionFont == nullptr) + { + IntermissionFont = BigFont; + } + } // This can only happen if gzdoom.pk3 is corrupted. ConFont should always be present. if (ConFont == nullptr) { @@ -1472,12 +1472,11 @@ void V_InitFonts() if (SmallFont2 == nullptr) { SmallFont2 = SmallFont; - } + } if (BigFont == nullptr) - { + { BigFont = SmallFont; - } - + } } void V_ClearFonts() diff --git a/src/gamedata/fonts/v_font.h b/src/gamedata/fonts/v_font.h index a4bf7c7386..0702781e99 100644 --- a/src/gamedata/fonts/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; @@ -114,6 +116,8 @@ protected: static int SimpleTranslation (uint8_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; diff --git a/wadsrc/static/confont.lmp b/wadsrc/static/confont.lmp deleted file mode 100644 index 6b68df2e3e3004a2752dc9b53f65d3a06d0a7ec0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10302 zcmcJUO^96Cb;s|mD)p1pno-XbjP3WZOyz}8bmWwJD5yoZ$UvijV#s7MFxnWjuoi<6 z%qDmh(wk%!fm$R1Zw3m3L7PDBvMpwpUB`1a9 zhq4G=@B7|!&pqdV{^#7=fAapH?Ob=)-G92`ZGHqHT=BH!o<9BU+H;3z=Z@X- zuL}-3K;@7&TKyUx!Xf0@bYJazoNDrezZ>4WdDTqphLqaQxV-OcpT zBi%W!*#qy={6Ud!#4b(0pT@Z>QWvk>OIJL*@##;;pE&pIlb?K)x%MTO;#pfwkKMIT z#y|b^*)v*y^pj66y4=z?=R#BBfZ=)_7x#DnIDfy*<=w0w$NhKv{Wyx^-rat`*X>5V ze*f;h-CY;;R((Q;PkFrPE#6=B!BzMzx{KXKe}S}C>|FMKd$%9EtpDb_TqEDTi^#aU z)yw-gdeQDK^6&PdRln7Z-7+p56MwRD?FWDP7ntaK+dEI5>}A{AlS~Kl-qw zguDGXiMvd#$2I9jQNl&nm|>!XE8Ti}ju|MAI{hS$2YFP)*9P%mD~eiC!oYt-7c@#3 zf-BL@br8o1((Q`SC>bOXRz*^@^&(m&n>J+fu11XV-go039ehF~sSrnfJP<`)n$xTM zKc-?7bDzhpB#H@&n91hREz^>weU2oHe7toWx$cW7cmDCt()p)582RzX@9lt*$3OmH zCwE(qKYsM+y&dNs|M=0P4|d$+k5_-{ciubMS$yod|MT0t3Sao7mU-wY0mxaEg7yBT z%MM`IzjJ=&il5v0pX~h4&gU-scjq&g5jo$umfyagKlJb` zp1bJb{{F*<`w#aQ_n&Vs!mIndxxejQe!s1||K2_(06!y;i!p;vY@n%~XMyBVVtxYI z7l6DtXt{#}KsMg=<1so+CY~QJJZ$8DO|%!|jvJ5BU_$e0$4{r;pUk*F-1LWsg#CQ( z`Ke2rE;jJWt*rHmL9!VG`r@!~tGNcf=8ukOwm@+1-a;_r*+FN?M$oL#`B1$!CEmv1 zv&JAK4j`v-;oTU5nJ}hv`E-N6ZZ`8deT%~l?@*2R^A`Pcm)mT9OSfPW1WXHg!++_x zKj035h@TYrqF6WAA*M2OIWreeV~z=O>Q?kXS9&u)$;|O2k~r`#<1A(#7t>_JCL@J3 zkHUXl3(DPcmgD}z!`uV~PZjQ85zSC@L8Lfh&hA&%a_OJDU)JAf!FNrM;h6&R8J07~ z;LOOJOXXJX$Ym&|796yB)5~yXFf&?4OB81;>9@kT6?%|a#z zr3>{`tOe%juff5E`;8gBaiA1!F!-fgV(cZ;T%y<#3ZQ12@O{dmNIT{1ocLWSOnf0% z)S#f93{cX*OWI((31!d3oRCj%n+G zHkG_)$TJOOp#Z?j+pe8*s#Pv0`A>ZI|`3>w(27+(*}2F0CBTTB^8%(`_4*~ttQ zsI9>bBcBPnMwh|@9qdd3wZE;&J5#2bJie+zSp1FN=HF|gc5jp!=Fug;~QPT@2i;~cxunsaMOfoempUm27 zo*iykYa{%CoZ9RH@ORAcI*A`HF#K7pwP+_wlID#K8-Ko*V8ZqYh0eXSbs;bMkYwT)-((W@2bAqRYTl18HoL|*Tp50JSx&*?>OQhY#$p&}z6)y;F z>vJM&s}?YT@{NR|%)0Kk0w2g)@|vZ@n$c))(+H`Dipx0ae2Z30CY6=TEB54CGp!_0 z5-MWw+Zm^b3@s08j?Pis1xmbKQzF)?X84u+g*%xSRB%mv0|N0i)yLN^B;#AgqS)5J zy(|rE@gVDRGzknA#WvUFY%^)Ybxj&<%THCn2Hsp3fN?SKjRr91$$$>k>`+x)5YfnQ zzO{t}rLv54US;8qp)sG`Fhrgq$LH7_e@(6%bagtRJW%PQno=<&ktINy8j0C}q%bGW zctE2T?!OQvgI-RA>!rpuD>R`%buZ4RK&4elwGr!aEAsn>vX!6}@!@D4mk?iQ3}O`! zCNi6C$Uqm6US&q?ae0TUL_^P2Qv8Gs)sBhKik}J$7 z0fr3(UM=lINw<_`u&@PRZMk)it^4AgD+p}8EtTpz**VqJ0BIh|?t%qU0M=FwER1|1 zV^yu?k`47xG?$P#m#fxQfvb!ag`vPba8(USm8-l}fvvA~8!EQBs)T8}mJ zD-$0U2wW~J1$X663mC;8$NZLoOe;ej|Kd7x$6v;35qT_bZILEQE+!`G5>uRR3s)=i z)(Wf}Ewn7g-jh=#m;}U)4CQ~#hy~ov^SJHtf0qn!dJ#*nQQHs1fLX(4dwpoJZ> zh_!fWs9#~?6~(X?YKBh0By_%XUw~X8{|omOwWKoUSMXA9<%FV5ky0X-WjmhvEZ zZBJk%KXDT`_0%d}$=7){vKpK4%qS&{xg**_>6^{v@UZ`)T0qpr%xA$Hh5wD|@FtU$ z4&?Re6#HkhYoc!@EhRvLLHHoP{3%Z`Dj;Cw6*4>KINC8|Yyi5ISxc{N%1GJ_(IL=Q z%z-Y4CZ%SVu(>0QARCLFpBCA1C0s&vaTBW`Tx`h5mhsR@bx_+AZcs$Mr^4q+$8?d( z4UJ?abyWo$DgutTWD^<1(hBma-k9CljgG1lkv@Srg`Kq-BI;0K8L-B(A6y0m^0ve! zcO^fnWtIAgCks%KRhX$bm;0Gnk9vap+P}4}S?f4Bh8l+Luko1m!MK>*0jy{yA8SUk zl~M;z2E2s$avpZKWh`NbevEk?Q3eZX0G_pz_uSUx-!Wf?Z*n|8+8SM8SKFB4Y8z8? zx-u<>@h50@>^^6<^6$|Z9p7$r6ci;@J6_uF5+T$&o*XE8eqolx$FLX5b`-HFSSUg? z9Pw6L8Xf_4>uFnTP_auhXZqoG`hid8irSj*+3&OhJZMInoXV9!Yo=*I3rlACx%*O5 z!ZBm_huJWPaHt&h?nnhiSVUzLYH_Vy*?{C_PQl332`OTbLE5k{bHYRZKXAwb`Cr)P z8JZx9$pdpRXL{u4=2XoWwkbnF{$-YvO;K3m;$}*!9$L6q_G|$GuCs(W*iHb`@RkrX zD2FZ`Cjvz#=>*!!T`b1pXPgC2h#~!Ph1MyANr3d6OG3u+N`L%Ge{3Mcie7-9o8|6? zY{)I$#Y$o0O(Q#k{P$RXL(ed!I%{wZ&yre0YjDhY&fr?QRD?t3XCx*9_d#JsV>}&D z0gUlM;8^VwYmIR6u8@2|9Fa;YUVfcET5PfB0JG)j&#<;5efdaWjCi<(`4tEpSo8IJ zW5EL(72CYNrU6GC22<$elbagV$l!8aU$Va46hSI`(w?NJ4$vC3S{zaisTR-X9mABe zX4t#CaKEf$1y$`I95zwRDYDM4?$oIA$i=O|V(Ej+Wi?i7>Yww+EP*4c7jf7bgmHf+ z@ihwaZ9>3a(blMM{8~lh>D&M|uMoe!7Zg|wbj)s5B&OPc(7t0~weVy6C zuJVWKt#O1wev;6@!J3w`o3ZWrbMdPT8FcYEaJbS=X#o8`Flm{@K2Nu zjOVd#KDG3KVK16_wIyUbS5r2d>eYveVL}Qg;1mkRinw3d0Q4Ss*9O0wyDKnX*6RN$ z4+JD!ysT+JEDR_Ia9o%z>I^{5B`;pwx{fMa9Q^K*mO>!}S*8_jaCEUf&NJ^-6|BQ4 zm^<*?`Jl?(2FYD@Qa+0+Ldr|rv!!6jW0Dl5YhePPTOh)5Gu&SPue%xVw24sl%Jyf& zF9qOoQ>yw`EL6%W;sQ#S`A=DohkDJycA~hf z_SmYX0n;xev_&TG!)VfTCEW96z!+-^;^nXxGiO-TCsSj0|0`Wll fJCD2H2;9wtHD^O8v$CvLYg6t+2$drI^M(H}CpaI4 diff --git a/wadsrc/static/fonts/consolefont/0000.png b/wadsrc/static/fonts/consolefont/0000.png new file mode 100644 index 0000000000000000000000000000000000000000..aa78736f71935569ba563838e0ed9c69c660156e GIT binary patch literal 3827 zcmV$P)C00004XF*Lt006O% z3;baP0000WV@Og>004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0002k zP)t-s0093tH#b*TS3^TXOG`^UJUlNiFElhXBO@al8yf)u0U;qFC@3fs6B7pq2Rl1E zp`oFLg@r{$MJ+8Yr>Cc!oSc`JmyV8(hlhuMe}51V5HK(>R8&-khK6ZrX8f|TDl$4ZMSXh&jlcc1itgNhMWo2MsU@^KKtOA2Ym$L`Pt~$$J0*010qNS#tmY z3y1&!3y1;bjwwk101XLAL_t(|+SOYLcigrS2CXcYoITV!cH&C5o6uESS?=LVZfrSe zw5#L)|D?_Ua{qJ3E~?J22cn}&6DQH(KpScnS{_b)2^F#Juvkx%0x{& z>*f~TwUf4M+j;n6YMwkfY8D zcD`sP9o9EJZ5sTwO>^|JnM~V0gjcU#Spz`i?)B?GK1~gH@x$x*@cM@rsR2L!NDVk@ z+P=q{^oP_n-4x#oYviszp&q~vXep{6s0$`j{KKl7=D5SJ5Z=6@UkHDS1mR8m3*Ffn zH(}g>pMC;r0984ePP*6Okp)r6Tgg(LI2wQ?rvq^8Gy-!_Dp8(%)v5YM^;U2&@g>H&8X--eO$z;-=cBiMO zv3?!{e~Dycp!+sfzp(-MO*{Gsa6*HfD(cg#H#q1b3{w**nBE-w?Iey0>@8{;-WCh` z05S$bdJ&O3uD*hTVK$Le-h#2CDQi#-_HwrPc68*I6uF*iajvHca-#088={#!Tpjt3_D{vw8Lyk4S4(R zLu|pn&dy$5#5_O$j6(sgK7RW2>FCqZQM`Xd_VEg+0a!n_9Q3!i#-O3Qx;j6)6*=&gaju!B`JrrNuz}9zBkVo%Nb^g?XrrwAxOXcf(`h1Ri%Jg z=hvslj<83rtpUpx%kHmR(HGbNstapt@y)3v3+#V<7*3-8u&(D%f%NOIfO%`xQ;F1q zk`_bgQVMJU%I!?Yz#NBLOEqD&vC73#i5}m+`!~^rpdp0ckU&sbQXGa-~%Z>EmA`vE)4v>oWB?Qe@+>B9`0=8z_i*9b10sctR0KGwshMO!0g}D5O z*C@1F0kimv6lLNRi5Em!x-{nSBH!Wz-?xzEOtfAn5opYkgulq+M}#DzOc9a+ESo&7 z*D2gZ)QOWB-QI#1BJmSPL%iRnr_@xRjh=2Lqvp>F%&RLKm<8P30sbHc-`z!-II?(U zDK!Vd?e0z=c=)FTjJrH_M)&u*1o$J41oR9PMl$3nIb%$bmLSmpBV0jUJrl6b)gqDK9pSaiSj}rh=iXq zJ`x%uuGfrPV3|3E@)bw1a2F2}uO&zok*WSzC;h=%B(T0n;B|n$O*l`ugB7ZTjQ<9AUuLJMf5y6c;HZeE_TvQboBe+>q|M7GoNKS;BeZEYichghNyU zCJPUYX_hr!Vej;S?*W%P=x6}P!M?F#HIs|*ET4Nb2mg_RsRe&MQb6AD#BU-!lyVVn z#)8AWM7YRs<1b$>P0GOYdc-B;Glp~5dzrZt1@Ve|F&@NzNRcbOBu@3f+T(c5^SR9C zrVA2|nR5_}>wNx~^v*1hbdouS##@}=A$Z&a0aY;VbU}P&=9~wj==F%?RjuH(L^39r zvkr<_1_+90e-YJWVaa9)r5=$>VV~|Xas1`^6#qKk8{WM>P}$T+vJ)gsXL@HlNI(>U zZHz*17>+A=ugZdA6SMh0(-6%2c6_=t1f=u7RP@b-kr4NR8QypF{$nh9_s^-Z=U}-)ad~$N$d&HFDZs)aMemWhhCh)Lq#8$C9e}dhgS6fxO6qU!N&eq zQv@X)zOH{{GCO``?^om^T-OdB@wS$*;FZ68xj|qlleDw-)%^Jz(pB zFS7@j1k_)_9&q2`QS5=jzWDm~K<+@i+~tRSL{b9)GT}xXi;2emfQlYi<=BokK*;#m zk01tt=ovNx;#YtWGDiW=@ugpYKXQEXeuB)d=e#!AgZLLkEw~472Z)=HaqsMbTk#0m zIzD9f0OQ!%1A=q`ejH?C2RJ*yb-nrx#UF5YClft@IQBN#12IX>9)RGM|D|Ctaxdy~ zT|R|kdaFGUL@kIt0CjsHK4#$s>cm`d!S(e)X%86cx7!2WaxlTsm#P6lamMME*+ie#44cXkN-(d5 zXRysO`1mvkP!6EQ@j@Z#giYlz6<+)-rrvOmYaa|{fuK|W*3mX{+~;O|vJHw18RyUt zcN2o?4}OIDa=_7j;rOQw7N<%oBBVIvh|;K9S6ynVc35dSnHlsE>~ z4COq3fc?+FwrxOv?aZ6h!M=K+mdf`3fVT%JAnhT-Caqw(A$kj-)B_v4J&aP>zM(Gt zlUtD2|8;$_Vxs`@4)_G3S4w(&gNNyt`m7zc~K`#)51tglI^gpsmIjxj^F7X`mqbVtec}IC zJ6{bX`Xw!Mr3Y5w(AARy05r) zHlBtDm&+Fa<{v040Xu+DkoosyAu!rkofJ^(Af_`F8`BjAhLB(R`~5?A9spdr>b##h9Nf-e*qm-W2=T;#t_$2` zFtP)7&HDhMj{kD>kL~c!Z&X3J z_-Iamandn2x_*d6_y)hOFAV>XpZ19;Usb=MstFHvvJzm$oZN&gyHC1K7Cp#BZt!Ke zf;`K+x1uOUHkBPfND73JPk$t1 z@>}@>x6feY{a?&2()JPH4$75&UI6PD z!}ZvZ^Ah-dgc0BDFJx|h!M!eVAsUW%@sU5F;OX0 z{Q|e27Y?}GdE?#b-MT~eB~pmn|I5z{?&5M~`-)q*KT! z#`tMpdtej&uk3-%j>7-e9vE@;cjXHL+7j4&o?x>*;L4Taa~sai3+?8>>-*hyK(=qd z`RhEb?DyrjW*u%7G3^0W0()@Y5eQ$^9uRy#Y{&in_JG?UsN&YdFR=$k z@go`;1bf*7wSublz)g^c!XA)tG1MLIN4RAv$FD6H#OqhhXAOoty@cyN03*}>4PZMr zf8pAE2fHt`2Uxaq#5%9bx#AsM@xH(PpgRao&d&WDU=PS@`XGCNSte)aeh#q*f}IjL z&>krM445bDP46hOx7_4S6Fo+k-*%fHRz`)E9;1l8sRKUo{*w@$B z-`_uf{`~dp*YDrI|NQy$_wV0-|NcEtb`*?;z%UL0wcD-oz%0N}666>Be`EuO;P33J zz^LXd@Q5sCVBk9h!i=ICUJXD&i4xa{lHmNblJdl&REC1Y%)Ao4ywnl}6Foyc(-ijz zVClph?CIhd65;-K`op5z20YD=ReUdhuTS9p;SjX%^}lzwc1Id>3bmvh)f9cdt*#NAXFl}1Sf$Nm zbK&)z?O&5*4n3~edrk6Y!-NZa+5{~99jt;(966>7^RGW$6(79$?zQL73s3aiKjZ8X zu`^h3N>KL#!+TU-)TYISY&V(<2-<{aSy)DyF?wVyoBYb*}=sBgi3sZUCjA>sCtvf1-&@-DQl zI?woE!?noQA1iX2)+hX$ls-9ZX<_QVRrl83Ui$9!4yRk*${RlK^Y0X__#snJJ+DQ! zb-M58ZEMb+6JK{>lbzlZ_4ll&Q*A|S_$rilzb}8%b=M@nChA7!*YcQ!-G>g`+UZ`h z<5@9ZK<=Hu3%u(VADa35b_&-mvpZib*ReLNxXhv!oar~MxWTbmtzlub>7Bb<*2IQf zR9snOz;v#4`|>h7n?SKGS1k{G2%i|;c9V6^UKy=(t-*EAIGH|8=J%hnb5nc)-=7a3 z*uE6|&Y!>G2H%=BP5QgNTBr1!Js#y?apl6n<>mpknyd9sp5^!Tixk!>pJk_JsQX%V zQ{TEZ?m5s1o5TFhd*zP6Tf1k?ol{hCPuL{Fr+KA7@0GunLe8^p?#MQq&up?wIP_)c z*Ub4$FJs%Ena&CNE-YX)Q(L0;+0{E1{``Jtk69k*Fa7$G^Cp94t-Q!w`SMGDhd37ws#9=hylY~?{baZgYQ2d zN$PImJGj3>-r?c3CRuLe`jp6)IX-4Q8nYt)Y#_- iwl-!n|NqT)?HBWzRL(ZGJx#HoBG}W_&t;ucLK6UNH}ReT literal 0 HcmV?d00001 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 + From 3dce45545fce38be73ab481f4499a7c523afb32b Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 17 Feb 2019 21:01:29 +0100 Subject: [PATCH 44/95] - added U-100-U-17f to the console font. This was mostly just accent edits of existing characters, so this also contains the less important characters. --- wadsrc/static/fonts/consolefont/0100.png | Bin 0 -> 2564 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 wadsrc/static/fonts/consolefont/0100.png diff --git a/wadsrc/static/fonts/consolefont/0100.png b/wadsrc/static/fonts/consolefont/0100.png new file mode 100644 index 0000000000000000000000000000000000000000..82a22799eff1fb0cc7cbf0d503e308e45092a79e GIT binary patch literal 2564 zcmeHI|3A|S82^kivoW>LP(w{F|ZAyK}DjKf9J@4oF>3P4N=PC3fdc*Wg^Z)>W z`TF4eHAvIAtFE>tN_9B|4Qz;WBe(&;UmWOa)J9E?i1zW<@YzenrCoY0QqFv z>8R9LfD#p-oQ6t{O+z@KY*G7Tyn{8@Y2!g(oLeBtqqdxtcLTeLF=h5LY(kyeY=4o5 z1_h4wjO6$R9QH&~oS!tV(Ua;Ym-Wxu-}~4QLxhfVlapHiUWAzr2N}~RGbZ%NckaIG zsj*yRy76NQ>T8X@RrJEfl&8;+9ixis(6p2b^$=lVhkA<4UZYx6d&137NMi z$(Y-*XPgH~3p00Crrt(JyHXE>j@~a+0(nC)Z=I<({yF$_7kA4Cp$`NoM#~MX%+i;CSLjT46GnyG-#lBe>|C0J}G458(W_Jsj3lYy=j|- zn(oKG2(d=hrRm*3Zwh)~a=7q*zAmnh^#0e07lu z`?SDoFV6rPayH-a=DVwKK1PA-yKJX|HoyulOznYwG<%eZF8yg~@3hV@`1gr^=9?3~ zjTFpER$=4JpDw^R@d)j&^;`$$8*WwxpM8B4ZgesF)U9N@+5!1_WRkXLX+H~Lx5KoO zd)>WQ+o@|O+~$}SZ}wfW?SX^(q!!toe=^NXwT}1uok(nZ@AI=@yL5_Xi)Uu`f}P-(-o3E- zL(*f5j?88>yTas(95TG(;pO5(mujR}9C9EYrBk|AhHrCte< z(ZhFg(?N+>=M4-xpyyIcAk`kd73XI9GwU(nzk+0giCmGsVHnXsM;_I64XGrS^9LSsMati+g{Ii(!59B)mYOhBk#iHe?ei9hkPR{s;#uIK!^$ z@dQ#8(eO}OW|yBUzSr>8L20FOw|h9m!k=ZEb3b^>;*|x>#G|Ye{Uqq?9S*Z^Q`Gv^ zK`)*7$Qz986q7jr=_+``=*OHk4)2Qg2J@ Date: Sun, 17 Feb 2019 23:18:28 +0100 Subject: [PATCH 45/95] - added German Umlauts for the BigFont and fixed the character substitution logic. For pure uppercase fonts it makes no sense to try a lowercase substitution as a first step. --- src/gamedata/fonts/font.cpp | 54 +++++++++++++----- src/gamedata/fonts/v_font.h | 1 + .../game-doomchex/fonts/bigfont/00C4.lmp | Bin 0 -> 301 bytes .../game-doomchex/fonts/bigfont/00D6.lmp | Bin 0 -> 353 bytes .../game-doomchex/fonts/bigfont/00DC.lmp | Bin 0 -> 296 bytes 5 files changed, 42 insertions(+), 13 deletions(-) create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C4.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D6.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DC.lmp diff --git a/src/gamedata/fonts/font.cpp b/src/gamedata/fonts/font.cpp index a151f10956..a777cdef08 100644 --- a/src/gamedata/fonts/font.cpp +++ b/src/gamedata/fonts/font.cpp @@ -708,24 +708,52 @@ int FFont::GetCharCode(int code, bool needpic) const return code; } - int originalcode = code; - int newcode; - - // Try stripping accents from accented characters. This may repeat to allow multi-step fallbacks. - while ((newcode = stripaccent(code)) != 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) { - code = newcode; - if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) + // Try converting lowercase characters to uppercase. + if (myislower(code)) { - return 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; + } } } - - if (myislower(code)) + else { - int upper = upperforlower[code]; - // Stripping accents did not help - now try uppercase for lowercase - if (upper != code) return GetCharCode(upper, needpic); + 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; diff --git a/src/gamedata/fonts/v_font.h b/src/gamedata/fonts/v_font.h index 0702781e99..18ca189783 100644 --- a/src/gamedata/fonts/v_font.h +++ b/src/gamedata/fonts/v_font.h @@ -126,6 +126,7 @@ protected: char Cursor; bool noTranslate; bool translateUntranslated; + bool MixedCase = false; struct CharData { FTexture *TranslatedPic = nullptr; // Texture for use with font translations. 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 0000000000000000000000000000000000000000..88866e396cb066b679a54aaf0e546f47d13e7402 GIT binary patch literal 301 zcmX|*!41MN3`J7`El?yDU>uHIDug1-K~XAB|H2Tgzy>V901UtgtiTFf!go_}^pg17 z`Oey{oW+*x$dR1Mg);?1J`>$K7SPDr zTC4M%cg8uRY3o%BBsdqNH#&_1;OM1Vgk}kJthFBFzffva2QO5|d}S2Ob#lnyu#B}W q;CTig>s*{8AcT}8NfqkgF-FP4?$bk@PgzRI@=o@G2 Date: Fri, 15 Feb 2019 00:29:24 +0100 Subject: [PATCH 46/95] - allow the language table to supersede the title patches, if appropriate For the Doom IWADs the provided font looks almost identical to the characters used on the title patches. So, for any level name that got replaced in some language, it will now check if the retrieved name comes from the default table, and if not, ignore the title patch and print the name with the specified font. This also required removing the 'en' label from the default table, because with this present, the text would always be picked from 'en' instead of 'default'. Since 'en' and 'default' had the same contents, in any English locale the 'default' table was never hit, so this won't make any difference for the texts being chosen. Last but not least, wminfo has been made a local variable in G_DoCompleted. There were two places where this was accessed from outside the summary screen or its setup code, and both were incorrect. --- src/d_iwad.cpp | 7 ++++ src/d_main.h | 2 +- src/g_game.cpp | 4 +-- src/g_hub.cpp | 5 +-- src/g_level.cpp | 35 +++++++++++++++++-- src/gamedata/g_mapinfo.cpp | 8 ++--- src/gamedata/g_mapinfo.h | 2 +- src/gamedata/gi.h | 22 +++++++----- src/gamedata/stringtable.cpp | 26 ++++++++------ src/gamedata/stringtable.h | 21 ++++++++--- src/p_setup.cpp | 4 +-- src/scripting/backend/codegen.cpp | 2 +- src/utility/zstring.cpp | 2 +- src/wi_stuff.cpp | 9 ++--- src/wi_stuff.h | 4 +-- wadsrc/static/iwadinfo.txt | 11 +++++- wadsrc/static/language.enu | 2 +- .../static/zscript/statscreen/statscreen.txt | 3 +- wadsrc/static/zscript/statscreen/types.txt | 1 + wadsrc_extra/static/language.enu | 2 +- 20 files changed, 114 insertions(+), 58 deletions(-) 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.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/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..d86618ebeb 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" @@ -779,6 +780,8 @@ void G_DoCompleted (void) // Close the conversation menu if open. P_FreeStrifeConversations (); + wbstartstruct_t wminfo; // parms for world map / intermission + if (primaryLevel->DoCompleted(nextlevel, wminfo)) { gamestate = GS_INTERMISSION; @@ -802,12 +805,14 @@ 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; @@ -818,13 +823,37 @@ bool FLevelLocals::DoCompleted (FString nextlevel, wbstartstruct_t &wminfo) 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 = info->LookupLevelName(&langtable[1]); + } + } + + // Ignore the (C)WILVxx lumps from the original Doom IWADs so that the name can be localized properly, if the retrieved text does not come from the default table. + // This is only active for those IWADS where the style of these graphics matches the provided BIGFONT for the respective game. + 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 +1325,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"); diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index 826f44181d..97645273da 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -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; diff --git a/src/gamedata/g_mapinfo.h b/src/gamedata/g_mapinfo.h index bb6ae9886d..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(); diff --git a/src/gamedata/gi.h b/src/gamedata/gi.h index 769076d4d2..4f27a6969b 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" diff --git a/src/gamedata/stringtable.cpp b/src/gamedata/stringtable.cpp index 1afc68e439..679735c121 100644 --- a/src/gamedata/stringtable.cpp +++ b/src/gamedata/stringtable.cpp @@ -83,11 +83,11 @@ void FStringTable::LoadLanguage (int lumpnum) } if (len == 1 && sc.String[0] == '*') { - activeMaps.Push(MAKE_ID('*', 0, 0, 0)); + activeMaps.Push(global_table); } else if (len == 7 && stricmp (sc.String, "default") == 0) { - activeMaps.Push(MAKE_ID('*', '*', 0, 0)); + activeMaps.Push(default_table); } else { @@ -167,18 +167,18 @@ void FStringTable::UpdateLanguage() auto checkone = [&](uint32_t lang_id) { auto list = allStrings.CheckKey(lang_id); - if (list && currentLanguageSet.Find(list) == currentLanguageSet.Size()) - currentLanguageSet.Push(list); + if (list && currentLanguageSet.FindEx([&](const auto &element) { return element.first == lang_id; }) == currentLanguageSet.Size()) + currentLanguageSet.Push(std::make_pair(lang_id, list)); }; - checkone(MAKE_ID('*', '*', '*', 0)); - checkone(MAKE_ID('*', 0, 0, 0)); + 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(MAKE_ID('*', '*', 0, 0)); + checkone(default_table); } // Replace \ escape sequences in a string with the escaped characters. @@ -219,7 +219,7 @@ bool FStringTable::exists(const char *name) FName nm(name, true); if (nm != NAME_None) { - uint32_t defaultStrings[] = { MAKE_ID('*', '*', '*', 0), MAKE_ID('*', 0, 0, 0), MAKE_ID('*', '*', 0, 0) }; + uint32_t defaultStrings[] = { default_table, global_table, dehacked_table }; for (auto mapid : defaultStrings) { @@ -235,7 +235,7 @@ bool FStringTable::exists(const char *name) } // Finds a string by name and returns its value -const char *FStringTable::operator[] (const char *name) const +const char *FStringTable::GetString(const char *name, uint32_t *langtable) const { if (name == nullptr || *name == 0) { @@ -246,8 +246,12 @@ const char *FStringTable::operator[] (const char *name) const { for (auto map : currentLanguageSet) { - auto item = map->CheckKey(nm); - if (item) return item->GetChars(); + auto item = map.second->CheckKey(nm); + if (item) + { + if (langtable) *langtable = map.first; + return item->GetChars(); + } } } return nullptr; diff --git a/src/gamedata/stringtable.h b/src/gamedata/stringtable.h index 11416367c1..97201a582d 100644 --- a/src/gamedata/stringtable.h +++ b/src/gamedata/stringtable.h @@ -58,25 +58,36 @@ public: class FStringTable { public: + enum : uint32_t + { + default_table = MAKE_ID('*', '*', 0, 0), + global_table = MAKE_ID('*', 0, 0, 0), + dehacked_table = MAKE_ID('*', '*', '*', 0) + }; + using LangMap = TMap; void LoadStrings (); void UpdateLanguage(); - StringMap GetDefaultStrings() { return allStrings[MAKE_ID('*', '*', 0, 0)]; } // Dehacked needs these for comparison + StringMap GetDefaultStrings() { return allStrings[default_table]; } // Dehacked needs these for comparison void SetDehackedStrings(StringMap && map) { - allStrings.Insert(MAKE_ID('*', '*', '*', 0), 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 *operator[] (const char *name) const + { + return GetString(name, nullptr); + } bool exists(const char *name); private: LangMap allStrings; - TArray currentLanguageSet; + TArray> currentLanguageSet; void LoadLanguage (int lumpnum); static size_t ProcessEscapes (char *str); 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/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index 7c8f207d6c..98ff002033 100644 --- a/src/scripting/backend/codegen.cpp +++ b/src/scripting/backend/codegen.cpp @@ -322,7 +322,7 @@ static FxExpression *StringConstToChar(FxExpression *basex) int chr = str.GetNextCharacter(position); // Only succeed if the full string is consumed, i.e. it contains only one code point. - if (position == str.Len()) + if (position == (int)str.Len()) { return new FxConstant(chr, basex->ScriptPosition); } diff --git a/src/utility/zstring.cpp b/src/utility/zstring.cpp index 5845d47c32..fa56229ad3 100644 --- a/src/utility/zstring.cpp +++ b/src/utility/zstring.cpp @@ -485,7 +485,7 @@ void FString::DeleteLastCharacter() { if (Len() == 0) return; auto pos = Len() - 1; - while (pos > 0 && Chars[pos] >= 0x80 && Chars[pos] < 0xc0) pos--; + while (pos > 0 && uint8_t(Chars[pos]) >= 0x80 && uint8_t(Chars[pos]) < 0xc0) pos--; if (pos <= 0) { Data()->Release(); 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..6f06037811 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; @@ -78,8 +80,6 @@ struct wbstartstruct_t // Intermission stats. // Parameters for world map / intermission. -extern wbstartstruct_t wminfo; - // Called by main loop, animate the intermission. void WI_Ticker (); 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.enu b/wadsrc/static/language.enu index fbbd2e1665..cf4fa12702 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -1,6 +1,6 @@ /* U.S. English. (Sorry, it's not English English.) */ -[en default] +[default] SECRETMESSAGE = "A secret is revealed!"; diff --git a/wadsrc/static/zscript/statscreen/statscreen.txt b/wadsrc/static/zscript/statscreen/statscreen.txt index 7edde60c42..0903299abb 100644 --- a/wadsrc/static/zscript/statscreen/statscreen.txt +++ b/wadsrc/static/zscript/statscreen/statscreen.txt @@ -705,8 +705,7 @@ class StatusScreen abstract play version("2.5") Sucks = TexMan.CheckForTexture("WISUCKS", TexMan.Type_MiscPatch); // "sucks" Par = TexMan.CheckForTexture("WIPAR", TexMan.Type_MiscPatch); // "par" - // 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/types.txt b/wadsrc/static/zscript/statscreen/types.txt index c3dad0c765..972a47b0c5 100644 --- a/wadsrc/static/zscript/statscreen/types.txt +++ b/wadsrc/static/zscript/statscreen/types.txt @@ -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_extra/static/language.enu b/wadsrc_extra/static/language.enu index 36290df475..ce0a737250 100644 --- a/wadsrc_extra/static/language.enu +++ b/wadsrc_extra/static/language.enu @@ -1,4 +1,4 @@ -[en 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. From 59700406729fb35c802dbe9791dfcf335d5cdda6 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 18 Feb 2019 00:43:40 +0100 Subject: [PATCH 47/95] - fixed: The wbstartstruct that gets passed to the level summary screen needs to be static This variable is needed long after the function which sets it up will be exited. So this either needs to be dynamically allocated or static, and in this case using a static variable is simpler. However, unlike before, it is only being accessed in the one function that needs to initialize it and pass to the summary screen and nowhere else. --- src/g_level.cpp | 16 +++++++++++----- src/wi_stuff.h | 1 + 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index d86618ebeb..8d30c05385 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -754,6 +754,7 @@ void FLevelLocals::SecretExitLevel (int position) // // //========================================================================== +static wbstartstruct_t staticWmInfo; void G_DoCompleted (void) { @@ -780,9 +781,7 @@ void G_DoCompleted (void) // Close the conversation menu if open. P_FreeStrifeConversations (); - wbstartstruct_t wminfo; // parms for world map / intermission - - if (primaryLevel->DoCompleted(nextlevel, wminfo)) + if (primaryLevel->DoCompleted(nextlevel, staticWmInfo)) { gamestate = GS_INTERMISSION; viewactive = false; @@ -792,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) { @@ -817,6 +822,7 @@ bool FLevelLocals::DoCompleted (FString nextlevel, wbstartstruct_t &wminfo) { wminfo.next = MapName; wminfo.LName1 = wminfo.LName0; + wminfo.nextname = wminfo.thisname; } else { @@ -831,7 +837,7 @@ bool FLevelLocals::DoCompleted (FString nextlevel, wbstartstruct_t &wminfo) { wminfo.next = nextinfo->MapName; wminfo.LName1 = TexMan.CheckForTexture(nextinfo->PName, ETextureType::MiscPatch); - wminfo.nextname = info->LookupLevelName(&langtable[1]); + wminfo.nextname = nextinfo->LookupLevelName(&langtable[1]); } } diff --git a/src/wi_stuff.h b/src/wi_stuff.h index 6f06037811..3ff4828b1b 100644 --- a/src/wi_stuff.h +++ b/src/wi_stuff.h @@ -76,6 +76,7 @@ struct wbstartstruct_t int pnum; wbplayerstruct_t plyr[MAXPLAYERS]; + }; // Intermission stats. From b98c3b766cf73001dc6360fb44325a471f6bac28 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 18 Feb 2019 20:53:56 +0100 Subject: [PATCH 48/95] - added a function that creates a texture for a text in a given font. Not tested yet, this is for synthesizing localized variant of Doom's textures with text content. --- src/gamedata/textures/image.h | 6 ++ src/v_drawtext.cpp | 112 ++++++++++++++++++++++++++++++++++ src/v_video.h | 15 +++++ 3 files changed, 133 insertions(+) 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/v_drawtext.cpp b/src/v_drawtext.cpp index 1ab1e7c647..c18d8bd138 100644 --- a/src/v_drawtext.cpp +++ b/src/v_drawtext.cpp @@ -42,13 +42,125 @@ #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); + +//========================================================================== +// +// Create a texture from a text in a given font. +// +//========================================================================== + +FTexture * BuildTextTexture(FFont *font, const char *string, int textcolor) +{ + int w; + const uint8_t *ch; + int c; + double cx; + double cy; + FRemapTable *range; + int kerning; + FTexture *pic; + + kerning = font->GetDefaultKerning(); + + ch = (const uint8_t *)string; + cx = 0; + cy = 0; + + + IntRect box; + + while (auto c = GetCharFromString(ch)) + { + 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(); + double x = cx - offsets.first; + double y = cy - offsets.second; + double ww = img->GetWidth(); + double h = img->GetHeight(); + + box.AddToRect(x, y); + box.AddToRect(x + ww, y + h); + } + cx += (w + kerning); + } + + cx = -box.left; + cy = -box.top; + + TArray part(strlen(string)); + + while (auto c = GetCharFromString(ch)) + { + if (c == TEXTCOLOR_ESCAPE) + { + EColorRange newcolor = V_ParseFontColor(ch, textcolor, textcolor); + if (newcolor != CR_UNDEFINED) + { + range = font->GetColorTranslation(newcolor); + textcolor = newcolor; + } + continue; + } + + if (c == '\n') + { + cx = 0; + cy += font->GetHeight(); + continue; + } + + if (nullptr != (pic = font->GetChar(c, textcolor, &w, nullptr))) + { + auto img = pic->GetImage(); + auto offsets = img->GetOffsets(); + double x = cx - offsets.first; + double 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); + } + 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 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; + } + + }; From c5a6c7271943dac9969bdccaeaed13a98e496841 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 18 Feb 2019 23:36:56 +0100 Subject: [PATCH 49/95] - fixed uninitialized variable and a few warnings. --- src/gamedata/fonts/font.cpp | 2 +- src/intermission/intermission.cpp | 1 + src/v_drawtext.cpp | 17 ++++++++--------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/gamedata/fonts/font.cpp b/src/gamedata/fonts/font.cpp index a777cdef08..b8725eae63 100644 --- a/src/gamedata/fonts/font.cpp +++ b/src/gamedata/fonts/font.cpp @@ -361,7 +361,7 @@ void FFont::ReadSheetFont(TArray &folderdata, int width, int height tex->bNoDecals = false; tex->SourceLump = -1; // We do not really care. TexMan.AddTexture(tex); - charMap.Insert(position + x + y * numtex_x, tex); + charMap.Insert(int(position) + x + y * numtex_x, tex); } } } diff --git a/src/intermission/intermission.cpp b/src/intermission/intermission.cpp index a01f5325a0..7f68ebae7d 100644 --- a/src/intermission/intermission.cpp +++ b/src/intermission/intermission.cpp @@ -696,6 +696,7 @@ bool DIntermissionController::NextPage () // last page return false; } + bg.SetInvalid(); if (mScreen != NULL) { diff --git a/src/v_drawtext.cpp b/src/v_drawtext.cpp index c18d8bd138..e0bc0d6391 100644 --- a/src/v_drawtext.cpp +++ b/src/v_drawtext.cpp @@ -63,9 +63,8 @@ FTexture * BuildTextTexture(FFont *font, const char *string, int textcolor) { int w; const uint8_t *ch; - int c; - double cx; - double cy; + int cx; + int cy; FRemapTable *range; int kerning; FTexture *pic; @@ -99,10 +98,10 @@ FTexture * BuildTextTexture(FFont *font, const char *string, int textcolor) { auto img = pic->GetImage(); auto offsets = img->GetOffsets(); - double x = cx - offsets.first; - double y = cy - offsets.second; - double ww = img->GetWidth(); - double h = img->GetHeight(); + 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); @@ -139,8 +138,8 @@ FTexture * BuildTextTexture(FFont *font, const char *string, int textcolor) { auto img = pic->GetImage(); auto offsets = img->GetOffsets(); - double x = cx - offsets.first; - double y = cy - offsets.second; + int x = cx - offsets.first; + int y = cy - offsets.second; auto &tp = part[part.Reserve(1)]; From b29975503d7a4c00800517e5769196a04549987d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 19 Feb 2019 00:08:23 +0100 Subject: [PATCH 50/95] - fixed issues with text entering * entering a savegame description did not work anymore * the length check was too restrictive and always underestimated the available space * use the console font for entering a savegame description. This has more characters and better contrast for this content. * the interface to the text enterer used bad measurements. --- wadsrc/static/zscript/menu/loadsavemenu.txt | 19 +++--- .../static/zscript/menu/optionmenuitems.txt | 2 +- wadsrc/static/zscript/menu/playercontrols.txt | 2 +- wadsrc/static/zscript/menu/reverbedit.txt | 2 +- wadsrc/static/zscript/menu/textentermenu.txt | 58 +++++++++++++------ 5 files changed, 54 insertions(+), 29 deletions(-) diff --git a/wadsrc/static/zscript/menu/loadsavemenu.txt b/wadsrc/static/zscript/menu/loadsavemenu.txt index e6e453d367..c0f125b462 100644 --- a/wadsrc/static/zscript/menu/loadsavemenu.txt +++ b/wadsrc/static/zscript/menu/loadsavemenu.txt @@ -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++; } } @@ -475,7 +480,7 @@ class SaveMenu : LoadSaveMenu if (mkey == MKEY_Enter) { String SavegameString = (Selected != 0)? manager.GetSavegame(Selected).SaveTitle : ""; - mInput = TextEnterMenu.Open(self, SavegameString, -1, 1, fromcontroller); + mInput = TextEnterMenu.OpenTextEnter(self, ConFont, SavegameString, -1, fromcontroller); mInput.ActivateMenu(); mEntering = true; } @@ -604,4 +609,4 @@ class LoadMenu : LoadSaveMenu } return false; } -} \ No newline at end of file +} diff --git a/wadsrc/static/zscript/menu/optionmenuitems.txt b/wadsrc/static/zscript/menu/optionmenuitems.txt index a8f77268cb..df955bb78d 100644 --- a/wadsrc/static/zscript/menu/optionmenuitems.txt +++ b/wadsrc/static/zscript/menu/optionmenuitems.txt @@ -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/menu/playercontrols.txt index 70eceb727e..8648daf2d0 100644 --- a/wadsrc/static/zscript/menu/playercontrols.txt +++ b/wadsrc/static/zscript/menu/playercontrols.txt @@ -187,7 +187,7 @@ class ListMenuItemPlayerNameBox : ListMenuItemSelectable if (mkey == Menu.MKEY_Enter) { Menu.MenuSound ("menu/choose"); - mEnter = TextEnterMenu.Open(Menu.GetCurrentMenu(), mPlayerName, -1, 2, fromcontroller); + mEnter = TextEnterMenu.OpenTextEnter(Menu.GetCurrentMenu(), SmallFont, mPlayerName, 128, fromcontroller); mEnter.ActivateMenu(); return true; } diff --git a/wadsrc/static/zscript/menu/reverbedit.txt b/wadsrc/static/zscript/menu/reverbedit.txt index 2f372968c6..7bc799797f 100644 --- a/wadsrc/static/zscript/menu/reverbedit.txt +++ b/wadsrc/static/zscript/menu/reverbedit.txt @@ -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/menu/textentermenu.txt index 73ff9ef9de..a7cbdb517d 100644 --- a/wadsrc/static/zscript/menu/textentermenu.txt +++ b/wadsrc/static/zscript/menu/textentermenu.txt @@ -44,10 +44,10 @@ 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; @@ -58,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) { @@ -77,16 +76,26 @@ class TextEnterMenu : Menu InputGridY = 0; } AllowColors = allowcolors; // [TP] - displayFont = SmallFont; + 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; + } + + //============================================================================= // // @@ -116,11 +125,7 @@ class TextEnterMenu : Menu if (ev.Type == UIEvent.Type_Char) { mInputGridOkay = false; - if (mEnterString.Length() < mEnterSize && - (mSizeMode == 2/*entering player name*/ || displayFont.StringWidth(mEnterString) < (mEnterSize-1)*8)) - { - mEnterString.AppendCharacter(ev.KeyChar); - } + AppendChar(ev.KeyChar); return true; } int ch = ev.KeyChar; @@ -202,6 +207,23 @@ class TextEnterMenu : Menu // //============================================================================= + private void AppendChar(int ch) + { + String newstring = mEnterString; + newstring.AppendCharacter(ch); + newstring = newstring .. displayFont.GetCursor(); + if (mEnterSize < 0 || displayFont.StringWidth(newstring) < mEnterSize) + { + mEnterString.AppendCharacter(ch); + } + } + + //============================================================================= + // + // + // + //============================================================================= + override bool MenuEvent (int key, bool fromcontroller) { String InputGridChars = Chars; @@ -251,8 +273,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) @@ -267,13 +288,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*/ || displayFont.StringWidth(mEnterString) < (mEnterSize-1)*8)) + else { - mEnterString = mEnterString .. c; + AppendChar(ch); } } return true; @@ -358,4 +378,4 @@ class TextEnterMenu : Menu Super.Drawer(); } -} \ No newline at end of file +} From 91206f12be85cd6a1690c9fb5d1fafbcaea650cb Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 19 Feb 2019 00:27:47 +0100 Subject: [PATCH 51/95] - changed zstrformat to allow %c to emit non-ASCII characters as UTF-8. --- src/utility/zstrformat.cpp | 8 ++++++-- wadsrc/static/zscript/menu/textentermenu.txt | 4 +--- 2 files changed, 7 insertions(+), 5 deletions(-) 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/wadsrc/static/zscript/menu/textentermenu.txt b/wadsrc/static/zscript/menu/textentermenu.txt index a7cbdb517d..328c7aa94d 100644 --- a/wadsrc/static/zscript/menu/textentermenu.txt +++ b/wadsrc/static/zscript/menu/textentermenu.txt @@ -209,9 +209,7 @@ class TextEnterMenu : Menu private void AppendChar(int ch) { - String newstring = mEnterString; - newstring.AppendCharacter(ch); - newstring = newstring .. displayFont.GetCursor(); + String newstring = String.Format("%s%c%s", mEnterString, ch, displayFont.GetCursor()); if (mEnterSize < 0 || displayFont.StringWidth(newstring) < mEnterSize) { mEnterString.AppendCharacter(ch); From 10a017e1049007ba76af9e4499aae79cc4afcdea Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 19 Feb 2019 00:29:22 +0100 Subject: [PATCH 52/95] - fixed: The language ID was set before reading the config. This essentially rendered saving the language CVAR useless. --- src/d_main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 31e2414182..762a0f015b 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) { @@ -2047,6 +2045,7 @@ static void D_DoomInit() if (!batchrun) Printf ("M_LoadDefaults: Load system defaults.\n"); M_LoadDefaults (); // load before initing other systems + SetLanguageIDs (); } //========================================================================== From 5e7fb16d05f0858a8e6a8d942c7cfba12ada2634 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 19 Feb 2019 01:22:12 +0100 Subject: [PATCH 53/95] - preparation work for substituting the menu and intermission screen text graphics for localization --- src/g_level.cpp | 5 +- src/gamedata/gi.cpp | 6 +- src/gamedata/gi.h | 2 + src/gamedata/textures/texturemanager.cpp | 7 +++ src/gamedata/textures/textures.h | 3 +- src/menu/menu.cpp | 5 +- src/menu/menu.h | 2 +- src/menu/menudef.cpp | 10 ++-- src/scripting/backend/codegen.cpp | 9 ++- wadsrc/static/language.enu | 15 +++-- wadsrc/static/mapinfo/chex.txt | 2 + wadsrc/static/mapinfo/doomcommon.txt | 2 + wadsrc/static/mapinfo/mindefaults.txt | 4 +- wadsrc/static/menudef.txt | 26 +++++---- wadsrc/static/zscript/base.txt | 6 +- wadsrc/static/zscript/menu/listmenuitems.txt | 32 ++++++++-- .../static/zscript/statscreen/statscreen.txt | 28 ++++----- .../zscript/statscreen/statscreen_sp.txt | 58 +++++++++++++++---- 18 files changed, 161 insertions(+), 61 deletions(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index 8d30c05385..991849e560 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -841,8 +841,9 @@ bool FLevelLocals::DoCompleted (FString nextlevel, wbstartstruct_t &wminfo) } } - // Ignore the (C)WILVxx lumps from the original Doom IWADs so that the name can be localized properly, if the retrieved text does not come from the default table. - // This is only active for those IWADS where the style of these graphics matches the provided BIGFONT for the respective game. + // 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 }; diff --git a/src/gamedata/gi.cpp b/src/gamedata/gi.cpp index efcfe74dae..2c639d3c9f 100644 --- a/src/gamedata/gi.cpp +++ b/src/gamedata/gi.cpp @@ -59,6 +59,8 @@ DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mBackButton) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mStatscreenMapNameFont) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mStatscreenEnteringFont) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mStatscreenFinishedFont) +DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mStatscreenEnteringPatch) +DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mStatscreenFinishedPatch) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, gibfactor) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, intermissioncounter) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, statusscreen_single) @@ -423,8 +425,8 @@ 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_PATCH(mStatscreenFinishedPatch, "statscreen_finishedpatch") + GAMEINFOKEY_PATCH(mStatscreenEnteringPatch, "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 4f27a6969b..77f45d1cf1 100644 --- a/src/gamedata/gi.h +++ b/src/gamedata/gi.h @@ -190,6 +190,8 @@ struct gameinfo_t FGIFont mStatscreenMapNameFont; FGIFont mStatscreenFinishedFont; FGIFont mStatscreenEnteringFont; + FGIFont mStatscreenFinishedPatch; + FGIFont mStatscreenEnteringPatch; bool norandomplayerclass; bool forcekillscripts; FName statusscreen_single; diff --git a/src/gamedata/textures/texturemanager.cpp b/src/gamedata/textures/texturemanager.cpp index 98b8197bce..c26d36765f 100644 --- a/src/gamedata/textures/texturemanager.cpp +++ b/src/gamedata/textures/texturemanager.cpp @@ -303,6 +303,13 @@ DEFINE_ACTION_FUNCTION_NATIVE(_TexMan, CheckForTexture, CheckForTexture) ACTION_RETURN_INT(CheckForTexture(name, type, flags)); } +DEFINE_ACTION_FUNCTION(_TexMan, OkForLocalization) +{ + PARAM_PROLOGUE; + PARAM_INT(name); + ACTION_RETURN_INT(true); // work for later. We need the definition to implement the language support +} + //========================================================================== // // FTextureManager :: ListTextures diff --git a/src/gamedata/textures/textures.h b/src/gamedata/textures/textures.h index 7ecb806219..8005be330e 100644 --- a/src/gamedata/textures/textures.h +++ b/src/gamedata/textures/textures.h @@ -572,7 +572,8 @@ public: TEXMAN_ReturnFirst = 4, TEXMAN_AllowSkins = 8, TEXMAN_ShortNameOnly = 16, - TEXMAN_DontCreate = 32 + TEXMAN_DontCreate = 32, + TEXMAN_Localize = 64 }; enum diff --git a/src/menu/menu.cpp b/src/menu/menu.cpp index 6689f771b4..19cb91557c 100644 --- a/src/menu/menu.cpp +++ b/src/menu/menu.cpp @@ -1265,12 +1265,13 @@ DMenuItemBase * CreateOptionMenuItemCommand(const char *label, FName cmd, bool c return (DMenuItemBase*)p; } -DMenuItemBase * CreateListMenuItemPatch(double x, double y, int height, int hotkey, FTextureID tex, FName command, int param) +DMenuItemBase * CreateListMenuItemPatch(double x, double y, int height, int hotkey, FTextureID tex, FName command, int param, const char *label, FFont *font, int color) { auto c = PClass::FindClass("ListMenuItemPatchItem"); auto p = c->CreateNew(); FString keystr = FString(char(hotkey)); - VMValue params[] = { p, x, y, height, tex.GetIndex(), &keystr, command.GetIndex(), param }; + FString labelstr = label; + VMValue params[] = { p, x, y, height, tex.GetIndex(), &keystr, command.GetIndex(), param, &labelstr, font, color }; auto f = dyn_cast(c->FindSymbol("InitDirect", false)); VMCall(f->Variants[0].Implementation, params, countof(params), nullptr, 0); return (DMenuItemBase*)p; diff --git a/src/menu/menu.h b/src/menu/menu.h index 83f4f66da5..0ac367d1f7 100644 --- a/src/menu/menu.h +++ b/src/menu/menu.h @@ -352,7 +352,7 @@ DMenuItemBase * CreateOptionMenuItemStaticText(const char *name, int v = -1); DMenuItemBase * CreateOptionMenuItemSubmenu(const char *label, FName cmd, int center); DMenuItemBase * CreateOptionMenuItemControl(const char *label, FName cmd, FKeyBindings *bindings); DMenuItemBase * CreateOptionMenuItemJoyConfigMenu(const char *label, IJoystickConfig *joy); -DMenuItemBase * CreateListMenuItemPatch(double x, double y, int height, int hotkey, FTextureID tex, FName command, int param); +DMenuItemBase * CreateListMenuItemPatch(double x, double y, int height, int hotkey, FTextureID tex, FName command, int param, const char *label, FFont *font, int color); DMenuItemBase * CreateListMenuItemText(double x, double y, int height, int hotkey, const char *text, FFont *font, PalEntry color1, PalEntry color2, FName command, int param); DMenuItemBase * CreateOptionMenuItemCommand(const char *label, FName cmd, bool centered = false); diff --git a/src/menu/menudef.cpp b/src/menu/menudef.cpp index 2b6301653d..fbfa21e9fc 100644 --- a/src/menu/menudef.cpp +++ b/src/menu/menudef.cpp @@ -1121,7 +1121,7 @@ static void BuildEpisodeMenu() 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); + it = CreateListMenuItemPatch(ld->mXpos, posy, ld->mLinespacing, AllEpisodes[i].mShortcut, tex, NAME_Skillmenu, i, AllEpisodes[i].mEpisodeName, ld->mFont, ld->mFontColor); } else { @@ -1627,16 +1627,16 @@ 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]); + li = CreateListMenuItemPatch(ld->mXpos, y, ld->mLinespacing, skill.Shortcut, tex, action, SkillIndices[i], skill.MenuName, ld->mFont, color); } else { - 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/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index 98ff002033..3e9b6be0df 100644 --- a/src/scripting/backend/codegen.cpp +++ b/src/scripting/backend/codegen.cpp @@ -8858,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/wadsrc/static/language.enu b/wadsrc/static/language.enu index cf4fa12702..c6d0eea82b 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -1310,17 +1310,20 @@ 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"; RAVENQUITMSG = "ARE YOU SURE YOU WANT TO QUIT?"; diff --git a/wadsrc/static/mapinfo/chex.txt b/wadsrc/static/mapinfo/chex.txt index 05ac7adf56..9027065e87 100644 --- a/wadsrc/static/mapinfo/chex.txt +++ b/wadsrc/static/mapinfo/chex.txt @@ -67,6 +67,8 @@ gameinfo 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..b3541b91a9 100644 --- a/wadsrc/static/mapinfo/doomcommon.txt +++ b/wadsrc/static/mapinfo/doomcommon.txt @@ -67,6 +67,8 @@ gameinfo 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/menudef.txt b/wadsrc/static/menudef.txt index f24b139fc3..874306c931 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -11,11 +11,17 @@ DEFAULTLISTMENU { Font "BigFont", "Untranslated" + IfGame(Doom) + { + Selector "M_SKULL1", -32, -5 + Linespacing 16 + Font "BigUpper", "Red" + } IfGame(Doom, Chex) { Selector "M_SKULL1", -32, -5 Linespacing 16 - Font "BigFont", "Red" + Font "BigFont", "Green" } IfGame(Strife) { @@ -68,24 +74,24 @@ LISTMENU "MainMenu" IfGame(Doom, Strife, Chex) { - PatchItem "M_NGAME", "n", "PlayerclassMenu" + PatchItem "M_NGAME", "n", "PlayerclassMenu", 0, "$MNU_NEWGAME" ifOption(SwapMenu) { - PatchItem "M_LOADG", "l", "LoadGameMenu" - PatchItem "M_SAVEG", "s", "SaveGameMenu" - PatchItem "M_OPTION","o", "OptionsMenu" + PatchItem "M_LOADG", "l", "LoadGameMenu", 0, "$MNU_LOADGAME" + PatchItem "M_SAVEG", "s", "SaveGameMenu",0, "$MNU_SAVEGAME" + PatchItem "M_OPTION","o", "OptionsMenu", 0, "$MNU_OPTIONS" } else { - PatchItem "M_OPTION","o", "OptionsMenu" - PatchItem "M_LOADG", "l", "LoadGameMenu" - PatchItem "M_SAVEG", "s", "SaveGameMenu" + PatchItem "M_OPTION","o", "OptionsMenu", 0, "$MNU_OPTIONS" + PatchItem "M_LOADG", "l", "LoadGameMenu", 0, "$MNU_LOADGAME" + PatchItem "M_SAVEG", "s", "SaveGameMenu", 0, "$MNU_SAVEGAME" } ifOption(ReadThis) { - PatchItem "M_RDTHIS","r", "ReadThisMenu" + PatchItem "M_RDTHIS","r", "ReadThisMenu", 0, "$MNU_INFO" } - PatchItem "M_QUITG", "q", "QuitMenu" + PatchItem "M_QUITG", "q", "QuitMenu", 0, "$MNU_QUITGAME" } IfGame(Heretic, Hexen) diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index a6c52d03f0..c65dfb9bfa 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -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); native static void SetCameraToTexture(Actor viewpoint, String texture, double fov); } @@ -372,6 +374,8 @@ struct GameInfoStruct native native GIFont mStatscreenMapNameFont; native GIFont mStatscreenEnteringFont; native GIFont mStatscreenFinishedFont; + native GIFont mStatscreenEnteringPatch; + native GIFont mStatscreenFinishedPatch; native double gibfactor; native bool intermissioncounter; native Name mSliderColor; diff --git a/wadsrc/static/zscript/menu/listmenuitems.txt b/wadsrc/static/zscript/menu/listmenuitems.txt index 59bff9f61e..99050e1c95 100644 --- a/wadsrc/static/zscript/menu/listmenuitems.txt +++ b/wadsrc/static/zscript/menu/listmenuitems.txt @@ -280,29 +280,53 @@ class ListMenuItemTextItem : ListMenuItemSelectable class ListMenuItemPatchItem : ListMenuItemSelectable { TextureID mTexture; + String mSubstitute; + Font mFont; + int mColor; - void Init(ListMenuDescriptor desc, TextureID patch, String hotkey, Name child, int param = 0) + void Init(ListMenuDescriptor desc, TextureID patch, String hotkey, Name child, int param = 0, String subst = "") { Super.Init(desc.mXpos, desc.mYpos, desc.mLinespacing, child, param); mHotkey = hotkey.CharCodeAt(0); mTexture = patch; + mSubstitute = subst; + mFont = desc.mFont; + mColor = desc.mFontColor; } - void InitDirect(double x, double y, int height, TextureID patch, String hotkey, Name child, int param = 0) + void InitDirect(double x, double y, int height, TextureID patch, String hotkey, Name child, int param = 0, String subst = "", Font fnt = null, int col = Font.CR_UNTRANSLATED) { Super.Init(x, y, height, child, param); mHotkey = hotkey.CharCodeAt(0); mTexture = patch; + mSubstitute = subst; + mFont = fnt; + mColor = col; } override void Drawer(bool selected) { - screen.DrawTexture (mTexture, true, mXpos, mYpos, DTA_Clean, true); + if (mSubstitute == "" || TexMan.OkForLocalization(mTexture)) + { + screen.DrawTexture (mTexture, true, mXpos, mYpos, DTA_Clean, true); + } + else + { + screen.DrawText(mFont, mColor, mXpos, mYpos, mSubstitute, DTA_Clean, true); + } + } override int GetWidth() { - return TexMan.GetSize(mTexture); + if (mSubstitute == "" || TexMan.OkForLocalization(mTexture)) + { + return TexMan.GetSize(mTexture); + } + else + { + return max(1, mFont.StringWidth(StringTable.Localize(mSubstitute))); + } } } diff --git a/wadsrc/static/zscript/statscreen/statscreen.txt b/wadsrc/static/zscript/statscreen/statscreen.txt index 0903299abb..0e4d243dc1 100644 --- a/wadsrc/static/zscript/statscreen/statscreen.txt +++ b/wadsrc/static/zscript/statscreen/statscreen.txt @@ -14,15 +14,15 @@ struct PatchInfo play version("2.5") TextureID mPatch; int mColor; - void Init(GIFont gifont) + void Init(GIFont gifont, GIFont gipatch = null) { - if (gifont.color == 'Null') + if (gipatch != null) { - mPatch = TexMan.CheckForTexture(gifont.fontname, TexMan.Type_MiscPatch); + mPatch = TexMan.CheckForTexture(gipatch.fontname, TexMan.Type_MiscPatch, TexMan.TryAny|TexMan.Localize); mColor = mPatch.isValid() ? Font.CR_UNTRANSLATED : Font.CR_UNDEFINED; mFont = NULL; } - else + if (!mPatch.isValid()) { mFont = Font.GetFont(gifont.fontname); mColor = Font.FindFontColor(gifont.color); @@ -368,7 +368,7 @@ class StatusScreen abstract play version("2.5") } else { - screen.DrawText (BigFont, Font.CR_UNTRANSLATED, x - BigFont.StringWidth("SUCKS"), y - IntermissionFont.GetHeight() - 2, "SUCKS", DTA_Clean, true); + screen.DrawText (BigFont, Font.CR_UNTRANSLATED, x - BigFont.StringWidth("$TXT_IMSUCKS"), y - IntermissionFont.GetHeight() - 2, "$TXT_IMSUCKS", DTA_Clean, true); } } @@ -693,17 +693,17 @@ class StatusScreen abstract play version("2.5") me = wbs.pnum; for (int i = 0; i < MAXPLAYERS; i++) Plrs[i] = wbs.plyr[i]; - entering.Init(gameinfo.mStatscreenEnteringFont); - finished.Init(gameinfo.mStatscreenFinishedFont); + entering.Init(gameinfo.mStatscreenEnteringFont, gameinfo.mStatscreenEnteringPatch); + finished.Init(gameinfo.mStatscreenFinishedFont, gameinfo.mStatscreenFinishedPatch); 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" - Timepic = TexMan.CheckForTexture("WITIME", TexMan.Type_MiscPatch); // "time" - Sucks = TexMan.CheckForTexture("WISUCKS", TexMan.Type_MiscPatch); // "sucks" - Par = TexMan.CheckForTexture("WIPAR", TexMan.Type_MiscPatch); // "par" + Kills = TexMan.CheckForTexture("WIOSTK", TexMan.Type_MiscPatch, TexMan.TryAny|TexMan.Localize); // "kills" + Secret = TexMan.CheckForTexture("WIOSTS", TexMan.Type_MiscPatch, TexMan.TryAny|TexMan.Localize); // "scrt", not used + P_secret = TexMan.CheckForTexture("WISCRT2", TexMan.Type_MiscPatch, TexMan.TryAny|TexMan.Localize); // "secret" + Items = TexMan.CheckForTexture("WIOSTI", TexMan.Type_MiscPatch, TexMan.TryAny|TexMan.Localize); // "items" + Timepic = TexMan.CheckForTexture("WITIME", TexMan.Type_MiscPatch, TexMan.TryAny|TexMan.Localize); // "time" + Sucks = TexMan.CheckForTexture("WISUCKS", TexMan.Type_MiscPatch, TexMan.TryAny|TexMan.Localize); // "sucks" + Par = TexMan.CheckForTexture("WIPAR", TexMan.Type_MiscPatch, TexMan.TryAny|TexMan.Localize); // "par" lnametexts[0] = wbstartstruct.thisname; lnametexts[1] = wbstartstruct.nextname; diff --git a/wadsrc/static/zscript/statscreen/statscreen_sp.txt b/wadsrc/static/zscript/statscreen/statscreen_sp.txt index f4def35695..63af009656 100644 --- a/wadsrc/static/zscript/statscreen/statscreen_sp.txt +++ b/wadsrc/static/zscript/statscreen/statscreen_sp.txt @@ -137,17 +137,48 @@ class DoomStatusScreen : StatusScreen int lh = IntermissionFont.GetHeight() * 3 / 2; drawLF(); - - screen.DrawTexture (Kills, true, SP_STATSX, SP_STATSY, DTA_Clean, true); + + // Fixme: This should try to retrieve the color from the intermission font and use the best approximation here + let tcolor = Font.CR_RED; + + if (Kills.isValid()) + { + screen.DrawTexture (Kills, true, SP_STATSX, SP_STATSY, DTA_Clean, true); + } + else + { + screen.DrawText (BigFont, tcolor, SP_STATSX, SP_STATSY, "$TXT_IMKILLS", DTA_Clean, true); + } drawPercent (IntermissionFont, 320 - SP_STATSX, SP_STATSY, cnt_kills[0], wbs.maxkills); - screen.DrawTexture (Items, true, SP_STATSX, SP_STATSY+lh, DTA_Clean, true); + if (Items.isValid()) + { + screen.DrawTexture (Items, true, SP_STATSX, SP_STATSY+lh, DTA_Clean, true); + } + else + { + screen.DrawText (BigFont, tcolor, SP_STATSX, SP_STATSY+lh, "$TXT_IMITEMS", DTA_Clean, true); + } drawPercent (IntermissionFont, 320 - SP_STATSX, SP_STATSY+lh, cnt_items[0], wbs.maxitems); - screen.DrawTexture (P_secret, true, SP_STATSX, SP_STATSY+2*lh, DTA_Clean, true); + if (P_secret.IsValid()) + { + screen.DrawTexture (P_secret, true, SP_STATSX, SP_STATSY+2*lh, DTA_Clean, true); + } + else + { + screen.DrawText (BigFont, tcolor, SP_STATSX, SP_STATSY+2*lh, "$TXT_IMSECRETS", 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); + if (Timepic.IsValid()) + { + screen.DrawTexture (Timepic, true, SP_TIMEX, SP_TIMEY, DTA_Clean, true); + } + else + { + screen.DrawText (BigFont, tcolor, SP_TIMEX, SP_TIMEY, "$TXT_IMTIME", DTA_Clean, true); + } drawTime (160 - SP_TIMEX, SP_TIMEY, cnt_time); if (wi_showtotaltime) { @@ -156,7 +187,14 @@ class DoomStatusScreen : StatusScreen if (wbs.partime) { - screen.DrawTexture (Par, true, 160 + SP_TIMEX, SP_TIMEY, DTA_Clean, true); + if (Par.IsValid()) + { + screen.DrawTexture (Par, true, 160 + SP_TIMEX, SP_TIMEY, DTA_Clean, true); + } + else + { + screen.DrawText (BigFont, tcolor, SP_TIMEX, SP_TIMEY, "$TXT_IMPAR", DTA_Clean, true); + } drawTime (320 - SP_TIMEX, SP_TIMEY, cnt_par); } } @@ -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) { From 6b8303ed05c1bb43bb98d8a730a5ac74e33405d0 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 19 Feb 2019 21:47:14 +0100 Subject: [PATCH 54/95] - moved the lump/resource names in the string table to their own file and removed them from other language files. These are neither supposed to be translated nor overridden by other language tables. Doing so may break later Dehacked refactorings. --- wadsrc/static/language.def | 91 ++++++++++++++++++++++++++++++++++++++ wadsrc/static/language.enu | 86 ----------------------------------- wadsrc/static/language.ptb | 13 ------ wadsrc/static/language.rus | 86 ----------------------------------- 4 files changed, 91 insertions(+), 185 deletions(-) create mode 100644 wadsrc/static/language.def diff --git a/wadsrc/static/language.def b/wadsrc/static/language.def new file mode 100644 index 0000000000..4639aca994 --- /dev/null +++ b/wadsrc/static/language.def @@ -0,0 +1,91 @@ +[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"; diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index c6d0eea82b..1c525409a4 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -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."; @@ -2722,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"; diff --git a/wadsrc/static/language.ptb b/wadsrc/static/language.ptb index 75ae542224..c3187eb8bf 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."; diff --git a/wadsrc/static/language.rus b/wadsrc/static/language.rus index d43087eeb7..496d452f36 100644 --- a/wadsrc/static/language.rus +++ b/wadsrc/static/language.rus @@ -657,19 +657,6 @@ PD_ALL6 = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ требуютÑÑ Ð²Ñе шеÑть клю PD_ALL6O = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ требуютÑÑ Ð²Ñе шеÑть ключей"; PD_ALLKEYS = "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ требуютÑÑ Ð²Ñе ключи"; -// 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 = "ДоÑтигнут лимит фрагов."; TXT_TIMELIMIT = "ДоÑтигнут лимит времени."; @@ -2705,79 +2692,6 @@ 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."; -// 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"; From c13e4961072a64ef886d4d4990a14f286b470989 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 19 Feb 2019 23:18:46 +0100 Subject: [PATCH 55/95] - a bit of text cleanuo. Removed some unused strings and moved a few not-to-be-translated ones to language.def. --- wadsrc/static/language.def | 4 ++++ wadsrc/static/language.enu | 5 ----- wadsrc/static/language.ptb | 3 --- wadsrc/static/language.rus | 5 ----- 4 files changed, 4 insertions(+), 13 deletions(-) diff --git a/wadsrc/static/language.def b/wadsrc/static/language.def index 4639aca994..5e629dc97f 100644 --- a/wadsrc/static/language.def +++ b/wadsrc/static/language.def @@ -89,3 +89,7 @@ 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 1c525409a4..72d3377164 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -1039,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"; @@ -1882,8 +1879,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"; diff --git a/wadsrc/static/language.ptb b/wadsrc/static/language.ptb index c3187eb8bf..d46e1681f7 100644 --- a/wadsrc/static/language.ptb +++ b/wadsrc/static/language.ptb @@ -968,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 index 496d452f36..1facbc50ff 100644 --- a/wadsrc/static/language.rus +++ b/wadsrc/static/language.rus @@ -1059,9 +1059,6 @@ TAG_10GOLD = "10 золотых"; TAG_25GOLD = "25 золотых"; TAG_50GOLD = "50 золотых"; TAG_300GOLD = "300 золотых"; -TAG_QUEST4 = "задание4"; -TAG_QUEST5 = "задание5"; -TAG_QUEST6 = "задание4"; // Item tags: Strife NPCs TAG_ACOLYTE = "Служитель"; @@ -1871,8 +1868,6 @@ DSPLYMNU_SHOWENDOOM = "Показать Ñкран ENDOOM"; DSPLYMNU_BLOODFADE = "ИнтенÑивноÑть вÑпышки при ранении"; DSPLYMNU_PICKUPFADE = "ИнтенÑивноÑть вÑпышки при подборе"; DSPLYMNU_WATERFADE = "ИнтенÑивноÑть Ñффекта под водой"; -DSPLYMNU_PALLETEHACK = "DirectDraw хак палитры"; // Ðе иÑпользуетÑÑ -DSPLYMNU_ATTACHEDSURFACES = "ИÑпользовать прикрепленные поверхноÑти"; // Ðе иÑпользуетÑÑ DSPLYMNU_SKYMODE = "Режим отриÑовки неба"; DSPLYMNU_LINEARSKY = "Линейной небо"; DSPLYMNU_GZDFULLBRIGHT = "ÐŸÐ¾Ð»Ð½Ð°Ñ ÑркоÑть замещает цвет Ñектора"; From 5e288ef2d4f4f5320e8b4a3c80fefe457d1afc85 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 20 Feb 2019 00:01:20 +0100 Subject: [PATCH 56/95] - fixed: Doom used Chex Quest's default settings for menu fonts. --- wadsrc/static/menudef.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 874306c931..7ec552871b 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -17,7 +17,7 @@ DEFAULTLISTMENU Linespacing 16 Font "BigUpper", "Red" } - IfGame(Doom, Chex) + IfGame(Chex) { Selector "M_SKULL1", -32, -5 Linespacing 16 From 5f25fbb2e3f7502e3db9871b08e824657236e416 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 20 Feb 2019 00:22:00 +0100 Subject: [PATCH 57/95] - added support for localized texture replacements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reads the textures and builds the data tables, but doesn´t use the textures yet. A bit more work is needed first. --- src/gamedata/textures/texturemanager.cpp | 69 +++++++++++++++++++++++- src/gamedata/textures/textures.h | 3 ++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/src/gamedata/textures/texturemanager.cpp b/src/gamedata/textures/texturemanager.cpp index c26d36765f..5562fe6901 100644 --- a/src/gamedata/textures/texturemanager.cpp +++ b/src/gamedata/textures/texturemanager.cpp @@ -1012,12 +1012,79 @@ 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); + + } + } + else if (tokens.Size() >= 2) + { + FTextureID origTex = CheckForTexture(tokens[0], ETextureType::MiscPatch); + if (origTex.isValid()) + { + FTextureID tex = CheckForTexture(entry.name, ETextureType::MiscPatch); + if (tex.isValid()) + { + tokens[1].ToLower(); + auto langids = tokens[1].Split("-", FString::TOK_SKIPEMPTY); + auto lang = langids.Last(); + 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) | tex.GetIndex(); + LocalizedTextures.Insert(comboid, GetTexture(origTex)); + 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() diff --git a/src/gamedata/textures/textures.h b/src/gamedata/textures/textures.h index 8005be330e..e2e2492f07 100644 --- a/src/gamedata/textures/textures.h +++ b/src/gamedata/textures/textures.h @@ -597,6 +597,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); @@ -662,9 +663,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; From 4eb8b53d9596e4bb5490168fd602c7a6a740ce27 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 20 Feb 2019 00:42:02 +0100 Subject: [PATCH 58/95] - enforce that localized graphics need to be the same size as the one they replace. This is one of those things where the work needed to make it robust stands in no relation to the gain. This simply isn't worth the hassle of going through the entire code and fixing every single use of the 2D texture drawing functions. Unfortunately this means that the graphics items for the menu cannot be replaced this way because their size will most likely differ, but considering that the only candidates for this are the contents of Doom's main menu, the episode menu, the skill menu and the single player summary screen, it's simply not worth it. In all these cases the IWAD contents can just as easily be replaced with text and user mods which want to offer localized menus will have to work within the confines of the system, e.g. making sure that all menu items are designed to have proper size for substitution to work or by requesting text based menus, which will be added as a modding feature later. --- src/gamedata/textures/texturemanager.cpp | 35 +++++++++++++++--------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/gamedata/textures/texturemanager.cpp b/src/gamedata/textures/texturemanager.cpp index 5562fe6901..88de868d4a 100644 --- a/src/gamedata/textures/texturemanager.cpp +++ b/src/gamedata/textures/texturemanager.cpp @@ -1044,21 +1044,30 @@ void FTextureManager::AddLocalizedVariants() FTextureID tex = CheckForTexture(entry.name, ETextureType::MiscPatch); if (tex.isValid()) { - tokens[1].ToLower(); - auto langids = tokens[1].Split("-", FString::TOK_SKIPEMPTY); - auto lang = langids.Last(); - for (auto &lang : langids) + FTexture *otex = GetTexture(origTex); + FTexture *ntex = GetTexture(tex); + if (otex->GetDisplayWidth() != ntex->GetDisplayWidth() || otex->GetDisplayHeight() != ntex->GetDisplayHeight()) { - if (lang.Len() == 2 || lang.Len() == 3) + 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); + auto lang = langids.Last(); + for (auto &lang : langids) { - uint32_t langid = MAKE_ID(lang[0], lang[1], lang[2], 0); - uint64_t comboid = (uint64_t(langid) << 32) | tex.GetIndex(); - LocalizedTextures.Insert(comboid, GetTexture(origTex)); - Textures[origTex.GetIndex()].HasLocalization = true; - } - else - { - Printf("Invalid language ID in texture %s\n", entry.name); + 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) | tex.GetIndex(); + LocalizedTextures.Insert(comboid, GetTexture(origTex)); + Textures[origTex.GetIndex()].HasLocalization = true; + } + else + { + Printf("Invalid language ID in texture %s\n", entry.name); + } } } } From 8587f253a8e6505f61c95db821fc38e6da95c246 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 20 Feb 2019 00:43:06 +0100 Subject: [PATCH 59/95] - fixed a typo --- src/menu/menudef.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/menu/menudef.cpp b/src/menu/menudef.cpp index fbfa21e9fc..80f47417ad 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; From 9f59a84a37e6362a643a38b38a24567a2fdc240d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 20 Feb 2019 00:43:31 +0100 Subject: [PATCH 60/95] - allow text substitution for StaticPatch items in ListMenus --- wadsrc/static/menudef.txt | 26 ++++----------- wadsrc/static/zscript/menu/listmenuitems.txt | 33 +++++++++++++++++--- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 7ec552871b..a16e42cc8c 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -175,7 +175,7 @@ ListMenu "EpisodeMenu" IfGame(Doom, Chex) { Position 48, 63 - StaticPatch 54, 38, "M_EPISOD" + StaticPatch 54, 38, "M_EPISOD", 0 , "$MNU_EPISODE" } IfGame(Strife) { @@ -201,15 +201,15 @@ ListMenu "SkillMenu" IfGame(Doom, Chex) { - StaticPatch 96, 14, "M_NEWG" + StaticPatch 96, 14, "M_NEWG", 0, "$MNU_NEWGANE" } IfGame(Strife) { - StaticPatch 96, 14, "M_NGAME" + StaticPatch 96, 14, "M_NGAME", 0, "$MNU_NEWGANE" } IfGame(Doom, Strife, Chex) { - StaticPatch 54, 38, "M_SKILL" + StaticPatch 54, 38, "M_SKILL", 0, "$MNU_CHOOSESKILL" Position 48, 63 } IfGame (Heretic) @@ -253,14 +253,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 } @@ -273,14 +266,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 } diff --git a/wadsrc/static/zscript/menu/listmenuitems.txt b/wadsrc/static/zscript/menu/listmenuitems.txt index 99050e1c95..28a0a7b478 100644 --- a/wadsrc/static/zscript/menu/listmenuitems.txt +++ b/wadsrc/static/zscript/menu/listmenuitems.txt @@ -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, const char *substitute = "") { Super.Init(x, y); mTexture = patch; mCentered = centered; + mSubstitute = substitute; + mFont = desc.mFont; + mColor = desc.mFontColor; + } override void Drawer(bool selected) @@ -86,14 +93,30 @@ 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)) + { + 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)) + { + 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); + } } } } From a6a091c83afdaf7c3d24cd597724c25ef3337dbd Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 20 Feb 2019 00:44:17 +0100 Subject: [PATCH 61/95] - reworked summary screen to use consistent contents, either all patches or all text but not mixed --- .../static/zscript/statscreen/statscreen.txt | 63 +++++++-------- .../zscript/statscreen/statscreen_sp.txt | 77 +++++++++---------- 2 files changed, 65 insertions(+), 75 deletions(-) diff --git a/wadsrc/static/zscript/statscreen/statscreen.txt b/wadsrc/static/zscript/statscreen/statscreen.txt index 0e4d243dc1..1fb36558c4 100644 --- a/wadsrc/static/zscript/statscreen/statscreen.txt +++ b/wadsrc/static/zscript/statscreen/statscreen.txt @@ -18,9 +18,13 @@ struct PatchInfo play version("2.5") { if (gipatch != null) { - mPatch = TexMan.CheckForTexture(gipatch.fontname, TexMan.Type_MiscPatch, TexMan.TryAny|TexMan.Localize); - mColor = mPatch.isValid() ? Font.CR_UNTRANSLATED : Font.CR_UNDEFINED; - mFont = NULL; + mPatch = TexMan.CheckForTexture(gipatch.fontname, TexMan.Type_MiscPatch); + if (TexMan.OkForLocalization(mPatch)) + { + mColor = mPatch.isValid() ? Font.CR_UNTRANSLATED : Font.CR_UNDEFINED; + mFont = NULL; + } + else mPatch.setInvalid(); } if (!mPatch.isValid()) { @@ -190,8 +194,7 @@ class StatusScreen abstract play version("2.5") if (pinfo.mPatch.isValid()) { - let size = TexMan.GetScaledSize(pinfo.mPatch); - screen.DrawTexture(pinfo.mPatch, true, midx - size.X * CleanXfac/2, y, DTA_CleanNoMove, true); + screen.DrawTexture(pinfo.mPatch, true, midx, y, DTA_CleanNoMove, true, DTA_CenterXOffset, true); return y + int(size.Y * CleanYfac); } else @@ -350,28 +353,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) { 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("$TXT_IMSUCKS"), y - IntermissionFont.GetHeight() - 2, "$TXT_IMSUCKS", DTA_Clean, true); - } - } - int hours = t / 3600; t -= hours * 3600; int minutes = t / 60; @@ -380,19 +368,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) - 1; + DrawCharPatch (printFont, ":", x -= colon_spacing, y); + x = drawNum (printFont, x, y, minutes, 2, hours!=0); if (hours) { - DrawCharPatch (IntermissionFont, ":", x -= colon_spacing, y); - drawNum (IntermissionFont, x, y, hours, 2); + DrawCharPatch (printFont, ":", x -= colon_spacing, y); + drawNum (printFont, x, y, hours, 2); } } + void drawTime (int x, int y, int t, bool no_sucks=false) + { + drawTimeFont(IntermissionFont, x, y, t); + } + //==================================================================== // @@ -697,13 +690,13 @@ class StatusScreen abstract play version("2.5") finished.Init(gameinfo.mStatscreenFinishedFont, gameinfo.mStatscreenFinishedPatch); mapname.Init(gameinfo.mStatscreenMapNameFont); - Kills = TexMan.CheckForTexture("WIOSTK", TexMan.Type_MiscPatch, TexMan.TryAny|TexMan.Localize); // "kills" - Secret = TexMan.CheckForTexture("WIOSTS", TexMan.Type_MiscPatch, TexMan.TryAny|TexMan.Localize); // "scrt", not used - P_secret = TexMan.CheckForTexture("WISCRT2", TexMan.Type_MiscPatch, TexMan.TryAny|TexMan.Localize); // "secret" - Items = TexMan.CheckForTexture("WIOSTI", TexMan.Type_MiscPatch, TexMan.TryAny|TexMan.Localize); // "items" - Timepic = TexMan.CheckForTexture("WITIME", TexMan.Type_MiscPatch, TexMan.TryAny|TexMan.Localize); // "time" - Sucks = TexMan.CheckForTexture("WISUCKS", TexMan.Type_MiscPatch, TexMan.TryAny|TexMan.Localize); // "sucks" - Par = TexMan.CheckForTexture("WIPAR", TexMan.Type_MiscPatch, TexMan.TryAny|TexMan.Localize); // "par" + 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" lnametexts[0] = wbstartstruct.thisname; lnametexts[1] = wbstartstruct.nextname; diff --git a/wadsrc/static/zscript/statscreen/statscreen_sp.txt b/wadsrc/static/zscript/statscreen/statscreen_sp.txt index 63af009656..56846b8eda 100644 --- a/wadsrc/static/zscript/statscreen/statscreen_sp.txt +++ b/wadsrc/static/zscript/statscreen/statscreen_sp.txt @@ -140,63 +140,60 @@ class DoomStatusScreen : StatusScreen // 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 = Kills.OkForLocalization() && Items.OkForLocalization() && P_secret.OkForLocalization() && Timepic.OkForLocalization() && + (!wbs.partime || Par.OkForLocalization()); + + Font printFont; - if (Kills.isValid()) + if (useGfx) { + printFont = IntermissionFont; screen.DrawTexture (Kills, true, SP_STATSX, SP_STATSY, DTA_Clean, true); - } - else - { - screen.DrawText (BigFont, tcolor, SP_STATSX, SP_STATSY, "$TXT_IMKILLS", DTA_Clean, true); - } - drawPercent (IntermissionFont, 320 - SP_STATSX, SP_STATSY, cnt_kills[0], wbs.maxkills); - - if (Items.isValid()) - { screen.DrawTexture (Items, true, SP_STATSX, SP_STATSY+lh, DTA_Clean, true); - } - else - { - screen.DrawText (BigFont, tcolor, SP_STATSX, SP_STATSY+lh, "$TXT_IMITEMS", DTA_Clean, true); - } - drawPercent (IntermissionFont, 320 - SP_STATSX, SP_STATSY+lh, cnt_items[0], wbs.maxitems); - - if (P_secret.IsValid()) - { screen.DrawTexture (P_secret, true, SP_STATSX, SP_STATSY+2*lh, DTA_Clean, true); - } - else - { - screen.DrawText (BigFont, tcolor, SP_STATSX, SP_STATSY+2*lh, "$TXT_IMSECRETS", DTA_Clean, true); - } - drawPercent (IntermissionFont, 320 - SP_STATSX, SP_STATSY+2*lh, cnt_secret[0], wbs.maxsecret); - - if (Timepic.IsValid()) - { 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, SP_TIMEX, SP_TIMEY, "$TXT_IMPAR", 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) - { - if (Par.IsValid()) + + drawPercent (printFont, 320 - SP_STATSX, SP_STATSY, cnt_kills[0], wbs.maxkills); + drawPercent (printFont, 320 - SP_STATSX, SP_STATSY+lh, cnt_items[0], wbs.maxitems); + drawPercent (printFont, 320 - SP_STATSX, SP_STATSY+2*lh, cnt_secret[0], wbs.maxsecret); + drawTimeFont (printFont, 160 - SP_TIMEX, SP_TIMEY, cnt_time); + + // 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 && Sucks.OkForLocalization()) { - screen.DrawTexture (Par, true, 160 + SP_TIMEX, SP_TIMEY, DTA_Clean, true); + let size = TexMan.GetScaledSize(Sucks); + screen.DrawTexture (Sucks, true, x - size.X, y - size.Y - 2, DTA_Clean, true); } else { - screen.DrawText (BigFont, tcolor, SP_TIMEX, SP_TIMEY, "$TXT_IMPAR", DTA_Clean, true); + screen.DrawText (printFont, Font.CR_UNTRANSLATED, x - printFont.StringWidth("$TXT_IMSUCKS"), y - printFont.GetHeight() - 2, "$TXT_IMSUCKS", DTA_Clean, true); } - drawTime (320 - SP_TIMEX, SP_TIMEY, cnt_par); } + + if (wi_showtotaltime) + { + drawTimeFont (printFont, 160 - SP_TIMEX, SP_TIMEY + lh, cnt_total_time, true); // no 'sucks' for total time ever! + } + drawTimeFont (printFont, 320 - SP_TIMEX, SP_TIMEY, cnt_par); } } From 64dc582fbeebb4a4bdc51071ce94b707eff36042 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 20 Feb 2019 00:52:31 +0100 Subject: [PATCH 62/95] - reworked texture lookup for localized textures --- src/gamedata/textures/texturemanager.cpp | 32 ++++++++++++++++---- src/gamedata/textures/textures.h | 37 ++++++++++++------------ 2 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/gamedata/textures/texturemanager.cpp b/src/gamedata/textures/texturemanager.cpp index 88de868d4a..3d841eeb5a 100644 --- a/src/gamedata/textures/texturemanager.cpp +++ b/src/gamedata/textures/texturemanager.cpp @@ -38,6 +38,7 @@ #include "doomstat.h" #include "w_wad.h" #include "templates.h" +#include "i_system.h" #include "r_data/r_translate.h" #include "r_data/sprites.h" @@ -396,7 +397,7 @@ 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()); } //========================================================================== @@ -1060,8 +1061,8 @@ void FTextureManager::AddLocalizedVariants() 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) | tex.GetIndex(); - LocalizedTextures.Insert(comboid, GetTexture(origTex)); + uint64_t comboid = (uint64_t(langid) << 32) | origTex.GetIndex(); + LocalizedTextures.Insert(comboid, tex.GetIndex()); Textures[origTex.GetIndex()].HasLocalization = true; } else @@ -1226,12 +1227,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 e2e2492f07..442f3b4891 100644 --- a/src/gamedata/textures/textures.h +++ b/src/gamedata/textures/textures.h @@ -524,47 +524,48 @@ 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); void FlushAll(); -//public: - - FTextureID PalCheck(FTextureID tex); - enum { TEXMAN_TryAny = 1, @@ -667,7 +668,7 @@ private: }; enum { HASH_END = -1, HASH_SIZE = 1027 }; TArray Textures; - TMap LocalizedTextures; + TMap LocalizedTextures; TArray Translation; int HashFirst[HASH_SIZE]; FTextureID DefaultTexture; From 74f52110463d96bdbde689fe7678a833a907c3cc Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 20 Feb 2019 18:54:29 +0100 Subject: [PATCH 63/95] - fixed accidental commit of incomplete test code. --- wadsrc/static/zscript/menu/listmenuitems.txt | 6 +++--- wadsrc/static/zscript/statscreen/statscreen.txt | 3 ++- wadsrc/static/zscript/statscreen/statscreen_sp.txt | 8 ++++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/wadsrc/static/zscript/menu/listmenuitems.txt b/wadsrc/static/zscript/menu/listmenuitems.txt index 28a0a7b478..b1c8e6992c 100644 --- a/wadsrc/static/zscript/menu/listmenuitems.txt +++ b/wadsrc/static/zscript/menu/listmenuitems.txt @@ -71,7 +71,7 @@ class ListMenuItemStaticPatch : ListMenuItem Font mFont; int mColor; - void Init(ListMenuDescriptor desc, double x, double y, TextureID patch, bool centered = false, const char *substitute = "") + void Init(ListMenuDescriptor desc, double x, double y, TextureID patch, bool centered = false, String substitute = "") { Super.Init(x, y); mTexture = patch; @@ -123,9 +123,9 @@ class ListMenuItemStaticPatch : ListMenuItem 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); } } diff --git a/wadsrc/static/zscript/statscreen/statscreen.txt b/wadsrc/static/zscript/statscreen/statscreen.txt index 1fb36558c4..4a4d69e64b 100644 --- a/wadsrc/static/zscript/statscreen/statscreen.txt +++ b/wadsrc/static/zscript/statscreen/statscreen.txt @@ -194,7 +194,8 @@ class StatusScreen abstract play version("2.5") if (pinfo.mPatch.isValid()) { - screen.DrawTexture(pinfo.mPatch, true, midx, y, DTA_CleanNoMove, true, DTA_CenterXOffset, true); + Vector2 size = TexMan.GetScaledSize(pinfo.mPatch); + screen.DrawTexture(pinfo.mPatch, true, midx - size.X, y, DTA_CleanNoMove, true); return y + int(size.Y * CleanYfac); } else diff --git a/wadsrc/static/zscript/statscreen/statscreen_sp.txt b/wadsrc/static/zscript/statscreen/statscreen_sp.txt index 56846b8eda..eb469e2857 100644 --- a/wadsrc/static/zscript/statscreen/statscreen_sp.txt +++ b/wadsrc/static/zscript/statscreen/statscreen_sp.txt @@ -142,8 +142,8 @@ class DoomStatusScreen : StatusScreen let tcolor = Font.CR_RED; // For visual consistency, only use the patches here if all are present. - bool useGfx = Kills.OkForLocalization() && Items.OkForLocalization() && P_secret.OkForLocalization() && Timepic.OkForLocalization() && - (!wbs.partime || Par.OkForLocalization()); + bool useGfx = TexMan.OkForLocalization(Kills) && TexMan.OkForLocalization(Items) && TexMan.OkForLocalization(P_secret) && TexMan.OkForLocalization(Timepic) && + (!wbs.partime || TexMan.OkForLocalization(Par)); Font printFont; @@ -178,7 +178,7 @@ class DoomStatusScreen : StatusScreen { // "sucks" int x = 160 - SP_TIMEX; int y = SP_TIMEY; - if (useGfx && Sucks.OkForLocalization()) + if (useGfx && TexMan.OkForLocalization(Sucks)) { let size = TexMan.GetScaledSize(Sucks); screen.DrawTexture (Sucks, true, x - size.X, y - size.Y - 2, DTA_Clean, true); @@ -191,7 +191,7 @@ class DoomStatusScreen : StatusScreen if (wi_showtotaltime) { - drawTimeFont (printFont, 160 - SP_TIMEX, SP_TIMEY + lh, cnt_total_time, true); // no 'sucks' for total time ever! + drawTimeFont (printFont, 160 - SP_TIMEX, SP_TIMEY + lh, cnt_total_time); } drawTimeFont (printFont, 320 - SP_TIMEX, SP_TIMEY, cnt_par); } From d2ac77e7211793ed9f184426afa055162eb2d3f7 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 20 Feb 2019 19:04:34 +0100 Subject: [PATCH 64/95] - fixed reading of exit text replacements and display of intermission text screens for Unicode. --- src/gamedata/g_mapinfo.cpp | 4 ++-- src/intermission/intermission.cpp | 7 ++++--- src/intermission/intermission.h | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index 97645273da..fc84aa0d44 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -830,7 +830,7 @@ void FMapInfoParser::ParseCluster() // 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, false); + 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. @@ -838,7 +838,7 @@ void FMapInfoParser::ParseCluster() auto fn = Wads.GetWadName(fileno); if (fn && (!stricmp(fn, "HEXEN.WAD") || !stricmp(fn, "HEXDD.WAD"))) { - FStringf key("TXT_%.5s_%s", fn, sc.String); + FStringf key("TXT_%.5s_%s", fn, clusterinfo->ExitText); if (GStrings.exists(key)) { clusterinfo->ExitText = key; diff --git a/src/intermission/intermission.cpp b/src/intermission/intermission.cpp index 7f68ebae7d..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') 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; From 0e449405a4c8de9c889c2cce7fb9c81e2697c577 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 20 Feb 2019 19:12:32 +0100 Subject: [PATCH 65/95] - fixed string checks in dialogue loader. --- src/p_conversation.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index cbe7f10479..c536611ae5 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -352,7 +352,7 @@ static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, const char *nam if (name) { FStringf label("$TXT_DLG_%s_d%d_%s", name, int(pos), TokenFromString(speech.Dialogue).GetChars()); - node->Dialogue = GStrings.exists(label)? label : FString(speech.Dialogue); + node->Dialogue = GStrings.exists(label.GetChars()+1)? label : FString(speech.Dialogue); } else { @@ -376,7 +376,7 @@ static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, const char *nam label.ReplaceChars(' ', '_'); label.ReplaceChars('\'', '_'); node->SpeakerName.Format("$TXT_SPEAKER_%s", label.GetChars()); - if (!GStrings.exists(node->SpeakerName)) node->SpeakerName = speech.Name; + if (!GStrings.exists(node->SpeakerName.GetChars() + 1)) node->SpeakerName = speech.Name; } else @@ -448,7 +448,7 @@ static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, const char *nam if (name) { FStringf label("$TXT_DLG_%s_d%d_%s", name, pos, TokenFromString(speech.Dialogue).GetChars()); - node->Dialogue = GStrings.exists(label)? label : FString(speech.Dialogue); + node->Dialogue = GStrings.exists(label.GetChars() + 1)? label : FString(speech.Dialogue); } else { @@ -477,7 +477,7 @@ static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, const char *nam label.ReplaceChars(' ', '_'); label.ReplaceChars('\'', '_'); node->SpeakerName.Format("$TXT_SPEAKER_%s", label.GetChars()); - if (!GStrings.exists(node->SpeakerName)) node->SpeakerName = speech.Name; + if (!GStrings.exists(node->SpeakerName.GetChars() + 1)) node->SpeakerName = speech.Name; } else { @@ -574,7 +574,7 @@ static void ParseReplies (const char *name, int pos, FStrifeDialogueReply **repl if (name) { FStringf label("$TXT_RPLY%d_%s_d%d_%s", j, name, pos, TokenFromString(rsp->Reply).GetChars()); - reply->Reply = GStrings.exists(label)? label : FString(rsp->Reply); + reply->Reply = GStrings.exists(label.GetChars() + 1)? label : FString(rsp->Reply); reply->Reply = label; } @@ -600,7 +600,7 @@ static void ParseReplies (const char *name, int pos, FStrifeDialogueReply **repl if (name) { FStringf label("$TXT_RYES%d_%s_d%d_%s", j, name, pos, TokenFromString(rsp->Yes).GetChars()); - reply->QuickYes = GStrings.exists(label)? label : FString(rsp->Yes); + reply->QuickYes = GStrings.exists(label.GetChars() + 1)? label : FString(rsp->Yes); } else { @@ -610,7 +610,7 @@ static void ParseReplies (const char *name, int pos, FStrifeDialogueReply **repl 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)? label : FString(rsp->No); + reply->QuickNo = GStrings.exists(label.GetChars() + 1)? label : FString(rsp->No); } else { From ecb1c2ee4a0451c4881f46f312e8cbb2959ba1e7 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 20 Feb 2019 19:30:39 +0100 Subject: [PATCH 66/95] - initialize the language right after reading the strings. --- src/d_main.cpp | 1 - src/gamedata/stringtable.cpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 762a0f015b..c6ee1dddc8 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -2045,7 +2045,6 @@ static void D_DoomInit() if (!batchrun) Printf ("M_LoadDefaults: Load system defaults.\n"); M_LoadDefaults (); // load before initing other systems - SetLanguageIDs (); } //========================================================================== diff --git a/src/gamedata/stringtable.cpp b/src/gamedata/stringtable.cpp index 679735c121..d57361eac6 100644 --- a/src/gamedata/stringtable.cpp +++ b/src/gamedata/stringtable.cpp @@ -54,6 +54,7 @@ void FStringTable::LoadStrings () { LoadLanguage (lump); } + SetLanguageIDs(); UpdateLanguage(); } From 15eb57e00dbc0bda9b1776c7cd0becf2c1c274c9 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 20 Feb 2019 19:40:17 +0100 Subject: [PATCH 67/95] - finalized graphics substitution feature. --- src/gamedata/textures/texturemanager.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/gamedata/textures/texturemanager.cpp b/src/gamedata/textures/texturemanager.cpp index 3d841eeb5a..ebcb354988 100644 --- a/src/gamedata/textures/texturemanager.cpp +++ b/src/gamedata/textures/texturemanager.cpp @@ -1034,12 +1034,13 @@ void FTextureManager::AddLocalizedVariants() 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; } } - else if (tokens.Size() >= 2) + if (tokens.Size() >= 2) { - FTextureID origTex = CheckForTexture(tokens[0], ETextureType::MiscPatch); + FString base = ExtractFileBase(tokens[0]); + FTextureID origTex = CheckForTexture(base, ETextureType::MiscPatch); if (origTex.isValid()) { FTextureID tex = CheckForTexture(entry.name, ETextureType::MiscPatch); @@ -1055,7 +1056,6 @@ void FTextureManager::AddLocalizedVariants() { tokens[1].ToLower(); auto langids = tokens[1].Split("-", FString::TOK_SKIPEMPTY); - auto lang = langids.Last(); for (auto &lang : langids) { if (lang.Len() == 2 || lang.Len() == 3) @@ -1180,7 +1180,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(); } //========================================================================== From 6a742f8d345986a2246dfab7c089213ae4700c9c Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 20 Feb 2019 20:20:06 +0100 Subject: [PATCH 68/95] - changed all places which used a localized string as a format template for printf, String.Format et.al. Passing something non-constant at compile time here is extremely dangerous, especially when users can replace those strings if they like. It now uses FString::Substitute in all cases where something needs to be inserted into a template string. --- src/menu/messagebox.cpp | 8 ++++---- wadsrc/static/zscript/menu/conversationmenu.txt | 8 ++++++-- wadsrc/static/zscript/menu/optionmenu.txt | 7 ++++--- 3 files changed, 14 insertions(+), 9 deletions(-) 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/wadsrc/static/zscript/menu/conversationmenu.txt b/wadsrc/static/zscript/menu/conversationmenu.txt index 02201a0ddf..dccfc65662 100644 --- a/wadsrc/static/zscript/menu/conversationmenu.txt +++ b/wadsrc/static/zscript/menu/conversationmenu.txt @@ -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/optionmenu.txt b/wadsrc/static/zscript/menu/optionmenu.txt index 10bd91140d..659830827b 100644 --- a/wadsrc/static/zscript/menu/optionmenu.txt +++ b/wadsrc/static/zscript/menu/optionmenu.txt @@ -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; } } } From 8bdbd2e915a66cfbe172a4779c2b263f9352d045 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 21 Feb 2019 00:16:48 +0100 Subject: [PATCH 69/95] - fixed layout of summary screen. --- src/maploader/renderinfo.cpp | 4 +-- .../static/zscript/statscreen/statscreen.txt | 33 +++++++++---------- .../zscript/statscreen/statscreen_coop.txt | 18 +++++----- .../zscript/statscreen/statscreen_dm.txt | 8 ++--- .../zscript/statscreen/statscreen_sp.txt | 14 ++++---- 5 files changed, 38 insertions(+), 39 deletions(-) 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/wadsrc/static/zscript/statscreen/statscreen.txt b/wadsrc/static/zscript/statscreen/statscreen.txt index 4a4d69e64b..38d71e8ef3 100644 --- a/wadsrc/static/zscript/statscreen/statscreen.txt +++ b/wadsrc/static/zscript/statscreen/statscreen.txt @@ -194,8 +194,8 @@ class StatusScreen abstract play version("2.5") if (pinfo.mPatch.isValid()) { - Vector2 size = TexMan.GetScaledSize(pinfo.mPatch); - screen.DrawTexture(pinfo.mPatch, true, midx - size.X, y, DTA_CleanNoMove, true); + let size = TexMan.GetScaledSize(pinfo.mPatch); + screen.DrawTexture(pinfo.mPatch, true, midx - size.X * CleanXfac/2, y, DTA_CleanNoMove, true); return y + int(size.Y * CleanYfac); } else @@ -262,12 +262,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) { @@ -314,14 +313,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; } @@ -329,8 +328,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; } @@ -340,9 +339,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 (IntermissionFont, color, x, y, "/", nomove? DTA_CleanNoMove : DTA_Clean, true); } drawNum (fnt, x, y, p, -1, false, color); } @@ -354,7 +353,7 @@ class StatusScreen abstract play version("2.5") // //==================================================================== - void drawTimeFont (Font printFont, int x, int y, int t) + void drawTimeFont (Font printFont, int x, int y, int t, int color) { bool sucky; @@ -372,19 +371,19 @@ class StatusScreen abstract play version("2.5") int num_spacing = printFont.GetCharWidth("3"); int colon_spacing = printFont.GetCharWidth(":"); - x = drawNum (printFont, x, y, seconds, 2) - 1; - DrawCharPatch (printFont, ":", x -= colon_spacing, y); - x = drawNum (printFont, 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 (printFont, ":", x -= colon_spacing, y); - drawNum (printFont, 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); + drawTimeFont(printFont, x, y, t, Font.CR_UNTRANSLATED); } diff --git a/wadsrc/static/zscript/statscreen/statscreen_coop.txt b/wadsrc/static/zscript/statscreen/statscreen_coop.txt index 7393877b6a..fb82cb36b3 100644 --- a/wadsrc/static/zscript/statscreen/statscreen_coop.txt +++ b/wadsrc/static/zscript/statscreen/statscreen_coop.txt @@ -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/statscreen/statscreen_dm.txt index 8807fb19cf..ec9bdcb673 100644 --- a/wadsrc/static/zscript/statscreen/statscreen_dm.txt +++ b/wadsrc/static/zscript/statscreen/statscreen_dm.txt @@ -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/statscreen/statscreen_sp.txt index eb469e2857..e1bcd0b624 100644 --- a/wadsrc/static/zscript/statscreen/statscreen_sp.txt +++ b/wadsrc/static/zscript/statscreen/statscreen_sp.txt @@ -163,13 +163,13 @@ class DoomStatusScreen : StatusScreen 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, SP_TIMEX, SP_TIMEY, "$TXT_IMPAR", 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); - drawPercent (printFont, 320 - SP_STATSX, SP_STATSY+lh, cnt_items[0], wbs.maxitems); - drawPercent (printFont, 320 - SP_STATSX, SP_STATSY+2*lh, cnt_secret[0], wbs.maxsecret); - drawTimeFont (printFont, 160 - SP_TIMEX, SP_TIMEY, cnt_time); + 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. @@ -191,9 +191,9 @@ class DoomStatusScreen : StatusScreen if (wi_showtotaltime) { - drawTimeFont (printFont, 160 - SP_TIMEX, SP_TIMEY + lh, cnt_total_time); + drawTimeFont (printFont, 160 - SP_TIMEX, SP_TIMEY + lh, cnt_total_time, tcolor); } - drawTimeFont (printFont, 320 - SP_TIMEX, SP_TIMEY, cnt_par); + drawTimeFont (printFont, 320 - SP_TIMEX, SP_TIMEY, cnt_par, tcolor); } } From 7ea2f135dfe8f5a645f9da4fcb7c2dc35672f49e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 21 Feb 2019 00:23:49 +0100 Subject: [PATCH 70/95] - did not save the latest changes. --- wadsrc/static/zscript/statscreen/statscreen.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wadsrc/static/zscript/statscreen/statscreen.txt b/wadsrc/static/zscript/statscreen/statscreen.txt index 38d71e8ef3..5fddf02c0a 100644 --- a/wadsrc/static/zscript/statscreen/statscreen.txt +++ b/wadsrc/static/zscript/statscreen/statscreen.txt @@ -341,7 +341,7 @@ class StatusScreen abstract play version("2.5") { x = drawNum(fnt, x, y, b, 2, false, color); x -= fnt.StringWidth("/"); - screen.DrawText (IntermissionFont, color, x, y, "/", nomove? DTA_CleanNoMove : DTA_Clean, true); + screen.DrawText (fnt, color, x, y, "/", nomove? DTA_CleanNoMove : DTA_Clean, true); } drawNum (fnt, x, y, p, -1, false, color); } @@ -383,7 +383,7 @@ class StatusScreen abstract play version("2.5") void drawTime (int x, int y, int t, bool no_sucks=false) { - drawTimeFont(printFont, x, y, t, Font.CR_UNTRANSLATED); + drawTimeFont(IntermissionFont, x, y, t, Font.CR_UNTRANSLATED); } From f580d85da6787e419cc132a93108e00b393a2237 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 21 Feb 2019 00:24:09 +0100 Subject: [PATCH 71/95] - fixed typo in menu texts. --- wadsrc/static/menudef.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index a16e42cc8c..759a0466f0 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -201,11 +201,11 @@ ListMenu "SkillMenu" IfGame(Doom, Chex) { - StaticPatch 96, 14, "M_NEWG", 0, "$MNU_NEWGANE" + StaticPatch 96, 14, "M_NEWG", 0, "$MNU_NEWGAME" } IfGame(Strife) { - StaticPatch 96, 14, "M_NGAME", 0, "$MNU_NEWGANE" + StaticPatch 96, 14, "M_NGAME", 0, "$MNU_NEWGAME" } IfGame(Doom, Strife, Chex) { From 22781e3cb97c972dfca712f35c7085ec2db9e296 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 21 Feb 2019 00:43:58 +0100 Subject: [PATCH 72/95] - BigFont update. --- wadsrc/static/language.enu | 4 ++++ .../filter/game-doomchex/fonts/bigfont/0044.lmp | Bin 307 -> 307 bytes .../filter/game-doomchex/fonts/bigfont/0048.lmp | Bin 299 -> 299 bytes .../filter/game-doomchex/fonts/bigfont/00C0.lmp | Bin 0 -> 303 bytes .../filter/game-doomchex/fonts/bigfont/00C1.lmp | Bin 0 -> 299 bytes .../filter/game-doomchex/fonts/bigfont/00C2.lmp | Bin 0 -> 300 bytes .../filter/game-doomchex/fonts/bigfont/00C3.lmp | Bin 0 -> 317 bytes .../filter/game-doomchex/fonts/bigfont/00C4.lmp | Bin 301 -> 315 bytes .../filter/game-doomchex/fonts/bigfont/00C5.lmp | Bin 0 -> 323 bytes .../filter/game-doomchex/fonts/bigfont/00C6.lmp | Bin 0 -> 428 bytes .../filter/game-doomchex/fonts/bigfont/00C7.lmp | Bin 0 -> 343 bytes .../filter/game-doomchex/fonts/bigfont/00C8.lmp | Bin 0 -> 307 bytes .../filter/game-doomchex/fonts/bigfont/00C9.lmp | Bin 0 -> 307 bytes .../filter/game-doomchex/fonts/bigfont/00CA.lmp | Bin 0 -> 306 bytes .../filter/game-doomchex/fonts/bigfont/00CB.lmp | Bin 0 -> 316 bytes .../filter/game-doomchex/fonts/bigfont/00CC.lmp | Bin 0 -> 160 bytes .../filter/game-doomchex/fonts/bigfont/00CD.lmp | Bin 0 -> 160 bytes .../filter/game-doomchex/fonts/bigfont/00CE.lmp | Bin 0 -> 204 bytes .../filter/game-doomchex/fonts/bigfont/00CF.lmp | Bin 0 -> 198 bytes .../filter/game-doomchex/fonts/bigfont/00D0.lmp | Bin 0 -> 339 bytes .../filter/game-doomchex/fonts/bigfont/00D1.lmp | Bin 0 -> 361 bytes .../filter/game-doomchex/fonts/bigfont/00D2.lmp | Bin 0 -> 354 bytes .../filter/game-doomchex/fonts/bigfont/00D3.lmp | Bin 0 -> 354 bytes .../filter/game-doomchex/fonts/bigfont/00D4.lmp | Bin 0 -> 358 bytes .../filter/game-doomchex/fonts/bigfont/00D5.lmp | Bin 0 -> 367 bytes .../filter/game-doomchex/fonts/bigfont/00D6.lmp | Bin 353 -> 367 bytes .../filter/game-doomchex/fonts/bigfont/00D8.lmp | Bin 0 -> 355 bytes .../filter/game-doomchex/fonts/bigfont/00D9.lmp | Bin 0 -> 337 bytes .../filter/game-doomchex/fonts/bigfont/00DA.lmp | Bin 0 -> 337 bytes .../filter/game-doomchex/fonts/bigfont/00DB.lmp | Bin 0 -> 346 bytes .../filter/game-doomchex/fonts/bigfont/00DC.lmp | Bin 296 -> 330 bytes .../filter/game-doomchex/fonts/bigfont/00DD.lmp | Bin 0 -> 307 bytes .../filter/game-doomchex/fonts/bigfont/00DE.lmp | Bin 0 -> 349 bytes .../filter/game-doomchex/fonts/bigfont/00DF.lmp | Bin 0 -> 322 bytes .../filter/game-doomchex/fonts/bigfont/0110.lmp | Bin 0 -> 339 bytes .../filter/game-doomchex/fonts/bigfont/0401.lmp | Bin 0 -> 316 bytes .../filter/game-doomchex/fonts/bigfont/0402.lmp | Bin 0 -> 281 bytes .../filter/game-doomchex/fonts/bigfont/0403.lmp | Bin 0 -> 222 bytes .../filter/game-doomchex/fonts/bigfont/0404.lmp | Bin 0 -> 286 bytes .../filter/game-doomchex/fonts/bigfont/0405.lmp | Bin 0 -> 327 bytes .../filter/game-doomchex/fonts/bigfont/0406.lmp | Bin 0 -> 134 bytes .../filter/game-doomchex/fonts/bigfont/0407.lmp | Bin 0 -> 198 bytes .../filter/game-doomchex/fonts/bigfont/0408.lmp | Bin 0 -> 222 bytes .../filter/game-doomchex/fonts/bigfont/0409.lmp | Bin 0 -> 451 bytes .../filter/game-doomchex/fonts/bigfont/040A.lmp | Bin 0 -> 428 bytes .../filter/game-doomchex/fonts/bigfont/040B.lmp | Bin 0 -> 279 bytes .../filter/game-doomchex/fonts/bigfont/040C.lmp | Bin 0 -> 331 bytes .../filter/game-doomchex/fonts/bigfont/040E.lmp | Bin 0 -> 351 bytes .../filter/game-doomchex/fonts/bigfont/040F.lmp | Bin 0 -> 294 bytes .../filter/game-doomchex/fonts/bigfont/0419.lmp | Bin 331 -> 394 bytes .../filter/game-doomchex/fonts/bigfont/042D.lmp | Bin 286 -> 286 bytes .../filter/game-doomchex/fonts/bigfont/0490.lmp | Bin 0 -> 211 bytes .../game-doomchex/fonts/bigupper/00C0.lmp | Bin 0 -> 391 bytes .../game-doomchex/fonts/bigupper/00C1.lmp | Bin 0 -> 391 bytes .../game-doomchex/fonts/bigupper/00C2.lmp | Bin 0 -> 395 bytes .../game-doomchex/fonts/bigupper/00C3.lmp | Bin 0 -> 409 bytes .../game-doomchex/fonts/bigupper/00C4.lmp | Bin 0 -> 404 bytes .../game-doomchex/fonts/bigupper/00C5.lmp | Bin 0 -> 411 bytes .../game-doomchex/fonts/bigupper/00C6.lmp | Bin 0 -> 608 bytes .../game-doomchex/fonts/bigupper/00C8.lmp | Bin 0 -> 391 bytes .../game-doomchex/fonts/bigupper/00C9.lmp | Bin 0 -> 391 bytes .../game-doomchex/fonts/bigupper/00CA.lmp | Bin 0 -> 395 bytes .../game-doomchex/fonts/bigupper/00CB.lmp | Bin 0 -> 400 bytes .../game-doomchex/fonts/bigupper/00CC.lmp | Bin 0 -> 178 bytes .../game-doomchex/fonts/bigupper/00CD.lmp | Bin 0 -> 178 bytes .../game-doomchex/fonts/bigupper/00CE.lmp | Bin 0 -> 222 bytes .../game-doomchex/fonts/bigupper/00CF.lmp | Bin 0 -> 216 bytes .../game-doomchex/fonts/bigupper/00D0.lmp | Bin 0 -> 429 bytes .../game-doomchex/fonts/bigupper/00D1.lmp | Bin 0 -> 401 bytes .../game-doomchex/fonts/bigupper/00D2.lmp | Bin 0 -> 423 bytes .../game-doomchex/fonts/bigupper/00D3.lmp | Bin 0 -> 423 bytes .../game-doomchex/fonts/bigupper/00D4.lmp | Bin 0 -> 432 bytes .../game-doomchex/fonts/bigupper/00D5.lmp | Bin 0 -> 436 bytes .../game-doomchex/fonts/bigupper/00D6.lmp | Bin 0 -> 436 bytes .../game-doomchex/fonts/bigupper/00D8.lmp | Bin 0 -> 426 bytes .../game-doomchex/fonts/bigupper/00D9.lmp | Bin 0 -> 377 bytes .../game-doomchex/fonts/bigupper/00DA.lmp | Bin 0 -> 377 bytes .../game-doomchex/fonts/bigupper/00DB.lmp | Bin 0 -> 386 bytes .../game-doomchex/fonts/bigupper/00DC.lmp | Bin 0 -> 370 bytes .../game-doomchex/fonts/bigupper/00DD.lmp | Bin 0 -> 325 bytes .../game-doomchex/fonts/bigupper/00DE.lmp | Bin 0 -> 382 bytes .../game-doomchex/fonts/bigupper/00DF.lmp | Bin 0 -> 322 bytes .../game-doomchex/fonts/bigupper/00E0.lmp | Bin 0 -> 303 bytes .../game-doomchex/fonts/bigupper/00E1.lmp | Bin 0 -> 299 bytes .../game-doomchex/fonts/bigupper/00E2.lmp | Bin 0 -> 306 bytes .../game-doomchex/fonts/bigupper/00E3.lmp | Bin 0 -> 317 bytes .../game-doomchex/fonts/bigupper/00E4.lmp | Bin 0 -> 315 bytes .../game-doomchex/fonts/bigupper/00E5.lmp | Bin 0 -> 323 bytes .../game-doomchex/fonts/bigupper/00E6.lmp | Bin 0 -> 428 bytes .../game-doomchex/fonts/bigupper/00E7.lmp | Bin 0 -> 446 bytes .../game-doomchex/fonts/bigupper/00E8.lmp | Bin 0 -> 307 bytes .../game-doomchex/fonts/bigupper/00E9.lmp | Bin 0 -> 307 bytes .../game-doomchex/fonts/bigupper/00EA.lmp | Bin 0 -> 306 bytes .../game-doomchex/fonts/bigupper/00EB.lmp | Bin 0 -> 316 bytes .../game-doomchex/fonts/bigupper/00EC.lmp | Bin 0 -> 160 bytes .../game-doomchex/fonts/bigupper/00ED.lmp | Bin 0 -> 160 bytes .../game-doomchex/fonts/bigupper/00EE.lmp | Bin 0 -> 204 bytes .../game-doomchex/fonts/bigupper/00EF.lmp | Bin 0 -> 198 bytes .../game-doomchex/fonts/bigupper/00F0.lmp | Bin 0 -> 339 bytes .../game-doomchex/fonts/bigupper/00F1.lmp | Bin 0 -> 361 bytes .../game-doomchex/fonts/bigupper/00F2.lmp | Bin 0 -> 354 bytes .../game-doomchex/fonts/bigupper/00F3.lmp | Bin 0 -> 354 bytes .../game-doomchex/fonts/bigupper/00F4.lmp | Bin 0 -> 358 bytes .../game-doomchex/fonts/bigupper/00F5.lmp | Bin 0 -> 367 bytes .../game-doomchex/fonts/bigupper/00F6.lmp | Bin 0 -> 367 bytes .../game-doomchex/fonts/bigupper/00F8.lmp | Bin 0 -> 355 bytes .../game-doomchex/fonts/bigupper/00F9.lmp | Bin 0 -> 337 bytes .../game-doomchex/fonts/bigupper/00FA.lmp | Bin 0 -> 337 bytes .../game-doomchex/fonts/bigupper/00FB.lmp | Bin 0 -> 346 bytes .../game-doomchex/fonts/bigupper/00FC.lmp | Bin 0 -> 330 bytes .../game-doomchex/fonts/bigupper/00FD.lmp | Bin 0 -> 307 bytes .../game-doomchex/fonts/bigupper/00FE.lmp | Bin 0 -> 349 bytes .../game-doomchex/fonts/bigupper/00FF.lmp | Bin 0 -> 298 bytes .../game-doomchex/fonts/bigupper/0110.lmp | Bin 0 -> 429 bytes .../game-doomchex/fonts/bigupper/0111.lmp | Bin 0 -> 339 bytes .../game-doomchex/fonts/bigupper/0401.lmp | Bin 0 -> 400 bytes .../game-doomchex/fonts/bigupper/0402.lmp | Bin 0 -> 375 bytes .../game-doomchex/fonts/bigupper/0403.lmp | Bin 0 -> 287 bytes .../game-doomchex/fonts/bigupper/0404.lmp | Bin 0 -> 370 bytes .../game-doomchex/fonts/bigupper/0405.lmp | Bin 0 -> 372 bytes .../game-doomchex/fonts/bigupper/0406.lmp | Bin 0 -> 152 bytes .../game-doomchex/fonts/bigupper/0407.lmp | Bin 0 -> 216 bytes .../game-doomchex/fonts/bigupper/0408.lmp | Bin 0 -> 280 bytes .../game-doomchex/fonts/bigupper/0409.lmp | Bin 0 -> 532 bytes .../game-doomchex/fonts/bigupper/040A.lmp | Bin 0 -> 510 bytes .../game-doomchex/fonts/bigupper/040B.lmp | Bin 0 -> 369 bytes .../game-doomchex/fonts/bigupper/040C.lmp | Bin 0 -> 431 bytes .../game-doomchex/fonts/bigupper/040E.lmp | Bin 0 -> 414 bytes .../game-doomchex/fonts/bigupper/040F.lmp | Bin 0 -> 370 bytes .../game-doomchex/fonts/bigupper/0451.lmp | Bin 0 -> 316 bytes .../game-doomchex/fonts/bigupper/0452.lmp | Bin 0 -> 281 bytes .../game-doomchex/fonts/bigupper/0453.lmp | Bin 0 -> 222 bytes .../game-doomchex/fonts/bigupper/0454.lmp | Bin 0 -> 286 bytes .../game-doomchex/fonts/bigupper/0455.lmp | Bin 0 -> 327 bytes .../game-doomchex/fonts/bigupper/0456.lmp | Bin 0 -> 134 bytes .../game-doomchex/fonts/bigupper/0457.lmp | Bin 0 -> 198 bytes .../game-doomchex/fonts/bigupper/0458.lmp | Bin 0 -> 222 bytes .../game-doomchex/fonts/bigupper/0459.lmp | Bin 0 -> 451 bytes .../game-doomchex/fonts/bigupper/045A.lmp | Bin 0 -> 428 bytes .../game-doomchex/fonts/bigupper/045B.lmp | Bin 0 -> 279 bytes .../game-doomchex/fonts/bigupper/045C.lmp | Bin 0 -> 331 bytes .../game-doomchex/fonts/bigupper/045E.lmp | Bin 0 -> 351 bytes .../game-doomchex/fonts/bigupper/045F.lmp | Bin 0 -> 294 bytes .../game-doomchex/fonts/bigupper/0490.lmp | Bin 0 -> 276 bytes .../game-doomchex/fonts/bigupper/0491.lmp | Bin 0 -> 211 bytes .../game-doomchex/fonts/bigupper/1E9E.lmp | Bin 0 -> 362 bytes 146 files changed, 4 insertions(+) create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C0.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C1.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C2.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C3.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C5.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C6.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C7.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C8.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C9.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CA.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CB.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CC.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CD.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CE.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CF.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D0.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D1.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D2.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D3.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D4.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D5.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D8.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D9.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DA.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DB.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DD.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DE.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DF.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0110.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0401.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0402.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0403.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0404.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0405.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0406.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0407.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0408.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0409.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0490.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C0.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C1.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C2.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C3.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C4.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C5.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C6.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C8.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C9.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CA.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CB.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CC.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CD.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CE.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CF.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D0.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D1.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D2.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D3.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D4.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D5.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D6.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D8.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D9.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DA.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DB.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DC.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DD.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DE.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DF.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E0.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E1.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E2.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E3.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E4.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E5.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E6.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E7.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E8.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E9.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EA.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EB.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EC.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00ED.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EE.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EF.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F0.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F1.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F2.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F3.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F4.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F5.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F6.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F8.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F9.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FA.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FB.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FC.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FD.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FE.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FF.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0110.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0111.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0401.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0402.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0403.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0404.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0405.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0406.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0407.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0408.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0409.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0451.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0452.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0453.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0454.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0455.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0456.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0457.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0458.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0459.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045A.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045B.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045C.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045E.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045F.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0490.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0491.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/1E9E.lmp diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index 72d3377164..f2c1c50e2f 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -1309,6 +1309,10 @@ 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?"; // Friendly names diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0044.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0044.lmp index f3a374dc27abb9317ffd5ec9fae58a27a4fe5926..c689159cd8bdd36a42d6e0e8cd5f233eb0678a48 100644 GIT binary patch delta 11 ScmdnYw3%sw2V>Sm&sP8#rv!2U delta 11 ScmdnYw3%sw2V=%W&sP8#p9F9K diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0048.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0048.lmp index b2b14f62c40c3b37e0b9b58fc12189219f7b3121..9fc5120d7ad2aeae90868decdb47bcf3bc40cc53 100644 GIT binary patch delta 18 XcmZ3@w3=x`GE-L8#8g8NIb$*aJ&gw4 delta 18 XcmZ3@w3=x`GE+vz#8g8NIb$*aJy8bL 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 0000000000000000000000000000000000000000..968c88011cbf72a9195899e6c48947a1a2cec518 GIT binary patch literal 303 zcmYL@%MHRX5JU}0K;d5k#c<>jP_V2uvK(>R6CKb5MbH8z&;vElf_YAm*yve1lijh` zW@C&g&5m;qC+Oe`H@L$Cp74Sl%OaTC!g4W2^fG0*nlBef+e_z=M)J?pYCa-(&4M$6W+Wj+Tue`dM$AMp#~US8Ay literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c01aac491e4122f16baccb405bca47632981f93c GIT binary patch literal 300 zcmYL@%?-jZ424rlsoJWv3$P7GE>#t*$dRH{T$~ddFaZ;=0VA*kOE3ht@Dh-4^jYuu zPZ`vxlv=Aj@&O#d0?yz9uHXjl-~pcC1>T@5l-hy53@Kt)AzKU8)KH!&>AFeU(ljyL zrp<=*>`{&tnu|4LvMb>vSi{+^S`jVmlEG-v!Lk_K)DB*aA~Z{w(AP_z`4%;yxH!ko od5=ac1`$g#lR+@2>v6S3O+2&3Gn5XNy@-U9$JTE#efA&m18TNk)Bpeg literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f69255cf43d6c2a4f607976fa8814cb39d60aa39 GIT binary patch literal 317 zcmYL@!41MN3`NtHQb9p*V+*F>$R(g+MX?km;^LgxfFT%x6ig&-olN{F~S7{~ABReq>Dm literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C4.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C4.lmp index 88866e396cb066b679a54aaf0e546f47d13e7402..a115995088a94f215d42a9069534d0d62b5ece2b 100644 GIT binary patch literal 315 zcmYL@%?-jZ424~)@>2?x7=lSSatT!%MUE7uaPo;In1K-(fel!J9TuHIDug1-K~XAB|H2Tgzy>V901UtgtiTFf!go_}^pg17 z`Oey{oW+*x$dR1Mg);?1J`IOfs;>czy$2T4D7%hY{51BE+8CzmS4Y< zl&VrnjnoEy3-%y_Gq`{&xPd!(fG2o?S*FwqtU=jlu{0mTJBMhRBMM|BE((dA(VCEr zCtYIdT|hbIXhvs^?XuoyQ4Y1U)RnS1^PxR5lb0M4wP0={H!WMNuf3F@YnTVgRV^&8gFd-6U6v{JUj47JQVV_`&cS^8c-n#tSA;aDT<^C|NwK>Ah7AO4o!FFj^- literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d9b2d9fecda57ec3d87573c0a90232d62762947c GIT binary patch literal 428 zcmY+9!A%1(5JjCtQ3%Qni3(_e7PzlgmSxRIgI63PAGvX%07M6=fC6ZM255m6s35%Y zt|Kw4x0?Ag{$t;UL-2TnBRs<^yu%4T;1j;!8-Cyy)~gV1;12HL0TLYH1>WEU`%U#Y z@3#C^$+kPPBFXd3-g8aEAXMw?R-`x<dAO=o%u~j^$e2a*;!x{A zBTlWk2$PwZm4etN#*_&WcWXivQNEnIM^v+1%(M%Bi3DR8M$F<9+b+Vg*4NLbbpK7X X!ae$goB8?J1;y0haj;0nKRgF7rM=iXrrTc~R-8eSTvq$G@?n)41ty=prdBj);) zauy-g(v&@6_r{|~_Bpbcs(#0VZCcgP|5!VSWYq=KeYQs=8x|#$Y1&C=|n66T`D8hDFUV4Sz^lX|wcAzXYy|^e*&mo*q;(Vz(1QFqO7~7Vag`0r3 zSg8g<&)zxsW4^|cmk`+Kpv)>&R>6>gv#o4{M$}zkMQBQ*TJ32Ary;uo<@Vio`Z literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1b90d3d2103d27cd7ccbeac1d7cc68db70237984 GIT binary patch literal 306 zcmX|*!41MN5Ck0(P=rWG3v|MlXJna^WlN`^@bJBoGR5uB%*~u_zU>%yz&QoXJbqN literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..25ac37833191986f3d68448b1a9217939ce03e8d GIT binary patch literal 316 zcmYL?%?-jZ3`SjA1VX4iF$7z1M zNfi<0w8Omz4Y+_SxPd!(fG2o?H^?%g4cLN3Vd)I>CEi}O$1@Zwv$Ki_w`Y8_nfJJC znOV42NUF@_WGYY`L%?8iO>a?D+37}iP!rS{1fR`H4-7}Mi2M|nuOU#6khN!hd%XVZ e8CRyiM|qn&tn^sViIc<14p9o)f1IzK&hP;<3uWd2 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1bc0a23c885de7f48115e6c10f529eaf3ee4ddd3 GIT binary patch literal 160 zcmX|(%L#x$3`FAxy!b1^qfOX?3yK&Svd8pb4VJ94dob`q7+$84QABE)xM#AEjX1f< zL!|OFuZ-^dmG6J$a6K+Rp#W6XXchy_!voAL;@rWk?3sC>07PW1>e!<(NzsrV>-KNX G$NK@JbTS(N literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..116bb25ea2df45c5f305b10c472a59aef3053b78 GIT binary patch literal 160 zcmY+7F%E-33`7^4nvN4ohRnqqX*KqnUL!X}`o< ze8gA$#9wp|UZ%89-5VT$y9ZfrJ(;*5A~LoFsb-K`xhMc+oG}~8dEM!`26LePR+;uo JgJgS(asa$zGC=?U literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..62d920f067f1e3479523d8f70c11b3fc52da3592 GIT binary patch literal 204 zcmX|*u?@md3`9*58XA&K(owPlU(qkVrHg-sJOop)1Vd0VS2#yWEIprfI@!L+AR=cO z*>B`d5_ysrd6N(Mk{{_BXDw~(K2e)1wS;xla_Zf4n!P{)sH!n21I-7M31(JNGIlqG e%M?(tW@EvW&9z3f8e&0Q(tKQrVf{j>+f#oPUqDO% literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1ad003441e08b915efb032e14cd40bfd86b0c7bb GIT binary patch literal 198 zcmZvWu?+%23gItokV~^dc{JkQgX*lU8;Y&@^ WR;3Z^t=3woUjA*Mo(5t+-+2S1i9Ra; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8ff24b7e3f89219404d11f501e46125b3e0a2e6a GIT binary patch literal 339 zcmY+9(FwvZ6h%|5SfmI};0A8s0^*0EK5A$nv|sYT6Pc-yFC21n zN$yJ)CO1)A*n@`?oZ$jjxWOGB@Prr46JwUJf;DU)9cxq@*8{7`RgVN!7x#g0R7>^V z*L`3yqLr({5MT;|@;49-Ui{CAl2Y3RQ`H@YDOvilt?A7q;nZJhDUE>)<>GMcztd`0 jB9S6KFq!dMu~GDQ+r~L5ii&Tvql}wP2zY)?YgGFNc}-~I literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d4c3d046cc5270c3b7bf967cb7d477c7d4d0c25a GIT binary patch literal 361 zcmYk1?@hx%3`ZT3w5a?k48ag=fcVtpbh1oNijpr#o`4mYfgKovA-Y6&AboeF5uDCWk z3b$EyU6B=qJ)^ESWl&g0^z4@t*Va8Fk|(oaFgo*Yf+Ni(tg~K}w-2Ed)%j#@&M7DF IO4Ir*XQBdbf&c&j literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..43ccdfd0e7506d509b9efd7408cd25428f8ad3fc GIT binary patch literal 354 zcmYL_(TxHj5Qb4#&zODC0&Kw!>|h^uj}St34T1PHZ+2iA*Mv=2#Px7B+yj1t=SlK0 z%n$Q3urpg@Ok+A`2N^DKg)g|l9lqfQexaQivxfs5p@RVHM(QZ5H8D-oL@3LRNFE$x z$bV^Xy?1sPNzI~`G_6SVo|0gPsQOmKpG2&uh^4P0zMtVFJ;p7UX)Lo3w!>Rf*ZB%f zdP?gttz9g!c`5dc(x^jv9&yB?O}N08NSL(O+SNG57*kBI=IJrzob>AYG#?_V8a|($ K5?)gNKjQ%n{%tV; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..213903d531c566b7eb22530f821240c45262676e GIT binary patch literal 354 zcmX|-!HvQ&5Je{tScEvhWy_$0?I4F_Ez7bJWZBx&+~{Ci*cNDk8t8!{wg>Z^gjjl> z%+L4e+b21SNG%P!g#=glg+I8#9Ukz6f2b;vPdLLDG~i)Z>$viEM~%ZUQ1WK4nmWts z(%iPjIcvI}wmzr^=kR*dg;_8Tr>b+Kz|@vWhq>nUhJTAvhOD-jwdK%gDyOOsB)@3p z2Th3e?JwHK$!MurjuV!Z literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4c2a67e16e489599a7019f5d4fa6a8bc7ab43014 GIT binary patch literal 358 zcmYL_&27Ul3`XTNjhg}vkPR|JH|RYFyMjO%R-sVniMMW$8L~r$=n|cxOZ4PE*={1> znc(M7{L$X+opX=w$TvWSPdLK`uJ8rl@B_clRL&jX1zw?rci66NI%EAr)EFaS+&r7* zE^xZMq^%bTz8gr_4W1-|x%XW{dDxi+^Mct-q)4k8X|R@h4LwR6D|(1O-NjPPZ4uuB z7H&`0a=loC=uPw=OU)?O>TC?esdco_^WUtGW!!nbVMr-y(*FgRR&&-e$F!dGiL{iR MS68K+jkgE+0~ZNzFaQ7m literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..efa77331edb3441926bc785bf1a855df25a90eb9 GIT binary patch literal 367 zcmYk2!A-<45JhJpzzVIFr3T8N1H>VTWsR&@vTPv^bE5-#pa`0v37Vh?F5!(AR#JkwG5$MriN?ukZ%%@ByFj1>dmWh}^+FJV1hH*bdg$dby?6oHJ#;xHfB3 zWKHdNI|kJlriJa<-j5Vj+$l^2X>((in+3&grs|rInAL0~az`7lUDWxX=z;FkS#9KW zclO9DvpJu%@Z@b=Yc|%SFH%=I(1z%kaF`{=Ks@(<8+OdOETxoM>fcS6y0%t*nto4B Qg{{XQ-=J1vZ9Tor4>AFAKmY&$ literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D6.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D6.lmp index b3cff0d2e82676ec9eb09a401387b5075b6f2de1..a099021e3bb07657515468ef5eb0b928878782ac 100644 GIT binary patch literal 367 zcmYL_%}oO_5JtTukSGX6lt2+QfjI2OGM2R~jmAM7=0+0~K@ll}9%z9cI4y6SRj~9t z^5<`U?EA0}A*{kPdx8q@@ByE2f-m@nANYm4E`$eogeNHQ2Aj3DHD7OuI!zN{UhmB6 zkXS?I*j>5D#Xjbo;xHnHy;(V$ N^B<^E*XGO5`~k_RalHTl literal 353 zcmY+A%?$z}5QW*OiP61i3zlFBUOg-lLI@;eh^JSACD?*3*n%zCf-Ts=`e1(&Nj@g? zc+3p!RIAE5lR!Xj>$K7SPDr zTC4M%cg8uRY3o%BBsdqNH#&_1;OM1Vgk}kJthFBFzffva2QO5|d}S2Ob#lnyu#B}W q;CTig>s*{8AcT}8NfqkgF-FP4?$bk@PgzRI@=o@G2G)z>(htuEpql7@cFg6M9{iU=cl=*#SemO&~BB2rwC9!WgEK+Wpg*5n&0y0l=Q ziq&L!T`ab#Cg@*?+xrOPQD;4vU6Ppe7?biIWqIPrHE#KYP7zaR2}S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8747ba893118223d79f125c1d9d211aa7b42d474 GIT binary patch literal 337 zcmY+9!41MN3`JcUBvg9ng%KEm4LES5NKq6eC`uG@@R<=9gC&@O6&QgH7$AJNRRxw_ z6#v-YPDdRPDLUZPAcHHofjfABCwPH3_yAQAZNL`nz#ga-&rwvv>|#neCx}I@nfo-x zBFP2~lcHqIID}*IvBqS^z=4=VJU<-C&3ASJjHX-q46GR_; zf%lU6Nk<(KDca%GU<7Ay0atJXcklpD@B(kJs)*KL1GYddbxZ5xF%4D0WH F!VRuWZQK9= literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DC.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DC.lmp index ce8fc1b10317b6c9eee4a2694398c756773b5ddb..5369d14fe674aaa8fdbc09ba4a5a1a7e644aa96c 100644 GIT binary patch literal 330 zcmY+9%?-jZ4250FfgeE`fEn0;J4cEXP!vm%L&d=ZumeLd1RHSW$_5O)p@&Umrbq|3maHH9jb2aXhn%BP2nv2*WmgLjOrwe pxPBH(jMyoLrVlG&mWzQU342Rw_ddYEO4ei#^FA={A+Y{?^an}SX~h5l literal 296 zcmZ9HJqiLb5QRsuSab_}FJx(o6iWuegkbS%kKh%&f~~Estyl009zj^&gjE(Fe31Ej zGucQlt{sV_k|Q~hGr5o}xsf}0kSBSOH|ZB5TOu8P8f66}Y!jnNkeA;qys; zGBwpi>G4{h~DJ#UXYPH6kpgNn(u!H6AGWT!^3(s;{B7~zz@~s=T g?eiRD*+=um4kvk@TkTRGQktFL%nI|~f|f7-03_mDV*mgE literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e4306725d054ff543e83cf9d8c429f4a824989fd GIT binary patch literal 349 zcmZvW!41MN3`K)l1Og-uTv&k(7yyZDtF%;6+?qrjDxVpHF&Kj}Sb-I|hVKFw#8;oK zzNWF4W@U`Y%np^n8C<{>+`t_?z!OYH#;m~xY{4E>z^vq7l6vQzXYxdR41t+L-w(cY zwzRfxn&yC~Iz*Ad7q%`+#Ht5h?_Jwj-?eRY9Ak*_bB_+zL#UlrBxSis0XNsqKf<2A yBD_!3=qX!>)DEApG3iVd?7eQxK}9|jAtFo;^m&cVu!~+ep5o7dprr}sYSIf&?{6aj literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..768f04cdf6a06d67d1085e87beaea449839ae3b2 GIT binary patch literal 322 zcmXw!(Fp=E5JYpQpq_pRwqOS~;b+1UmXJuu;n!jbmS79EUs>8hBjPG?}@G#pn{RxjLX;W!r{BP+)AR6E2tHlG0X) lA~QK3Yrw=rmY7?RJ=t-zA?UxlK_q81h*4|w|Ei1H_zT7ktpY%iO!Na}x za(R=iOm1TB;RqfsaD^M(;Q>#0!5coXOpIB>2DY$+bgHqM*iUqmx3jvgb%w81EA`%= z`;7u2>Z}WcfhaMmu^}3~_|Zm1Xwe#T)dPZCvb2+p>BTHz>(4C+jfM>2Vo}V$+s?M4 iM9TQUWWj5th(&%o*49c{I=<0NGEUYZp!qeav6?S?Gic-h literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..25ac37833191986f3d68448b1a9217939ce03e8d GIT binary patch literal 316 zcmYL?%?-jZ3`SjA1VX4iF$7z1M zNfi<0w8Omz4Y+_SxPd!(fG2o?H^?%g4cLN3Vd)I>CEi}O$1@Zwv$Ki_w`Y8_nfJJC znOV42NUF@_WGYY`L%?8iO>a?D+37}iP!rS{1fR`H4-7}Mi2M|nuOU#6khN!hd%XVZ e8CRyiM|qn&tn^sViIc<14p9o)f1IzK&hP;<3uWd2 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..045f1205788008248f419dcd1b60ccebe161b092 GIT binary patch literal 281 zcmYL@;R(V(424s%+Csq}uH;|gj-!Uq)1rt%Cg=*T;0mtb4zAz|4j|{d_F5l&A-u~= zZbcPEZNL`nz!h}h2JYYip5O)E-~+y(%!t;2=GrU7#-3CIRjNh?H`ZiuFKI`^SZ9Fq zqv2c){S7M(BEFd-7Fn)`#es_9oUm#+o9-}v(1_RenAXOZv#{qqjC`r;h53;B3r6GM MBF7ZAYbdf6+`25o7={)?rEaqJ3SPl0cm=QE6}*C15b8^R3_Oy2$(NaZ zsDsA=j&OntT;T?Hc)$~0@P-e3VONAumNvz>smQ%*Pa2D@*`PURX@{k4MI=k3w4pZB zOfM-$_9r1_RdKpS$V>#{YKdpF#JT?s_a?;Ve}k#Vyur_Wy&})Ac)>9j(qy6N@Vn5i Jg8NQ%jEBlIN-s8Dbnnv=x%bY+8}d6C7-5 zIPaYwMJ{ns*bqX`?WHIzI~)on@30g)zwS_lW!{mqqBwMAhZgE`EiS6?<2ZDs(cgF+ c*6T~-B$7gmA=}m*D7N~ml(G*kjb_R7A3FzUI{*Lx literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4110be87cca72285805c2fe8de6bb4a935b4c9e3 GIT binary patch literal 134 zcmZQ$;9&p(1t2yAVkaOD2I3STE(Kx+o-7pbA0!YR9}^!R9}^Rkn3V+<2#!xoOiYT8 d4v&Wk0OjK2lj7kjVv;~Ak`m)#T98fs4*+roDG2}o literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1ad003441e08b915efb032e14cd40bfd86b0c7bb GIT binary patch literal 198 zcmZvWu?+%23gItokV~^dc{JkQgX*lU8;Y&@^ WR;3Z^t=3woUjA*Mo(5t+-+2S1i9Ra; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7ad8fbd85c49693a507feb9850c77fadf600486f GIT binary patch literal 222 zcmYL?Q3?Vv3`7fRS#-UTpZ*Gl5JK6)vcH4>{(1$k;1N86H`o)cld3rI%5>66_o+{z z138itaWat$xsn^XlLvW{7nw<3A++Q*P^K^&K>p4>vJ9AN8`Glt$h2d{!lb_Kh+{0j lpj2uoHbg7!fU}#Kh}icouA*w*=3D+w)yg`bcd_fEu+@L| zTta^MVE_M^nV*}7S#WK@C)k2L_yI?70>9u4F5n89Q3wmL1TWwfyn%P{0lvTv9KbgS zv;0pt543feS=;v|AX8Q0HCxU@0Iwn}H4ruPG3y>9zLncy_ia4RnPAEz`HUy!Q46e) zy2^SsDbnr{h$yq*q%ZN2#1JJ~*8+)1h=t3Ux-@CdQT*H#4;T-M@!OHBLG!;aDJ7~i W6mg=Ojw6>pFnLB%5ii#~4Xy9c4TmxS literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..474c6333291dc66f66c355d5f698dca4dedff0ab GIT binary patch literal 279 zcmYL^(Fp=E5JXqh^F9u3%3t9^IF}{SLlK3o;99T+Td)NiumxMN06*j8lIXw-!?3eU zR@6|`8f?H8T)+UX;0EsC0iNIm-rxhK6QU)cnT`t4n4@Z-Mzxic#y1B%O8OGC#s`gma&9+X=RnlhK@neSg5je4*-vd6)g!3Gd;n3RAt0 IBX#-77m@{5{{R30 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d7588a5c2344c7f21c0cb1998f1dc95de1ef34ea GIT binary patch literal 331 zcmY+8-3dZ5425I;!GC;k21jrLAAG!}gc4G?C_ZHcS8xSaZ~-@P1!r)E>q$|;!dIGe zlGChcNkoD6xCIzEgA2HV8@Pi9c!C$89?=?Xz!vO4nA_j!To4s)ixz3kst_f`lsM<| z5t_tJ#7SQvvnZ>|Z^TpcC%Ow`Gi1f;_NH)Ji&@#H2_HtahM7~1qXh)76Q>9VElUq- vgfWFRj=sbYg0C|kA+3~?YXfKpvk5#_Ji5>~L(ddOu2aE-W>5w0yjI;Cli_7# literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a89fbd14f0166014682493b6875f57f5563ec73d GIT binary patch literal 351 zcmYL_$qm9l3`NZ{fY|AP9%z9BCzJt=tWl5x+;A84K^c@m6*R#Sp2HUD#n%55e@~_| z6OkY*-UVbh!5J=ag&W-A0mFvK92T&IH7JCZ`ST2Ivvl+(&{PMrNwYSjE}>&qXo)=L z13xF!WEQ#@F=d<)BaYOk&}{c+oq<`5G4JfKt6XQay3y@p6tS$by58`}jhgj(?_ruh xs%}eEk4P!I_#c5ttm6OkT+>7z8tYMgy{I|Y@xPnIROk9ti+9Jy(a(H;#|wBIXCMFo literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..29f11285fcef78a38f943c8fc4386da839236857 GIT binary patch literal 294 zcmY+8!3jb!42CO+c#z)Q#}#@gr6dp%d+OB{T)`c@dv^y{a0Lg@Kjl5220my$l0S_h z2CoB1z`zNd!3A8w4cx&4Ji!aBS0U^{*!919yC_6C6A@eQLnIjDQZmm1Ju#Oolc)?) zsnj9jl9?bdv)%MwRXxz3+^qTL&mbMgpx>8fYNo>9bZcgYUZ-=p5-UnZ3RYMJoe0kp I%MY;f0b(9sH2?qr literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0419.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0419.lmp index 42221bbfea9effcc77612a930cda439bc4a66744..936a3c5183a97eb9159075a3ed0fa57ac8166c62 100644 GIT binary patch literal 394 zcmZ9I!EFLD5JgQ`v&n`75oM$dE;+JUjYgBT1j_~KrvW62pbXkb5osb#Wb?-cgz}~5 z!}s{lj2Gc0gb>3UPbGVDASZGrU*wzokYBQ#gz!pM}G{$EjrA^ij7~>pR zi%LheiAH$va<{9i%am RcpkrGpmzQzbyI>b@qb?#cQ*h4 literal 331 zcmYk1!3n}Z5Jfj3D#RST+kz!nfX9R|48tyj%|)0BY{3?6!5%EZ4lKYDJjFkojrie( zWp@70-<@lm=>!;@!3A8w4cx&4Ji!aR!3WfZb9-f{>LmY8~| z3wcm2k~|0^-b>g0Hs(m8F4{(=>JheDt48A9M)*w+cZ4Uc%q^nKj&g%55wWWRt9Hh= mDK$b03HcC`*D5lzSj(kiOTzFl4>>UQnpALnRu%_KR#s?YR@Q$85F-U55InI#QaczZ8k&@q6$qB)$;t`_azH8q af!h8v00km}GT}fRJn@JEQ*iLaXBGf+E+AI` delta 89 zcmbQoG>>UQnp9wXRu%_KR#s?YR@Q$85F-U55IC_xQacbR8k&@q1)~2m@BkS=4oC$^ X8(1I`C=(9EffJ7?Fa-uqd}aXvaYP_V 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 0000000000000000000000000000000000000000..4f91eca44bab253cafdd8505fbfc0b8525fa6318 GIT binary patch literal 211 zcmd;P;Adc9U}i7@lCD4;2E^$=Tmi(LKs*bG7X$HnAl?nc$AOrcCkqAq2MHvmBqb#! z#>XcmWo3Z{LgN#YVqzjAV_*V-k%@`%F+d0t2#$;g>PSjL2*e=F{m;yjl@%NhG>m~A YEE)=9M@NJO0~LbBf%;=$;!wT+0lOwbod5s; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ce11df8fd12460865e59e0e158837c98328e6fc3 GIT binary patch literal 391 zcmX|+QBDFe5QYov0sbzHZ5t|EHCrmt1ljbD|iG?;UzqTcc|Y~!@v1v zXZ}v7?Y-MN=Q{U9e1QV5@D3OFfKT{>Z}@@n$himD!6WS93~#WRsHv`d;!wy|GqQrn z7dPY?C9CF3TNz5peAKfQWl9MnCzk4z1|OsMA+_554euAKl49`xZbx}i?dPpKMBD1_ zRQLX*5+n^6=8ZUAydHuLTe9n!q>j0t=)sd;y~&1-X7RIbR69nBaFv`T#$;n_zvfJl d<57?odxcrWho%^#S<_qg+sm4+Pj6#esJ~Bkd=&ry literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8b4153d2d94406c60d254ec9189bd39feeffb9a9 GIT binary patch literal 391 zcmX|+!A%1(5JkOYHwj6IP;#LR`rraY(O}t;Wox<2fom=)ffgu%4rqW9D1sWy8wcgD z-e~^J*t6cat#ht-kHi-!@CGM%hY$FKFZhNZ_=T=>?hfwZ0bbzF*O6J4QR@jshg`8;BDFZ%6??Y;SSg1;h!T;NNYlmpFJ+l%djTrM2 zTe}N(ZrQ6ok<=?{qB~E1sdXD_{#@jM&7r8LB(q7hdd3xK_Lj41a(R`Qy literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5af3a37a9b0af6c2e4317177c3541912843b1253 GIT binary patch literal 395 zcmX|+?M=fl5Qd#5RVZ!g2i<`!m;ngUVcC+gl|T4L7l091fe~1N5!it(_-CGTB;M$; z?%unzb4PPB#w^Vp=MyA2!yCNA2YkX8e8Ug?!mcsq25#XIUf>lDZB~`tl5jf@0KuV0N&i|8{fD1rleMqRybQIOgmni|{8giuXYuDD458 h_eI80kQLpd+v`lSuF89_X1`UB?W)wN>ucw%@&{+3f6V{@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7f26a9ca3a38882d74d401250c9d0fa3b75ade33 GIT binary patch literal 409 zcmX|-!A%1(5JkNqo4_Un6zGC3r~o#K2Fs2tTYH)VS1vSwL<^Ka6SP1Pbb)!}mH4Y? z&3t>t^_iOLu4kPJ(RNK# z5bpF literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7d1a1f1a93414aaaef6563200a9c8c8f115d0537 GIT binary patch literal 404 zcmX|--%SHC42N@EOaD<&Z;5Wf429}2Q6gChCmtfi1U&NC6_|n@Sb-f_B76=NK7Bs> z7spOAxWPHsy953aGQ7eYoZtgK;S0Xu2P*73=k{<5BfP*n-1Nn)Zs+(Z6Kxhm86#e; zh!dukEjG3?<(&A)FRw^d6(K20wY$KVIb}XZ?}IkgU6VhRA{v7~OYD3|<(aY&ZKu`T zYmp#2Sr2QrwBIpUkM*pSJA&GC%%dmzSGrv*GmWL@t>4gQig1RMBu2HqO>T2V#!)aY fb`h&)ddWUCi!qvfzRs4$cFks{w|B5{e^!41n>B(& literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4285e76803c15df57805a6a98c38b2ea8d73e392 GIT binary patch literal 411 zcmYL_K~BRk5Jg=mBrR=KRdm5QxCRTVC~_=Yacv?NvtWWFE=$)-Yo(=O@+qM=tt1qjtvhzhD1hwilHTAVcr{AHSCXK&1fP|R< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5cd5d722687d4b59836e65fc6d3e00714967165c GIT binary patch literal 608 zcmZvZJx;?g7>1p;w53$)!pIDF=p8_@LgZSuY9)#~_yCBJxd&im;sl5*zztZKnUOd_ zcs}Qc1y_&ze((1>cAN{fQ8Mn~0gmtp&+rOw@Bv@&16iijIb6aPZlH!cIKmUWz&m`x zH)Ipmz!hxa8rIV&qg|aaH#KUxK-CQN{1ja=f>g6J=`?j+@uQxuDMJVtRiM>Q2w3l} zbs^Q+Dn=8$vwgWd9B4Z)Sw+@36B>$C&toi{EL+TC)QDDbroy8BoK5fWCs9VL@N&bB zRb{*n^1#m9v6V5#8o!s*N>1-gSr&!Xy0{&@oJ@)_jh;o7vUMq{d!8uWH3m=1iZm5t zu8T+`AD@@Jblkkl$(uPMa_#?EDc`-n+`Odv4NyidU#$LYs4!U8(@P7}Zt1J0Tlxh? CO~A?k literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..928b2e007290e1b085cd9c48c91426aeb6696325 GIT binary patch literal 391 zcmZvW%?-jZ3`PwtKN1286+5s43vfb&P(=}`s#ZPujF^Ev7=tm`f+fmlr@dk6Md|bB zxEbX{l+qFB6|~?1p5O)E-~+yZMnpTX2M2HhHMoQMjECx`3tXE@s>Q9FEScL7Zq7OH z0+gEIio#lBj14f9=yX3I zjyY+a_3V8)6 BdkFvl literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..01af203e1fcd16cd2fea04405df1d018c7cba8a3 GIT binary patch literal 391 zcmX|*+YQ1n3`Gr;w|Gy$94x>WB7`c68Wgqam%kA+Fa$%e1XHjD3zTc8VCh8G@r{!u zZHOqNJx~G{8;y=-qjjGs&)03iH*{bwmQSqmIz)UadQh7zI F`2v{jd$|Ar literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b83e585b7a9e7f37849c9d898f71a950a992f5c2 GIT binary patch literal 395 zcmYL^%?-jZ3`PUA1%wdgX9F#=041zRu%Yj6mk9T1jYXXtqU+&DKiq05b6Xum@|8(8ojSuS;Y1i=$iCl)1K(wl9}9rt&Hm8G;UV# zm50-;?C$h*8Sr#WULU_p=Z}~Jv1^c=R~Y}Fz4EDFx{79gpOa8UM#Bp OsXAaUiqeuBwBiRB6Mh2# literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..599f085c81e7b448b3cd32b59a5f9fcc8e62de6f GIT binary patch literal 400 zcmX|-%?-jZ3`Si_RU}jaWeTR?%CRAoC~BmrrKb$QjTP8}E!cu77y^aQ?vJGxB`;qc zt6M6GD5VqD3+TZeJi!aR!3TW759|}712}>j1n>ZP9;S-f8r#lu_1MK_5kl`=V~nxJ zLB(XjVfN0{wbn{0?ck{l!QMj0Q4XWJQD56&EDp8xyiEG+hl3jKSSLGfuJ}t?w1m?Q zjuPUFO8SmTwo;WOX(dDG2D-?Qoh@dVt@MhV#R%Gu+2O53euimBIZT_Pm7kP#xQnc$ I_!+7A2U*pBr~m)} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e9683092d70676dd091b48ff172b702a2abb7561 GIT binary patch literal 178 zcmYj~%L#x$3`FAxJo;bis%gTU!2$xf zzzrTim8QHjs`74oKFqJOs{}9J2g`weF`zH%*g3~3A_2PWp>-36H_NG9b-3w|KQYD= KvTpN7w!a@r8#r|U literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b7966584b2b751992aecbd96e71723be22a989db GIT binary patch literal 178 zcmZ9F%?X4+3`XM*c+_26un3#*vND7)BQkpXO0W#e*e1u%!IKYO4ljW;(u+tf1LsI5 zy3>Q6^iS&+Z&KAUS@7n4$gDsrKY+rib53u}0&DSQHO!`5s>Lgo%sXKCq~Ku literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6c93f82a06e63de86648e3e3652ff4c780d3a46b GIT binary patch literal 216 zcmd;L5Mp3pU}i7?lIB3{0L0-yoCm}$Ks*bGHv;hqAifC1j7(WT@SlMtD=RV?#1P8L z3QGiuAp@{*P<&QoOmt*)bPO28164B$f>ecuhlYlRgFs|t3|urgG8`xl77Yif1(^)A YB03%l5)%`X@K^|R5YR%P6%Ypk05r)&sQ>@~ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d4842663efb90b349696d8b9ddd877b8a76b817f GIT binary patch literal 429 zcmZXO%S{7842EYR50MDvz=bksf&$R8nxL^Xn$ao;E7SljAkhFfil7LJppI-ldpC#( zOW)Z3{TSbbO)z@|fgbko3h(d+37tJ*;vvLb&NyNTLU zCH<=uW|j?m{!A=vmldvvYD%Y1CA+Fsik;*KSIJVc2$kNn=32FoRX29HvSYN?!q^Vw RV$FXH_SI4yW=r1Dh9hzYiAn$f literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7c0598de601a4598377a4be3e937672dc7bb0460 GIT binary patch literal 401 zcmZXQ&20if421`lpX88)aG{EH!GZIl)x@zSYep-CEK&nX6I4MR6p5me z_V8>!d%Q@?lv0y6_`iX7@BvQX3@+dke1T?^(h9tQHFyOFa0Jr_yNzM;XjV$m_-gI< z`=NO<%LrCt(W1TCFkYaKi82W>imQvGXEUkRk%&O7eZPa6CQ!4P&+1?xzY`;qTeI05 z8DTD7J;ksV<#QKV;0I$^wCKAFO=E-5kh~9#ewuxOKYt;Tuw2GODe3`B65rOJg{j+Z dho^BSy=r(E)?w~K!$q{#8aGk(eVTt~`v(4FfX)B_ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d484b703eec82342c0204723f320293ce9e851a7 GIT binary patch literal 423 zcmYk2(MeO;e!~*=V06+Zm%N}gO7R(Tyj~*h@ zJ0;Kd#m;rO2_f|1fp3B*c!4+gfKT{>Z|Ei=+`=8)!vgm346pDG^V2%6Hall4#mtJZ zYtxHbO|0nSUPKN@BZp#Ys--BVzw#0_<6MLtE_A~$J(SfAE2)}?&T8H4@P*Um)DwmZ zblmQ0lB15|dNL<_TUVKbCoetRPH1^kS7Yij(`@TzT=M4@(Opl;daR8pyYik)nT55E q(Qk2=7=Z~yvJ7|l=!pqY8AaCc7%4F#NzwcGeJ-M8@VEB=DSrSS`G~Oq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f823b5a58e142115549a077d81287f7d13240aab GIT binary patch literal 423 zcmYk2%}oO_5QQD`LjVC%sDLgg11XB4$X1+jtVtNr02dnI!ksHc&;v!#1b6ezvMaFk zt=>LA+cUEWHz9;cxaXVT5uV`{-r)m2;S0Xud=$bh+`$qK@B}aL2J=%JR-0WQrKoBV zRGVI!sc5MW2N5~;jvR|tt+kYjGr9I7Rh9oDsNT!fB`ejc?oG{dL0!419vjbmTY4{w zdnc5$wRJ{&aOJygG{@Z8dWfzv<+X5T7I*tUdl?6NyEoemcf^!EJ?^UUaUPWzo^hM*!{+&yz&cx{oeN^6F7=Kxi_D#^*%IgbLP zDN$K@k&T=sXXsnXwz85CMYsz})SR7#;$OgaAaJ2y^oP;U4?(;wnSjSm0- literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..021a9bdd9b25911fd8efd81d1a49ecb71ef8d394 GIT binary patch literal 436 zcmYk2K}thG42GxLYDHAEcnVM94FoBr%)pQ^q&2v7?b5YN58%QxcnWXfEqs0%`_zH& zk^J+&WRi=tNGVOz4c`Ly@CeWF3h(d%pYR2jla#LD8rJXtPw)b7FhBJ13X!o7_9?ykA|YIH9vFYTqX{;9Y5S2bUcC32z9kQOvl+FN5H&N}Db qaldCVPhlR$5vkI<#vTgeB2^@c^v#sQyqI#l>}Pk};-Jv*f3M$KO^)#Z literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dc65476c00141d422acc3cbc1e3e0632a189c0c2 GIT binary patch literal 436 zcmYk2ZAt?%5Qej@r9$bS1ux+#Jc1x)DT%}h$d4(j)XwZ{aDtghyDP*$*`E zER%QMY~D#5+7QAr-1ANF3h(d<7x;p2_<=**tk-p3{c1xg#mtIO z^;g?kO|0n4K}3!y&BD#D%dwc6YAK2y+FG9uoK-WVB2<(7_*}F4j+Io+?%n;k}31B_K_r` oOpzFX{32O~yZ+`)3`!%@z&^Z8N{op$daCj5=;GkF{r`9U1yEp(TmS$7 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6e2ff4b2a54606e00d69cce1f653d84fa4c55bb9 GIT binary patch literal 426 zcmYk2OHRZv3_vsd29RI`r{ENG1_T<7P@+aoT~oZ6Jxlg1S+nL4oPt|$2vlA&R3g%o z+*doca~)Qpo?A$;gBN&%5BP*H_=X?2T7+-|Yq$f0XLyBoI9mFArh^MYDP~rr$!T%v zZem5B9z|rtHYH;*HPuqILxoi>Q!_*nqCc0lhVETbwd#)Db0J!uBKsk0%fu$Zo}4x7 zQRWM_nW)pjeNz)!qb*U_^W~dd=LuBdxDIvBUH7qRT0CU!hr_*%DbG`xj!1sTI5$d6 m&+sBy_Kny(Cf37cTrEWM9XPzh2YkW-zTg{vU@=K)4I6j>fj7uEeywA^byqbDY$SBdOZQ$? zOTm&3uURsXaF$}FS!+Y{9aZrZmW#*ZHU_jV?Ig$ Ge$WZ#gLpUq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c002021f028c84f6b3b6f3f8028d48b8c766fad0 GIT binary patch literal 377 zcmZ9IQEI|K5QaxxpQKh0yoYz_Lmx{+SeKa+vWTU7hu*tZoHLy>_tRM^aS$)+ViFK(G_7HT z;n(ywsHP6dnjy?B+D0!XoJPEix23gORI6oJqlt+`lK8^kW@)r_Ghg32->oz1Fm(5W FegXRSc<2BC literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6c8eb58d16e7588702dd004e2ac9fe95d34e446f GIT binary patch literal 386 zcmZ9IQAz_b5QbAVzErJBZ{R7sL0<$hEHTW$c0;i+kG}U1Jw|hTE_<&FNf^WE*h4286@C0jkhd8&tHO6Z*5miSAT4TI1 z>qMj!R8F|@VnHMKO#GJM&hHpA>01p$t@RCicJGHzH|S=wMb9GV)7osokJO3^m#7yX zb@wbsmyWK}>1dZp;bWFjull2ku60H6-Zu!DcFK77=bfqM&MYU(^7t(^i|1= zA z4yLW(c4i^s_F_G%dXc(?$hHykQB4y%3+cq;$^ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2d61499d4c7ed796dc43b1065218963f3be1b487 GIT binary patch literal 325 zcmXYsy$u2}422Ds;~GFn3_wp!OHavEXn%@m0)wvm~G>LUzuz9f9h!8>d7aKiAT wKbKzCTN?rg&SObykkRpwb;IHOsCY0~@?f3IF0lK_`KUI~(-uQ$QKZ52A1;_;-~a#s literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a58338450da5b20e96c318e47d3afa2ab0d77867 GIT binary patch literal 382 zcmZvX(FwvZ6h)&gN>LE}cLhgq1W`%|A%W0P6f%G~ghM!lL%4z~xPl+`ytMiuUN}v9 zbKgz7R0}2AK?`TNz!h$AhX*|21@nl>-YcYgo? literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..13283798fee7fcc30cf9efa77eb6553cd6182dcd GIT binary patch literal 322 zcmXw!-3bCQ5QKB*fqLG9U<-C&6Fw#^VF`(Z9QU+Xf+g63Em(pr*n%xsfSeOe7QTcT zCO@-PgHq}jP_V2uvK(>R6CKb5MbH8z&;vElf_YAm*yve1lijh` zW@C&g%#L#pC+Oe`H@L$Cp74Szirn~XeyU9 mO&5ZM5F>6HlXA3<63Mx}5k)+ovpJ?B_7WNYZRGdscx>L*(oM^**FrHQP-g+Mb m8u?S7m`808*2?Zg^S#SnZnO^1XxUnI%;x~-&n&n8BYgqh?_SXW literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c1e878431e7f78e48f368dfcaf543374d5a28834 GIT binary patch literal 306 zcmYL@$!)_h5Jjmaa3U*`RfAi}F&9~22E-6xDCESGJ8%i^ASI-QRFNi9gy}~iKt_0j z`Lld+G?Ou=HZSB?c!L$raDgj)!WVqQ5B$OnrplNj3{5JL`v4vez#OWq$##WPtqFAr`lw^5N4r3c=n2E-TiB zkRSX6bquEvLKj}hukZ#HF7N@LaD^Lu!8hEY??QNjXEuwDRZ;PJxA!{9 zG%4Nop*6D11$pgzvJH&X6eTvT8`)AJYU{%zwU}x47LyBdHjAuZvI{2{#3lw7oNcN* tnw^tPHD}Ga6!f)e)naM}}1Py;1U0v*r-Jx~N@)H7jOkPa0d_Y1TXLgn?k8AXiAn!b%n2U=;kwYfsFLih4jv7O;E)I zimN(Xrtbn&QY&VAWRA`nJ333|0iCn-(+AJwMM+F8n?-)_AA9qKG6ndl(al9F{ebCI4X*p8_s^@BUvcv16qV6w74I literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ebd976cf4245d3d35a4ef7c0efb9160064093179 GIT binary patch literal 323 zcmYL^%MHRX42Dx)rMxPbfe{#iBbTTuY2>IOfs;>czy$2T4D7%hY{51BE+8CzmS4Y< zlxn4v>Z>jM4(ve$XK(>ma07Sn08j7&vrMTq*nqOnVrf2vcMj1sM-<3NToe*JqctHL zPrAg^RX{oAXhvs^?XuoyQ4Y1U)RnS1^PxR5lb0M4wP0={H!WMNuf3F@YnTVgS=>Nl*T_vC#DXr*k48ETm;V_`&cS^8c-n#tSA;aDT<^C|NwK>Ah7AO4o!D~4uq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..953c06aaaffbd0bb311788d44436a1c8f10c49a7 GIT binary patch literal 428 zcmY+9!D$0A5JhDh<2d+ca0O{0E#$r|LI@3vwd7!Q%q-#1k`rMt`J(+d1d{#v|tmUf>MxaDfl_gfIApANYmk!nr*>z#}|CfD^pJ8(d(! zDz?VWnp1>my&=jeSiIU=ETQWX+48<7!S@+?Tu>Y&hB#$hlbCAk?n+5&A#IjK%)DB% zE2X30hgzJ4K{cu7j95GR5LqdiTNQjt!j7SNcu|d6RhnRr2+%j7$IL%7?Iz4)ZTw_P a^VxH%r otwb~EM9~YFo;yVOhd_{o@h8crog~j%4sN3O?m|EPQJBB#7dR=6h5!Hn literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1818a2a8996853f4c8bd8d93823679aea8e4ed58 GIT binary patch literal 307 zcmX|*!41MN3`J8~P=%nB6_|u8#}Wn0YAdU#TzqB)#$XASUC?LJirsYz#DwP7ohI;-~h@((~7GS=O8lRh|9I=D9lXlIE^h4F*Sm* z*r*C)rrQxyf0^V+0c;;UH6>Zp)GTWiSYPNv9G3%m2mMZ^R czQsdnGMkm`P1Bks%s~f*fOZbj_oglW0GQZfH~;_u literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c35d4deb70f50c00abfaa6acb571ab3c83fcfd91 GIT binary patch literal 307 zcmYL?!41MN3`J8~P=%nB6_|u8#}Wn0YAXv=EWm%-2{7EJ8*HWmc(@GKK`aZDkuYto{NkLQ|5fRgc`Or34HbOEZ!BpX=|; caYEHjC(TmLY=XsGT$qFoQ3BdYNW0?~zpce$6951J literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f04ae0a04e111b2459e6e5bbfbbbbcd2b80fef94 GIT binary patch literal 306 zcmX|*!41MN5Ck0(P=rWG3v|MlXJna^WlN`^@bJBoGR5uB%*~u_zU>%yz&Qk<6}tx literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4c1dd499245cc7381856a91d9bb49d5837612261 GIT binary patch literal 316 zcmYL?!41MN3`G+t0wL6%7=kUhax775S*>Ih%Ecov1Vbt{A&vLzy> zS|DAe%4ZdZq8I`evuk>dEJ8*%x}zwgPaxQ?FD)>fR3q|p+pNrp-^_S2 b|1HYK%;BWPT27oCPIibA(Ej7>>{RIkFKK1t literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4b50169ed6dfc7d51bb89f75d3073cdc96c71df6 GIT binary patch literal 160 zcmX|(%L#x$3`FAxy!b1^qfOX?3yK&Svd8pb4VJ94dob`q7+$84QA7%vxM#AEjX1f< zL!|OFuZ-^dmG6J$a6K+Rp#W6XXchy_!voAL;@rWk?3sC>07PW1>e!<(NzsrV>-KNX G$NK@HrZN}+ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..511aaccb1b63a16d987b17de80463ac542128844 GIT binary patch literal 160 zcmY+7F%E-33`7^4nvN4ohRnqqX*KqnR}}X}`o< ze8gA$#9wp|UZ%89-5VT$y9ZfrJ(;*5A~LoFsb-K`xhMc+oG}~8dEM!`26LePR+;uo JgJgS(asaxOGClwR literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a1a54498ef219d44e2ce3cdbc81256bc0ae76763 GIT binary patch literal 204 zcmX|*u?@mN3`LzwDjLWpbd=eFQ*^~y`uHm3AurKlK9>4M0f% literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9da5a4b0cc6a5238c41a88902b110b56c429c7d7 GIT binary patch literal 198 zcmd;L;Aa2<10XgBVh11&0pbiGt_I>hAYKH-+kkjK5Hm7m0l|L;maMGEWDtWtD=RD! zBnAgyv7q>@==hlU`1qKZ7@+ijMm~^yaC~B7Vp4o`csxP~C?6l66c1JfG7V^KOcF?0 UQer$vCsrGP)&p$-8Vhj_0HR4gC;$Ke literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cf2be1ed35bb6daedde4c686a5fed94eed208d34 GIT binary patch literal 339 zcmY+9;R(Vp5Jpq2SfmI};0A8s0^$!#J!)v6w7=xQ6>!?MC?Dn%vq@FYh_chYaE)rA z&bhi589}tPWi<#wjwr@Lv~uD`I|`a+otUd02;7py-{?&rW)ZvoY(~={WN0py#QJwz lZ3{{y4-bqMyjHSM^zW99wUXy0-|&-!lTB5T`88cb`40_8YTf_< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0f8f619287d03d9724771d9dcad16fc74afb8433 GIT binary patch literal 361 zcmYk1?@hx%3`Z|CX;Jx8Iz)%)28d52r;}xJQj~l_@&sL>Gjs=rUj-~&G43%=n8_EiW6IKm6OL9?}gnd>{VJPae5CbM~UZ}ys0 zR8?fS3K3CBF=oWg1N~!?q^Zwi*`G1*9u{{20N8YO1UhFY|jxs%RpU0iC5Yur(| zaoM&-Rup!Ox?Pt+aT(FEpC>J?J4R&7s(r6?`fdS7>T6hMxyZMVu@tTRWN!A9leeX5 GdFEf8*=~OT literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..06e6f36cfe457b8ce8fcadea1eaf28e3df2f5899 GIT binary patch literal 354 zcmYL_&20iP5JtVQ5QO#s1*8Q!NCzBtV_BB9i!56?&5aIHMw*}ril7H-$iciZf0mxd z^V#!x?5)`tV;Zw(c97u+zwieqIKu_5@DE*M%qQ&N3-%CT)k+;@xgw@%nh0gF7RiHS z4Ed4v)_Z4%k<`pID6KlA`w>Sh+Jp;iiG)detzC^{j4{RZY@Qxd&PlJXPxB#?s^R_F KDd8pM^%*w_>TNCn literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7e6bece27202841d6586ab28ec202d60b0a54d35 GIT binary patch literal 354 zcmX|-&5gn^5QQh3@FT>5y=)oV0UdBi*0L-sL6)sO&5aIdffi_i8t8!{wg>Y$$;Q&> z$-F#|p8Y8Y5vkez@21;J-R8wbJ zU7Fk0IA=}Q(>8n6;2d6Wx-bjI;Z${Q6qwpFX+PIoulTnpWyr@Gv$h->P32UzLGp`c ze$j+jKmM$3oQ#&5<$&?5YCRTJKa`MCmv0@z^?e8-hWH1nf8xFjWH6YhbOb# z2Tq^wY3D_P??=*IgC~h#9(E8lOt2t|#V_r{&L|V!& MtE*DZru9L70TStNEdT%j literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..725ec88567f697fb3ddfd457516c6ba7ee01c4f6 GIT binary patch literal 367 zcmYk2!A-<45Je}jzzVIFr3T8N1H>VTWsR&@vTPv^bE5-#pa`0v37Vh?F5!(AR#JkwG5$MriN?ukZ%%@ByFj1>dkAMDE}o9w5OpY&X`|dby?6oHJ#;xHfB3 zWKHdNI|kJlriJa<-j5Vj+$l^2X}B@V&4OY#Q*}*9%xX3gxucEOF6#VG^gws&tTuAG zJA34n*_=;Wc=9%`H5=>E7pbcpXhU>NILs1bAfEfbZFbDLETxoM>fcS6y0%t*nto4B Qg{{XQ-=J1vZ9Tor4=u)WJpcdz literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bc8e89d0368d86ccfe6792e194ee3c5fe554c77a GIT binary patch literal 367 zcmYL_(MG!wYPoz!$7n)?&W7BkMFxqK7rhe^&fl{moMGnp!jD>~`GGa<+PO VKs?P^21V51P(PY7ilzMjjXy7Uacuwq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c4af621f71f6d32e8a0eadf62412c97c67da3b0b GIT binary patch literal 337 zcmY+9!41MN3`JcUBvg9ng%KEm4LES5NKq6eC`uG@@R<=9gC&@O6&QgH7$AJNRRxw_ z6#v-YPDdRPRdm3qK?YZF19$KMPw)b7@BykK+JG(Cfjv+wo};LS*~OG{P7sS)GxuqX z%TFE=9y!%Rt7@4;f)>2>S@e$CoM&6zM-i9ICkwSz%tuiwT#Oxs9s|n)erC+I%&QmT vA@y2pWzH1Qhe_};1Z)`GP=SSYa6YE!VLX1oAjfLMd&6w4^Jsxl`TP49UNLFU literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9a275929ca20ac84919e4ca169f60cf4dffcb8e5 GIT binary patch literal 337 zcmY+9%?ScA5QS&m2(s>BFP2~lcHqIID}*IvBqS^z=4=VJU<-C&3ASJjHX-q46GR_; zf%lU6Nk<(KRkXvY!3fUa0yJ5Vb1 zq%YEa`h7m<)oq+}m3!ywp}-e>!wJst0~ff$4HgsUw(tf!*h4+nzZ&X=YDhVkl95Bb zRBiI3KIv!ASQCj7#B`QAwN!+Zk(PZlCmX4CB?{QF<9)rsEkHKv6734iN_zKo1l_5p=+nD;-b-=ViPf5FY!jnNkeA;qys; zGBwpil+g)q0|Z>b4cx&4Ji!aR!3TW7E+g8512_VgtJUP3Y8Xuv5dC1PRBbpWSwZ?B zri-m=+j`%nL7noIiE;y%W9)~~QdWp%)oP77L3K8nVF%0KW$xh;7M|s@LvOftiTFf!{`V%i1GW5Hr7K}TV0Vf&O{2hxmNxW_B@F2 wIZ>ge@j|3>*uuo5Jyo#xIxzcS9AsK6pCF+<= a$i#A%-xXwHImd5GesjpZe}p|{{MiT9AzPUM literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d4842663efb90b349696d8b9ddd877b8a76b817f GIT binary patch literal 429 zcmZXO%S{7842EYR50MDvz=bksf&$R8nxL^Xn$ao;E7SljAkhFfil7LJppI-ldpC#( zOW)Z3{TSbbO)z@|fgbko3h(d+37tJ*;vvLb&NyNTLU zCH<=uW|j?m{!A=vmldvvYD%Y1CA+Fsik;*KSIJVc2$kNn=32FoRX29HvSYN?!q^Vw RV$FXH_SI4yW=r1Dh9hzYiAn$f literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ee745d123844f31b7d007979c64c0863bb69d086 GIT binary patch literal 339 zcmY+9+X=!z5Jfi{F-Q=szz*!d2E-3T9O9CNkbDlyLcT;NS{3xWfaU@PapdpoMj0%ocXAhXcfO4dp|>&`sLSTK26sT%%g3 zbFLmXGK6Sp%W5k&hGyE*!&!(!-yqeTd{tFK+YTy6> literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..599f085c81e7b448b3cd32b59a5f9fcc8e62de6f GIT binary patch literal 400 zcmX|-%?-jZ3`Si_RU}jaWeTR?%CRAoC~BmrrKb$QjTP8}E!cu77y^aQ?vJGxB`;qc zt6M6GD5VqD3+TZeJi!aR!3TW759|}712}>j1n>ZP9;S-f8r#lu_1MK_5kl`=V~nxJ zLB(XjVfN0{wbn{0?ck{l!QMj0Q4XWJQD56&EDp8xyiEG+hl3jKSSLGfuJ}t?w1m?Q zjuPUFO8SmTwo;WOX(dDG2D-?Qoh@dVt@MhV#R%Gu+2O53euimBIZT_Pm7kP#xQnc$ I_!+7A2U*pBr~m)} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1e219fbe55d7bc21c4c9fef95b800bb725d1a0d6 GIT binary patch literal 375 zcmZ9G!41MN3`J8>3PPYt92tTkn4nRWCc%lK0w*6hGXz601Vbl2~7`Jdae8P zU3)8P5vu`5Z~<3v19$KMPw)b7@Bw8Z#18Di0d(LDu0YKBS3~S{e`5aY})KhS}En^l!}u?)>598gl&dsx@yJThU5_06lpJ< zn%sKEoG)x0I!zAaK06zeq`k+9*`>deH)P27xUgDcY1bL!@v*3oCl}jgnUXww0iPyy A;Q#;t literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..97a973832f281d0825e4534597614c787c383e9b GIT binary patch literal 287 zcmZ9G;RymU429FXii)6uxQ`=Tsil+@ivE(!;1CYs5)R-3PT&eoP+uw@V&E%zkG!Ny z+7OYY9o{`Sfit*(E4YC>cz`E(0b__3U<>R@{;R4Naw$1yW;{itc>^=27()zxNMA2$ zh2WiYqo*m%a!Rb(evK23kH3d%Hx()3GTdrrBC&`sDrm05_`#v69!kVcVCaTQovu;+ P$!Zr{P`fmC?O1&S@z?hG2p499lu7uWFv2 zpY3eT#^^Z$3(nvQZr~0c;0a#f4eH969oT~d@ZbXG3n?ehY7r)4k@fN`Nv;}b-uGct z10{jl4nv|Cyg!L_HbOERk;ud_!_m1(3j|9aRP!|YdhOvNKAoCNZRucn_}6T)Fan%b z6ralg8D$Btb7trrlTi90)*h HGdFm=)KP>`6Im;_aaX32j5a=9;K literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6c93f82a06e63de86648e3e3652ff4c780d3a46b GIT binary patch literal 216 zcmd;L5Mp3pU}i7?lIB3{0L0-yoCm}$Ks*bGHv;hqAifC1j7(WT@SlMtD=RV?#1P8L z3QGiuAp@{*P<&QoOmt*)bPO28164B$f>ecuhlYlRgFs|t3|urgG8`xl77Yif1(^)A YB03%l5)%`X@K^|R5YR%P6%Ypk05r)&sQ>@~ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..10b50e6c43838f84ade7c78cc1eec9c4d1be9a4b GIT binary patch literal 280 zcmYj~F$w}f3`HZTvnaZkvb7RXNg!kxEK+#^FJNuGwTJK!-oZQAu0OMa8+gnA*`N6> zwG^`fTW|ygT)-9Fz#Vkp0iNIm-rxh82~nDQoj%Ro4_09Ml-&0!3NvUC(a??ij#>2l zGwy6PwU|NX$cK^=fxn`5=%`=LH5WToGYc%|xS%z9Q6<9l*J!1}d}4_PTH!K|Fj0=p Ia`Zm@7xKDUZ2$lO literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2e347979bd58eb226f7ded29d2bcfa48543fbabd GIT binary patch literal 532 zcmY+BF;2rk5JeZ1ga9IGk?1%ChoEv~twy6+u^KDYl!%r#Ej=w2Cx9DJ(9=?J0XTs9 zv-Ud5NYDB+`&aXAUxjt>dH|1L2cEzScmto{8~lRVQ3xw=39i8nxCM9M9_+v~cm?m^ z1AKuW@CU+i2w;W~9h@JNkTkj7R`cBSm2;1!tW# z&@jaqTPm6AYe!ER*=O@JvyI?JD;~q!h7a0}`;cNXL(z0MGONnao|TJirsYz&m`xH~hlxjxk4Y0;g~W0&BQ~dw7Irc!f9k zfG_v~vrPY^Q!O-2$RW-(DP^s&&WT;+kU=}|HB~Q0&4wn3>LSx@zQhWva&)snAH6N7dodt literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a72e03e68234b2c50601b078f4e4005c2df99d2d GIT binary patch literal 369 zcmZ9Gu?@m75JgP^2^2(P1cqP;s#uX@o3mvFLF0m&AsB)o7=j@ff(^{~;Y5g&Ui|(2 zFLxW!h+Hi=fD^cYE4YC>cz`E(fj3BCJriOJc3=+-I0G?{-%45O;TYqel1KKM7+IA# zjwG@dLU7Iz;S-A2hCo(prB&D3(X+Xf>ZFvDr&R7FvX;hPNtkAcrma>nc7Z*P;HrME w*r0QG)#OSGZ)J0YwD;sZ6np$f@`eoMj#LZy9dG4H%Obf?xL4H(zpB3yx6a1jokAGD*A zd|Yxkm%|;*V2rWmhP}WGyuk;2!8iQCFZ{tUGv*4e;SQeR72e?!>|RgT)U=pVPJP9g zYVDenoU@3e6ns)WXhpKrS_QWpHT+e|(*y4Ec+^fpCOdD+#;UfiIn}A2EmcEl!fb)y zRo81(Ph>?i+}`?o)ztb4z2 u2+eO-ywis`=j2oDBa-PV={pW%pk=b;jWk?PeIJ>isJf^0mOj~K-=}|#n24|d literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6d5f4b27faef0f49c15c7eb84c7622eb436680ea GIT binary patch literal 414 zcmY+AOHM;E3`Jca6j~%YV9F}k1OrAykrf;%w9GtU%p8dgumCo~LRbbnC@1xMAR?Xj zxsLC3vXLthNpj2c0iNL%KHw9+;2V|;k!!etJ9vT@c!PIH$zyF!;=NBx_fp%A-=S%9 z-={OQW;WDcQI1AOI-g4RuXc)@>dsZS z^eoWJy}GZ-%UVlmv#i;WnJ}yBLH#p9?OG>wj=h*-Ypt=JVHqH;iSEtn>=Nf=j%=v0 WcN{mjW??z*rS(2sxTMqY~ykLs~usPPjV4OPy|KL1r5*u4bTALF>4NlfRSD> zqqTSJX{ds0K|uE8K#t@@&g4R_Qg_J`Zx@ ksM0QFBp2A{-7cHUBYC|-GE|v)@z)$1d&1Mt0{?#H0R($_NdN!< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4c1dd499245cc7381856a91d9bb49d5837612261 GIT binary patch literal 316 zcmYL?!41MN3`G+t0wL6%7=kUhax775S*>Ih%Ecov1Vbt{A&vLzy> zS|DAe%4ZdZq8I`evuk>dEJ8*%x}zwgPaxQ?FD)>fR3q|p+pNrp-^_S2 b|1HYK%;BWPT27oCPIibA(Ej7>>{RIkFKK1t literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3ff640890d67d048d6545509ad3944f7d93960e0 GIT binary patch literal 281 zcmYL@;R(V(424s%+Csq}uH;{#$5BJL)1rt%CU6B;a0ORz2UlFdVdyW2 O#^54H3fnalS=1j&IawtD literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7c2d3f79b99a23134eb026612612dc3186fb7820 GIT binary patch literal 222 zcmY+6-3bCQ5QO*c@*wzIj4fDz9H%S>mMnrW9oU0K*ua%w2fkWQoXv~4;R`z-nJi@| zBAx7cAIOQ^$eldMlg#8r-sD5l3V%~Wl&iZJGk2hg$%^N!nnMh0HjY|~Wu7qo1~80j oEV(z;ZGkgg{{3EM!QKTJjU5>nfRuo#MBS%DQ;ffZPR6>OAVvN!bbJ>bWlqONS zS~W##3Ene53L&N>MmGzQj(}e*{;V2Ux9%`+Ky20>bSEzX=xk4^=i>PXGV_ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1c451850443709209a5f430eaf5a496ef9b42e64 GIT binary patch literal 327 zcmX|+;R(Vp5QVQ&i$4m2E4YIbI6y-PQW^*;MatX26d?+2cCMPWF@QlaD-hK1f=XQ;yPzGcpe;?S2FTBysVxTwNS)7Y2B gaOLA@y}mTeK=dK_Y+G}~VynN3G5fHk(JVRr0khAYKH-+kkjK5Hm7m0l|L;maMGEWDtWtD=RD! zBnAgyv7q>@==hlU`1qKZ7@+ijMm~^yaC~B7Vp4o`csxP~C?6l66c1JfG7V^KOcF?0 UQer$vCsrGP)&p$-8Vhj_0HR4gC;$Ke literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4a1d6d2f81614026edf472952eb45ea243b9edff GIT binary patch literal 222 zcmYL?!3hFE3`GOF!=h_P9=!^N5W=tn%U*+bueM+dmS72XU_mne%qo6(;ZKsE+0j5m z@481lfFm$4gEP2*E4YC>cz`E(fwb~aO>6f&hw0q;@64i?+*PEFVZGRdZjXqDp`qP~ oGUZ<*7ii2nMvAuXCsS2s*6*85SVXPOH~1YY1#ztRacfci09JxU5dZ)H literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bc8e8005f8b3345f8e54ada2fb423ac43bdb0686 GIT binary patch literal 451 zcmYk2F-k-+5QZbJy6AcU8?WFMJVFKuVMsvUD}!KVx7b_RZN1?jqiIGZrSLC(P~$5$m8Z%tLLUdHRH~Sdvh*C9Du0>TT0j g=#L%lat)uX3j5<+;ipZIRT4jjM__yuQh0atJXcQEROFaz&k4nDvNe1UJU1$%G= zClDs-U$t&%?PX^5dYuh2RTW;crPLYFD#B6>Q8OR2<~8D5x$bti{eDUWk(=l)9liHZMa&nFS|(iH}4^QKV%F5Q&6XIG-s?qo!1epBtlra3c%9U2zde{`V)w ZNM(j9oG7BL(Pki7o&D literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4687f235651967ee302bc14ac820c00e08d12673 GIT binary patch literal 279 zcmYL^;RymU422`=c|Q(a%D=*ua)!|Ap@>2za0ORz1y^tZS8xRf@R!urYpa1TJRW%o zSx`enpRhzU2&x=NY%1U|TsE#X;EjJ4{Sxs$Q5kSs$J77P_i1 K)%!S7mruT~;8^5=uznqWF{*T)`Dw!3EsF6`a8t>Pb<-!dIGe zlGChcNkpaWaSJeT1{ZJzH*g0J@B}YFJ)$+(fGya8W^R9{xF9OpWzEu=RUt?WF>*@z zBeap*fD^w$Vo_F=--xHCPjqRly7Lu}06Fv-TEi=a&M+*pEM~(pwT9zKv v3S$au9DRu)1Yc)7LR!uz*9OoIW)pae~c2Mik`b6CI<)}Rnt=Fc;<&C=1EKvNyeCe7NAx`d8dp(XN| z5B!`^lUe9u#FTMHj5t!CLbKhQbp~cJ#=Nt`u5z8x>PEMZQN*&!>UzT?H)_`Fy@zT3 xsJbmtJtC#-;(r7pv5NoCb4?R@Xsk!|^`hon$Nz2;Q=RKqE#4g)M?drZ9WQhdXB_|l literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6f14a75d5fcd37bc4604878db0f6ade66c5c8e0b GIT binary patch literal 294 zcmY+8K?(vf3`HY|xRBX-AFt3wDJ6lB*j2Y)!7F$N_wK!eSMUn1W&ABOjuu{N9?4G! z8i?pU9&iWX-~`U#0ODOZ*ebA`ZOa|Ihqn zMH?dOXp6lAM{ojXZ~<3v19$KMPw)b7u$ZB_&i_*^V@*j_MX*xNHS0wrhQNV+A6ph} zn7wmu%B+Q3iBVeD$@u$E>E<~*MOKwhP4O@(YZO}6+V|9q9QL7Jn;D0slWFgl55>(` AkN^Mx literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..472c86c18ae2ec2d89b9487a580ab762e6ebe68a GIT binary patch literal 211 zcmd;P;Aa2<6Cid4;xHgi2jU7K?gZjlK)e`;*8}lxAU+Pn%sg2r;6F$pF(oM}DKS1i zDJd%pED#!>m=qHe85si;2#icjjE@0Am_Tr3JWxkc5<(ybVeWrsmaMGcc%Wen>|oJQ W7&|&5EEuQ|EDqEk0~3ep{SN@Rze1V- literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..946ff3e5b0cb7d665ebdd7e52474751e46a849f6 GIT binary patch literal 362 zcmY+A%MHRX5JVjU2fjfRK@F6EI5~{@6};|Be|qtQ)pDR7x>& u5;x9~c11b#XkCV{aurhA$_4GFhO|Gk^F%O{rRW~iNP09m%4p{OpZNk&lym(6 literal 0 HcmV?d00001 From a0c10df3872855b84b56337eac972e2706ef7840 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 21 Feb 2019 01:13:42 +0100 Subject: [PATCH 73/95] - made some adjustments so that the BigFont works as intended. The auto-calculated height of 24 is too tall, this requires a manual setting here. Also fix the space calculations for the "finished" graphic. --- wadsrc/static/zscript/statscreen/statscreen.txt | 6 ++++-- .../static/filter/game-doomchex/fonts/bigfont/font.inf | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/wadsrc/static/zscript/statscreen/statscreen.txt b/wadsrc/static/zscript/statscreen/statscreen.txt index 5fddf02c0a..6a16508c30 100644 --- a/wadsrc/static/zscript/statscreen/statscreen.txt +++ b/wadsrc/static/zscript/statscreen/statscreen.txt @@ -46,7 +46,7 @@ class StatusScreen abstract play version("2.5") enum EValues { // GLOBAL LOCATIONS - TITLEY = 2, + TITLEY = 5, // SINGPLE-PLAYER STUFF SP_STATSX = 50, @@ -225,7 +225,9 @@ 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"); diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/font.inf b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/font.inf index 1794c6c03f..f3a0b61865 100644 --- a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/font.inf +++ b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/font.inf @@ -1 +1,3 @@ Kerning -1 +FontHeight 16 + From 48fcdacf06a6760831ec3f0375f96930b61d7066 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 21 Feb 2019 00:35:27 +0100 Subject: [PATCH 74/95] - more work on graphics substitutiion * added a CVAR that sets how localizable graphics need to be dealt with. * pass the substitution string to OkForLocalization so that proper checks can be performed. * increased item spacing on Doom's list menus to 18 from 16 pixels, because otherwise the diacritic letters would not fit. 20 would have been more ideal but 18 was the limit without compromising its visual style * added a second text-only main menu because here the spacing cannot be changed. Doing so would render any single-patch main menu non-functional. So here the rules are that if substitution takes place, it will swap out the entire menu class. * fixed some issues with the summary screen's "entering" and "finished" graphics. --- src/gamedata/g_mapinfo.cpp | 2 +- src/gamedata/gi.cpp | 4 -- src/gamedata/gi.h | 2 - src/gamedata/textures/texturemanager.cpp | 36 ++++++++-- src/gamedata/textures/textures.h | 1 + src/menu/menu.cpp | 34 +++++++++- src/menu/menu.h | 5 +- src/menu/menudef.cpp | 37 +++++++--- src/utility/namedef.h | 1 + wadsrc/static/mapinfo/chex.txt | 2 - wadsrc/static/mapinfo/doomcommon.txt | 2 - wadsrc/static/menudef.txt | 58 ++++++++++++---- wadsrc/static/zscript/base.txt | 4 +- wadsrc/static/zscript/menu/listmenuitems.txt | 38 ++--------- .../static/zscript/statscreen/statscreen.txt | 68 ++++++++++--------- .../zscript/statscreen/statscreen_sp.txt | 9 ++- 16 files changed, 191 insertions(+), 112 deletions(-) diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index fc84aa0d44..488ac4f0d0 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -838,7 +838,7 @@ void FMapInfoParser::ParseCluster() auto fn = Wads.GetWadName(fileno); if (fn && (!stricmp(fn, "HEXEN.WAD") || !stricmp(fn, "HEXDD.WAD"))) { - FStringf key("TXT_%.5s_%s", fn, clusterinfo->ExitText); + FStringf key("TXT_%.5s_%s", fn, clusterinfo->ExitText.GetChars()); if (GStrings.exists(key)) { clusterinfo->ExitText = key; diff --git a/src/gamedata/gi.cpp b/src/gamedata/gi.cpp index 2c639d3c9f..07a46147ea 100644 --- a/src/gamedata/gi.cpp +++ b/src/gamedata/gi.cpp @@ -59,8 +59,6 @@ DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mBackButton) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mStatscreenMapNameFont) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mStatscreenEnteringFont) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mStatscreenFinishedFont) -DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mStatscreenEnteringPatch) -DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mStatscreenFinishedPatch) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, gibfactor) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, intermissioncounter) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, statusscreen_single) @@ -425,8 +423,6 @@ void FMapInfoParser::ParseGameInfo() GAMEINFOKEY_FONT(mStatscreenMapNameFont, "statscreen_mapnamefont") GAMEINFOKEY_FONT(mStatscreenFinishedFont, "statscreen_finishedfont") GAMEINFOKEY_FONT(mStatscreenEnteringFont, "statscreen_enteringfont") - GAMEINFOKEY_PATCH(mStatscreenFinishedPatch, "statscreen_finishedpatch") - GAMEINFOKEY_PATCH(mStatscreenEnteringPatch, "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 77f45d1cf1..4f27a6969b 100644 --- a/src/gamedata/gi.h +++ b/src/gamedata/gi.h @@ -190,8 +190,6 @@ struct gameinfo_t FGIFont mStatscreenMapNameFont; FGIFont mStatscreenFinishedFont; FGIFont mStatscreenEnteringFont; - FGIFont mStatscreenFinishedPatch; - FGIFont mStatscreenEnteringPatch; bool norandomplayerclass; bool forcekillscripts; FName statusscreen_single; diff --git a/src/gamedata/textures/texturemanager.cpp b/src/gamedata/textures/texturemanager.cpp index ebcb354988..047dadc2f8 100644 --- a/src/gamedata/textures/texturemanager.cpp +++ b/src/gamedata/textures/texturemanager.cpp @@ -304,13 +304,6 @@ DEFINE_ACTION_FUNCTION_NATIVE(_TexMan, CheckForTexture, CheckForTexture) ACTION_RETURN_INT(CheckForTexture(name, type, flags)); } -DEFINE_ACTION_FUNCTION(_TexMan, OkForLocalization) -{ - PARAM_PROLOGUE; - PARAM_INT(name); - ACTION_RETURN_INT(true); // work for later. We need the definition to implement the language support -} - //========================================================================== // // FTextureManager :: ListTextures @@ -400,6 +393,35 @@ FTexture *FTextureManager::FindTexture(const char *texname, ETextureType usetype return GetTexture(texnum.GetIndex()); } +//========================================================================== +// +// FTextureManager :: OkForLocalization +// +//========================================================================== +CVAR(Int, cl_localizationmode,0, CVAR_ARCHIVE) + +bool FTextureManager::OkForLocalization(FTextureID texnum, const char *substitute) +{ + if (!texnum.isValid()) return false; + + // Todo: Some decisions must be made here whether this texture is ok to use with the current locale settings. + return !cl_localizationmode; +} + +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)); +} + + //========================================================================== // // FTextureManager :: AddTexture diff --git a/src/gamedata/textures/textures.h b/src/gamedata/textures/textures.h index 442f3b4891..3a9678549f 100644 --- a/src/gamedata/textures/textures.h +++ b/src/gamedata/textures/textures.h @@ -562,6 +562,7 @@ public: } FTexture *FindTexture(const char *texname, ETextureType usetype = ETextureType::MiscPatch, BITFIELD flags = TEXMAN_TryAny); + bool OkForLocalization(FTextureID texnum, const char *substitute); void FlushAll(); diff --git a/src/menu/menu.cpp b/src/menu/menu.cpp index 19cb91557c..7106443d0f 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,38 @@ 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) + { + // 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_Playerclassmenu); + 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 +444,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: @@ -1265,13 +1294,12 @@ DMenuItemBase * CreateOptionMenuItemCommand(const char *label, FName cmd, bool c return (DMenuItemBase*)p; } -DMenuItemBase * CreateListMenuItemPatch(double x, double y, int height, int hotkey, FTextureID tex, FName command, int param, const char *label, FFont *font, int color) +DMenuItemBase * CreateListMenuItemPatch(double x, double y, int height, int hotkey, FTextureID tex, FName command, int param) { auto c = PClass::FindClass("ListMenuItemPatchItem"); auto p = c->CreateNew(); FString keystr = FString(char(hotkey)); - FString labelstr = label; - VMValue params[] = { p, x, y, height, tex.GetIndex(), &keystr, command.GetIndex(), param, &labelstr, font, color }; + VMValue params[] = { p, x, y, height, tex.GetIndex(), &keystr, command.GetIndex(), param }; auto f = dyn_cast(c->FindSymbol("InitDirect", false)); VMCall(f->Variants[0].Implementation, params, countof(params), nullptr, 0); return (DMenuItemBase*)p; diff --git a/src/menu/menu.h b/src/menu/menu.h index 0ac367d1f7..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); @@ -352,7 +355,7 @@ DMenuItemBase * CreateOptionMenuItemStaticText(const char *name, int v = -1); DMenuItemBase * CreateOptionMenuItemSubmenu(const char *label, FName cmd, int center); DMenuItemBase * CreateOptionMenuItemControl(const char *label, FName cmd, FKeyBindings *bindings); DMenuItemBase * CreateOptionMenuItemJoyConfigMenu(const char *label, IJoystickConfig *joy); -DMenuItemBase * CreateListMenuItemPatch(double x, double y, int height, int hotkey, FTextureID tex, FName command, int param, const char *label, FFont *font, int color); +DMenuItemBase * CreateListMenuItemPatch(double x, double y, int height, int hotkey, FTextureID tex, FName command, int param); DMenuItemBase * CreateListMenuItemText(double x, double y, int height, int hotkey, const char *text, FFont *font, PalEntry color1, PalEntry color2, FName command, int param); DMenuItemBase * CreateOptionMenuItemCommand(const char *label, FName cmd, bool centered = false); diff --git a/src/menu/menudef.cpp b/src/menu/menudef.cpp index 80f47417ad..26a42d539e 100644 --- a/src/menu/menudef.cpp +++ b/src/menu/menudef.cpp @@ -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, AllEpisodes[i].mEpisodeName, ld->mFont, ld->mFontColor); + 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; @@ -1632,9 +1650,10 @@ void M_StartupSkillMenu(FGameStartup *gs) 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], skill.MenuName, ld->mFont, color); + 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) { li = CreateListMenuItemText(x, y, ld->mLinespacing, skill.Shortcut, pItemText? *pItemText : skill.MenuName, ld->mFont, color,ld->mFontColor2, action, SkillIndices[i]); 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/wadsrc/static/mapinfo/chex.txt b/wadsrc/static/mapinfo/chex.txt index 9027065e87..2c3f25318f 100644 --- a/wadsrc/static/mapinfo/chex.txt +++ b/wadsrc/static/mapinfo/chex.txt @@ -65,8 +65,6 @@ 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" diff --git a/wadsrc/static/mapinfo/doomcommon.txt b/wadsrc/static/mapinfo/doomcommon.txt index b3541b91a9..212dd0dab2 100644 --- a/wadsrc/static/mapinfo/doomcommon.txt +++ b/wadsrc/static/mapinfo/doomcommon.txt @@ -65,8 +65,6 @@ 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" diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 759a0466f0..fb03722018 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -11,27 +11,25 @@ DEFAULTLISTMENU { Font "BigFont", "Untranslated" + LineSpacing 20 IfGame(Doom) { Selector "M_SKULL1", -32, -5 - Linespacing 16 Font "BigUpper", "Red" + LineSpacing 18 } IfGame(Chex) { Selector "M_SKULL1", -32, -5 - Linespacing 16 Font "BigFont", "Green" } IfGame(Strife) { Selector "M_CURS1", -28, -5 - Linespacing 19 } IfGame(Heretic, Hexen) { Selector "M_SLCTR1", -28, -1 - Linespacing 20 } } @@ -45,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) @@ -74,24 +73,24 @@ LISTMENU "MainMenu" IfGame(Doom, Strife, Chex) { - PatchItem "M_NGAME", "n", "PlayerclassMenu", 0, "$MNU_NEWGAME" + PatchItem "M_NGAME", "n", "PlayerclassMenu" ifOption(SwapMenu) { - PatchItem "M_LOADG", "l", "LoadGameMenu", 0, "$MNU_LOADGAME" - PatchItem "M_SAVEG", "s", "SaveGameMenu",0, "$MNU_SAVEGAME" - PatchItem "M_OPTION","o", "OptionsMenu", 0, "$MNU_OPTIONS" + PatchItem "M_LOADG", "l", "LoadGameMenu", 0 + PatchItem "M_SAVEG", "s", "SaveGameMenu",0 + PatchItem "M_OPTION","o", "OptionsMenu", 0 } else { - PatchItem "M_OPTION","o", "OptionsMenu", 0, "$MNU_OPTIONS" - PatchItem "M_LOADG", "l", "LoadGameMenu", 0, "$MNU_LOADGAME" - PatchItem "M_SAVEG", "s", "SaveGameMenu", 0, "$MNU_SAVEGAME" + 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", 0, "$MNU_INFO" + PatchItem "M_RDTHIS","r", "ReadThisMenu", 0 } - PatchItem "M_QUITG", "q", "QuitMenu", 0, "$MNU_QUITGAME" + PatchItem "M_QUITG", "q", "QuitMenu", 0 } IfGame(Heretic, Hexen) @@ -104,6 +103,39 @@ 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_GAMEFILES", "g", "GameFilesMenu" + IfOption(ReadThis) + { + TextItem "$MNU_INFO", "i", "ReadThisMenu" + } + TextItem "$MNU_QUITGAME", "q", "QuitMenu" +} + //------------------------------------------------------------------------------------------- // // Important note about the following template menus: diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index c65dfb9bfa..6841ce6bd0 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -105,7 +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); + native static bool OkForLocalization(TextureID patch, String textSubstitute); native static void SetCameraToTexture(Actor viewpoint, String texture, double fov); } @@ -374,8 +374,6 @@ struct GameInfoStruct native native GIFont mStatscreenMapNameFont; native GIFont mStatscreenEnteringFont; native GIFont mStatscreenFinishedFont; - native GIFont mStatscreenEnteringPatch; - native GIFont mStatscreenFinishedPatch; native double gibfactor; native bool intermissioncounter; native Name mSliderColor; diff --git a/wadsrc/static/zscript/menu/listmenuitems.txt b/wadsrc/static/zscript/menu/listmenuitems.txt index b1c8e6992c..f12d3a7c48 100644 --- a/wadsrc/static/zscript/menu/listmenuitems.txt +++ b/wadsrc/static/zscript/menu/listmenuitems.txt @@ -93,7 +93,7 @@ class ListMenuItemStaticPatch : ListMenuItem Vector2 vec = TexMan.GetScaledSize(mTexture); if (mYpos >= 0) { - if (mSubstitute == "" || TexMan.OkForLocalization(mTexture)) + if (mSubstitute == "" || TexMan.OkForLocalization(mTexture, mSubstitute)) { if (mCentered) x -= vec.X / 2; screen.DrawTexture (mTexture, true, x, mYpos, DTA_Clean, true); @@ -107,7 +107,7 @@ class ListMenuItemStaticPatch : ListMenuItem else { x = (mXpos - 160) * CleanXfac + (Screen.GetWidth()>>1); - if (mSubstitute == "" || TexMan.OkForLocalization(mTexture)) + if (mSubstitute == "" || TexMan.OkForLocalization(mTexture, mSubstitute)) { if (mCentered) x -= (vec.X * CleanXfac)/2; screen.DrawTexture (mTexture, true, x, -mYpos*CleanYfac, DTA_CleanNoMove, true); @@ -303,53 +303,29 @@ class ListMenuItemTextItem : ListMenuItemSelectable class ListMenuItemPatchItem : ListMenuItemSelectable { TextureID mTexture; - String mSubstitute; - Font mFont; - int mColor; - - void Init(ListMenuDescriptor desc, TextureID patch, String hotkey, Name child, int param = 0, String subst = "") + + void Init(ListMenuDescriptor desc, TextureID patch, String hotkey, Name child, int param = 0) { Super.Init(desc.mXpos, desc.mYpos, desc.mLinespacing, child, param); mHotkey = hotkey.CharCodeAt(0); mTexture = patch; - mSubstitute = subst; - mFont = desc.mFont; - mColor = desc.mFontColor; } - void InitDirect(double x, double y, int height, TextureID patch, String hotkey, Name child, int param = 0, String subst = "", Font fnt = null, int col = Font.CR_UNTRANSLATED) + void InitDirect(double x, double y, int height, TextureID patch, String hotkey, Name child, int param = 0) { Super.Init(x, y, height, child, param); mHotkey = hotkey.CharCodeAt(0); mTexture = patch; - mSubstitute = subst; - mFont = fnt; - mColor = col; } override void Drawer(bool selected) { - if (mSubstitute == "" || TexMan.OkForLocalization(mTexture)) - { - screen.DrawTexture (mTexture, true, mXpos, mYpos, DTA_Clean, true); - } - else - { - screen.DrawText(mFont, mColor, mXpos, mYpos, mSubstitute, DTA_Clean, true); - } - + screen.DrawTexture (mTexture, true, mXpos, mYpos, DTA_Clean, true); } override int GetWidth() { - if (mSubstitute == "" || TexMan.OkForLocalization(mTexture)) - { - return TexMan.GetSize(mTexture); - } - else - { - return max(1, mFont.StringWidth(StringTable.Localize(mSubstitute))); - } + return TexMan.GetSize(mTexture); } } diff --git a/wadsrc/static/zscript/statscreen/statscreen.txt b/wadsrc/static/zscript/statscreen/statscreen.txt index 6a16508c30..1cf1001989 100644 --- a/wadsrc/static/zscript/statscreen/statscreen.txt +++ b/wadsrc/static/zscript/statscreen/statscreen.txt @@ -8,30 +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, GIFont gipatch = null) + void Init(GIFont gifont) { - if (gipatch != null) - { - mPatch = TexMan.CheckForTexture(gipatch.fontname, TexMan.Type_MiscPatch); - if (TexMan.OkForLocalization(mPatch)) - { - mColor = mPatch.isValid() ? Font.CR_UNTRANSLATED : Font.CR_UNDEFINED; - mFont = NULL; - } - else mPatch.setInvalid(); - } - if (!mPatch.isValid()) - { - 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; @@ -115,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]; @@ -183,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; } } - + //==================================================================== // @@ -215,7 +219,7 @@ class StatusScreen abstract play version("2.5") // //==================================================================== - int drawLF () + virtual int drawLF () { int y = TITLEY * CleanYfac; @@ -230,7 +234,7 @@ class StatusScreen abstract play version("2.5") 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; } @@ -245,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]); } @@ -688,8 +692,8 @@ class StatusScreen abstract play version("2.5") me = wbs.pnum; for (int i = 0; i < MAXPLAYERS; i++) Plrs[i] = wbs.plyr[i]; - entering.Init(gameinfo.mStatscreenEnteringFont, gameinfo.mStatscreenEnteringPatch); - finished.Init(gameinfo.mStatscreenFinishedFont, gameinfo.mStatscreenFinishedPatch); + entering.Init(gameinfo.mStatscreenEnteringFont); + finished.Init(gameinfo.mStatscreenFinishedFont); mapname.Init(gameinfo.mStatscreenMapNameFont); Kills = TexMan.CheckForTexture("WIOSTK", TexMan.Type_MiscPatch); // "kills" @@ -699,6 +703,8 @@ class StatusScreen abstract play version("2.5") 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" lnametexts[0] = wbstartstruct.thisname; lnametexts[1] = wbstartstruct.nextname; diff --git a/wadsrc/static/zscript/statscreen/statscreen_sp.txt b/wadsrc/static/zscript/statscreen/statscreen_sp.txt index e1bcd0b624..15606fd789 100644 --- a/wadsrc/static/zscript/statscreen/statscreen_sp.txt +++ b/wadsrc/static/zscript/statscreen/statscreen_sp.txt @@ -142,8 +142,11 @@ class DoomStatusScreen : StatusScreen let tcolor = Font.CR_RED; // For visual consistency, only use the patches here if all are present. - bool useGfx = TexMan.OkForLocalization(Kills) && TexMan.OkForLocalization(Items) && TexMan.OkForLocalization(P_secret) && TexMan.OkForLocalization(Timepic) && - (!wbs.partime || TexMan.OkForLocalization(Par)); + 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; @@ -178,7 +181,7 @@ class DoomStatusScreen : StatusScreen { // "sucks" int x = 160 - SP_TIMEX; int y = SP_TIMEY; - if (useGfx && TexMan.OkForLocalization(Sucks)) + 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); From 2907ba69a00388797daae57abae82772e1247c7a Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 21 Feb 2019 00:56:03 +0100 Subject: [PATCH 75/95] - implemented OkForLocalization --- src/gamedata/textures/texturemanager.cpp | 45 +++++++++++++++++++++--- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/src/gamedata/textures/texturemanager.cpp b/src/gamedata/textures/texturemanager.cpp index 047dadc2f8..5f8465eead 100644 --- a/src/gamedata/textures/texturemanager.cpp +++ b/src/gamedata/textures/texturemanager.cpp @@ -39,6 +39,7 @@ #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" @@ -393,19 +394,56 @@ FTexture *FTextureManager::FindTexture(const char *texname, ETextureType usetype 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 // //========================================================================== -CVAR(Int, cl_localizationmode,0, CVAR_ARCHIVE) bool FTextureManager::OkForLocalization(FTextureID texnum, const char *substitute) { if (!texnum.isValid()) return false; - // Todo: Some decisions must be made here whether this texture is ok to use with the current locale settings. - return !cl_localizationmode; + // First the unconditional settings, 0='never' and 1='always'. + if (cl_localizationmode == 0) return true; + if (cl_localizationmode == 1) return false; + + 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) @@ -421,7 +459,6 @@ DEFINE_ACTION_FUNCTION_NATIVE(_TexMan, OkForLocalization, OkForLocalization) ACTION_RETURN_INT(OkForLocalization(name, subst)); } - //========================================================================== // // FTextureManager :: AddTexture From 2eb312e0418eeae8791fa5d3e8ccb6badcaecfa4 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 21 Feb 2019 01:02:42 +0100 Subject: [PATCH 76/95] - added a kerning option to FONTDEFS --- src/gamedata/fonts/v_font.cpp | 9 +++++++++ src/gamedata/fonts/v_font.h | 1 + 2 files changed, 10 insertions(+) diff --git a/src/gamedata/fonts/v_font.cpp b/src/gamedata/fonts/v_font.cpp index 4e4a5382f6..4c84513bb7 100644 --- a/src/gamedata/fonts/v_font.cpp +++ b/src/gamedata/fonts/v_font.cpp @@ -929,6 +929,7 @@ void V_InitCustomFonts() int first; int count; int spacewidth; + int kerning; char cursor = '_'; while ((llump = Wads.FindLump ("FONTDEFS", &lastlump)) != -1) @@ -945,6 +946,7 @@ void V_InitCustomFonts() first = 33; count = 223; spacewidth = -1; + kerning = 0; sc.MustGetStringName ("{"); while (!sc.CheckString ("}")) @@ -1004,6 +1006,11 @@ void V_InitCustomFonts() } format = 2; } + else if (sc.Compare("KERNING")) + { + sc.MustGetNumber(); + kerning = sc.Number; + } else { if (format == 1) goto wrong; @@ -1026,6 +1033,7 @@ void V_InitCustomFonts() { FFont *fnt = new FFont (namebuffer, templatebuf, nullptr, first, count, start, llump, spacewidth, donttranslate); fnt->SetCursor(cursor); + fnt->SetKerning(kerning); } else if (format == 2) { @@ -1050,6 +1058,7 @@ void V_InitCustomFonts() 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; diff --git a/src/gamedata/fonts/v_font.h b/src/gamedata/fonts/v_font.h index 18ca189783..b8043f0898 100644 --- a/src/gamedata/fonts/v_font.h +++ b/src/gamedata/fonts/v_font.h @@ -104,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: From e49a5fdb614b1e328811eabfb7b00da450ebe81b Mon Sep 17 00:00:00 2001 From: Nemrtvi Date: Thu, 21 Feb 2019 16:39:36 +0100 Subject: [PATCH 77/95] Improved BIGFONT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Ä: fix shading at the top • Ã…: reduce height • Æ: improve blending between the two glyphs • Ç: shorten cedilla • Ê: fix outline color • Ã: thicken lines and conjoin them with the letter • Ø: recolor the center of the slash in the lowercase glyph • Þ: improve shading, condense lowercase glyph • Ђ: round edges slightly • Љ: improve blending between the two glyphs • Њ: improve blending between the two glyphs • Ћ: improve shading • ÐŒ: heighten accent position • Ð: widen tail Also overhauls the punctuation, which now completely fits both the Bigfont and the BigUpper font! Big thanks to Jimmy for a huge amount of support! --- .../filter/game-doomchex/fonts/bigfont/0021.lmp | Bin 142 -> 134 bytes .../filter/game-doomchex/fonts/bigfont/0023.lmp | Bin 295 -> 251 bytes .../filter/game-doomchex/fonts/bigfont/0024.lmp | Bin 350 -> 327 bytes .../filter/game-doomchex/fonts/bigfont/0025.lmp | Bin 300 -> 263 bytes .../filter/game-doomchex/fonts/bigfont/0026.lmp | Bin 343 -> 283 bytes .../filter/game-doomchex/fonts/bigfont/0027.lmp | Bin 72 -> 92 bytes .../filter/game-doomchex/fonts/bigfont/0028.lmp | Bin 176 -> 158 bytes .../filter/game-doomchex/fonts/bigfont/0029.lmp | Bin 176 -> 158 bytes .../filter/game-doomchex/fonts/bigfont/002A.lmp | Bin 160 -> 160 bytes .../filter/game-doomchex/fonts/bigfont/002B.lmp | Bin 120 -> 120 bytes .../filter/game-doomchex/fonts/bigfont/002C.lmp | Bin 92 -> 82 bytes .../filter/game-doomchex/fonts/bigfont/002D.lmp | Bin 140 -> 80 bytes .../filter/game-doomchex/fonts/bigfont/002E.lmp | Bin 80 -> 70 bytes .../filter/game-doomchex/fonts/bigfont/002F.lmp | Bin 236 -> 191 bytes .../filter/game-doomchex/fonts/bigfont/0030.lmp | Bin 227 -> 227 bytes .../filter/game-doomchex/fonts/bigfont/0031.lmp | Bin 135 -> 135 bytes .../filter/game-doomchex/fonts/bigfont/0032.lmp | Bin 243 -> 243 bytes .../filter/game-doomchex/fonts/bigfont/0033.lmp | Bin 233 -> 233 bytes .../filter/game-doomchex/fonts/bigfont/0034.lmp | Bin 211 -> 211 bytes .../filter/game-doomchex/fonts/bigfont/0035.lmp | Bin 241 -> 241 bytes .../filter/game-doomchex/fonts/bigfont/0036.lmp | Bin 235 -> 235 bytes .../filter/game-doomchex/fonts/bigfont/0037.lmp | Bin 188 -> 188 bytes .../filter/game-doomchex/fonts/bigfont/0038.lmp | Bin 231 -> 231 bytes .../filter/game-doomchex/fonts/bigfont/0039.lmp | Bin 232 -> 232 bytes .../filter/game-doomchex/fonts/bigfont/003A.lmp | Bin 112 -> 115 bytes .../filter/game-doomchex/fonts/bigfont/003B.lmp | Bin 119 -> 129 bytes .../filter/game-doomchex/fonts/bigfont/003C.lmp | Bin 186 -> 161 bytes .../filter/game-doomchex/fonts/bigfont/003D.lmp | Bin 160 -> 160 bytes .../filter/game-doomchex/fonts/bigfont/003E.lmp | Bin 186 -> 161 bytes .../filter/game-doomchex/fonts/bigfont/003F.lmp | Bin 255 -> 252 bytes .../filter/game-doomchex/fonts/bigfont/005B.lmp | Bin 236 -> 218 bytes .../filter/game-doomchex/fonts/bigfont/005C.lmp | Bin 236 -> 191 bytes .../filter/game-doomchex/fonts/bigfont/005D.lmp | Bin 236 -> 218 bytes .../filter/game-doomchex/fonts/bigfont/005F.lmp | Bin 164 -> 138 bytes .../filter/game-doomchex/fonts/bigfont/00C5.lmp | Bin 323 -> 317 bytes .../filter/game-doomchex/fonts/bigfont/00C7.lmp | Bin 343 -> 303 bytes .../filter/game-doomchex/fonts/bigfont/00CA.lmp | Bin 306 -> 306 bytes .../filter/game-doomchex/fonts/bigfont/00D0.lmp | Bin 339 -> 333 bytes .../filter/game-doomchex/fonts/bigfont/00D8.lmp | Bin 355 -> 355 bytes .../filter/game-doomchex/fonts/bigfont/00DE.lmp | Bin 349 -> 264 bytes .../filter/game-doomchex/fonts/bigfont/0110.lmp | Bin 339 -> 333 bytes .../filter/game-doomchex/fonts/bigfont/0402.lmp | Bin 281 -> 281 bytes .../filter/game-doomchex/fonts/bigfont/0409.lmp | Bin 451 -> 452 bytes .../filter/game-doomchex/fonts/bigfont/040A.lmp | Bin 428 -> 429 bytes .../filter/game-doomchex/fonts/bigfont/040C.lmp | Bin 331 -> 350 bytes .../filter/game-doomchex/fonts/bigfont/040F.lmp | Bin 294 -> 298 bytes .../game-doomchex/fonts/bigupper/0025.lmp | Bin 300 -> 281 bytes .../game-doomchex/fonts/bigupper/002A.lmp | Bin 160 -> 160 bytes .../game-doomchex/fonts/bigupper/002B.lmp | Bin 120 -> 120 bytes .../game-doomchex/fonts/bigupper/002C.lmp | Bin 92 -> 82 bytes .../game-doomchex/fonts/bigupper/002D.lmp | Bin 140 -> 106 bytes .../game-doomchex/fonts/bigupper/002E.lmp | Bin 80 -> 70 bytes .../game-doomchex/fonts/bigupper/002F.lmp | Bin 236 -> 199 bytes .../game-doomchex/fonts/bigupper/0030.lmp | Bin 227 -> 287 bytes .../game-doomchex/fonts/bigupper/0031.lmp | Bin 135 -> 212 bytes .../game-doomchex/fonts/bigupper/0032.lmp | Bin 243 -> 307 bytes .../game-doomchex/fonts/bigupper/0033.lmp | Bin 233 -> 301 bytes .../game-doomchex/fonts/bigupper/0034.lmp | Bin 211 -> 280 bytes .../game-doomchex/fonts/bigupper/0035.lmp | Bin 241 -> 319 bytes .../game-doomchex/fonts/bigupper/0036.lmp | Bin 235 -> 308 bytes .../game-doomchex/fonts/bigupper/0037.lmp | Bin 188 -> 242 bytes .../game-doomchex/fonts/bigupper/0038.lmp | Bin 231 -> 314 bytes .../game-doomchex/fonts/bigupper/0039.lmp | Bin 232 -> 306 bytes .../game-doomchex/fonts/bigupper/003A.lmp | Bin 112 -> 125 bytes .../game-doomchex/fonts/bigupper/003B.lmp | Bin 119 -> 139 bytes .../game-doomchex/fonts/bigupper/003C.lmp | Bin 186 -> 186 bytes .../game-doomchex/fonts/bigupper/003D.lmp | Bin 160 -> 160 bytes .../game-doomchex/fonts/bigupper/003E.lmp | Bin 186 -> 186 bytes .../game-doomchex/fonts/bigupper/0040.lmp | Bin 323 -> 323 bytes .../game-doomchex/fonts/bigupper/0053.lmp | Bin 372 -> 373 bytes .../game-doomchex/fonts/bigupper/005C.lmp | Bin 236 -> 199 bytes .../game-doomchex/fonts/bigupper/0064.lmp | Bin 307 -> 307 bytes .../game-doomchex/fonts/bigupper/0068.lmp | Bin 299 -> 299 bytes .../game-doomchex/fonts/bigupper/00C4.lmp | Bin 404 -> 404 bytes .../game-doomchex/fonts/bigupper/00C5.lmp | Bin 411 -> 411 bytes .../game-doomchex/fonts/bigupper/00C6.lmp | Bin 608 -> 608 bytes .../game-doomchex/fonts/bigupper/00C7.lmp | Bin 0 -> 406 bytes .../game-doomchex/fonts/bigupper/00D0.lmp | Bin 429 -> 405 bytes .../game-doomchex/fonts/bigupper/00DE.lmp | Bin 382 -> 373 bytes .../game-doomchex/fonts/bigupper/00E5.lmp | Bin 323 -> 317 bytes .../game-doomchex/fonts/bigupper/00E7.lmp | Bin 446 -> 303 bytes .../game-doomchex/fonts/bigupper/00EA.lmp | Bin 306 -> 306 bytes .../game-doomchex/fonts/bigupper/00F0.lmp | Bin 339 -> 333 bytes .../game-doomchex/fonts/bigupper/00F8.lmp | Bin 355 -> 355 bytes .../game-doomchex/fonts/bigupper/00FE.lmp | Bin 349 -> 264 bytes .../game-doomchex/fonts/bigupper/0110.lmp | Bin 429 -> 405 bytes .../game-doomchex/fonts/bigupper/0111.lmp | Bin 339 -> 333 bytes .../game-doomchex/fonts/bigupper/0402.lmp | Bin 375 -> 376 bytes .../game-doomchex/fonts/bigupper/0405.lmp | Bin 372 -> 373 bytes .../game-doomchex/fonts/bigupper/0409.lmp | Bin 532 -> 533 bytes .../game-doomchex/fonts/bigupper/040A.lmp | Bin 510 -> 511 bytes .../game-doomchex/fonts/bigupper/040B.lmp | Bin 369 -> 368 bytes .../game-doomchex/fonts/bigupper/040C.lmp | Bin 431 -> 431 bytes .../game-doomchex/fonts/bigupper/0452.lmp | Bin 281 -> 281 bytes .../game-doomchex/fonts/bigupper/0459.lmp | Bin 451 -> 452 bytes .../game-doomchex/fonts/bigupper/045A.lmp | Bin 428 -> 429 bytes .../game-doomchex/fonts/bigupper/045C.lmp | Bin 331 -> 350 bytes .../game-doomchex/fonts/bigupper/045F.lmp | Bin 294 -> 298 bytes 98 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C7.lmp diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0021.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0021.lmp index c6e74a303b1be511acef2034f6a51f2cadf9db53..644ccddc17eee090ff6d7ba3f5d1107060014136 100644 GIT binary patch literal 134 zcmZQ$;9&p(1t2yAVkaOD2I3STE(Kx+o-7pbA0&_*3k1noS&2zmSzv*HpwQ6Jn5?Ym XM5sVuP+(AKd{$OC5M$SZZ0dgiamXnD literal 142 zcmZQ$;Aa2<1t8W3VrL)@2jXlXt_NZUt}G<*pMgIsDMJF6&vO6UnC0aCTfZNHNAVh91)rz@qC9t+zGc orPnE6N*x`3bw_ozZfJ)PM(6#h);Yjo57gkV&WdofnQv770$?{#nE(I) literal 295 zcmZ9H!3_c-5JfS1(1Y2l#n^#2mJtUQUBwfJEy5x!!VWCLA}qr5`UjT8_>&j%Kg^%7 zR*e#E!45bufE&1j2Y7-Pc!LjE&6L`J#XO0Y!z!C3sQJ;t7he51#ov zWu%Fm_XoCG*GvZNgv?4kylkVN`Xlb(MY+CX?m`H?vCNlRZwwLGQ`^=|2L9`HsmGDG I;YI!17fqa9G5`Po diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0024.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0024.lmp index a58be35fd5410b2da25daa4bc67239cf75d3d543..4d52c14623937bd3a5303b9fd02cb1a8bd8cff9b 100644 GIT binary patch literal 327 zcmX|+?+t=55XFl@;s+8FS8xX>Z~#iZ3ZYmEd@#3xE4YFyxPmLVf-ATIzBa9w{BpgQ z`}4XLrSNeC1g_u)?%)BQ;04~`1HK^3gxG;SIDl2oAvQ5DS;0J7J2897IOau^%ngwy z6mpD0O{Db9T-hi{V@!vRDvkJ7g$_^HAx~Q8wNi3OLTfIvH%29adN)Zox;E`-@F2{e o(-rT5=4ot`(7|bg(|@Plx-*0A!`U1Kgth;bbHO|$A4SZ|511Wh2mk;8 literal 350 zcmYL_&5gn^5QPn70qrG6ilB;>xUQ5RudR_YL_@TfX@DXqf+8q_A}E3qvTwWzSo)&q z%ZokFr7NAS1Na64&fo&B;0EsC0iIyBaBc_o;0yeKRiSx}%eAU7i|XgcztVBBg^MxJ zWQlv#(Uq#dJtvBBP_3FYxg;z|BU1U<5hD`FT;wSi*oROwZ5t{J=ludvcdWVVj&Ii_ zmZ6rD4Bp1dIp1Ty#vb7{i%b{toa^>EKUJfH59JT#*RSS0=@U1 zYMId_5iS(9V(^NU;&h!DOT{rL7AcPW(53y+NH|BK)v6E;S6a*YGU|}p9kWn{XqMV} F#vhf=PGSH6 literal 300 zcmYL^I}XAy5JWd54xb>w0XPsPijaZ@R+IuF_6ppAo}Qkbo}QkbJ5Yt0H6klL`FXUq z*K?T(YY8^s2u|P(F5n7o;0_+(30~k0KA=cM7CckhQxYns!+X$avoMEPPHuYC=*U< O^Q?bC95DXnf8+~)!CL+R diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0026.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0026.lmp index a5082b02892971d96280facaa18873207ea3475a..b52636dfe38577be3035bd4876327215d3d76c04 100644 GIT binary patch literal 283 zcmXwz(G7w?42BOq4Kc(ACvpVfLV$3j^x&yatl$c+;0mtb3a;P^zTscwntW;c^{(yN zWJco(azJ1PH*g0J@B}aL1|RSRhs2l**zHB*XxAi5auNwd5}1R?Vlol-p4bo6Pn&3( z+E>#UTG~WKlT_%|QIssJXpz?$%_iIszd#fmxQL<~A$sp!+(HnxbS{rG^g`|Cy2Yj< RozBoJwb1bTG`0U?`2py>S?2%% literal 343 zcmZvX%?-jZ3`WyG2^FE<7=j@z?hG2#ACA8&&rI*N0 zPHY#fU_K5&fD5>S8@Pi9c!C#rgE(Sr3wB@+jvz_M$0`jMjq#eu8AH@N=ZMB=Lv)g| zRTg2qVFgTOR40|zMlY^X#yKJE&}(C-I^GRLQsNMc6AEe51ULT|9QSploZtR+79}aK s>-JYC9bDU4eJ&;D4)a;>(A*8BP?HM_w!V4Ez030N%G8C?@@z`S4}+_1a{vGU diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0027.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0027.lmp index 66ff537dec5300391ce8f93a32b34a08a73c24d7..715042a197a88a56480418e06d3cd2047d29d81f 100644 GIT binary patch literal 92 zcmd;NU}XRS9U#^PVm%->1!8+3_5|V}AdUj!XdwRopP4BO2>vs$f~a^XD=-|)V#&%1 Pj0OoYgCw*5|NjpFe76?= delta 34 fcma#?kYQzDWdH#gAXWxqT_83GVh13esHXz}C}skg diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0028.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0028.lmp index 447da96021a4ab7213bce487e6119a9d3b527056..c9dfd26135cddcc0229ce4a101af0590373c9a57 100644 GIT binary patch literal 158 zcmXYp%L#xm5JcnW5XC~g+JGH+(4YyDC4TU-U<LkeL)49}h%8)_+FctgPgq zu&{_2APP@~iUbBngolLzQA7ezgn>URD?TDTHa0d2h(bdXp<=<|$xw46AnI7MvI1kW SvbaHXEJzVESe^$${RaRY|1|{w diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0029.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0029.lmp index 07df3a30d34b730e59c2cfc3e68d27bd6a2afedf..5cacd61996ccfbc80a236ea7a85289bd9f0d8569 100644 GIT binary patch literal 158 zcmXYp%ME})2t@I7SdE3)fh~CSVqB4EcD>Po9oT^N;t-wWWq`~Os3TVo1~7sZD7e54 z9zd14n$L`C)hVe4_zXAdFf6BMqU8T@aAaoLc25+os&L#yg#R@!@yIEmWo1A!K`^WF G)nzX@5iXMe literal 176 zcmXYp(Fwvp5JXoKP>3OIqyt;<(;vyPSqyji+ppA+8Z5y+&v)jAdCagZbCp4gM!3TR z3^v%|17DEFi*83`Y2BaEy(3>_mVq*@|0nlgsooY1s%m(Cm%mf*ZW?AYY+5gA3QLMO RvXIXmGw~2Dx0gCg{{hv$HNOA= diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002A.lmp index c73734c68eb783c54d055793eec3993e6e8662cc..143fa13690b1326d04d439783a0678d7b37495d9 100644 GIT binary patch delta 15 WcmZ3$xPXzJi-Dbif#L5&_L%?}-~)*O delta 15 WcmZ3$xPXzJi-Dbif#KIg_L%?})B}b9 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002B.lmp index 19a7c987246beb98c6036c832a2f44f5f847d70d..07d97218b2d7dadc4f3f52d9a11419175d672a3b 100644 GIT binary patch delta 13 Ucmb=ZVCP_9XJBCXJCVH*0206h4FCWD delta 13 Ucmb=ZVCP_9XJBCXHIcm#01~tV3IG5A diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002C.lmp index 6b9ddb14a72463c9b0d3807fb874c2e6de624228..8ab9111fe6923369d3297885cd3cd3c1f3254b5e 100644 GIT binary patch delta 42 ncmazEQekIcWnf_V{$B-1ssgbN5Ssz90}y)xaUc*+)YSt3e-i~p literal 92 zcmd;NU}a!n`0`%|Na_Ny9uS)Xu{{ub0&x%!M*(p(5dZ(r%#;NL{~1_8R6LXw7!GE! SWMu_LgM^qtl3D-%{|5jgX&CYV diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002D.lmp index c9c5d40fcd1ef13490d6064ce8950b6cf00f91f8..72f4fcb699680c0a6daf95b42bc36b197cccd0f6 100644 GIT binary patch literal 80 vcmZQ$U}j)o`2Al2NNNDF0T5dNu>%l$05Jn|76|+Y(V=K`Ae0{fr9tWde)$zw literal 140 zcmd;KU}a!n`1RicNLm816%e}su^$je0C5r!=KygT5H|pE7Z7&?@&Eq}tXU8MW+kR1 cWo3a`q49|rtiVW^7=jg@1k(XF=Kufy0BrXt*8l(j diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002E.lmp index e26c79dfa9ab16d998eeb00c560c12cfe5aef97a..5821762ef2538b854e90ae961c4ab9fd015c4749 100644 GIT binary patch literal 70 zcmZQ$U}0cj`0-x>NGbxc77!Z)u?-Nr0`Y$amMky;Gh!mMvcQbUa3}*L_y0ct)#DP_ literal 80 zcmd;JU}0cj`1)T1NNNJH77!Z)u?-Nr0o21xGz G|Nj6^AQgfD diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002F.lmp index f60e5221096f60331203a7c18287a3484a194628..ef983e34fcf3d01cfc7ed280121bf453c53fefc0 100644 GIT binary patch literal 191 zcmXZVy9&ZU5JutEY%YSnk)^F*NUtw9W^Y0N@O3D$-A0=<}%Sc&s>hHG)k;;L}c Tf)isbK+-NUGBP+gG&DXd>pufeR#reL5Cj8343a>2XlQtFB2*v?3H%2D DoJtz4 delta 74 zcmZo?Y-gOH&loh(K+-NEA|fa#G&DXd>pufeR#reL5Cj2143a>2XlQs)B2*v?3H%2D Dnj;#b diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0032.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0032.lmp index 4bca64d1924a0dc8aa8412e23684fdf162759cca..9c0498e561af029c23e04348e84c3cd205e2bd5d 100644 GIT binary patch delta 128 zcmXww(FuSs5JRmT;)iqi=_*=EIf4c8Hv>3_&gua5PBah*kC!{#;atX)H5Rfq1DSR! tO2PI4v5`@L>zL+bn*6FNR@dBkzX}8P7i$e23C&9OLPkfe4UYp)eE_|aE?EEo delta 128 zcmXww(FuSs5JRmT;)iqi=_=Ynxqt=nHv>3_&gua5PBah*kC!{#;atX)H5Rfq1DSR! tO2PI4v5`@L>zL+bn*6FNR@dBkzX}8P7i$e23C&9OLPkfe4UYp)eE_)rE=m9Z diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0033.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0033.lmp index fffcba017a42a3212197d93cce8c5ea7d330aa06..724928260df76f56a3c73f376e9e207f28e234d8 100644 GIT binary patch delta 53 zcmaFK_>ysg7h~i^?{Kx?q^zv)w5+WE3_Mv`!7(XmF^Op@Nic!XnE1rR#FUhYClmo5 CMHEW_ delta 53 zcmaFK_>ysg7h}Xk?{KxCq^zv)w5+WE3_Mv`K{3f`F^Or(Nic!XnE1rR#N_0OClmo4 CniNC; diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0034.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0034.lmp index 97a93cdd71a1a0f9ab80a274af6df03727e72aab..b92ed8a25f89a37c09992a4ab934ae3c0c55fd82 100644 GIT binary patch delta 87 zcmcc2c$sm6t88#^cw}fyR@Q$8j;yTU$e8fZcqk__K5}A`lYVe`cyvrmWMnv4oF^+Q TGA2F|2;$?@Knj5Z$lyN!et#hy delta 87 zcmcc2c$sm6t87qEctmJSR@Q$8j;ySph?wxucqk_#K4M~$lYUTmcyvrmL_|1PoF^+Q TA|^f&2;$?@Knj5Z$lyN!d56X$4OZL literal 241 zcmY+6!3o1K3`Ko#b7{uu3SGb$84-f!JGi|MRP@ZX@+aIW_Np%1K diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0036.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0036.lmp index 6ca4a42c1808da78b43bf1028d9b42d2e5fe102c..1ed157a7da2dddb85bbfda8babb443a35e654778 100644 GIT binary patch literal 235 zcmX|*;RymU427%IL%bWu1>C?RgmAQQ^zZxW3a;P^uHXvp;4;0J!#40i`sI;y3{&vB zk{h{`LLTHvUgS+a!xBzKU5wQf+Fag<2&6eDSlu~GtIV8BM{@uG literal 235 zcmX|*;RymU427%IL%bWu1>8W6kZ_c8^zZxW3a;P^uHXvp;4;0J!#40i`sI;y3{&vB zk{h{`LLTHvUgS+a!xBzKU5wQf+Fag<2&6eDSlu~GtIMaON0I;l diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0037.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0037.lmp index 5dd89f0853960b6e7dacb2ca7615a9a05f37e5f0..1b9ffffb80c9f80f5ec35b78adf3f3e36c492102 100644 GIT binary patch delta 90 zcmdnPxQB6qlTcDt)_(?;tgO&PC?jxUh_-EDbaZrlOj1%3Sd=F#D?B_rG(0pqDFvjS Wkvl6ZIyxpkF);5Aq~0@+RvBrMAnMRy)A_%oZJ(LJK6zIVF>rze3ETCm&qug$_W^ orQ_fH(vN^p+|-LIbX8D#sCm+#5LHz~qS2$I$VLO7Q~YK806T+6e*gdg literal 231 zcmZ9G-3bCg420Jo5cJBi0~%NF!XXNWB0k&#U7;&%0s?k0`JaI$D=RW7D~k11bEA+zS3kF{P&ksp&gPE1`q`zQ< zH%#z>9~|(9wvtquT3XS%Me~Hab+|nSPpjVjp03FTrfo|~A^O(1ndczgG5MQ4YNUmv NLv!?i|J37>asr0LFMa?3 literal 186 zcmXAiOA5j;5QbCxvK8;*%B5?UQVP;VC=ueozw{E`!7F&k`i&X*_#Zkw%6P)1! zSD4`eFL=WTzR*>Ywzih;Xw#y0!__@*P0`!k;C{^|Rfm$4<9{1E^0H*9$5~ANB=FHR XMQM+*r+L*#GtGcn@`9txSY-PF;nFp@ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003D.lmp index 6fba4f4ddb8f8de08d6ff5e98295e33ac657c469..40c4c2e4a6f1439e2fdf9ebfe32490e29bb757b6 100644 GIT binary patch delta 15 WcmZ3$xPXzJgMpoaf#L5&_L%?}%mar2 delta 15 WcmZ3$xPXzJgMpoaf#KIg_L%?}zypK; diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003E.lmp index 2154df1f5f7833548131cfdbd418a53c265d036a..c260ab9237d57c7a53dee8aedc79a2c3754e25e5 100644 GIT binary patch literal 161 zcmXAi%MHRn3`8B05Tdj~2eiN`Li_?*7Fb1^3l&fRXO0wW-h!oPdq)1W)|r|6lDvX7 z1bDy`UhswwSg9O~e{rj%%~@)w<3)0-rM}0R(+p|KRwwNa`=}vIS9H;$!|@c;4K-_| U?HJRYzWnXvnTq?_sSBR@7kNZ5PXGV_ literal 186 zcmXAj>j}az7)4Y2vK4o616PnDTCFC=HU#bjj^G3i;BSArUp>JO4&S{8@@UQ4q}jk0 zb}+&Np74SZM}tJJXVO`1(9bsc6&upuT@Nyk%EO;6A5zO}n)P8K7hE)ibf)CdWU7oG%sp$~$id58Ey5z~zy@r<25i6v_U?84lj!QeOY;Ap z$!uNktafBiGC7emxsWTlkvn;iCmG3$xK96Sa=q$MNG?2URWBS>J%B@to0sW%iM(v& w=LL^>wzE0az$R+$s;03wYXWBIU=->R0maDq*z^K5&xIf?+7IxTXSesXDpr1 QA|^DLu=y{n!Y(ZN1rJ?Hi~s-t diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005C.lmp index 5864b535509a7fc49890bec081497a58e6282cec..1f8c650f2ec7196bdf04c7f22b68d16d366272ce 100644 GIT binary patch literal 191 zcmXZVy$ZrG6o%nw(;q?a$kA1>bO@n=644F^+}*poyF0sjdHR0A11~%r!pY8Uon}u5 zI#QrB-RMpWJ?Kd@7}gx3$|bjwqR9pH_@L9lZCn5b*^{J07ekN z3O2BV1DxOjH*k%Wv~OpMxR_C}i||?n`$zO<0TYIu9Yhk5SyiRnfbjE##2DoL;iu@C QkiL~gH8I~xJz3xU08u(ZR{#J2 literal 236 zcmZvVu?>JA5Jf4hv|tria0EyQBwRv_-PI1^5DwuG4&gTV50B0tUOstnFdAzlGgyEJ z8`!}CPH=%6JirXxGHF*4VPzH}-GnQjkp2;t+2ceb+iKu45v9^X?Ik#uA`$|YC%xxl Sa2lWc>{?3J^x6J_c6|X_`AI_n diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005F.lmp index 400fefe10da955b23b3fa9dacacbf0245b39c662..0a3af44abb36b4f0dbc0e756d75eecbec55fbd40 100644 GIT binary patch delta 56 ycmZ3&*u|*J#lXVA!0_Y00g$u=VkaQ>2I3GPjs@a0AkGKk3LtKrXlggHRUQEN2ni7Y literal 164 zcmd;KU}0cj`1;=hNIC+s7Z3*naSRZr0&yM?mjiJF5O)IcBp{v*#0)H1VDKNr2#L+g n0yBc5p^T77C?h-`CIwRy0Fz>YDGq=!f?#UG6QR05cKinb7alJy diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C5.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C5.lmp index 0dbe640a80f45642c79f41995747d142f7cf9a2d..7c5e9ba4857e8f2109224832b1558e839f5c0e19 100644 GIT binary patch literal 317 zcmYL@%W=Xm5QgOdHsOC&4&Ip*SFjL@vciUg-U(E$~thqRCy(nhMF0rANs!%E-I zzW$Y7&Dt0m;H*h7LdT;LPF;2VD67p~A$#%y2IOfs;>czy$2T4D7%hY{51BE+8CzmS4Y< zl&VrnjnoEy3-%y_Gq`{&xPd!(fG2o?S*FwqtU=jlu{0mTJBMhRBMM|BE((dA(VCEr zCtYIdT|hbIXhvs^?XuoyQ4Y1U)RnS1^PxR5lb0M4wP0={H!WMNuf3F@YnTVgRV^&8gFd-6U6v{JUj47JQVV_`&cS^8c-n#tSA;aDT<^C|NwK>Ah7AO4o!FFj^- diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C7.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C7.lmp index ed06351c51938b51c31a6b27cdc86f2ca47dbd5b..a0bae3a8c9519c30529c70a5ed59102338d5184e 100644 GIT binary patch literal 303 zcmYk0(FwvZ6h+fgw20LWoW);1gD3<7At74Gw=1}XLpX#(xPvPQ@w_yO7fxS#-+MP% zskIVqVFyPz!3C~xgF8In2`_lV&?vQmu1iI^?Ww`JK*`O5vn`7C*Er{W2(+_W(v3(y zV>N6%OOTa`p_OA+WLx(8c}j;cCRaUEJ#9&-p0>ZaDUx07@n%!~AEULWRq{2VeVr|a PktGcCy-l7XhA4jkIsaV^ literal 343 zcmY+8L23d)5Jh|9NJhzsc!pfTy(=NhK@!r?blc?+q3{--!*h6x+`?11n7ryS3qQQ6 z=GXtlEZoYOHt+#oaDp>j;0nKRgF7rM=iXrrTc~R-8eSTvq$G@?n)41ty=prdBj);) zauy-g(v&@6_r{|~_Bpbcs(#0VZCcgP|5!VSWYq=KeYQs=8x|#$Y1&C=|n66T`D8hDFUV4Sz^lX|wGO3f{yE>a3#05O{err#s!gt!4rlV$_rX zTzNw@VweDBd?d?SGxY{P1F``92So{K2_HT0(+>JbzvybS@b=PR(u&GhNW% zchB-LF<>Em(&%DyQ*k)zWlD4%5@~g@ dYRv?(DnFHjbJDh+_4BIX<Pc-yFC21n zN$yJ)CO1)A*n@`?oZ$jjxWOGB@Prr46JwUJf;DU)9cxq@*8{7`RgVN!7x#g0R7>^V z*L`3yqLr({5MT;|@;49-Ui{CAl2Y3RQ`H@YDOvilt?A7q;nZJhDUE>)<>GMcztd`0 jB9S6KFq!dMu~GDQ+r~L5ii&Tvql}wP2zY)?YgGFNc}-~I diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D8.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D8.lmp index cd90d1827288438ace8eaeb0fae3e96a9861a739..f8926ed7056ef5877ddaab54f2d1896214970734 100644 GIT binary patch delta 13 UcmaFN^q6VFb>_I_w28Mm0V@dxPyhe` delta 13 UcmaFN^q6VFb>{T6^oh4R0V`4lT>t<8 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DE.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DE.lmp index e4306725d054ff543e83cf9d8c429f4a824989fd..055bf6ede6e4ea5342badf526d94eaca5a740bd6 100644 GIT binary patch literal 264 zcmY+;(Fp=E3Uvgg+u)tr(YyRQDeya5WR BQ}6%) literal 349 zcmZvW!41MN3`K)l1Og-uTv&k(7yyZDtF%;6+?qrjDxVpHF&Kj}Sb-I|hVKFw#8;oK zzNWF4W@U`Y%np^n8C<{>+`t_?z!OYH#;m~xY{4E>z^vq7l6vQzXYxdR41t+L-w(cY zwzRfxn&yC~Iz*Ad7q%`+#Ht5h?_Jwj-?eRY9Ak*_bB_+zL#UlrBxSis0XNsqKf<2A yBD_!3=qX!>)DEApG3iVd?7eQxK}9|jAtFo;^m&cVu!~+ep5o7dprr}sYSIf&?{6aj diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0110.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0110.lmp index d69253bc5a241bad58b7b0d1afe6e91a1e56899a..f8cfb111468a6d9b6b15a784d8909279fb657338 100644 GIT binary patch literal 333 zcmY+9y$!-J5QQC-B0@BjY`_LAKuLiWog&K?kyE;11y*1MR$v8IUNW% zchB-LF<>Em(&%DyQ*k)zWlD4%5@~g@ dYRv?(DnFHjbJDh+_4BIX<ktpY%iO!Na}x za(R=iOm1TB;RqfsaD^M(;Q>#0!5coXOpIB>2DY$+bgHqM*iUqmx3jvgb%w81EA`%= z`;7u2>Z}WcfhaMmu^}3~_|Zm1Xwe#T)dPZCvb2+p>BTHz>(4C+jfM>2Vo}V$+s?M4 iM9TQUWWj5th(&%o*49c{I=<0NGEUYZp!qeav6?S?Gic-h diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0402.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0402.lmp index 045f1205788008248f419dcd1b60ccebe161b092..a00a09d09988ad747ef8e578264644a5d6582d23 100644 GIT binary patch delta 124 zcmbQqG?Qt9j_6qi28Me;{2qvZ12H=z1B2j1$C?{(eck>TMnP#K Daf>Rv delta 124 zcmbQqG?Qt9j_7#?28IVf{1J%%0x>5e1B38H$C?<9tgOJKtgOiJtSnBZEFk#Lz>}2~ z4it)xjLC{mgbILUQX<1+!efB~tn67?F_GcnaZq*|P$@_u8!J#%Jje_VMi2=AL)t1Q diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0409.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0409.lmp index b8289d6c3fd3f42f6ddf8e583211c53814fed8ac..8d5641010e9d9e34b0f2733c3691d639b351899b 100644 GIT binary patch delta 52 zcmX@ie1v&}8KZb`P*7lCU`$rle+HhctnldQ$iT?(u)xW_jOhYN(a}jj2{x82F!&Du D*TfRN delta 51 zcmX@Ye3*HI8KZb)cz9@FU`$rle+HhctnldQ$k0e2p6tt*&Yu+>odlF%XU+nF{{YIK B5`6#w diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040A.lmp index d9c758d1fa60d79a4eda76060fb7d343a4c91b26..cc6e60363db73aa6eb8fe8f595bedd488be2d8c0 100644 GIT binary patch delta 48 ycmZ3(yq0-FGgDU9#8yKPxxyoPx~GgC&!#8yKPxx?v~5JVnCuEr(ir4vpWWN8o~Q>OAy`)9l&D|6^($W(TTF J(~slUe*i}_Yh?fc literal 331 zcmY+8-3dZ5425I;!GC;k21jrLAAG!}gc4G?C_ZHcS8xSaZ~-@P1!r)E>q$|;!dIGe zlGChcNkoD6xCIzEgA2HV8@Pi9c!C$89?=?Xz!vO4nA_j!To4s)ixz3kst_f`lsM<| z5t_tJ#7SQvvnZ>|Z^TpcC%Ow`Gi1f;_NH)Ji&@#H2_HtahM7~1qXh)76Q>9VElUq- vgfWFRj=sbYg0C|kA+3~?YXfKpvk5#_Ji5>~L(ddOu2aE-W>5w0yjI;Cli_7# diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040F.lmp index 29f11285fcef78a38f943c8fc4386da839236857..98381f3df96288dd0d4e4b655185e550e406b371 100644 GIT binary patch delta 141 zcmZ3+w2EnhjN)_#28LBYycLKK0P$rYeg?$fftZ7lfkASjtw$VRR#s$8baZrNba-TZ z77+Yr01ClCV0?TcP>6#Ks46ir1At`NlHvgN{o*I8aMI2I{;eY BF2eu- delta 137 zcmZ3*w2WzjjN()V28I)N3hY zIwEs!X11-`BeB*p8K}-tduWJ(+CgXUsV&s2PPIqbA&GjA1++w0XPsPijaZ@R+IuF_6ppAo}Qkbo}QkbJ5Yt0H6klL`FXUq z*K?T(YY8^s2u|P(F5n7o;0_+(30~k0KA=cM7CckhQxYns!+X$avoMEPPHuYC=*U< O^Q?bC95DXnf8+~)!CL+R diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002A.lmp index c73734c68eb783c54d055793eec3993e6e8662cc..a9750a59cc25e259032f8605e9eabab05a689b57 100644 GIT binary patch delta 15 WcmZ3$xPXzJi-Dbif#LT=_L%?}*aL?E delta 15 WcmZ3$xPXzJi-Dbif#KIg_L%?})B}b9 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002B.lmp index 19a7c987246beb98c6036c832a2f44f5f847d70d..f8233a3e84f334b4be5a18033ffcc1988194b1cf 100644 GIT binary patch delta 13 Ucmb=ZVCP_9XJBCXJ(0Z-01~(Z3jhEB delta 13 Ucmb=ZVCP_9XJBCXHIcm#01~tV3IG5A diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002C.lmp index 6b9ddb14a72463c9b0d3807fb874c2e6de624228..8593486096da6610521852b4d495f738c9735488 100644 GIT binary patch delta 42 ncmazEQekIcWnf_V@?Ql=ssgbN5Ssz90}y)xaUc*+)YSt3ey{~Y literal 92 zcmd;NU}a!n`0`%|Na_Ny9uS)Xu{{ub0&x%!M*(p(5dZ(r%#;NL{~1_8R6LXw7!GE! SWMu_LgM^qtl3D-%{|5jgX&CYV diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002D.lmp index c9c5d40fcd1ef13490d6064ce8950b6cf00f91f8..39e4d07c591086dd63d51e0f6250f1063daf2396 100644 GIT binary patch literal 106 zcmZQ)U}a!n`2Al6Na_Kx1rR#{u@4Z30dWElGq7esz<&@cG%_(O3(N|LhO@%qtmq`D NY-CJ4lm*uO9{}Rv9!UTI literal 140 zcmd;KU}a!n`1RicNLm816%e}su^$je0C5r!=KygT5H|pE7Z7&?@&Eq}tXU8MW+kR1 cWo3a`q49|rtiVW^7=jg@1k(XF=Kufy0BrXt*8l(j diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002E.lmp index e26c79dfa9ab16d998eeb00c560c12cfe5aef97a..a5458441016f42a1c075f74a62d5d0d223f56be5 100644 GIT binary patch literal 70 zcmZQ$U}0cj`1)S~NGbxc77!Z)u?-Nr0`Y$amMky;Gh!mMvcQbUa3}*L_y0ct)guzs literal 80 zcmd;JU}0cj`1)T1NNNJH77!Z)u?-Nr0o21xGz G|Nj6^AQgfD diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002F.lmp index f60e5221096f60331203a7c18287a3484a194628..423d7754abf83526017462fca92b6df21947ce9e 100644 GIT binary patch literal 199 zcmXBOJqyAx5P;!mKWr=FA98h;5K2g|P#j!ta(D0U?(XjHZ)@Lc4qkYM7r4R=?(l#o%sc0{uvqC=<7|V?rL|TvZtQy17Ewwu=F?|_7ZgIMOx$3R zjBJ?8ca}u3C`oO$w^R*DRM(hj<{gz*xr;)Kzi6qg7H&$;7PT7DdmsFPmu6G3gao4P NOw|d{fotRcw_Z;8T#x_& literal 227 zcmd;P;9&p(6Cid3;s78{1mYqfZU*8hK)e))w*m2SAif5~OdMHo@Sl+@D=QiT;| O$4W}+sJrc8o%sWMUqR9U literal 135 zcmZQ);9&p(6(H6IVq+k72I3GPP6gsJAZBLD0)qcc%vo7MK$?*|D~lx>Bm@Tk8F)ba mh=_=wpwQ5GpaPIUKqwFd0YMCsKzL|qcu*o#0Hz;A{|5lCuqIFd diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0032.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0032.lmp index 4bca64d1924a0dc8aa8412e23684fdf162759cca..a319eef9b050a415683119340c9d3ebc5ec6c4fe 100644 GIT binary patch literal 307 zcmYL^%?ZLl5QR7XBvH`ZEW#Qrz~hD>%P@<}NKSLN2#c@?i?9fbu!i_%U2))p;maG| zX5%_%a{xzh23K$ccklpD@B(k(D(7}!586h5Gr471n^skbm_;?)Bp20s1sfw5-Kla) zrZ_T%9EBSg(G!sf+cr746X9zwqpA-g$FMq;-eZ={5 q47lRd1P@CPzo8;Jd7x*l-zoz0(K9xzq>{yK$C5R6+qQMVYhD0PT}l-I diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0033.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0033.lmp index fffcba017a42a3212197d93cce8c5ea7d330aa06..f8e389ac4aefde0100be230fb6436874a61039f8 100644 GIT binary patch literal 301 zcmZ9G(FwvZ6h%`}1f>*5a1VE|A%qYb2!?*We}`}ghj54v;SkOc?|p6k@WOfAp1y>% zrZdb1TtNYM@BmNn0uy+H52)bO7;^?@Cvy&KsZ{w^M5tmyQRRk3^-)zPV%ao*&IkPH zIjZ3vn-2Fo>)G@IZMqlee9Ro{*)jwsa?mxcNDAINXRUQULA2VjyAOmVPp^Y{5!fBaxar2qf` diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0034.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0034.lmp index 97a93cdd71a1a0f9ab80a274af6df03727e72aab..d6af9bf61d33a1fc4734be5a388656bc98dad894 100644 GIT binary patch literal 280 zcmYj~!3n}Z5Je-Hiy&#p4suaEgmo5%S%TtLUK*&-~$A}qoV;@iy#`QatJzq6Tb z(={bK=-~ucxWOGB@Prq<;R9b-uXt_pB2!T{(~_L49)d^=!{EA~HMj<*O+{Smzd|&$ xZF3eK%R%QW#L$}B30G6HG?I(Y9VIGd&H3NOsLEj3l)R%sxtMsCJA473=?7F5TT}o5 literal 211 zcmX|(!3o1K3`KqLA&`vI1+qXP1|xw5qL&bS&owJ#g|5&Qx|sV_IeGAmztGnhreHka z44<&T4es!OCw#*X{K7EQn`R*;;w-g#V4N1w`OI V3=&ZhVWz9XqA#Gj_KLUtZ9hu^KHvZV diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0035.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0035.lmp index 4d98ea367f1615adbf3aaa9131e9936bf5965f12..d474cb31973db61c0d104c48778592e0fb82c352 100644 GIT binary patch literal 319 zcmYL^(FwvZ5QZaYt)g}Zhw#ZET0#lo4#MT}wr~iCaEK1!5Dwu}{I6;8;0wvef0yL! zI%jnU9w>N#CwPGgyuk;2!D-{%72JS3=)aD;WnWC^EXfCqy@lsqFUSqa!u1-=^LF%vNV1NaBe)Qw2-&W<3+_#b g2oqBbBE{jY$;LIUY52K${n);N#Q-$7+xpq^1JWsFcK`qY literal 241 zcmY+6!3o1K3`Ko#b7{uu3SGb$84-f!JGi|MRP@ZX@+aIW_Np%1K diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0036.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0036.lmp index 6ca4a42c1808da78b43bf1028d9b42d2e5fe102c..5efa5665e46f45e19416e55452e9d8b48cfdc4ed 100644 GIT binary patch literal 308 zcmX|+(FwvZ6h%|fR+Q2e9K-?q4Iw;B9)yN|y%`+BAsnJZID|v^AMZ;WFPv~Wc}Ylb z2BW!x8@K}j5AXypuz)xCfG;>T#$3R@lbXCcqo$~t(Q?y^%*=s^Mq;R9n7nt+TI(3b z3^<|_I)kLm(TL{9s7rOF*>$5j7tn~Ygh^k}`&Jhw5l(*>b%Z&_w7LV1O>pfIUN_1l SY^=6?1QXf7mUQh_B>w=0lVW86 literal 235 zcmX|*;RymU427%IL%bWu1>8W6kZ_c8^zZxW3a;P^uHXvp;4;0J!#40i`sI;y3{&vB zk{h{`LLTHvUgS+a!xBzKU5wQf+Fag<2&6eDSlu~GtIMaON0I;l diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0037.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0037.lmp index 5dd89f0853960b6e7dacb2ca7615a9a05f37e5f0..748794f128249e87cd6bb7b869b87ac4fa668f4a 100644 GIT binary patch literal 242 zcmYL>u?>Sj3`GwVDg-Q)nwk!QEm?QE%0+5whR6`vfgLhK7CF8_m;3UQp1x&wZg7?- z7{LTq5Wx#SfH?=3@WtOnFPU4XSKbk{r4~3o{dmkI^ow aUR6qR6?n<9s_yV6un5L`YaVTR3`-}#`b;bU literal 188 zcmXxc!3lsc3n!= LY4^6P%X*d%_8~WL diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0038.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0038.lmp index 6001da43b28bb21c8360d9e3060174f3adac822d..19f6b485ec51c1a6ee4c62f953366e5bd1ec2ac2 100644 GIT binary patch literal 314 zcmZvX!3hE}5JeLa(Sz>AChWl$JS-Bzkbz(bd-!*Yun3E=h%Le*tYQ6$?y{gCUNZU2 zOlG#GF-1pmB8gndjoitD^yEoi#9Cwag#mH!|yRM6>AtS4b zCR(NeQmj%Dojg@_PD9`k$Glb|&;~x8pFFR?xp=LNp6CVeHE-U}fBJ>V8~=6UYwdhI M&QjX_UE^ojH?Iz3djJ3c literal 231 zcmZ9G-3bCg420Jo5cJBi0~leE)OKM|{U{*T2(UxibBzZ%LiwVdcPm?&us%^|tj&J$w)1sX13i2wiq literal 232 zcmZ9G;R(Vp5QWpyAH{Z@uHXU^Jwgaa2r+OAxPmLVf-AU!8#qjS7tNnO_!8bn?#N*0s&44^`C(?D=RuNF)ND$#sCWi Y$HYK{f}?>9uux2VJX8oIhi=Y)05HBJ6#xJL literal 112 zcmd;J;9_84`14-_NNNJH77$wlu@4Z(0&yM?=L7No{|qcyV88~Y!2&UnSy>%P!tpAM6Kr$ delta 17 WcmX@ibeM@lfPser1U7P5GXek|paP@- diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0053.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0053.lmp index 1e8606805a55cd76b7ae66532816065673b0dd4d..78d408ff782ec6ecf532caea2ec47932752c9a2a 100644 GIT binary patch delta 63 zcmeyu^p$CXgl<0r1H)n<-VVg4f%rZUe+FW9Mg|6HAl3(BCm@ah;+%=DW-JW+Sy>b7 Gz5xK90}P!2 delta 62 zcmey$^o41Hgl-=L1H&R9-Uh^{fcPE|e*$7QMg|5cAl3t7M<5Od;_Qj8X3UIyDHH3z F0RWJP3?Tpj diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005C.lmp index 5864b535509a7fc49890bec081497a58e6282cec..37dfbe1be31caf423b11b63505b2462865a6aa2e 100644 GIT binary patch literal 199 zcmXZWu?oU45P;!S+gcUzg`C|(C?Q;+bP{fKcXxO1-rd<(tN%4U_~9cQNiOc{Y;JTX zPnjO{q!+#ELle#Pr60LQ%Pg){?In+@O9h84#vK$%#yyNN8f)7vY+x!2E%YJS!oldh Xv4bJ>#v_!p-h1NRmSm&sP8#rv!2U delta 11 ScmdnYw3%sw2V=%W&sP8#p9F9K diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0068.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0068.lmp index b1e468842ce87c1d0cbb7986f2a277e00ab09d65..7e5975f3453e2e25e8893ffc10565c7625ef0477 100644 GIT binary patch delta 18 XcmZ3@w3=x`GE-L8#8g8NIb$*aJ&gw4 delta 18 XcmZ3@w3=x`GE+vz#8g8NIb$*aJy8bL diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C4.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C4.lmp index 7d1a1f1a93414aaaef6563200a9c8c8f115d0537..fcf57173b7edc2d35c23daf6b2b9279f2d3cabd8 100644 GIT binary patch delta 17 ZcmbQjJcW6}S;nl1=gJwgCc82E0RTK!24DaH delta 17 ZcmbQjJcW6}S;n-9=gJw=Cc82E0RTK223P<9 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C5.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C5.lmp index 4285e76803c15df57805a6a98c38b2ea8d73e392..f56bff936b890eb7f07fc66c356984061eeb7da7 100644 GIT binary patch literal 411 zcmYL_JyOFk5JqK4?1Us_n55zw9D|B69z`RK6$?YLB^4z#6*V14;07FmLvRc6RvzH9 zpJw-4t^RgqZ;Y9nTgCtn@CeWF3h(d%pYR3WU@BuS;R>$d9-iO@-r(X?RCzmR923!| zAxemNwIm);)NHxZ%9zr?N4{8-#uzb%NGUf=a3MJ7W6A3?5gUVdQ+hJ(RWHgcAGD>~ ziX8hpiQdK$Lp{SXhs57{U1mKKxgp4g{)5P@7U^4u^IzFd9b>UYTJ1x*+KF_&muNZC rFxU{HZj*nHa?Vk#?K+E`)l1b_$@!uXf?CanrSzgje=kvXC_~Oa*wKSt literal 411 zcmYL_K~BRk5Jg=mBrR=KRdm5QxCRTVC~_=Yacv?NvtWWFE=$)-Yo(=O@+qM=tt1qjtvhzhD1hwilHTAVcr{AHSCXK&1fP|R< diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C6.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00C6.lmp index 5cd5d722687d4b59836e65fc6d3e00714967165c..e3531957c494079c1a551f7eb6c931695fa17dc1 100644 GIT binary patch delta 47 xcmaFB@_=Q+Gp4Mpi7#^GA|k?pAS^s0Dk&@LKLdYOR$xSUCvhXJrLOgolO(2L}cQ28T>8VtfYx D&)pJ; 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 0000000000000000000000000000000000000000..b189844a3cc39d07e9f117277bd01730283b558e GIT binary patch literal 406 zcmYk1%}oR`3`R4v%g=xiEJbV+w7`KIpjj!hu`-Jb;IIvFp$Lkg52~OF4&ga7D-r1_ z&a;&-*`(VP>mHt94+r>wPxyjw_<>*8bSZ7&4j$kI-ryb9XMS9@zoaZ$3Q*PViX#Vm zokRrHjO?{oF;mT$bnPx`1z{>wi_4})?ahZfbstqw1Jw@ge$z*EO(*Wp(YZLMBQ|-v zIBZ_*qi{QQo8>Ui(w><9Z~4tQ(mp2UEK6eE=^}FrZ_jA6wIfQ5{|yvbBE6|doK-~k R>u6$P53yQBjt}!z{{WW-fIa{K literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D0.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D0.lmp index d4842663efb90b349696d8b9ddd877b8a76b817f..d69534d77b0e812d9783e963808788929b25a150 100644 GIT binary patch literal 405 zcmY+9{b|EM3`Z{^ACyu8`729gh-~1*cHHy?#~mgGP0)@I=nx&ELv)A^(GA=u#f0<+ z52R=5?z|4GV5#5*dU%5m_=GR`h9CHa*(8JwY+(m2yuv$NU_RGt2CJ%CREMw{UDeQf z+@)L?X(UOEd7O*p_U)-7R6f@ws>9J-eRDR~bRyEV|J?DJJMLWSRo(4xbG5k`S-W!? z=Na9CQ+n=`AWWY*4@=_9wX*cWSc Km@Ti@Tm1)6{DWKo literal 429 zcmZXO%S{7842EYR50MDvz=bksf&$R8nxL^Xn$ao;E7SljAkhFfil7LJppI-ldpC#( zOW)Z3{TSbbO)z@|fgbko3h(d+37tJ*;vvLb&NyNTLU zCH<=uW|j?m{!A=vmldvvYD%Y1CA+Fsik;*KSIJVc2$kNn=32FoRX29HvSYN?!q^Vw RV$FXH_SI4yW=r1Dh9hzYiAn$f diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DE.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00DE.lmp index a58338450da5b20e96c318e47d3afa2ab0d77867..b15438797329ce0ac9c4e9a509051d1db733afda 100644 GIT binary patch literal 373 zcmZ9H%MHRX5Jb%<0>mLu10_%bS1u@8S(XhZQBKR1A}E3)D1sj7fgVtpS%pIw=}Eh@ zKYQ&;NA1BGT)_?8!2>+O3%tPxtVYglz!vPl0c3CiuGD{Z^g@au#$?K>=7|>(Plb?r zuL^X{^S{2B<(MHk)pgVNsaAE1OOk5d>&69QI&%bp=FpPNN$bjemoVrp6ge2V!7QJK p)>73+o=T0iAjfa;sK)Zi0y)2DJDKspsAAo8rrM&!xdKN_-51t5b$LE}cLhgq1W`%|A%W0P6f%G~ghM!lL%4z~xPl+`ytMiuUN}v9 zbKgz7R0}2AK?`TNz!h$AhX*|21@nl>-YcYgo? diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E5.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E5.lmp index ebd976cf4245d3d35a4ef7c0efb9160064093179..d0c38338518c84d8220ac005272742e5a5736ef3 100644 GIT binary patch literal 317 zcmYL@%W=Xm5Qb$SHsKX$fD))8$6P#&5t`Llk>Io^I-r8|kQP!y+DH{NAU>I7veLJ+ zuYaW%voXeu%q#v44v^piSNMQW_=0cvfg3cHFZm%Q(YH)> zX_%z3d5oUh6oP~hBb{8W8IfN1)?p&$o&5LmJVp`Eaki|k=c?z3@K;-Y|8MyYm<40k literal 323 zcmYL^%MHRX42Dx)rMxPbfe{#iBbTTuY2>IOfs;>czy$2T4D7%hY{51BE+8CzmS4Y< zlxn4v>Z>jM4(ve$XK(>ma07Sn08j7&vrMTq*nqOnVrf2vcMj1sM-<3NToe*JqctHL zPrAg^RX{oAXhvs^?XuoyQ4Y1U)RnS1^PxR5lb0M4wP0={H!WMNuf3F@YnTVgS=>Nl*T_vC#DXr*k48ETm;V_`&cS^8c-n#tSA;aDT<^C|NwK>Ah7AO4o!D~4uq diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E7.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E7.lmp index 3e66da3e69bdfce6cc9a03d0a6b5fc10175b48ff..6420f09e0d9262eb1f5203cf26c7c92d1827f326 100644 GIT binary patch literal 303 zcmYk0(Fp=E42E-Z=pmkN;4HrSSVW;vC|6Do`s@mB;Sdht5bod#O8wHSV&H4iKgr)N zWhEl-wBg*s0giBn3tZs_cX+@PUeHz|YpCm(BTX7|@IH`IHK%qt`f|12cU=gylPu`= zgdRf?Tz^s{rxWc&%OrR^_M2IZ`!GabG+Q*|a44E_zq!$pUDKgW$NWD=Yey^l8%&!r Rn+2;&2=@D$enkb1^Z|x?UkLyJ literal 446 zcmYL_K~4iP3`M7%0hA&HU9jUAy#;I$phk+ExS{n45LaNyo-6bsoPVxH%r otwb~EM9~YFo;yVOhd_{o@h8crog~j%4sN3O?m|EPQJBB#7dR=6h5!Hn diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EA.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00EA.lmp index f04ae0a04e111b2459e6e5bbfbbbbcd2b80fef94..f43aa778442ce1b1c8ff8f3d07c86b9990c60ac6 100644 GIT binary patch delta 138 zcmdnQw25g#M}1aSXjW)se0(?v$7E&wXXFP8MQ24OW@Uu~ad13Pj6nd%2?lbKfO08W wS%EOY&~Tt2P*o^UA`nP}b;pE*6~PrU@nvPjK=gqO1SwGO3f{yE>a3#05O{err#s!gt!4rlV$_rX zTzNw@VweDBd?d?SGxY{P1F``92So{K2_HT0(+>JbzvybS@b=PR(u&GhPJuIA;0iam!vmi1f;W7iDva5}4)$<>vWz*B3h^-}Q;&`&8rkrJ zR)hCpG8%+9Yh6DZ2sOGt!+XCpZK!CqnWvl(fj)ZYDJnEZgN5`-rHjo?#iGcUDZzGx hNUMt#YbHpe;ih!3R@&CFep*$$9Qqy|^LM#p`T-_6YDNG6 literal 339 zcmY+9;R(Vp5Jpq2SfmI};0A8s0^$!#J!)v6w7=xQ6>!?MC?Dn%vq@FYh_chYaE)rA z&bhi589}tPWi<#wjwr@Lv~uD`I|`a+otUd02;7py-{?&rW)ZvoY(~={WN0py#QJwz lZ3{{y4-bqMyjHSM^zW99wUXy0-|&-!lTB5T`88cb`40_8YTf_< diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F8.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F8.lmp index 5595260bb37a9558f04605c9504ef71b12eaa2cc..8cabf51ec8508b7faaf517a959b09fbcf08e218c 100644 GIT binary patch delta 13 UcmaFN^q6VFb>_I_w28Mm0V@dxPyhe` delta 13 UcmaFN^q6VFb>{T6^oh4R0V`4lT>t<8 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FE.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FE.lmp index e75fab9f77980e61681b53054691055443227d87..65f85c4454698c6cdf8fa5c347256f8a736b5ade 100644 GIT binary patch literal 264 zcmY+8(Fp=E42Fvy;=|!gj^LSIL%2feJ?7OFT)`Dwzy(~u1zf-de3kmgTEW0q^8bGl zx^ca8?p3yU2QY&JID!*6gA2HV8@Pi9c!C04uYXm{m{LqB#Tc{d$DqKd;P;M1& literal 349 zcmZvW%?-jZ3`T<}Dgq=9Tv&k(7yyZDt5B*aZcQQ%mCua97>vOftiTFf!{`V%i1GW5Hr7K}TV0Vf&O{2hxmNxW_B@F2 wIZ>ge@j|3>*uuo5Jyo#xIxz9J-eRDR~bRyEV|J?DJJMLWSRo(4xbG5k`S-W!? z=Na9CQ+n=`AWWY*4@=_9wX*cWSc Km@Ti@Tm1)6{DWKo literal 429 zcmZXO%S{7842EYR50MDvz=bksf&$R8nxL^Xn$ao;E7SljAkhFfil7LJppI-ldpC#( zOW)Z3{TSbbO)z@|fgbko3h(d+37tJ*;vvLb&NyNTLU zCH<=uW|j?m{!A=vmldvvYD%Y1CA+Fsik;*KSIJVc2$kNn=32FoRX29HvSYN?!q^Vw RV$FXH_SI4yW=r1Dh9hzYiAn$f diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0111.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0111.lmp index ee745d123844f31b7d007979c64c0863bb69d086..730bbce6f6c91c280d58bb05a2f056935274ee82 100644 GIT binary patch literal 333 zcmY+9%?-jZ3`SGbLxpPJuIA;0iam!vmi1f;W7iDva5}4)$<>vWz*B3h^-}Q;&`&8rkrJ zR)hCpG8%+9Yh6DZ2sOGt!+XCpZK!CqnWvl(fj)ZYDJnEZgN5`-rHjo?#iGcUDZzGx hNUMt#YbHpe;ih!3R@&CFep*$$9Qqy|^LM#p`T-_6YDNG6 literal 339 zcmY+9+X=!z5Jfi{F-Q=szz*!d2E-3T9O9CNkbDlyLcT;NS{3xWfaU@PapdpoMj0%ocXAhXcfO4dp|>&`sLSTK26sT%%g3 zbFLmXGK6Sp%W5k&hGyE*!&!(!-yqeTd{tFK+YTy6> diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0402.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0402.lmp index 1e219fbe55d7bc21c4c9fef95b800bb725d1a0d6..4f72414a26a931d8cd3dcc9177d4c6449f546c1a 100644 GIT binary patch delta 176 zcmey)^n+=Fg`fl@1A`6_I{IuR(w#tAe&EG!}-0;GbS RT_h_jIywey1P3e3QUE~EK9B$a delta 175 zcmeyt^qpyfg`gB81A`tAI{|SR5GPOcoKqhW9i0UM{~5TlvV!B2va%wgKx_^cs5=081U&oz diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0405.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0405.lmp index 1e8606805a55cd76b7ae66532816065673b0dd4d..78d408ff782ec6ecf532caea2ec47932752c9a2a 100644 GIT binary patch delta 63 zcmeyu^p$CXgl<0r1H)n<-VVg4f%rZUe+FW9Mg|6HAl3(BCm@ah;+%=DW-JW+Sy>b7 Gz5xK90}P!2 delta 62 zcmey$^o41Hgl-=L1H&R9-Uh^{fcPE|e*$7QMg|5cAl3t7M<5Od;_Qj8X3UIyDHH3z F0RWJP3?Tpj diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0409.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0409.lmp index 2e347979bd58eb226f7ded29d2bcfa48543fbabd..db25394db168a9b4fb0bbd512bb09a310e806946 100644 GIT binary patch delta 51 zcmbQjGL>aQ2Im(>1_nkZ1_qvqgi_@% delta 50 zcmbQrGKFPA2Ipr+1_lNu1_thlghyIwKEfR#r-UTzp(ibV|zPyNpTz{xuC2 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040B.lmp index a72e03e68234b2c50601b078f4e4005c2df99d2d..33b4ea06fdeaf93eaef7036fcbd1ed4c83d67cab 100644 GIT binary patch delta 63 zcmey!^nq!E6eDBOWNAhf!>rhd=!oc;q^zv}Y@AtHNnv3T5wRd1J4Y6f8xtFw2;^|G J0Xbms9{|1V7hnJY delta 64 zcmeys^pR*Mgxc%D1r)Tfg(68&rZZ4 zmY%;Tc}x9X{a;zTpRcVKXx38gAeop5O)E-~*bKj>k|mA3_Xu zcps#ybt%S}QVPM@e=Vn&`o2%N)4>R+jyUDkQ{1E_R}(f|Me literal 431 zcmZ9HO-@506oqN&k4>#LZy9dG4H%Obf?xL4H(zpB3yx6a1jokAGD*A zd|Yxkm%|;*V2rWmhP}WGyuk;2!8iQCFZ{tUGv*4e;SQeR72e?!>|RgT)U=pVPJP9g zYVDenoU@3e6ns)WXhpKrS_QWpHT+e|(*y4Ec+^fpCOdD+#;UfiIn}A2EmcEl!fb)y zRo81(Ph>?i+}`?o)ztb4z2 u2+eO-ywis`=j2oDBa-PV={pW%pk=b;jWk?PeIJ>isJf^0mOj~K-=}|#n24|d diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0452.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0452.lmp index 3ff640890d67d048d6545509ad3944f7d93960e0..d029013b64105332fd1bc6d621b080a62cbd2e7a 100644 GIT binary patch delta 124 zcmbQqG?Qt9j_6qi28Me;{2qvZ12H=z1B2j1$C?{(eck>TMnP#K Daf>Rv delta 124 zcmbQqG?Qt9j_7#?28IVf{1J%%0x>5e1B38H$C?<9tgOJKtgOiJtSnBZEFk#Lz>}2~ z4it)xjLC{mgbILUQX<1+!efB~tn67?F_GcnaZq*|P$@_u8!J#%Jje_VMi2=AL)t1Q diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0459.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0459.lmp index bc8e8005f8b3345f8e54ada2fb423ac43bdb0686..129cc00ef5361001913d4a7ff8139d6d1e133464 100644 GIT binary patch delta 52 zcmX@ie1v&}8KZb`P*7lCU`$rle+HhctnldQ$iT?(u)xW_jOhYN(a}jj2{x82F!&Du D*TfRN delta 51 zcmX@Ye3*HI8KZb)cz9@FU`$rle+HhctnldQ$k0e2p6tt*&Yu+>odlF%XU+nF{{YIK B5`6#w diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045A.lmp index 983dc518e141735e5764e5d476d473225db737f5..a7f8b67a20cf783d3bdaf5420b58d49f9ba0e631 100644 GIT binary patch delta 48 ycmZ3(yq0-FGgDU9#8yKPxxyoPx~GgC&!#8yKPxxga$~fPo9Rf*ZJlFYpZ>;0J6wq8-?SBgmj%+P|tUh>8wHiwtH>h>~JT zoO2n4kT^tC`V%sXvZ}O^>1y=M<6b9IGhF5`X0f$&Jp?hE&7ovv_o21fN#4x@GpA-v zZ)p2f5~mo|+u()rph0*rPxk4#U>-c-Vuqno&aUB`@L~3fH&z^Kk7@KQ{r@&KakCXv Jq^aw6t4~8KYhnNZ literal 331 zcmY+8-3dZ5429$M2mkTG863e0eDLv>5=uznqWF{*T)`Dw!3EsF6`a8t>Pb<-!dIGe zlGChcNkpaWaSJeT1{ZJzH*g0J@B}YFJ)$+(fGya8W^R9{xF9OpWzEu=RUt?WF>*@z zBeap*fD^w$Vo_F=--xHCPjqRly7Lu}06Fv-TEi=a&M+*pEM~(pwT9zKv v3S$au9DRu)1Yc)7LR!uz*9OoIW)pa6#Ks46ir1At`NlHvgN{o*I8aMI2I{;eY BF2eu- delta 137 zcmZ3*w2WzjjN()V28I Date: Sun, 17 Feb 2019 12:03:51 +0100 Subject: [PATCH 78/95] Add language menu to Options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In this menu, all languages supported by GZDoom are selectable with one simple click! Credits to @PROPHESSOR for making it! (This only edits the English and French languages because they are the only languages currently up to date with GZDoom’s development. A Russian translation will follow suit at a later date.) --- wadsrc/static/language.enu | 1 + wadsrc/static/language.fr | 1 + wadsrc/static/menudef.txt | 24 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index f2c1c50e2f..a43247c258 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -1730,6 +1730,7 @@ 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 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/menudef.txt b/wadsrc/static/menudef.txt index fb03722018..389f9a54ac 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -2545,3 +2545,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" +} From 3d4b5ae8a31e54a623ea945ff1cd19828eea4b0a Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 21 Feb 2019 18:59:32 +0100 Subject: [PATCH 79/95] - small font update. --- .../filter/game-doomchex/fonts/bigfont/042B.lmp | Bin 372 -> 360 bytes .../game-doomchex/fonts/bigupper/0419.lmp | Bin 373 -> 434 bytes .../game-doomchex/fonts/bigupper/042B.lmp | Bin 435 -> 423 bytes .../game-doomchex/fonts/bigupper/0439.lmp | Bin 331 -> 394 bytes .../game-doomchex/fonts/bigupper/044B.lmp | Bin 372 -> 360 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042B.lmp index cb834d363a68321de5b7dab3340b295f4df3a274..ff5f8f2b145379931ef8d6c280a40ed0feca2825 100644 GIT binary patch delta 98 zcmeyu^n%G(h=GRz1Ok9K5r~U`xEYA20P#{F-Uh^nf%pOt-v#1VK>QtunHU)ugn?KE ch)sdm4T!@h2CidCijGd2oWLkDS)MTz0QS2OU;qFB delta 105 zcmaFC^o1!Qns*%%oZ_<&d* ihz)?)5r~6;IC-M)I-acP=%lQy|Ln|JSy>bRX956qc@y*i diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0419.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0419.lmp index f9a5737cb6fdc8466686f263ec0fc69b44853486..a014574044d0e2b920c1bb03f770b39a88e5d5e9 100644 GIT binary patch literal 434 zcmZ9IL2d#u3`I@plmaSLDu?Jfx?+!}k!7n^qFGd4b;Su-aR~0gJ$eZ)!SEemDm9vy zNdL#*&b-o!h#FdBSMURN-~f)`7o5Nuyp4$7!3R*V1$%G+&C>s`J~S((WXsviO6Oj+ zRz;YxiL?fd9-=gE!`W=wltdC&XY9^bOC!QeR9Pd49^F%cw;1{=LUUM+yM#BNAW~RD z96{tyai3MuEJ8w*^yNOSqAH61%AZ5Tm^Jg(Zt@b5YI^V56K2G$Pne@+RTayn>%Jps jco&|VSQ!>PIPunmCC13gb(YY&j6YSsGTgg2x}E(6$H86+%Nghg0{Jy?WASc30y?o1Gud>5G9 z%ud#B<_ISPAx!cO`4U59cSwx@mHLAD!Rr E2b?N+VE_OC diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/042B.lmp index 2774ac0814ad1f2f42fa66af76954dc1062c28b4..691758737856260c7358f4019d442bcb58835c5e 100644 GIT binary patch delta 129 zcmdnYyqq~un1P=G1VVr~1Bh#YcmfbF0pcA%d${t3h!j0_CoK&%49`atXq y#Nj}k4aD_8Jb7a14rQ*ati+h;nCQsx#H_6UY#bmikPqUpvjI7gk%^Nn7^?wG!5ZfP delta 145 zcmZ3^yqP&vgn^#{1R{Vq2Z$ShcnT1&0OCDBd;y5>1Mxc`{tLuBj0_A?K&%eLMnG&0 z#Qs2>48-L?+zrI@CkF1&=FG}UjERnkjtoys{LjV#;sLpdSy}(t*?^qLNDz~QB?|~9 MPhb?E?97+~01Me4-v9sr diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0439.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0439.lmp index f2cd792cd222f744f4dc1bb3fd279ce8821e9f08..6d37d20551b0bf16dd8615dc924d50849634cf25 100644 GIT binary patch literal 394 zcmZ9I!EM4o5JeY)?O-^7C?jR$lA|4KG#b2;u`iK+8i+DIeJz1;1^P3HCkAlZ**eQ#}>%NIa*$QQYfNIUw20#LuHOJEf3=*{TKs{+f4 z9uvIKP3?N%(M`L1T_w{jMP7TA++j2-H%zl}bf1}x#H5cg)&H&1sH*vrzF}V3lmV&( S4bS73jMU_RQq?*58vhGgjdwHv literal 331 zcmYk1(FwvZ6h&W4RjB>&-xVCe0sL$z;qgd7(jVbX;0mtb3hv+tZr}ip;D^MUG!-wL zP+s1>z1dJlM4x!T$>0Re-~z7T2JYYip5O)Epsk3uUZ|RC$CH`f=rHjg)0$BR~1&% pH@1^{d48&7_cqtHX1LDI#d;y5>0`V&#{tm=Uj0_CI fK&%49ra Date: Fri, 22 Feb 2019 18:19:26 +0100 Subject: [PATCH 80/95] - fixed the usedcolor array's base type. The usedcolors array which counts the number of pixels in a given color in a font used bytes as storage, so any color that just happened to have a count that is a multiple of 256 the color was considered not present. --- src/gamedata/fonts/font.cpp | 8 ++++---- src/gamedata/fonts/fontinternals.h | 2 +- src/gamedata/fonts/specialfont.cpp | 4 ++-- src/gamedata/fonts/v_font.cpp | 1 - src/gamedata/fonts/v_font.h | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/gamedata/fonts/font.cpp b/src/gamedata/fonts/font.cpp index b8725eae63..5d67b3bcee 100644 --- a/src/gamedata/fonts/font.cpp +++ b/src/gamedata/fonts/font.cpp @@ -471,7 +471,7 @@ FFont *FFont::FindFont (FName name) // //========================================================================== -void RecordTextureColors (FImageSource *pic, uint8_t *usedcolors) +void RecordTextureColors (FImageSource *pic, uint32_t *usedcolors) { int x; @@ -524,7 +524,7 @@ static int compare (const void *arg1, const void *arg2) // //========================================================================== -int FFont::SimpleTranslation (uint8_t *colorsused, uint8_t *translation, uint8_t *reverse, TArray &Luminosity) +int FFont::SimpleTranslation (uint32_t *colorsused, uint8_t *translation, uint8_t *reverse, TArray &Luminosity) { double min, max, diver; int i, j; @@ -889,10 +889,10 @@ int FFont::StringWidth(const uint8_t *string) const void FFont::LoadTranslations() { unsigned int count = LastChar - FirstChar + 1; - uint8_t usedcolors[256], identity[256]; + uint32_t usedcolors[256] = {}; + uint8_t identity[256]; TArray Luminosity; - memset (usedcolors, 0, 256); for (unsigned int i = 0; i < count; i++) { if (Chars[i].TranslatedPic) diff --git a/src/gamedata/fonts/fontinternals.h b/src/gamedata/fonts/fontinternals.h index 1325072993..63a69733b2 100644 --- a/src/gamedata/fonts/fontinternals.h +++ b/src/gamedata/fonts/fontinternals.h @@ -39,6 +39,6 @@ extern uint16_t upperforlower[65536]; class FImageSource; -void RecordTextureColors (FImageSource *pic, uint8_t *usedcolors); +void RecordTextureColors (FImageSource *pic, uint32_t *usedcolors); bool myislower(int code); int stripaccent(int code); diff --git a/src/gamedata/fonts/specialfont.cpp b/src/gamedata/fonts/specialfont.cpp index d90cb330b7..1d3c92c238 100644 --- a/src/gamedata/fonts/specialfont.cpp +++ b/src/gamedata/fonts/specialfont.cpp @@ -153,12 +153,12 @@ FSpecialFont::FSpecialFont (const char *name, int first, int count, FTexture **l void FSpecialFont::LoadTranslations() { int count = LastChar - FirstChar + 1; - uint8_t usedcolors[256], identity[256]; + uint32_t usedcolors[256] = {}; + uint8_t identity[256]; TArray Luminosity; int TotalColors; int i, j; - memset (usedcolors, 0, 256); for (i = 0; i < count; i++) { if (Chars[i].TranslatedPic) diff --git a/src/gamedata/fonts/v_font.cpp b/src/gamedata/fonts/v_font.cpp index 4c84513bb7..6ec033c9e5 100644 --- a/src/gamedata/fonts/v_font.cpp +++ b/src/gamedata/fonts/v_font.cpp @@ -63,7 +63,6 @@ #define DEFAULT_LOG_COLOR PalEntry(223,223,223) // TYPES ------------------------------------------------------------------- -void RecordTextureColors (FImageSource *pic, uint8_t *colorsused); // EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- diff --git a/src/gamedata/fonts/v_font.h b/src/gamedata/fonts/v_font.h index b8043f0898..9495cf5e6a 100644 --- a/src/gamedata/fonts/v_font.h +++ b/src/gamedata/fonts/v_font.h @@ -114,7 +114,7 @@ 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); From 8c06a00ee6f5a761dc79efe649771b2956902a8e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 22 Feb 2019 19:07:58 +0100 Subject: [PATCH 81/95] - moved all dialogue loading code into the map loader. --- src/CMakeLists.txt | 3 +- src/maploader/maploader.cpp | 2 +- src/maploader/maploader.h | 14 + src/maploader/strifedialogue.cpp | 560 +++++++++++++++++++++++++ src/maploader/udmf.cpp | 2 +- src/{p_udmf.h => maploader/udmf.h} | 0 src/{p_usdf.cpp => maploader/usdf.cpp} | 13 +- src/p_conversation.cpp | 510 ---------------------- src/p_conversation.h | 4 - 9 files changed, 585 insertions(+), 523 deletions(-) create mode 100644 src/maploader/strifedialogue.cpp rename src/{p_udmf.h => maploader/udmf.h} (100%) rename src/{p_usdf.cpp => maploader/usdf.cpp} (97%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 007e3ea12b..bfc20d71e1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -952,7 +952,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 @@ -1075,6 +1074,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 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/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/p_conversation.cpp b/src/p_conversation.cpp index c536611ae5..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,475 +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 = 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. -// -//============================================================================ - -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 = 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. -// -//============================================================================ - -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 = 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; - } -} - //============================================================================ // // 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 From b386603044ea8968ab9599c7afd1cda50d600405 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 22 Feb 2019 19:13:40 +0100 Subject: [PATCH 82/95] - deleted the unused lumpconfigfile. The chance that this will ever see some use is precisely zero so there's no need keeping this code around. --- src/lumpconfigfile.cpp | 86 ------------------------------------------ src/lumpconfigfile.h | 62 ------------------------------ 2 files changed, 148 deletions(-) delete mode 100644 src/lumpconfigfile.cpp delete mode 100644 src/lumpconfigfile.h 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__ From f907bb048408b814dd07f655639f770f7da22678 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 22 Feb 2019 19:48:18 +0100 Subject: [PATCH 83/95] - moved a few more things and deleted the unused v_pfx implementation. These were pixel format conversion routines used in the D3D backend. Nothing in here is needed anymore - the FBitmap class offers much of the functionality covered here in a far more concise and approachable manner. --- src/CMakeLists.txt | 3 +- src/{ => utility}/stats.cpp | 0 src/{ => utility}/stats.h | 0 src/{ => utility}/templates.h | 0 src/v_pfx.cpp | 687 ---------------------------------- src/v_pfx.h | 83 ---- 6 files changed, 1 insertion(+), 772 deletions(-) rename src/{ => utility}/stats.cpp (100%) rename src/{ => utility}/stats.h (100%) rename src/{ => utility}/templates.h (100%) delete mode 100644 src/v_pfx.cpp delete mode 100644 src/v_pfx.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bfc20d71e1..2bac1ff912 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -964,14 +964,12 @@ set (PCH_SOURCES scriptutil.cpp st_stuff.cpp statistics.cpp - stats.cpp v_2ddrawer.cpp v_drawtext.cpp v_blend.cpp v_draw.cpp v_framebuffer.cpp v_palette.cpp - v_pfx.cpp v_video.cpp wi_stuff.cpp gamedata/a_keys.cpp @@ -1267,6 +1265,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 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/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__ From 3d9dce01566d3d9caba22e0eb74d2428f7b3b243 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 22 Feb 2019 19:58:52 +0100 Subject: [PATCH 84/95] - fixed DHUDMessageTypeOnFadeOut with empty messages. --- src/g_statusbar/hudmessages.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/g_statusbar/hudmessages.cpp b/src/g_statusbar/hudmessages.cpp index ff9a697921..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) { From e091369a38d7bd9b0216ddb7cb06ad2e9cb4af8a Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 22 Feb 2019 20:24:24 +0100 Subject: [PATCH 85/95] - removed FCriticalSection and replaced all of its uses with std::mutex. There's really no need for a non-standard solution here anymore with C++11. This also fixes an unreleased lock in the WildMidi code. --- src/CMakeLists.txt | 3 - src/critsec.h | 37 ------- src/posix/cocoa/critsec.cpp | 99 ------------------- src/posix/sdl/critsec.cpp | 95 ------------------ src/sound/i_musicinterns.h | 3 +- .../music_fluidsynth_mididevice.cpp | 3 +- .../music_softsynth_mididevice.cpp | 6 +- .../mididevices/music_timidity_mididevice.cpp | 4 +- src/sound/musicformats/music_dumb.cpp | 12 +-- src/sound/musicformats/music_gme.cpp | 15 ++- src/sound/musicformats/music_libsndfile.cpp | 8 +- src/sound/oplsynth/opl_mus_player.cpp | 6 +- src/sound/oplsynth/opl_mus_player.h | 4 +- src/sound/timiditypp/playmidi.cpp | 10 +- src/sound/wildmidi/wildmidi_lib.cpp | 53 +++------- src/win32/critsec.cpp | 89 ----------------- 16 files changed, 45 insertions(+), 402 deletions(-) delete mode 100644 src/critsec.h delete mode 100644 src/posix/cocoa/critsec.cpp delete mode 100644 src/posix/sdl/critsec.cpp delete mode 100644 src/win32/critsec.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2bac1ff912..daeb50fe23 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 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/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/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/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/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/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(); -} From a50a0c5b0d2f4a409800e628c2019c5950760c76 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 23 Feb 2019 09:20:30 +0100 Subject: [PATCH 86/95] - fixed: empty strings cannot be substituted. --- src/utility/zstring.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utility/zstring.cpp b/src/utility/zstring.cpp index fa56229ad3..d4ad5ec89c 100644 --- a/src/utility/zstring.cpp +++ b/src/utility/zstring.cpp @@ -1039,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(); ) { From add10029b990d035a3f0b0ede14a4bac55e0944e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 23 Feb 2019 09:54:18 +0100 Subject: [PATCH 87/95] - fixed chat input. --- src/ct_chat.cpp | 29 +++++++++++------------------ src/utility/zstring.h | 2 ++ 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/src/ct_chat.cpp b/src/ct_chat.cpp index 6628703ab5..6facdde727 100644 --- a/src/ct_chat.cpp +++ b/src/ct_chat.cpp @@ -112,7 +112,6 @@ CVAR (Bool, chat_substitution, false, CVAR_ARCHIVE) void CT_Init () { ChatQueue.Clear(); - ChatQueue.Push(0); CharLen = 0; chatmodeon = 0; } @@ -142,7 +141,9 @@ bool CT_Responder (event_t *ev) { if (ev->data1 == '\r') { + ChatQueue.Push(0); ShoveChatStr ((char *)ChatQueue.Data(), chatmodeon - 1); + ChatQueue.Pop(); CT_Stop (); return true; } @@ -162,7 +163,9 @@ bool CT_Responder (event_t *ev) else if (ev->data1 == 'C' && (ev->data3 & GKM_CTRL)) #endif // __APPLE__ { + ChatQueue.Push(0); I_PutInClipboard ((char *)ChatQueue.Data()); + ChatQueue.Pop(); return true; } #ifdef __APPLE__ @@ -249,25 +252,22 @@ void CT_Drawer (void) promptwidth = displayfont->StringWidth (prompt) * scalex; x = displayfont->GetCharWidth (displayfont->GetCursor()) * scalex * 2 + promptwidth; + FString printstr = ChatQueue; // figure out if the text is wider than the screen // if so, only draw the right-most portion of it. - const uint8_t *textp = ChatQueue.Data(); + const uint8_t *textp = (const uint8_t*)printstr.GetChars(); while(*textp) { auto textw = displayfont->StringWidth(textp); if (x + textw * scalex < screen_width) break; GetCharFromString(textp); } + printstr += displayfont->GetCursor(); - // draw the prompt, text, and cursor - ChatQueue.Last() = displayfont->GetCursor(); - ChatQueue.Push(0); screen->DrawText (displayfont, CR_GREEN, 0, y, prompt, DTA_VirtualWidth, screen_width, DTA_VirtualHeight, screen_height, DTA_KeepRatio, true, TAG_DONE); - screen->DrawText (displayfont, CR_GREY, promptwidth, y, (const char *)textp, + screen->DrawText (displayfont, CR_GREY, promptwidth, y, printstr, DTA_VirtualWidth, screen_width, DTA_VirtualHeight, screen_height, DTA_KeepRatio, true, TAG_DONE); - ChatQueue.Pop(); - ChatQueue.Last() = 0; } if (players[consoleplayer].camera != NULL && @@ -301,7 +301,6 @@ static void CT_AddChar (int c) } CharLen++; } - ChatQueue.Push(0); } } @@ -316,10 +315,9 @@ static void CT_BackSpace () { if (CharLen) { - int endpos = ChatQueue.Size() - 2; + int endpos = ChatQueue.Size() - 1; while (endpos > 0 && ChatQueue[endpos] >= 0x80 && ChatQueue[endpos] < 0xc0) endpos--; - ChatQueue[endpos] = 0; - ChatQueue.Clamp(endpos + 1); + ChatQueue.Clamp(endpos); CharLen--; } } @@ -333,12 +331,7 @@ static void CT_BackSpace () static void CT_ClearChatMessage () { - if (ChatQueue.Size() > 1) - { - ChatQueue.Clamp(1); - ChatQueue[0] = 0; - CharLen = 0; - } + ChatQueue.Clear(); } //=========================================================================== diff --git a/src/utility/zstring.h b/src/utility/zstring.h index 4c3a3b5413..35e7be7003 100644 --- a/src/utility/zstring.h +++ b/src/utility/zstring.h @@ -131,6 +131,8 @@ 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); From 2874a36fbe844e1f7ca244227b2a0663465889ba Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 23 Feb 2019 10:40:07 +0100 Subject: [PATCH 88/95] - added the final missing piece of localization support, i.e. forcing text based menus. Now a localization mod can disable the graphics patches containing text entirely so that it can properly localize the text based menu variant. If this flag gets set in MAPINFO, it will override all user settings. --- src/gamedata/gi.cpp | 1 + src/gamedata/gi.h | 1 + src/gamedata/textures/texturemanager.cpp | 2 +- src/menu/menu.cpp | 31 +++++++++++++++--------- wadsrc/static/menudef.txt | 3 ++- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/gamedata/gi.cpp b/src/gamedata/gi.cpp index 07a46147ea..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") diff --git a/src/gamedata/gi.h b/src/gamedata/gi.h index 4f27a6969b..c9ffa40f8e 100644 --- a/src/gamedata/gi.h +++ b/src/gamedata/gi.h @@ -119,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/textures/texturemanager.cpp b/src/gamedata/textures/texturemanager.cpp index 5f8465eead..ff451dd172 100644 --- a/src/gamedata/textures/texturemanager.cpp +++ b/src/gamedata/textures/texturemanager.cpp @@ -421,8 +421,8 @@ bool FTextureManager::OkForLocalization(FTextureID texnum, const char *substitut 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; - if (cl_localizationmode == 1) return false; uint32_t langtable = 0; if (*substitute == '$') substitute = GStrings.GetString(substitute+1, &langtable); diff --git a/src/menu/menu.cpp b/src/menu/menu.cpp index 7106443d0f..03b66986d1 100644 --- a/src/menu/menu.cpp +++ b/src/menu/menu.cpp @@ -414,23 +414,30 @@ void M_SetMenu(FName menu, int param) switch (menu) { case NAME_Mainmenu: - if (gameinfo.gametype & GAME_DoomStrifeChex) + if (gameinfo.gametype & GAME_DoomStrifeChex) // Raven's games always used text based menus { - // 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_Playerclassmenu); - if (desc != nullptr) + if (gameinfo.forcetextinmenus) // If text is forced, this overrides any check. { - if ((*desc)->IsKindOf(RUNTIME_CLASS(DListMenuDescriptor))) + 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) { - DListMenuDescriptor *ld = static_cast(*desc); - if (ld->mFromEngine && cl_localizationmode != 0) + if ((*desc)->IsKindOf(RUNTIME_CLASS(DListMenuDescriptor))) { - // 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")) + DListMenuDescriptor *ld = static_cast(*desc); + if (ld->mFromEngine && cl_localizationmode != 0) { - menu = NAME_MainmenuTextOnly; + // 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; + } } } } diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 389f9a54ac..1f073bf725 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -128,7 +128,8 @@ LISTMENU "MainMenuTextOnly" TextItem "$MNU_NEWGAME", "n", "PlayerclassMenu" TextItem "$MNU_OPTIONS", "o", "OptionsMenu" - TextItem "$MNU_GAMEFILES", "g", "GameFilesMenu" + TextItem "$MNU_LOADGAME", "l", "LoadGameMenu" + TextItem "$MNU_SAVEGAME", "s", "SaveGameMenu" IfOption(ReadThis) { TextItem "$MNU_INFO", "i", "ReadThisMenu" From b542d1371dd9edf476d13eab3e9d1cf7751e0f9c Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 23 Feb 2019 12:08:27 +0100 Subject: [PATCH 89/95] - reorganized the ZScript content in gzdoom.pk3 and changed the files' extensions to something unique for easier syntax highlighting. --- wadsrc/static/zscript.txt | 512 +++++++++--------- .../{actor_actions.txt => actors/actions.zs} | 0 .../zscript/{actor.txt => actors/actor.zs} | 0 .../{actor_attacks.txt => actors/attacks.zs} | 0 .../{actor_checks.txt => actors/checks.zs} | 0 .../chexammo.txt => actors/chex/chexammo.zs} | 0 .../chex/chexdecorations.zs} | 0 .../chex/chexitems.zs} | 0 .../chexkeys.txt => actors/chex/chexkeys.zs} | 0 .../chex/chexmonsters.zs} | 0 .../chex/chexplayer.zs} | 0 .../chex/chexweapons.zs} | 0 .../doom/arachnotron.zs} | 0 .../archvile.txt => actors/doom/archvile.zs} | 0 .../doom/bossbrain.zs} | 0 .../bruiser.txt => actors/doom/bruiser.zs} | 0 .../doom/cacodemon.zs} | 0 .../doom/cyberdemon.zs} | 0 .../doom/deadthings.zs} | 0 .../{doom/demon.txt => actors/doom/demon.zs} | 0 .../doomammo.txt => actors/doom/doomammo.zs} | 0 .../doom/doomarmor.zs} | 0 .../doom/doomartifacts.zs} | 0 .../doom/doomdecorations.zs} | 0 .../doom/doomhealth.zs} | 0 .../doomimp.txt => actors/doom/doomimp.zs} | 0 .../doomkeys.txt => actors/doom/doomkeys.zs} | 0 .../doommisc.txt => actors/doom/doommisc.zs} | 0 .../doom/doomplayer.zs} | 0 .../doom/doomweapons.zs} | 0 .../{doom/fatso.txt => actors/doom/fatso.zs} | 0 .../{doom/keen.txt => actors/doom/keen.zs} | 0 .../lostsoul.txt => actors/doom/lostsoul.zs} | 0 .../doom/painelemental.zs} | 0 .../doom/possessed.zs} | 0 .../revenant.txt => actors/doom/revenant.zs} | 0 .../doom/scriptedmarine.zs} | 0 .../doom/spidermaster.zs} | 0 .../doom/stealthmonsters.zs} | 0 .../doom/weaponbfg.zs} | 0 .../doom/weaponchaingun.zs} | 0 .../doom/weaponchainsaw.zs} | 0 .../doom/weaponfist.zs} | 0 .../doom/weaponpistol.zs} | 0 .../doom/weaponplasma.zs} | 0 .../doom/weaponrlaunch.zs} | 0 .../doom/weaponshotgun.zs} | 0 .../doom/weaponssg.zs} | 0 .../beast.txt => actors/heretic/beast.zs} | 0 .../chicken.txt => actors/heretic/chicken.zs} | 0 .../clink.txt => actors/heretic/clink.zs} | 0 .../dsparil.txt => actors/heretic/dsparil.zs} | 0 .../heretic/hereticammo.zs} | 0 .../heretic/hereticarmor.zs} | 0 .../heretic/hereticartifacts.zs} | 0 .../heretic/hereticdecorations.zs} | 0 .../heretic/hereticimp.zs} | 0 .../heretic/heretickeys.zs} | 0 .../heretic/hereticmisc.zs} | 0 .../heretic/hereticplayer.zs} | 0 .../heretic/ironlich.zs} | 0 .../knight.txt => actors/heretic/knight.zs} | 0 .../mummy.txt => actors/heretic/mummy.zs} | 0 .../snake.txt => actors/heretic/snake.zs} | 0 .../heretic/weaponblaster.zs} | 0 .../heretic/weaponcrossbow.zs} | 0 .../heretic/weapongauntlets.zs} | 0 .../heretic/weaponmace.zs} | 0 .../heretic/weaponphoenix.zs} | 0 .../heretic/weaponskullrod.zs} | 0 .../heretic/weaponstaff.zs} | 0 .../heretic/weaponwand.zs} | 0 .../wizard.txt => actors/heretic/wizard.zs} | 0 .../hexen/baseweapons.zs} | 0 .../{hexen/bats.txt => actors/hexen/bats.zs} | 0 .../bishop.txt => actors/hexen/bishop.zs} | 0 .../hexen/blastradius.zs} | 0 .../hexen/boostarmor.zs} | 0 .../centaur.txt => actors/hexen/centaur.zs} | 0 .../hexen/clericboss.zs} | 0 .../hexen/clericflame.zs} | 0 .../hexen/clericholy.zs} | 0 .../hexen/clericmace.zs} | 0 .../hexen/clericplayer.zs} | 0 .../hexen/clericstaff.zs} | 0 .../demons.txt => actors/hexen/demons.zs} | 0 .../dragon.txt => actors/hexen/dragon.zs} | 0 .../ettin.txt => actors/hexen/ettin.zs} | 0 .../hexen/fighteraxe.zs} | 0 .../hexen/fighterboss.zs} | 0 .../hexen/fighterfist.zs} | 0 .../hexen/fighterhammer.zs} | 0 .../hexen/fighterplayer.zs} | 0 .../hexen/fighterquietus.zs} | 0 .../hexen/firedemon.zs} | 0 .../flame.txt => actors/hexen/flame.zs} | 0 .../hexen/flechette.zs} | 0 .../flies.txt => actors/hexen/flies.zs} | 0 .../{hexen/fog.txt => actors/hexen/fog.zs} | 0 .../hexen/healingradius.zs} | 0 .../hexen/heresiarch.zs} | 0 .../hexen/hexenarmor.zs} | 0 .../hexen/hexendecorations.zs} | 0 .../hexen/hexenkeys.zs} | 0 .../hexen/hexenspecialdecs.zs} | 0 .../iceguy.txt => actors/hexen/iceguy.zs} | 0 .../korax.txt => actors/hexen/korax.zs} | 0 .../mageboss.txt => actors/hexen/mageboss.zs} | 0 .../magecone.txt => actors/hexen/magecone.zs} | 0 .../hexen/magelightning.zs} | 0 .../hexen/mageplayer.zs} | 0 .../hexen/magestaff.zs} | 0 .../magewand.txt => actors/hexen/magewand.zs} | 0 .../{hexen/mana.txt => actors/hexen/mana.zs} | 0 .../{hexen/pig.txt => actors/hexen/pig.zs} | 0 .../hexen/puzzleitems.zs} | 0 .../hexen/scriptprojectiles.zs} | 0 .../serpent.txt => actors/hexen/serpent.zs} | 0 .../hexen/speedboots.zs} | 0 .../spike.txt => actors/hexen/spike.zs} | 0 .../summon.txt => actors/hexen/summon.zs} | 0 .../hexen/teleportother.zs} | 0 .../wraith.txt => actors/hexen/wraith.zs} | 0 .../interaction.zs} | 0 .../ammo.txt => actors/inventory/ammo.zs} | 0 .../armor.txt => actors/inventory/armor.zs} | 0 .../health.txt => actors/inventory/health.zs} | 0 .../inventory/inv_misc.zs} | 0 .../inventory/inventory.zs} | 0 .../inventory/powerups.zs} | 0 .../inventory/stateprovider.zs} | 0 .../inventory/weaponpiece.zs} | 0 .../inventory/weapons.zs} | 0 .../inventory_util.zs} | 0 wadsrc/static/zscript/actors/morph.zs | 146 +++++ .../player.txt => actors/player/player.zs} | 0 .../player/player_cheat.zs} | 0 .../player/player_inventory.zs} | 0 .../player/player_morph.zs} | 146 ----- .../artiegg.txt => actors/raven/artiegg.zs} | 0 .../artitele.txt => actors/raven/artitele.zs} | 0 .../minotaur.txt => actors/raven/minotaur.zs} | 0 .../raven/ravenambient.zs} | 0 .../raven/ravenartifacts.zs} | 0 .../raven/ravenhealth.zs} | 0 .../blood.txt => actors/shared/blood.zs} | 0 .../shared/botstuff.zs} | 0 .../bridge.txt => actors/shared/bridge.zs} | 0 .../camera.txt => actors/shared/camera.zs} | 0 .../debris.txt => actors/shared/debris.zs} | 0 .../decal.txt => actors/shared/decal.zs} | 0 .../{shared/dog.txt => actors/shared/dog.zs} | 0 .../shared/dynlights.zs} | 0 .../shared/fastprojectile.zs} | 0 .../shared/fountain.zs} | 0 .../shared/hatetarget.zs} | 0 .../{shared/ice.txt => actors/shared/ice.zs} | 0 .../shared/itemeffects.zs} | 0 .../shared/mapmarker.zs} | 0 .../shared/movingcamera.zs} | 0 .../shared/randomspawner.zs} | 0 .../shared/secrettrigger.zs} | 0 .../shared/sectoraction.zs} | 0 .../shared/setcolor.zs} | 0 .../shared/sharedmisc.zs} | 0 .../skies.txt => actors/shared/skies.zs} | 0 .../shared/soundenvironment.zs} | 0 .../shared/soundsequence.zs} | 0 .../spark.txt => actors/shared/spark.zs} | 0 .../shared/specialspot.zs} | 0 .../shared/splashes.zs} | 0 .../shared/teleport.zs} | 0 .../shared/waterzone.zs} | 0 .../acolyte.txt => actors/strife/acolyte.zs} | 0 .../strife/alienspectres.zs} | 0 .../beggars.txt => actors/strife/beggars.zs} | 0 .../coin.txt => actors/strife/coin.zs} | 0 .../strife/crusader.zs} | 0 .../strife/entityboss.zs} | 0 .../strife/inquisitor.zs} | 0 .../klaxon.txt => actors/strife/klaxon.zs} | 0 .../strife/loremaster.zs} | 0 .../macil.txt => actors/strife/macil.zs} | 0 .../strife/merchants.zs} | 0 .../oracle.txt => actors/strife/oracle.zs} | 0 .../strife/peasants.zs} | 0 .../strife/programmer.zs} | 0 .../strife/questitems.zs} | 0 .../strife/ratbuddy.zs} | 0 .../reaver.txt => actors/strife/reaver.zs} | 0 .../rebels.txt => actors/strife/rebels.zs} | 0 .../strife/sentinel.zs} | 0 .../sigil.txt => actors/strife/sigil.zs} | 0 .../strife/spectral.zs} | 0 .../stalker.txt => actors/strife/stalker.zs} | 0 .../strife/strifeammo.zs} | 0 .../strife/strifearmor.zs} | 0 .../strife/strifebishop.zs} | 0 .../strife/strifefunctions.zs} | 0 .../strife/strifehumanoid.zs} | 0 .../strife/strifeitems.zs} | 0 .../strife/strifekeys.zs} | 0 .../strife/strifeplayer.zs} | 0 .../strife/strifestuff.zs} | 0 .../strife/strifeweapons.zs} | 0 .../strife/svelights.zs} | 0 .../strife/svestuff.zs} | 0 .../templar.txt => actors/strife/templar.zs} | 0 .../strife/thingstoblowup.zs} | 0 .../strife/weaponassault.zs} | 0 .../strife/weaponcrossbow.zs} | 0 .../strife/weapondagger.zs} | 0 .../strife/weaponflamer.zs} | 0 .../strife/weapongrenade.zs} | 0 .../strife/weaponmauler.zs} | 0 .../strife/weaponmissile.zs} | 0 .../zombie.txt => actors/strife/zombie.zs} | 0 wadsrc/static/zscript/{base.txt => base.zs} | 0 .../{compatibility.txt => compatibility.zs} | 0 .../zscript/{constants.txt => constants.zs} | 0 .../{destructible.txt => destructible.zs} | 0 .../zscript/{dynarrays.txt => dynarrays.zs} | 0 .../static/zscript/{events.txt => events.zs} | 0 ...mpatibility.txt => level_compatibility.zs} | 0 .../zscript/{mapdata.txt => mapdata.zs} | 0 .../{scriptutil.txt => scriptutil.zs} | 0 .../zscript/{sounddata.txt => sounddata.zs} | 0 .../menu/colorpickermenu.zs} | 0 .../menu/conversationmenu.zs} | 0 .../menu/joystickmenu.zs} | 0 .../listmenu.txt => ui/menu/listmenu.zs} | 0 .../menu/listmenuitems.zs} | 0 .../menu/loadsavemenu.zs} | 0 .../{menu/menu.txt => ui/menu/menu.zs} | 0 .../menu/menuitembase.zs} | 0 .../messagebox.txt => ui/menu/messagebox.zs} | 0 .../optionmenu.txt => ui/menu/optionmenu.zs} | 0 .../menu/optionmenuitems.zs} | 0 .../menu/playercontrols.zs} | 0 .../menu/playerdisplay.zs} | 0 .../playermenu.txt => ui/menu/playermenu.zs} | 0 .../readthis.txt => ui/menu/readthis.zs} | 0 .../reverbedit.txt => ui/menu/reverbedit.zs} | 0 .../menu/textentermenu.zs} | 0 .../statscreen/statscreen.zs} | 0 .../statscreen/statscreen_coop.zs} | 0 .../statscreen/statscreen_dm.zs} | 0 .../statscreen/statscreen_sp.zs} | 0 .../types.txt => ui/statscreen/types.zs} | 0 .../alt_hud.txt => ui/statusbar/alt_hud.zs} | 0 .../statusbar/doom_sbar.zs} | 0 .../statusbar/harm_sbar.zs} | 0 .../statusbar/heretic_sbar.zs} | 0 .../statusbar/hexen_sbar.zs} | 0 .../statusbar/sbarinfowrapper.zs} | 0 .../statusbar/statusbar.zs} | 0 .../statusbar/strife_sbar.zs} | 0 wadsrc/static/zscript/zscript_license.txt | 2 +- 258 files changed, 404 insertions(+), 402 deletions(-) rename wadsrc/static/zscript/{actor_actions.txt => actors/actions.zs} (100%) rename wadsrc/static/zscript/{actor.txt => actors/actor.zs} (100%) rename wadsrc/static/zscript/{actor_attacks.txt => actors/attacks.zs} (100%) rename wadsrc/static/zscript/{actor_checks.txt => actors/checks.zs} (100%) rename wadsrc/static/zscript/{chex/chexammo.txt => actors/chex/chexammo.zs} (100%) rename wadsrc/static/zscript/{chex/chexdecorations.txt => actors/chex/chexdecorations.zs} (100%) rename wadsrc/static/zscript/{chex/chexitems.txt => actors/chex/chexitems.zs} (100%) rename wadsrc/static/zscript/{chex/chexkeys.txt => actors/chex/chexkeys.zs} (100%) rename wadsrc/static/zscript/{chex/chexmonsters.txt => actors/chex/chexmonsters.zs} (100%) rename wadsrc/static/zscript/{chex/chexplayer.txt => actors/chex/chexplayer.zs} (100%) rename wadsrc/static/zscript/{chex/chexweapons.txt => actors/chex/chexweapons.zs} (100%) rename wadsrc/static/zscript/{doom/arachnotron.txt => actors/doom/arachnotron.zs} (100%) rename wadsrc/static/zscript/{doom/archvile.txt => actors/doom/archvile.zs} (100%) rename wadsrc/static/zscript/{doom/bossbrain.txt => actors/doom/bossbrain.zs} (100%) rename wadsrc/static/zscript/{doom/bruiser.txt => actors/doom/bruiser.zs} (100%) rename wadsrc/static/zscript/{doom/cacodemon.txt => actors/doom/cacodemon.zs} (100%) rename wadsrc/static/zscript/{doom/cyberdemon.txt => actors/doom/cyberdemon.zs} (100%) rename wadsrc/static/zscript/{doom/deadthings.txt => actors/doom/deadthings.zs} (100%) rename wadsrc/static/zscript/{doom/demon.txt => actors/doom/demon.zs} (100%) rename wadsrc/static/zscript/{doom/doomammo.txt => actors/doom/doomammo.zs} (100%) rename wadsrc/static/zscript/{doom/doomarmor.txt => actors/doom/doomarmor.zs} (100%) rename wadsrc/static/zscript/{doom/doomartifacts.txt => actors/doom/doomartifacts.zs} (100%) rename wadsrc/static/zscript/{doom/doomdecorations.txt => actors/doom/doomdecorations.zs} (100%) rename wadsrc/static/zscript/{doom/doomhealth.txt => actors/doom/doomhealth.zs} (100%) rename wadsrc/static/zscript/{doom/doomimp.txt => actors/doom/doomimp.zs} (100%) rename wadsrc/static/zscript/{doom/doomkeys.txt => actors/doom/doomkeys.zs} (100%) rename wadsrc/static/zscript/{doom/doommisc.txt => actors/doom/doommisc.zs} (100%) rename wadsrc/static/zscript/{doom/doomplayer.txt => actors/doom/doomplayer.zs} (100%) rename wadsrc/static/zscript/{doom/doomweapons.txt => actors/doom/doomweapons.zs} (100%) rename wadsrc/static/zscript/{doom/fatso.txt => actors/doom/fatso.zs} (100%) rename wadsrc/static/zscript/{doom/keen.txt => actors/doom/keen.zs} (100%) rename wadsrc/static/zscript/{doom/lostsoul.txt => actors/doom/lostsoul.zs} (100%) rename wadsrc/static/zscript/{doom/painelemental.txt => actors/doom/painelemental.zs} (100%) rename wadsrc/static/zscript/{doom/possessed.txt => actors/doom/possessed.zs} (100%) rename wadsrc/static/zscript/{doom/revenant.txt => actors/doom/revenant.zs} (100%) rename wadsrc/static/zscript/{doom/scriptedmarine.txt => actors/doom/scriptedmarine.zs} (100%) rename wadsrc/static/zscript/{doom/spidermaster.txt => actors/doom/spidermaster.zs} (100%) rename wadsrc/static/zscript/{doom/stealthmonsters.txt => actors/doom/stealthmonsters.zs} (100%) rename wadsrc/static/zscript/{doom/weaponbfg.txt => actors/doom/weaponbfg.zs} (100%) rename wadsrc/static/zscript/{doom/weaponchaingun.txt => actors/doom/weaponchaingun.zs} (100%) rename wadsrc/static/zscript/{doom/weaponchainsaw.txt => actors/doom/weaponchainsaw.zs} (100%) rename wadsrc/static/zscript/{doom/weaponfist.txt => actors/doom/weaponfist.zs} (100%) rename wadsrc/static/zscript/{doom/weaponpistol.txt => actors/doom/weaponpistol.zs} (100%) rename wadsrc/static/zscript/{doom/weaponplasma.txt => actors/doom/weaponplasma.zs} (100%) rename wadsrc/static/zscript/{doom/weaponrlaunch.txt => actors/doom/weaponrlaunch.zs} (100%) rename wadsrc/static/zscript/{doom/weaponshotgun.txt => actors/doom/weaponshotgun.zs} (100%) rename wadsrc/static/zscript/{doom/weaponssg.txt => actors/doom/weaponssg.zs} (100%) rename wadsrc/static/zscript/{heretic/beast.txt => actors/heretic/beast.zs} (100%) rename wadsrc/static/zscript/{heretic/chicken.txt => actors/heretic/chicken.zs} (100%) rename wadsrc/static/zscript/{heretic/clink.txt => actors/heretic/clink.zs} (100%) rename wadsrc/static/zscript/{heretic/dsparil.txt => actors/heretic/dsparil.zs} (100%) rename wadsrc/static/zscript/{heretic/hereticammo.txt => actors/heretic/hereticammo.zs} (100%) rename wadsrc/static/zscript/{heretic/hereticarmor.txt => actors/heretic/hereticarmor.zs} (100%) rename wadsrc/static/zscript/{heretic/hereticartifacts.txt => actors/heretic/hereticartifacts.zs} (100%) rename wadsrc/static/zscript/{heretic/hereticdecorations.txt => actors/heretic/hereticdecorations.zs} (100%) rename wadsrc/static/zscript/{heretic/hereticimp.txt => actors/heretic/hereticimp.zs} (100%) rename wadsrc/static/zscript/{heretic/heretickeys.txt => actors/heretic/heretickeys.zs} (100%) rename wadsrc/static/zscript/{heretic/hereticmisc.txt => actors/heretic/hereticmisc.zs} (100%) rename wadsrc/static/zscript/{heretic/hereticplayer.txt => actors/heretic/hereticplayer.zs} (100%) rename wadsrc/static/zscript/{heretic/ironlich.txt => actors/heretic/ironlich.zs} (100%) rename wadsrc/static/zscript/{heretic/knight.txt => actors/heretic/knight.zs} (100%) rename wadsrc/static/zscript/{heretic/mummy.txt => actors/heretic/mummy.zs} (100%) rename wadsrc/static/zscript/{heretic/snake.txt => actors/heretic/snake.zs} (100%) rename wadsrc/static/zscript/{heretic/weaponblaster.txt => actors/heretic/weaponblaster.zs} (100%) rename wadsrc/static/zscript/{heretic/weaponcrossbow.txt => actors/heretic/weaponcrossbow.zs} (100%) rename wadsrc/static/zscript/{heretic/weapongauntlets.txt => actors/heretic/weapongauntlets.zs} (100%) rename wadsrc/static/zscript/{heretic/weaponmace.txt => actors/heretic/weaponmace.zs} (100%) rename wadsrc/static/zscript/{heretic/weaponphoenix.txt => actors/heretic/weaponphoenix.zs} (100%) rename wadsrc/static/zscript/{heretic/weaponskullrod.txt => actors/heretic/weaponskullrod.zs} (100%) rename wadsrc/static/zscript/{heretic/weaponstaff.txt => actors/heretic/weaponstaff.zs} (100%) rename wadsrc/static/zscript/{heretic/weaponwand.txt => actors/heretic/weaponwand.zs} (100%) rename wadsrc/static/zscript/{heretic/wizard.txt => actors/heretic/wizard.zs} (100%) rename wadsrc/static/zscript/{hexen/baseweapons.txt => actors/hexen/baseweapons.zs} (100%) rename wadsrc/static/zscript/{hexen/bats.txt => actors/hexen/bats.zs} (100%) rename wadsrc/static/zscript/{hexen/bishop.txt => actors/hexen/bishop.zs} (100%) rename wadsrc/static/zscript/{hexen/blastradius.txt => actors/hexen/blastradius.zs} (100%) rename wadsrc/static/zscript/{hexen/boostarmor.txt => actors/hexen/boostarmor.zs} (100%) rename wadsrc/static/zscript/{hexen/centaur.txt => actors/hexen/centaur.zs} (100%) rename wadsrc/static/zscript/{hexen/clericboss.txt => actors/hexen/clericboss.zs} (100%) rename wadsrc/static/zscript/{hexen/clericflame.txt => actors/hexen/clericflame.zs} (100%) rename wadsrc/static/zscript/{hexen/clericholy.txt => actors/hexen/clericholy.zs} (100%) rename wadsrc/static/zscript/{hexen/clericmace.txt => actors/hexen/clericmace.zs} (100%) rename wadsrc/static/zscript/{hexen/clericplayer.txt => actors/hexen/clericplayer.zs} (100%) rename wadsrc/static/zscript/{hexen/clericstaff.txt => actors/hexen/clericstaff.zs} (100%) rename wadsrc/static/zscript/{hexen/demons.txt => actors/hexen/demons.zs} (100%) rename wadsrc/static/zscript/{hexen/dragon.txt => actors/hexen/dragon.zs} (100%) rename wadsrc/static/zscript/{hexen/ettin.txt => actors/hexen/ettin.zs} (100%) rename wadsrc/static/zscript/{hexen/fighteraxe.txt => actors/hexen/fighteraxe.zs} (100%) rename wadsrc/static/zscript/{hexen/fighterboss.txt => actors/hexen/fighterboss.zs} (100%) rename wadsrc/static/zscript/{hexen/fighterfist.txt => actors/hexen/fighterfist.zs} (100%) rename wadsrc/static/zscript/{hexen/fighterhammer.txt => actors/hexen/fighterhammer.zs} (100%) rename wadsrc/static/zscript/{hexen/fighterplayer.txt => actors/hexen/fighterplayer.zs} (100%) rename wadsrc/static/zscript/{hexen/fighterquietus.txt => actors/hexen/fighterquietus.zs} (100%) rename wadsrc/static/zscript/{hexen/firedemon.txt => actors/hexen/firedemon.zs} (100%) rename wadsrc/static/zscript/{hexen/flame.txt => actors/hexen/flame.zs} (100%) rename wadsrc/static/zscript/{hexen/flechette.txt => actors/hexen/flechette.zs} (100%) rename wadsrc/static/zscript/{hexen/flies.txt => actors/hexen/flies.zs} (100%) rename wadsrc/static/zscript/{hexen/fog.txt => actors/hexen/fog.zs} (100%) rename wadsrc/static/zscript/{hexen/healingradius.txt => actors/hexen/healingradius.zs} (100%) rename wadsrc/static/zscript/{hexen/heresiarch.txt => actors/hexen/heresiarch.zs} (100%) rename wadsrc/static/zscript/{hexen/hexenarmor.txt => actors/hexen/hexenarmor.zs} (100%) rename wadsrc/static/zscript/{hexen/hexendecorations.txt => actors/hexen/hexendecorations.zs} (100%) rename wadsrc/static/zscript/{hexen/hexenkeys.txt => actors/hexen/hexenkeys.zs} (100%) rename wadsrc/static/zscript/{hexen/hexenspecialdecs.txt => actors/hexen/hexenspecialdecs.zs} (100%) rename wadsrc/static/zscript/{hexen/iceguy.txt => actors/hexen/iceguy.zs} (100%) rename wadsrc/static/zscript/{hexen/korax.txt => actors/hexen/korax.zs} (100%) rename wadsrc/static/zscript/{hexen/mageboss.txt => actors/hexen/mageboss.zs} (100%) rename wadsrc/static/zscript/{hexen/magecone.txt => actors/hexen/magecone.zs} (100%) rename wadsrc/static/zscript/{hexen/magelightning.txt => actors/hexen/magelightning.zs} (100%) rename wadsrc/static/zscript/{hexen/mageplayer.txt => actors/hexen/mageplayer.zs} (100%) rename wadsrc/static/zscript/{hexen/magestaff.txt => actors/hexen/magestaff.zs} (100%) rename wadsrc/static/zscript/{hexen/magewand.txt => actors/hexen/magewand.zs} (100%) rename wadsrc/static/zscript/{hexen/mana.txt => actors/hexen/mana.zs} (100%) rename wadsrc/static/zscript/{hexen/pig.txt => actors/hexen/pig.zs} (100%) rename wadsrc/static/zscript/{hexen/puzzleitems.txt => actors/hexen/puzzleitems.zs} (100%) rename wadsrc/static/zscript/{hexen/scriptprojectiles.txt => actors/hexen/scriptprojectiles.zs} (100%) rename wadsrc/static/zscript/{hexen/serpent.txt => actors/hexen/serpent.zs} (100%) rename wadsrc/static/zscript/{hexen/speedboots.txt => actors/hexen/speedboots.zs} (100%) rename wadsrc/static/zscript/{hexen/spike.txt => actors/hexen/spike.zs} (100%) rename wadsrc/static/zscript/{hexen/summon.txt => actors/hexen/summon.zs} (100%) rename wadsrc/static/zscript/{hexen/teleportother.txt => actors/hexen/teleportother.zs} (100%) rename wadsrc/static/zscript/{hexen/wraith.txt => actors/hexen/wraith.zs} (100%) rename wadsrc/static/zscript/{actor_interaction.txt => actors/interaction.zs} (100%) rename wadsrc/static/zscript/{inventory/ammo.txt => actors/inventory/ammo.zs} (100%) rename wadsrc/static/zscript/{inventory/armor.txt => actors/inventory/armor.zs} (100%) rename wadsrc/static/zscript/{inventory/health.txt => actors/inventory/health.zs} (100%) rename wadsrc/static/zscript/{inventory/inv_misc.txt => actors/inventory/inv_misc.zs} (100%) rename wadsrc/static/zscript/{inventory/inventory.txt => actors/inventory/inventory.zs} (100%) rename wadsrc/static/zscript/{inventory/powerups.txt => actors/inventory/powerups.zs} (100%) rename wadsrc/static/zscript/{inventory/stateprovider.txt => actors/inventory/stateprovider.zs} (100%) rename wadsrc/static/zscript/{inventory/weaponpiece.txt => actors/inventory/weaponpiece.zs} (100%) rename wadsrc/static/zscript/{inventory/weapons.txt => actors/inventory/weapons.zs} (100%) rename wadsrc/static/zscript/{actor_inventory.txt => actors/inventory_util.zs} (100%) create mode 100644 wadsrc/static/zscript/actors/morph.zs rename wadsrc/static/zscript/{shared/player.txt => actors/player/player.zs} (100%) rename wadsrc/static/zscript/{shared/player_cheat.txt => actors/player/player_cheat.zs} (100%) rename wadsrc/static/zscript/{shared/player_inventory.txt => actors/player/player_inventory.zs} (100%) rename wadsrc/static/zscript/{shared/morph.txt => actors/player/player_morph.zs} (76%) rename wadsrc/static/zscript/{raven/artiegg.txt => actors/raven/artiegg.zs} (100%) rename wadsrc/static/zscript/{raven/artitele.txt => actors/raven/artitele.zs} (100%) rename wadsrc/static/zscript/{raven/minotaur.txt => actors/raven/minotaur.zs} (100%) rename wadsrc/static/zscript/{raven/ravenambient.txt => actors/raven/ravenambient.zs} (100%) rename wadsrc/static/zscript/{raven/ravenartifacts.txt => actors/raven/ravenartifacts.zs} (100%) rename wadsrc/static/zscript/{raven/ravenhealth.txt => actors/raven/ravenhealth.zs} (100%) rename wadsrc/static/zscript/{shared/blood.txt => actors/shared/blood.zs} (100%) rename wadsrc/static/zscript/{shared/botstuff.txt => actors/shared/botstuff.zs} (100%) rename wadsrc/static/zscript/{shared/bridge.txt => actors/shared/bridge.zs} (100%) rename wadsrc/static/zscript/{shared/camera.txt => actors/shared/camera.zs} (100%) rename wadsrc/static/zscript/{shared/debris.txt => actors/shared/debris.zs} (100%) rename wadsrc/static/zscript/{shared/decal.txt => actors/shared/decal.zs} (100%) rename wadsrc/static/zscript/{shared/dog.txt => actors/shared/dog.zs} (100%) rename wadsrc/static/zscript/{shared/dynlights.txt => actors/shared/dynlights.zs} (100%) rename wadsrc/static/zscript/{shared/fastprojectile.txt => actors/shared/fastprojectile.zs} (100%) rename wadsrc/static/zscript/{shared/fountain.txt => actors/shared/fountain.zs} (100%) rename wadsrc/static/zscript/{shared/hatetarget.txt => actors/shared/hatetarget.zs} (100%) rename wadsrc/static/zscript/{shared/ice.txt => actors/shared/ice.zs} (100%) rename wadsrc/static/zscript/{shared/itemeffects.txt => actors/shared/itemeffects.zs} (100%) rename wadsrc/static/zscript/{shared/mapmarker.txt => actors/shared/mapmarker.zs} (100%) rename wadsrc/static/zscript/{shared/movingcamera.txt => actors/shared/movingcamera.zs} (100%) rename wadsrc/static/zscript/{shared/randomspawner.txt => actors/shared/randomspawner.zs} (100%) rename wadsrc/static/zscript/{shared/secrettrigger.txt => actors/shared/secrettrigger.zs} (100%) rename wadsrc/static/zscript/{shared/sectoraction.txt => actors/shared/sectoraction.zs} (100%) rename wadsrc/static/zscript/{shared/setcolor.txt => actors/shared/setcolor.zs} (100%) rename wadsrc/static/zscript/{shared/sharedmisc.txt => actors/shared/sharedmisc.zs} (100%) rename wadsrc/static/zscript/{shared/skies.txt => actors/shared/skies.zs} (100%) rename wadsrc/static/zscript/{shared/soundenvironment.txt => actors/shared/soundenvironment.zs} (100%) rename wadsrc/static/zscript/{shared/soundsequence.txt => actors/shared/soundsequence.zs} (100%) rename wadsrc/static/zscript/{shared/spark.txt => actors/shared/spark.zs} (100%) rename wadsrc/static/zscript/{shared/specialspot.txt => actors/shared/specialspot.zs} (100%) rename wadsrc/static/zscript/{shared/splashes.txt => actors/shared/splashes.zs} (100%) rename wadsrc/static/zscript/{shared/teleport.txt => actors/shared/teleport.zs} (100%) rename wadsrc/static/zscript/{shared/waterzone.txt => actors/shared/waterzone.zs} (100%) rename wadsrc/static/zscript/{strife/acolyte.txt => actors/strife/acolyte.zs} (100%) rename wadsrc/static/zscript/{strife/alienspectres.txt => actors/strife/alienspectres.zs} (100%) rename wadsrc/static/zscript/{strife/beggars.txt => actors/strife/beggars.zs} (100%) rename wadsrc/static/zscript/{strife/coin.txt => actors/strife/coin.zs} (100%) rename wadsrc/static/zscript/{strife/crusader.txt => actors/strife/crusader.zs} (100%) rename wadsrc/static/zscript/{strife/entityboss.txt => actors/strife/entityboss.zs} (100%) rename wadsrc/static/zscript/{strife/inquisitor.txt => actors/strife/inquisitor.zs} (100%) rename wadsrc/static/zscript/{strife/klaxon.txt => actors/strife/klaxon.zs} (100%) rename wadsrc/static/zscript/{strife/loremaster.txt => actors/strife/loremaster.zs} (100%) rename wadsrc/static/zscript/{strife/macil.txt => actors/strife/macil.zs} (100%) rename wadsrc/static/zscript/{strife/merchants.txt => actors/strife/merchants.zs} (100%) rename wadsrc/static/zscript/{strife/oracle.txt => actors/strife/oracle.zs} (100%) rename wadsrc/static/zscript/{strife/peasants.txt => actors/strife/peasants.zs} (100%) rename wadsrc/static/zscript/{strife/programmer.txt => actors/strife/programmer.zs} (100%) rename wadsrc/static/zscript/{strife/questitems.txt => actors/strife/questitems.zs} (100%) rename wadsrc/static/zscript/{strife/ratbuddy.txt => actors/strife/ratbuddy.zs} (100%) rename wadsrc/static/zscript/{strife/reaver.txt => actors/strife/reaver.zs} (100%) rename wadsrc/static/zscript/{strife/rebels.txt => actors/strife/rebels.zs} (100%) rename wadsrc/static/zscript/{strife/sentinel.txt => actors/strife/sentinel.zs} (100%) rename wadsrc/static/zscript/{strife/sigil.txt => actors/strife/sigil.zs} (100%) rename wadsrc/static/zscript/{strife/spectral.txt => actors/strife/spectral.zs} (100%) rename wadsrc/static/zscript/{strife/stalker.txt => actors/strife/stalker.zs} (100%) rename wadsrc/static/zscript/{strife/strifeammo.txt => actors/strife/strifeammo.zs} (100%) rename wadsrc/static/zscript/{strife/strifearmor.txt => actors/strife/strifearmor.zs} (100%) rename wadsrc/static/zscript/{strife/strifebishop.txt => actors/strife/strifebishop.zs} (100%) rename wadsrc/static/zscript/{strife/strifefunctions.txt => actors/strife/strifefunctions.zs} (100%) rename wadsrc/static/zscript/{strife/strifehumanoid.txt => actors/strife/strifehumanoid.zs} (100%) rename wadsrc/static/zscript/{strife/strifeitems.txt => actors/strife/strifeitems.zs} (100%) rename wadsrc/static/zscript/{strife/strifekeys.txt => actors/strife/strifekeys.zs} (100%) rename wadsrc/static/zscript/{strife/strifeplayer.txt => actors/strife/strifeplayer.zs} (100%) rename wadsrc/static/zscript/{strife/strifestuff.txt => actors/strife/strifestuff.zs} (100%) rename wadsrc/static/zscript/{strife/strifeweapons.txt => actors/strife/strifeweapons.zs} (100%) rename wadsrc/static/zscript/{strife/svelights.txt => actors/strife/svelights.zs} (100%) rename wadsrc/static/zscript/{strife/svestuff.txt => actors/strife/svestuff.zs} (100%) rename wadsrc/static/zscript/{strife/templar.txt => actors/strife/templar.zs} (100%) rename wadsrc/static/zscript/{strife/thingstoblowup.txt => actors/strife/thingstoblowup.zs} (100%) rename wadsrc/static/zscript/{strife/weaponassault.txt => actors/strife/weaponassault.zs} (100%) rename wadsrc/static/zscript/{strife/weaponcrossbow.txt => actors/strife/weaponcrossbow.zs} (100%) rename wadsrc/static/zscript/{strife/weapondagger.txt => actors/strife/weapondagger.zs} (100%) rename wadsrc/static/zscript/{strife/weaponflamer.txt => actors/strife/weaponflamer.zs} (100%) rename wadsrc/static/zscript/{strife/weapongrenade.txt => actors/strife/weapongrenade.zs} (100%) rename wadsrc/static/zscript/{strife/weaponmauler.txt => actors/strife/weaponmauler.zs} (100%) rename wadsrc/static/zscript/{strife/weaponmissile.txt => actors/strife/weaponmissile.zs} (100%) rename wadsrc/static/zscript/{strife/zombie.txt => actors/strife/zombie.zs} (100%) rename wadsrc/static/zscript/{base.txt => base.zs} (100%) rename wadsrc/static/zscript/{compatibility.txt => compatibility.zs} (100%) rename wadsrc/static/zscript/{constants.txt => constants.zs} (100%) rename wadsrc/static/zscript/{destructible.txt => destructible.zs} (100%) mode change 100755 => 100644 rename wadsrc/static/zscript/{dynarrays.txt => dynarrays.zs} (100%) rename wadsrc/static/zscript/{events.txt => events.zs} (100%) mode change 100755 => 100644 rename wadsrc/static/zscript/{level_compatibility.txt => level_compatibility.zs} (100%) rename wadsrc/static/zscript/{mapdata.txt => mapdata.zs} (100%) rename wadsrc/static/zscript/scriptutil/{scriptutil.txt => scriptutil.zs} (100%) rename wadsrc/static/zscript/{sounddata.txt => sounddata.zs} (100%) rename wadsrc/static/zscript/{menu/colorpickermenu.txt => ui/menu/colorpickermenu.zs} (100%) rename wadsrc/static/zscript/{menu/conversationmenu.txt => ui/menu/conversationmenu.zs} (100%) rename wadsrc/static/zscript/{menu/joystickmenu.txt => ui/menu/joystickmenu.zs} (100%) rename wadsrc/static/zscript/{menu/listmenu.txt => ui/menu/listmenu.zs} (100%) rename wadsrc/static/zscript/{menu/listmenuitems.txt => ui/menu/listmenuitems.zs} (100%) rename wadsrc/static/zscript/{menu/loadsavemenu.txt => ui/menu/loadsavemenu.zs} (100%) rename wadsrc/static/zscript/{menu/menu.txt => ui/menu/menu.zs} (100%) rename wadsrc/static/zscript/{menu/menuitembase.txt => ui/menu/menuitembase.zs} (100%) rename wadsrc/static/zscript/{menu/messagebox.txt => ui/menu/messagebox.zs} (100%) rename wadsrc/static/zscript/{menu/optionmenu.txt => ui/menu/optionmenu.zs} (100%) rename wadsrc/static/zscript/{menu/optionmenuitems.txt => ui/menu/optionmenuitems.zs} (100%) rename wadsrc/static/zscript/{menu/playercontrols.txt => ui/menu/playercontrols.zs} (100%) rename wadsrc/static/zscript/{menu/playerdisplay.txt => ui/menu/playerdisplay.zs} (100%) rename wadsrc/static/zscript/{menu/playermenu.txt => ui/menu/playermenu.zs} (100%) rename wadsrc/static/zscript/{menu/readthis.txt => ui/menu/readthis.zs} (100%) rename wadsrc/static/zscript/{menu/reverbedit.txt => ui/menu/reverbedit.zs} (100%) rename wadsrc/static/zscript/{menu/textentermenu.txt => ui/menu/textentermenu.zs} (100%) rename wadsrc/static/zscript/{statscreen/statscreen.txt => ui/statscreen/statscreen.zs} (100%) rename wadsrc/static/zscript/{statscreen/statscreen_coop.txt => ui/statscreen/statscreen_coop.zs} (100%) rename wadsrc/static/zscript/{statscreen/statscreen_dm.txt => ui/statscreen/statscreen_dm.zs} (100%) rename wadsrc/static/zscript/{statscreen/statscreen_sp.txt => ui/statscreen/statscreen_sp.zs} (100%) rename wadsrc/static/zscript/{statscreen/types.txt => ui/statscreen/types.zs} (100%) rename wadsrc/static/zscript/{statusbar/alt_hud.txt => ui/statusbar/alt_hud.zs} (100%) rename wadsrc/static/zscript/{statusbar/doom_sbar.txt => ui/statusbar/doom_sbar.zs} (100%) rename wadsrc/static/zscript/{statusbar/harm_sbar.txt => ui/statusbar/harm_sbar.zs} (100%) rename wadsrc/static/zscript/{statusbar/heretic_sbar.txt => ui/statusbar/heretic_sbar.zs} (100%) rename wadsrc/static/zscript/{statusbar/hexen_sbar.txt => ui/statusbar/hexen_sbar.zs} (100%) rename wadsrc/static/zscript/{statusbar/sbarinfowrapper.txt => ui/statusbar/sbarinfowrapper.zs} (100%) rename wadsrc/static/zscript/{statusbar/statusbar.txt => ui/statusbar/statusbar.zs} (100%) rename wadsrc/static/zscript/{statusbar/strife_sbar.txt => ui/statusbar/strife_sbar.zs} (100%) 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 100% rename from wadsrc/static/zscript/base.txt rename to wadsrc/static/zscript/base.zs 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 100% rename from wadsrc/static/zscript/constants.txt rename to wadsrc/static/zscript/constants.zs 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 100% rename from wadsrc/static/zscript/menu/conversationmenu.txt rename to wadsrc/static/zscript/ui/menu/conversationmenu.zs 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 100% rename from wadsrc/static/zscript/menu/listmenuitems.txt rename to wadsrc/static/zscript/ui/menu/listmenuitems.zs diff --git a/wadsrc/static/zscript/menu/loadsavemenu.txt b/wadsrc/static/zscript/ui/menu/loadsavemenu.zs similarity index 100% rename from wadsrc/static/zscript/menu/loadsavemenu.txt rename to wadsrc/static/zscript/ui/menu/loadsavemenu.zs 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 100% rename from wadsrc/static/zscript/menu/optionmenu.txt rename to wadsrc/static/zscript/ui/menu/optionmenu.zs diff --git a/wadsrc/static/zscript/menu/optionmenuitems.txt b/wadsrc/static/zscript/ui/menu/optionmenuitems.zs similarity index 100% rename from wadsrc/static/zscript/menu/optionmenuitems.txt rename to wadsrc/static/zscript/ui/menu/optionmenuitems.zs diff --git a/wadsrc/static/zscript/menu/playercontrols.txt b/wadsrc/static/zscript/ui/menu/playercontrols.zs similarity index 100% rename from wadsrc/static/zscript/menu/playercontrols.txt rename to wadsrc/static/zscript/ui/menu/playercontrols.zs 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 100% rename from wadsrc/static/zscript/menu/reverbedit.txt rename to wadsrc/static/zscript/ui/menu/reverbedit.zs diff --git a/wadsrc/static/zscript/menu/textentermenu.txt b/wadsrc/static/zscript/ui/menu/textentermenu.zs similarity index 100% rename from wadsrc/static/zscript/menu/textentermenu.txt rename to wadsrc/static/zscript/ui/menu/textentermenu.zs diff --git a/wadsrc/static/zscript/statscreen/statscreen.txt b/wadsrc/static/zscript/ui/statscreen/statscreen.zs similarity index 100% rename from wadsrc/static/zscript/statscreen/statscreen.txt rename to wadsrc/static/zscript/ui/statscreen/statscreen.zs diff --git a/wadsrc/static/zscript/statscreen/statscreen_coop.txt b/wadsrc/static/zscript/ui/statscreen/statscreen_coop.zs similarity index 100% rename from wadsrc/static/zscript/statscreen/statscreen_coop.txt rename to wadsrc/static/zscript/ui/statscreen/statscreen_coop.zs diff --git a/wadsrc/static/zscript/statscreen/statscreen_dm.txt b/wadsrc/static/zscript/ui/statscreen/statscreen_dm.zs similarity index 100% rename from wadsrc/static/zscript/statscreen/statscreen_dm.txt rename to wadsrc/static/zscript/ui/statscreen/statscreen_dm.zs diff --git a/wadsrc/static/zscript/statscreen/statscreen_sp.txt b/wadsrc/static/zscript/ui/statscreen/statscreen_sp.zs similarity index 100% rename from wadsrc/static/zscript/statscreen/statscreen_sp.txt rename to wadsrc/static/zscript/ui/statscreen/statscreen_sp.zs diff --git a/wadsrc/static/zscript/statscreen/types.txt b/wadsrc/static/zscript/ui/statscreen/types.zs similarity index 100% rename from wadsrc/static/zscript/statscreen/types.txt rename to wadsrc/static/zscript/ui/statscreen/types.zs 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 From 6be073f5284e857d835e10714fff99f7567932c0 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 23 Feb 2019 13:07:43 +0100 Subject: [PATCH 90/95] - removed the XP warning from the CMake project. This now got even triggered in 64 bit and overall is mostly pointless, considering the extremely low user share of XP. --- CMakeLists.txt | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 94c79b1093..b75b27b5ff 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 ) From ef3e5ef01e0e1d12e354cc7cef59449743fff6fb Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 23 Feb 2019 15:21:54 +0100 Subject: [PATCH 91/95] - moved a few parts from g_level.cpp to better fitting places. --- src/g_dumpinfo.cpp | 55 +++++ src/g_level.cpp | 223 -------------------- src/g_levellocals.h | 51 ++++- src/p_saveg.cpp | 178 +++++++++++----- src/rendering/hwrenderer/utility/hw_cvars.h | 4 + src/scripting/vmthunks.cpp | 72 +++++++ 6 files changed, 309 insertions(+), 274 deletions(-) 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_level.cpp b/src/g_level.cpp index 991849e560..0d27c6d1a6 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1634,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()); -} - - //========================================================================== // // @@ -1735,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); - } -} - //========================================================================== // // @@ -1968,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; @@ -2322,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/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/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/vmthunks.cpp b/src/scripting/vmthunks.cpp index dfbf559f71..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); @@ -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) { From c3890342e69cd1609a818bbb7bfbc7bf83e51315 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 23 Feb 2019 18:08:57 +0100 Subject: [PATCH 92/95] - moved the 2D drawing code to its own directory under 'rendering'. --- src/CMakeLists.txt | 13 ++++++++----- src/{ => rendering/2D}/f_wipe.cpp | 0 src/{ => rendering/2D}/f_wipe.h | 0 src/{ => rendering/2D}/v_2ddrawer.cpp | 0 src/{ => rendering/2D}/v_2ddrawer.h | 0 src/{ => rendering/2D}/v_blend.cpp | 0 src/{ => rendering/2D}/v_draw.cpp | 0 src/{ => rendering/2D}/v_drawtext.cpp | 0 8 files changed, 8 insertions(+), 5 deletions(-) rename src/{ => rendering/2D}/f_wipe.cpp (100%) rename src/{ => rendering/2D}/f_wipe.h (100%) rename src/{ => rendering/2D}/v_2ddrawer.cpp (100%) rename src/{ => rendering/2D}/v_2ddrawer.h (100%) rename src/{ => rendering/2D}/v_blend.cpp (100%) rename src/{ => rendering/2D}/v_draw.cpp (100%) rename src/{ => rendering/2D}/v_drawtext.cpp (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index daeb50fe23..db6b79cdef 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -688,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 @@ -917,7 +918,6 @@ set (PCH_SOURCES dobjgc.cpp dobjtype.cpp doomstat.cpp - f_wipe.cpp g_cvars.cpp g_dumpinfo.cpp g_game.cpp @@ -961,10 +961,6 @@ set (PCH_SOURCES scriptutil.cpp st_stuff.cpp statistics.cpp - v_2ddrawer.cpp - v_drawtext.cpp - v_blend.cpp - v_draw.cpp v_framebuffer.cpp v_palette.cpp v_video.cpp @@ -1023,6 +1019,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 @@ -1344,6 +1345,7 @@ include_directories( . gamedata/textures gamedata/fonts rendering + rendering/2d sound sound/oplsynth sound/timidity @@ -1472,6 +1474,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/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_drawtext.cpp b/src/rendering/2D/v_drawtext.cpp similarity index 100% rename from src/v_drawtext.cpp rename to src/rendering/2D/v_drawtext.cpp From c5156d459875beb7364aef33b9ab9322fed2a166 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 23 Feb 2019 18:57:49 +0100 Subject: [PATCH 93/95] - moved around a few more files. --- src/CMakeLists.txt | 4 ++-- src/g_shared/a_dynlight.h | 2 +- src/{ => gamedata}/statistics.cpp | 0 src/{ => r_data}/cycler.cpp | 0 src/{ => r_data}/cycler.h | 0 src/{ => utility}/doomerrors.h | 0 6 files changed, 3 insertions(+), 3 deletions(-) rename src/{ => gamedata}/statistics.cpp (100%) rename src/{ => r_data}/cycler.cpp (100%) rename src/{ => r_data}/cycler.h (100%) rename src/{ => utility}/doomerrors.h (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index db6b79cdef..6244225caf 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -907,7 +907,6 @@ set (PCH_SOURCES c_expr.cpp c_functions.cpp ct_chat.cpp - cycler.cpp d_iwad.cpp d_main.cpp d_anonstats.cpp @@ -960,7 +959,6 @@ set (PCH_SOURCES serializer.cpp scriptutil.cpp st_stuff.cpp - statistics.cpp v_framebuffer.cpp v_palette.cpp v_video.cpp @@ -979,6 +977,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 @@ -1143,6 +1142,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 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/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/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/doomerrors.h b/src/utility/doomerrors.h similarity index 100% rename from src/doomerrors.h rename to src/utility/doomerrors.h From bae0094039fcb869f6a91b5ab28e689a2b7ea9fc Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 23 Feb 2019 19:44:00 +0100 Subject: [PATCH 94/95] - fixed the status bar string drawers which weren't UTF-8 capable yet. --- src/g_statusbar/sbarinfo.cpp | 21 +++++++++------------ src/g_statusbar/shared_sbar.cpp | 12 ++++++------ 2 files changed, 15 insertions(+), 18 deletions(-) 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/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; From 7098748e9e79db33cddeb6b96e071481ceb71264 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sat, 23 Feb 2019 13:51:17 -0500 Subject: [PATCH 95/95] - fix building on case sensitive systems --- src/rendering/{2D => 2d}/f_wipe.cpp | 0 src/rendering/{2D => 2d}/f_wipe.h | 0 src/rendering/{2D => 2d}/v_2ddrawer.cpp | 0 src/rendering/{2D => 2d}/v_2ddrawer.h | 0 src/rendering/{2D => 2d}/v_blend.cpp | 0 src/rendering/{2D => 2d}/v_draw.cpp | 0 src/rendering/{2D => 2d}/v_drawtext.cpp | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename src/rendering/{2D => 2d}/f_wipe.cpp (100%) rename src/rendering/{2D => 2d}/f_wipe.h (100%) rename src/rendering/{2D => 2d}/v_2ddrawer.cpp (100%) rename src/rendering/{2D => 2d}/v_2ddrawer.h (100%) rename src/rendering/{2D => 2d}/v_blend.cpp (100%) rename src/rendering/{2D => 2d}/v_draw.cpp (100%) rename src/rendering/{2D => 2d}/v_drawtext.cpp (100%) diff --git a/src/rendering/2D/f_wipe.cpp b/src/rendering/2d/f_wipe.cpp similarity index 100% rename from src/rendering/2D/f_wipe.cpp rename to src/rendering/2d/f_wipe.cpp diff --git a/src/rendering/2D/f_wipe.h b/src/rendering/2d/f_wipe.h similarity index 100% rename from src/rendering/2D/f_wipe.h rename to src/rendering/2d/f_wipe.h diff --git a/src/rendering/2D/v_2ddrawer.cpp b/src/rendering/2d/v_2ddrawer.cpp similarity index 100% rename from src/rendering/2D/v_2ddrawer.cpp rename to src/rendering/2d/v_2ddrawer.cpp diff --git a/src/rendering/2D/v_2ddrawer.h b/src/rendering/2d/v_2ddrawer.h similarity index 100% rename from src/rendering/2D/v_2ddrawer.h rename to src/rendering/2d/v_2ddrawer.h diff --git a/src/rendering/2D/v_blend.cpp b/src/rendering/2d/v_blend.cpp similarity index 100% rename from src/rendering/2D/v_blend.cpp rename to src/rendering/2d/v_blend.cpp diff --git a/src/rendering/2D/v_draw.cpp b/src/rendering/2d/v_draw.cpp similarity index 100% rename from src/rendering/2D/v_draw.cpp rename to src/rendering/2d/v_draw.cpp diff --git a/src/rendering/2D/v_drawtext.cpp b/src/rendering/2d/v_drawtext.cpp similarity index 100% rename from src/rendering/2D/v_drawtext.cpp rename to src/rendering/2d/v_drawtext.cpp