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 a2c758e0b..b6c723704 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 b6f0e7871..c9ff769b5 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 dbf98a17f..4643cd492 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 fc5e7ea8a..2fd41e94b 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 792ef06b3..1c479ba5a 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 54cb51ef1..7ad4b6ca7 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 9564bb5ac..505796396 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 c223a6bd0..469b3f668 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 4a73214ab..d4a67339c 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 54c055cb2..ca584a326 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 8cd666467..d8da4d434 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 653bc2d98..f171f33ac 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 ff17fd607..0eb8fe67d 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 334fbcb1f..2924de96d 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 dffdc8884..9b10ba2bb 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 7e8373532..d67b1d899 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 zcmZQ$U}a!n`2Sylfq_Adfq_Affq}t-fq}t^fq}t?fq{XEQD0yGKO?ig{uX`x{|v19 e`kVB(LRtFTL2@9mEg`djt&|1&a!WcB|uG3x8<{|5k}b`x>{ 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}Vr>U|=v{U|_IfU|?`(U|koRD_EG39Yk&1zFlAcKa{;~D^$@|m?Dtg&HCFwN}#3z0Eze>U;qFB 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 zcmd;J;9y{2U}Vr>U|=w0U|_IiU|{fKU|jQU|=XcW&OQuMbhRQ-9|csKi$Nty}dsLpdN-`a3|X Q81?n_nOVUG>+Amq008GD6aWAK 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}pdU4F(1VBL)TrTLuOOPX-2tPzDBuLXw0gN*?x*4O_J0M3LXIRF3v 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}pdU4F(1V69xtb2L=WP9|i`72nGg*6b1%{0tN<#8ju2ZeHi%9z^<>qdF$4# zTlMw9?2VhZZruW9Z`!p@e-o6wQGe?$7<;q+*3B?A+w}Ff@7CA<&&UKak_Alu2LQbT BBqO@I5= zt@`?4_GbO9Tem>j8}+y8Z-TNn?b^Bv#@@Jj>t>jmojdin@7CA<&&UKak_Alu2LOiS BB=!IR 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}pdU4F(1V69xtb2L=WP9|i`72nGg*1O^6%3q6$JG4 f!R#$tw{F`GWp9M2`p>|uufGu_hK1JG*Z&Uy{(~Gg literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0414.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/0414.lmp new file mode 100644 index 0000000000000000000000000000000000000000..ccbfbde85c3f8c58ff1ba8533a79feff674a4ff6 GIT binary patch literal 146 zcmd;N;9vj&9R>yl69xtbdjRxtUWfn8sJ zhrYi4c71&?d$ax){VhoBO;Glhom+Npg|c^U-n12@o{?2wf2aN~ef|GTjQaZeEFj`P E0CA!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}pdU4F(1VV+IBWdjS w)~#Fh^}*~dTeocA0cGp&-o9ful)Y=qc90f`nr)jmZGwt#-n@A$SPjBR0Ckfk+W-In 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}Vr>U|=w2U|_IkU|{fJU|@)3U|>jNU|=X>U|^_YU|?Wk(}#lpjO_aQ zyS8rKx>aBQKLdxpzW$c2Tek0ja<=O4-o9ful%v0E%XW}1u$C>`HgDRbuMcK#-n@A$ JND(8#Q~>H`Cjq9R&3C z!R(D&Hf`DrW$Wv20jc}X$f~cuY0D0%=*AuTo55^mef@3v`Yg=)`d|%AAhoPu@;?A- C8X_G4 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}pdU9R>ylV+IBWTLuOO4+aK?5C#T@1O^6%90mr43I+y-76t|eRwjLYef|GT ztRQNazW#qkHhujaJ9g~Q*Z$Yv%pzN(6HQ3l&w{M55-?C}bW~ds7a{d1R D>rEv- literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041C.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041C.lmp new file mode 100644 index 0000000000000000000000000000000000000000..5c3c3c88ddc89c3bc06e12e580a3101e225ccdb7 GIT binary patch literal 145 zcmd;NU}pdU9R>yla|Q+mX9flae+CAICqLc~DYHgDa!6{cq1qAf< s!R+nZw`|`IW$Wv21*rpzBeS<}-MW1TRL!O>n>KBRvO$XV_4WS)04mudi2wiq literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041E.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/041E.lmp new file mode 100644 index 0000000000000000000000000000000000000000..3a7a4a488004a6a597b5952a97fd35628183c66b GIT binary patch literal 124 zcmd;JU}pdU4F(1V0|o{LD+UGzHwFfVAO;48I0goWECvRK5(WkaCT4vQ_|M3yufJ=@ pE`9y~4D9;)yEbp#3}bKHslRh0R2;q1qAf< lA?)qjw{M5Cw?b5b#ZlN>w{PD8RkLZ!rcIlnY>0CG{{SrKBZ&Y2 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}pdU4F(1V69xtb2L=WP9|i`72nGg*BnAeC90mr4GLQmxeHi%9z^<>qU4P@o tt@`?4_9i6uM*WQ-b^jSy_4POI-3(FzVr_-7c5U6Ium7Ks8Kg-6KLEQ-AN&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}pdU4F(1V0|o{LD+UGzHwFfVAO;48I0goWTm}Y)8U_XiCT4vQ_|M3yufKE0 zE`9y~4D9;)yEbp#3}bKJymj+dsQ5;Gef^CfHZz!Jfl&V$nDzCy=<9>H+n}=g5U#$y G{(k_Kl_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}pdU4F(1V0|o{L3kC)T7X}7~00stz7zPH03sF}v#!Z_yZHBV9fK-6k%=-FUptQce{(k_;QXB>V 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}pdU4F(1VGX@3*Ck6%vKL!SdC>fA&7bZ0ipIE0ssI2 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}pdU0|o{L3kC)TCk6%v9|i`72nGg*6b1%{0tN<#8U_Z2HU(~wR!7Sef|Fo?E3opTlKesL_zG0Terf+H*VUzX){924v-p<89TP_ MfSREX7K51&0M5`S3IG5A 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}pdU9R>ylO9lo84+aK?5C#T@1O^6%ECvRKG6n{QCI$wEi6BKx`uh6%tYGp# z1GB#VW_^7Y2=$+VU0;9eHvMf|_4UE*?I579|DTanUw`XXgy`1o+o3Aps+slmw?hm9 KOM#7tS^@yY|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&9R>yl3kC)T7X}7~00stz7zPH03q z1qAfylQw9bGdjqW%I^OF!3#$H*eVjQVmuEQlkGK05X&tB>(^b 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}pdU0|o{L8wLgj4+aK?5C#T@1O^6%90mr43I+y-76t}}2@DJjb3h8&^DGUq@3mF&~)`1kW z>%+i*26lb@Eg+z;4`y%QzJ2=^C>x|`E0hfqhp{(r+O%a8R2*5&j_upGgVk{8>x0y6 U-wsm50aBu`uMgs|F@ZS$0ejgqoB#j- 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}pdU0|o{L3kC)T2L=WP9|i`72nGg*6b1%{0tN<#Dh39I76t}}UXVg&eGvH1 zz^t#oU0?q{1G~QdW{?Psy>;u>tx)#H&0Du_fwJ}Wx9M-v*ZjB+tyE QufKh_zW#p}CXh-00V#DRN&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}pdU69xtb2L=WP9|i`72nGg*6b1%{JO&1a3I+y-Mg|6kUIqq+nG6gJOF@d+ z^KW)^+@?YrR$ a!RCPt*bV|v@r|1{Z`urHgH`D3{|5j}8ZeUp 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}pdU4F(1V69xtb2L=WP9|i`72nGg*BnAeC90mr4Qjh|6eHi%9z^<>qdF$4# zTlMw9?2VhZZruW9>+5gR-=weqpNUmpf9ozdYcoimnMGfJ`)+;x|13-(v;G4Bxqu)# literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042D.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/042D.lmp new file mode 100644 index 0000000000000000000000000000000000000000..fc193a5305bcea7d5bbc885c825a6ccdc0a0ad53 GIT binary patch literal 131 zcmd;JU}pdU4F(1VQw9bGM+OE4Uj_z-NCpOmR0alyLIwtgYLEgZeSLj>RxtUWfn8sJ zhrYi4c71&?d$ax){VhoBO;Glhom+Npg|c^U-n12@o{?2wf9LjH`uhKwm_bJB{|5jV C3L(w_ 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}pdU69xtb2L=WP9|i`72nGg*6b1%{JO&1aDh39IHU%+i*26lb@?I5794`y%Nw0YBJC|h5DGf3TkMpk|OU7L47MR#r93TJQJslRh0R2;Y5UKy4 zfn8sJyT1O`t@;r5CjE^YVeF0i8+YhK#W(KS2+{ynzj5nkxcco|H}Bd3RRdB0QV#$n C?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`1jw1fq}t?fq@}}fq@~0fq@}~fq@~1fq|iffq|ihfq|igfq|iifq`KP o0|Ubx1_p*D3=9lw7#J9~FfcGMFzbWBe-OP 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 9b10ba2bb..0b4ebd9a0 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 000000000..d43087eeb --- /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 2fd41e94b..95c2e754e 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 6fd7070ec..87359c958 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 a5780be75..18de98859 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 cd6b7b803..7b2e08b6a 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 18de98859..0e8daea0b 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 zcmd;P;ALQ7`19X{fq}uEfq@~Ifq@}|fq|ixfq`KX0|Ucy1_p*b3=9nC7#J8HFfcHD zWME)mW4m(Y`i<+?uU`Gn$b9|!^($9cIj&y4aqH%d8`rN~`Om;|_3F**moKw&T)%$% z=8fw&KnfXHu3fuv4J3Hu#;qIIu3o!-?b?3^mh0DHf;X>TzI^!_Oz`TJE38b{uiw1M z%>=dwr1Iu9kl?jzH*Rn<-MDe}>VF2_>tMrg+`4(|*3Fw>k*im)gTRgJ*RO-EVC1=a f_1ZNM^ZK>xSFc?8&%|}*%GIk^uY!mxSN;P4ijtMM 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 zcmd;P;ALQ7`19X{fq}u9fq@}}fq@~7fq|idfq|imfq`Kj0|Ubr1_p+c3=9l+7#JAd zF)%PNab3N7a^*h*@0BYc{*CL`uidx~ z5xIKx`n9Xqu3x)$^%_JC`;8mduU@`-{pwY2rfb)(Uj5I&eEs^3D_2;Uu3o))lbh-K zb+FjAYalU*6c_W=tJgv1GhexK{pwW~&TH3hT)lGT>h-IaFaKv`x^d&`RThqG*RF#c f0ucgP#ln8&%C&3Pu0ceuT)BLimG$!Ft6)9=;`@=? literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0412.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0412.lmp new file mode 100644 index 0000000000000000000000000000000000000000..a57ec1014b69d45654c5f51e853e905cb17bf3f6 GIT binary patch literal 260 zcmd;K;ALQ7`19X_fq}t=fq@~Efq@~Nfq|itfq|i$fq`KG0|UcW1_p-X3=9l685kH| zF)%RvVqjokWV(F$`gI=0D_5@kXXLqd?bgkkH*em!dF$r&t5^Rs@Lsuc2M8#lmK bf&`ejFJHcL^~z`*FaHMsGya*% 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 zcmd;K;ALQ7`19X_fq}t}fq}t?fq@~8fq|ibfq|ikfq`KP0|Ub{1_p*L3=9l=7#J9i zGB7ZlXJBApV7zkW%6|st8#k_9xx&qK^(u(Rd-LXv8#iv;ymb>qT)+OGf%nFZo7b*g z2Z3wXZeG0#7P)c#`t@sI(HqyUK}D`Xgsxo&i(J2c^UBq$AVaTQxdGC}eC^szkUdwf iT)zCDf%)3C>md7Bu3fuv6(qoV_3E|j*Ptx0zW)H_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 zcmWe&5MW?n`19X`fq@~Afq@~0fq@~Hfq|ihfq|iifq`Kz0|Uca1_p*b3=9mX85kJu zFfcH@Wnf_V$H2fK#K^#)#>l{6%E-XL&2sbRjT=|4{O4l3apU^+>sPN_`Om_0?b`Jl z*RNf@2I5}6{GXZY`t_SPZ{56c{ra_Q*ZwncU%w7keEs^3>sPP-XXLqd?Z&mMSFc{Z z1~TF5e+Fidz%@>mD_5>vzj6h}=VHEk^%_V$Nc!qkE@p^zj67GaT)T1e*6o`&uH69H z4>k{M*Y)c+u3fqEpONRrjawimfouf}@L#)j(^PBuUxry z^(q(h_3JmTUj5I&cJ=CYu%(;OUGM|I# J8i-?aGz^%(_4H1e?x# z<;wM&ApUg_0WypC+O?ZEu3m$H>u`~4SFc{Xe(mZtkl_rx*RS8W4pwvJ%H=DUFC$rj bY%$1PS5e)?fW`F~K4iIaAaqSu_)3s|?u5dA3y?Xune@5o3S8v?7!OC>~`n7AE%vY~o zzjp0E1Iv{wH?D(J-neo7IwuQA?(*gT3@lf#-n@SGDl7BNo7XO1=482Y<@)ujSE1sU zFSByoym{@)l`Gf4X7FCScI(EqYd5c7yLJt%jFIR1^;TLVym9sFe+Hf_S8m+Ae(l({S=uivTS_39NcxO(H-wf|hqSFV7J z1KD!z@?|dO>(@bA8M&`tzj@=@jq5jV+yp6O;JteF=8bFDL3Ulge(myQu;DjB=0n85 kB3G}%lt3K7$aDEJ*s3d6E?>QR`SO1*=F69_T)zAt08{9s=>Px# literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0419.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0419.lmp new file mode 100644 index 0000000000000000000000000000000000000000..6076140729ed23d936384f5200fb2e4ad0117ae2 GIT binary patch literal 300 zcmd;M5MW?n`2XL5fq}t;fq@~Mfq@}|fq|ilfq|iifq`K$0|Ub*1_p)`3=9l+85kJe zGcYhPGBPj-Gcqu!FfuT(FkilW{p!{KEL_*F-MV@6=8ao7Z(P0lpPA>%l^Zv&U%PhW z`t@rdd1l^g*KXdp4hGk*UAuDSKQr(3>o=}n14D=!M#igGuQKyqzI^rS)hl3d^~SYp z{~4ICU%z?%Ixq8;DL^DFcI`g{@0BYzZ`{0j^X9Faw{G2rirl(({o3{G z*RNdzk^dQZuU@@VgsyMFx|82@MFy><;Gb>qhM>o=~0G%@g9zI^@0b&vo=4al79 z*Kgdsb_EPBU%mRDndREGo7b;g;bpvX<;s6%)~i>qgSh`$Sg&2Xar4^c%Sd7fwII`( zc&=W(4zdem!%eW0K$>sdxN+?o#99AA4!Cmd2G|WZKn}h3pON?SsPM8EWLjH=8bDNuHU$M<0iz?t5TKTLUxPI-*mH$j!*RS8ae(l<|>tHS; z_qA&`L8`7^yMFEJ)&C5vAZ^z!U*=%F3KF_<ec^DTwsxF d*RJ0Lxr>(lM(;` 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 zcmd;M;ALQ7`19X^fq}u7fq@~Ofq|irfq|i!fq`Kv0|Ucy1_p+$3=9m185kI@GB7Ya zXJBCX$-uzC&B(wY%gDgMzp_ z^ZNDc*REd!kx(@^u3x)$?K&8NM6O@I0g{B^t5+equ3x{)|)oUQdOafp{SFT*Sav4HgzWkq&dF#gYt5^Rsb6mT2^Tze-*REZ;@}G(8+O?b4uU)-%?J9`N$aD4T&Ffb# zU%qnf>h)`vFaKv?xq9`+t*ci#Sg%~UcK!O5EB_f-u3fu%^U4)YmaA830%E;)hk#20|5L3cQyb3 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0423.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0423.lmp new file mode 100644 index 0000000000000000000000000000000000000000..e001cbf2bb641f5def6c42221d9aece86053639d GIT binary patch literal 232 zcmd;P5MW?n`2F96fq}t+fq@~Ifq@}|fq|i(fq`KP0|UcC1_p*T3=9mr85kJOFfcIO zW?*1oWWRp>+V$(#u3owFpMmqrm0QQ Z-n@SO#?2d7FN5USuU@@z?b=naS^&lGhSUH6 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0424.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0424.lmp new file mode 100644 index 0000000000000000000000000000000000000000..6cec8edb5e85e26d79295743a0e7ca97610516e4 GIT binary patch literal 416 zcmWe;5N2Rt`1?PEfq@~Gfq@~5fq|itfq|imfq`Kj0|Ubb1_p-x3=9m{7#JAdF)%Q& zF)}d7F)}ciF)}c?GBPlPGcqt_F)}bzGcquAF)}brXJlYtWx09t#*J&&{xfsjym{mL z^_#aq944-tH*ejze*N0DYuB$``_IU8<;ty_*RNf@diCnH>sPP-XJor}?beNJS1w=X zWW9X(%GGOEuKZ_Yy>{*9jVqTgbFo~$d6x_IZrim*`gM?b48kDgASYadf~(h1#6j-4cJ12LtJkhw zy>jJ0gYfn1H?D(}T)A@P@)a=S^5x6_nV7-mfn0G7zt5>i7XJEN@?e^6xSGbw3U%z(kKLhKH8@I1ty>f+%`TF%+ zAOW_UH*a0PcKzyAPL}J}Z(hH0(_5wzWkqo?dsKA*Kb_A oa)p!S>eXx4K|-w8uiv_Q4dkqAAQKr_u3iOM#m#i(%H_-d0m1)`6951J 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 zcmd;Q5MW?n`19X|fq}t?fq@~Kfq@~1fq|ipfq`KH0|Ub%1_p*z3=9lA85kH&GB7aQ zW?*1=%fP_E!pOiN!N|a%#K^$F$b9+o^{ZF^Gjd(KcI)QNn>TLVym9sFe+Hf_S8m+A ze(l<|>({P<({{WI#kW&%U7>ny#fYTZ(O_f zpNsj*6_9ZtTdrNc%*A~D`n4-p{xfo4zkc%u$S4qX?LPzW)vF-GuV23bvf}b(u;DjB zM&Gz`?FLv6NX?CFU>iZ=*RJt1UcP+!KO_I;%V7JiT)A@X+O?}!E?@r7#d_rmgvHH# L<;vB|m;VC*+bFO{ literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0427.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/0427.lmp new file mode 100644 index 0000000000000000000000000000000000000000..a6202e41d2221a1729206d2fc589b51f4758d35f GIT binary patch literal 252 zcmd;M;ALQ7`19X^fq}uDfq@~2fq@~Ofq@~Hfq|i#fq|iufq`Kn0|Uc+1_p-p3=9kh z85kHYGcYhbWnf_V#=yY9$aMMg_3Qr`*{)r?b@S%Ut5^Rsa9p`^(}6NmoHzvdiBbct2eG)`_IOF<;sn#SO0?yympO^`TBK` z4o2?l*KgjqcH{bu8#ix&OyIqG_2!LhAOk`8^5y>wyw|Va1Q`qBU%w6(xq20*l{+&d9)^&&a@F$H>6o&&a@#$jHD@%*epd%E-XL$b9+o^{ZF^GjdTLVym9sF)&C5J>1!dgI!)|6I&huG|2b&wTmvwab^en6F<4X=UWOe*NYR zu-P|nfCLzLuU-Y2e&fb<5QLh3^ZNB0U~v69Smf%}8`rLb-Ea+R%;n2qyRKZhat)*e zWF5#jkhd_byK&>j_3Jm`MuDsYnScETNGAg?Nbbh9Yhe38W`LXowhrV>u!kAB5!PL~ Ha^*h&sebe3 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 zcmWe*5MW?n`13!3fq@}|fq|idfq|imfq`KT0|Uc41_p)$3=9k>7#J9?GcYi`U|?YQ z#lXP8!^prO$H>5-&&a@F&d9*v#>l`B&d9)!$;iM^&B(woiIIU}86yM321W)3M&`?x zuV20TpOO38wOcoD-n?<^=8daYul{G?y>jKo&1=`LU%L(>u3Y)gzLx*RNj#nZm$(`SR7PSFeD<)f?BY{pVu7a^(ideCErSuU)>(#eDrb zNGl`H_3JlpfX%*n10=w}d-W>F^cy#>gCNxOo7b=30E6q-!6H|$-ne!h?1pPlV=i9? z+jZs2m1`g+AnQQJfxLxb-HjVJu3x_iHwt7O$o%U!Ksp(CL2@^)T?5+(G6Uo!uyr73 t-nf4CDnH}p%a{K%@*~-K?dsL5moNY4V!d+Z+O;c}FaPIezH$X50swI$2kHO- 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 zcmd;M;A3E5`1{|1fq}t|fq}t~fq@~Mfq@}|fq|i#fq|iqfq`Km0|Ucm1_p+M3=9nC z85kJuGcYi`VPIhR!N9=4$av+-mH&*)*REX$(Ja@mU%vrj@Laog?fT6dH*Vaxe(ma& zEB_hzE?>TO{rdIm*FYpx=*pFAH^Kbt*REf`232+a#=tXHmFyLRpJ<^KQyg_6wx 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 zcmWe;;A3E5`1?PEfq@~Kfq@~Lfq|ixfq|i)fq`KW0|Ubr1_p*h3=9kx7#J8HFfcH@ zWnf_V$-uzC%*epN&&a@_$jHE8%*ept%E-VF&d9)!$;iOK#B}-c)vN!RxUXHidGp4N z8#k_ByL#oye@5ObSFT^be*M}t5CIXncI_sZd;Qw=>({Pa`Om<2`SSG}*REc@cI_Gn zgSB10eC5iOD_21Zu7DJ=F<-rU^V&5YrfU%1wQDy(yzAGmT=~z&0^(i1%*}lHGMLYC z<;u0|Ab91o;%Q zx^?sB)vHifU%P(o+SMD^uipTRfP4XR?~NPRuU`j?fc$a&`t>U}Kpp{$T)uqcDiZh) GF&_ZvDb-^D literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042C.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defbigfont/042C.lmp new file mode 100644 index 0000000000000000000000000000000000000000..eee057f936ef250064492189a663ae068dc08953 GIT binary patch literal 231 zcmd;K;A3E5`1{|2fq}uEfq}uFfq@~Bfq|izfq|iofq`KL0|Ub{1_p*L3=9lM7#J8X zGB7aQWnf@nV!C|!>ec^D+}Ez%ym{lsjT_gmUA=PUKO^szE7z}Izkcl+h=7P(yLJ=I zy?*Wb^=ntI{Ab|1eEIr~YgeycyLJtP!P+igzH;Ttm8&2HS3ru`n6F;FdF>hx(=`b1 z+O-=X-u3HOuKZ_X0r4(h=4QTp8O-Ona^>1}5WI5bKRY{!bN%|&%a{LiuwJ=x?b@}= Hm;VC*l<{yT-|K<;wNzaN*0BS($I% zymt9AC(Gr_*REf?_Md^{+O=CZE?)zg2v^L=bN%|Q8#iv=xCYXE`SO1zuItxt-Mn!f nWX0vn|Cu?iUAqqBu&`abcJ12LtCuhTXJxr^<;s=Im;VC*c?^zX 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 zcmWe(;A3E5`1?PCfq@~Ofq|ibfq|ikfq`KP0|Ucy1_p+m3=9kh85kJOFfcIOWME); z!N9=qgMop8n~{M*mXU!$pOJyVfsuhBfRTYAiIIV!kdc9*j*)?ZiRtp?t5^Rs@m#xh z^X5$uzIpT3wQK(wd9Pf#e*N0@YuBz{zkco7l`H=ld9Pi&3F3hSu3x`$TLUxDGOwnd|!Xo7b;_>;Z9^xUXHi2~u_S+VyK!ul{Fb1!=o>`7$T#Rge(KA*>+1 zS1(`YV!3)1><~uQ>mZ{+A|O|TwOzRaHlLgM#to2LnOLt~1KZBcbmPXgYyX+pu3Q1> vxpIYz`O1}>SFiqO<^qdcyLSC1$RR8oAj7X;2YKW_E9>RUSFT>Ydi6g5efi@L 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 zcmd;O;ALQ7`19X}fq}t^fq@~Afq@~Jfq|iffq|iofq`Kr0|UcK1_p+`3=9nC85kHI zGB7ZFVqjokW@KRCVZ3tX%712-Yu9evympP7>FU*M*ZwoHUA=na`t|GAu5mGg1g`yO zoVu7T8Dy?psU1IyK`H?Lp0!p3&x%C#HU zu3owFpMm+>wHw#2v9nygdi@%VfBiZ;Gl+i;Vl@Nr)vGsd+`M)3=JjjWuOW=SaRcOn l8z4vgXXLqh_4@T|AU4S4t6=9`K?467882VH%mX6+0|4QpnY;i1 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 zcmZQ)U}s=p`1fChfq_Abfq}t@fq}t>fq}t;fq@}}fq@~Jfq{XUk(HJ8KNB-6s}w8i ze@0ezb}2B6ft{UQo>h@mo|W}Kh|Q|Vst8iaz|0B~V*yd@?Ee{TiKLFZ& B4FUiF 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 zcmZQ)U}s=p`1fChfq}u0fq}t+fq}t?fq@}{fq@~3fq@~5fq{X6i4_Ex*xA|H|1&VN zvdXivvVbTMmz|xRRgqPZm6i2B13NprJgXu|`adHpJG&IC6f5h0CT3PJ&CCc=0|2IK B4NL$4 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/00C4.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00C4.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/00C4.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00C4.lmp diff --git a/wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/00C5.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00C5.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/00C5.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00C5.lmp diff --git a/wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/00D6.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00D6.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/00D6.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00D6.lmp diff --git a/wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/00DC.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00DC.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/00DC.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00DC.lmp diff --git a/wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/00DF.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00DF.lmp similarity index 100% rename from wadsrc_extra/static/filter/game-raven/fonts/defsmallfont/00DF.lmp rename to wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/00DF.lmp diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0401.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0401.lmp new file mode 100644 index 0000000000000000000000000000000000000000..df10c490c79fd7de7edef5a41e6bd4261ebd4cef GIT binary patch literal 168 zcmd;N;A8*+9R>yl69xtbM+OE4e+CAISOx}$Yz78~N(Kgob_NE9sSFGZEX=H|?5wQ+ z892bSqP#4K!^z4j%PKD=Atnap39-wvO0i0SdF<@0tWvD9tWxak{~0(z+CXwrU^%cp gSqWANsGJBZyND1g*c4`vK2{bc5XH{O%F6m504>fC;{X5v literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0410.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0410.lmp new file mode 100644 index 0000000000000000000000000000000000000000..cc920087138daf00a522df2bc2928ac82feb5d82 GIT binary patch literal 148 zcmd;NU}s=p`1fCjfq}tylQw9bG2L=WPUj_z-C5``l~syWgjEVEF3TzpWwW#M%Sy4zvaSPm7SH9 zmGwUZJ1eWaysU%-l&vTxA|}Gl{vV`9mKCIq^*;kMD=S!@nUz%xq>h=DRRl`2v$FmN E073x{>Hq)$ literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0414.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0414.lmp new file mode 100644 index 0000000000000000000000000000000000000000..38227551b6029aea8f673875e62ab5a17a8564f6 GIT binary patch literal 163 zcmd;L;9y{2`1jv{fq}t-fq}u9fq}uFfq@~0fq@}|fq|iffq|isfq|iqfq`K*0|Nsq zGb;%EXJTVzWoH!=VP*Z#$j-{DC@(9<&&v9rfrFi0UP?ktj1|OTXJwUQWo4COXaCQ@ u&dx3iVuQpvSXt#|CB!7yK@uFStRf;pVql{fI9Nf(vVzS5S;fxE`X2yO2^19o literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0415.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0415.lmp new file mode 100644 index 0000000000000000000000000000000000000000..8daa85207fe4fd4b5347817ba7ba3309d038c23b GIT binary patch literal 148 zcmd;NU}s=p`1fCjfq}tiwLoTv@$WVv$L|Yg3SHTz`y_iE;13y 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 zcmd;KU}s=p`1jv}fq}u9fq@~2fq@~8fq@}|fq|ijfq|ipfq|imfq`KP0|Uc61_p*z z3=9lA85kHC8Ch9bSwX~q24+@Pd3JUdW_ET7R@VOv?Ck8a@~l!~?Ck#;S=rgeWW`un z|ASPrim|e@|7T!lWtEawl$QdlWn~o;5)tADt6*nm6=ManK%yXBAhSe-SVcf)fvgc? UWo2PzWfcM`Vq|A$X9W@e0ctTAGXMYp 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 zcmd;JU}s=p`1fCffq}u8fq}u5fq@~Afq@~Gfq@~Dfq|ivfq|i(fq{XMk(HH|6-4}J zU}9&NkYHwHXJ=<+;^${)|IfhA&Mw6&!79Yc`k#TFl~saOid6*47GsxX6@#jg5R(#< XU}gOeGDeJ5jFt626UY=65dS{_77q`) literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0418.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0418.lmp new file mode 100644 index 0000000000000000000000000000000000000000..6117f7f7b4eea4f24744c93171a167a3a283246d GIT binary patch literal 130 zcmd;JU}s=p`1fCffq}u0fq}t>fq}t;fq@}}fq@~Ofq@~Lfq|i%fq{XMg`J(1m6i2B z0~;%=tc0u-h{?{%Dj_5yCJSY=g7~bg{~6gpDrLc{*;!fT6_pj`p-Ln~gha&PNfq}t;fq@~Efq@~3fq@~9fq|ilfq{XEg`J(1m6i2B zBO5ELtc0u-h{?{*E+Hf$CeOfq}uDfq@~2fq@~0fq@~Nfq|izfq|i(fq{XQk(HJ8 zKNBk}D=WJ!E9-woHg5o_WulQtgMQ%QWC7J{~1_WSru7X!Gi4UitHfe{~6dJ e@?szb?5wO3Vj@EP?Ck#;S=rfHS=m`x{{sMe*AYno literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041C.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041C.lmp new file mode 100644 index 0000000000000000000000000000000000000000..4e565f4eee6534b9496d61d6f1a2696d0c57f2f9 GIT binary patch literal 142 zcmd;NU}s=p`1fCjfq}t{fq}t^fq}t~fq@~Cfq@~Bfq@~1fq|idfq|igfq{XM6$IE> zS^qPzv$D!dNr;I+*|K6HLj0_({~6iX*`>r-S=rhDGcmKW$_fenXJlh#m6ru+1nZKO am6G6RXaCQ@4pJ#10@ekRWoKn&{SN@TK@qk9 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041D.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/041D.lmp new file mode 100644 index 0000000000000000000000000000000000000000..82642cd4203a6796735c1ac37682cc60cc7cf71c GIT binary patch literal 132 zcmd;JU}s=p`1fCffq}t@fq}t}fq}t`fq@~6fq@~3fq@~9fq|ilfq{XM6$IE>S^qPz zv$D#|N{ETDvxC_ZVj@EPU~zVKR#pj+GO#!@TUJU|UJ} 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 zcmd;NU}s=p`1fCjfq}txwgcz93&MqM)BE-+m{-1%3l~n?yiWSV1f->1zS>*MLB+kgn$|@!T(#*un4zl7u06dQpKL7v# 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 zcmd;NU}s=p`1fCjfq}tt<(X{|_>fo&7%m%(@SM literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0423.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/0423.lmp new file mode 100644 index 0000000000000000000000000000000000000000..fdbb168c2c553eb260e2caabdea387b82e4c3af4 GIT binary patch literal 152 zcmd;N;9y{2`1fCjfq}t-fq}uDfq@~Mfq@}~fq|ibfq|ihfq|i&fq`KH0|NsC6FWOA zD=Q-_E9-v-W>!{ZR#p}W^`C)-on2O*m6es5l~o=j&B4klCLznpD$maTpAn=>LRL`< jB*6~WCm{x6v$3!F9u>Wv$Bdo3<7Ha>i`k|85jV5?Gft$ 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 zcmd;N;9y{2`1fCjfq}t{fq}t^fq}t~fq@~Cfq@}~fq|ibfq|ixfq|iufq{XM6$<_{ zu(PwvOUTMgu(JMVU}t5O5)qS-VrBi$$i~Xb%FZg!&JJO+vdThL$SW$!OR=;6XW(FG dmzRLPQ9p7{p{{ hWt9i(V`Y_a{ 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 zcmd;P;9y{2`1jw0fq}t}fq}t`fq@~6fq@~Bfq@~1fq|i%fq|ikfq|iqfq`K*0|Ucy z1_lO3RuEukW&O{<&dRDNDUm6Z??k`iNQ|If(I%F4>lD#Xvu{-2eJot>TiKLB{`7I6Ro literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042A.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/042A.lmp new file mode 100644 index 0000000000000000000000000000000000000000..82ead3bacd852a6adae1283827f197d34f977c36 GIT binary patch literal 135 zcmd;NU}s=p`1fCjfq}t@fq}t}fq}t`fq@~6fq@~Bfq@~1fq|i%fq|icfq{XMk(HJ8 zKLa}}s{|`6D?5}eD=#Y{24#y$h>3`>vi@geV`Y^EBRG?t9n2Jyl@(%T{m;b0$|}as M%KD#~i5+AR07hC7BLDyZ 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`1jw0fq}t+fq}t?fq@}{fq@~Jfq@~9fq|itfq|ikfq|iqfq`Kb0|Ub{ z1_lNOc2-t)Rxth#Vk^qaN{F$tg4tpcVj?1}tp6F=SXpJk2+m|@2Q$TFWrbK-|1+_$ hvWoFTb%9J{g|cO(WTjxHi3srvsk5_#O=g9F{{XN*7BBz+ 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`1fCffq}twiWzR#sUsf-~9K!Avn(Ss_-||4b~btYZAEtpAyr*x6ZG G{{sMuau10B 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 zcmd;JU}s=p`1fCffq}u8fq}uEfq}uBfq@~Mfq@~Jfq@~Pfq|itfq{XMk(HH|6-4}J zU}t5OXJus-V`cr%z|PJt%PPex0cNwZO0mkaO0ly;)gZ)0WF;ho*xCOxva+*_2#K(> O|7T)mXJ=(){SN@I?+=Lp 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`1jw0fq}t+fq}t?fq@}{fq@}~fq@~9fq|ilfq|iofq`KX0|Uc61_p)| z3=9km?5rRFBL9Qfit@7Zima^v8Q9s``8D~4M8IrTR#s*aR(4j_|BS4xtn%_=U{Pjf z2@!rxelVMrRf?6BRS3*xW)@>*Wffy*|IfhA%q$@#D 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 zcmd;JU}s=p`1fCffq}tCP;<6tb`ay1v@LN Un1q;!2-pyIc2-tac2?H^0OErWwg3PC literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/2014.lmp b/wadsrc_extra/static/filter/game-heretic/fonts/defsmallfont/2014.lmp new file mode 100644 index 0000000000000000000000000000000000000000..819abe2adc6aed1b226483ad2e625c89b3b10346 GIT binary patch literal 188 zcmd;QU}j)o`1{|5fq}t?fq@}}fq@~0fq@}~fq@~1fq|iffq|ihfq|igfq|iifq`KP z0|Ubx1_p*D3=9lw7#J9~FfcGMFtf6GBj%K9Gwv^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 zcmd;JU}0cj`1xOhfq}t*fq}t-fq}u1fq}t;fq}uFfq@~Mfq@}`fq{X6nVp@LmGwUZ tGb^hyJNthI7FJdXes=c%j7+Q`aYiPPJVY9#jD?j|OcTmrWo2jo4*-%y4WCFniVTpIaaP*w{gR|b!%3v_|L$ya^;3K%a*ZntXZ>Z z!@4!=KnfXHR;^mM3M9C0-NtpRR<2sJYSn)RmNjc&f*V#YTefT!OmO9j6|78a)@<0o z%>=dwq;kV5kl?CS>(+5Ity{Np<$ng=HDJTnZQQVN~Zo`^2t5&T7 zVX(-mRU6i=TC-}+nlQDEQ5%wSg~#m1gu;M5@F<7v0~M_b?d-Z bf&`ejmn~bda>X*Rh0B)xXJ>`*m;DC-oj!i- 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 zcmd;K;ALQ7`19X_fq}t}fq}t?fq@~8fq|ibfq|ikfq`KP0|Ub{1_p*L3=9l=7#J9i zGB7ZlXJBApU|g|c#eW9ob?a8GSi#M-awUkzyJ5q+b?eq`*th{itXcD)fp^`y4XakI z0fAMkHmqC;7FoAu&6-tU(RHgz6*Va3XoAVXKISO?O@ylT}3kUc9_ iEL--UfqB)cH6Z&~R;^mM5+uO7a^l{6%E-XL&9Y&`x^*j7{O4j@w{FdvH7i%F_|L+#YSo%` zYgVmX1>!DS_Me$+&6*7xHf~tAX3eTqtNt@_uUP|Dyk^b1H7i&CXXIJ6YTc@pD_5>u z1u|jfe+Fidz$#9b6)RS)S+N4f=VD&DaurBDNP6W;E@p^zj65q=tXj8Wfs z4>k{M*P1o!R;^g^pOI(Xx{V+wfouf}@UL36ZsjVl6TyZoTlSxkf5nPbD_4NQ$~9|N ctys3~KNI7M6)U({SFBhGlKIcg43_;50Pwn*T>t<8 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 zcmd;P;ALQ7`19X{fq}t}fq}t`fq@}{fq@}|fq|i#fq`KX0|Ubf1_p-R3=9ls7#J9C zGcYi)u&!LWYR#&ZEB`aIuUxri-MV#aR<8Wd#JO_ix(#bqtpm$2a)WrQR;=2vW+g}^ zBlDUy8&|DjV_&su&B_%kSFKp_pMiPh%8l#Ru`;g&so-Q;xpEE29FXvaHEURySFBjI zawQk@nl|RGM|HK J6^LSB004^0W@G>W 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 zcmWe;;ALQ7`13!6fq@~Bfq|irfq|ikfq`Kv0|Ubf1_p*L3=9nW7#JANGcYhbWME+U z%)r3F%E-VV&d9)^$jHE;%gDgsz{tQ5%*eoy!pOi-!pOkD$h2a`s#V-fYu2n>`JaJh z#fnwyR;}V(;DX$qrJrYQ>8G%svufokkl_rxYu2n=16H$Q#j+L4mLXYz bY%$1PD^cCWfW`F~K4e+3VkJ@#po9+qJHNDU 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 zcmd;L;ALQ7`19X@fq}uAfq}uFfq@}~fq|i#fq`K%0|Ubf1_p**3=9mX85kIDF)%PN zF|Js#f}3&W%9Z~anOCe>w`vtD)2dY~R&X(`T)Ae=e@5n&E7z@C$I7&3&8k(L%qv%} zS+(jv1IvmP>(+o&u3NWe4JQjoZrQT`3@j^GZdkK&B`foW4Xc(d<78Q}V$GVBE1}}c zma%ed*syBFiWRHCX7H|BwQ=35RU6i W#kw_XR)M(8U^lR_u2``W%m)B&e``4a 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 zcmd;M;ALQ7`19X^fq}t;fq@~Mfq@}|fq|ilfq|iifq`Kj0|Ub{1_p+$3=9lM85kI@ zGcYi`WME+U&A`CG!^ptE$h>UXnw2a6Gjgq3wQ<9S4eK^;ShsTJe+HfvE7omTvuf44 zHEULZ-tXj2h z&6-spd1l^Kt2V4#0|u*Bty;0-KQr%|HS5-_0z-%zM#hyZS2FW1TefoL$`xR+a^0#` z{~4Iqtl6+;4KMSG6(FM-m{+V=vuYK{;#JF*@iMPj12T<~am9)iEZl3>Y*@Ey-I{gl zHh^?8^R8UEVcn`VAUCX8vufEgu%#P7_CmzK&RDq;rUc?J7M^9xz_zbgv25kaWy}8a MGA~=UV%f6)01u#%=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 zcmd;O;ALQ7`19X}fq}t`fq@~0fq@~9fq|icfq`KX0|UcC1_p*T3=9l=7#JANF)%PZ zW?*3W%D}+D!pOkDz`ShPnw2ZLnO3e`wdy|u?}`;0)@|6ZVZ+7^8#iu(ifml9X4RTC zYgVlSk^dQZSFYT&YR#H;Yrp`iX3Ywat zwPxMQmH(NzSFT(K*1Brd$`vdAGw?23wqf0xm8;f(L|3g``JaJh#fo+7R<2~_Shj5C r8jw98LFN@J)~#B_&bDF&$Q2+FCXhj#EGt*8S_9^SWVo1DfGq?7sEvbm 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 zcmd;M;ALQ7`19X^fq}t|fq}uFfq@~4fq@~Nfq|infq|i!fq|iqfq`Kz0|Uc)1_p+M z3=9mH85kIzFfcHDVPIh3VO+Ip)qhTwRjW2`ShMCoJKKsC>o%-evuf3UR*qGxHmqB- zX3eUVEB`Zdty%?QuUWNX#j<7pnK;1QRVzUpMm7*<)yied{xh^}g21b0IK 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 zcmWe+;A3E5`1{|7fq@~Cfq@~5fq|ihfq|iqfq`Km0|Ub*1_p)$3=9mX7#J9?FfcIO zV_;x-1Jc33z`)PQz@Ws)z+l42z~IWrz`(@3Y}uNXD|s1Lty=Y;iD%WSjqBEJShr!r z#trM%tohH#yJE$f4eQpdTC-*q82@MFU9}1%wQk*-HS5-ZG%@fkTefE18jt`)4al4| zYu0U8wE_&5tz7w^nPt_g4Qp1c;ALE~V#R-E)|D&QfVlrzSXZrDw_(+?Wk_NOwII`( zcvh}l1F{Qb!v?UEK$_RBTeoTz#99AA4p^~j9oP-)Kn`8?pOJUjvQ-;aty!~X%_@j1 XnRu2hTeTAGpcN~?PGVZN4CWvJAfu!T 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 zcmd;M;ALQ7`19X^fq}u7fq@~8fq|ibfq|ikfq`KP0|Ub{1_p+83=9m17#J8XGcYhb zWnf_V&cMLH$;iMU#mKUXnw2Yg7+0)V@t=`r)vApfHf&h8VdI94>sGG(&%nE4 z#kvh^)~s2zX4RTCt5&W0&%nEC)rNH-=9*Qj)~o`nS+iyxSP59!iWUDEc$Y0(xpL)- zRcls&z_MlkS(#UXIR8Pmty;E>m3igLH7i!YEM2o^!@5=L)~wsGZUe;9l`A)_TeSuP xAeOFKvjOCWbzoOUjfiWML|D^_qauUN5R<;wp|Twsw^ dtJZ7)xr>p&b9)@939tXv5)7y#K!dF=oI 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 zcmd;M;ALQ7`19X^fq}u7fq@~Ofq|irfq|i!fq`Kv0|Ucy1_p+$3=9m185kI@GB7Ya zXJBCX$-uzC&B(wY%gDgMz`ShPnw2Yg7+0-Y^`C)v)v65}H*DCjZo|e68#k<30~T4g zVa=K~tJbUnkx(`3)~s5!Y7H2HMAocX2a<%~l`A2-)~s9s1iY8}{~WnkXQ zl@K1p)|D$atXZ{T!-kC@i@~;nMAktJT?J9IVg;DH4&ja!D z)~s5!Zq1ri8`i8@vu4$b75^CpSFPHxZp|tXAB0z}S+iore+Hpt%hs%0vuf3vRjXF6 zT(xS|%2go6Oafp{D^{#nu?#{iTlSxkW#vkcQM^nbwf`AeR;}8wYUN5E=2ffKfh=GJ z*|=)uN-mJPbs&fEu2=zb!>X05)~s0vvW|&+71#l*)~s6x@&FUpiWMLM5MH_RKQqUQ U6)Qn1KyF}VS+Qc}N{|~F04eI0ZU6uP 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 zcmd;P;ALQ7`19X{fq}uEfq}t?fq@~Kfq@~1fq|ipfq|i)fq`Km0|Ub*1_p*h3=9kx z85kH?*jBCDuyNg*l`H=)jo>_0Q(vSrKu F0|4GUVMPD{ literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0422.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0422.lmp new file mode 100644 index 0000000000000000000000000000000000000000..ad3289cfd3fa245c0c54facd76fd0e0a51a83261 GIT binary patch literal 214 zcmd;K;ALQ7`19X_fq}t^fq}t?fq@~Efq@~Jfq|ivfq|i&fq`Kr0|Ucq1_p+m3=9m1 z7#JANFfcGMu&!FQZr!>SEB-UEu3NWZ&8lU~{xh&_*syLTh{3#W-I^6ExS3Y1TDkH+ z1MiwOYu0U82LT(`tO1LxTC-}+npNx8tXj1JtY+1!RcpWkAjPXz{b%3>39MYXV&%$} lD_5-psbOBV3Ti6IT9#F-AeOPNT)7TnKPyP>$`vdA0|3~(V>|!= 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 zcmd;P5MW?n`19X{fq}t+fq@~Ifq@}|fq|i(fq`KP0|UcC1_p*T3=9mr85kJOFfcIO zW?*1oWM8vp)tWV{R<2m_pMi75ij8YFY*@Eu)ykDTjBD1c`Om<$V#S6v>()TUm^N$x zspDR;VjWo9npGf`%xl)H0tpMOSg~fsvSrIwu3EKb)v}H2RxMlhpPggHij`~DEZewd z#ftwNY%5l*S+i>0iWUDE8CR@W!NIy>#ky51mM#0wz_Vh-#uY18tXQ>X9mtIT3|uQ$ ZZdkKs-G+55mx1KjSFT*QYSl`xS^$U$Z)E@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 zcmWe;5N2Rt`1?PEfq@~Gfq@~5fq|itfq|imfq`Kj0|Ubb1_p-x3=9m{7#JAdF)%Q& zF)}d7F)}ciF)}c?GBPlPGcqt_F)}bzGcquAF)}brXJlYtW!bP{-MUq){xfrc7;83c z1aX+SHf-3qZq1rit5&U9wdy}3&x#crH>_E;a^=dEtJbVs`Ja(()vAr_R;^gJjFWZQ zvK1>=tyuA&k#*Io4eM4cTgJt*Y}pEsDkkO)8`dpb#?8EJ8Hmd$1X8eW!@4yaHmupO zX3d%n8#b<5^`Aj_#fmi>)~$hqRcqFO%wrG+DF-=W6%?#og(41e&#G0cR<2yNYUPR* z{~3hWtXa1Pq-4d470XtD8OxR}`_IG-HV@>ARUoIcu3Wic)k=snSFHm%oNd*rb!$LE zoGiiYSYRUE4Z1~tXZ|{KLhK!b(_|#T(N?SdCi)Q zAOW@w8#b<4wPxi?PL?%mHmq5(;y(k=x^)}YtXi{X)rJilR)GY#SFT*MW)(UXnw2a6Gjgq3wQ<9S4eK^;ShsTJe+HfvE7omT zvuf3Kp5&8ihE{xfo~S+ijs$S4rC>OTYT%9S9)*Q{9wvSQgXu;Cj( zMz349Y8_Y)NX@!cU>iZ=t5)$dE?c(jKO_ILWnlYOtXQ#X)vA>%mM#0w#kyhzgvHIg LV#Ug3%l-oZ1|*S% literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0427.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/0427.lmp new file mode 100644 index 0000000000000000000000000000000000000000..83ba773c4c04440017344e7dbba0d1f5fb8ad7f8 GIT binary patch literal 252 zcmd;M;ALQ7`19X^fq}uDfq@~2fq@~Ofq@~Hfq|i#fq|iufq`Kn0|Uc+1_p-p3=9kh z85kHYGcYhbWnf_V#=yY9$h2(Pnl=9!*;cLExM9PFl`H=Ke+AOk^o*|Pr(yld8M02vG7uUP{YS-BFXWEI$6 VMxJHMRzSeY70Z?_`_ID&A_0ngcxM0r 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 zcmWe(;ALQ7`13!4fq@}`fq|ibfq|ikfq`KP0|Ub{1_p*53=9kh7#JANGcYhbU|?YQ z#K6G7!pOiN#>l{+&d9)^&&a@F$H>6o&&a@#$jHD@%*epd%E-XL$h>UXnw2a6Gjgw5 zwQ<9S4eK^;ShsTJ%Kr?!D^{%AuxizsRck=RiWUDEcvr33ux1Nu?nOF zWF5#jkhd_bTeoiAnl&5XMuDsYnZIToNGAg?NN(M#Rbcx-W`LXowhrV>u!kAB5!S6( HvEn}fOo+)9 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 zcmWe*5MW?n`13!3fq@}|fq|idfq|imfq`KT0|Uc41_p)$3=9k>7#J9?GcYi`U|?YQ z#lXP8!^prO$H>5-&&a@F&d9*v#>l`B&d9)!$;iM^&B(woiIIU}86yM321W)3M&@P9 z)~sClpOJgjs*M{qY*@E(!@89#SN><8Xz`JVIhIMPeVAZNs zV39Rz)~#8!X5Fe)Yu2m+nZm%kY}v|{D_4NQ%5|$&{pVs{v0@#_eCB1#RxMk`#k^(> zNGl`Hnl&5Nfz95q4kW<9yK*JS^mXgjfFRWL4Qtk{1A{edz#=PGu3NPR?1oiPW0oxg z+qGiFid7&bAnQQJfxLxb-MV$_)~wk8Hwt7O$ow_yKsp(CL2~O>tpeKzG6Uo!uyr73 tu3NKmB|qb`Wy}6E@*~-~YURq6%a;A;VqLLf)v6WCmi^~uUa(;GXvufpv z75^FdmMvSgX3d&4t3V`FXvKi*|Pr}tSeTmTD5A~vi|^qCVAcf 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 zcmWe;;A3E5`1?PEfq@~Kfq@~Lfq|ixfq|i)fq`KW0|Ubr1_p*h3=9kx7#J8HFfcH@ zWnf_V$-uzC%*epN&&a@_$jHE8%*ept%E-VF&d9)!$;iOK#I$VL%9a0_xL2*(uwmW0 zb?erwTDfAye@5OFE7q)8vu4#Q5CIWcwQ2*HyJppzHLF&v_|L$%Y}uN1t5&XDwQ3az zgS9PNwqnJK6)QmsR)7?-F|S;?Vbv-grd1H$s#WViyftf9toYBy0^%)O#?8EJ8JN$p zV#TU8Ah=@1e|B~dXU&?G%a;A;U|q3d)v8s?mi>n~mzQzbvSt4nd6z9)vtix3H5=A# z+_+)G%9T)8uUfNe)yj2i)~o}IfPArL&8ija)~#8y1}p;d$C@>3R;&Yg1T3;_*}9cT I;6KEC0Ae+;K>z>% literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042C.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042C.lmp new file mode 100644 index 0000000000000000000000000000000000000000..52f56e394edddb34a9d3eabf31f917df35d52a12 GIT binary patch literal 231 zcmd;K;A3E5`1{|2fq}uEfq}uFfq@~Bfq|izfq|iofq`KL0|Ub{1_p*L3=9lM7#J8X zGB7aQWnf@nVp_Ir<;wp|+^be?*syNhx^-(-tz5CHY4S+i;th=7Q!TD1Yp zU9)PwrtJ1RV!DnTD1y-mn2A z$iT8<#kw^hmFw26S;NV^X3eUVEB`aFtX#Qa&B~RmOdB?=TE)q-V#S&@aN%XkSeZ9$ zShZ{!C(E*BtJbVq^`C)b)vAr_maPJr2v^L=vu4f4b?Y{)TLsd*Y}tP%t~F~mZdkVl nWW};&|Cu>fty%-)u&}LKwQAMMmCKg>XJuKjV#SJO%l-oZG{bfB literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042E.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defbigfont/042E.lmp new file mode 100644 index 0000000000000000000000000000000000000000..b83a2a43dfecff2399d3e074912f647260ed538b GIT binary patch literal 392 zcmWe(;A3E5`1?PCfq@~Ofq|ibfq|ikfq`KP0|Ucy1_p+m3=9kh85kJOFfcIOWME); z!N9=qgMop8n~{M*mXU!$pOJyVfsuhBfRTYAiIIV!kdc9*j*)?ZiD}ugl`H=<@vK_4 zVZ#Ox-mqcgs#X6Pc~`7hvu4$rRjbylS+i=@iWUDEc~`C40OElJ)~s2v;y(l5vSn-5 zty;Abq;4ft(XwSLR;*aDYTc?8E0(QTw(LI}^Qu+rR<8Wd%C>UlnssYdu2}J(g=5vK z4eQpeTLUtdnQP6O4Qp0`>;Z9^xL2*(08+Jb)tXf+SN>;Y1!-HgY#Ar(N{|r9A*>+1 zE0-<~uQH6WuwA|O|TwXIkIHlLe$-8zt4nOIk?0^82bv~Jz1RsWgTR;&Q& vS+RnPdButiD_8z!<^qeXTD4{a$RR8oAj8+J0eR#oNzh(_PGl;(mVl@Nr%9ZQZZP>VB!fq}t;fq@}}fq@~Jfq{XUk(HJ8KNB-6s|+ja ze@0ezb{Q~>ft{UQo>hTWo|W}Kh|Q|NssK{Sz|0B~V*yd@?Ee{TiKLFcv B4Fv!I literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00BB.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00BB.lmp new file mode 100644 index 0000000000000000000000000000000000000000..22c382b519fd51fd879f06fd1d866633be4aaa37 GIT binary patch literal 112 zcmZQ)U}s=p`1fChfq}u0fq}t+fq}t?fq@}{fq@~3fq@~5fq{X6i4_Ex*xA|H|1&VN zvdXivvVbTMmz|xRRe@E3m6i2B13NprJgWjo`adHpJG%_43@ht@CT3PJ&CCc=0|2I2 B4Nm|7 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0401.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0401.lmp new file mode 100644 index 0000000000000000000000000000000000000000..fb128a8f580eff9cc8425c1c9476e325596275d7 GIT binary patch literal 168 zcmd;N;A8*+9R>yl69xtbM+OE4e+CAISOx}$Yz78~N(Kgob_NE9sSFGZEX+zu%1TQA z892bSg1j7v!>Obsrz9^UB`FEzi7Lw}$tX#IdCJO4N-|1vN;1mI{~0(z+CXwLU^%cp gIVmM6sGPWxvbd-c*c4`vJ|z|=5XH`@q@?s80QFE9U;qFB literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0410.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0410.lmp new file mode 100644 index 0000000000000000000000000000000000000000..eef00efb780b7c9f6afb8ec88d7e7a142aff08dc GIT binary patch literal 148 zcmd;NU}s=p`1fCjfq}the+G7Tb_GdsNqHz+o}Hat2E=COU!!%1u$w+}!u!8_6J10mr068fVXaE2J 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 zcmd;N;A8*+9R>ylQw9bG2L=WPUj_z-C^D@aO7iiv_bN=kBU@@z`t931}{IoQ}_l;oAzq@XeqY%*+0 zGHh)B890@dWyF;vq+}$NmH#s^D=A4RDY399DTxcQv;SvgR904IWl~mFQu+@7rpOgU literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0412.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0412.lmp new file mode 100644 index 0000000000000000000000000000000000000000..a6a381d438a255fa7cc51fc5122d33db53c5b6d8 GIT binary patch literal 142 zcmd;NU}s=p`1fCjfq}t-fq}t=fq@}_fq@~0fq@}|fq|iffq|i(fq|iefq{X6T}g>U ziA{+^S@}N$yRx#3yo{8nlG1;WxQv9jqy$);jZKD4oK1#}4J fvHfRcQ&JL=lo3)^{?Ejsq{Id?gN0E^N$EcTU6U1L literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0413.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0413.lmp new file mode 100644 index 0000000000000000000000000000000000000000..036e8ab110cc2ebe2d286ebf1a6f102eb4803f3a GIT binary patch literal 120 zcmd;JU}s=p`1fCffq}tFE6cHg`TrR>l$7MjQ< fr8qhNGqQ1Vii@&?v@$Vqap24*ECd1Yl5W@Tk5Hn#r^?8?e=@@z7a931}{S(TL~t9KGaH*I$UsJAWo1?n@gD%(JsmXw literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0417.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0417.lmp new file mode 100644 index 0000000000000000000000000000000000000000..c8ec4da94140e116c5d009b40e1c135d676ed55a GIT binary patch literal 138 zcmd;JU}s=p`1fCffq}u8fq}u5fq@~Afq@~Gfq@~Dfq|ivfq|i(fq{XMQAtUO6-4}J zU{Y3=l4535R#s+Z5)x8Y{?EX!tSrMOr6kJ6_Md@WNlA)LhD}^a=|2NI8=EAD9GfHu g2Uv}iq>O}=lG1-hRwX3~B?%>^|4blLSir^t0N|$++yDRo 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 zcmd;JU}s=p`1fCffq}u0fq}t>fq}t;fq@}}fq@~Ofq@~Lfq|i%fq{XMMOm3miH+?) z1DlePoRpl5lG1+$b~ZLCQE>@5kTAQF5}UFTo0O8$e?~SXB_%dFuxfTCC3%Ja3i2@J T;-cb`Y;0g9Y)Z;(N=p9$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 zcmd;J;9y{2`2Synfq}u0fq}t>fq}t;fq@~Efq@~3fq@~9fq|ilfq{XEMOm3miH+?) zBb$@*C8hri9BgcIY|2V(GHh)B890=bgp`!nei9?A^ zN$EcWyRx!^jFf~pn60EFE-ERcp{)F$fsKt#iA_$4jqN`pD;t}fq}uDfq@~2fq@~0fq@~Nfq|izfq|i(fq{XQQAtVZ zKNBk(o075|8{2*c8~6I5_?@uqi7mD6=Vn f1lb|-l3+F)o0O!usF1Sqe@0eiWhFLcC8hrW1{)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 zcmd;NU}s=p`1fCjfq}t{fq}t^fq}t~fq@~Cfq@~Bfq@~1fq|idfq|igfq{XMRY{3W zNm)thKLfjxlDv$RggBVZ#wI5rE~?4K_MeeWSy@IxiA`DgKNB+>o1CcVe?~SXC3!hE iB{nv&E;%_FDIsO${|xLPmEz)HU94>vqdc6NDob{1xKb{P;CEXB?) g$I1Dhft{UQMowN1B+kgn&Mqkq(#*un39{lp0A1e_+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 zcmd;NU}s=p`1fCjfq}t4Lon0Oz&B4wtDJ93wF3-vNAEbd@N=`ur jB*6~WCnX7DvvG3D%gc$fv;SvgVP_WyF_@Ux!NvmsI~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 zcmd;K;9y{2`1jv}fq}uEfq}t;fq@~Ifq@~8fq@~Lfq|idfq|iwfq`KX0|Ucc1_p)| z3=9k#85kItnAq5qmH#ucC@IOwv9bMUU{g|3kd%^BQu@!p#>OVE#3seT@t=W1S(#0q zOQPKJ#Q SY>|XG8{2;-CS_$MrT+kqIvf-L 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 zcmd;NU}s=p`1fCjfq}uCfq}t|fq@~2fq@~8fq@}|fq|iffq|icfq|i)fq{XMk)55L z6-4}JU}k4mU}tAxW@ndTXaCQ@&dI4D&n_p<$@!mwot<4?L0(*#o&7%}D?2;83_Dl_ jJG+96q?{a>&B-Yz$}TJkVl%U|OF|3+YXF%JwSoZvo3|2m literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0426.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0426.lmp new file mode 100644 index 0000000000000000000000000000000000000000..a93b3f818680a218e90389713cd5cf74f044532c GIT binary patch literal 144 zcmd;N;9y{2`1fCjfq}t{fq}t^fq}t~fq@~Cfq@}~fq|ibfq|ixfq|iufq{XMRY{3W ziA_oAKLfk6vb>a>ycC$Nq$DFQDJ8?k_MefBjg3v2Ouxk`lX;92?tz26iPS tc?AV|84iyB3>?bJ@-kB5GLjq|{~6hpl$6<&M1_=<|FbeFD=RDi2LP8<71IC! literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0427.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0427.lmp new file mode 100644 index 0000000000000000000000000000000000000000..ecf50fa67b961583404e56ec1960dcc0fc8c447e GIT binary patch literal 119 zcmd;JU}s=p`1fCffq_Avfq}t-fq}t^fq}uBfq@~Efq@~Bfq@~Hfq{XMNlA%~?LPyH zva*~Eh{39)q#!S&r1YPWMM;TGo{jB4BP$yly8^qC(tieaB_(+U1$h}|<^K%q%F5yr RQj+3e6-r9VN^D9>{{g+>5#s;= literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0428.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0428.lmp new file mode 100644 index 0000000000000000000000000000000000000000..93d87c12448bee30f1ac80f0e677a5cfe001b6c9 GIT binary patch literal 160 zcmd;LU}s=p`1jv{fq}t_fq}t|fq@~2fq@~Gfq@}|fq|izfq|ipfq|imfq`Kf0|Nsi ztCA9%5}T6Je+G6XB?UPdDJd{pSy@3wN?eYO?LQ-%k`f!6lAN;ge?~TCWsnM}sFb)U sNHHTD8ylMvn>-sE*bF%tIT;yc<^K%qY;1B;;-WGf9RI<#D1&SP0290z8UO$Q 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 zcmd;P;9y{2`1jw0fq}t}fq}t`fq@~6fq@~Bfq@~1fq|i%fq|ikfq|iqfq`K*0|Ucy z1_lO3RwX4iC1p0Y{|xL(N(yo^Qc}vw{~6eol@(;9#O2u7{xh;EDY3CB$tfv;nIIKl zQDtQ*aZxF-C>xs+o02@#3^^G&85s_a{|p>#Y;scKqB4>k9RC^Fm6X_&*+hkumH)Fc KDJv^0{|5kk7#fZM literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042A.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042A.lmp new file mode 100644 index 0000000000000000000000000000000000000000..520a4c03be73b7383af086fd9e3013e2e183ce8f GIT binary patch literal 135 zcmd;NU}s=p`1fCjfq}t@fq}t}fq}t`fq@~6fq@~Bfq@~1fq|i%fq|icfq{XMQAtVZ zKLfjxk`$W~n=+Wq#wI5(Cndqg1{Rl)k`xzLQu@!xrlcgtrX}+fb@^Vs=V78Kyq?Dw%I2+r4Mm9D!IVCnZFjGlMj!j99 zg99uoDJv(cr1YPOMM+6gNJ;5G*fcgaB{r}LY;1BeaxyT}#6^Wf)s&UNwkWZIAlrWc Dhp-v5 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042C.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042C.lmp new file mode 100644 index 0000000000000000000000000000000000000000..8323fe38a2e0eb32c4d6827aeef8ced3b17d2a06 GIT binary patch literal 125 zcmd;JU}s=p`1fCffq}tW-!*#0xI TC@Dz@DJlJDW>QvGQu+@7=j{>! 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 zcmd;JU}s=p`1fCffq}u8fq}uEfq}uBfq@~Mfq@~Jfq@~Pfq|itfq{XMQAtUO6-4}J zU{_L-XH#O6WMli!z^<$;$0nmB1!gNL$*{?>$#8J|XJBVzlV_7*lTuOws~4A(k`h%` Y{?Ev&tSl}nuB`l@iCI~hO-boL07KXk-~a#s literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042E.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042E.lmp new file mode 100644 index 0000000000000000000000000000000000000000..bc793fc9f1540aa0071d10262a38ac628fa96003 GIT binary patch literal 176 zcmd;PU}s=p`1jw0fq}t+fq}t?fq@}{fq@}~fq@~9fq|ilfq|iofq`KX0|Uc61_p)| z3=9km?5wOTtSm|_tgQbT*jZQ<t!97;<68Cluc z<>e*W+5a=JGc!wx3u_32*{rNG?Ck8KU^X+eBs)91Bqt|Cjf|X(6gxXur?{vFJNtho LW=>9acJ}`O%61n> literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042F.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042F.lmp new file mode 100644 index 0000000000000000000000000000000000000000..efaf819f915949679fc7deb0ad112b7e5827c8ba GIT binary patch literal 132 zcmd;JU}s=p`1fCffq}t29y5*NEH{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 zcmZQ$U}a!n`2Sylfq_Anfq}uCfq}u1fq}uBfq@~Ifq{X6$=lo8n;A_0XJGaAe&YSa e+Z)URF(9l*Am)EYW^eCD-roP27`?r{{{sLa@)zv@ 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 new file mode 100644 index 0000000000000000000000000000000000000000..702b1afea7d75eb776f9e861ca9ecd895b4cc6ee GIT binary patch literal 145 zcmd;NU}pdU9R>yla|Q+mX9flae+CAIXa)v`GzJESA_fMAItB)YE|4NNZz%ZB!2bBL zxA&vR-rnB-8Q7mZ@qY9eB=Dbs-P_yy@e?qck~& 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 zcmd;LU}pdU0|o{Ldj|HUe1t|e5011MWL-aj) X{1~p!`^l3hAbpIiAltmX8U6zRw&5_R literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0411.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0411.lmp new file mode 100644 index 0000000000000000000000000000000000000000..06bf5548e1d1fe63577d535c2997e4c9007c22af GIT binary patch literal 147 zcmd;NU}pdU9R>yl3kC)T7X}7~00stz7zPH03yl3kC)T7X}7~00stz7%0wQU|=X=U|^^NDPs4Af&UEb-rkQMKYsk! u+Z)V&{N%|KINRIX8^L}IXFqxT1gxHs)!X}t_Y-gL|4fYD-rg)A;y(b^FDwE8 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}pdU4F(1V69xtb2L=WP9|i`72nGg*1O^6%3ylGX@3*M+OE4Uj_z-NCpOmR0alyLIwtgS_TG&c90@gZwUC$z~=4! v=<#E3Z}0yM?B3pwpCGY8JeaumWADdE>?d&c6Ocjw8Cbo&p)6*QfcJj@vJfp@ 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 zcmd;KU}pdU3kC)TR|W=#5C#T@1O^6%90mr4G6n{QCI$wEJ_ZJc84L^zOBfg!HZU+S z><4LJ^7i)jW(AY~8JNAjA9;JTFnfDH_V)hI!0zq+k 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}pdU4F(1V0|o{L8wLgj4+aK?5C#T@1O^6%90mr43I+xS7G?%-Z*PYG4D2A< x+xroe{mA=~_hTsgu{Q`p)PPtp@h6X;JbnUIMMW Q_I?5eATv2Y3LyAD0O7_u$^ZZW literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0419.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0419.lmp new file mode 100644 index 0000000000000000000000000000000000000000..5ddbda41d64c35eab82c23f48faf22af86be63d5 GIT binary patch literal 175 zcmd;L;ACK6U}P|0U|_IeU|{fIU|jOU|`5&U|^_XU|{HAU|^Waz`(Ewq>|km z2L3a$dwV~6{P^)>Z*MUB$&)8wHUkGl$>S&9-v2?I$KKu`w)cMqc5m+|FgB;Rw>L;V ZNb!G04iE=s7>Bp_6EFao3^fg`3;<>+J>>uZ literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041A.lmp new file mode 100644 index 0000000000000000000000000000000000000000..f6ee37371410e425e6ad17f7c6dd8b5fd077781e GIT binary patch literal 126 zcmd;JU}pdU4F(1V69xtb2L=WPA1DrIU|>jQU|`4xDPZ@8f&UEb-rkQMKYsk!+Z)V& k^5pT8Cm=Q(NXcVw5R={88>9lE#2cc78KlIU1w#D?09S%1^#A|> 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 zcmd;NU}pdU9R>yl69xtbI|c>@PX-2tPzDBucm@WBYz78~as~#5W(EcZ7G`e{_|L=& zq8@vD|7T?L_I~vE@e^|I@c5m;;AOK}Q0Rbo* Iq!^?V0A&X)+yDRo literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041C.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041C.lmp new file mode 100644 index 0000000000000000000000000000000000000000..7e2c112b453bc26c2d23a392d0494114c2dbbaac GIT binary patch literal 182 zcmd;KU}pdU3kC)T7X}7~00stz7zPH03N$B!R-dxP1JA3u5W1j>H$7_96+1Dm(EH<H@Q1Y$TJPfPlC6e*n^}Kk5Jg literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041D.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/041D.lmp new file mode 100644 index 0000000000000000000000000000000000000000..037c656868375824529d550f9ccab9937ffbf7d1 GIT binary patch literal 108 zcmd;NU}pdU9R>ylGX@3*Ck6%vKL!Sd2q+B_OJHDN0Le45dPBf}26k`nM~@#re(dcH eWyl3kC)T7X}7~00stz7zPH06b1%{0tN<#8U_Z24v->tZy5N`!0zq+ u=<(ynkG;LY?8i@@Jb40RLsb1|VD|Qg%frOjy}d!&VB#QcFntgu-v0rdG%&6J literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0420.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0420.lmp new file mode 100644 index 0000000000000000000000000000000000000000..61c450d9a3c2a081dfc0dd5acf1e1c704c00986a GIT binary patch literal 138 zcmd;N;9vj&9R>ylO9lo8HwFfVUo^EMouw 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}pdU9R>ylGX@3*M+OE4Uj_z-NCpOm3MFsHiX&R8zv0m0{}C% BD`)@! literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0422.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0422.lmp new file mode 100644 index 0000000000000000000000000000000000000000..eb69d5cd8068b8d6d1f1d3cb96d811cd8df7de42 GIT binary patch literal 122 zcmd;JU}pdU4F(1V0|o{LYX$}ecLoNAUk3e!D JbHFr2KLAtlDT4q2 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}pdU0|o{L3kC)TCk6%v9|i`72nGg*6b1%{0tN<#8U_Z2HU`0-=7_>;#^o}jB?_4a=97%U1h?Fq;< GnE3$7Z!ot2 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 zcmd;JU}pdU4F(1VQw9bG7X}7~00stzCY^SdX8;-gD6oJ?*%--H08l)B`#=rsB=lvhV0c!-S;sB}f_I~oj M+xtHY3xx9@0D0&(>i_@% 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 zcmd;NU}pdU9R>ylQw9bGdj>$-3W#0cm?8hJgQpxV^{R9M{Y>+CDSpZ&7D$W1^ literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0428.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/0428.lmp new file mode 100644 index 0000000000000000000000000000000000000000..3873853b4822ce1eb31f62f9d224987826d23831 GIT binary patch literal 198 zcmd;KU}pdU3kC)T7X}7~00stz7zPH03;h?E_lAN04D8}OzLI0Mqe?hOO~8Q8tOA3c8j__4P)nEm9*lP54XND+w5$OdA0gP6FKqbUKY$577U Y?F}{E`#%E*NC`;5+xtHY3xx9@0OVRq;s5{u literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042A.lmp new file mode 100644 index 0000000000000000000000000000000000000000..b51be20f25091de427822f4fd47f4ec1c9df7db1 GIT binary patch literal 160 zcmd;PU}pdU69xtb8wLgj7X}7~00stz7zPH03Nem1Ovp|ZO zy+PnV1GBgHBX95j4D8yl3kC)T7X}7~00stz7zPH0GzJES0tN<#Dh39ICXga_Zy5N`!0zq+ x=<(ynkG;LY>?cp2Jb|%6ia=~8R&Vde-k7W>U|r12-ri5Vz5lZ?dV72S2LN+0D#8E& literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042D.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042D.lmp new file mode 100644 index 0000000000000000000000000000000000000000..c0fd6ec5798fe9d89d5d10fbc8d75fef72df048b GIT binary patch literal 146 zcmd;NU}pdU9R>yl69xtb2L=WP9|i`72nGg*6b1%{0tN<#8U_Z24h9AW7G`e{_|L!& zqP)Eyd3%G|kGvmwKZdd&dxIcE9K^yV{^arF$4{W@y`MaJ;_dDIpOF<}ruTmU$h;T#3{hyHq;-LQk-atr& literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042F.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont/042F.lmp new file mode 100644 index 0000000000000000000000000000000000000000..5a18bb3930c6e0422b7616e6204f2069731bf333 GIT binary patch literal 150 zcmd;NU}pdU9R>yla|Q+mX9flae+CAIXa)v`GzJESA_fMAItB)YE(Qh$MmBFK_|L%Z z?d|=@`|)FMZ!r7OlgCe+;0Z}0yA D>^?E! 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`1jw1fq}t?fq@}}fq@~0fq@}~fq@~1fq|iffq|ihfq|igfq|iifq`KP t0|Ubx1_p*D3=9lw7#J9~FfcGMFnfc*e-QoH+Z!+a1S(G{?d|RT9{~E&HY@-D literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0410.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0410.lmp new file mode 100644 index 0000000000000000000000000000000000000000..44a9a6b11ebeebbd0f750914993546abf39a2355 GIT binary patch literal 96 zcmZQ)U}FFQ6$Sw}mqK|vtqe+E{FbjW{3R*(!x5&(c=672v0 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0411.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0411.lmp new file mode 100644 index 0000000000000000000000000000000000000000..f7c64829f8b526a59f8faf814f1d15ffb55d1ce6 GIT binary patch literal 107 zcmZQ)U}FFQ6$SylV+IBWI|c>@F9rsNPzDBuBnAeCTm}Y)3I+y-W(EcZ7N(Gp(9r*k zY=MD6!6Bjg`u`c&gMvV8eGr>1C`eylKLo^N0x?0#K^!)in*R(?CfE>tkYbP_tV|&0 Fe*iZE9kT!c literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0415.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0415.lmp new file mode 100644 index 0000000000000000000000000000000000000000..1b86650ee83d326bb803323599c58d2a5ba425fe GIT binary patch literal 89 zcmZQ$U}FFQ1qKENEd~Y#Qz&*|U|{eANw5Y51qKC&g#2eTp;1GuY3~UgV jKEr=TRtEi`V0{pag&{Bq#9&}y2nqxU|=v}U|_IiU|{fJU|jKU|`5%U|=W(sbCEX3JeMk3Hi^+ u24U&z|7Tzf4i08w)z=RS)(3Iff`jz~gFsA1mY|?OFaw)DkQRLq_zwUmp&Kgz 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$SylGX@3*M+OE49|i`75C#T@7zPH0R0alydTp;1GuY n3~UgVK9s4iudmPWpOKj%FbIieU||Rf1W7Pp)5yfa0MP~jt&tb7 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$SjRU|?Wm4h#$m4*t);8Wa>56dV%r spMfnXNMBz+L|^|u0~3hJ!W07Lut8Ml>;GqD1!>aP*Z=c~< 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}FFQ1qKENO$G)AV+IBWJ1F)BNw5S31qKBN|7TzYGeScCGq42(>Feu<=Q6!f2gDJV!^|33q3P*7k{a7f61 V1~v!_B*+Gm)7RJ6|If$>A_3s`5NZGb literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0423.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0423.lmp new file mode 100644 index 0000000000000000000000000000000000000000..a24240dff5cd4d66f40ad04f6f4fb83ef6a8c1a0 GIT binary patch literal 119 zcmd;NU}FFQ9R>ylV+IBWYX$}e7X}6fUj_z-Fa`#OI0goWbOr{70+1r6prF9O{|wAQ zL4iR*{~1~I^@H?7LjE(c1O)|$=<7om`XB~#P!Nb_U;!!B*Z&V@fJ7LX^g$E=Ghi5s literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0424.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0424.lmp new file mode 100644 index 0000000000000000000000000000000000000000..1043a50edb492c213a3e5c701620acbb98c35c28 GIT binary patch literal 122 zcmd;NU}FFQ9R>ylBL)TrD+UGzX9flaUj_z-2nGg*WCjL?90mr45(WkaM#jLv!2b-) zK|z5*LH`+8f`ase^!5KUu!01FLqh&Dut8WLK{kjih{*yH)z|;e$Q&4`udn}~i4jBs E0Fp8p&Hw-a 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 zcmd;JU}FFQ4F(1VQw9bG2L=WPF9rsNKn4be2nGg*BnAeCT#y1LhM+(OW+sN<5QhH@ zYz#qxLBS#V4F4Hf83Kd!_4OJ4Gchp)L8)Md{|u}UB~Zos5XDRk`uYqkVDdizufh}n literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0426.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0426.lmp new file mode 100644 index 0000000000000000000000000000000000000000..d2d623c4c707f460d9f8cfce00c280c729e67a19 GIT binary patch literal 117 zcmd;JU}pdU4F(1VBL)TrTLuOOcLoLqKL!SdNCpOm6b1%{Jdgs`prF8@;E<623~UgV kzW#qkR(*Ya{SbZq|13-)APPwii3wE}8v37=38dja055tNp8x;= literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0427.lmp b/wadsrc_extra/static/filter/game-strife/fonts/defsmallfont2/0427.lmp new file mode 100644 index 0000000000000000000000000000000000000000..bba0bab24c2e2ee7863374f6a78fcefa03241270 GIT binary patch literal 96 zcmZQ)U}FFQ6$SylGX@3*M+OE4Zw3a2Fa`#OLYU_4W1t0{~&39wq<) 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}pdU0|o{LD+UGzR|WLprF8@ z;E<623~UgVzW#qkR(<^-{SbZq|4b}F2u3hSgqb-wSYKcNKMNy>WWc3e9|Zmb0F7-P AumAu6 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$S+9?PXJXa|f&T!ONE00Z 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 zcmd;PU}FFQ69xtbI|c>@PX-2t5C#T@7zPH0GzJESLIwtgItB)YZUzR1X$%Yu3qXol z8G-_Xf7ce8CaMYFgXar Q7+FCkfXrfIW&oQB07tnV6#xJL 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 zcmZQ)U}FFQ6$SDFUej0Gpc@*Z=?k literal 0 HcmV?d00001 From 9af171f30830fec31f10e439c6633c9c61fe79b6 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers 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`1N0ffq_AXfq}tfq}t=fq}t?fq@}}fq{X6SxHGrS@}PRRshq= d%JN`ZNl8vg=|2Orva$@AR#K9J(n?B7{{d0J4^IF9 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`1N0ffq_AXfq}tfq}t=fq}t?fq@}}fq{X6SxHGrS@}PRRshq= d%JN`ZNl8vg=|2Orva$@AR#K9J(n?B7{{d0J4^IF9 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 bcmZQ#U}OLR0R{#JF%X0C|NsC08Neg}F7gN@ 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`1N0ffq_AXfq}tfq}t=fq}t?fq@}}fq{X6SxHGrS@}PRRshq= d%JN`ZNl8vg=|2Orva$@AR#K9J(n?B7{{d0J4^IF9 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 zcmXRYn4spRq@?tpiCIZWMoH;EBdfBq44B2huB0I6hPRsxB! WfGB0<{|rn@N=izsOv=j2%KrhO3=gyb delta 79 zcmXRYn4spx%F6nmiJ6sEhL!a{BP%<*44B2h&dx5+s=zAG%K9I~W>sKS0I6hPW(A3{ UfGBqM{|rp5Ai%`V&d&ZH0Qj8?8vpyl69xtb7X}7~AO;481O^6%LIwtgItB)Y9tH-6SquyeEX+zuO3KRr z8JIv6Gpmx)e+4-urT+|^N=kA{3XE? pQc_luky4TZalks2=&oD}gLjQdUy>4*)J68Dsze literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00C5.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00C5.lmp new file mode 100644 index 0000000000000000000000000000000000000000..87644a898e70747646b2e6c2d3bc15774fa22630 GIT binary patch literal 165 zcmd;N;A8*+9R>yl69xtbX9fm_Kn4becm@WB0tN<#S_TG&UIqq+nG6gJEX+zuO3KRr z85xz7l$cqSl>RHoDJlJD;8aqQQ&Nx=my`$d6cm)i<&~6_WI#MtDJdllIVB}FW+f#_ tkN^jWmXT7DQc{8%#HOSquOJUHiHTiFNm5Ei3ZxLkR#H+{QdUy>4*=G|7^wgN 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 zcmd;N;A8*+9R>ylYX$}e4+aK?Fa`#O6b1%{Vg?3=Mg|6keg+1HIUq&MN=nK~N-WGu zN=nMg{~0)xl;o6@RetDk+I7ONnc0Xo7jl%1TNyN=iziN=pBkn3a^Il$6+* sm6XK6k|1Lwm6VhuL8fqmOp%h2laT_+ae&o`i)w&4%pg;gSRmAY02${P)&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 zcmd;N;A8*+9R>ylO9lo8HwFfV5C#T@BnAeCVg?3=W(Ed^i3|)3^BEWzn3$B5l$2P( zC8hrioJvY^N^(--lJZcVsFIYZk`h>sRasd{NmE&wjaf-a5+u!} oq@=9O%nCA04#Wp*mRI<%0Mjh4Bqc5?4pz$v(yRosN=fNI08}0s+yDRo literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00DF.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/00DF.lmp new file mode 100644 index 0000000000000000000000000000000000000000..8d7f69ec2a619092dbb9d318e270d0365a77fb32 GIT binary patch literal 163 zcmd;N;9>v)9R>yl69xtbM+OE4e+CAII0goW90mr4Dh39I4h9B>sSFGZ?956a@Sll8 zSsBDol2=mt&&a8yB>!JQUQR|vS@}N$my(jaq^P*4rl^vV(tid{B_%nqQW#G`Nm)S| kBnFm~k(ZN_laT@$!=a=kC8{KihZSla0M~37-~a#s literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0410.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0410.lmp index eef00efb780b7c9f6afb8ec88d7e7a142aff08dc..86abcf7e85b3db8e5728b48768494425a7914b9d 100644 GIT binary patch delta 108 zcmbQjIGJ&RUaFFklCtuDMph-I{|a(SO8*(ym6Q}D#U_lDJ3HXR>7_WGFwSmN$EcT+=CUY delta 109 zcmbQtIE8V7UK%?)J16IVMpkxq1qC^F_Wum*?Cc7X;*#=EwmdsKy9|iU%*iRo&d$Qj p&Mpb!vaz$vNU=+?v;SvgV`rCFkcVlOl#-DGt6&EKPIgX^Y5P$%zDyEb delta 98 zcmbQoIFE6H0VCT)L-8;%Q6;7Sj2ucza%}Q!O5z+G{~0;h*kqLCmDr@9G7@YuY)Ue0 xZ2uWJm6c`0l_aEOB$So^GcYSDNhm3?uqY{s3$e5RXJk}XR%T^VR#sB_4*+IX5WN5Z 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 zcmeBU>|>l@5T~r9q@=8@{GWkcSy@J2MoLsk=|2Ozl9G(1xTGXlTuDhrNnA+=DlVra p4`nMWYs$$e$tfxQXJk`S(v+0ZR961a#G<661Tuq#QAtVZKLGdU6czvg delta 101 zcmeBU>|>l@5XYg!ro^GF{GWkcSy@J2MoLsk=|2Ozl9G&sxTFMFoQ+L}O`J`JjSVa= s$0n}?VJj;O$;q(Ev9bMUWK&WSl9UlrR{qb#qNKzIGJ}OtNlEEH0F}-X5dZ)H 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@=8*q@?tpfn7;SUS3X03d&ZH6qgiNR{qbxuB6z4yBcql>P$%vfdEl delta 81 zcmb=Zn4sgsro^Gd#?Jnqfn7;SUS3X0ijD0*13Md=f~2^FxU%wp26km-IW}cwC6G9? al9H5?(tieKHa1BpUmQ%cu_-Gl{RaSBKn}D3 diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0414.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0414.lmp index faac470b0c7e4c804ab674fbbe764c94b382c446..ee0ea2ce10c3f4cbabd57679d16895b5e3f07baf 100644 GIT binary patch delta 118 zcmZ3?xR`N*NxqVj(tjp4B_(AgNpU5m|BUQPN(%CFlA20N{~0)xmE~omBqc#=7}%AR zWR#SYWR#WvGq5Ww%YoQnMM_HYa#E5~${-02B_(ljQAw~-3>-=zW0k;Wu`+|%{{e?c B7Z3md delta 118 zcmZ3?xR`N*Nj{sB(tjp4B_(Ag32}Dz|BUQPN(%CF5}Ism{~0)xmE~omBqc#=7}%AR zWZ2l)WR#WvGq5Ww%dvs^{~0)xl;q{4B&3u%IQ}zmu(64Yi%Lp}D=C3x*p%6nB!$@6 O{#! rqpS>80}_{kip$GMDM=|S|7T=VRu&gk0%>JpQdU+{Vr5iPQu+@7aa|OD delta 109 zcmbQpIE8V7UK%?)Cp-IpMpkxq1$jAk_Wum*?CkO~Qj(HjHYcYXy9~P&n9a^E!!E}z s!^sI&0}_{kip$GMu}g7s{%2(4FDapty z$jgA$Dk({dii>K3RVXVfNh*O^AW@JmkXhoQO5z~17?_omM3t0SAk=?GMrCDXRuJ(Y E09F?mGynhq delta 124 zcmX@Yc!Y6+e<>T=e+G7CWjT2^8A%R~|BS54$`W!CN=pA3S=rc>B-xae|1+>FDapty z$jc}x{byijW0MpW7u95A`_IVA!J#C<4rVDSNr*~9%@P+?5(k;Zz^tSs%ErdR%*G}P OGLTVOS(z0?{09K7UKM)) 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 zcmeBT>|&hY;H9alto)yWU0GR1NlHmnN$EcWyONTWl8ll#lr5<&rz8ngBPA&#DW#f(tiM^6A$zN delta 81 zcmeBT>|&hY;3Xuato)yWU0GR%O-f0WjqN`JyONR=n+%({lG1+$b~ZLi4mmbS4i2yy iDM=X#DJ7-5*3$}gR+&Bm6W8El>RfafmF(YRkJH8 W$t(OQE^E&Hn0*lC1o}xrT+jY#}OI; diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0419.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0419.lmp index 4e4cf9e537942a4666cfeccb8485b16462b8c0b9..92c6f215216beae4bc6ae18d9b261e8fab110e7e 100644 GIT binary patch delta 96 zcmZo=Y-OCF6RD)6r1YPWO-V^kN=^pEWLH*}5*3$}S5o@Vz@elhr=+Z;1d;%8G?l;t i%KsVJm6YTa{wsh~f!I>wqT-TDO8=SIK;|if%me_oNE4F) delta 96 zcmZo=Y-OCF6UnB;#`d3)O-V^kN=`;e=|3a8va*z@xP-it(tidHHa0mnWhFKlHn#r^ y97;+;N=j^UN*o;j8QGPT|>6Q`u4tfZu*^q+xUSy@3wN>UumR#FldmDJQwR{qbx29lNoDPd$)Qj%AY hf-3kgsU#-}Vlyi%ODQR_Fe@pEgVZyD)Pr~+EdUTt6WIU& delta 101 zcmeBT>|>6UU~+p~R-7^q+xUSy@3wNS?^Ca1*4_MefJ pjZI!b3aa401iPFBh|R35ETyEx!pz1d4pPsgq{PO?!mI=~6#%!&5&-}J 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 zcmeBV>|~r^5~`%6q%5bT^q-MUSy@I-PD)w%KLeYRl7gI!l#J0EB|L?RaRC~QdUy>4**~W5>5aB delta 92 zcmeBV>|~r^63WJ=q%6nA_MeeWSy@I-PD)w%KLeYRl7gI!6dT)r239sU1$HG4j{gj7 m%E}7LY)T+Oc8I(rn9ar}B`Gc{q^$g(kyTk)iA`Ba=|2Gd4iF{) 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 zcmeBU>|>l@5T~T1tfcgxfn7;SUPek%9LkoH6c^Q0Qu@!xrmQR@sidT={GW+gNl8vr l^gkn;l9Iffk`hd%oQ#yFvhsfhc92SOaj-5{C9ttd{{acN6ZrrD delta 101 zcmeBU>|>l@5XYvZtfcgxfn7;SUPekn9L#28lamk^)nsG)&&Z~%EF+=BrmXy*iJ6T} tPE_Rfag4Bad F1OVsW6*>R_ delta 111 zcmZo+Y+#%qkrBecz!1m4z>vkjz);4(z`)3=q{ODAtfcgxfn7;SUQS9vTv_=)13Md= zl%%+*CL7y-unH+9FpG_iO^S`39jsPPMowM4*)we6i5I7 delta 105 zcmeBYoWM9iFNvLH={Cc_3{ jvMVXc%gM;egH^M!$;n7bh$}1qXJl1UVpCF9Qu+@7|4R@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 delta 113 zcmbQiID>J5UY3%QvJwRUXW&p$QjnLEk`z}`0&^s#B*jHFm6ZN7vMVXcDM=|Qfh3rf vl;o9^SeTWRWI$Z7l#-I1vhsfhb|oblIe9sdI3uf)lB76DGZV8i$cp~}%NiAc delta 113 zcmbQiID>J5UKTq$Cp!fHXW(FGSCE&Jk`!lW2XiE)B*jIA+1dXyva_?xu}iVDgCv;Q v+2z^US(w?`Wk6i86g#^dC+B|#c6N3dIe9sdI3p`NyQDZsGZQl>$cp~}kUI~< 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 delta 110 zcmbQiIF)gNUb>Q!vXat&Mph*yc{wR1rT+}J5UKTq$Cp-IpMpkxqc{wR|_Wum*?Cc7X;*#QEHYcYXJ3BjAoEc2BFtfAE qfTWn&*(KT8L0mabPOvU<8Fo2&s9B=yApJ~??Ck6;AmTp*0|NlG(GMB` 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 zcmZo-Y+{_C6Q-o}pMgbLSzb;_iIq_a#A8=dl2KAtl2KOv&%myvBrYTWUk)s;tSl)i gE(sHtQc_Zq1c|dKDanC#D=RDiXJk@RQda&C0DZ<1vj6}9 delta 93 zcmZo-Y+{_C6UN5&pMgbLSzeBfjg?VJN$EcWyONR&o3fG&2giQ~b~ZL~8TtQmAXV(j m$`YdDlG4h`U^P-~N^FuKaTYcJ5UKS@OJ3A{QJ3IS-24;441$K582=$+Vg_BcGo}HbQnVnr8B+bFjE-59) w&Mwc%`5&Z#T}n>OMoLm#9HC4GqKr*RNlr;g4kXT|q$DFJC!?eUwn$Q3N$Ecmld`gs G(tiLXNg9Iy delta 133 zcmdnNxPx(mRUI3fvhsgM79}M)IX1Tc3~WkD3X)QCN=pA3*x1>IQ}zmC@Ztc zvxzGyfs}A4Dap&p$jK{!6mhVz$;n7bh>I&L!<5Oeft9f-Dao-Z$$_-9v9Za>$;q&> Tfi02{XJh-%#H6gOr1T#EU7;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 delta 115 zcmbQkIE!(DUXGHI5-X#UlG1+$W+f#BB_$SSB_$~kmt9%;zr2#1xU%wp26iPSc?EfK tO(muOjI2sZN-|&#>`F=sGLmv~P}OpxN}7@&HnWnFB*Y-F29W6xD*!M#78?Kn delta 117 zcmbQmIEQh9ULHF;J1ZkQJNthIW_ET3c6JtKc6KQcmz|SSL7rVsoRjlE13Npryn?*A uFgyEyMpkxqb{Vh+c6N3J8A&-gsA@S;c40{no0*+m5@HZo1ITo!6$}8>v=4>= diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0426.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0426.lmp index a93b3f818680a218e90389713cd5cf74f044532c..6c064144a944a0c1c7aa1ff969ab19995995884b 100644 GIT binary patch delta 103 zcmbQhIDv73L4pzp{AXZSR+g8Nlb2Fb`p>|wq$DFQDJ7$%^q-MUNl8grNnTkQ!c`2VR{qbxp{y(~BPA{)2~xujQmrJasjU2;l}TAyS@}NzFjf?5 delta 103 zcmbQhIDv73K?0i+o08Ih26km-c_}%0DKJ|}Nk&{!N`{T?KO-9(8=Eqlyt49tMm8lS zC3Yn_Hn#r^>`F@V3JUTv931}{IFyy;Wu(MqBsn<#GqNiwDYGew3Mni9XJt}WR#yHG E0MmdHm;e9( diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0427.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0427.lmp index ecf50fa67b961583404e56ec1960dcc0fc8c447e..0c33938676b19b354e37b1247abfdddfdcc27ff2 100644 GIT binary patch delta 80 zcmXRfpP=Kdr1YPGMOj%+2E<@hQc{oyu^3sDl$7L^l>RfaDk&)`D1ju|m6YTa6y#-; WmH#uaD=UjjN=b@CRVXWgQ~&_VY!J-= delta 80 zcmXRfpP=K-#`d3qMOj%+2E<@hQc{qYQBwNP$fBggCeOz9pOKY~ja`9VN$EcWyONT; ef`Yt^vhsfhc4cL82`Nc&unHw5WhFKxrT+kjxerDF 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 delta 115 zcmZ3$xPWnjNsbZ-{AXZSQc{qUk&;qU`p>|wtgIj-B`&9=^q-LpB&{T;to)ymO<5VL v0wgLWE(%f%Vk#*q$%FMNDapym$;c=xgUyqZ5*G!r8CjK-l$4c}l>P$%J(L!T delta 115 zcmZ3$xPWnjNe-J5o08Ih26iPS1vwchDKJ}ESwTihT#k+HKO>ux5*wS6oU-zNMmA+- zkP4`%l(;BJF(Vrr8=DfFJR2L>3^^G&85w2e{|xMGY;scKqB0yD{~1}8l-QI(wg3Rt CniO0B diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0429.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/0429.lmp index 3cb13cee702eddce47ecffce8b6c176b96795bc8..9e175125f0afb0e315d3ad2a3516840b5ec8799e 100644 GIT binary patch delta 125 zcmZ3-xQ=mxMVXS4vXat&26iPS1vwchDP`sV4D8Cv3NljSa!N}78QGLT0LBEV0E;Rs zONon0ftetAC3&bBax!u8QGMS*w~chl$5|s zkP5JAu=rmUp&pMjl?O-^1;N`j5;KLfjxl7y6`xVVzie?~SXB{?=FIX1Tc ojBIRda%^mJ92{U#2{}1YC8hsNEJ{ienrv+UnVFQ8+1UOA0ID7jbpQYW diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042B.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/042B.lmp index 462243946aacd27bb8f3b05bf5639213fa736488..38b777b559c3c48dfe80b265348d07857f8acc53 100644 GIT binary patch delta 127 zcmdnQxQTIsRfUq0vXat&26iPS1$j9sNhn)VN>W^0N$Ec$o05_o7{Qs!%3!9XoSdkV o(tjovB_&Bss4itCFaVn-CnF~VGfiAnQ&de^87vM~p``R50Cig#3IG5A delta 127 zcmdnQxQTIsRRx<82OHae26i?!1$j9sNibVUNm5EuT%3*VKO-9(o17Ax9GI!3B*&&C z$H4&>m6VkeRZ{xT#G<4mDWs(IpMhOTNtumJi4AN58=IVroD9q~aZw>rHDzV6ElO-4 H$o3xqeV!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&EWmXwkd7gtjH&&Z~vBnL)trm`}aDJdr>s-*Ov SiA70CQd3FkKQogu$RGgbj1fx! delta 84 zcmb=eouKE>ro_R<_Md^BjZHybPD&EYR#K9bk`xzbWBbp@#>OTGM*kVvl$7Myl;o6^ e!J?9Ka-wW(|Cv~nlq7_dl>Rd_DJv@}{RaSY7!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 zcmZoZNm5EuTpVnOva*trlCqN0e*lDp5@rAZ delta 97 zcmZo+Y+;}+gu@^VrVAQkLNN)l3%;^JUKl$Dj(l$4c}{sRCPn-Eg~ diff --git a/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/2014.lmp b/wadsrc_extra/static/filter/game-hexen/fonts/defsmallfont/2014.lmp index 40cc6de17d97fbb7a31934819dc54c9d0ef615ca..59df945dc29191a64527b77a243e35b8fe95a8e4 100644 GIT binary patch delta 125 zcmdnPxQB6qTbYuQlCtuD24*Ft|4>>1g;rLU2lHXHl9HT~5?DQiR#uh)^I^1-k`$Pa Ope3Pv7_FqF^dA6Us~m{{ delta 125 zcmdnPxQB6qTNx`WD<|iF24+^)|4>>1h34dx2lHVxE2|tUD_A{*=H!$C^IUXD6OQd{2u^=ND)~8 literal 104 zcmd;JU}0cj`1xOhfq}t*fq}t-fq}u1fq}t;fq}uFfq@~Mfq@}`fq{X6nUj;9o&7%p tGdsHiC+B|#7It 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 7b2e08b6a..d5514c09b 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 0e8daea0b..3b67e3054 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 3b67e3054..0bf31292b 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 0bf31292b..7edb1df53 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 7ad4b6ca7..a7f0b6322 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 ec59f1c42..f80ff3086 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 zcmca1`A34)(K(o*WFzZECdPS_uQQo4&YR53?9DiDawM|`u+!*YhnGAvS)RaxG%xISF&x>EJg-~Qbq=b21W*kZbk-%X^adE3mF+0)-p0M>||tMILgStaFLOL;VvTs z!%Id6hOdka42(<+47^MX43bO?45~~F42Db$47N-R44zC3453U642et(47p4U^$e9v z3=FMI3=9*Q7#QX3xDGBGebV`5-< z$Hc(!or!_rKNAB38#4m~KQjY^I5Pu-0y6`HIx_=<9y0@j88ZWeJu?G?D>DOwA2S0( z7&8My3^M~m1~UUg2{QvjBQpa-JF_|i!*pf_hULr*3_F+^7!EQsFkE0}V0gmJ!0?Be zfq|QafkB#ufx&3=P4+gXkdTOwct2NHmw0CnM;}jTR|c)p;?%Un%p3-|jDLV*a4?wb z76eim5ab!`@8=o>5p!`34hiy)1exIP7v>ri;uAkjlisP{_nk&rr+6 zz|hIWz%Z4GfngyN1H)P-28MM^3=G?u7#I#PF)*BDVqmzy#K3TaiGkrE69dC5CI*I2 zObiUanHU(DnHdC#^nHdC$fnHd<2m>C$Xm>C$HnHd;7nHd;@m>C$N zm>C!nm>C#ym>C!C#anHdTzg98f#Ll_GKL(k@`>}^c-k@=+xd8w%>3MCn-3dtFXIho0+3W^L`rNyafiJ3VJ zDDwVAiOD&s3IU15#fl&q^|Dljv?7@9f}+gg{Jhj6gj`B$aY<2rCDe51{JgT%qLS1i zMTXFV^rFO+)ZmiIJGsQdQ0#!ZL6N~ZKQFx~v7|I7u_QA;uUJt5q%0$`EL9;nKer$! lwFGKxNl{{EUS?jpLSj*BB15ouq_1CyfguCK=676ui~v(Yj5+`S diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index a7f0b6322..736c578e0 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 495893edf..a3799de9e 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 95c2e754e..1afc68e43 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 1c479ba5a..11416367c 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 d5514c09b..957f3b0a2 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 f5f45fdca..77a942127 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 df9a02054..bb6ae9886 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 50fd050a2..9fb601faf 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 7edb1df53..36290df47 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 0b4ebd9a0..e7b2fd522 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 77a942127..c7e20de09 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 505796396..3ef9a7640 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 469b3f668..4f6740a0e 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 409db4ba3..2b6301653 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 e7b2fd522..598f7d6ea 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 d67b1d899..de2482d99 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 zcmZ?s_cP*QP)J~42xQ=3U}NBB;AP-v;AP-tUBZHyUJRU}fNB zU}NB9-~#L9XW(N1VIBqn27a)40u0;?0t^BSf((2Nf(-l&{0tyDkO&`G9Hftnft!Ji zft^8_!G?i>fuEmWSy|b{#Kg?Z%-r1E!otGJ%F5c>+Q!Dl*4Ea}&d%Q6-oe4a(b3V# z$;sK-*~P`h)z#I_&CT82-NVDf)6>(-%gfu_+sDVp*VotI-#;KAATTg6C@3g6I5;#k zG%PGEJUl!iA|f&}GCDdsHa0dcE-oP^qprEj@u&Ai0xVX5qw6v_Oth~IuqN1X*va+hGs=B(mrlzL0wzjUWuD-s$p`oF% zv9YPCskynirKP2{wY9CSt-ZayqobpXcF#Zz+VNpf~21Y?aQ7~p;U=$T)1mS-SY>aA*42)`we;NKW{%82lxSQcW!(T=Q zhQEw|88|>n7#Ov*82>VGF{*(ST3InNF#KcuuL{C{8QHYd)IjL3+FwRSEvtWwjA~lH z8UMTeV`Q{)`^)&v?Jwhh|9=q7z`^M6&&U8GKt@B@evE&i*8OMr&+wJ;KZ6V-lb|3Y z2x?iWF)=VQ35tq>xmIp&ObovnnM4^y|1dH$Fsf<&V`NfeRQt>LpFxmOP0Py7O^Z>> z%1Vogk%5s(?XMdnquW1!W;G^8hCht#Zj5e>jQ)OVzZjX^7~Os`$}p+<`7`=4`hf(Q z7#W%T{2^RFkcKaepiub3@Q0Df4dg@)aJVu0`7{0l1*s^5+8@UM42+DT|I`>5e>1Rx z;zA9~&;msYNJPuZ%8l_i12}3xY8V**x-l^_F#KWs>&C$NkAZ{H&5x1M&CiYTF9Q>! zpZ_1mKMWwR{9^pWz{JSO`3Dql3=E8a1pkS$t3jjh7vp~hW=2s_wSSDvAdCJnursQG zth93b!^p3uW##YZ=Vm2n1xgWaZhskB-K^Z07#aV$fkFTjE^dB)fBo70{QW>2FjLgZ z4-}{0z)piC7+$DtAWBq}@gD;dG=W@Z_|Nc%k&%J%FXw;8Kj1|9mr)uNL7*fBN+6(U z0XtR;oKhJ7x&3AQ>&E5B$iV35=H~~t1Qc{2BS230Blwr`pP)3vCP5ITrUp){YFc1p ztgN*DGX8V>&&c5S*X=*!e?Mk7KTv%BXZX#)!^i+~3n*PPg3>r7fAE5mDaa`h*~bje z!D*S5Q4nPAKTziR%g72!v}&+K3kp*=P(1u)e9v%^;SVDZ1EZA{D6I-=F*1T<8$v|6+WJuEY)GAO?mX41XDaGO&PC$}ey#VFV=!k`oCmu`n?HVqgI$ke>{H8GkVR zXZQt9eSbOs34(&|m*9U{Qool^ZV=16aaDSe}*57Obm>if55T*SMZYJoik3ILGjK)wfi&JE-# z7DhKWKd?L~FN5S!Jr9aOP$GqtUmz<%2D3s!_$T9kQ3kbtjKUzZ!Q})f?m_8B%gXAn z8!ICNqm`T6KgR!VOn#su3sj$hgM=BB6G0&Zb2}_2{Nwx!cKvTqs4)H${K@!F^dBP& zD2X!uQ{w@r3Q*bt#U7|SVED}lN)`V=$^Wn4e@KA;_h*EJ^mm5ejQ_1z{TUerwcLI) z62oNyEB+0tE*btX{$o&MWCE4F44_&IRPcgmH&C)+U=oDVZhn4DjQw&9}~!h{{B{Q8dPKY`CEbNCq^qjE0B4A82>W-1h*jm3i7Inf+AB; zP*l{)N{#6k<9{~>(O-=J{rE&djR!3&H;^6%P%DHLq!Lur{A2vb0IJhKMVKGsA81Aa zRjGd&7#O~RYH%jee^&ps{;RQwaxyWB{$ykqOUg~)VH95@*^a_|6pJNHJ=zkG$_CS02O9#42(Y*J~1*e34*-q#|8>@CPBZy z{{Q`0tUz(}73!zIpn^&5zZN&B-30OyC}2ThDGCltHjqEmw7}uy=jR6Y6qo}JG>~^b_M3MplTCf7Sjog3M#k`e*f(k%fs-S%;XlJ?MmA{h|5N)94u3Xi`2V%~ z=k}iQzZx^BI{nVb0WK6782!M>j13en3=E9FzzGeMEB`S5^Zx=06i_x0^!w@00m*UT z=wbE)=XOx*8I|d zW@O{a3XDu@YJ%Vf56J(Zev%ugqyd+Ppny^P=Ozouu}q-afys>tl$^oE1E`w` z>HzuwXXFAo0Mvc)cVh(QuzzmsjB5UjjQ(n1?teFJKSm}ue}6Y7NX`aFwwk}c8mNGR z7LTCd05w2CB_ych3F=vZQtvOYV>ucBg3_-j2c+#FC;7;Bpd_L>L&r4JmLm z{Zr!vH6K9E0`r>N*(H9jp-P%ttwae@O->#r578>kd!{>J#< zjZKu1kyA~J@fQQAQV@ldd?1d$Kd9U8<_4BQ;xIG%`&)emWpYt)jrIec$<_RR`?L62 ziGq?ds9Xo-bOuIH$@@=@8|(s5)eNq~7}c0SmV*jUPyxvJ-w(?C>jvufSusJ&E;fIV zaiBl}Rq}tpg+C~oK$QR}%71{`@!&2wxb*q#B zz{Tk22jYRsG!PHuM+QbUH#f#V4F8$_`?G^869|`q>7PH76(hqpMoueG`T(U!PyuAc z0qLSLsrmf@2Lq@b#J~V5r9pjEkk|i%DjjeI4);8hnjq6xMs_z)5{FgbpwtYh!2kOH zgI3^w{GoLy5f!)Gk%>tST)C-%M;}1dHmC*#Mei5JKcMzL<1fK~qJJ0}1pkTtWdxN+ zh|va6*@HC502*5Wm7Oq}6;i~2iip2{APG?U2P$G9RRc&I)D{3&4PXwaEg=f-u5!Zb z2gcvvgzFDUxL{@e{~4JI)M{{KDjS1Y?1DB9$Zj6k6kRlLL zLV~pTgNwv}pxnpAz`*1O=1N()f!c`-42)KOkcJSr)eUNvTY-9QEXGz=pz@jp)B$k& z%?PR@|1$mo^-u)Cm6|T3r@fZG?KF(y#r{^RxyT$#K51+@=BEo?CBU%&^(Z;by0|BLddX=yQ7CLq z{04Rvs38IBih)XI5RGupcCiOG%W7Xu5Eo0}ig9|kriD?d=e`Ntp(P8^`V xD+8DXN+kY&!1?Dd( 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 zcmZ?s_cP*QP)J~4kYoJ+pM!yoft!JsfuDhwfq{XOfrEjAfr|ko%ErLPz{|kRz|O#p z23Z+c88{i(7&saD7#JA%8Tc9az?g?YfPo)uo&Wlq|_4Uoo&E4JIlP6D} zK7IQ9`SX`AU%qdl)sZ{NOs|Ni~Qj~_pM`t;??mv7&`egFRb=g*(NfB*jf|NqOg zvllY_Vp8Okk>+G#;+K-*XJX2Q2NS0_BLkCw zIMZJSE+$?nMg}Hf39u?QUU5c7CIRukOaj6jyh5U)eEi~~QcR3YOq_!Mm>Bsbels!h zi2P$>(sJS=;)1*&zlnp{y z_`>v`fq~&4;~$1UjLgDfQjGr?gcwDoBp4Yvxp^5G7#Kx`rT7^c{xSY%U}Y5L73OFB z4QBANLl~^wPzE;}D@25!AH-m1l;P)QX9O87#K0&c%nxESf-GPZ6y<09$G{A-;1A;; zhJPSM41byaFffB+6hw&%GW}&>21Vx|hJQ@^82&OaFoHt(KcgY9q%!bgn7Dbtd4+-DF~cv$|6+_% zGQSvKqAB76D*|cz!SI*yCj$#O;(vkS7ZmA`h$cG5Ss^hF(glw0UkohZsQ$_Dm+=R~ ze}-R7{}`BViJ}5C(AA^3i1Rm_di}{0Z|c=pG^Nnm_(Tvelz_Slon@VV3HD-k&zM+ z5oKbM5)l#L72pMx2jT((f0+I=Ff)k?i2P(?mKG6_{wvEZ&BP?Y%f&4yz{}136>J9| zlc=<`tgH;kNlYRFynh531b;FybMgu>{bl&a#LULc%k-CljY(EY0Ll{J;s&$+F)^`m za{pxd&&kTo#3U{%{!jEj7dxn&;o|1v`p3q|!~pWdA0`HnQ>7F|K;@{E2*{P7!c$sQ zfC=O{kSHi-L_kFwyR;z4EOF_-vOEIZAjb*{@CwKZaQ|dtmKEV<`pv+?BrC!Trlmz8 zv>-1V({F}9OkWup#iahqvPwyaGBS$(6XO)-7v|?@WE7U*{mIBAEXMnX@jnAEqp+BS zl&qAPC?f+SKmT7|CNWWAkTgH{PexWjZf-_KvA?pcVqn%^{{OtpprYjm<9~+#3_lnp z85sE`WMx4qfRRy9l$)1dke`>Ekx^Kb`zPanF$Qjs6_Sh+qGA#f-~xhCLR6HWmseDj zpOH~QSo9wwyRd{9Bcmw4;6FxoK`~K~DH8u=c_l!l2%{iBKQF%^sL1-o2(s=!12d=` z`zOmQ1#&JYH!n9R84LboWEK<^Wc&?E_F|x7l7*31lo!nB7vl!goPtoA6I5ujFmkd( zXl_nU#@`GeXZ~XR#~{HdEGi}?B_;+A3_(tIc96M@yn^ii7}?py_!$|w1$qB5%JPbV z%06LXDG3RXS_Vd8US3X4ehIKP&VP*Tyb`>OjG_{}{}_dZLBY=}Dj_2)BPPnr$iOHF zO1X?MU;SqQS)$?eMCW()n5i^K?P!nf+{O815|y1&0ytb`or*-=`q6}CRRo!F)=BbpG?fc z0;1Btn7%Un0M}D2OcGL}On(_znfRrIp$rjTF|Y`?5T799Uj|tw0d95lg%?_?n z1bNvxKt%~3J1ZyCKL!>i9#%->;19!BrvD6#OoIQU|H=r0Yj-AYPF`LS0TBTa5mD~% zOf2G3;v!7{z!{cF6vX0U5|oyakrtJb;%55Cz{$kRCnmwmE6C0Cmw|~N4n{xW=L`p@v6iJ414K;*A9E2yaC68X!?Ex-*a%>{Tl*?usw za0&2ofT{a|2W65!$#_{k*3z{JVL$t5l=E-fVuYLGB7v2t+< zaQ)+E1eNFCnZ7aoWng3$_$&QihErM`(w5-j{>S@YfQ?r~M3f6uc(d|~f*Lcw!Qm<@ z4RX7HsHgyx3u?&l3JUN-xl+6!j|zggTukE9Qd~?-AV29(F5jIXvP^9yMyelHW%lVCog$oqO-@zG70F>{3F|lw9 zfLYv3A~G@pOibLO0-zku4Qhac43ZMy;{3y;!YeHU;&BRcaSBSyNJ|NT`3y`UJ-F=X(hpE`;YrSlOm`}1eXaQ zab7ME32Hwx35W`S+{Mey{fp@jxF}*}5(FjmKMbr)Tq3-jOkf5#Hy4z_1z~W5Yye5| zf`a%D0}B%uuL$pNCTU(S0TEs%CJ`xdDQR9_P}<}b;N=wr*~st{Tx5cZO-=?T5osB4 zgYK^kI0XxefSXn_;-Ele0Cma4MVOeR|A{j~0#{I4MvzHbR9p&_FG1Z!X>m~zP~-6r z11MOe1(|rorKF^p{xa||34+5=KuTH))MZd*5)cLDZ6*O}DFJYcQbbe=oYw`#1;Bk( zUPzR&GI4QobBX){7kr>nnU#qfWD>}moV+3sk8{C;f(sTVpt1*~1{BrcP~sKgg(&6~ z5#Zwe!z9YUB*4onEhP@JmWhdrOOTfroJc_Zk$+6T8UBImA5j?*roRmJOyV-2UaNq# zj40TZq5|R~0!&PTQc@yZf=o}iOfoW{JjTN$APdS_0^*|LpaiSVBqA#gN`NAw zpcD*>M_Ex`CMI4{QE_m;jY&`zoGX5dgmW`73CeR3xd z_@baR%`FY;pn=qLf%pte+)~ogveKZ60#vFnFff7YNC8lTAJqT)&+wPw2h(qc|4fX$ zQh#KaLAL&55M|<$5fv2>;Ns#I0fia^1Cz9rDAyk*Zcae~QBZ$TTvUJwl%#mU^{oJ$ z%MBVD5CDw@fMvNr{Yn8)go3!-ATDV5LrU}y6SoL2s3*$6#3d*#`cH;UN?d?j091+p zXZp{}At1=h2@e0?3_qA4`mfACX&zBfF(M)&BPGJi#r21YSyUR-uKLHo$|Nc!A_A^Z zMP)=G6)J)uEe;g{<#kY{DaR1{1 zH38U|KqU+l(?2doP$V%j@%|J1kIWPJ&&0yX1&%>(Q2g^UF@Z`YroRl_OkAMx4G;NARsLxEiNt~C<4heoSfX;Tx^`YoJ>r=8GeEbXNUtq z4GWO5BGNK4pm93zAe9P}2q=>>Fo7CBptiAq6lh$40aP6efcPSyEd7sxf$5(JJE$!t zDlP?f94NK$@=A$HgYrKolenlTxCCPQ&A?bAf6MCJ|8L7U1OK|Q7fr&x%pA3WaUl|c; z8F0IfR{%7qA|fLyDlRS}@Pmm-N>ucpIHL&DABO)-?Bdd*qT*7ZJn)~1LtF;b7~y7O z0+oUspuPl1is>%{6O*9KKXGPhZcy4~1x25z)HfzpP$y4R8f4u+8CFqHdrk140J|V) zR7#MS^8?d2CUHuZSSH!3i>j7c?Nn3u-GeG5=xu%lLzVg;7FEl<_A6D{V!ZWDw0 z>EQM-hyiX1gBZM^Rxqfy%quP}_?t-pL@_aeOo29f|M4<|+PmMFelsvIePdu^5@-4W z%EsahOurZynWX}Go92*-Oo1B@Mn3S0b j76=Fm4GoRS%#2Qi3IqlP28G6FW`@T@1u(QAoBAIBXM8Bj literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0022.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0022.lmp new file mode 100644 index 0000000000000000000000000000000000000000..cc161c725ebe16d969a7ca09a293ce7285bb98ec GIT binary patch literal 133 zcmd;P;9&p(69xtbQw9bGI|c>@4+aK?AO;487zPH0SOx}$bOr{7LIwtgY6b>|76t}} n{|qddVDO)TH8V3XIzBTK!U~76AhKXV2otOjE)CTJGvz-3m1!hm literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0023.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0023.lmp new file mode 100644 index 0000000000000000000000000000000000000000..97e894a29c3330df5d9be89528f0d491a8eac8c2 GIT binary patch literal 251 zcmd;O;9&p(8wLgjcLoNAAO;48WCjL?5(Wl_Rt5%!X$%Yu3mF&~HZd?T9A;o(xWd4| z@RWgp;R6E$12bD@W@c7qR%YgZ5Hm6}GbA(fKLbxD2&80YMuBLEKyrM1d~!l;bZ8<} zMQBiHRCGjSco0k=D=RBJGcz2bg_#Y^3xz7q%*>3-%nXIdfy|GIjERj+2nml(f~p7& i2@MSi4GRs131ouJ0vVT;1$JFfW@Zr7p<%%u4E`jm|&D=RZAGxI+HRi|Z5 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 zcmd;O;9&p(8wLgjF9rsNXa)v`Tm}Y)1_lO(i3|)3a~K#HmNPIgY+_(wILyGnaE*b1 z;ROQ&!%qeV21cf=tgI|fW)PY6pMfPSD>6ANi-RRADaH%=EPMtgQb`AZC0bh{*_M#;0aw taf0pt&j1pLj7)`C4RXSN2G*>sprBZY2*?d!*M&d@Ku-A20C6_d3;>>WPI>?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(9R>ylT?PgQJq88_Qw9bGdj@Uj_z-7zPH0Tm}Y)ItB)Yeg*~x7M856%&e@e|4bZN zSy@T3@$n!IBUe^da!^=UL`-;UX6AnoH!wINJS;3CAv5zo15Z{~d_;I`Y;06$Xd+l3 kGc!0m8DvfbLsUQW+nIOOkq5d;B9svr LpPBg|s^UKYh{h4t literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/002F.lmp new file mode 100644 index 0000000000000000000000000000000000000000..a1eb8b04732ea7048ea3e7db3f74a213b62d3545 GIT binary patch literal 191 zcmd;O;9&p(8wLgj7X}6fUj_z-a0Uj3BnAeCTm}Y)3I+y-W(Ed^J_ZJcnG6gJOBfg! z)-f}8l@$VJK&=J< DIubXg 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 zcmd;P;9&p(69xtbM+OFl00stzLT1 zz{HUW2mcwlGBcwgAU-qmKLbx@W>832SV%}nSXe4lARsI{IyyEsGAJ1;z!DEJAPB65 zB{LHwz`>H483GpI$;@O)gs2FI34n}pufeW@cbuU?2+%3kyUaPiAINczAS7OhiODOiM&ed}3l^VtjlW$YiJ)ApIcx9{@Ck BK9~Ri literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0035.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0035.lmp new file mode 100644 index 0000000000000000000000000000000000000000..4d98ea367f1615adbf3aaa9131e9936bf5965f12 GIT binary patch literal 241 zcmd;P;9&p(69xtbR|W=#Fa`#ObOr{73I+y-P6h^sSquyes~H#=_AoFooMm8OcmPt& zlZ68QGw@_(g@s2(M#g4kg~euNfdzuXLc%~C7MK7_SbTg)d{!2cKvq@|ia=ym77Iuq z9%=?iDM&>aOdu#SD=RE4GCDdDsv;ydD=R!aHZd_3B*2oD6&{J~u JDjSsk4*;mENp%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 zcmd;P;9&p(69xtbM+OFl00stzLe+N0I;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 zcmd;P;9&p(69xtbTLuOOHwFd|9tH-6xeN>pYe9-x zvcTX!14~v`WO7y(m=Tr;Wdy}T87wdn7O)6URu)JEtThXygeNO2C^|YiJ~lZy8LX5i lD=R!aJS;pcIyn_&EF*VTR&;c1d}3lMn9sxo(+r~j0|53RH*f#| 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 zcmd;P;9&p(69xtbX9fm_AO;48WCjL?5(Wl_Rt5%!X$%Yu%NZCLb}%q7oMd2NxWT}{ zz{H#d0_+g#KOnG6gJs~8vrNt6Hp literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003A.lmp new file mode 100644 index 0000000000000000000000000000000000000000..fe2e53b7f6302ce44ce58f36b88763f80692919d GIT binary patch literal 105 zcmZQ&;9&p(83qOhO$G)AD+UGzZw3a27zPFgW~QvHtSnA2`Jag;D=RWND~kh4g9XA8 TAp#&8ED#hA5dhKuQS<`ylBL)TrD+UGz7X}7~00stzI0goWJO&1aMg|6kNem1OY>Zi1S^rs? zv$Ddovi`HMW@Uw^2V`aaXJ*gJ3Xe~W1&K0og4pq?5FR6UR#tdqWNKDwY+`t3=6^=k vtgN7**sLse)~u}bv~-XVOIB7$Y*rQrOIB8TB1nKa3j{csv$8TXGyeksRh2D- 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(1qKENEd~Y#69xtbI|c>@4+aK?AO;2oR@O`i_zz-*WkzOZLRm3TR#0X* QlogN}2xetvfwlYx0R7n*J^%m! 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 zcmd;N;9&p(9R>ylYX$}e9|i`7cm@WBd2*9 unVA_L9~G0Bnw**WpP4-~Gb}DKH6=6iKMPn7NDV7puWI<1R4( literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003F.lmp new file mode 100644 index 0000000000000000000000000000000000000000..3a2e18a42d24be8bbb094b97a4edc1814c2c33aa GIT binary patch literal 252 zcmd;M;9&p(2L=WPPX-2tAO;48Xa)v`90mr4S_TG&J_ZJc`3wvU8yFZE4l*z>oMT{M zxXr-8@PdJX;WJ1hOC}inXJE<9j84qV1TzAYK@6VE%)ofCY-VN_l0bBPVrF6zR3IQC zGczzQB{L=kCJ>XE84wnc8HKDOAS5_5JRV5}%;5hF9GRJ+5urg4S&q!ih=`z|plFa% aj?B!&@X+uekgFKkGBXn+B0x+gn3Dmqu1?|r 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 zcmd;Q;9&p(7X}6f9|i`7Fa`#OBnAeC0tN<#dIkoDUIqq+nG6gJ%NQ6KHZw3V9ARK! zxXQr5@Qi_h;X4BZ13M!F11EDP2>fSf&CJYnG6gJs~8vFR)P>=w~oPY?Z3J?dZ z1tE}_7#IV>P!$0|LDAviL4lz#L&Jl@gMtEr!oy(#@u5KhNl5__ATRu930}D$g82o4A$jr=4ijPmq%*_1H$d#Fy6axmyP;Nwgd}3l!Qc`B- ze+Hh+%%tSxnG6gJs~8v;m86p@$oUCF-R&v#s-1~STZvMVlp#1p!9zRC<8?xFdm{J6lQ2>L_Eld zP`E9L5#izC;h~{HAcrw>WoCwl27*9zX6AnoHz^__G$<%KDKqmw6GvudW>S27Qf6l6 Me-;*yIhmRN0r}!zGXMYp 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 zcmd;M;9&p(2L=WPPX-2tFa`#OR0aly5(Wl_Rt5%!X$%Yu%NZCLb}%q7oMd2NxW&N0 z@S1^v;SU1?11}>30}D$g82o4A$jr=4jE_&u%*_1H$d#Fy93K%85gwfk*WHc3E}6nJIL5%h zaGrsIfrTRz4*oN7WoBk3#mC3Q$0ufH{%7RQ%uJ4niH?Ylh=B1E6Jx?d!-E2&Gc*4) z@MLBtMudllhQ`OlfE0iPLgN!N1L7fO{%7FG1aksnK+2&UuvuW47??7a%*;Tr5|+%& KXs}5vP$>W{i9)de 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 zcmWe&;9&p(4+aK?Kn4beI0goWTm}Y)8U_Z2UIqq+c?=8;>lqjr4lpn15ajVQha=TVq#KKQW{hsCOH{oP;zoQNPs0XGbSxFlY=EQGdc+>5S|PX z2!siQLInb1peh1m&{PB_W@fUogUrngN<>lw5{rn5kAaKDL(~NX1_pv%$dZ{E3KI(m Z2!M&jCqdN3fLsqX4`e#XJP-}?I{*pQXyO0> literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0048.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0048.lmp new file mode 100644 index 0000000000000000000000000000000000000000..f174f3ad625133506618722455e21b0190b87d0c GIT binary patch literal 299 zcmd;Q;9&p(7X}7~PzDBuGzJESas~#54h9B>nG6gJs~8v|tPFILg4laE*b1 z;W+~X!w&`q22Mr>1}R1c1_qu?6!0G;5R(W3@$vDA%*Y1||?58VCYG(NKZt#Q6AV5CB;NGZbQEX6AnYi(*~1 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(1qKENLk0#0Ck6(FU}F79Ul`PA0HDFlbD$a n76^(@OiWCQj}DKA3B<%C#>Xec!&Ss2fm9?V#>2EAoBAIBXwxX$ 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 zcmd;P;9&p(69xtbTLuOOHwFd8!G91VB0e({%m|8sGD6`ZAO-^uSS^T%4~)*t{0|a{PD)Bjj8966Pl5^rMkFT2 o$Hd1#1h_LZL*o;ZVqzj9K!!4KXJ#fQgSEtGf;4b~OoQV80JS7KvH$=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 zcmWe&;9&p(4+aK?NCpOmECvRKY6b>|9tH-6xeN>p>lhdqb}%q79ARK!xWvG~@Q8td z;WGmR13M!FgCrvZgC-*bgE=Du0|QSc3iuBah=`7ej*p3siHOh41PcU41O)~Kg@%X6 zKm`JVLIVN=0|SF#0^y+%(V@}N5pXRaQ^P?-W@hGpX4cHiK(G`OduC=}cyuU8A0uaG zWG$=4I8fHyIXnZEf<|L2+Yi4Eu$OUX{nVI1+G07k?mdwn6#LP@~ o*38V%=tPhRb7p2tW+n$qW@b287Zb=4oXnY-5t*6)xxl>t0J)1`X8-^I literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004C.lmp new file mode 100644 index 0000000000000000000000000000000000000000..3846ac04794519e7d983d7161bfbd7b8a3eb7664 GIT binary patch literal 194 zcmd;P;9&p(69xtbCk6(FAO;48BnAeCVg?3=76t}}sSFGZ^B5QymNPIgY+ztu*a=e1 znTY`Z8Mreu6O)sYk`m+NGcz;6{LuKsq?nk9h!_x`Co?lJA~7*OCO#%U2`Uf`R-cpv j7l0ZV9~hmP`JaO&Gczb2$_RxqfQ^e@QQ?KEW6b~n 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 zcmWe&;9&p(4+aK?a0Uj3bOr{73I+y-P6h^sSquyes~8vcw&B~UUnHU-#1T_z$GZdl@sz>}F78j%dLB_amoEU-JGqvPY_6XO#> l0w8C{#Ka^fB_+l{ot+dO5ucQl2r>}j!^FfykPqSh1^{iIWi9{! 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 zcmd;M;9&p(2L=X)Kn4beBnAeCVg?3=76t}}sSFGZ%NQ6KHZw3V9AIEzILpAmaEpO~ z;W+~X!xshyhW{XqJeerqKLbx@W^`g^W^{aFd}2~&CRiXaIWsdbIx#UO872^)nHdle z6dDd!0TKud2nvmdstAb4%nXc&nEjuDBQrA~CNmQx2;oE^b7C?xgTVSYGBZOXLW9C# moQQ~^prB}wi5!`kiQ%E)L5Z1}{~6gbGZP~sKujhUs0{!ocvIm3 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 zcmWe+;9&p(9|i`7PzDBuBnAeCLIwtg1_lO(i3|)3ix?OfHZw3V9ARK!xXQr5@PdJX z;Wq;V0}mqugDfKhgAOADgAF4CgEu1s0}D$g82o4A$jr=4jERZK%*_1H$d#Fy6c`#B z8XA}c z*e%h~@$vDA@rfV-kkeygViJ>*5@SG4=g!Pb3Xh0SN=i%y8NkE^@@8UUVrC|Y3-dk~ I6Ug!Z0m=etsQ>@~ literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0052.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0052.lmp new file mode 100644 index 0000000000000000000000000000000000000000..27730f829a2a4e1b310e7f6f6448561616989dc4 GIT binary patch literal 310 zcmd;Q;9&p(7X}7~PzDBuGzJESas~#54h9B>nG6gJs~8v2<%%u4Eq|8i^P)uTG=6?pB%*=?;(9qDt z%*;TTKu~CCP-t>yW zH3Mct1k4N&17u4$%odP}(B$N#2$(>0T4rWMOiT>irSZ&}nTav+@iECDLs>F26O%JD SSwX%^Oa$8l^(h;a{tp1-^kz>0 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(3kC)TM+OE4F9rsNU|kJEILN@jaEgI} z;Wh&U!y5($hCd7p3_Oes4AP7Y3=ABZaPXgjD>E}XF)1lIIVm$U^FIT3W@ca#1f(JH z6B82?V?cbK%*^NuLnVA7FMqm+>#H7TS2#^AhyTYSmKo*1LxiT{&BBEpB;~~yQ_7VU) Cp}FtKILW}k zaEpO~;S~b|!w&`q1{OvJ20lgx1_tI#5cto)nwc3LpP8BYpMgCyGaxh~2F&Kn%nS$* z4~O!&GczNi!$TuNLm{#}Ag%E+5fR~`q4AlS|Cu>6Gc)5O!XqM*GBf|PvS((-2Zlx? z*ny$RFjX-@q2WO>AnU+}#6*OLhlU15g9JdfL|y~OIyyQ!A}BNnrUGn2P+(wSa%Sd#7WT}{z|f$en9R)o%pi75bPPzG3B-<$ zj)t>iq9Z^ig4IOF#Dmx%y`f1-i6{mqB_&3rL9LEYPD)ISkBI@B2y$FRT5?i+OniI{ WSOs@xW=vvye0+RNOgu;js^|SnVJ8YI5IQi z;}esT)8L%=#CVVlNMU$%bbNeFB8bZXF*zbS8p-6qz?j6$%xI|HtRVL#LYxx~aUn}) RW^^LN$9K>|1)uAW(I{vN5>~7f%G$TW@ZLNL_|cyfE2@c;oLxXr-8@P>hb;V%ON zgCHXVgDN8fg9Rf4gEu1sLo6c$0|QGY7_hT~sm#p(Ad&F+%uF`6%*^PBhq6}g{pAv91xhJ%9TKLD}PZUO)R 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(0|o{LM+OFlAO;48WCjL?5(Wl_Rt5%!X$%Yu%NZCLb}%q7oCGQ4$wUGF z8F(@?V-i6iK0ZE?nHek)8XprA6CDvA5ucd}5r_c^L`Ou!1fpZ&<3ZZulb~865+UY- h=>H5XnVF%9nVB3=8Y~bP4-o*-*abi)fV6<<{{Xg#K`sCQ 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 zcmd;O;9&p(8wLgj7X}6fUj_z-a0Uj3BnAeCTm}Y)3I+y-W(Ed^J_ZJcnG6gJOBfg! z)-fOcc|2bH)vI3&Bvi@^Itp)%v C(Kn_5 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 zcmd;L;9&p(0|o{LM+OFlAO;48WCjL?5(Wl_Rt5%!X$%Yu%NZCLb}%q7oCGOk$pixq zDE*&-B{MTLF*6e+0HVPHf$}HprFvq k%>RsRnVF$Mfq|Ks{~18c(4ZhxQ6#kp1K?)DEP>hy04TCEQvd(} literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/005F.lmp new file mode 100644 index 0000000000000000000000000000000000000000..0d99021d5bfebbc37db15756b5133f994c5745f1 GIT binary patch literal 80 zcmZQ$;9&p(1qKEN4F(1V0|o{L3kC)T2L=WP4+aJXPUb8S_z$APva(RylT?PgQJq88_GX@3*djj7z{1qm*Vo6(*w@$hpP8kvucf80kB7Ohueq=9KNDMDU#pv2 zb6+1fYhPcBFRB<9dtYCRkFReNib_t7zP?r;s4&bx4v?U?j}O=ch>h$VeSK|S-abAc zL)qB-`r16bynR|)_?hhO?d|`wa`g4Jdw6+5iH_wYm$W`_v3p(tiy?dxlIZ$mPbmAS94y{`{yF&j7}0B?VB A`~Uy| 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$Sw8wLgjPX-2tFa`#OBnAeCJO%~^Mz%gE_|L%6*Vo?K+S1b8 k*9YNvdU^XGb09M8eSPhoUfwMrRUkGyl69xtbI|c>@F9rsN2nGg*GzJES5(Wl_1_lO(E(Qh$PUb!k_|L)G z*Vo$G(%1K&oxQKGuhpxiudnYv8)si%TU)DFOG`71=i%w)?E~k*<&bqD%z~K?0OU+F A3;+NC 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$S~jSO(1IV+H8|DdA_fx3}->`wsw$e<6ba literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002D.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002D.lmp new file mode 100644 index 0000000000000000000000000000000000000000..b7f915d6a1d3e88dbacde8902cd44ba72b4bc5cc GIT binary patch literal 130 zcmd;N5N7}Z9R>yl69xtbI|c>@4+aK?AO;487zPH0GzJES0tN<#Dh37yPUb!k_|L)G U*Vo$G($@!Jd6CQl>xG#H0NdXyJ^%m! literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002E.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002E.lmp new file mode 100644 index 0000000000000000000000000000000000000000..e7abfdf9346513ba30ad2bdeb4ae1b0b7c3eaddb GIT binary patch literal 101 zcmZQ)5N7}Z6$SzP|t5tbKhgz91GCdtYCRkFRf2U*CUD zj=sKDA1H?d#PRm=0jpx?=<93q^7iooX<-9#JiWYqTKf9_vvTzHwR?Dad4o7CAdb6- vr&nuV-+yL~zP=7OcMnf6haJLc>+Ac^!rIr@?hazHGWYeh_x1f}13L}?v~N#c literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0030.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0030.lmp new file mode 100644 index 0000000000000000000000000000000000000000..0055e27d817e9a493d52332cc0e9d95ab08b8154 GIT binary patch literal 414 zcmWe;5N7~^5C#T@7zPH03>zPJuv%tzhyl69xtbI|c@Z00stz6b1%{3I+y-9tH-61q=)fTNoG^*qQr4;6EE{ zUte2WYhT}gR^Gn8c6X0fkT4kkXW{SbYj<<^Xl-q2X>M+6YU=BQi+Or^`}p|!`jITw Q-qwa}9>`X(Z7||L0M&*_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 zcmWe&5N7}Z4+aK?2nGg*Tm}Y)W(Ed^Squye8yOfFjxsPX++<*2c+0@Rz{tqJAj-(V zpvlO<;K0bh5XQ*Bkj==zP{+u?z{=bQ0(>kWvajzy3u|9rdwW}79}jz9Ute=mQxiF IehBp+00wN82mk;8 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0033.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0033.lmp new file mode 100644 index 0000000000000000000000000000000000000000..8fe96acfd94f4df3f167fe262e99ada8f718994f GIT binary patch literal 334 zcmd;Q5N7}Z7X}6fZw3a25C#T@R0aly8U_Z22@DJjOBfg!b}%q7oMB*Kc)-BG@P&ba zfrF8OL7I_)L6?z%!IqJML4c{RudnYvKTBU3A(oMWft8~V4g{D$%>OK0eSPiiZEdZsEiHY0{49NaO-+4$|5^C^ z`r6&xJv_a!VD}r`Z?9UXXb{J}@ypu$$ZZ`dUC@ hU?*b{VuN_NuaBFpudk)K8KjPt1r!*4eLPV5KLC3Zidg^v 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 zcmWe)5N7~^00stz7zPH0ECvRKDh39I9tH-6c?=8;n-~}vjxjJW+-6{4c+bGVz|6?N zAkN6Zpv}m@V9&_F5X8v9kif{mkju!xP{GK+z`@=J1OM4M`}*2iTU%P1oBR6yvvK$J zwRw1YdHeYIHu?GeXXWkdYj=kV_%`+RVG&{B@9S%KbNBFUZE5lG_4Na(f{C^E_4PHw z#Mr><+WPu<*+8Pm3fsW$X-3i9*4Nt7(uX1DO<1hGt*x)s+XrSbD<9Z&kPys$oSc17 gF37c99DRK)K0dx+4|22h^|drNgT#4QAR7Mz01sr1WB>pF 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}Z4+aK?Kn4be7zPH0bOr{7Y6b>|Nem1Os~8v<_A@XrTw!2fc*(%P@Rxys zfrpWSL6VVyL6wn#!GMv0!HSWAft95X4F0pQ_4T#4x3%^4L6~mts7yXqusRfJ9*(}g zzUHQ;rY00&ZqB~GmS$gHKR>XzKwn=w*t8ZO9}K}(Z%n~fFK-_oxUu|T?H-<9-Yv}# rC;VsOf{C^Cfo$f0a$7+hb_fT|2KfnW^?w#tu=o1<{|J_ZJcMGOoK+ZY%aPBAbr++$#1_{6}#z{beH zAjQbQpvTC-;K<0p5X{KHkj%)yz|PVK20T#uKO1*nUt3#iYhO!qb5md6e^%bUzIJyH zPp=jqA75XP2n%0dU%MMf$Qv%ik0Rs;Rt6Po_44*<_Vq;;YwK(EZs}{LnwSR`J3KtS Sz|Mo%i|J%cf1&#vBWM7~+=hGr 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 zcmWe&5N7}Z4+aK?Kn4be7zPH0LIwtgRt5%!nG6gJYZ(|A4l*z>TxDQjc*(%P@Rxys zL6DJwL4}cl!HkiC!HtoDA%u~Eft{rf4F0pR_4T#2wYK*4{b%Lq>uY!S@bqfw>*IsT zv+(!zwYz~ty<7U4o0^*X`u?Me`T8M?wR(Znp@_BhwNfV5?2BTaN2`~&kB_f!Qy<7J rd~o+c#s0JKA`5{W$I1=$nYWKmb6?+oHcp7ATUtOoc6M-3fQbJ9w5@=x literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/003A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/003A.lmp new file mode 100644 index 0000000000000000000000000000000000000000..d4f79df58b1f4f8cc1a526e11a5b6ef3b29aa08d GIT binary patch literal 159 zcmZQ)5N7}Z6$S9*S)M;DIia literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/003B.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/003B.lmp new file mode 100644 index 0000000000000000000000000000000000000000..a642f33f3d18f0824a87fe4eb37bfa2ad7ef58a9 GIT binary patch literal 175 zcmZQ)5N7}Z6$S`wsvXuQ>4l 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 zcmWe(5N7~^2nGg*cm@WB3(8|cbFo}_YVJ;&Bg8)-sUtiyUewMzzrl!8W z|Ew$^eqSFSYhPcJA4r6St*@`Wy{)aUkC&~luh|zN=;q$m*T>D#2NHz}^Y`_&gN0jK ze0)*GT3fw+(8N4Ey})8%n_2k4dZA)XAXl;Q!h~8{ntj2Jfr+$&EX5%LHwdb$?>`I3 zUG45Lv%&VU^7ZxgwY5Q=0QMC-PhVdjvO77s`uh41UV-=(8U&!w=xYKS#m@{5wEqC6 C*qF%x literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0042.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0042.lmp new file mode 100644 index 0000000000000000000000000000000000000000..c0260da51e211d5a71daa794ae2975a0b2cfd455 GIT binary patch literal 377 zcmWe&5N7}Z4+aK?C3A(D}SA)Aqbft9xp75r!6@9S%8Yi(_5X>M);fxbS7n47zYrn zkFT#^6UkyA^SoPHnwpUGw)XY4c(?TRkt62b+T!Ky)6#_7Ev$TfeQh8ox4@kY6Kd&e y@$vQb1^I%Fr?0Qo!xJLX+}HP?ou#j@wWY6*hqbS-r5Pl`!2}8+US<&4_a6ZI)r@Zd literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0043.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0043.lmp new file mode 100644 index 0000000000000000000000000000000000000000..53e6dd15021dc70ee110f655a9297819f5700143 GIT binary patch literal 309 zcmd;M5N7}Z2L=WP9|i`7C|UIqq+1q=)fn;94wPBJhs+-G25_`<-z zz`@ACAkE0Ypu@<(z{cJO1OHh$`}*43+FDy%TKf9_vvBwIwY#}{czSvJG=um&2tGuB z7fHak38aJ%ECMpY$Hx~%sIRZD1t!D>QPtPS!`|1|?Ca|X)=NN?mkp#AO(`!cNDx&! cFH2uvGhC>>t*x(*j|t?*|Ew$^s;}=q02458umAu6 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 zcmWe)5N7~^00stzC;Kazl5XQ*Bkip2nP|3)^(80*SFqM&kfs3^d0{(Nd_w}{5wzM?&_5J7I?CWdu z^z!!c0rA+m`}*2Ez+B&^zP|s=jD3B5Y&?B^?e0jTOw4_Koqc_5yb$r$79Ss9uyQ8B zzP`>5uxM*vUkgl>tFN!qr2}MgYhNEPdtYC(udg4-cqXunYkOZ`TWen*9~(#pBEbpL z;_B88axoThx3)f1lb8ki`Z`?Q+}uG1!7OIs@9XPub949bL^zQZ3_{hM( zz{1GDAjZhRpw7s^z{=4F2me{P`uf`2+uB-NTUz@1{D&ssDcXlfpsE@^)>tA7K7T*2XbRG#0H2n c+Q1%Z1{=l(@kn1E9}`IQKPwA}>g)Rt00|CpLjV8( literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0046.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0046.lmp new file mode 100644 index 0000000000000000000000000000000000000000..b21cbb17f2ca1486771a1de7cc7835f68e7d3e04 GIT binary patch literal 306 zcmd;M5N7}Z2L=X)Kn4beR0alyDh39I2@DJj%NZCL_AxLpTw!2fc+9}S@QHzefsv7c zL4c8gL5`7uL6ebzfs>~X1^j2{@9XPpZEb03Zf*jDzP|r#0)2gLZJu7_(tjB;TB 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 zcmWe)5N7~^00stzNCpOmGzJESQU(TwHUTFrATsfs3UN4E}R)^!4?%wzM?&_4WN{=j!Wg zYxVN>@o8@A>-*2f)7RJL;R)jV`ho;l`TF|W-C-hrU?F~p5XcB$Uq7%Ii$GsryPLa5 zE69pwm>?Tiu&u9;kG-$2$q%ZO6DHc%*T;`6!3C9QZD~Q15roNjw;&k=v9qnO)w`t+ zZYPppGu(9`7rVKGRQmY%`a)a`@)$x4Tw!2fxW~Z2@PdJX;Wq;V zg8(A~gDN8fgB2qKgC8RULlPqc11oPID)`UB-`CgP-qzOI+S1b8+|<<6*9Q@EbNBG{ z^7irZ_4Nab3H0@~Ba2}Z^o0w8P4tGC2ohxFgV@{Z-2!3s{pV!u>jQIu zOG|TeQ&Uq@Umrx!&E3P(%iG7t*VoSvn;=9be_vlal1i{bkQlO&eSQB~dC@Hf0K~;Y A1poj5 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004A.lmp new file mode 100644 index 0000000000000000000000000000000000000000..fe1e14f4840d9328f7a4583f8d0f1885481a143a GIT binary patch literal 223 zcmd;P5N7}Z69xtbYX$}e7X}6fKL!Sd2nGg*Tm}Y)CI$wE=?n}Es~H#=_AxLpTwq{e z5M=7>>+Ab3z|z;()C6L%_VqRSp|V&7Kx$yP$qy{eBGA{@-rm;M+S=06+>9*f=I-I? nkC!M-`CfUBnUE`g%4Q_Y%>clvVkB+v2wxe1kwKiigZ#c literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004B.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004B.lmp new file mode 100644 index 0000000000000000000000000000000000000000..12896e9445c5b5a920d41f4957bf71b7c22d71ab GIT binary patch literal 368 zcmd;M5N7}Z2L=X)Fa`#OJO&1aHUCz$n;<3H~z(_w{vlc67A2x3#slwzM=iH#If&^+Cj4TwLAU+&w(K zynTFpef`K5hnw#WHy_zGt==sVm;Gnu1v6T`ynUL%tp6+6G>$;tw@uaA!vLiha#0AZwz A=Kufz 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}Z3kC)TF9rsNI0goWA_fMAHUlhdq4l*z>oMB*KxX!@9@Q8td z;VlCL11oPID)`UB-`CgP-qzOI+S1b8+|<<6*9Q@EbNBG{^7irZ_4OlJ3~nAoFDoCy V(q@PdFI!(9VJ5^md@K;{{{eL)T-N{q literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004D.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004D.lmp new file mode 100644 index 0000000000000000000000000000000000000000..44b71c8bebc698ad5f9a3c915ce1dbe045c56d31 GIT binary patch literal 487 zcmWe-5N7~^7zPH0JO&1aCI$wEX$%Yus~8v<_AxLpTw-8gc*?-Q@STByfs>JeL5h)q zL6ebz!HSWA!H1E7A&!xOp^%Y*p_P$=VJ0I3!&*iLhJ%a@3|AQ$7+87xP{Dr|{=UBU z_O`ax)|Qs$=BB2mzCMVUo4bdnm$#3Pudg3@Vo2uk_4T!b&1-3aSpT1e7i2BOist6N zzP|rpr?s^~>;yZ5ou{v_ueBB722QTNzP^?gn3FK%F^#~qh6RgTKtTX?9@T;XEl9ym KgZLdn{s#cOWVJZ} 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 zcmWe+5N7}Z9|i`71O^6%G6n{Q9tH-6MGOoK+Zh-bPBAbr+-6{4c+SAU@R@;u;XeZd zg8(A~gEAungE=DugEu1sLp&n`Lop)*11ob^YHX)fx6*8J9}SW zo2Qp|OJCoA4)(sjRxfX#=DxoFoFKNh517r$16AGP>zPJuv%tzhnkFT$vpPye7NLUy{m>6+n!<)e7K#Xrgb|li+t$lsGU{Q!G_~D{`&Az^1F;?EbzIJyH&(@X}A75XP-7pb|&p;w< q+ 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 zcmWe+5N7}Z9|i`75C#T@1O^6%JO&1aItB)Y2@DJjix?OfwlOd;oMB*Kc*wxO@Rfmq zfrpWSL4}cl!G@86A%u~EA)Aqbp^=e+fs45h1pafd_x1I)wzTy1_5Ek(?CWc5_44*< zZtm;*&&J)?*XH5ruYy&_h{|w>udJ) z^#kc+VTX(HvVnvlqHJK%w!S`yU=vs=LXfquuek~2C>9}@LXdl5_&=8<3T~d53?Um{|5l3#g|9` 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 zcmWe&5N7}Z4+aK?CBGA&-%Pft9xp75r!6@9S%8Yi(_5X>M);fxbS7n47zYrn zkFT#^6Uky=^L#+Yf%WqB^|iUR_Vx8O`!s>=|Ifk-72;w8iGqZY#Mr@Nz6ibUt$i(E zw}6E}PIhzmXhCuwE6574i<@CCh6^?KH9fzba*T>7&*VhE`89Pf~Uu#QW XA0KO9UsDsv0uCmSBl(#@WZ!=PtUQa@ 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 zcmd;Q5N7}Z7X}7~AO;486b1%{N(Kgo9tH-6`3wvUn;94wjx#VY+-6{4c+bGVz|6?N zAkN6ZpvB0*V9UtB5X8v9z`@)H0s>4R@;^IkUteoWOJ5&9OJ848Q(xbIHuk>0Ru50F z=Dt2Y*1o*Ima{{fLT BgM0u0 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 zcmWe&5N7}Z4+aK?Kn4be7zPH0bOr{7G6n{Qb_NE9nG6gJYZw?9_A@XrTxMWkc+SAU z@RxysL70(&L4%Qj!G@86!IzPNft95X4F0pQ_4T#2wYK*4L6~mtU?x{zUmKVSQuUvO z2g+?}Zf@!WDdmL-w0L>@_%tFUYXImX>Ci2qzavq`Ar0*AJwJ zhrO?_uL;6t 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}Z9|i`7PzDBuL-*2b+1JE-R?;|mgD<&0rBegouxCQxixLKeCXoA6yJ% zke9cQk1s@wl^0@BD_97mij$+S56lB`*g5<9`dUHioBR6yvvKzIwY7om?d$u`%GuY~ q4t7Qh0UoM8R5MYm!*mS`$RB8K28%%h0Ok)CEJ1)7PG}*C63hTGRjXY9 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~^2nGg*R0alyG6n{QZUzR1MGOoK+ZY%aPBAbr++$#1_`txx@P~ncfsK)Y zL4c8gL57imL64Dv!HJQ9A&ilMA&ZfLp^=e+VHzU?!*WIj26m>tzP>&_F!`U2rLV88 zt*?)lrLV8Ksju%pD_dV*ySqngUmp)!UthDYFG!Guy|1s`4I;`87WD%Q^FxF^Tl-pk ze0}kYwYPbAdbRlY_%=0x^s@4TT+s#=Y6da?bFlaIwR(B`H23xW=Va~cYxQnHVIj+7 d>Sh7C1}$KzKer zzP=zH2T0D#+s6mYW95b#=I!It3~~oI%tCJnp9|_-FYgwRG$)J;<{|k7$^VEjfrb$P DQfi2s 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 zcmWe)5N7~^00stzSOx}$dlhdqjxsPX++<*2c+0@Rz{tqJAj-(V zpvlOj7kj2QrP|wJ~Fqx5oVJRa613Ob+Utga9nEcPm+Sk|D*4Ed@&(hb| z)YRAapM|Zjuf5&9t*?)dwXd(q4=&~g660m->ud5w6Xap<>udH!7v<*Y>udIb3G?^$ zwS!G)@xc&l@x~Bq^}-bM^z!y;hFK0V&%@KpyBY2vxL6CqksM%qJv>|b`jFku4iRoe q6$N=6>_}v#tRSUrFolpXVgZFwUmq_hgqr&L`u?+mgOd+T{s#b(tDR*4 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 zcmZ?s_cIb_P>5n+kYN1(pPhl7ftLXU_!$@&*g*^i1_n+Bb};5=5MbbB5Mba3Lm>tM zFa+s=Dr8__5MdBt;A0SC-~*Ea4D1Zt415ec45AEz48jb841!?&Af18?;tV1TA`C(d z$_zH#3=Hh-4B`w7>I@9R+}y?t4E78R{tOJ!?Cja>?B(3t?fm?cg@ygCjTeiHN4r~R zhr5?2`#0xD_tz)S?#^F6yL|KN=H=PhjSLSM7#RMrGBU9K5&X}}ApDP$S(ueo_#X#| z68Xo@EW*kv@{bKfiT-0_7G-4>{l@~L#Qw1`i?Onb{bObUQ7r$&{kC|DF2}&_A{S#+k`p58(=`q-1xa9~3FbT6FoB`&*9K$5SD)Nt= zNraX4p9l+^2&)L&KM`hD23FR8q71D6ME|q?W%$R+!0?Z?kzqH(Lxz8>-xwHJ{|Pg& z{$=>j`j3H;RpcKJw+Jf(1FL`lh=g)k1$lS`LHvKBAkzf@ax;Ut|5%wAScU#_F$%H% zW?*C$`pXGr3IF9_6b6e4|7C}=ME4TKWEjPmK#u#*zz7N;Mlq%zpl}msVEV@JkLeINh;YUY3n*^b{)zkt`yCYU zQyETxgP(!*pAZAs*G@41d9i<*xt(>kqJvJdA>@zd)?tAl4sH0{F?zC|M=W!5&0hFa!!I?tj9~*=r`j3qj;;Mfv z5Qf-47FIEkJ0bZUWCu9n|FGU+IKc3Y^)CYh>o>vwtp7nF_MPXyAQLMC>kpy7+)P5O z3_n;Ig#LlD(H~GY6#mP}C=5=U|Al{pGSWW=CRP!V-|YWIKuL*_RpbviP5)(JWEK6# z_FoiKo`9Gv45B|kSyJpD%XhK=tPEmbnVG~`SwD+0vNC*TJ-~2?;Rov<1_st2f}jk~ z$SU{~6my_#FZ2Tva}2D1APML%!yj;22X+Vp>mNvt1}PQ!#m)$dAO_Yykc|9~;WsOT z=sz}4?qy*8E&3Onk6FdOLyEs2%>Tteeg(PcAH#RngA5lLezX1r1(3jRa0Cke13BZ5 zAPXq?1po0c39<_QL2h^pER@5U33K$H^f46BHN1|2TdNL!w>e2m5~!P*D67 z`OC&60=ANraNEN0ll3RVf7YLZ46MHym{F zNP|>Y46MI}!GSFDkDWz?m4Q{{50nPiUkt4OME*i5vcGH$qJO}#3aZIO|FHalN9z|B zHc&ce783)-EXbz+tUtv5v;JcE!Mc^<0K;cc(0m35%~wd!d>(Hh)?EivERE_+PSSDr`Uhi-wZ!l_fp9{-@xu+ zVEu)h_x>W~Jy@am6I39A5`@@quwy{^{uel!ezNXixXSPkTn_#d0+oZ%Yz4_q;F^&2 zAGmEmR3n8Vv+&iI>lnU)%ZYD-4B!G?@CPWlgQ^^%@1Wx9H>hYA`UNUCe}S4c!aqUf zCMX37|Ks=%Nm(G(@Dc!&z(5TZXgMJA50uV8m4@hFw!fl(L1_(?Swz3U%Je@hzs3GS zim^Y;3}Sy+8N~jAi_~A>=w)F24JulHvHoHB&ANf%04&7`LE2J6KY0ENf%BX2KkmQ6 zf4RX)O86fagYZ9A2I0S4pwuSvj}uZ%{pAETAw~Xi{1y4f@gLl36aB#sYI!h#Dm}Kp zBLCPR!eal}pjyD0RqP)NgV;Zi(;%tvAIo2{KM>}3W=L8573|!vtos;_GkjzH53PzA z1iwQv=yynt_{a4VUUvP0mR*d(;Gl z2Eo6em8r2+ELPZm(d2G!F4#r`t?7yAz` zkpGH-T4jG(k1(8I_zEiizJgs%ICNpf@lSS0vqIz_+iz$c53bn%vVuG<3Myhi1uY{h zfxtb=@B`e?_yMg;e?p7AAJFRaFV}By41+3$-_RJw>IQJC6$O=ap!O21_yxs3r1*uf zK(!?y7Nki2$?%8uHN$3x@2tNW{?g!?phyQrG^pzT&kAkXgIeHXVyvGS{KFLO%Ot?c@CTHi zAgx!(NC7m=pcJg+LJ2`c#S8Amb3!W!j{m~{IsQYNYQG`fd2rvH?Z3!>w*Mlq+{q*g zN(!KMH!PqLDFEC9g^xf$c;MLoBle&552)Ju!}_1$H|t4o@Pmq4Q1FA2KD0RwYE^=R zA0!6roiKtLON_$co))Bn1<68!AHo6!KZpe_JeWXr7t3!^P;cZXBsKm7JL5aZ3Ex>S zFsxw!)t``_F}SJ5!1@bZeEtE|0ic{I_y>~senU&K-;g@sH>49F^c!3S2>;>)h2bwq z!T$@?g%|z>8y5L5@{b+V5dhJk)CsOi!L=yce`sSs^dB22IRAi2_&5$&2-Ho$5wH*+ zfzuLbpa&(GK`s4%;I0oexIt~Ie+++E*D&m1_{;hmlD+tNDzfK z8sHsSXbB1K6oK3X9;N~hXfcX`s~J$e#{wSg_|5PaRPTYtI=(RcW4*+1kl_z2XyD+F zz<<^s;G+Hy&wrG594L_peFNohkl8|ixc&+Kffk9v|2Y2(|6~0x{12KVz{5!(Wx{`9 zQOYO+PK5Bb9W336{9^-mZ6MhnqzBSh2aO#3WnmEg$I2l37gQdAq{RNR{1XG$03g?h z{XmrYf546A9}J+p0;=5qupVUC1FpUpSicK`ib+OR!5?5Rfeb=aU;nuN3PB?YT%;p= z;~xhbc;Ex6$Yc}&cY#s70WuJgDq$r(ESrNG`0&mcxa%tR2i)&q0Hr_<&`={YvzQpz zSh0WLyap=IKm{R$%kU4}dV@61zA->6wXdMzEindGQ1pFc*bZ*WLTYNz=!2l(4`_8J z^bMK||8V^kLiEEy@r5)t$|lSTstF3i;$6328cYU=mw3#fyactGcdA3gh2yl;0gdd<_Y!cKeAix zuofGv*$!!v|KotBKK8$&|JWgJ7ySY2S&02(`!Du~4OSb2z4QlMCxP4uEy z#R~0i`~g+dpq3OPsGb3}HV!Zx0Jru2v;F{$UNW!>3H{`Ow1K~KgQ{cUzg#~-1C1h} z{snj>LgX*UAJ9lBXw>K@`+v}YFavnJ2I9Kkpz#kjkgcF@&0naia1P?YI{KjYq|jF$ zaC_h@H)!DWkMLivKf;WxpoToyc2N5W)Zpe|6an|(MgOrgLi+NMObYJ7|78OWRe?Hh zVt-jc4Qo(GP3$+gy$u@d5EJ_Y$({dM|BL+xHQK&I`xRdq{;{4zX@-G1wV;u#|Da(t z9#}IA;>Lg6kTE^se~@7M#|7g6>1{tRWwT6F#$CZAw?qk>kZU{l<8o;B|2v5MqRsX?! z0UnqGRmTu-{N;kQ9iTMA`JAwH3ik&z=ZXGf2i0!ixBwLn&h{DBOK|A0`Sp6xe=|Evoc)`2VZzu;yptVRdXph$;Q z>YyMN{0Hri{RLHfAQ7RzkhTo0=7Uy&tir<39_(Mv|H7d0tN)7%ZoQBNHqFW`Rb@ zLF4A2_ArS41NGrL+WGYls9_J9k^zm~{1^TMYTZM82Oe?;1v;Y$WZVnX-uN&22UK$X z0##h1zd=9>K>C#cQ)h2anDGKTF8pTOfEp9Dd{BKQT;vit&y1@Le@ zsF(2%JVXf|ga;*ak-xBlOXM$T1PLSt87zXb7({ 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 f23d3c3d6..42affa036 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 3ef9a7640..d20eebe23 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 598f7d6ea..d88996766 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 73c7aaf42..826f44181 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 7ae2050b4..9a536d3bf 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 61a1fe0be..6ea1cb70d 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 dc858f3f1..94c79b109 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 127f5f2f6..a826216fc 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 cc684976d..31e241418 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 6452c1f29..9c938f43b 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 bd565cbc7..b5a265c65 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 da458303a..5e47183ea 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 7b8e81bf9..f34138e62 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 1cb1f4e9f..20fb57ad3 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 0b11ec124..67b95b56c 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 e2605297d..71ddb4efc 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 ac34d1cf5..bd7fa1c02 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 3e288a0fd..e5a17dd4f 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 f28942109..f22a55791 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 0eb8fe67d..0cffb38a2 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 2924de96d..f2130ab84 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 345f4b731..313abb275 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 1336b47c6..2dec05a54 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 c5f14404b..53384cf2b 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 c8dcc3d62..a127a1378 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 64ffc32bd..f74fc8264 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 990ab416e..2854290c6 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 4ca5bdce4..f3ab51d73 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 ecd24efb1..d7a9e7c2e 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 bc0fb865b..5431f8b5b 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 59551a865..d03f21044 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 c6cced98b..2a54e8e5d 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 c2a0d5941..dc6b0694d 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 300905b09..090b0bb1d 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 2fb24b464..9104e546b 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 6e8635a15..d23bfa65b 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 0eb8fe67d..0e2720da2 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 2924de96d..2ef4ff196 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 11c7aa1a4..ff9a69792 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 d23bfa65b..9396e84ff 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<1qKENeFg>wX9fm_a0Uj3Yz78~dXNNH783Z+z@L>B5E2#^78Vi>6^Dw2 ogn)!&v$CQSv$DWqK_NjwK|vv5@kn9;0YO1Q0pXEwy{N_m0GTN(J^%m! literal 134 zcmZQ$;9&p(1qKENLk0#0Ck6(FU}Go92*-Oo1B@Mn3S0b j76=Fm4GoRS%#2Qi3IqlP28G6FW`@T@1u(QAoBAIBXM8Bj diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0022.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0022.lmp index cc161c725ebe16d969a7ca09a293ce7285bb98ec..7d1d386197233c9f5021133ea6f030adddd9d45a 100644 GIT binary patch delta 90 zcmZo=Y-METW?-GjY~q&%2LBmYv$6uCJeL4uKifrU8>1UMkne-Jk%D+|Pp%F6oBzz>ql%1X(~%8G(8!D7kr@$vD=$qBL1 zk&%f|b)i9_p;6J%5s~3RK`=3pmhh~sED+Ah$^si74lzCystu$hE-Nc56vTjv#Y9HN t#Ky)ZgoH;%CPBqQLqbA9I4m?c7$yeN0x}weVa5kRj1Pj^mIdL0WC2Z_T`~Xw literal 251 zcmd;O;9&p(8wLgjcLoNAAO;48WCjL?5(Wl_Rt5%!X$%Yu3mF&~HZd?T9A;o(xWd4| z@RWgp;R6E$12bD@W@c7qR%YgZ5Hm6}GbA(fKLbxD2&80YMuBLEKyrM1d~!l;bZ8<} zMQBiHRCGjSco0k=D=RBJGcz2bg_#Y^3xz7q%*>3-%nXIdfy|GIjERj+2nml(f~p7& i2@MSi4GRs131ouJ0vVT;1$JFfW@Zr7p5ZiLr@^;okyv$EJgUW$#4hL{NRDLcsXksxpW=YRzW E0Gs7)-~a#s literal 327 zcmd;Q;9&p(7X}7~PzDBu3<%%u4E`jm|&D=RZAGxI+HRi|Z5 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 zcmWe&;Aa2<4+aK?2nGg*Oa=yqY6b>|J_ZJcnG6gJOBfg!)-y0L>|$VGILg4laDjn= z;Wh&U!!rg3hMx=!4BU(i3^I%i3=Aw;V8Fu+rv8KYF_BqW+$>pH0nu4mV1dZ+tSm0p ztgHYK11thk%*mFO6&@QKo0avS1I$cJ&C2@Ej$pDunCV$r|5-uI_(Tws1;k8G12LIF z%vi7}6NCveff2-vj|VXsK+MR(mi}j8&B_W2iiL=PTncti2vh*#K!{&JUI1$W E0Dr++{r~^~ literal 263 zcmd;O;9&p(8wLgjF9rsNXa)v`Tm}Y)1_lO(i3|)3a~K#HmNPIgY+_(wILyGnaE*b1 z;ROQ&!%qeV21cf=tgI|fW)PY6pMfPSD>6ANi-RRADaH%=EPMtgQb`AZC0bh{*_M#;0aw taf0pt&j1pLj7)`C4RXSN2G*>sprBZY2*?d!*M&d@Ku-A20C6_d3;>>WPI>?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 zcmd;Q;Aa2<7X}7~5C#T@6b1%{G6n{QE(QjMc?=8;n-~}vjxjJW++tv0c*nrNz{JSF zAjZhRpvB0*V8_V7;LFIsz|5Ql0vs$LGArvp6L(ftVr*M`=1~U&V76eik5DwFeRV+R^D~ly4I5-TUE<7ylT?PgQJq88_Qw9bGdj@Uj_z-7zPH0Tm}Y)ItB)Yeg*~x7M856%&e@e|4bZN zSy@T3@$n!IBUe^da!^=UL`-;UX6AnoH!wINJS;3CAv5zo15Z{~d_;I`Y;06$Xd+l3 kGc!0m8DvfbLB8lDVNla-Yf5t9TJi;s$kii(Pfii(Mj1F2)=&B}_2iinPh wiH?bhiOS0Q4-!cVkBCo7j895TOwP*s&%~XTm6ZqqSy@^CS=gb*W@Y^c0M))VzW@LL literal 158 zcmd;J;9&p(4F(1Va|Q+m4+aK?NCpOmECvRKN(Kgo4h9B>sUQW+nIOOkq5dv_eaHu#-R$x{bl%18u J0yYz74**fuFW>+G literal 160 zcmd;L;9&p(0|o{L3kC)T7X}7~00stz7zPH03z^u^tL=0A7Buos!icW&*02}lF|9=2%_bAr@ literal 80 zcmZQ$;9&p(1qKEN4F(1V0|o{L3kC)T2L=WP4+aJXR^}`a_z$APva(Rfq}u5fq}t~fq}uFfq~)we+HH;FaR@R SBD1o;B9svr LpPBg|s^UKYh{h4t 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 a1eb8b04732ea7048ea3e7db3f74a213b62d3545..f60e5221096f60331203a7c18287a3484a194628 100644 GIT binary patch literal 236 zcmWe&;Aa2<4+aK?00stzNCpOmWCjL?JO&1aN(Kgo76t}}eg+1HSquyeOBom#HZU+S z>}FtKIL5%haFKz5;Wh&U!xIJu1|H@t5cto{l9d$@ot5>Ui#01NATm5F>pv%3R#tdy zY;0E6e-1D+F*PgeKRbfS24SXWW&LLbG2;_KOcoF`Jq^TU1~Fs7qD&Ab$OJ|ZGd>=~ bWB@TEBf(78tgN6QkYx-kSy>@q2Gnf;!GuS4 literal 191 zcmd;O;9&p(8wLgj7X}6fUj_z-a0Uj3BnAeCTm}Y)3I+y-W(Ed^J_ZJcnG6gJOBfg! z)-f}8l@$VJK&=J< DIubXg 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(69xtbM+OFl00stzLT1 zz{HUS2mcwlva+HfAU-SWKLbxzR!~S-SV%}nSXe4lARsI{IyyEsGAJ1;z!DEJAPB65 zB`XUgz`>H06#^FE$;x6$gs2FI34n}T1 zz{HUW2mcwlGBcwgAU-qmKLbx@W>832SV%}nSXe4lARsI{IyyEsGAJ1;z!DEJAPB65 zB{LHwz`>H483GpI$;@O)gs2FI34n}A^ a(9ocupr9Bef$-4K@SsGf09Z4W_zwW0$tG(6 delta 104 zcmZo?Y-gOHmYA8DnfafIIWsdTGxI+qcV;F_G)M@H|1A^ a(9ocupr9Bef$-4K@SsGf09Z4W_zwV@IVL^; 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 zcmd;P;9&p(69xtbcLoNA2nGg*Oa=yqDh39IZUzR1ISdR8YZ(|A_AxLpoM&KQcmz_+ zk_85AY+x!YE9*Z4PgYiVd{$OgP-u8y3{)T}F)J%5A|@sx9xA{RpOqCF5fc%Sgd`9U zla&>ih%6AFmBkVb6#y9)6qA+30y8u`JR%xoAjm9;wGk1~5s6t@EFd!&*|M@C!b8Ke SvN%|v#xg-&3ladi_dftnT}l-I literal 243 zcmd;P;9&p(69xtbcLoNA2nGg*Oa=yqDh39IZUzR1ISdR8YZ(|A_AxLpoM&KQcmz_+ zk_iTEY+x!gGxI+KPiAI#d}d~5P-u8y3{)T}F*7qLA|@sx9xA{RpP3mN5fc%Sgd`9U zlbIQqh%6AFnaL6j6#y9)6qA|B0y8u`JR%xoAjm9;wGk1~5s8_ZEFd!&*)lUD!b8I| SGdWnG#xg-&3ladi_dftF*Gaqp 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 c4bce99f1605fae46f77a96c5c37c95f342ca800..fffcba017a42a3212197d93cce8c5ea7d330aa06 100644 GIT binary patch literal 233 zcmd;P;9&p(69xtbR|W=#Fa`#ObOr{73I+y-P6h^sSquyes~H#=_AoFooMm8OxC2tm zk_84FQ2IXuOIB8RL{=6^AT%i}3oH;A0}%*^3&cYNLK8tMc(SrsV!*~^K~z8mK!R|A zfS9bTprov<@HD8FpqS*en8dW?B$z;GOnhQuVlqU4kt-`JIwn3IB$So)pNRuvK8XAe E0Q_J_r2qf` literal 233 zcmd;P;9&p(69xtbR|W=#Fa`#ObOr{73I+y-P6h^sSquyes~H#=_AoFooMm8OxC2tm zk_iSJQ2IXuOJ-(xL}n&PAT%j66D$xI0}%*^3&cYNLK8tMcrr6tV!*~^LR3HnK!R|A zfSAn8prp*q@HD8FpqS*en8dW?B$z;GOnhQuVlqU4kt;JZIwn3IB$S!?pNRuvK8XAe E0NhSTQ2+n{ 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 0179bb496a0b42dc32c2411429a8e69d71948169..97a93cdd71a1a0f9ab80a274af6df03727e72aab 100644 GIT binary patch literal 211 zcmd;P;9&p(69xtbM+OE4KL!SdXa)v`3pufeR#sqOU?2+%3kyUaPgYh?czAS7OhiODOiM&ed}3l^VtjlW$YiJ)ApIcx9{@`M BKHvZV literal 211 zcmd;P;9&p(69xtbM+OE4KL!SdXa)v`3pufeW@cbuU?2+%3kyUaPiAINczAS7OhiODOiM&ed}3l^VtjlW$YiJ)ApIcx9{@Ck BK9~Ri diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003A.lmp index fe2e53b7f6302ce44ce58f36b88763f80692919d..65609d3f2b7c45129167140077f0fbe89c450a50 100644 GIT binary patch literal 112 zcmd;J;9_84`148EG*|$n2c!Z-|Ns9V0ABzf)Bpeg literal 105 zcmZQ&;9&p(83qOhO$G)AD+UGzZw3a27zPFgW~QvHtSnA2`Jag;D=RWND~kh4g9XA8 TAp#&8ED#hA5dhKuQS<`XDe7}^;a7-lgrFsz=a zX%!qFpPH2#8ylXL^`C()D=R!QGBqoUoh>UXJvI?6$eNWE6cn44#lf1Dm7bOkQpb{& Y6%w13#mSPDm7WL^V9o*oE(rA>0IN$RjQ{`u delta 112 zcmdnRxR6nklYxf;1aue}7>pPg7_1l=7+e?_7y=j=7~&Wh81fhx7#bNE7$!~BwX%zh zOwCG-O$^V>{Ljdml@$~eo0Y}Rnw6EFmJSkP$;t|e&C23n$;wJk1PL%_fdD6SR#s+a G=6?XGF&sny 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`1N0dfq}uCfq}t|fq@~Efq@}~fq|izfq|ikfq`Kn0|NsCa~24&K&by9 xZc@4+aK?AO;2oR@O`i_zz-*WkzOZLRm3TR#0X* QlogN}2xetvfwlYx0R7n*J^%m! 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 zcmd;L;AH>-0|o{LdjX$%Yuix?Of)-W(IYyl}`&H@20 z2=$+VB`Yf=HYpvrRR#td?L}FHSe0p+L)_*3>tgNv3sF=i55RaKXD=RE6F*PMC>pu%CNE1j8 QD|1#BNQ8|sD=X_i0M|D*z5oCK literal 161 zcmd;N;9&p(9R>ylYX$}e9|i`7cm@WBd2*9 unVA_L9~G0Bnw**WpP4-~Gb}DKH6=6iKMPn7NDV7puWI<1R4( diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003F.lmp index 3a2e18a42d24be8bbb094b97a4edc1814c2c33aa..132acc43c246ac84d02904fde3eb9bb2ecf5854c 100644 GIT binary patch literal 255 zcmd;O;Aa2<8wLgjZw3a2cm@WBVg?3=b_NE9*$fN}s~8v^YND>^oMT{M zxXr-8@PdJX;WJ1hOC}inXJE<9j84qV1TzAYK@6VE%)ofCY-VN_l0bBPVrF6zR3IQC zGczzQB{L=kCJ>XE84wnc8HKDOAS5_5JRV5}%;5hF9GRJ+5urg4S&q!ih=`z|plFa% aj?B!&@X+uekgFKkGBXn+B0x+gn3Dmqu1?|r 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 zcmWe&;9&p(4+aK?Kn4beI0goWTm}Y)8U_Z2UIqq+c?=8;>lqjr4lpn6LOWo7+moTLL=fq2E~NOLj_{evXbKCld^(f0^!M7 zF~_^d#fionFIvJ3TYVM?{AXv)%F2p~$;$fA%AS>#l^7ikVl#7s*fHUOfzer6|CzY5vJzv$ z!$X4;v$C@OGje8SCB;OBM?!e)Sy?fW(O@Me0zo24@$u2|@rj8^AQ7Idtl;p-$jHd(XpnLL8F)bMiH?bmiH-~h8N$e& Um6ehhp9n%A9Uyl>j02JX0hX0gTL1t6 delta 216 zcmbQnG>vJ3TYV-7{AXv)%*>35$;|xE%AT2-nHU`oVl#7s*fHUOfzg?n|CzWlGZSON z!$X4-Gcz;)Gje8TCdEXAM?iS&nVB&W(O@Me0zo24@$u2|@rj8^AQ7I-%%Jdyh=_>jXpnLL8F)bMiH?bmiH-;d8N$e& UnVFmzp9n%A9Uyl>j02JX0d8PX`2YX_ 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 zcmd;Q;9&p(7X}7~PzDBuGzJESas~#54h9B>nG6gJs~8vXw5ijIzsj!DYO0t*DkXJrLO$HYV@LInar z0-?d7;qg#`;KZz~z{u#xNSKPyl&q}4n5?XTXsC*S_^hme7>FR)P>=w~oPbEE3J?dZ z1tE}_7#IV>P!$2e!O`L2!GWPLL&Jl^gM$Nt!^2?$@u9&1Nl5{bATRu9nG6gJs~8vFR)P>=w~oPY?Z3J?dZ z1tE}_7#IV>P!$0|LDAviL4lz#L&Jl@gMtEr!oy(#@u5KhNl5__ATRu930}D$Q82o4A$jZt}ijPmq%F6oB$d#3q6axk+P;O*=d}3l!Qc_md ze+HhctfZ8bloSw=4i$(=Ndp-a15v?}l@*hcmBqo5l@$us!jhF02^9#80cl~$$^tP^ lR0JkMw1DXU3`i=16Jc87(Nsi2wM524Re&4;G89Dr2LQPvS9t&c literal 286 zcmd;M;9&p(2L=WPPX-2tFa`#OR0aly5(Wl_Rt5%!X$%Yu%NZCLb}%q7oMd2NxW&N0 z@S1^v;SU1?11}>30}D$g82o4A$jr=4ijPmq%*_1H$d#Fy6axmyP;Nwgd}3l!Qc`B- ze+Hh+%%tSxnG6gJs~8vWIV`- zP`E9Lk>TOt;h~|yAcrw>Wo3nj27*9zR@Q$IHz_hQG&ndqDJ$zg6Gv87R#JR?QdU;h Me-;*yIayi%0gK*X2mk;8 literal 307 zcmd;Q;9&p(7X}7~PzDBuGzJESas~#54h9B>nG6gJs~8v;m86p@$oUCF-R&v#s-1~STZvMVlp#1p!9zRC<8?xFdm{J6lQ2>L_Eld zP`E9L5#izC;h~{HAcrw>WoCwl27*9zX6AnoHz^__G$<%KDKqmw6GvudW>S27Qf6l6 Me-;*yIhmRN0r}!zGXMYp 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 zcmd;M;9&p(2L=WPPX-2tFa`#OR0aly5(Wl_Rt5%!X$%Yu%NZCLb}%q7oMd2NxW&N0 z@S1^v;SU1?11}>30}D$Q82o4A$jZt}jE_&u%F6oB$d#3q5+4~E86KSiyXW+@oijNEr4-XFw4o-v$ghs~4hl6koR3I`jD=R!PD=QeLB{(T7D>Nl53vLET sZ)j3hRv_Gr6f_lJOV literal 286 zcmd;M;9&p(2L=WPPX-2tFa`#OR0aly5(Wl_Rt5%!X$%Yu%NZCLb}%q7oMd2NxW&N0 z@S1^v;SU1?11}>30}D$g82o4A$jr=4jE_&u%*_1H$d#Fy93K%85gwfk*WHc3Elqjr4lpn?}(5S{`N z2!siQLInb1peh1m&{PB_W@WLmgUrnePDD}!5{rz9kAaKDL(~NX1_pv%$dZ*63KI(m Z2!M&jCqdN3fLsqX4`e#XJP-}?I{;7_X=nfd literal 346 zcmWe&;9&p(4+aK?Kn4beI0goWTm}Y)8U_Z2UIqq+c?=8;>lqjr4lpn15ajVQha=TVq#KKQW{hsCOH{oP;zoQNPs0XGbSxFlY=EQGdc+>5S|PX z2!siQLInb1peh1m&{PB_W@fUogUrngN<>lw5{rn5kAaKDL(~NX1_pv%$dZ{E3KI(m Z2!M&jCqdN3fLsqX4`e#XJP-}?I{*pQXyO0> 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 f174f3ad625133506618722455e21b0190b87d0c..b2b14f62c40c3b37e0b9b58fc12189219f7b3121 100644 GIT binary patch literal 299 zcmd;Q;9&p(7X}7~PzDBuGzJESas~#54h9B>nG6gJs~8v|tPFILg4laE*b1 z;W+~X!w&`q22Mr>1}R1c1_qui6!0G;5R(W3@$vDA85v-K(D;~`nCQsx$oQ-*h(HWT zAUZM{CJ-GH9}m(Np9IwcGBq+0L}q3EXJN_83QdGE0zrB}B47r{K9H*5cn}FSJ~}2Q vCNdsmB2*wSGCVvyJTx>o1||?58VCZx(NKZt#Q6AV5CB;NGZbQER@Q$2%8_5L literal 299 zcmd;Q;9&p(7X}7~PzDBuGzJESas~#54h9B>nG6gJs~8v|tPFILg4laE*b1 z;W+~X!w&`q22Mr>1}R1c1_qu?6!0G;5R(W3@$vDA%*Y1||?58VCYG(NKZt#Q6AV5CB;NGZbQEX6AnYi(*~1 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(1qKENLk0#0Ck6(FU}2~9Ul`PA0HDFlbDqS n76^_{OiWCQj}DKA3B<%C#>Xec!&Ss2fm9?V#>2EAoBAIBat0|0 literal 134 zcmZQ$;9&p(1qKENLk0#0Ck6(FU}F79Ul`PA0HDFlbD$a n76^(@OiWCQj}DKA3B<%C#>Xec!&Ss2fm9?V#>2EAoBAIBXwxX$ 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 zcmd;O;9&p(8wLgj7X}6fUj_z-a0Uj3Lf0{_`qva%u*v$FoPv1VljB3R+!AThSAtkB?Kurym%R#r@Sd{)+f z4wkH}P!NNG2V?{o$49~hB4c7=Vxl8Mqd~eDxU;eX!b3wt0|Ns?v$Fn!_<`ZUfx*F{ a;b3{LtgOh$$jF$O_$-h#2iPz$@gD%H!$TDS literal 194 zcmd;P;9&p(69xtbTLuOOHwFd8!G91VB0e({%m|8sGD6`ZAO-^uSS^T%4~)*t{0|a{PD)Bjj8966Pl5^rMkFT2 o$Hd1#1h_LZL*o;ZVqzj9K!!4KXJ#fQgSEtGf;4b~OoQV80JS7KvH$=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 zcmWe&;9&p(4+aK?NCpOmECvRKY6b>|9tH-6xeN>p>lhdqb}%q79ARK!xWvG~@Q8td z;WGmR13M!FgCrvZgC-*bgE=Du0|QSM3iuBah>VVmj*p3siHy(60t*C21_uTQhlYp8 zKm`JVLjwW>0|SF$0^y;N(V@}Nk#H>_Q^P?-R#w)3X4b5%K(G`OdsbFpcyuU8A0ua0 zRzPTIXfVVSZZI!6G&nFY8fHyoXnYpP<|L2+YgSeO$OUX{Sy|yRF)1K1maMFR#H=iK o)~u}1=tPhRb5>SNRu%_KR#rGz7Zb=4oXlBSky%;)xxl>t0QEOu;Q#;t literal 318 zcmWe&;9&p(4+aK?NCpOmECvRKY6b>|9tH-6xeN>p>lhdqb}%q79ARK!xWvG~@Q8td z;WGmR13M!FgCrvZgC-*bgE=Du0|QSc3iuBah=`7ej*p3siHOh41PcU41O)~Kg@%X6 zKm`JVLIVN=0|SF#0^y+%(V@}N5pXRaQ^P?-W@hGpX4cHiK(G`OduC=}cyuU8A0uaG zWG$=4I8fHyIXnZEf<|L2+Yi4Eu$OUX{nVI1+G07k?mdwn6#LP@~ o*38V%=tPhRb7p2tW+n$qW@b287Zb=4oXnY-5t*6)xxl>t0J)1`X8-^I diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/004C.lmp index 3846ac04794519e7d983d7161bfbd7b8a3eb7664..74cd603944ed061ee3d583936fce769c4215c956 100644 GIT binary patch literal 194 zcmd;P;9&p(69xtbCk6(FAO;48BnAeCVg?3=76t}}sSFGZ^B5QymNPIgY+ztu*a=e1 znS}uV8Mw2u5>t|rk`m+Nv$C?l{LuKsq?nk<$QTfxCo3y3GBGheCO#%U2`Uf`R-cpv j7l0ZV9~hmL^`CAdMh_fY8Y3n8d_H hu&E${;K-Pm#Kfe;_#~(kVv>?lQj?P6K|0Vp2>^OKWI+G` literal 316 zcmWe&;9&p(4+aK?a0Uj3bOr{73I+y-P6h^sSquyes~8vQ^e@QQ?KEW6b~n 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 zcmWe&;9&p(4+aK?a0Uj3bOr{73I+y-P6h^sSquyes~8vU~ zWMp`FJWL=wJUlWyG&nd0Dv%f&9vT@M9TSt7l?65;F)}hT5@POuCibi>5FaGR3}%N0 zg4iq|c3>cw&B~UQl^7Zx3^fm;GZdl@cw&B~UUnHU-#1T_z$GZdl@sz>}2~8kqvJB{Bx&EU-JGqvPY_6XO#> l0w8C{#Ka^fB_+l{ot+dO8K0Dt2r>}j!^FfykPqSh1^}nEWugE8 literal 333 zcmWe+;9&p(9|i`7PzDBuBnAeCLIwtg1_lO(i3|)3ix?OfHZw3V9ARK!xXQr5@Qi_h z;X4BZ0|z4mgCrvZg9al5gE=Dug9{@A0}D$g82o4A$jr=4jERZK%*_1H$d#Fy6c`#B z8XA}csz>}F78j%dLB_amoEU-JGqvPY_6XO#> l0w8C{#Ka^fB_+l{ot+dO5ucQl2r>}j!^FfykPqSh1^{iIWi9{! 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 zcmd;M;9&p(2L=X)Kn4beBnAeCVg?3=76t}}sSFGZ%NQ6KHZw3V9AIEzILpAmaEpO~ z;W+~X!xshyhW{XqJXt8 z*e%h~@$vDA@rfV-kkeygViJ>*5@SG4=g!Pb3Xh0SN=i%y8NkE^@@8UUVrC|Y3-dk~ I6Ug!Z0m=etsQ>@~ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0052.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0052.lmp index 27730f829a2a4e1b310e7f6f6448561616989dc4..174b26e0b486405757b8a066992059307f5b5569 100644 GIT binary patch literal 310 zcmd;Q;9&p(7X}7~PzDBuGzJESas~#54h9B>nG6gJs~8vN;MKq_J&X8&j4$jS-;34oPjaALBuf?-w#MrUOOMkj(bg6$5B zj)@5l4h#&Af!Q4z9vU1R92^KXj3+BAF)%nhJTx>InG6gJs~8v2ftfct(q^vBEP)uT0)_(?`tgOh;(9qDt ztgJwoKyYYiaA- zH3MctB+LvD17u4$%odP}(3F&irSTbAS&1?6@i8eNLs_!25>v9W SSV6u@Oa$8l^(h;a{to~<2WL9~ literal 327 zcmd;Q;9&p(7X}7~PzDBu3<%%u4Eq|8i^P)uTG=6?pB%*=?;(9qDt z%*;TTKu~CCP-t>yW zH3Mct1k4N&17u4$%odP}(B$N#2$(>0T4rWMOiT>irSZ&}nTav+@iECDLs>F26O%JD SSwX%^Oa$8l^(h;a{tp1-^kz>0 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(3kC)TM+OE4F9rsNUGjJgC{F1AQCJKCjK*k1;W7~G9IK9BoGi791su~92^4^ n2o8=64-Z8M1V%B)#!?gs)gUtgINY=4rWrc(7g*gcTslY%$ literal 212 zcmd;K;9&p(3kC)TM+OE4F9rsNU|kJEILN@jaEgI} z;Wh&U!y5($hCd7p3_Oes4AP7Y3=AAuaPXgjD=RBHF)1k}B`GT_>puf`R#spV1f(JH z6B82?V?cbKtgQH?#Kgq-n8=tEr~uTo(7?p3tp6M=Sy=%vMqm+>#H7TSNRR@MyTYSmKo*1Lxw5h%Bco&D;~~yQ_7VVR C)n3d1 literal 296 zcmWe&;9&p(4+aK?PzDBu6b1%{5(Wl_76t}}sSFGZ%NQ6K)-y0L>|kJEILN@jaEgI} z;Wh&U!y5($hCd7p3_Oes4AP7Y3=ABZaPXgjD>E}XF)1lIIVm$U^FIT3W@ca#1f(JH z6B82?V?cbK%*^NuLnVA7FMqm+>#H7TS2#^AhyTYSmKo*1LxiT{&BBEpB;~~yQ_7VU) CpvJ3SA7-;{AXaz%8HK9%F6oBz@C*A5E>Z+W^-m`1%!u(LwVd;S&`A4X z5Lq6O*7%sn$nen6_^hn|%$!+SS@DtKk&#JRS^rttv$Em?L!%Mwz|a(!s+i!=@ZgxN ztpC0YU{hiu!^1;E1EWC>09g|m92y!J2(gAUD=RQG9IPDXyl{vNYgSeOgvAVUO4fe> D&mvDU delta 212 zcmbQnG>vJ3SA8Z3{AXaz%#4oD%*_1Hz@C{I5E>B!W^-m{284%)LwVepnGw<9p%I~> z5Lq6O*7%r+i15(R_{_}z%$%8-neh?f5fMq5ng3bYGc)4@L!%Mwz|drvs+geA@SvE? z%>TX&U{hiu!ox#D1EWC>09g|e6dD>B2(gAUGczzW9IPDXyl{vNYi4EugvAVUO6Gq6 Dr-@F{ 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 zcmWe&;9&p(4+aK?a0Uj3bOr{73I+y-P6h^sSquye%NQ6KHZd?T>|y~OIyyQ!GB`9CrUGn2aA06yN>iq9Z{jg4IOF#Dmx%y`f1-i6{mqB_&3tL9LEYNlHwNkBI@B2y$FxT1rxUOniI{ WSOs@hR!m}ie0+RNOgu;js^|y~OIyyQ!A}BNnrUGn2P+(wSa%Sd#7WT}{z|f$en9R)o%pi75bPPzG3B-<$ zj)t>iq9Z^ig4IOF#Dmx%y`f1-i6{mqB_&3rL9LEYPD)ISkBI@B2y$FRT5?i+OniI{ WSOs@xW=vvye0+RNOgu;js^nG6gJs~8v9aBwt86G$LDG(09aFd!f@E9*ZaS5{U) zaBy&NXedYn6Gv87KzMj)aAH>0e=sK|GCC5(0V#}(PD)8hN&;~iKn5ixC8Z=KCB?u5 tLX(nGva%u*Ap)#fS)qwZ5a)zKgjhgA$WCU?%8G}0DIDZFut%ZZ1pp<5VDA6` literal 290 zcmd;M;9&p(2L=WPe+CAI1O^6%Vg?3=76t}}sSFGZOBfg!HZm|U>|SnVJ8YI5IQi z;}esT)8L%=#CVVlNMU$%bbNeFB8bZXF*zbS8p-6qz?j6$%xI|HtRVL#LYxx~aUn}) RW^^LN$u$W@UxOCxTdPSy=($(O@QfR#re@Xe5Zu$eooH z92^)J1Jak3^`D6=D=RoWIyycv38bHyGb<|~GBPqU2Ba9q3lEQnD~$|~j*J9xK_&&- qhKEMNjACHV$_fmJNHVZxWd(+UwSk-z0AaCYWd(w?GBAT}{|^B6TuC(m delta 196 zcmZo;YGazLxXr-8@P>hb;V%ON zgCHXVgDN8fg9Rf4gEu1sLo6c$0|QGI7_hT~sjRI3Ad&F+tSmORtgPtB$attwKnz4E zAUF^%6rGjD%AS=K8X6oJjid}D78n{H90L;L$;tw02n`Mm4u=VV%nAq$%nF1HL}rDC zh9+hOfQ{kF$_fYw4h#>@$_j{tnh_8l9v+#Pl?BrJpMgCqD=<7fJUT0jg9TzfSS$c+ x2v`iFjx8%IFf=q6q6}gLVAv91xhJ%9TKL7;JZjt~1 literal 366 zcmWe&;9&p(4+aK?CLxXr-8@P>hb;V%ON zgCHXVgDN8fg9Rf4gEu1sLo6c$0|QGY7_hT~sm#p(Ad&F+%uF`6%*^PBhq6}g{pAv91xhJ%9TKLD}PZUO)R 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 zcmd;L;Aa2<0|o{L7X}7~2nGg*90mr41_lO(DGUq@D;O9Ub}}$9oMK>LxD8UspM?(o zGw^3+#Uw&Oe0+RjRu)(+G(ILKCOSGgIwCwG9wrt86^o9DhKWVT#K%MR$0tG6MI^$l j0WtqGuw-S0CT3-ELus%;U_3+sL}M2K83NJ*qW=Q`4_!)( literal 218 zcmd;L;9&p(0|o{LM+OFlAO;48WCjL?5(Wl_Rt5%!X$%Yu%NZCLb}%q7oCGQ4$wUGF z8F(@?V-i6iK0ZE?nHek)8XprA6CDvA5ucd}5r_c^L`Ou!1fpZ&<3ZZulb~865+UY- h=>H5XnVF%9nVB3=8Y~bP4-o*-*abi)fV6<<{{Xg#K`sCQ 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 zcmWe&;Aa2<4+aK?00stzNCpOmWCjL?JO&1aN(Kgo76t}}eg+1HSquyeOBom#HZU+S z>}FtKIL5%haFKz5;Wh&U!xNAJ%vm7tpMfPSDpuf)R#s3Dn8lWr6&@Lxnw9mR z5yXs-2QisI%-BQ_lNrKH&&vAG0%E48ftaiyW_%)u$p&J^f|=|PCP*6xg2@SH#)53) aV$I45hz!rl`p?ahl@$=3mGz$o>NWtZy+?Kc delta 143 zcmaFExS!FImw|@?1Z)@>7+e?_7ISdR88yFZEjxaDV+yE(L$pQmz zDE*&-B`Yg5F)Irs0HVPHf$o-jxN delta 133 zcmdnaxSf%imw{&@vvp-=W@hGpR_4si@XXBrEG(Isq0yO{|Cw1cGs9zIGBf`(v1Mik q1_gy?X8vbn%ghW73JlE5{LcVlh6V+piXy2+7yvgDW(gY;*iHZ%7%&(B 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 0d99021d5bfebbc37db15756b5133f994c5745f1..400fefe10da955b23b3fa9dacacbf0245b39c662 100644 GIT binary patch literal 164 zcmd;KU}0cj`1;?1fq}u1fq}t`fq@~Ifq@~0fq@~Ffq@~9fq|i%fq|icfq|iufq`KX z0|Ucs1_lNOmMk#%4`PJGW@UjHLD5h~NF=W(J1GLs^-bAQm$dSk3?c0M&dHO8@`> 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 zcmd;Q;9&p(7X}6f9|i`7Fa`#OBnAeC0tN<#dIkoDUIqq+nG6gJ%NQ6KHZw3V9ARK! zxXQr5@Qi_h;X4BZ13M!F11ED92>fSf&C1G(iOI_P&&r;am6aGB4q`KNg4i+Pfq~Ik zS^t^1va%9m!ox#@6SK0i{xfoBWhKQ#hDSnp>{(ecknG6gJs~8vnG6gJs~8vXw5ijIzsj!DYO0t*DkXJrLO$HYV@LInar z0-?d7;qg#`;KZz~z{u#xNSKPyl&q}4n5?XTXsC*S_^hme7>FR)P>=w~oPbEE3J?dZ z1tE}_7#IV>P!$2e!O`L2!GWPLL&Jl^gM$Nt!^2?$@u9&1Nl5{bATRu9b5I;0DG&nFY93~JL9vvMW z9T^!469|Y&0_n~QhyiI~$;t{y%*x^b(a|u0B#1y@B1{0PA`~pZla&=5nF2N=Gzp{v zBoGr56B!d96A2RtjSLSD4-XB63xtP<1_lNOhDL+U;LFMi4v&lkIV~m;WYm8KJ`e@L UiHV7z004(Y3fS);CPeN(0Iy?s2><{9 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0415.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0415.lmp new file mode 100644 index 0000000000000000000000000000000000000000..ed6f0036d65a6bf6efdef18117166fdbeea00cb2 GIT binary patch literal 286 zcmd;M;9&p(2L=WPPX-2tFa`#OR0aly5(Wl_Rt5%!X$%Yu%NZCLb}%q7oMd2NxW&N0 z@S1^v;SU1?11}>30}D$Q82o4A$jZt}jE_&u%F6oB$d#3q5+4~E86KSiyXW+@oijNEr4-XFw4o-v$ghs~4hl6koR3I`jD=R!PD=QeLB{(T7D>Nl53vLET sZ)j3hRv_Gr6f_lJOV 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 zcmWe);9&rP00stzcm@WB0tN<#W(Ed^DGUq@iy0UgHZU+S9Asc%xWvG~@R)&t;R^!; z11lo~gBT+NgEAungApSGgEJ!oLl`3iLpmb^0|Rpw2yjBE{|qcyS-~+`SsW}`Suu%O zS^pVWv$6sMW3sZ?S+laDNgxgb56Jke=;-J~FylW+AUZxKK0ZDs24VwGR#sqqVq#)ad~|p`$V!kvOiW^Y zd{R7IMNCp+e0*Y3BHRU8Sy|CBF-Z_ZK~{!?j0}f6Cq5}DF$Tm1Sr{G}nUR&15fcv< VK=x8fBG^kv-cA7vK*9qSEC72qbSD4+ 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 zcmd;O;9&p(8wLgjUj_z-I0goWdf(3Z8vO-fJ$^(%FKpc?D z{|r1?Ss+em5`=~bBtf*nRYWFcWrZhZWx)kPBje-4K{y6vEl*Zfd}MfdWMpU{$gKa2 kTv=Js;o;FS;b09QZc2P)R#td)N>BSqK0YxqF)<0`3no-g0suF%V5|9tH-6xeN>p>lhdqb}%q79ARK!xWvG~@Q8td z;WGmR13M!FgCrvZgC-*bgE=Du0|QSM3iuBah>VVmj*p3siHy(60t*C21_uTQhlYp8 zKm`JVLjwW>0|SF$0^y;N(V@}Nk#H>_Q^P?-R#w)3X4b5%K(G`OdsbFpcyuU8A0ua0 zRzPTIXfVVSZZI!6G&nFY8fHyoXnYpP<|L2+YgSeO$OUX{Sy|yRF)1K1maMFR#H=iK o)~u}1=tPhRb5>SNRu%_KR#rGz7Zb=4oXlBSky%;)xxl>t0QEOu;Q#;t 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 zcmWe+;9&p(9|i`7PzDBuI0goWd!&?RhhJOqU4E&4?3<``442Fyh3>++3VDKNrh)K%I`p>`v7622G@lb)7n3$O8 z=$II|Kww~acxZTNa9|8nML=L^XlQU?AVh#WD=Q!}IyyQ!GBOgRfGaC2FdS@T7KqD| zl?73U%m@evN%3T5ffxw2JXu+Rk>Ox~WP4y>Kmg1#kcvQ%noy|iJXu-c(b170H^a5S I3AdMh_fY8Y3n8d_H hu&E${;K-Pm#Kfe;_#~(kVv>?lQj?P6K|0Vp2>^OKWI+G` 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 zcmd;Q;9&p(7X}7~PzDBuGzJESas~#54h9B>nG6gJs~8v|tPFILg4laE*b1 z;W+~X!w&`q22Mr>1}R1c1_qui6!0G;5R(W3@$vDA85v-K(D;~`nCQsx$oQ-*h(HWT zAUZM{CJ-GH9}m(Np9IwcGBq+0L}q3EXJN_83QdGE0zrB}B47r{K9H*5cn}FSJ~}2Q vCNdsmB2*wSGCVvyJTx>o1||?58VCZx(NKZt#Q6AV5CB;NGZbQER@Q$2%8_5L literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041E.lmp new file mode 100644 index 0000000000000000000000000000000000000000..809cd26a996a5b6a6cb6712da41d97af6b77f26b GIT binary patch literal 333 zcmWe+;9&p(9|i`7PzDBuBnAeCLIwtg1_lO(i3|)3ix?OfHZw3V9ARK!xXQr5@Qi_h z;X4BZ0|z4mgCrvZg9al5gE=Dug9{@A0}D$Q82o4A$jZt}jERZK%F6oB$d#3q6c`#B z8XA}csz>}2~8kqvJB{Bx&EU-JGqvPY_6XO#> l0w8C{#Ka^fB_+l{ot+dO8K0Dt2r>}j!^FfykPqSh1^}nEWugE8 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/041F.lmp new file mode 100644 index 0000000000000000000000000000000000000000..c0642613eff653aa348c6fcd6cb31fced1900c8c GIT binary patch literal 299 zcmd;Q;9&p(7X}7~PzDBuGzJESas~#54h9B>nG6gJs~8v|tPFILg4laE*b1 z;W+~X!w&`q22Mr>1}R1c1_qui6!0G;5EBy<6CE8B6B(bC1r`Vl3=aVpBBP_Dqaz~`TEY?L{%2sx%7Q3GW(0)8OhZx2la&=184d;r(*gqn0|Joj Z3k(FQ2}L*{JUTiONUMT30}D$Q82o4A$jZt}ijPmq%F6oB$d#3q6axk+P;O*=d}3l!Qc_md ze+HhctfZ8bloSw=4i$(=Ndp-a15v?}l@*hcmBqo5l@$us!jhF02^9#80cl~$$^tP^ lR0JkMw1DXU3`i=16Jc87(Nsi2wM524Re&4;G89Dr2LQPvS9t&c 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(3kC)TM+OE4F9rsNUGjJgC{F1AQCJKCjK*k1;W7~G9IK9BoGi791su~92^4^ n2o8=64-Z8M1V%B)#!?gs)gUtgINY=4rWrc(7g*gcTslY%$ 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 zcmWe&;9&p(4+aK?00stzNCpOmOa=yqY6b>|eg+1H`3wvU>lhdqb~7+A9A{u)xXi%7 zaG!yJ;WYyT!#9vdMg|5>Mg|53<}48S&%lzE6`GWl^`C(?D=RcUF)NFU2_nIkl@$;k zotTxy$()r1R>7W?6%ZI2nV6Nu!IG7gl$e$EpOHH&D>yhXFeWQ8CO#|cKNDA0R&aQ9 zbbMquh|A28l@$;f85tg#mGz$)q(3q;62xX=2dRq;j|Q2+o|P3C9vT?~as`+j841$N Zz?PL27z#EA75G)Jz000<%QL6v| 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 zcmWe&;9&p(4+aK?Kn4be7zPH0Oa=yqG6n{QW(Ed^$qWn(OBfg!wlXj<9AjW$xX!@9 z@SK5x;R^!;10y2?10N#;gCrvZ12an&82o2q%gTz3j!w+V`p?Lbm6aIE!V(DMgoXzO zhQ~u?0s^zL0>K>atgL{@tgOIjhzSflSy|Dck>TNi(ea5%Sy}%<0)gS7fq{XcF)=9! zfzZH!z|e5GiqPno7?22xneh-aK~4#Xfmz6rl@%Hp8VIo+^ G9s&Sclvn2f 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 zcmWe&;9&p(4+aK?PzDBu6b1%{QU(Tw4h9B>nG6gJs~8v9aBwt86G$LDG(09aFd!f@E9*ZaS5{U) zaBy&NXedYn6Gv87KzMj)aAH>0e=sK|GCC5(0V#}(PD)8hN&;~iKn5ixC8Z=KCB?u5 tLX(nGva%u*Ap)#fS)qwZ5a)zKgjhgA$WCU?%8G}0DIDZFut%ZZ1pp<5VDA6` 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 zcmWe&;9~#*4+aK?NCpOmECvRKY6b>|9tH-6xeN>p>lhdqwlgp=9AIEzxX8f3@Q8td z;WGmR0}CSqgE%7tgBBwLgDE2e0|QSM3iuBa2#<~q4ULYDj!DYO0t*C&gLvWLp)oLl zXplfmcxXISATlO8Iyy2sJQ5}VGc^z-z`>H06`Gor^&iYghU$SSiG~Tprz9mNB_+nk zfb@VI5}A~el#~=76Q2mx5*isDlbD#87@q}OzL zxWK@`@Q{Il;S)$BTNV`jXJF6DiVO^ojL*vY&%lwD6&M*49t!8gM1}@NLuDf4BSTqY zpd65P7LYO)maHtWD4fB-1CoS@f>{4S0)c^nfh;U6ED+Opva$jK0)s&~7;GX>R#sqm icyvrmWMnwVRFIa)nE1rR#KidcM39|OLqP_D@P7a|%}xmb 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 zcmWe(;9&rP2nGg*Oa=yqDh39IZUzR1ISdR8YZ(|A_AxLp9A{u)xWT}{@REUn;THn~ z12-cBgA5}BgDxWjgBc?OgF7PwLj)rOLnb2wLlq+fLpLJ>0|QSM3iuBah>VVmjE;_p zj*Q950t*C&het<;M~4PRLj?i?0)s&~7$y)N4b~GG3KM{t3f98Gl9d%03Dpaefh&y+ z508n736F*g1cpaPN5_PRhr;cT1_{K3hsHzAh>VGjj*g5DkAw-p3=IScfUFBmg(`)~ zL?=T9;!~0mladnSV?av5-c3qLN=k~4iBE*82#t)6NlZ*kj8B0I#3aTiCdS9d$G}v; I3FSgFhn!LjofMLm?vrLlYwd!&F8Fh82tq44WAl7#Mi6P{4nX zKxA}eWOQ^)bYx6c7FZxKJUlu&JUTQm8Y&PF5Eu-?!7zdFXt18hP?!MBRInBfmaMG6 zNT^lqjr4lpnDnO>c0g+Idz?j5DxJ-C>U|=XrPhdb`csPuc6dDj239^rsEh{T4IvV6Sc4m-0 GS^oht4_Ph% 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 zcmWe;;9&rP5C#T@R0alyG6n{Qb_NE984L^zD;XFVb}=w89A{u)xWd4|@Q{Il;T;15 z!*2!#1~x_p20lgx26;vX1_MS021iB)h9E`;hGa$t1_qui6!0G;5E&mC4FWMqSy^C# z!0716$oQC;=tP)6d}L^7Xkch~JWL=lGBPwWIx-NZ0%U4nOjcGvbXL}X7LKf}!1%1J zfJhi8CNU8t3zi8F4-5>2D+>q=4~KE$LjxisK~}J`Wo2bWM}yqM&I~dd;w~@?N`M_2 z9TO8186O`X19L`TWO#UZcxY&F49ub7p@AR}46*~{+33Xhc#vn|euJ6^rv3u}ipF(9 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042C.lmp new file mode 100644 index 0000000000000000000000000000000000000000..79ad68157497514ea94bc1277f55369a2b94b4c0 GIT binary patch literal 263 zcmd;M;9&p(2L=X)Kn4beBnAeCVg?3=76t}}sSFGZ%NQ6KHZw3V9AIEzILpAmaEpO~ z;W+~X!xshyhW{XqJXt80qKqOQqFeWh(ArlxF l7z)!98W0#74&x+621G`J>|wq^vBEKy+eO7FZxK9wHD569`R#2n2!!c(SrU z0w9AxD*rR^WMzS5LX#jgL?8*G3a%nDF)J%PF)Ir$5E>aD9}dDXAZvNDvf?Ad!^6Wv y13_l}XXMJtiVhDCj|>NE0C7{|BO@cjqf@f7{xfl8Wo0GC$0ufGW&LM?c?JN~U|9M9 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/042E.lmp new file mode 100644 index 0000000000000000000000000000000000000000..027ddd5d325993ce14c0b8b3c184ee66f6f3e56d GIT binary patch literal 400 zcmWe(;9&rP2nGg*Oa=yqDh39IZUzR1ISdR8YZ(|A_AxLp9A{u)xWd4|@R)&t;R^!; z11lo~gBT+NgE}Jvg9Rf4gC`>cLlh$eLpCD=Llq+fLpvh_0|QSM3iuBah>nkmkB^Uu ziAl`L0t*DjCnhE)#Ycz7!vtbt65~N?U@Bsg5)-3i5) z!^1;Eg9Bj#fuZ4{!NI}7fr(HRfzdHB!NGxn!7*@wtgOK3M6jv<891`C0%EeVg2DPh zocOG)0I*&Z4o_BA07xbVtPNs!Kuk=0WMp_G+%bW{k&%&+;h~{m{U9xY!NI|yq2b{$ TftbkX=;)YegcgW#5b{3&!hm53 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#+0fq}u1fq}t`fq@~Ifq@~0fq@~Ffq@~9fq|i%fq|icfq|iufq`KX z0|Ucs1_lNOmMk#%4`PJGW@UjHLD5h~NFpYZ(|A_AoFooMd2NxXHl4 z@P>hb;U5D7gAgMFgBl|PgC!#agAXGELmVRm0}pc+2>j<_&C1G3Ny^Il&%vIRm6eo~ z1Y)ysW@Tk1CMG7vgLo|5Aeoe;q{O5|5TBVRD=R5JK0YZaF)=4O3FUI6rA5ZXM8|;CGH_>Qg-3_Sr+}=_%KFd1mX#G84bsNWl9d%0 z4-#U{$_kE*&&ooG@IytivVuWM!3ObXWrc@F$HylohR4LjgADx7$d{HD86F-Q8Xg`V p9vKdDEF)i5R#Id%7{tWHfP|QMv$E1a9*744kO=>;OOYc$k6b3 zs8}#aU1&^nbYy5GTr4pqD=Rc6F+M<R2{78#S6m4zf0pOTdo2_k}{VR}R3!S<$P zWg*1EL3TvPq-140W8}@siUtWrM@L3SM`vaI l2Z_XkKvGt8bUesTChn}Plo*iNDInrMGYcd*IGMrpe*iu!bM^oL 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 zcmWe+;Aa2<9|i`72nGg*3z`~vd1OJ)0v$C?%lG4)BlG3uWvi>vjW@Ujm zDVgbsiHT`Yk;IIow3M`zl%%BitgQbG{8?FvNhxV*DJdyQiHS)mP_g)wq?8npaUgM! z7+Y3WbW&nURu(5)R#r?JNb)}eYgSeyNQ{d$D=P-XfC$B>WMzSb!r?+-7Dy-(BnMUn z7mAJsTMDuuK0Xm@L3~US)Yf>gU0_=wDj8X`vJz9$va&c?v$En7LB0SBf!q!e0-49e V0+P(i;sntk0cK`!KygB-{{V=ud4>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 zcmWe&;Aa2<4+aK?7zPH00tN<#76t}}84L^zYZw?94lpn3A&QZKA&ZfLfq_2@9sCE0#V00ZWyQqD$HzoRCuU`V#iBuCf#G0~ z1QiR9Ps+*)437*C4-bZmfz*Y^#KgpehoXpqZGwuiW@UxPr(|Vuv1VljLX@#)Wd&mq zN<>w~2GR%;<7CUqN{Wt#*$@*S4-(Bvib(|74|Z`ISdR88yFZEjxaDV++bi}cmq<%$iN`X z$iSe+$iQI9$iU#k$iNWK$iTqDo&^K{nYgpEvXbIKASEj+>pvrJR#r+(Omuj7cw~4? z3REN}JTx>oI503UI3_FWKLdYORuV`BNKJTncoI}BJTfUOD>O15M8L#CL1KX*0?Y#I z4Fu@`6Tu(}h!}_!3X%u_5ePA`O9Mc%{~1`bvVx d6`lwcg1Un>D=Qu*6d40{E-TnBi1A?Ne*p5=bB_Q3 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0046.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0046.lmp new file mode 100644 index 0000000000000000000000000000000000000000..964f8c68e3fcc57acfca8c6cb55eb162056e22fb GIT binary patch literal 304 zcmWe&;Aa2<4+aK?2nGg*ECvRKS_TG&2@DJjOBfg!b}%q79A{u)xW>T1@RWgp;R^!; z!#@TF1`b9B1|dcU1{p>M1~oISdR88yFZEjxsPX++bi}c+bGVz{beH zAj`vjW@V+tM?*k- z8dM}P9t;wbl2Wp={xk4{w4|h^r6eUKB_<|iK*eHGk`hxu#-*gBfOImjWo5-AC8lL% zak6D)rKF{RHM3@AMT3-a!5IG;ShKQ16O*#C*f=5X3XO~h8OfTJ6%JAf5{{0~$_kH8 zgbITV011ajgM`86@@Hj%9GR6B4WeR_Ku+h&%1TQ~%F2q4iHV7h1}S6Y%gRauIV2`A hF+LGw`hOLxWd4|aF2n3;ROQ& z!yg6)1_4F}1{FpI1`9?81|LQS1_u5tbnqV}7N3|H4+b&O(TQ1EV6ni+=;)Zpa4?90 ziUmN#K%&7gvB>zu#KidM==k^;xL&X&kuiy2IxFixD{EF(D2NMY1tM7SNl@A7_!Oue zU_H@^DPS5Z7M+-wn3R;5l#-H?k`5IMj*f{>OoD(km{?3qe0)+;BFIG`lRB8512D9UTJ(@mX15 ovC#0)(9m!Yh>VPZiUmi8heHG-!(r;8|tPF zxWK@`@R)&t;Tr=30|z4m13OC=82o2v%gPE*Ov%d1`p?dul@%Hv6Q2TO$Hc_MgV-Ed zS;5iKG4W|oPF7ZQB3Km{YgSft5=cFW6_Wx|fM7B3gROuN(Me!+AhG!P#Kc4pPE1My y>0sc?$_kB%iI0hi21{jS{f7y~$3#a*M#q3`VBpQl0&4;=i 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 zcmWe);Aa4V00stz6b1%{3I+y-9tH-61q=)fTNoG^PB1VqTwq{exW&N0@Qi_h;R^!; z0}CSqgBT+NgDxWjgA*eILntEyLmDFkLn$Kz0|S2+I`|I~i;0gYpYgSfh obRx)sELmBhDOp+EEFdR<1emk3VzRP$n6t9LT9`o2=LM7h0lhYQuK)l5 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 zcmWe&;Aa2<4+aK?2nGg*ECvRKS_TG&2@DJjOBfg!b}%q79AaQ#IK#leaE*b1;Q<2! z!z%^`hA#{Z4F4Dy7&sUi7=#!Z7#O&-kimZj-mI+n#Kd?oNX*L0`p>|Zl@%Nr9UT)H z4g&E|p+JZbNH7>A#GjQF8J`Hz85tf5R>qHHbbNSdOjg!^F4nB9Xsj%d4v=h2bRtw; cd}0cem6(zaV1DO^Y85tP~x8*+*dsbFJXgF90Gdeps z7%UD_6B->Iod`8GG$uMG24MuqRFH$>6O$4X6BA)>jEs)~i6kYZrDbG7-54Gi7#JEF Z4pI#=0qn*UkfubC-lUYQtpAu{005iaaR&eZ 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 zcmWe&;Aa2<4+aK?C-OG!#fN=$@{#ixLnSy@>z zDJf|nb*x!g@kwb}SzI7S3Ro*^R#r?RR46(TCKMi@0#OwTlKaoVnw1p}Vu3V<#wS9} zf(r#l!-OJX8lz+4L8|z(vf|THGQi%8jE)AI&!3eQlavB-Y+_=3BFI>Q~+P_bZ;y3m;DXk@X(l&q}Kn8f&aB)uT9$e2W^W&attva&)!VxjR#AfrIsc#t*_ z0g(ksM1z!ox#1v-khmbX#3ZFa^+w0U#K$Lrxr`iHS00stz7zPH090mr4ItB)Y2@DJjOBfg!b}%q7oMvEPxW~Z2@R5OmfrXKQ zL6VVyL64Dv!G)25A&QZKA)k?fp^=e+VIm^~0}Fc=4E$%}&dSP4jERYfj!w+V%KFd9 zo0XLk4g!(k;o&Jzkw_?rj*QI8`p>|hl@%Qs9vU7F5{{0Hfr^EPhl0$=$_kH!h_Pm6 zg+|6_WpRNR;qf44AXa1&R4679Dijc%0u_qK5DH98f~pFP2dQGu$_h?N0eRp*18Y`R zI7pg{Ju53ZDJco$UIxLetms6L(yXkk`1r&`geb_H;n6YiG4b(<@gP$f1+uat!QP08 jiHV5^843-8$msCM$nfas7?6>WK#ETU=>r84asUDV+v9>@ 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 zcmWe&;Aa2<4+aK?7zPH00tN<#76t}}84L^zYZw?94lpn=)|n7(3qI$ z$nePctSqotC`cA079AN47Xzz{jzQKN5FVeE6&jrcwd_9wS5{U)WK338Kui+IC@?oZ zD=QFU3Kx_W93G#M0kH@q5gHy2H32LZ4z@fpG6upuYF CJ9oYS 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 zcmWe&;Aa2<4+aK?Kn4beR0alyY6b>|J_ZJcMGOoK+ZY%aPBAbr++$#1_{6}#z{beH zAjQbQpvTC-;K<0p5YEWJkj==zz|4{b2LGAZva%9mViL2mxLCm=Sy}%XIkK`6!^1-( zp`wv7@gPyYl$7|G=*aN!q^zuf!04>3{|x+DS<#6xiHYIi@mW~`!7#DNn53+%&`6M2 zcnnlsD9DcB=)|n70FYv^Ua$>;i7CipfnX(xNm*IJARSBGS&%m0M6%R6w4dls~m}rP*nBUn! O!4V1a_dB7#Ii_3k?P7jE;_s kjE3nAj7|cX4Z~np1;>M3z?zj63TFk!z{DcqVqi`G0W|JftN;K2 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 zcmWe&;Aa2<4+aK?2nGg*ECvRKS_TG&2@DJjOBfg!b}%q79AaQ#IK#leaE*b1;Q<2! z!xshy1`b9B25CkH20caw1_wq41_tgdWbmJXH!CYTIwl5$V-mBnvi>vhWo3m%M@L6S zM#sd22PZ;>!sBCLAQ~jZpOqCI4+e>eNl8g*P%*gSF)1nOSy}(NShKRClaipUfM_@? zGzKab3>IVHhwIGBiVh72Tg#u71#(1mbaZq~cytWd4!*3c;PA-E$jI>U@bJh;khKs8 YM?yuxIzhgQi3d43J|+q5D>Q!t0QtmhGXMYp literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0056.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0056.lmp new file mode 100644 index 0000000000000000000000000000000000000000..c40220b0a4ee007a1f8fe6d3518b95d3340105a8 GIT binary patch literal 300 zcmWe&;Aa2<4+aK?Kn4be7zPH0Oa=yq3I+y-P6h^sISdR8YZw?9b}=w8oM2#JxWT}{ z@S1^v;SU1?12-cBg9IZ3gEAun0|QGI82o2o%gPFkOw7v4`p>|Tl@%Nv9Sz}dWo3oN zL`TQOK)5_vS<%ta(UH;7Pys%${>bp?==d0j78dTTtgPsm_?YnU@R+Qu|7@IDSy{p1 z;h~|(yl^lNtTsG6JTfveG9F|%#JK24kO;&$2A-^}@c5YM$nfxRh#NpoijIj64~1|! RATES(*s`)>5+O{O*8n%=UBv(Z literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0057.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0057.lmp new file mode 100644 index 0000000000000000000000000000000000000000..486f60269b5cf33045a2a29f5d8101b2adf6fd72 GIT binary patch literal 338 zcmWe&;Aa2<4+aK?Cpug3R#tFi zcz9@JWMpJ`081oPEG98NJ|-q6COCivE(S9#I5apoB`fPcJ3Cl!WPDcEe>V24tk9Sk zFq@S*xHvs2#Y!3hc literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0058.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0058.lmp new file mode 100644 index 0000000000000000000000000000000000000000..48993a7e4c938827313eee980569c9e707b34cda GIT binary patch literal 358 zcmWe&;Aa2<4+aK?a0Uj33|2@DJj%NZCLb}}$9oMd2NxX!@9@RWgp;VT0J z13M!FgB&9RgE1omgBv3QLpUP?0|Rpw2=G9t{|qcyS)uV+S==mHS@9`ZS^pVWv$BF? zlCrY6ShKQ{V!%RdSy`cp@kv=(oNQTHN%4tkAa(2@!NkOrtSk=ptgMv8B(N|eZ&p@( zT3T90Rz@ON@;?(dL?kIOF$rWEGiO#-d=fG*Iw?Le9xMk^8yX!NniLZg4N?m-Ei@)3 zCMhc^CI;db_N=VH(8$Pmh_&&Nkq}|FtgPV3=tPJU6Qd&&K~7}N$_hnz1uVppl?74- L@-EoDXu$yh9N2EI literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0059.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0059.lmp new file mode 100644 index 0000000000000000000000000000000000000000..9652e731f2a602754a7a53a7c4deed7fece5bd6a GIT binary patch literal 291 zcmWe+;Aa2<9|i`75C#T@SOx}$bOr{7A_fMAItB)Yi3|)3iy0UgwlFX-9A#i&xX!@9 z@QQ(f;Tr=310y2?12-cBg9sx7gA5}B0|Rpw2>fSY$;t|i$;$fAz?zj69GwVav1Mh2 z#>aq}>>y@*d{S1{e@4EnteBLPlr)e&F#gZP3lU05Nl!~n0x4qV$;ygJicgG>iHV7Z z2}CBwL`Q~)hJx(@=?RSt4ULYDiH?CA92y-BvKwqH$O-IOS%IP9;b4ccWn~42N5+GM YS+lZ2LF&NHh6pidWr0;Of%N_d0NT-6Hvj+t 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 zcmd;Q;Aa2<7X}7~Fa`#OOa=yqS_TG&Nem1OD;O9U_A@XrTxMWkc+SAU@SA~wL5Puo zL4%Qj!IqJMA&`-QA%&5Ffq^v(0=QWq^nZ{@Vp2+078h$)Ry>FS7K%ws%*x_q%gTyD zhy}-_WMy%%gT)flva-MmgA-G-ve-GYvZCV?lMtdHgV;F1qKSzqDImrCSy_QGNg&pYZ(|A_AoFooMd2NxXHl4 z@P>hb;U5D7gAgMFgBl|PgC!#agAXGELmVRm0}pc+2>j<_&C1G3Ny^Il&%vIRm6eo~ z1Y)ysW@Tk1CMG7vgLo|5Aeoe;q{O5|5TBVRD=R5JK0YZaF)=4O3FUI6rA5ZXM8|;CGH_>Qg-3_Sr+}=_%KFd1mX#G84bsNWl9d%0 z4-#U{$_kE*&&ooG@IytivVuWM!3ObXWrc@F$HylohR4LjgADx7$d{HD86F-Q8Xg`V p9vKdDEF)i5R#Id%7{tWHfP|QMv$E1a9*744kO=>;OOYc$k6b3 zs8}#aU1&^nbYy5GTr4pqD=Rc6F+M<R2{78#S6m4zf0pOTdo2_k}{VR}R3!S<$P zWg*1EL3TvPq-140W8}@siUtWrM@L3SM`vaI l2Z_XkKvGt8bUesTChn}Plo*iNDInrMGYcd*IGMrpe*iu!bM^oL 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 zcmd;M;Aa2<2L=X)5C#T@3LTGRu(AIEXXjL- 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 zcmWe;5M%&>5C#T@1O^6%90mr4dIkoD$qWn(%NQ6Kb}=w8oMT{Mc*MZK@RfmqfrF8O zL7I_)L7$OkC4q#P__M(5q{R66q@*N}{C`HitgM*u(9rPk@W`0>#H6gO{|x*fp=dCOiHVO- zhKfZ-M#n=z5=<;SItFY`R#rGf9cxxraCCfD78h$)R$wGp8AvD+k5D|!(qND(kgKwS z5n|zyG0`AISdR88yFZEjxaDV++bi}cmq<%$iN`X z$iSe+$iQI9$iU#k$iNWK$iTqDo&^K{nYgpEvXbIKASEj+>pvrJR#r+(Omuj7cw~4? z3REN}JTx>oI503UI3_FWKLdYORuV`BNKJTncoI}BJTfUOD>O15M8L#CL1KX*0?Y#I z4Fu@`6Tu(}h!}_!3X%u_5ePA`O9Mc%{~1`bvVx d6`lwcg1Un>D=Qu*6d40{E-TnBi1A?Ne*p5=bB_Q3 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0416.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0416.lmp new file mode 100644 index 0000000000000000000000000000000000000000..131e107efa80f18bd392042ec7b551e149761e70 GIT binary patch literal 536 zcmb1O;Aa4V3(1(W|7n6t8Cva)!Xv$Eo|vi>u$WMze>WMy%)WMxGrfdp8yvclstva+~X zv$8^?6G1|3AffoAtSnBptgOiB7_dh6tgO(O_?X13EDjJeIyyQfE9*ZaZ&p@hOn7us zR%Bu#NXvgF?yRiP@W}YY#Ka_!3TDo%tjNejs4N3N$Zc6!iSdabOF^9fAhDSE_{79` z5QvG1&&U9ag(oE@CV@1@L`Q<1z@L>Bo|2RV5(6m)JD)!*D?TG5IS~RqP(-#aNKVo{90c+4;2||ouMvDe;$mf8VM5$ zj)$rWMhHbig#sZ${8?GSAR(|N0dO&}Y-o5=Ru-CAAXp4U{Ab|L$^vu2ilJ8UXJvuy z4~>k6vcT%XK_-WXMC3=EFR%K8ryNr{Px oj?apZ43A04%KFa)3WcQjtSk=JtgQHytgNj6EKDG`bArkL0D2a6i2wiq 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 zcmWe&;Aa2<4+aK?Cpug3R#s?C zbaZ57OmuW~bZ9(6EI2qcJUlu&JQ5}r1JV>99~~1D8IuB1#|Jk*CNeT6F)Qmo8+%q( zXmn&Wh|LOS$H#+|vVhq!F(50MLF|}luo@;_kouVT7??@_8TqoZLL*~hVxr>{lTuRB zK=$xwWkp9uhDXLkM#m>6CV>nDxjQ^OJUlu+GCC$c5o`%aYhohUbBT#bNhui_|3T)% Ij0V&H0a?s)0ssI2 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 zcmWe&;Aa2<4+aK?C|hl@%Hj z9UU1N6CE8L9U6}i3l0tq508!xkA#WEfHcL&N5{lO#-xDM@xjfHiHwX%1PQS~gxJ`# zvO=RHqhVsvNm*H}V6pgkuvYG@tl&tHnwS`{Gq}L|KrR7kVd4c##m9g}v$C@OGxB9+ zg+|82#6-s@CZ(jLf$ZYX%8HJR43CV7jE+xCOahzBpOqCJ9v&VY9~m7Jp9r=Kq%|=S V?B~S9q@VMc@L{{WmScwqnl 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 zcmWe);Aa4V00stz6b1%{3I+y-9tH-61q=)fTNoG^PB1VqTwq{exW&N0@Qi_h;R^!; z0}CSqgBT+NgDxWjgA*eILntEyLmDFkLn$Kz0|S2+I`|I~i;0gYpYgSfh obRx)sELmBhDOp+EEFdR<1emk3VzRP$n6t9LT9`o2=LM7h0lhYQuK)l5 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 zcmWe);Aa4V00stzNCpOmBnAeCYz78~dIkoD$qWn(%NZCLb~7+AoMT{Mc)-BG@QQ(f z;R^!;!#@TF1|dcU1~o21dlg z#F7#dGK)tgPV3@R;bx_-K&! ztgQbGyjfWR(cv&FKq9PJS;5gUn5@WnkQhJ6h1DO^Y85tP~x8*+*dsbFJXgF90Gdeps z7%UD_6B->Iod`8GG$uMG24MuqRFH$>6O$4X6BA)>jEs)~i6kYZrDbG7-54Gi7#JEF Z4pI#=0qn*UkfubC-lUYQtpAu{005iaaR&eZ 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 zcmWe&;Aa2<4+aK?7zPH00tN<#76t}}84L^zYZw?94lpnLxWd4|aF2n3;ROQ& z!yg6)1_4F}1{FpI1`9?81|LQS1_u5tbnqV}7N3|H4+b&O(TQ1EV6ni+=;)Zpa4?90 ziUmN#K%&7gvB>zu#KidM==k^;xL&X&kuiy2IxFixD{EF(D2NMY1tM7SNl@A7_!Oue zU_H@^DPS5Z7M+-wn3R;5l#-H?k`5IMj*f{>OoD(km{?3qe0)+;BFIG`lR-OG!#fN=$@{#ixLnSy@>z zDJf|nb*x!g@kwb}SzI7S3Ro*^R#r?RR46(TCKMi@0#OwTlKaoVnw1p}Vu3V<#wS9} zf(r#l!-OJX8lz+4L8|z(vf|THGQi%8jE)AI&!3eQlavB-Y+_=3BFI>LxWd4|aF2n3;ROQ& z!yg6)1_4F}1{FpI1`9?81|LQS1_u5tbnqV}78oBN9}^Q39UT)B6Q7j@77K`uj*biu z4-F3u4v2(_MS?(RXmDU)AY2TjD;lIYG8(2gFggj@p8pK2Sy_QGNgz{Lv$BHYakBWc rvO+=X5W2x`2?g1K=Dxt_=ty+;g@c`e>b^*b&p@i-?n4+4X8i{MwqkLU literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0420.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0420.lmp new file mode 100644 index 0000000000000000000000000000000000000000..36ae6788696a772228b369a62a14ad493f4478d2 GIT binary patch literal 328 zcmWe&;Aa2<4+aK?7zPH00tN<#76t}}84L^zYZw?94lpnQ~+P_bZ;y3m;DXk@X(l&q}Kn8f&aB)uT9$e2W^W&attva&)!VxjR#AfrIsc#t*_ z0g(ksM1z!ox#1v-khmbX#3ZFa^+w0U#K$Lrxr`iHSz`~vd1OJ)0v$C?%lG4)BlG3uWvi>vjW@Ujm zDVgbsiHT`Yk;IIow3M`zl%%BitgQbG{8?FvNhxV*DJdyQiHS)mP_g)wq?8npaUgM! z7+Y3WbW&nURu(5)R#r?JNb)}eYgSeyNQ{d$D=P-XfC$B>WMzSb!r?+-7Dy-(BnMUn z7mAJsTMDuuK0Xm@L3~US)Yf>gU0_=wDj8X`vJz9$va&c?v$En7LB0SBf!q!e0-49e V0+P(i;sntk0cK`!KygB-{{V=ud4>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 zcmWe&;Aa2<4+aK?AO;487zPH0GzJES0tN<#Dh39IJ_ZJcMGOoK+ZY%aPBAbr++$#1 z_{6}#@P~ncfsK)YL4c8gL5h)qfq^v(0{(+o(TPb}SzuN;7FJ*qSe8F43(SJ(1Cjq3 zKw|On@i8$m(a|w6G4UW%__MMC;^U(u!^1dB7#Ii_3k?P7jE;_s kjE3nAj7|cX4Z~np1;>M3z?zj63TFk!z{DcqVqi`G0W|JftN;K2 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 zcmWe&;Aa2<4+aK?Clqjr4l^(?Tw-8gc)-BG@Rosr;THn~ z12-cBgES)pgBBwLg9Rf4gDWEg0|RRo1aPxJ=>H7tSy`cxF-cijSs=0Sn5?Y-3>;Zm zp)t|XAW?)MCsZ&x30Wy;R#tR$baZ5NJVZ1UYydyR^!VuLn5?Wsu%WD6Sy}Pn;YnHH z;fYyU|JgXRvVy}SLqlW0JPr^qJRHnnTCXleie literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0424.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0424.lmp new file mode 100644 index 0000000000000000000000000000000000000000..bf20a425e34d5883ef6753c16f296eb57978ec2a GIT binary patch literal 368 zcmWe);Aa4V00stzCcH(Ss*eIZ2W%) z{;aI%@R*pG=ok=)PRz;zi-kr|2@DJj%NZCLb}}$9oMd2NxX!@9@RWgp;VT0J z13M!FgB&9RgE1omgBv3QLpUP?0|Rpw2=G9t{|qcyS)uV+S==mHS@9`ZS^pVWv$BF? zlCrY6ShKQ{V!%RdSy`cp@kv=(oNQTHN%4tkAa(2@!NkOrtSk=ptgMv8B(N|eZ&p@( zT3T90Rz@ON@;?(dL?kIOF$rWEGiO#-d=fG*Iw?Le9xMk^8yX!NniLZg4N?m-Ei@)3 zCMhc^CI;db_N=VH(8$Pmh_&&Nkq}|FtgPV3=tPJU6Qd&&K~7}N$_hnz1uVppl?74- L@-EoDXu$yh9N2EI literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0426.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0426.lmp new file mode 100644 index 0000000000000000000000000000000000000000..c389eafa23d9ced293dfbf829b27a41967418f3c GIT binary patch literal 423 zcmWe(5Mls<2nGg*90mr41_lO(DGUq@D;O9U_AoFoTwq{exW&N0@PvVZ;T;15!w&`q z1|CKR1_ee21`|dG1`kFCh8RW$hGIqrh6Y9khF(SnhFOdZ3=I5P=-@v{EHoxMI5;#s zJUS*kGCnH{EEX6Y85|fG9v>9+?Og3y+D8j*N_niH-@4PKJs_C&nj&Kzw3&Oe$0i zVM%CAN>|$VGIKsfd zaD#z?;SER=BLjm7BLjm5BLf2idln4*XW+=nicd_8k59_V`p>|bl@%Bn9UT)1=5b|Z z1%P?sFm7agVoY>&bRtMC7sQPC$QTfpl{G6X6wV4nu)qd`WTWF#K-%~r+LEFZQy{FY z{|x+DS<#7!iAhO`Nhv8QDH%|8!O=1CiAfLu7mJCBk55WUOiWA!n+(z$6CaBGp@5Nrp@orwVFn`u!x}~gh69WY3=I5P=-@v{EIK|hF)=VO#nCRf((D3l+m~gmQV02_~U|@K7WOR6BBGlyY znCR%p$e5Vun9%5Cs91C&$oYwh@rmIvsZcQ_J7Pe3K`sadv(Q`+4Uz?k#V5wZgFsAl yWH`*F;fbICh>nSlj7GR1F(xuHIyxpMIzAqzH##vMBoZGVpO^#-KZFawtp5Nu1(=`! 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 zcmWe<5Mls<6b1%{3I+y-9tH-61q=)fTNoG^PB1Vq++ko~c*elM@QZIy4Cfgc7@jdQFnnfYU|?WkU|`_S zLI?jrV$t!5iHY&?@iEaci78oGV6o81$jI>M=;-Lk(BK%TSa?iiWH?AXn1v-ADi)I% zA0HDF6B8W35*!H?Ls$|V9G{i-pNlmsD>xFw0@;R;4TXz^#zY4PhlYno$ArVh0;3~? z0|UduBcsD36QL%D$3#a*M#jWM$Am^FL&c&KLC#N1j86=YNrj3b*%1Ts5y%ChF-e%R z(J+(a6Jz2*ASOC89OlySL{I=k$3#a)BV3Re6B!vD9TO8B9RpS;l$8~o7!MMOkB^Cr pjsaW!pFs#rLy73fnD``++qgKgvfx@l98lQBgWLt;Kvie`2LR}Ctd{@) 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 zcmWe);Aa4V00stzC!+b^t1_u5tbnqV}mXeql6O)*j z7#SHE6Q7j@7K;xL4-btD4Gawk2#kh`MaRcPM}~)k1cPB>kufnbAfVM&v2tZ)1tzATaO0D*vO>YOfn}rPv$Eo260@@YgSerQk%@`X(McdKXI55X zOf<;i#Kiw>93WmyG*~4&TUJ(LWF$xv2MgFvh|?iVI0^PnWK48qbaV_DfSd&Kc4&BL nXlOVHL`K4#9t`pySTGXobdb8}cqm9rOawUzBnCGf!uSsW_=b#Q 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 zcmd;Q;Aa2<7X}7~2nGg*90mr41_lO(DGUq@D;O9U_AoFooMvEPxW&N0@REUn;Rgc) z13M!FgD4{dgAyYHgDxWj0|S2+I`|I~3yhAAj){o@6Ny<_V6lMc=;+As@X+wk;J|p8 zSR@F9h6V=)2E)Z-Vq(I>!$U(ugTrBZ!Ip$Z$0sI+MuNmxxw5hXqm#0-f}=s&K-_>x z6mB3$T{v7e5X1@xiTwvD4vmaVOpJzbIkU17W1?fCBf}FD|Fdy`crnp2AY0hkva%8* N!Kye|z)r~e4*+hcVdww= 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 zcmd;Q;Aa2<7X}7~a0Uj3ECvRKS_TG&2@DJjOBfg!b}%q7oMB*Kc)-BG@P&bafrF8O zL57im!GMv0!HJQ9A&8NIfq^v(0=Qs|{~)3G#H6e&kWgeyQdSmNC>$mf8VM5$j)$rW zh6wRzWd%nkLCnhvL=_7SPs+*)fQx};gF`XJ0>SD)#D50y;3{T1mjf~HVL5L+qhl4;QhyXd6kvA(VB_;+W8W|pwl9lzJi90JRDJdQVQb2rW KPN?HS)PDfGz;EjS 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 zcmWe*;Aa4V1O^6%5(Wl_4h9B>ISdR88yFZEjxaDV++bi}c+9}S@ScHz;XeZdgCHXV zgDN8fgC!#agAXGELp&n`LlGkbLn|W#!wg0ShBb@~3$OMps<5NKPgG@?E0jp!p%8F0Q$jagZF;c+FSV8tcg`yK-Lg65DL8?OI z6G5(J&B}rc1xLe#BI8paW<|%ugH-WnWyNQJY|6^Yij0m18^)iN6_b<#@_J%oJjA(R e55$0cmzWqI4RRR7i}9d<1ACE$0}>=4@;?9oN2Evq 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 zcmWe&;Aa2<4+aK?Xa)v`Tm}Y)1_lO($qWn(%NZCLb~7+AoM&KQxW~Z2@Rosr;SU1? zg8(A~g9;-9g9Rf4gAXGELjofM0}D$Q7;v(IsjRH5|4h7DSy@RjF-ckR@iEcySy}%X z`LeQ-qN8IXBa?!ILxW?WLeVkN;h}*b5FDMA^`C)1D=RWSCNVKQJUl!Uq6{P!9+Q}r z6&e{C6CVR&fz^eA%nc0>PlDL`pMfhYD-a|W93G#M0p9 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 zcmd;Q5M*Fr`1jw1fq@}_fq@}`fq|iffq|imfq`Km0|Uc01_p+c3=9mn85kHoFfcH% zGcqv9F)}ciFfuT>F)}cOFfuSOG4=KJ^>H)y_4WN{Wa;Z`Y3b|ZV(#l}?(6%{z}DB- z>gLwm*T>1)*Vp2UD#pRy*Vp3X>)V8)lAWWkuhj=C3^R}oBw{X%0uBiP D>CSVx literal 346 zcmd;Q5N7}Z7X}7~00stz1O^6%5(Wl_E(QjMg$xV~+ZY%aPBJhs+-6{4_`txxz|P3P zAjinSV8Y12;Ksj7z{1qm*Vo6(*w@$hpP8kvucf80kB7Ohueq=9KNDMDU#pv2 zb6+1fYhPcBFRB<9dtYCRkFReNib_t7zP?r;s4&bx4v?U?j}O=ch>h$VeSK|S-abAc zL)qB-`r16bynR|)_?hhO?d|`wa`g4Jdw6+5iH_wYm$W`_v3p(tiy?dxlIZ$mPbmAS94y{`{yF&j7}0B?VB A`~Uy| 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!pU7Ma01C-*2Z+1JvWL*feV5S2A Dyl69xtbI|c>@F9rsN2nGg*GzJES5(Wl_1_lO(E(Qh$PUb!k_|L)G z*Vo$G(%1K&oxQKGuhpxiudnYv8)si%TU)DFOG`71=i%w)?E~k*<&bqD%z~K?0OU+F A3;+NC 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 delta 96 zcmXRd?w^K#hRxA^%r`5|%q ZARKnE44BQw3eo{m!q04PZ{OGV9{_pbA$R}) diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002D.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/002D.lmp index b7f915d6a1d3e88dbacde8902cd44ba72b4bc5cc..4970f04132e4ec7e23f3309b2bca88ac1a734715 100644 GIT binary patch literal 130 zcmd;NU}a!n`0-zdfq}tyl69xtbI|c>@4+aK?AO;487zPH0GzJES0tN<#Dh37yPUb!k_|L)G U*Vo$G($@!Jd6CQl>xG#H0NdXyJ^%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`21gmfq_Arfq}t`YAeSIxHzP?R; zegD}w`ubXZpd3~Z$J@sTtcr!BudmI^+s6l_g&D;0^z!y;>FfK?#L?H+?&0a>4dO6@ zIPM;vUaft7{~0*?`a0a)Jv>1i6$W+)udT1|KO<{jU%NYq#l+m#*WTCnpBd~r01@C! A0ssI2 delta 181 zcmaFP_?(f0pFx}f1SWFW)bld-_4WPdVeac|?(6%{&Dz)3;tOJNvG?`0`1txZ_4WPd zj2j9N<07n diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0030.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0030.lmp index 0055e27d817e9a493d52332cc0e9d95ab08b8154..71be6fbd5dcf3ebae65a251b940115706ef53e42 100644 GIT binary patch literal 414 zcmWe;5M*Fr`1?PEfq@~0fq@}|fq|infq|iofq`KL0|Ubv1_p)$3=9l67#JAdF)%Q& zFfuSmF)}b1F)}c?F)}bjF)}dZFfuUIFfuT7F)}brV`N}pXYK=m|E%nNeSNJhEq#4` z|5-Tu`r2B(ynULR`}+PfbNBVNd3btx`}p`a_4WN{;_d5ecZUjqMHu<}`r6$>Cdi=$3qb(07?l

>zPJuv%tzhyl69xtbI|c@Z00stz6b1%{3I+y-9tH-61q=)fTNoG^*qQr4;6EE{ zUte2WYhT}gR^Gn8c6X0fkT4kkXW{SbYj<<^Xl-q2X>M+6YU=BQi+Or^`}p|!`jITw Q-qwa}9>`X(Z7||L0M&*_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 zcmWe&;Adc9`19X`fq@}{fq@~Hfq|i!fq`Kb0|UcG1_p+s3=9l685kJeGB7YOGBPlT zGBPk|GBPkYFfuTNF)}b@GcqvLF)}bPGWUT17Ym5&>-*2Z+Sk|K-qzR0!QR)`*WA?9 z1QT>?>+56Z=<91~_Vx8c5oP1->ud4xAt21(*Vhg*qt)BTr@0AY0+LvBAF5cZm$wfV zv6eneb!cMlZJu7<2r*8Oz3v{KUM+onT&ytdj2wM^?UkWvajzy3u|9rdwW}79}jz9Ute=mQxiF IehBp+00wN82mk;8 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0033.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0033.lmp index 8fe96acfd94f4df3f167fe262e99ada8f718994f..72c3f80e7b5d123ce80e2505ec2df4ac10fffadd 100644 GIT binary patch literal 334 zcmd;Q;Adc9`19X|fq}uBfq@}}fq@~Ffq|ihfq`KH0|Ubn1_p*53=9ls7#J8HFfcHD zVPIh3U}RvBW@KQ{Wn^HmWn^IBVe0Ga>-*2m(%0A2)Ytc)kr~AA<6`aWYw`mLFtGOZ zwYRtR^|5h+Wtx2MR!_&*##|I|H2X+fg s4CHD?-oCzecMngm7LY2C2orZ-Ut3#iYhO!qGl_;O10|5E4iwXb$ literal 361 zcmd;Q5N7}Z7X}6fKL!SdSOx}$dH(_C>K5WS)-?OpFig=C;1R k7LXX&$ykKgARg}PV`uB@YiVu3A(oMWft8~V4g{D$%>OK0eSPiiZEdZsEiHY0{49NaO-+4$|5^C^ z`r6&xJv_a!VD}r`Z?9UXXb{J}@ypu$$ZZ`dUC@ hU?*b{VuN_NuaBFpudk)K8KjPt1r!*4eLPV5KLC3Zidg^v 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 zcmWe);Adc9`13!2fq@~0fq@~5fq|ilfq|iifq`Kj0|Ub*1_p*>3=9mn85kJeGcYhP zGcquUGcqt}GcqvPGcqs)F)}bDFfuUYGBPk!FfuT(u=l~he`e0UzP8rZmX_w`zP|rV z+-Jt@$O?`b>L>Tz{`r6&xJv>`mT6}zc{XnWudG)fmzJR2R0of1aluN iXCIUcaxEK2Utf!lk1yDR>}-8~EzQj!aSj%U#{U4qbdL)F literal 385 zcmWe)5N7~^00stz7zPH0ECvRKDh39I9tH-6c?=8;n-~}vjxjJW+-6{4c+bGVz|6?N zAkN6Zpv}m@V9&_F5X8v9kif{mkju!xP{GK+z`@=J1OM4M`}*2iTU%P1oBR6yvvK$J zwRw1YdHeYIHu?GeXXWkdYj=kV_%`+RVG&{B@9S%KbNBFUZE5lG_4Na(f{C^E_4PHw z#Mr><+WPu<*+8Pm3fsW$X-3i9*4Nt7(uX1DO<1hGt*x)s+XrSbD<9Z&kPys$oSc17 gF37c99DRK)K0dx+4|22h^|drNgT#4QAR7Mz01sr1WB>pF 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`19X`fq@~Afq@~0fq@~Nfq|i#fq`KX0|Ub<1_p-x3=9lc7#J8{GB7aw zWnf_7VPs&CWMp7aWn^G5U}RvhVq{=oWa$Hg{|sz>eeLaSZGC+Zrkgt|lZzFs4n>-S zqpz>8xv8nC2}PKlv#+nE+1J<44=gUw*VhgnD|RuG3B!U3~Eega$lpMe$Zy}rKxjLcwD{sRE9j&?i% literal 322 zcmWe&5N7}Z4+aK?Kn4be7zPH0bOr{7Y6b>|Nem1Os~8v<_A@XrTw!2fc*(%P@Rxys zfrpWSL6VVyL6wn#!GMv0!HSWAft95X4F0pQ_4T#4x3%^4L6~mts7yXqusRfJ9*(}g zzUHQ;rY00&ZqB~GmS$gHKR>XzKwn=w*t8ZO9}K}(Z%n~fFK-_oxUu|T?H-<9-Yv}# rC;VsOf{C^Cfo$f0a$7+hb_fT|2KfnW^?w#tu=o1<{F4PLB(3VynUK|eUZi5`dYnP`kJXG=7Gfy V4^J|J_ZJcMGOoK+ZY%aPBAbr++$#1_{6}#z{beH zAjQbQpvTC-;K<0p5X{KHkj%)yz|PVK20T#uKO1*nUt3#iYhO!qb5md6e^%bUzIJyH zPp=jqA75XP2n%0dU%MMf$Qv%ik0Rs;Rt6Po_44*<_Vq;;YwK(EZs}{LnwSR`J3KtS Sz|Mo%i|J%cf1&#vBWM7~+=hGr 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 zcmWe&;Adc9`19X`fq@~Afq@~0fq|irfq|iwfq`Kr0|Uca1_p+M3=9lc85kH|GB7aw zWnf?sWMp7aVPs%1V`N}(V`N|mVPs%nX6XZi|4eLseQj;6t$ls}89Dm;+TA@oy;}PE zxM1=O{C$1xZXi+bmcHhurl!8W|EOZVe#m02ULbWSVr_k`l!-O_qL}B=>gDa@wj*Y}@^6XNNX77&k_9UK%O;y(Z_5rSL* literal 352 zcmWe&5N7}Z4+aK?Kn4be7zPH0LIwtgRt5%!nG6gJYZ(|A4l*z>TxDQjc*(%P@Rxys zL6DJwL4}cl!HkiC!HtoDA%u~Eft{rf4F0pR_4T#2wYK*4{b%Lq>uY!S@bqfw>*IsT zv+(!zwYz~ty<7U4o0^*X`u?Me`T8M?wR(Znp@_BhwNfV5?2BTaN2`~&kB_f!Qy<7J rd~o+c#s0JKA`5{W$I1=$nYWKmb6?+oHcp7ATUtOoc6M-3fQbJ9w5@=x diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/003A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/003A.lmp index d4f79df58b1f4f8cc1a526e11a5b6ef3b29aa08d..55ee39f335dabfb1092ffa695cb91e43db51e0af 100644 GIT binary patch literal 159 zcmZQ);ALQ7`1N0ffq}u0fq}t^fq@~Mfq@~1fq|isfq`KX0|NsSQ(s?SA19N&y}kW^ uMwY(5w${Er4ieQh3|t$ls$Z1(moetwN431XOsVjBSQj4&<$ literal 159 zcmZQ)5N7}Z6$S9*S)M;DIia diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/003B.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/003B.lmp index a642f33f3d18f0824a87fe4eb37bfa2ad7ef58a9..93c5083b3c22cac31f64cb9df3b8d09bbebde99c 100644 GIT binary patch literal 175 zcmZQ);Adc9`1N0ffq}uCfq}uBfq@~3fq|itfq|i)fq`Km0|NsSQ(s?SA19N&y}dmT znEjuTrLV88wXctZ-QK>bsjsQ2ukSwtTVG$Bhi7YFA3KM=eT$!8lOI-LKXhSsuxhX< V++0?WxghOO%bD%%?fd%v0{}w$I*0%O literal 175 zcmZQ)5N7}Z6$S`wsvXuQ>4l 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 zcmWe(;Adc9`13!4fq@~Ofq@}|fq|ilfq|i)fq`Ke0|Ub@1_p+63=9m97#JA7GB7Z( zGcqtpGBPk|GcqvPF)}a&F)}cuGBPlfF)}c;GBPksVq{>L%gDgM!_?Q;*Y}^BrLV84 zsju%pBMXS%*T==$*Vp6+5@BHL>uYasYwPRdWb5l|_C*M~xwrN8v2*l+M4`g`eSPg< z;g%L3UsSQyR&O6PF%M5Kuo&2820pM}s8|!oRSdi^p_Z0rU$A3fBCQ}xafrYTg6it~ z&j4~)yF1KmuzieteSLjxZBQqGeZ|bv*Vl*aPFAkIzCMIkAby1g0Vp*3n!rYJGlK)| FKLCsunqU9` literal 421 zcmWe(5N7~^2nGg*cm@WB3(8|cbFo}_YVJ;&Bg8)-sUtiyUewMzzrl!8W z|Ew$^eqSFSYhPcJA4r6St*@`Wy{)aUkC&~luh|zN=;q$m*T>D#2NHz}^Y`_&gN0jK ze0)*GT3fw+(8N4Ey})8%n_2k4dZA)XAXl;Q!h~8{ntj2Jfr+$&EX5%LHwdb$?>`I3 zUG45Lv%&VU^7ZxgwY5Q=0QMC-PhVdjvO77s`uh41UV-=(8U&!w=xYKS#m@{5wEqC6 C*qF%x diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0042.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0042.lmp index c0260da51e211d5a71daa794ae2975a0b2cfd455..ccd15296a879196e60e458030805ec6694a7112b 100644 GIT binary patch literal 377 zcmWe&;Adc9`19X`fq@~4fq@~9fq|ikfq`Kf0|Ub<1_p+G3=9mH7#J9yF)%RvVqjq4 zV`N}ZVq{=2Wn^IRU}Rv3WMp8-W@KPs+9DudG!gorfv_5EjN>FaB4>FeWQ?dxl428pmRfkKFr8ASH|2LPoQ Bjv4>} literal 377 zcmWe&5N7}Z4+aK?C3A(D}SA)Aqbft9xp75r!6@9S%8Yi(_5X>M);fxbS7n47zYrn zkFT#^6UkyA^SoPHnwpUGw)XY4c(?TRkt62b+T!Ky)6#_7Ev$TfeQh8ox4@kY6Kd&e y@$vQb1^I%Fr?0Qo!xJLX+}HP?ou#j@wWY6*hqbS-r5Pl`!2}8+US<&4_a6ZI)r@Zd diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0043.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0043.lmp index 53e6dd15021dc70ee110f655a9297819f5700143..6d0285f0378b7e579879640219b2f5585bf10ed3 100644 GIT binary patch literal 309 zcmd;M;Adc9`19X^fq}t?fq@~4fq@~5fq|i#fq|iyfq`KG0|Ucm1_p+c3=9nS85kJ8 zFfcH1FfuSmGcqvfFfuSOvG>8ie@4!}zV^1Z*4CDmzP|qq++5TQ39&&`_4RSE_w_aV`uc(O5)kEN1F1z*%E<~6 fMAgp8(%07v7iw>7>+9oU0{QVjBMXS?>-!G?Jxp;^ literal 309 zcmd;M5N7}Z2L=WP9|i`7C|UIqq+1q=)fn;94wPBJhs+-G25_`<-z zz`@ACAkE0Ypu@<(z{cJO1OHh$`}*43+FDy%TKf9_vvBwIwY#}{czSvJG=um&2tGuB z7fHak38aJ%ECMpY$Hx~%sIRZD1t!D>QPtPS!`|1|?Ca|X)=NN?mkp#AO(`!cNDx&! cFH2uvGhC>>t*x(*j|t?*|Ew$^s;}=q02458umAu6 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 zcmWe)5Mp3p`2RnEfq@~4fq@~7fq|iffq|igfq`Kb0|Ucm1_p+c3=9m985kJ;FfcHP zFfuUcGBPkYF)}cOF)}b@FfuSyGBPl9FfuSqWn^IBVC{o||Lp92eXXr6EzNy>|JgYE z`r16bynTE?JXY?$zBUgq*SD#!?>{4BUtb>!PhVfVJCY~^b6;O)UmpuEM7*`d$Hy0} zoI$X!ud@Rz+S=FG0u$xx>+5vs0GZs{*T>D?*VpXp>jyHP0W9O%-q+XG+SkX!29kkD zaDueBy0wE`j78k7tq;{CMuEP*4p%ofcaT9ai<$WQ`a0a)+&w%IPGkl-8YBerGT6}= V-ecwJ>uW=V2^&WrBDfHN2msn=nE(I) literal 415 zcmWe)5N7~^00stzC;Kazl5XQ*Bkip2nP|3)^(80*SFqM&kfs3^d0{(Nd_w}{5wzM?&_5J7I?CWdu z^z!!c0rA+m`}*2Ez+B&^zP|s=jD3B5Y&?B^?e0jTOw4_Koqc_5yb$r$79Ss9uyQ8B zzP`>5uxM*vUkgl>tFN!qr2}MgYhNEPdtYC(udg4-cqXunYkOZ`TWen*9~(#pBEbpL z;_B88axoThx3)f1lb8ki`Z`?Q+}uG1!7OIs@9XPub949bL^zQZ+=phA9Nok(JR&AzzBpf>b@+}I4U f0pg4{ut%D~hOt3B($~ku1QPwv$O5AJ`u+m|Fl%!9 literal 304 zcmd;M5N7}Z2L=WPUj_z-7zPH090mr4S_TG&eg+1HMGOoKTNxM_PBJhs++|>3_{hM( zz{1GDAjZhRpw7s^z{=4F2me{P`uf`2+uB-NTUz@1{D&ssDcXlfpsE@^)>tA7K7T*2XbRG#0H2n c+Q1%Z1{=l(@kn1E9}`IQKPwA}>g)Rt00|CpLjV8( diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0046.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0046.lmp index b21cbb17f2ca1486771a1de7cc7835f68e7d3e04..f46710e5b260b18a861872ae0f63372e20bca280 100644 GIT binary patch literal 306 zcmd;M5Mp3p`19X^fq@~Afq@~Ffq|ilfq`KH0|Ucy1_p+G3=9lc7#J8HGcYiGVqjok zWMp6vU}RvBV`N~^WMp7q<>^BK|C#yw`ubX1TUwf%o4}y2??013Ute3BrnkFT$v zpPye-U*CU5!M?tBcMmjC2BE&bb~oI@t=`B6Gl0x+bN6U%^=^SX<39rz*o?M5uqe^o hmX^N0{|uZ^y&&WMGqCmbwYRsmft~X1^j2{@9XPpZEb03Zf*jDzP|r#0)2gLZJu7_(tjB;TB 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 zcmWe)5Mp3p`13!2fq@~Cfq@~7fq|ivfq|iofq`Kr0|Uca1_p*h3=9l67#J8nGB7Z3 zGcqtJGBPljF)}cCGcqv5Gcqs~F)}c;FfuSqXJlYtW9b8f|12DReSNJhEzNy>egB!c z`uf^hy}W&Vnw$Fi{xk9P^|g6;g806^AOS|czP@&Mn1~-(h#w*ZGQ!u_4=lzY(AU@Q z=I+r7vZ5I#$OaZ{>+9oU@9S&wgDT~OiT3sNaU)A`K_yySTF_(!VKUw=NCrXdZ0l?F zZs~*Di6qzzcOA&ZZtftJK0dy_5Ep|yh7bdJjDfeWuf4skt*^BO8XSz!Fk@ru>w^Xu KJ2S|Oeg6TEr<>3K literal 415 zcmWe)5N7~^00stzNCpOmGzJESQU(TwHUTFrATsfs3UN4E}R)^!4?%wzM?&_4WN{=j!Wg zYxVN>@o8@A>-*2f)7RJL;R)jV`ho;l`TF|W-C-hrU?F~p5XcB$Uq7%Ii$GsryPLa5 zE69pwm>?Tiu&u9;kG-$2$q%ZO6DHc%*T;`6!3C9QZD~Q15roNjw;&k=v9qnO)w`t+ zZYPppGu(9`7rVKGRQmY%`a)a`@)$x45t#K^$F$lHes{xk6R^|iORwY9dkv@|z2H8u71LB!nL zJv_aTw!2fxW~Z2@PdJX;Wq;V zg8(A~gDN8fgB2qKgC8RULlPqc11oPID)`UB-`CgP-qzOI+S1b8+|<<6*9Q@EbNBG{ z^7irZ_4Nab3H0@~Ba2}Z^o0w8P4tGC2ohxFgV@{Z-2!3s{pV!u>jQIu zOG|TeQ&Uq@Umrx!&E3P(%iG7t*VoSvn;=9be_vlal1i{bkQlO&eSQB~dC@Hf0K~;Y A1poj5 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004A.lmp index fe1e14f4840d9328f7a4583f8d0f1885481a143a..95037e06275ef8f6e74666a4d666bcec3782acf3 100644 GIT binary patch literal 223 zcmd;P5M*Fr`19X{fq}uAfq}t=fq}t~fq@}{fq@~Hfq|ikfq`K<0|Ucq1_p+G3=9kx z7#J9Mnfm(r`u_8<^z}70ff%fPeNBF-EJgv48W?W!14}aq^!2s3x3#slwzM=iBMZ8@ qdw6>+Ab3z|z;()C6L%_VqRSp|V&7Kx$yP$qy{eBGA{@-rm;M+S=06+>9*f=I-I? nkC!M-`CfUBnUE`g%4Q_Y%>clvVkB+v2wxe1kwKiigZ#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`19X_fq}t`fq@~8fq|ijfq|iofq`Kb0|Uc41_p+M3=9ls7#J9?GcYhb zVqjo+%fP_E$lHes{xk6R^|iORwY9dkv@|z2H8u71LB!nLJv_aW05=|9ng9R* literal 246 zcmd;K5N7}Z3kC)TF9rsNI0goWA_fMAHUlhdq4l*z>oMB*KxX!@9@Q8td z;VlCL11oPID)`UB-`CgP-qzOI+S1b8+|<<6*9Q@EbNBG{^7irZ_4OlJ3~nAoFDoCy V(q@PdFI!(9VJ5^md@K;{{{eL)T-N{q diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004D.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/004D.lmp index 44b71c8bebc698ad5f9a3c915ce1dbe045c56d31..82a8d8c104b8a96fd171a3a801348588dca463cc 100644 GIT binary patch literal 487 zcmWe-;Adc9`13!8fq@~9fq|ikfq`Kf0|Ub<1_p+G3=9mH7#J9yGB7ZFXJBC9WMp8F zVq{>@WMp8lVq{?OVPs&4V`N|`WMp7yWn^HO$;iO4mXU$sAR`0ARYnE|M&3SD@SlOd zudltmt*y1SrKP#Ksi~>24?c?L?>qnj#l6ic6eeGcLT3R61|7YL@SqrhE zxw)^e??2dSZEX-c!Omdj>FeujZAG|&m8-9>ucZa%Bn){>BQULDz~UBA5I~(rwIDzX MQn1q?eut3%0UJeL5h)q zL6ebz!HSWA!H1E7A&!xOp^%Y*p_P$=VJ0I3!&*iLhJ%a@3|AQ$7+87xP{Dr|{=UBU z_O`ax)|Qs$=BB2mzCMVUo4bdnm$#3Pudg3@Vo2uk_4T!b&1-3aSpT1e7i2BOist6N zzP|rpr?s^~>;yZ5ou{v_ueBB722QTNzP^?gn3FK%F^#~qh6RgTKtTX?9@T;XEl9ym KgZLdn{s#cOWVJZ} 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 zcmWe+5M*Fr`19X~fq@}`fq|infq|iifq`KW0|Uc$1_p*x3=9mn85kIzGcYiGW?*3W z&%nSSz{tR$%*eoC&d9*v&B(wI&&a?~%*epN$lr$!{xb;n^|iORwY9dkv@|z2fk0m$ zMAXgQ!_&*#$H&*#&(E(3x2Qm0Upul|kWxmzzP@&leyFK^egBzw`uf^DJiS_=Zurm4 z-q+XW>E+$h*Y}@=y|1s;%iE{9ukSxAi0$nIW;60YRk!%~_<{^(02vH%FUVzJA%0W` VkSqo<4&wd3zWb^YHX)fx6*8J9}SW zo2Qp|OJCoA4)(sjRxfX#=DxoFoFKNh517r$16AGP>Cdi=$3qb(07?l

>zPJuv%tzhnkFT$vpPye7NLUy{m>6+n!<)e7K#Xrgb|li+t$lsGU{Q!G_~D{`&Az^1F;?EbzIJyH&(@X}A75XP-7pb|&p;w< q+ 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 zcmWe+5N2Rt`19X~fq@}}fq@}`fq@~9fq|ipfq`KH0|Ub%1_p+03=9ls7#J8HGB7ZF zWnf_7VPs%XVPs&iVPs$kVPs&)W@KP!WMp7qW9|ci|19i%eSNJhEq#4`|Cu@a`r2B( zynULR`}+PfargDLd3btx`}p`a_4WN{8Ti;bNR@AYq6o8(6fhuMZ;F1XhX=WbNx~ZUQ-qK?tT0M+UfWAJMILw)TzP?bGLDXZ4LySij2fIYDudltmtqsX|P!RCL?1$6;0eRe*?*IS* literal 405 zcmWe+5N7}Z9|i`75C#T@1O^6%JO&1aItB)Y2@DJjix?OfwlOd;oMB*Kc*wxO@Rfmq zfrpWSL4}cl!G@86A%u~EA)Aqbp^=e+fs45h1pafd_x1I)wzTy1_5Ek(?CWc5_44*< zZtm;*&&J)?*XH5ruYy&_h{|w>udJ) z^#kc+VTX(HvVnvlqHJK%w!S`yU=vs=LXfquuek~2C>9}@LXdl5_&=8<3T~d53?Um{|5l3#g|9` 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 zcmWe&;Adc9`19X`fq@~4fq@~9fq|ikfq`Kf0|Ub<1_p+G3=9kx85kIzGB7awVqjq4 zWn^GbWMp74VPs%%XJlZAVPs&)V`N}p+9DsF%+lA_ a+S1p@#oE``)C97Cg$d+HZe|eK_a6XOERA;n literal 380 zcmWe&5N7}Z4+aK?CBGA&-%Pft9xp75r!6@9S%8Yi(_5X>M);fxbS7n47zYrn zkFT#^6Uky=^L#+Yf%WqB^|iUR_Vx8O`!s>=|Ifk-72;w8iGqZY#Mr@Nz6ibUt$i(E zw}6E}PIhzmXhCuwE6574i<@CCh6^?KH9fzba*T>7&*VhE`89Pf~Uu#QW XA0KO9UsDsv0uCmSBl(#@WZ!=PtUQa@ 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 zcmd;Q;Adc9`19X|fq@~2fq@}~fq|itfq|iifq`K@0|Ucm1_p-X3=9mn85kJeGcYhP zGcquUGcqt}F)}dNGBPj(F)}c)F!zA~4-<&|&&=A_*V@w3*T>D$*Vok4*Y}@^y|1s; z!_%v|uaAqhudm4uB*@6u*VpFm;pyew+}GrbONfELudmI`-J=Cb8C0ybuLYr%3^AW3 zUx>9xdVPFgVj$PKxwrQ9HG{-J4rah2#Mal>*4EnE*T>G**Vo(x_AMg|C>Z+sIH2@@ E00%~e9{>OV literal 355 zcmd;Q5N7}Z7X}7~AO;486b1%{N(Kgo9tH-6`3wvUn;94wjx#VY+-6{4c+bGVz|6?N zAkN6ZpvB0*V9UtB5X8v9z`@)H0s>4R@;^IkUteoWOJ5&9OJ848Q(xbIHuk>0Ru50F z=Dt2Y*1o*Ima{{fLT BgM0u0 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 zcmWe&5MW?n`19X`fq@~Afq@~0fq@~Nfq|infq|i&fq`Kr0|Ubv1_p-x3=9mH85kIz zGcYjxWnf?sW@KQ{U}RvhVPs(NWn^GrWa$Hg{|sz>eQj;6t$lqErkgvM$<^1_24;d( z{b%5Ta$B04oBBXXc_9KVUfw=FO-&#XKCp;~CrHHC7ncw}R8>oJvyZQ@A6OYwtfjB7 xuL&jwauwKqPIi!}AH+ZcqFii!eNBE4=fIV6vG(@9d8002@4eg^;m literal 342 zcmWe&5N7}Z4+aK?Kn4be7zPH0bOr{7G6n{Qb_NE9nG6gJYZw?9_A@XrTxMWkc+SAU z@RxysL70(&L4%Qj!G@86!IzPNft95X4F0pQ_4T#2wYK*4L6~mtU?x{zUmKVSQuUvO z2g+?}Zf@!WDdmL-w0L>@_%t5-#K^#4%E-Xr&d9*P$l3=1{~0*@`r6uBTU$W<{|wxHeQj>;9-b}D z&3%1+{~36od@paGrY4X8FG9e_7c9aDF~HNy+sDTjEX2qQGOVwqr5Pr|$^{Z>Zu0f@ z1L@&l@9XPpg0LC+KvED46=L9r7}?U&+}wmL267q18n7{7b?9Os=ODyDwlRR*4Duq_ OIFJYFUYXImX>Ci2qzavq`Ar0*AJwJ zhrO?_uL;6t 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`19X~fq@~Efq@~Bfq@~Pfq|i(fq`KH0|Ub%1_p*L3=9lM7#J8XGB7Ya zWME+U%)r3F%E-VV#>l{+#>l{6!pOkjz{tSB$kGP}{~6f(`r6uBTl@O@{xfj)^|iUV zd$hEGdE5}5r&n_`n9l>_d;2ssft2%twR(7ZdHeYIfk>+L} lUtd3v3U-dZzP=_X2VD|VI|GIl3>dCJcP6SQkh}-?GXVaLc%=XU literal 329 zcmWe+5N7}Z9|i`7PzDBuL-*2b+1JE-R?;|mgD6Y#K^!fjgf(2B_jjFZbk-%(~JxZ zj2wM%@SlOZudltmt*y1SrKPX0?>_@?UthbMyN9Qjw@-63ScDHD;^W)Y1X9G0EadA4 z7XumO-I76Pea<>>1J^FSPC&c43BR*?GUzP|rVoPB+5ZD4!*`u;O= t_Vu-cozX&ohpG?NOcd)dUBdwK2b!C~V$cA9`GWyV5MYKAT1cVf? literal 472 zcmWe<5N7~^6b1%{LIwtgMg|6k$qWn(%NQ6Kb}=w8oMT{Mc)-BG@Rosr;Wq;V11BQ` zgE%7tgDN8fgE1omgCipYgFhn!LkuGWLmndoLlYwd!!$+)hLwyA47(W_7)~=XFtBp; z!NGqP?!LbE_O`ax)|QsOzP|q~ynTJ`ZtfnQUfw><&0rBegouxCQxixLKeCXoA6yJ% zke9cQk1s@wl^0@BD_97mij$+S56lB`*g5<9`dUHioBR6yvvKzIwY7om?d$u`%GuY~ q4t7Qh0UoM8R5MYm!*mS`$RB8K28%%h0Ok)CEJ1)7PG}*C63hTGRjXY9 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 zcmWe(;Adc9`13!4fq@~Ffq|infq|i$fq`KW0|Uc01_p*x3=9nS7#J8nfK)LsFt9N) zFbFU*Fvu`6Fz7KdFgP(XFoZEOFk~?@Ff=kUFic})U|7z`z`)GZ*Vos_1t$M9vGnz| zwe|IJvh?*eH}&=XXJqT^Yj^i(?d#)U>+5Uw^#utsu=n+~yFoX(VSb3PXKP=J zkFPI&vGz6(Pp=jqAK#`XkX}Y!kSp52Ld_uNe-`$>zE&@9pXR>4|E#QieXZUtC@f@o dOx+A1x1iYp7ISm=Am~2q-oqLc7y*V7oB-xKpiKY( literal 436 zcmWe(5N7~^2nGg*R0alyG6n{QZUzR1MGOoK+ZY%aPBAbr++$#1_`txx@P~ncfsK)Y zL4c8gL57imL64Dv!HJQ9A&ilMA&ZfLp^=e+VHzU?!*WIj26m>tzP>&_F!`U2rLV88 zt*?)lrLV8Ksju%pD_dV*ySqngUmp)!UthDYFG!Guy|1s`4I;`87WD%Q^FxF^Tl-pk ze0}kYwYPbAdbRlY_%=0x^s@4TT+s#=Y6da?bFlaIwR(B`H23xW=Va~cYxQnHVIj+7 d>Sh7C1FaB2 z>+Ac^$kx}_?(Wgr*T=~WlIi=;z~0x_?gkNJ?dxl90;y-O<%f;!jBy9Ff83FCr!NPa=`KO#(^ GVFUpCJc=#= literal 387 zcmWe(5N7~^2nGg*cm@WB3}$KzKer zzP=zH2T0D#+s6mYW95b#=I!It3~~oI%tCJnp9|_-FYgwRG$)J;<{|k7$^VEjfrb$P DQfi2s 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 zcmWe);Adc9`13!2fq@~Gfq@~Pfq|i!fq`KL0|Uc41_p+s3=9l685kJeGB7YOGBPlT zGBPk|GBPmOGBPlPFfuS?F)}dJGcqttW@KPk%E-XL%+%M{*T(}U|1+}o_4T#2_4RSH z^z}70_4WN{VC(B^Z+CC&>*HeW>ud6Zi@AZsINAF8ntag&IoSL9ntjnl**W_9ntfox z{C$1xU=vz=FvMECF~nNEFvUE*ynUKsmP5?*@bvO-hC2u@)`D;(2iRT@&z8PEWVf?J sgj-QXL0$(t5?LuLNNF2PAta1gKw;F^#|a9droO(u|BT?^lhdqjxsPX++<*2c+0@Rz{tqJAj-(V zpvlOj7kj2QrP|wJ~Fqx5oVJRa613Ob+Utga9nEcPm+Sk|D*4Ed@&(hb| z)YRAapM|Zjuf5&9t*?)dwXd(q4=&~g660m->ud5w6Xap<>udH!7v<*Y>udIb3G?^$ zwS!G)@xc&l@x~Bq^}-bM^z!y;hFK0V&%@KpyBY2vxL6CqksM%qJv>|b`jFku4iRoe q6$N=6>_}v#tRSUrFolpXVgZFwUmq_hgqr&L`u?+mgOd+T{s#b(tDR*4 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 zcmWe&;ALQ7`1Rj|fq}t~fq@~6fq@}`fq@~1fq|ilfq|imfq`Kb0|Ubv1_p+G3=9kx z7#J8HFfcHDU|?WiVq{=*VpRluYOkZSCu0XY1>0ZfXJ>%-RP5 I>@dcE05^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 zcmWe&;ALQ7`1Rj|fq@~Kfq|ibfq|ikfq`KP0|Ubn1_p*L3=9m%7#J9CFfcH@0;yzR zVBlh8V31&BU{GOXV9;Y^U@&83U|?kJg8+6I<39siUte2WYinO0J6m60b5m1OU*CTQ z-oCyzcMs2&zUCNTU+f}`+qH()ziy6CZ?$mVMbr8mv>Ba zA6O4qjk`x*i+6J$#2%cruIQiW#a6Eo7wlDnY|BcT;G2d);_Q~eg9dR`}$h? N`u?*q_VxAs2LPE?bejMG literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0410.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0410.lmp new file mode 100644 index 0000000000000000000000000000000000000000..3edbf25aefb46adbbd11bc805b4bac9edec43d4b GIT binary patch literal 421 zcmWe(;Adc9`13!4fq@~Ofq@}|fq|ilfq|i)fq`Ke0|Ub@1_p+63=9m97#JA7GB7Z( zGcqtpGBPk|GcqvPF)}a&F)}cuGBPlfF)}c;GBPksVq{>L%gDgM!_?Q;*Y}^BrLV84 zsju%pBMXS%*T==$*Vp6+5@BHL>uYasYwPRdWb5l|_C*M~xwrN8v2*l+M4`g`eSPg< z;g%L3UsSQyR&O6PF%M5Kuo&2820pM}s8|!oRSdi^p_Z0rU$A3fBCQ}xafrYTg6it~ z&j4~)yF1KmuzieteSLjxZBQqGeZ|bv*Vl*aPFAkIzCMIkAby1g0Vp*3n!rYJGlK)| FKLCsunqU9` 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`19X`fq@~4fq@~9fq|ikfq`Kf0|Ub<1_p+G3=9mH7#J9yF)%RvVqjq4 zV`N}ZVq{>jU}RwMV`N}RW@KO}V`N}p+9DRUBeSK|it$ls$94#%_ tMEm+$e0+U+9DudG!gorfv_5EjN>FaB4>FeWQ?dxl428pmRfkKFr8ASH|2LPoQ Bjv4>} 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`19X|fq@~6fq@~5fq|ipfq`KX0|Ub{1_p**3=9ls85kIDFfcGYW?*1= z$H2hwlYxPOg^_`QpOJwuYasYin(7X=!e5YHI51gNV7gdw6(y qdHeYI`jR1rY93!-U%Q)o8^Y@U3~VqVikR(fZGC4uUmm zzP|q~yb!^@W?x@Fzox#v|IB=SeQm9+EiKJ(AtwI5zBUgJPcLsDA79_5CXg~l{=U9; zcZ6VHU*CU5K6J7F3?OB0?jA4$L0X|=ZD5<5eSN`VY<+$0ZtiV;eVlB4AjjYqgqVn` t8!Cpy7GxLxXAl6}f-KhepFt2!5aK_O(l#ss0d_UmiIDI@4oyTD0|2$Us?-1g literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0415.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0415.lmp new file mode 100644 index 0000000000000000000000000000000000000000..a455336bdc3d8047a3b0892f358b99a698de742e GIT binary patch literal 304 zcmd;M;Adc9`19X^fq}u7fq@~0fq@~1fq|ixfq|i)fq`KW0|UcW1_p+c3=9l+85kHo zGB7Z(FfuTRF)}cyGcqtRa`eH$e+I6;zV`OEw$|2`mcG9K4BUNv?QZTKo?hNQ%^*Gx zf)5ekMH29B0x97Gi?p@2dbjxaq6qc1dbcz~h4>+=phA9Nok(JR&AzzBpf>b@+}I4U f0pg4{ut%D~hOt3B($~ku1QPwv$O5AJ`u+m|Fl%!9 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 zcmWe<;Adc9`13!7fq|irfq|ikfq`K<0|Uc41_p*h3=9m{7#J8{fmARsFz_%kFvu}7 zFc>j1Ft{-?FhnsjFyt^YFw`(IF!V7pFf3wZVA#gUz;KF@f#D$|1H(5)1_pK}1_oxP zzP`RbE-?9@iKVZvt*x(*lcle(xv8)3KO3=9mn7#JAdF)%PN zF)}cSGBPlzGcqt(FfuT>GcqtRGWGTK_3?no{|qdBeeLaiecUX4eN9b$eg7F)`}*45 z+WPvqSo`{#e8EC&AR+g*zCKR2zP@H(h#)^qun$wLwWS3^U8@(lVjiuYUf#_<5PKQ< z`uf`4Jv=b+ z+57t1JiWYI`uhGe@$~hzd3buYK=uA-1Q`r+6Ouax`uf_D+zD~0AetZ{QDo19z0b%G JwG%=82LPgSlE44} 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 zcmWe+5Mf|o`2XLBfq@~8fq|ijfq|iofq`Kb0|Uc41_p+M3=9m{85kH|fmAUtFo-ZR zFz7HcFt{)>FhnvkFyu2bFtjo>to@8THNC8;{y_9WbW&0@9X1W@9S&z^7d)& z>-*2Z+Sk|a(%#p{4ifbA@FfIs)y&ER67ukDftvjvVim{EzQkMO-+4$5HUA*4^J;|A0J;| zKa$13=6S=-gW1~Z-2$=wKUAdE%iE_JECjK$y{*mDtHs9$-5srcEg0@V7Gv-0Yj<<^ lXzlCcVDIZ|hB=uH;2sF{o`VEg*GSRr)Ze*i<_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`19X|fq@~Afq@~Bfq|ijfq|igfq`K<0|Ub<1_p+`3=9k>7#J9CGcYi` zXJBApW@KOxXJlZ|W@KQnV`N}p&j0`b literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041C.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/041C.lmp new file mode 100644 index 0000000000000000000000000000000000000000..82a8d8c104b8a96fd171a3a801348588dca463cc GIT binary patch literal 487 zcmWe-;Adc9`13!8fq@~9fq|ikfq`Kf0|Ub<1_p+G3=9mH7#J9yGB7ZFXJBC9WMp8F zVq{>@WMp8lVq{?OVPs&4V`N|`WMp7yWn^HO$;iO4mXU$sAR`0ARYnE|M&3SD@SlOd zudltmt*y1SrKP#Ksi~>24?c?L?>qnj#l6ic6eeGcLT3R61|7YL@SqrhE zxw)^e??2dSZEX-c!Omdj>FeujZAG|&m8-9>ucZa%Bn){>BQULDz~UBA5I~(rwIDzX MQn1q?eut3%0U5t#K^$F$lHes{xk6R^|iORwY9dkv@|z2H8u71LB!nL zJv_a>Cdi=$3qb(07?l

IAZyTkjTtroT*8sc 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 zcmWe+5N2Rt`19X~fq@}`fq|infq|iyfq`Ku0|Uce1_p+!3=9l!7#J8B7#SEu85tO~ z85tPt85tM?85tOo85tOg85tNF85tOQ85tND`TNkpe+I$6zV`OEw$|2`mgeRr5a{ds z&mh#-*Y4)-;pye=8ie@4!}zV^1Z*4CDmzP|qq++5TQ39&&`_4RSE_w_aV`uc(O5)kEN1F1z*%E<~6 fMAgp8(%07v7iw>7>+9oU0{QVjBMXS?>-!G?Jxp;^ 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 zcmWe&5MW?n`19X`fq@~Afq@~0fq@~Nfq|infq|i&fq`Kr0|Ubv1_p-x3=9mH85kIz zGcYjxWnf?sW@KQ{U}RvhVPs(NWn^GrWa$Hg{|sz>eQj;6t$lqErkgvM$<^1_24;d( z{b%5Ta$B04oBBXXc_9KVUfw=FO-&#XKCp;~CrHHC7ncw}R8>oJvyZQ@A6OYwtfjB7 xuL&jwauwKqPIi!}AH+ZcqFii!eNBE4=fIV6vG(@9d8002@4eg^;m literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0423.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0423.lmp new file mode 100644 index 0000000000000000000000000000000000000000..635bcbcf87d6c41b3a66e806adbd0004dff99a63 GIT binary patch literal 387 zcmWe(;Adc9`13!4fq@~Ofq@}|fq|ilfq|i)fq`Ke0|Uce1_p+U3=9lU7#JA7FfcGM zF)}a+FfuU6F)}ddF)}dNF)}dtGBPkkGcqt_FfuR{GcqvLFfuSOGxhcL_5EjJ>FaB2 z>+Ac^$kx}_?(Wgr*T=~WlIi=;z~0x_?gkNJ?dxl90;y-O<%f;!jBy9Ff83FCr!NPa=`KO#(^ GVFUpCJc=#= 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`13!8fq@}~fq@~9fq|ilfq|iefq`Kf0|Ub{1_p+03=9k>85kJuGB7ZF zWME)mWn^HGWMp8_Wn^G*U}RtjU}RuOU}Rv(V`N~cVPs(FU}RvJ#K^$F!rTV}|Cw3) z`r2As`}+PfvG?`0d3boX^!5E`+5Uw^#utsu=n+~yFoX(VSb3PXKP=J zkFPI&vGz6(Pp=jqAK#`XkX}Y!kSp52Ld_uNe-`$>zE&@9pXR>4|E#QieXZUtC@f@o dOx+A1x1iYp7ISm=Am~2q-oqLc7y*V7oB-xKpiKY( literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0426.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0426.lmp new file mode 100644 index 0000000000000000000000000000000000000000..afa8eac5a7343bc8866ffc377beb51aea3122bd1 GIT binary patch literal 401 zcmWe)5M*Fr`13!2fq@}`fq|ijfq|iwfq`Kr0|Uca1_p+M3=9lc7#JAtGcYi`VqjqS z%fP@O$jHE;%E-WA#mK-Az{tRm#>l`>&B(ye&d9*P$lZqw{xk6Q^|iORwY9dkv@|z2 z_4WN{;OpyacXRjf@bvQb@$m%<@uLXg7lRw-3s%R-hp?|1BE-qo*N4f(qL2Y(FPeE^ zF@*ELb}$HFxUcU&gCLq<6WA*tQ6wY%{6M0N0w|7z2y(Ia^)-P&U*CUjR;Ysi0P4M& Af&c&j literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0427.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0427.lmp new file mode 100644 index 0000000000000000000000000000000000000000..f9cbe54bf0d9d24291e2b7b8412e0e7354bb589b GIT binary patch literal 334 zcmWe&;Adc9`19X`fq@}}fq@~3fq|irfq|isfq`Kn0|UcC1_p)=3=9mr85kIjF)%RP zU|?W)!@$76z{tQL!pOj&!N|a1!^ptE$leD7{~0*@`r6yu+FDy%`uhGeaP{@IySaOK zczS`k+;FaUGe{a6AFSC6EYHXVF}D@MWo7H@!(=k@A}i_x8OslIgO_)6b5m0jObp@@ YZyz6DUy{YZ&T46anFq5KVmHWE08QO}m;e9( literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0428.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/0428.lmp new file mode 100644 index 0000000000000000000000000000000000000000..f6475c60076a417bc37cfffc15841eac16aeb605 GIT binary patch literal 534 zcmWe<;Adc9`13!7fq|infq|imfq`Kj0|Ub*1_p*>3=9mn7#JAdGB7awU|?Y2W@KQH zXJlY7W@KP+XJlZAW@KQuOG|TeQ&Ur4A4JT}-NVDv%iG7t*Oz25xOou0jC=@7n;}A+ ZY<+!DCKg##M?rLe#fGn=AR&(#KL7`2&Q|~c 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`13!9fq|ipfq`KX0|Ub{1_p**3=9nC7#J8HF)%QEWnf@nU}RtrW@KPc zXJlZoW@KRSXJlYVW@KO}XJlaLVq{>L%E-X5f{}q?4w+nE3W literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042A.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042A.lmp new file mode 100644 index 0000000000000000000000000000000000000000..9489f19b525722e91a41bb7d81079f45960803c8 GIT binary patch literal 355 zcmWe);Adc9`13!2fq@~Cfq@}~fq|i%fq|i$fq`K@0|Ucm1_p-X3=9mn85kJeF)%Rv zWnf_7VPs&CW@KQ{Vq{>jU}Ru$Wn^FoWMp87W@KPsWa$Hg{|sz>eQj;6t$ls}8Tk78 z+T7e*!4hENKLbBRsHLU3xd{Y7${=DMo?hNQKEA$wO{9vowYIjjc(=4PHG%aq@`3H@ zYw>RB>w^ffa`h49`m{7b?1m_YJB5w2udf--W9I90 I8EpT50AF8(1ONa4 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`13!3fq|ijfq|iofq`Kb0|Uc41_p*h3=9m{7#J8{GB7awU|?WiXJlXy zV`N}ZWn^G5W@KP+U}RwMVPs$kV`N~+WMp8dV`N~M%*ep7f{}q?46#f^KNNrY69zJgyxK^=WB>*bPw(cM2P4Utcqv$Ib!b`TF{TT*=N3;egm2tbKh=O&}J`euyhT uGEV%su 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`19X`fq@~4fq@~9fq|ikfq`Kf0|Ub<1_p+G3=9kx85kHIFfcH@XJBCX z$H2hA%gDeW&B(x@!N|a1!pOj2$H>6I$lHes{xk6R^|iINwzjl1H#dPmUmrxw&E3P( z%iG7t*VnI!R57r5-YqRnO<=u@d=N`pyj%MEAVREMeSL(uJ}pfUyCI6uZMd g*f~HvUteF4E7{p091xp>wXd(K3B=-L2HXE107Kt;Z2$lO literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042D.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042D.lmp new file mode 100644 index 0000000000000000000000000000000000000000..9330016b43a419f6f5fb8b1a71101504c5df73bf GIT binary patch literal 341 zcmd;Q;Adc9`19X|fq@~Afq@~3fq|ivfq|imfq`K@0|Ucm1_p-X3=9mn85kJeGcYhP zGcquUF)}b{FfuS$GBPlDFfuSOGWGTK_3?no{|qdBeeLaiecUX4eN9b$eg7F)`}*45 z+WPvqSo`{#e8EC&AR+g*zCKR2zP@H(Jc9f%m3;_>FtOH_7Pw}(m=`f(9<82U-pxJ` ziy8U)`r6$+JUqR;ePBYo$U-0|Gx7BGwZYVY1em${`r2AsTUwf%L0lFNP#8e)e*pDw BeqjIr 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 zcmb1S5M*Fr`1?PHfq|i(fq`KP0|UcK1_p+G3=9mH7#J9yF)%RvU|?WiVPs$sVq{=Y zVq{=2VPs(NU}Rv3VPs$^VPs(FVq{=gz{tR`jgf)j93un6BSr>>Z;T8K983%h5=;yX zYD^3aMobJ0OniN4;6I~4UtfEBTU%>uOG|TeQ&Uq@Umrx!&E3P(%iG7t*VoSvn;=9b ze_vlal1i{bkQmrVZy&IceSQC#cp( z_w}_w?FN|#(%TMq3`m3#WCPgNmKKovki}YC`}&%FeZfv<;OOh?aC39_XzlCcVh4#s zyu!c^5pV13<7VsYYa&AwhsiLPA-e)5=IMoSEvBE)eGLzjW>A<{9 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042F.lmp b/wadsrc_extra/static/filter/game-strife/fonts/bigfont/042F.lmp new file mode 100644 index 0000000000000000000000000000000000000000..85d8bdfa830841ea27943350eae0f3bb71a10b07 GIT binary patch literal 380 zcmWe&;Adc9`19X`fq@~6fq@}|fq|ixfq`KH0|Uci1_p-h3=9mX7#JAtGcYiGW?*1o zV`N~EVq{>@V`N}(Vq{*Hnyk$wM}S^D}~Tl)IASo`{#nwt9h z{xh-l^|g9f`TBtb8TtD9+T1-ny_)-)e9?rwn|+`{4E%k4ZEo%!EneO} za50chH}}@Q7O)t|Fa}nTvev#nHuk>0W*;A4R6#bdAXp5nx3v!>&;)TW#ERC|mX>Cp kCJ^ZB`wtNVxejav*uf-;wSmoR1{nvkmXQ~17lQZ?0D5AL9RL6T 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 zcmd;N;9y{2U}Vr?U|=v~U|?`!U|{fPU|@)0U|`5(U|=X?U|?uwU|{G2sbckpfd35a z-rnAi9zXW>_WsYn0b)KuaGpH&e*EMyRL1);7{Zi!KlXkCm3abYf;ep6-XKwL@BfU< IU<>{O09HXU@c;k- literal 145 zcmd;NU}pdU9R>yla|Q+mX9flae+CAIXa)v`GzJESA_fMAItB)YE|4NNZz%ZB!2bBL zxA&vR-rnB-8Q7mZ@qY9eB=Dbs-P_yy@e?qck~& 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<1qKENeFg>wX9fm_a0Uj3Yz78~dXNNH783Z+z@L>B5E2#^78Vi>6^Dw2 ogn)!&v$CQSv$DWqK_NjwK|vv5@kn9;0YO1Q0pXEwy{N_m0GTN(J^%m! literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0022.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0022.lmp new file mode 100644 index 0000000000000000000000000000000000000000..7d1d386197233c9f5021133ea6f030adddd9d45a GIT binary patch literal 133 zcmd;PU}XRS69xtbQw9bGI|c>@4+aK?AO;487zPH0SOx}$bOr{7LIwtgY6b>|76t}} n{|qcyVDO)TH7hGHIzB54!U~76AhKXV2otOjE)CTJGvz-3n0X|H literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0023.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0023.lmp new file mode 100644 index 0000000000000000000000000000000000000000..4975a93a94542f1c454f8c52a3b1fe1cbd5af6e3 GIT binary patch literal 295 zcmd;O;Aa2<8wLgjZw3a2CJeL4uKifrU8>1UMkne-Jk%D+|Pp%F6oBzz>ql%1X(~%8G(8!D7kr@$vD=$qBL1 zk&%f|b)i9_p;6J%5s~3RK`=3pmhh~sED+Ah$^si74lzCystu$hE-Nc56vTjv#Y9HN t#Ky)ZgoH;%CPBqQLqbA9I4m?c7$yeN0x}weVa5kRj1Pj^mIdL0WC2Z_T`~Xw 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 zcmd;Q;Aa2<7X}6fUj_z-L5ZiLr@^;okyv$EJgUW$#4hL{NRDLcsXksxpW=YRzW E0Gs7)-~a#s literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0025.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0025.lmp new file mode 100644 index 0000000000000000000000000000000000000000..f81e36ca3c082a0701c2b9712f7483d1b327e329 GIT binary patch literal 300 zcmWe&;Aa2<4+aK?2nGg*Oa=yqY6b>|J_ZJcnG6gJOBfg!)-y0L>|$VGILg4laDjn= z;Wh&U!!rg3hMx=!4BU(i3^I%i3=Aw;V8Fu+rv8KYF_BqW+$>pH0nu4mV1dZ+tSm0p ztgHYK11thk%*mFO6&@QKo0avS1I$cJ&C2@Ej$pDunCV$r|5-uI_(Tws1;k8G12LIF z%vi7}6NCveff2-vj|VXsK+MR(mi}j8&B_W2iiL=PTncti2vh*#K!{&JUI1$W E0Dr++{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 zcmd;Q;Aa2<7X}7~5C#T@6b1%{G6n{QE(QjMc?=8;n-~}vjxjJW++tv0c*nrNz{JSF zAjZhRpvB0*V8_V7;LFIsz|5Ql0vs$LGArvp6L(ftVr*M`=1~U&V76eik5DwFeRV+R^D~ly4I5-TUE<7B8lDVNla-Yf5t9TJi;s$kii(Pfii(Mj1F2)=&B}_2iinPh wiH?bhiOS0Q4-!cVkBCo7j895TOwP*s&%~XTm6ZqqSy@^CS=gb*W@Y^c0M))VzW@LL 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`1Rj_fq}t-fq}t=fq@}_fq@~0fq@}|fq|iffq|icfq|iifq`KL0|NsS za~25vXJ7|W$shvEPRs(qEHFDJF)=YJ3&PF{50A`3u)|^Oz>v_eaHu#-R$x{bl%18u J0yYz74**fuFW>+G literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/002B.lmp new file mode 100644 index 0000000000000000000000000000000000000000..19a7c987246beb98c6036c832a2f44f5f847d70d GIT binary patch literal 120 zcmd;JU}s=p`1N0dfq}t*fq}t-fq}t=fq@}_fq@~0fq@}|fq|ibfq{XEIST~-gXpBJ stp5z`AZ{#(0JFoxBVyvA;=$pOkr7aKR#q5T4M<;LRu)))R#w)30BPPL$N&HU 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`(efq_Anfq_Affq}u4fq}uEfq}u3fq@~2fq@~4fq@~Kfq~)we`cnv htgNj646Gn39?A*~2eVkRvI3()Ld+n^tpET20{|mw81euB 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`1Rj{fq}u2fq}t_fq}t=fq}t~fq@}{fq@~3fq@~1fq|infq|icfq|im ufq|i$fq~)we+Jep2mrGZQz^u^tL=0A7Buos!icW&*02}lF|9=2%_bAr@ 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)Uifq_Ajfq_Abfq}u8fq}t>fq}u5fq}t~fq}uFfq~)we+HH;FaR@R SBD1o}FtKIL5%haFKz5;Wh&U!xIJu1|H@t5cto{l9d$@ot5>Ui#01NATm5F>pv%3R#tdy zY;0E6e-1D+F*PgeKRbfS24SXWW&LLbG2;_KOcoF`Jq^TU1~Fs7qD&Ab$OJ|ZGd>=~ bWB@TEBf(78tgN6QkYx-kSy>@q2Gnf;!GuS4 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0030.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0030.lmp new file mode 100644 index 0000000000000000000000000000000000000000..d14522144268158ebd2c5e9f7b5a6e22ea792cbf GIT binary patch literal 227 zcmd;P;9&p(69xtbM+OFl00stzLT1 zz{HUS2mcwlva+HfAU-SWKLbxzR!~S-SV%}nSXe4lARsI{IyyEsGAJ1;z!DEJAPB65 zB`XUgz`>H06#^FE$;x6$gs2FI34n}ih%6AFmBkVb6#y9)6qA+30y8u`JR%xoAjm9;wGk1~5s6t@EFd!&*|M@C!b8Ke SvN%|v#xg-&3ladi_dftnT}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 zcmd;P;9&p(69xtbR|W=#Fa`#ObOr{73I+y-P6h^sSquyes~H#=_AoFooMm8OxC2tm zk_84FQ2IXuOIB8RL{=6^AT%i}3oH;A0}%*^3&cYNLK8tMc(SrsV!*~^K~z8mK!R|A zfS9bTprov<@HD8FpqS*en8dW?B$z;GOnhQuVlqU4kt-`JIwn3IB$So)pNRuvK8XAe E0Q_J_r2qf` 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 zcmd;P;9&p(69xtbM+OE4KL!SdXa)v`3pufeR#sqOU?2+%3kyUaPgYh?czAS7OhiODOiM&ed}3l^VtjlW$YiJ)ApIcx9{@`M BKHvZV 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 zcmd;P;9&p(69xtbR|W=#Fa`#ObOr{73I+y-P6h^sSquyes~H#=_AoFooMm8OcmPt& zlZ68QGw@_(g@s2(M#g4kg~euNfdzuXLc%~C7MK7_SbTg)d{!2cKvq@|ia=ym77Iuq z9%=?iDM&>aOdu#SD=RE4GCDdDsv;ydD=R!aHZd_3B*2oD6&{J~u JDjSsk4*;mENp%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 zcmd;P;9&p(69xtbM+OFl00stzLe+N0I;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 zcmd;P;9&p(69xtbTLuOOHwFd|9tH-6xeN>pYe9-x zvcTX!14~v`WO7y(m=Tr;Wdy}T87wdn7O)6URu)JEtThXygeNO2C^|YiJ~lZy8LX5i lD=R!aJS;pcIyn_&EF*VTR&;c1d}3lMn9sxo(+r~j0|53RH*f#| 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 zcmd;P;9&p(69xtbX9fm_AO;48WCjL?5(Wl_Rt5%!X$%Yu%NZCLb}%q7oMd2NxWT}{ zz{H#d0_+g#KOnG6gJs~8vrNt6Hp literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003A.lmp new file mode 100644 index 0000000000000000000000000000000000000000..65609d3f2b7c45129167140077f0fbe89c450a50 GIT binary patch literal 112 zcmd;J;9_84`148EG*|$n2c!Z-|Ns9V0ABzf)Bpeg literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003B.lmp new file mode 100644 index 0000000000000000000000000000000000000000..b72431f9dbf3760499278abc334d1bae072fb9a3 GIT binary patch literal 119 zcmd;J;AUW8`14-0|o{LGX@3*I|c>@4+aK?5C#T@BnAeCA_fMAb_NE9Squyes~H#=*ch|2 zvi`F&XJv(FW&LMi&B_W-56H^;&&-~c6&{}$3le4G1hL~&Av{KI2rnx&7A(uamX#GA z8JU`u#m<(Ml^&Z2(!#)+l@$~eo0Y}Enw6EFmY$XMpMfPSD-0|o{LdjX$%Yuix?Of)-W(IYyl}`&H@20 z2=$+VB`Yf=HYpvrRR#td?L}FHSe0p+L)_*3>tgNv3sF=i55RaKXD=RE6F*PMC>pu%CNE1j8 QD|1#BNQ8|sD=X_i0M|D*z5oCK literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003F.lmp new file mode 100644 index 0000000000000000000000000000000000000000..132acc43c246ac84d02904fde3eb9bb2ecf5854c GIT binary patch literal 255 zcmd;O;Aa2<8wLgjZw3a2cm@WBVg?3=b_NE9*$fN}s~8v^YND>^lqjr4lpn6LOWo7+moTLL=fq2E~NOLj_{evXbKCld^(f0^!M7 zF~_^d#fionFILxD8UspM?(o zGw^3+#Uw&Oe0+RjRu)(+G(ILKCOSGgIwCwG9wrt86^o9DhKWVT#K%MR$0tG6MI^$l j0WtqGuw-S0CT3-ELus%;U_3+sL}M2K83NJ*qW=Q`4_!)( 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 zcmWe&;Aa2<4+aK?00stzNCpOmWCjL?JO&1aN(Kgo76t}}eg+1HSquyeOBom#HZU+S z>}FtKIL5%haFKz5;Wh&U!xNAJ%vm7tpMfPSDpuf)R#s3Dn8lWr6&@Lxnw9mR z5yXs-2QisI%-BQ_lNrKH&&vAG0%E48ftaiyW_%)u$p&J^f|=|PCP*6xg2@SH#)53) aV$I45hz!rl`p?ahl@$=3mGz$o>NWtZy+?Kc literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005D.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/005D.lmp new file mode 100644 index 0000000000000000000000000000000000000000..5ed5da4ddb5756ea0c8b9c420aad0371f9b609d9 GIT binary patch literal 236 zcmd;L;Aa2<0|o{LM+OFlAO;48WCjL?5(Wl_4h9B>ISdR88yFZEjxaDV+yE(L$pQmz zDE*&-B`Yg5F)Irs0HVPHf$hy05V)Ng8%>k 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;?1fq}u1fq}t`fq@~Ifq@~0fq@~Ffq@~9fq|i%fq|icfq|iufq`KX z0|Ucs1_lNOmMk#%4`PJGW@UjHLD5h~NFylT?PgQJq88_GX@3*djfSf&C1G(iOI_P&&r;am6aGB4q`KNg4i+Pfq~Ik zS^t^1va%9m!ox#@6SK0i{xfoBWhKQ#hDSnp>{(ecknG6gJs~8vXw5ijIzsj!DYO0t*DkXJrLO$HYV@LInar z0-?d7;qg#`;KZz~z{u#xNSKPyl&q}4n5?XTXsC*S_^hme7>FR)P>=w~oPbEE3J?dZ z1tE}_7#IV>P!$2e!O`L2!GWPLL&Jl^gM$Nt!^2?$@u9&1Nl5{bATRu930}D$Q82o4A$jZt}ijPmq%F6oB$d#3q6axk+P;O*=d}3l!Qc_md ze+HhctfZ8bloSw=4i$(=Ndp-a15v?}l@*hcmBqo5l@$us!jhF02^9#80cl~$$^tP^ lR0JkMw1DXU3`i=16Jc87(Nsi2wM524Re&4;G89Dr2LQPvS9t&c 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 zcmd;Q;9&p(7X}7~PzDBuGzJESas~#54h9B>nG6gJs~8vWIV`- zP`E9Lk>TOt;h~|yAcrw>Wo3nj27*9zR@Q$IHz_hQG&ndqDJ$zg6Gv87R#JR?QdU;h Me-;*yIayi%0gK*X2mk;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 zcmd;M;9&p(2L=WPPX-2tFa`#OR0aly5(Wl_Rt5%!X$%Yu%NZCLb}%q7oMd2NxW&N0 z@S1^v;SU1?11}>30}D$Q82o4A$jZt}jE_&u%F6oB$d#3q5+4~E86KSiyXW+@oijNEr4-XFw4o-v$ghs~4hl6koR3I`jD=R!PD=QeLB{(T7D>Nl53vLET sZ)j3hRv_Gr6f_lJOV 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 zcmd;K;9&p(3kC)TR|W=#5C#T@6b1%{5(Wl_Rt5%!X$%Yuiy0UgHZU+S>}6nJIL5%h zaGrsIfrTRr4*oN7Wo2b0#mC3Q$0ufG{b%IP%1VieiH?kpjD+zM6Jx?d!-E5(v$Fm( z@ML8rMuvxnhQ`OlfE0iPLgN#&0^%WN{%7FG0&@alK+2&UuvuW47??7atgJw=5|*s2 KXs}5vP$>XJ`$GNz 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 zcmWe&;9&p(4+aK?Kn4beI0goWTm}Y)8U_Z2UIqq+c?=8;>lqjr4lpn?}(5S{`N z2!siQLInb1peh1m&{PB_W@WLmgUrnePDD}!5{rz9kAaKDL(~NX1_pv%$dZ*63KI(m Z2!M&jCqdN3fLsqX4`e#XJP-}?I{;7_X=nfd literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0068.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0068.lmp new file mode 100644 index 0000000000000000000000000000000000000000..b2b14f62c40c3b37e0b9b58fc12189219f7b3121 GIT binary patch literal 299 zcmd;Q;9&p(7X}7~PzDBuGzJESas~#54h9B>nG6gJs~8v|tPFILg4laE*b1 z;W+~X!w&`q22Mr>1}R1c1_qui6!0G;5R(W3@$vDA85v-K(D;~`nCQsx$oQ-*h(HWT zAUZM{CJ-GH9}m(Np9IwcGBq+0L}q3EXJN_83QdGE0zrB}B47r{K9H*5cn}FSJ~}2Q vCNdsmB2*wSGCVvyJTx>o1||?58VCZx(NKZt#Q6AV5CB;NGZbQER@Q$2%8_5L literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0069.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0069.lmp new file mode 100644 index 0000000000000000000000000000000000000000..4110be87cca72285805c2fe8de6bb4a935b4c9e3 GIT binary patch literal 134 zcmZQ$;9&p(1qKENLk0#0Ck6(FU}2~9Ul`PA0HDFlbDqS n76^_{OiWCQj}DKA3B<%C#>Xec!&Ss2fm9?V#>2EAoBAIBat0|0 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006A.lmp new file mode 100644 index 0000000000000000000000000000000000000000..7ad8fbd85c49693a507feb9850c77fadf600486f GIT binary patch literal 222 zcmd;O;9&p(8wLgj7X}6fUj_z-a0Uj3Lf0{_`qva%u*v$FoPv1VljB3R+!AThSAtkB?Kurym%R#r@Sd{)+f z4wkH}P!NNG2V?{o$49~hB4c7=Vxl8Mqd~eDxU;eX!b3wt0|Ns?v$Fn!_<`ZUfx*F{ a;b3{LtgOh$$jF$O_$-h#2iPz$@gD%H!$TDS literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/006B.lmp new file mode 100644 index 0000000000000000000000000000000000000000..f68e086c56fe4e483f7985a7ef0cfbf87bdb1b20 GIT binary patch literal 318 zcmWe&;9&p(4+aK?NCpOmECvRKY6b>|9tH-6xeN>p>lhdqb}%q79ARK!xWvG~@Q8td z;WGmR13M!FgCrvZgC-*bgE=Du0|QSM3iuBah>VVmj*p3siHy(60t*C21_uTQhlYp8 zKm`JVLjwW>0|SF$0^y;N(V@}Nk#H>_Q^P?-R#w)3X4b5%K(G`OdsbFpcyuU8A0ua0 zRzPTIXfVVSZZI!6G&nFY8fHyoXnYpP<|L2+YgSeO$OUX{Sy|yRF)1K1maMFR#H=iK o)~u}1=tPhRb5>SNRu%_KR#rGz7Zb=4oXlBSky%;)xxl>t0QEOu;Q#;t 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 zcmd;P;9&p(69xtbCk6(FAO;48BnAeCVg?3=76t}}sSFGZ^B5QymNPIgY+ztu*a=e1 znS}uV8Mw2u5>t|rk`m+Nv$C?l{LuKsq?nk<$QTfxCo3y3GBGheCO#%U2`Uf`R-cpv j7l0ZV9~hmL^`CAdMh_fY8Y3n8d_H hu&E${;K-Pm#Kfe;_#~(kVv>?lQj?P6K|0Vp2>^OKWI+G` 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 zcmWe&;9&p(4+aK?a0Uj3bOr{73I+y-P6h^sSquyes~8vU~ zWMp`FJWL=wJUlWyG&nd0Dv%f&9vT@M9TSt7l?65;F)}hT5@POuCibi>5FaGR3}%N0 zg4iq|c3>cw&B~UQl^7Zx3^fm;GZdl@sz>}2~8kqvJB{Bx&EU-JGqvPY_6XO#> l0w8C{#Ka^fB_+l{ot+dO8K0Dt2r>}j!^FfykPqSh1^}nEWugE8 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0070.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0070.lmp new file mode 100644 index 0000000000000000000000000000000000000000..8f9c543f2bb7cf0e4dae19d0d1882526c09c0a91 GIT binary patch literal 264 zcmd;M;9&p(2L=X)Kn4beBnAeCVg?3=76t}}sSFGZ%NQ6KHZw3V9AIEzILpAmaEpO~ z;W+~X!xshyhW{XqJXt8nG6gJs~8vN;MKq_J&X8&j4$jS-;34oPjaALBuf?-w#MrUOOMkj(bg6$5B zj)@5l4h#&Af!Q4z9vU1R92^KXj3+BAF)%nhJTx>Iftfct(q^vBEP)uT0)_(?`tgOh;(9qDt ztgJwoKyYYiaA- zH3MctB+LvD17u4$%odP}(3F&irSTbAS&1?6@i8eNLs_!25>v9W SSV6u@Oa$8l^(h;a{to~<2WL9~ 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(3kC)TM+OE4F9rsNUGjJgC{F1AQCJKCjK*k1;W7~G9IK9BoGi791su~92^4^ n2o8=64-Z8M1V%B)#!?gs)gUtgINY=4rWrc(7g*gcTslY%$ 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 zcmWe&;9&p(4+aK?PzDBu6b1%{5(Wl_76t}}sSFGZ%NQ6K)-y0L>|kJEILN@jaEgI} z;Wh&U!y5($hCd7p3_Oes4AP7Y3=AAuaPXgjD=RBHF)1k}B`GT_>puf`R#spV1f(JH z6B82?V?cbKtgQH?#Kgq-n8=tEr~uTo(7?p3tp6M=Sy=%vMqm+>#H7TSNRR@MyTYSmKo*1Lxw5h%Bco&D;~~yQ_7VVR C)n3d1 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 zcmWe&;9&p(4+aK?00stzC}FtKILW}k zaEpO~;S~b|!w&`q1{OvJ20lgx1_tIV5cto)nw1qDpOuyMpMgCqD|y~OIyyQ!GB`9CrUGn2aA06yN>iq9Z{jg4IOF#Dmx%y`f1-i6{mqB_&3tL9LEYNlHwNkBI@B2y$FxT1rxUOniI{ WSOs@hR!m}ie0+RNOgu;js^nG6gJs~8v9aBwt86G$LDG(09aFd!f@E9*ZaS5{U) zaBy&NXedYn6Gv87KzMj)aAH>0e=sK|GCC5(0V#}(PD)8hN&;~iKn5ixC8Z=KCB?u5 tLX(nGva%u*Ap)#fS)qwZ5a)zKgjhgA$WCU?%8G}0DIDZFut%ZZ1pp<5VDA6` 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 zcmWe&;9&p(4+aK?00stzNCpOmWCjL?JO&1aDh39IE(QjMnG6gJ%NZCLwlXj<9ARK! zxWd4|@PL7V;WYyT!&e3dhJPRfn6p6OKLblvR%lXI)_(@ptgO)ZL=cNDD=Q#88q8$R z$_fY!jRdh7xwEo@g98I&K>D(>{xfl9Wd(;vN5>~7f%G$TW@QCLMn*=)fE2@c;oLxXr-8@P>hb;V%ON zgCHXVgDN8fg9Rf4gEu1sLo6c$0|QGI7_hT~sjRI3Ad&F+tSmORtgPtB$attwKnz4E zAUF^%6rGjD%AS=K8X6oJjid}D78n{H90L;L$;tw02n`Mm4u=VV%nAq$%nF1HL}rDC zh9+hOfQ{kF$_fYw4h#>@$_j{tnh_8l9v+#Pl?BrJpMgCqD=<7fJUT0jg9TzfSS$c+ x2v`iFjx8%IFf=q6q6}gLVAv91xhJ%9TKL7;JZjt~1 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 zcmd;Q;9&p(7X}6f9|i`7Fa`#OBnAeC0tN<#dIkoDUIqq+nG6gJ%NQ6KHZw3V9ARK! zxXQr5@Qi_h;X4BZ13M!F11ED92>fSf&C1G(iOI_P&&r;am6aGB4q`KNg4i+Pfq~Ik zS^t^1va%9m!ox#@6SK0i{xfoBWhKQ#hDSnp>{(ecknG6gJs~8vnG6gJs~8vXw5ijIzsj!DYO0t*DkXJrLO$HYV@LInar z0-?d7;qg#`;KZz~z{u#xNSKPyl&q}4n5?XTXsC*S_^hme7>FR)P>=w~oPbEE3J?dZ z1tE}_7#IV>P!$2e!O`L2!GWPLL&Jl^gM$Nt!^2?$@u9&1Nl5{bATRu9b5I;0DG&nFY93~JL9vvMW z9T^!469|Y&0_n~QhyiI~$;t{y%*x^b(a|u0B#1y@B1{0PA`~pZla&=5nF2N=Gzp{v zBoGr56B!d96A2RtjSLSD4-XB63xtP<1_lNOhDL+U;LFMi4v&lkIV~m;WYm8KJ`e@L UiHV7z004(Y3fS);CPeN(0Iy?s2><{9 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0435.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0435.lmp new file mode 100644 index 0000000000000000000000000000000000000000..ed6f0036d65a6bf6efdef18117166fdbeea00cb2 GIT binary patch literal 286 zcmd;M;9&p(2L=WPPX-2tFa`#OR0aly5(Wl_Rt5%!X$%Yu%NZCLb}%q7oMd2NxW&N0 z@S1^v;SU1?11}>30}D$Q82o4A$jZt}jE_&u%F6oB$d#3q5+4~E86KSiyXW+@oijNEr4-XFw4o-v$ghs~4hl6koR3I`jD=R!PD=QeLB{(T7D>Nl53vLET sZ)j3hRv_Gr6f_lJOV 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 zcmWe);9&rP00stzcm@WB0tN<#W(Ed^DGUq@iy0UgHZU+S9Asc%xWvG~@R)&t;R^!; z11lo~gBT+NgEAungApSGgEJ!oLl`3iLpmb^0|Rpw2yjBE{|qcyS-~+`SsW}`Suu%O zS^pVWv$6sMW3sZ?S+laDNgxgb56Jke=;-J~FylW+AUZxKK0ZDs24VwGR#sqqVq#)ad~|p`$V!kvOiW^Y zd{R7IMNCp+e0*Y3BHRU8Sy|CBF-Z_ZK~{!?j0}f6Cq5}DF$Tm1Sr{G}nUR&15fcv< VK=x8fBG^kv-cA7vK*9qSEC72qbSD4+ 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 zcmd;O;9&p(8wLgjUj_z-I0goWdf(3Z8vO-fJ$^(%FKpc?D z{|r1?Ss+em5`=~bBtf*nRYWFcWrZhZWx)kPBje-4K{y6vEl*Zfd}MfdWMpU{$gKa2 kTv=Js;o;FS;b09QZc2P)R#td)N>BSqK0YxqF)<0`3no-g0suF%V5|9tH-6xeN>p>lhdqb}%q79ARK!xWvG~@Q8td z;WGmR13M!FgCrvZgC-*bgE=Du0|QSM3iuBah>VVmj*p3siHy(60t*C21_uTQhlYp8 zKm`JVLjwW>0|SF$0^y;N(V@}Nk#H>_Q^P?-R#w)3X4b5%K(G`OdsbFpcyuU8A0ua0 zRzPTIXfVVSZZI!6G&nFY8fHyoXnYpP<|L2+YgSeO$OUX{Sy|yRF)1K1maMFR#H=iK o)~u}1=tPhRb5>SNRu%_KR#rGz7Zb=4oXlBSky%;)xxl>t0QEOu;Q#;t 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 zcmWe+;9&p(9|i`7PzDBuI0goWd!&?RhhJOqU4E&4?3<``442Fyh3>++3VDKNrh)K%I`p>`v7622G@lb)7n3$O8 z=$II|Kww~acxZTNa9|8nML=L^XlQU?AVh#WD=Q!}IyyQ!GBOgRfGaC2FdS@T7KqD| zl?73U%m@evN%3T5ffxw2JXu+Rk>Ox~WP4y>Kmg1#kcvQ%noy|iJXu-c(b170H^a5S I3AdMh_fY8Y3n8d_H hu&E${;K-Pm#Kfe;_#~(kVv>?lQj?P6K|0Vp2>^OKWI+G` 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 zcmd;Q;9&p(7X}7~PzDBuGzJESas~#54h9B>nG6gJs~8v|tPFILg4laE*b1 z;W+~X!w&`q22Mr>1}R1c1_qui6!0G;5R(W3@$vDA85v-K(D;~`nCQsx$oQ-*h(HWT zAUZM{CJ-GH9}m(Np9IwcGBq+0L}q3EXJN_83QdGE0zrB}B47r{K9H*5cn}FSJ~}2Q vCNdsmB2*wSGCVvyJTx>o1||?58VCZx(NKZt#Q6AV5CB;NGZbQER@Q$2%8_5L literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043E.lmp new file mode 100644 index 0000000000000000000000000000000000000000..809cd26a996a5b6a6cb6712da41d97af6b77f26b GIT binary patch literal 333 zcmWe+;9&p(9|i`7PzDBuBnAeCLIwtg1_lO(i3|)3ix?OfHZw3V9ARK!xXQr5@Qi_h z;X4BZ0|z4mgCrvZg9al5gE=Dug9{@A0}D$Q82o4A$jZt}jERZK%F6oB$d#3q6c`#B z8XA}csz>}2~8kqvJB{Bx&EU-JGqvPY_6XO#> l0w8C{#Ka^fB_+l{ot+dO8K0Dt2r>}j!^FfykPqSh1^}nEWugE8 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/043F.lmp new file mode 100644 index 0000000000000000000000000000000000000000..c0642613eff653aa348c6fcd6cb31fced1900c8c GIT binary patch literal 299 zcmd;Q;9&p(7X}7~PzDBuGzJESas~#54h9B>nG6gJs~8v|tPFILg4laE*b1 z;W+~X!w&`q22Mr>1}R1c1_qui6!0G;5EBy<6CE8B6B(bC1r`Vl3=aVpBBP_Dqaz~`TEY?L{%2sx%7Q3GW(0)8OhZx2la&=184d;r(*gqn0|Joj Z3k(FQ2}L*{JUTiONUMT30}D$Q82o4A$jZt}ijPmq%F6oB$d#3q6axk+P;O*=d}3l!Qc_md ze+HhctfZ8bloSw=4i$(=Ndp-a15v?}l@*hcmBqo5l@$us!jhF02^9#80cl~$$^tP^ lR0JkMw1DXU3`i=16Jc87(Nsi2wM524Re&4;G89Dr2LQPvS9t&c 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(3kC)TM+OE4F9rsNUGjJgC{F1AQCJKCjK*k1;W7~G9IK9BoGi791su~92^4^ n2o8=64-Z8M1V%B)#!?gs)gUtgINY=4rWrc(7g*gcTslY%$ 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 zcmWe&;9&p(4+aK?00stzNCpOmOa=yqY6b>|eg+1H`3wvU>lhdqb~7+A9A{u)xXi%7 zaG!yJ;WYyT!#9vdMg|5>Mg|53<}48S&%lzE6`GWl^`C(?D=RcUF)NFU2_nIkl@$;k zotTxy$()r1R>7W?6%ZI2nV6Nu!IG7gl$e$EpOHH&D>yhXFeWQ8CO#|cKNDA0R&aQ9 zbbMquh|A28l@$;f85tg#mGz$)q(3q;62xX=2dRq;j|Q2+o|P3C9vT?~as`+j841$N Zz?PL27z#EA75G)Jz000<%QL6v| 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 zcmWe&;9&p(4+aK?Kn4be7zPH0Oa=yqG6n{QW(Ed^$qWn(OBfg!wlXj<9AjW$xX!@9 z@SK5x;R^!;10y2?10N#;gCrvZ12an&82o2q%gTz3j!w+V`p?Lbm6aIE!V(DMgoXzO zhQ~u?0s^zL0>K>atgL{@tgOIjhzSflSy|Dck>TNi(ea5%Sy}%<0)gS7fq{XcF)=9! zfzZH!z|e5GiqPno7?22xneh-aK~4#Xfmz6rl@%Hp8VIo+^ G9s&Sclvn2f 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 zcmWe&;9&p(4+aK?PzDBu6b1%{QU(Tw4h9B>nG6gJs~8v9aBwt86G$LDG(09aFd!f@E9*ZaS5{U) zaBy&NXedYn6Gv87KzMj)aAH>0e=sK|GCC5(0V#}(PD)8hN&;~iKn5ixC8Z=KCB?u5 tLX(nGva%u*Ap)#fS)qwZ5a)zKgjhgA$WCU?%8G}0DIDZFut%ZZ1pp<5VDA6` 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 zcmWe&;9~#*4+aK?NCpOmECvRKY6b>|9tH-6xeN>p>lhdqwlgp=9AIEzxX8f3@Q8td z;WGmR0}CSqgE%7tgBBwLgDE2e0|QSM3iuBa2#<~q4ULYDj!DYO0t*C&gLvWLp)oLl zXplfmcxXISATlO8Iyy2sJQ5}VGc^z-z`>H06`Gor^&iYghU$SSiG~Tprz9mNB_+nk zfb@VI5}A~el#~=76Q2mx5*isDlbD#87@q}OzL zxWK@`@Q{Il;S)$BTNV`jXJF6DiVO^ojL*vY&%lwD6&M*49t!8gM1}@NLuDf4BSTqY zpd65P7LYO)maHtWD4fB-1CoS@f>{4S0)c^nfh;U6ED+Opva$jK0)s&~7;GX>R#sqm icyvrmWMnwVRFIa)nE1rR#KidcM39|OLqP_D@P7a|%}xmb 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 zcmWe(;9&rP2nGg*Oa=yqDh39IZUzR1ISdR8YZ(|A_AxLp9A{u)xWT}{@REUn;THn~ z12-cBgA5}BgDxWjgBc?OgF7PwLj)rOLnb2wLlq+fLpLJ>0|QSM3iuBah>VVmjE;_p zj*Q950t*C&het<;M~4PRLj?i?0)s&~7$y)N4b~GG3KM{t3f98Gl9d%03Dpaefh&y+ z508n736F*g1cpaPN5_PRhr;cT1_{K3hsHzAh>VGjj*g5DkAw-p3=IScfUFBmg(`)~ zL?=T9;!~0mladnSV?av5-c3qLN=k~4iBE*82#t)6NlZ*kj8B0I#3aTiCdS9d$G}v; I3FSgFhn!LjofMLm?vrLlYwd!&F8Fh82tq44WAl7#Mi6P{4nX zKxA}eWOQ^)bYx6c7FZxKJUlu&JUTQm8Y&PF5Eu-?!7zdFXt18hP?!MBRInBfmaMG6 zNT^lqjr4lpnDnO>c0g+Idz?j5DxJ-C>U|=XrPhdb`csPuc6dDj239^rsEh{T4IvV6Sc4m-0 GS^oht4_Ph% 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 zcmWe;;9&rP5C#T@R0alyG6n{Qb_NE984L^zD;XFVb}=w89A{u)xWd4|@Q{Il;T;15 z!*2!#1~x_p20lgx26;vX1_MS021iB)h9E`;hGa$t1_qui6!0G;5E&mC4FWMqSy^C# z!0716$oQC;=tP)6d}L^7Xkch~JWL=lGBPwWIx-NZ0%U4nOjcGvbXL}X7LKf}!1%1J zfJhi8CNU8t3zi8F4-5>2D+>q=4~KE$LjxisK~}J`Wo2bWM}yqM&I~dd;w~@?N`M_2 z9TO8186O`X19L`TWO#UZcxY&F49ub7p@AR}46*~{+33Xhc#vn|euJ6^rv3u}ipF(9 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044C.lmp new file mode 100644 index 0000000000000000000000000000000000000000..79ad68157497514ea94bc1277f55369a2b94b4c0 GIT binary patch literal 263 zcmd;M;9&p(2L=X)Kn4beBnAeCVg?3=76t}}sSFGZ%NQ6KHZw3V9AIEzILpAmaEpO~ z;W+~X!xshyhW{XqJXt80qKqOQqFeWh(ArlxF l7z)!98W0#74&x+621G`J>|wq^vBEKy+eO7FZxK9wHD569`R#2n2!!c(SrU z0w9AxD*rR^WMzS5LX#jgL?8*G3a%nDF)J%PF)Ir$5E>aD9}dDXAZvNDvf?Ad!^6Wv y13_l}XXMJtiVhDCj|>NE0C7{|BO@cjqf@f7{xfl8Wo0GC$0ufGW&LM?c?JN~U|9M9 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044E.lmp new file mode 100644 index 0000000000000000000000000000000000000000..027ddd5d325993ce14c0b8b3c184ee66f6f3e56d GIT binary patch literal 400 zcmWe(;9&rP2nGg*Oa=yqDh39IZUzR1ISdR8YZ(|A_AxLp9A{u)xWd4|@R)&t;R^!; z11lo~gBT+NgE}Jvg9Rf4gC`>cLlh$eLpCD=Llq+fLpvh_0|QSM3iuBah>nkmkB^Uu ziAl`L0t*DjCnhE)#Ycz7!vtbt65~N?U@Bsg5)-3i5) z!^1;Eg9Bj#fuZ4{!NI}7fr(HRfzdHB!NGxn!7*@wtgOK3M6jv<891`C0%EeVg2DPh zocOG)0I*&Z4o_BA07xbVtPNs!Kuk=0WMp_G+%bW{k&%&+;h~{m{U9xY!NI|yq2b{$ TftbkX=;)YegcgW#5b{3&!hm53 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#+0fq}u1fq}t`fq@~Ifq@~0fq@~Ffq@~9fq|i%fq|icfq|iufq`KX z0|Ucs1_lNOmMk#%4`PJGW@UjHLD5h~NF 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 b25303c26..03687cf83 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 2ed0eefe9..219d11faf 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 5af7d0e49..04e6173f7 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 d88996766..0faa55a8c 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 5431f8b5b..0015e69b1 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 2854290c6..676484a30 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 1184dd150..b0789d91e 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 03687cf83..3185267f2 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 9868bc6c3..0d0d0bc03 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 6ea1cb70d..10c46a4a4 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 878c7beea..7c8f207d6 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 7fccd7475..e8a84f353 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 000000000..d6e3e7edf --- /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 000000000..60531b12f --- /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 0faa55a8c..b1ce4812a 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 313abb275..e7634fa5e 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 0015e69b1..f9691146a 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 31dd40f8a..1580916e0 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 3185267f2..12d76adba 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 1580916e0..6628703ab 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 d1e92510b..293ca48d0 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 c7dc2738e..851a7fb4c 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 d4a67339c..7eed56ad7 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 e8a84f353..ab66c792a 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 2957dbdc7..46f6dfbb2 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 d6e3e7edf..1a8e4648a 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 60531b12f..cb437a2a1 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 04e6173f7..5845d47c3 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 4fd756ff5..4c3a3b541 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 be73e3f4d..a6c52d03f 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 db38896b3..73ff9ef9d 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 f89d66550..7c21358c8 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 b841e8d3d..2dc016e9e 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 1a8e4648a..14f7b7983 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 0df017485..6ac2ddc27 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 09cf2a33b..e6e453d36 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 6b3a9bcf4..70eceb727 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 zcmZQzU}RuqP*4zH0D%`w3=Con3=A3!3=9ek3=9qoAbA#$6axbjgaVNu)gTOFGcYuO z5ko@*h{XUR8yXlG4jeeZ&;VjE{AU0mhX4N|6vKZIli~mW{}AoyAXU;^(&7ArF z|IeB8XF`?n|C~Ah=gj~AXU>NR{0DJo{{R1f<_D0#{Qn@;Gv~t;Ky-unKmSi)VBm-H zXM(Kwz`y{aKuZ7roH_IVPZ%F&#sq$lFh~nXe*S+DfBwvwAk+SX$PfG=dqFIalV|>% z&k3>@#{WMPnGceg{}V*coC&gh{{R0!!F-4nATyzSh#Igw=gj{giT^V}dj9{MzzMP) z;yRF*Kk$QOp!}aR=YQY?xf8+%Iq(Amhz|-9usi=VFw6%D{|AL1$ma|UAOoOg&IAYG ze~9g1^%EEv7&yV94|c>)Q1~)H`9EPX1orZLP^5sR85m~HpE(~CVNfnKOrfy_7lbhW zgTMi1P)hj!kAcDd4+Dez2L=ZI4-5?K4;UEO4=^w=A7Ef$Y(QXW8iVMEkx24jwNQP` cATvN_{a|3=|HHsw53&Q48vldr{Qv(y0MWK-Z2$lO 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 zcmZQzU}RuqP*4zH0D%`w3=Con3=A3!3=9ek3=9qoAbA#$6axbjgaVNu)gTOFGcYuO z5ko@*h{XUR8yXlG4jeeZ&;VjE{AU0mhX4N|6vKZIli~mW{}Aoy<^+(y%>VQM|NjZ%{{-up2~zqKOwRwn zz`zgI`g0}-{QtnfFdxDP*)VfH$em!7Gynewn>m5=|IC^5!KQ=F{J{Tz=6sOm|6n`j zf8hTKW`OJfX_(Im)j1zz!2h2}{GT)b|Nl83M1mE9&HOnN$_Lv9@-^5sV9gMBaDr@y z^M6j@1lbPf|Np=V(h1^&95r)3gb#AV&zYbw{J;PW8%UtcXJ7zX0`dYlkmfTm@Pm{= zg6HSV4-5|IeHc7yS?7 z|NQ?GD!}=FCJ6lhKNBJ_|Ns2|KWEOI|NrL%kigIXGynewDS;}O57G_c&;P){zz;SJ zq~YgG5Pv>|{~xU9KLf-3pCI)!=Y#q4KX5`+g2evMoC)TGZ3Ec>GJx~v{Qn>&Q2u;= zkj|eoLC*RA^Z)<(oCrS1jF~?{e2{BEYX1M93APR7VkjT%nxFq+X3pdXc@?JT|Nja6 zAos%gKR3=E772n)|Ih!xzyQ)c z^Z)<-oU>|36qI$U2Y#oIgQ^ z{REl*|NqSSGx@<1Q2zh_KN0--ATxjd2a#acLR<*t{|DI)@->(bGjsm`pZq^(!VClH z{J;-(2FQmXl|LtN&Ifq~!k_=HH;AUU|EBFcWJ%rEj9~89z|05z06r1qq zgDQej|3TmYGbkne|Hr^!|A&D={sRL8{|5#J_6H0M><1Vam=7>8Fg74CG>t(GfKo{E hV6{+v%pfyBX8mAb;QzzGU=Okblp6no?EL@#KLGyTYRLcq 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 zcmZQzU}RuqP*4zH0D%`w3=Con3=A3!3=9ek3=9qoAbA#$6axbjgaVNu)gTOFGcYuO z5ko@*h{XUR8yXlG4jeeZ&;VjE{AU0mhX4N|6vKZIli~mW{}AoyAc3DVL8|}56+omw{P{CKFfedJ`TuAB z|2cC41H()R|L4sA|NqaN&%gjN3S!30nIAYoe2|iv^Z)<<3FiL?TnGiT2K!2c7h z5X%2KffK}nxc2}2|1&4>Blti6|DQR50pxCwJjnL{Ge0o=1bGM?ejuMSFn|q!_~`#n zPyo(^_yDZ_0|NsC)JHQx0-*3^0LKQ{rC=^Z!O!{sf6j;S8UFwL|8wU2|A+_#*)$Ux zTTnGH>OTk^Uj}2F3;ihNdx?2@o1d j9;_Cm2c#Ed2FR=*3=I5#7#Qq9c7Rgje~_L3|NjR7aL;QY diff --git a/src/win32/boing6.ico b/src/win32/boing6.ico deleted file mode 100644 index fa69051d46b98934e7c520a1e71d63cd9db3c587..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmZQzU}RuqP*4zH0D%`w3=Con3=A3!3=9ek3=9qoAbA#$6axbjgaVNu)gTOFGcYuO z5ko@*h{XUR8yXlG4jeeZ&;VjE{AU0mhX4N|6vKZIli~mW{}AoyDr>f6n|5R`LNP@P8&q_5c4fXU+%ffJlMKpA#4uK)OLv z|9}4fKXU>D1K22#5nwYI7{C3p|Nl%dmjR>z90d?*28Q{dpq+^nfgmep zBH|OG4MP40fdkB-l<@x_1B3k^1_t>L3=I4q7#P?eFfgzmU|?WAz`(%RfWXi+2GI{A kk>tT@L3%)XL1uu=`oX}!|A&FW9%Kh7HU0ewBl>ZaN{|V9zk^eb?bN)}T&i@bte)5A< z&Ij8*bN-`tQM+|8Ds{? YtRD;v{C^l2>_K*bQX|;T|Ns930B0Xbc|4fh!NW;wk z|0ggo{Dko5gU$E};s1w<{r@?EA0$8XKUmNF|NkfO&z$)aq#0xf$N>KNAnPIWGynhm z&k1t-%=!O8)clzA%;QZCvbulg6stO zX#NL&B-i|${~zRDh{>Qpng4$R12`!EgMBe`J}4d_20$G6lYxQ%=S+|nAbd~&{sg-a z%>N1E!+kXK|4dN$GC;%g=l`EzE(1it%$YDg!%UEqXU;@KF31Xa^g%Si$p0X4fEg6q z|Nk*C*#BW*kpIBI!2f}Pf&Bpk1N#962Id0{42%s33{7J&6CgB_JXkGMA2Y}dkXb(% W82JA%FxZ3a0ENPTke&bk{|5kgo@%!M diff --git a/src/win32/i_crash.cpp b/src/win32/i_crash.cpp index f74fc8264..4918910ce 100644 --- a/src/win32/i_crash.cpp +++ b/src/win32/i_crash.cpp @@ -66,17 +66,6 @@ // MACROS ------------------------------------------------------------------ -#define REMOTE_HOST "localhost" -#define REMOTE_PORT "80" -#define UPLOAD_URI "/test.php" -#define UPLOAD_BOUNDARY "Von-DnrNbJl0 P9d_BD;cEEsQVWpYMq0pbZ6NUmYHus;yIbFbkgB?.N=YC5O=BGZm+Rab5" -#define DBGHELP_URI "/msredist/dbghelp.dl_" - -#define UPLOAD_AGENT GAMENAME "/" VERSIONSTR " (" GAMESIG ")" - -// Time, in milliseconds, to wait for a send() or recv() to complete. -#define TIMEOUT 60000 - // Maximum number of files that might appear in a crash report. #define MAX_FILES 5 @@ -260,53 +249,6 @@ EXCEPTION_POINTERS CrashPointers; static HRESULT (__stdcall *pEnableThemeDialogTexture) (HWND hwnd, DWORD dwFlags); -static const char PostHeader[] = -"POST " UPLOAD_URI " HTTP/1.1\r\n" -"Host: " REMOTE_HOST "\r\n" -"Connection: Close\r\n" -"User-Agent: " UPLOAD_AGENT "\r\n" -"Expect: 100-continue\r\n" -"Content-Type: multipart/form-data; boundary=\"" UPLOAD_BOUNDARY "\"\r\n" -"Content-Length: %lu\r\n" -"\r\n"; - -static const char MultipartInfoHeader[] = -"\r\n--" UPLOAD_BOUNDARY "\r\n" -"Content-Transfer-Encoding: 7bit\r\n" -"Content-Disposition: form-data; name=\"Info\"\r\n" -"\r\n"; - -static const char MultipartUserSummaryHeader[] = -"\r\n--" UPLOAD_BOUNDARY "\r\n" -"Content-Transfer-Encoding: 8bit\r\n" -"Content-Disposition: form-data; name=\"UserSummary\"\r\n" -"\r\n"; - -static const char MultipartBinaryHeader[] = -"\r\n--" UPLOAD_BOUNDARY "\r\n" -"Content-Transfer-Encoding: binary\r\n" -"Content-Disposition: form-data; name=\"reportfile\"; filename=\"itdidcrash.tar"; - -static const char MultipartHeaderGZip[] = -".gz\"\r\n" -"Content-Type: application/x-tar-gz\r\n" -"\r\n"; - -static const char MultipartHeaderNoGZip[] = -"\"\r\n" -"Content-Type: application/x-tar\r\n" -"\r\n"; - -static const char MultipartFooter[] = -"\r\n--" UPLOAD_BOUNDARY "--\r\n\r\n"; - -static const char DbgHelpRequest[] = -"GET " DBGHELP_URI " HTTP/1.1\r\n" -"Host: " REMOTE_HOST "\r\n" -"Connection: Close\r\n" -"User-Agent: " UPLOAD_AGENT "\r\n" -"\r\n"; - static TarFile TarFiles[MAX_FILES]; static int NumFiles; @@ -1844,33 +1786,6 @@ static LRESULT CALLBACK TransparentStaticProc (HWND hWnd, UINT uMsg, WPARAM wPar } static HMODULE WinHlp32; -static char *UserSummary; - -//========================================================================== -// -// AddDescriptionText -// -// Adds a file with the contents of the specified edit control to a new -// file in the tarball. The control's user data is used to keep track of -// the file handle for the created file, so you can call this more than -// once and it will only open the file the first time. -// -//========================================================================== - -static void AddDescriptionText (HWND edit) -{ - DWORD textlen; - - textlen = (DWORD)SendMessage (edit, WM_GETTEXTLENGTH, 0, 0) + 1; - if (textlen > 1) - { - UserSummary = (char *)HeapAlloc (GetProcessHeap(), 0, textlen); - if (UserSummary != NULL) - { - textlen = (DWORD)SendMessage (edit, WM_GETTEXT, textlen, (LPARAM)UserSummary); - } - } -} //========================================================================== // @@ -1889,46 +1804,49 @@ static INT_PTR CALLBACK OverviewDlgProc (HWND hDlg, UINT message, WPARAM wParam, switch (message) { case WM_INITDIALOG: + { if (pEnableThemeDialogTexture != NULL) { - pEnableThemeDialogTexture (hDlg, ETDT_ENABLETAB); + pEnableThemeDialogTexture(hDlg, ETDT_ENABLETAB); } // Setup the header at the top of the page. - edit = GetDlgItem (hDlg, IDC_CRASHHEADER); - SendMessage (edit, WM_SETTEXT, 0, (LPARAM)GAMENAME" has encountered a problem and needs to close.\n" + edit = GetDlgItem(hDlg, IDC_CRASHHEADER); + SetWindowTextW(edit, WGAMENAME" has encountered a problem and needs to close.\n" "We are sorry for the inconvenience."); - + // Setup a bold version of the standard dialog font and make the header bold. charFormat.cbSize = sizeof(charFormat); - SendMessage (edit, EM_GETCHARFORMAT, SCF_DEFAULT, (LPARAM)&charFormat); + SendMessageW(edit, EM_GETCHARFORMAT, SCF_DEFAULT, (LPARAM)&charFormat); charFormat.dwEffects = CFE_BOLD; - SendMessage (edit, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&charFormat); + SendMessageW(edit, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&charFormat); // Setup the drawing routine for the dying guy's bitmap. - edit = GetDlgItem (hDlg, IDC_DEADGUYVIEWER); - StdStaticProc = (WNDPROC)(LONG_PTR)SetWindowLongPtr (edit, GWLP_WNDPROC, (WLONG_PTR)(LONG_PTR)TransparentStaticProc); + edit = GetDlgItem(hDlg, IDC_DEADGUYVIEWER); + StdStaticProc = (WNDPROC)(LONG_PTR)SetWindowLongPtr(edit, GWLP_WNDPROC, (WLONG_PTR)(LONG_PTR)TransparentStaticProc); // Fill in all the text just below the heading. - edit = GetDlgItem (hDlg, IDC_PLEASETELLUS); - SendMessage (edit, EM_AUTOURLDETECT, TRUE, 0); - SendMessage (edit, WM_SETTEXT, 0, (LPARAM)"Please tell us about this problem.\n" + edit = GetDlgItem(hDlg, IDC_PLEASETELLUS); + SendMessageW(edit, EM_AUTOURLDETECT, TRUE, 0); + SetWindowTextW(edit, L"Please tell us about this problem.\n" "The information will NOT be sent to Microsoft.\n\n" "An error report has been created that you can submit to help improve " GAMENAME ". " "You can either save it to disk and make a report in the bugs forum at " FORUM_URL ", " "or you can send it directly without letting other people know about it."); - SendMessage (edit, EM_SETSEL, 0, 81); - SendMessage (edit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&charFormat); - SendMessage (edit, EM_SETEVENTMASK, 0, ENM_LINK); + SendMessageW(edit, EM_SETSEL, 0, 81); + SendMessageW(edit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&charFormat); + SendMessageW(edit, EM_SETEVENTMASK, 0, ENM_LINK); // Assign a default invalid file handle to the user's edit control. - edit = GetDlgItem (hDlg, IDC_CRASHINFO); - SetWindowLongPtr (edit, GWLP_USERDATA, (LONG_PTR)INVALID_HANDLE_VALUE); + edit = GetDlgItem(hDlg, IDC_CRASHINFO); + SetWindowLongPtrW(edit, GWLP_USERDATA, (LONG_PTR)INVALID_HANDLE_VALUE); // Fill in the summary text at the bottom of the page. - edit = GetDlgItem (hDlg, IDC_CRASHSUMMARY); - SendMessage (edit, WM_SETTEXT, 0, (LPARAM)CrashSummary); + edit = GetDlgItem(hDlg, IDC_CRASHSUMMARY); + auto wsum = WideString(CrashSummary); + SetWindowTextW(edit, wsum.c_str()); return TRUE; + } case WM_NOTIFY: // When the link in the "please tell us" edit control is clicked, open @@ -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 74e019de8..d19f6c40e 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 f3ab51d73..e6a63980c 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 cf41b6f1f..dcb94999f 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 000000000..1794c6c03 --- /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 000000000..1794c6c03 --- /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 b0789d91e..a6b22efda 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 37a54d381..7caf60369 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 de2482d99..a4bf7c738 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 000000000..dc2729df1 --- /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 e7634fa5e..1ab1e7c64 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 a6b22efda..e55885b01 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 000000000..c64dd54ea --- /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 000000000..63cd6ea5a --- /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 7caf60369..8fdf150bd 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 e55885b01..0bf300a18 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 000000000..12daba081 --- /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 8fdf150bd..6a1dc1f70 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 0bf300a18..9005c99db 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 c64dd54ea..b74220c38 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 000000000..d90cb330b --- /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 6a1dc1f70..fc7cb44fb 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 42affa036..7ecb80621 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 fc7cb44fb..9b95876cf 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 9005c99db..007e3ea12 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 000000000..4b7b5b8da --- /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 b74220c38..132507299 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 9b95876cf..4dbcc5317 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 4b7b5b8da..a151f1095 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 4dbcc5317..4e4a5382f 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 a4bf7c738..0702781e9 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 zcmZ?s_cP>R;9z*h@W1;v!~e+)jK3NFGrni|&%k6JZvM}ig~2>L-1)CLb9lY8{y$|d zb7ymXX=xK>b7$p$(#$p{Cg#7TIZe!^r4?HO3Dr!v2^i82_OC@V@U zE9#s4WdFg)Ccw_f&M3gh@9b@EV{XI1V6LxkuJ3HZ@JIQ-Iird4UukA#b7kRw%1qMA zHh-nLm8F%vHKe6Yq?MKR|4K6|OaD{W);Bj%RyI+VR@OI>Hjy?F)-YF=2JubIO_WWf zm8F%KgwcYdz6)>g{4hQq?PqGq(K%c>;IGHGLe=BiG$qnPx-$z z3y81(Pntp6bLS9q8xwtLeRFebWgC5E6B~19 za~pkWeH&|M8-0C61Lc1PT>6R(>;jC!!qN;3-xwGc{$}{s_Lt#*E)zp;?iVCJ3qx)$ z1H%u7->v@{ez!6*GW?zbBIbaIB_LuA6C(q|Z^j=CEDISHGA#THHispbA(sJ*IX@Yg zlwEcIFt8|RX2!byW8hMbhybw|lp`Ykx-v2-|8xDX%qGR4tgNdn^^f7dGK16~hVKmj zmvhdU-q+5+u)MuI^DhH49_s&cW{}b!46N;a)8{N-{+EF{v%DP_#RHOKV1OuP_|L!~ z^+%C~K}y5g{+~ayl!mp@UkxcK4I>Q=DRy=#MI8+dMPXrfMGXxd18ZvrcEvv${~4I1 z*xCO{{Z#zv|5JmVksX453jehJsqs_lk0O&41H)f`W@`;8hQAtoM%Efq?2N)X8b%sY z!UBr_G&mL6t*wnTG;|c%|7b7?OELVG`p@u>;eYBM24>gVQrCYB@>+(esfJn%%34~f zsajf!81!$gABxiK(i$34iW=tZ(o%{VQc{W_zM{0WBD=nh;y)=NX-0i1MQJH^MRt8f z4Mk}keRlnS8eIB{Aik7_qO|lghW{zQ8JJSSp+$m@hLp6FuoOGHqLj3hv@konw6v5o zh?dd-8P3iwC8eRLC=8}G6#ucaXh=&*>HlN@FU6`ar7ytF&crUQ_)khtS{URaX$_DI zr8K0a6{XqrrKF@aq#(4klr+1vzBIcq*d%s=Z|r}hxxrRS8-Z+O|EDM`r6?sO%_uF+ zE(~&l6uX8nyCOTgu#^-?m+)t>6WOJNh1vf}F-fya{bOgA(w9>F$Ic@Sa-AYOyM`h= zyYydnMk#?G>N#PA=3Kte%8go7aiLqc{$ zM2I0nLct#|Mni{RhCd4!6AJzW@EgKp7$7SDL3Dx)C~z?R12x#e@E^l>hQAHJ8U9aV zVEn`Ie+ih}1}0B1F#cosdy9ebFT-C(28Is|OpIE#|2!F;wf=cBIRCR{)Uy4p^`G&# z76ZdC#-9uy8Q49YojpCBJ)M8re$@I25wdmm^t9DtWcX*x3}SuK`oZ{v;UL2|hW~xP z8UD`)TeKcb?uQiee;EGX|Hbg1@jt_VhW`yr3=Iwc82Z;-Twz<+4=trf9``UWo3N-o{^E^C&T}~e++_sU@Jk^GB7ZL z&Hl&mfB%1wap(Ut{y)zRG9GLP10zU~@jt`AhQAE|`~EXB^!;V{H=mh-k%8ggdN#)O z>lya%XZ*Jxq>GJ_;rw}!_x=l^5) zyZ%4p&;5)HjDOGnXJi9=2IL@6K>TNX2RG;+!|(n77?>E(pZ^E)<$Xv@{b#t!@c;a8 zhX40LN#y_g|BMU_55OvaGk#>a0ha?+-G3QC-unZx7-YhFu!G7(~_sMa&nJ zX!;M%ACQcRD*KlK6v6))-ZK23{|6jBkemPtbVM3_!SH)MC~z4VexC=?KN;RL{Gb1e z;s5$y4F5qn4J{@9VE6;dCXD|<5d}{apd5)P2EH@=>H7~#t&FVm!IAK9JwG@i_U~te zWF%15gGKr`hJSs38UD}bVVpmo0TgART+8r#zXVt*s7L^%axexJ2Mmmi2siv^__O{$ zqW~zqG49{b0199*Mx+RsTmCRIgUtSe6j#3){@nk|@CU^>a0*^82zD*VRIq8FRE*6; z28Q3@1P?O%{CP&0c?c`f6o5hqk`ezhfcyXoqd$x+Aa^nRTQ3N<4@7|M16z!+6jHkV z@8f`!Z1d+c{#wt(xPSjY#{c_;!C?f_aQ{9d12~{S;rpKvk#0co4^Es|66$|&Mu(&z zkUAld=NUlm02v9!NC_5He*XuRZVdnDvx16tMsSe?Dwe@%_dK}FVfcTa8C1xE%KiTg z{~5o-OG=Ops4n@<07(fy7#RBgF);NpF#MYj!N1lsF#dvg?>xwlAn$>y2589*(eNLv z0Th%BjDOdIBl*{UW{~o~=LNv3@84%+gr*#Lu>WKHKVK3Y@E`(IK7c%oCE!8v1TG%t zL(&=(!~XrCA_-J*VT(_q4F1pfA5>+bn=KD=14=pu`51(u&PSxI{|tZEgEHO!{l6K| z%D^8Czd_;1IDbC4=tnDT5pMnuu8U!DDaQy-S)dXVgh3$!!k`cVVTM2VLDBn%5ta}k zG4yXfKRAPf>Tr;D+|1tiD*3AF=B)~R+2#^iXaNiHo_UpU=D7AoM zixE_9gS-o~2o$qyAWfj^7hK@{gOrlz`5Dij2Pb!sUXV6WYC}$+Y!E+z6DXwY1J$e` zXMrj}P-zJY15jvzVhvOgfogGxN=T9a4_ftnXZQ;)qp*i4B>gggJqoJJVWsCUhX3%| z9%RBF24+x>!OQ}ndIe-XsE+){z|im;S|swri$sR?>tQ~8$#9Y3*ZuztzmW1bsPzD9 zg1umP2d#{Gz@;dtzy(F)Z)gC6LKtKY2qP-6{|tZj|7YX?Wp!|nB8nYEHOLH#Cs5VF z059i|4fqdg!0qP*7ug_lkZLc484L`+LCVg9T5*t~7n>Y2s00H=&R+(Q4WLFMsE`DC zJkUV88~%;q5_0LnVf-<5s?HybqKgjLurYDT56z{?E3ZK z%!f6`kmEuOTp)p+21+uZ!V84q1sJkgK2)^~pf)w4W&582maqii32Xm;Mw}%UOf@J< z*g!f!B^Idr!0;b?S%vHrHi%QeX$VsG`~^4DK^fsc10)dsGvX?rzCsI(e;_N@gZdnx z#sR2m0A<&I_kS~h0}s?|>;or!v~C7_ZjXp-2cnK%E$nM|G=HJzkQJY4ahCvV8NQYP}PFE zV4zkc%mK)O22uIHkCCwt()VKoEpr!$+yZH~?eC1{YRTH56dHy^jtj0UYfMh4QPy8Fy$-|if4>BA? z>iL4&^PrUXpYc9u#0i@2K%$Viy2l^~N;M$d2MVn|Mo`5FavG>+0^tV;6`;fg!t>{Y zRl(YF4;a3KQ~jU${}}$P2XzM_-6v4<15}88XL!!=Z#^jGKWBK!@M}G&#(c@}f#KhL zP;&y5KmV(?`^U%!7p?L*1%()&=d&D?vQi|%EFNH5u_3#1{%NuC4>Kcpu!3qW8RWkU z3=9mv8<-gS`u;Nh@B2Sr4%B#?KYu+a1u=r-ct5D>098hepo;MKeNdYH&G?VuUjr!Z z^!5E^_&cA25!`@TzaBJ_w;$3d{0Q!oOM+4iD0o1PZBRV~>P$n53s4~l8kqVE9cH@^ z9VBBs&-jahf$;~!J%<1LLGk+@&5c3`H?D`e5j5g;o()t+oYj@E%k; zLOM}@=QA_T2lZW9KpC9j-+m@WP*P@LJkNNZ@h=1OeQ@o=#K^$-l!0OWPX-3Y=itFJ zP-+3Wf(6upgSz7%);bmB-w$A)fQA>D82i9=0ynszgGS>&2GH;#sId9~Zfh_x%m>$t zObn1BLz)3Pr~w)mg$#>=QW~TLWMKeR380}?W=4iS#(xY_pc0D_G={8wOLA42Jh=B1g0|O(5eipF)e+(?36bmX|_A@Xt?ElBWd7hEsJOfxe zs8j-_+JB6oij1M*FN0Da0|R)Rmw|CU2r;Y&6`AWntt5!$j94uP4NZU&Bq(D4Fu;0r z|3C#BcuWRVlm230>|^``En`9B#Gw8I?olDoxa)5QraneS&@e8j{v$>YsI$e?2P)bA z%?H)2kP&J8Hi3q@|1bw`hb7I9bQlz;5Q2qYX1n> z2~9ZYa}}74T!aHb#Smui43ybnRRc&ZxajL6s?msAH-K6`_>D&%3xW(nGBEz#&jYRo zLAf7PZ6JEQ;-HojDF4F~;Cu!KP+1Oc(X9t*#n&MO`2`$Epc;p`p?i=PSX?4%M*PG5 zkf97v%);6Y;2sR#DFR5|;zrI}f9Fd>Dn*ob0VqH~7-?)0HOxT`3gY|*YfXT3!0IAU zoeybQf$Dt7^vX}r%p15A|IY}XXIRg`_z%<&`nR7KC8D5iVt5bkk1_mj00%axB?M}) zfcl4odZ~!u2I-Om$1SMR0AoM77^f}1P30{1Ggsd>w*WH8mMvsH5VZm zG)f1;Age$aWEBV_S@$2*a_Iv#`2K??&gMfWs31dVm<>(HFz{bU9mlwSJxCoZs1eHm zZsmdcZJ;Uu6bGR3GLY9{A*})#Vgb1WS|@@!ETEwx@bE6E^kQTLw?DvP4Qlp)W|}}9 zR~GP)Dz+goM3n(*KoFxITyXa>fV;+^#u=n*jN1lCauz^N&Y(aBRZ-wh0dAeh)x=k5 z7aX^0$RrBOdPK@&TW(N)Mu7^vOO2%bv=r9<$@)p~|sh~5Witmp52 z(4aj7!(XJ)8H@oyM#lHxrX3`4<1f2m=>(rD8r1`kl<p}UQf#KhNc36S*4?6VA0Gb5>WfKOpZ1R`kFE}IqX9N%8g4+IQ_MryRA0pJFXA?p; z;Pw$=ozRgHa4>%(=r+*66sX||nIH%CzF>P}D+10@>L9)h5l#w53cp#u7Qq2fLsD9@Ill1ka`u_ FZ~!MbAB6w_ 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 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4rT@hhA$5${$yZaU`coMb!1@J*w6hZk(Ggg zK_S^A$d`ekN{xY`p@o6r7fAgJ28L1t28LG&3=CE?7#PG0=IjczVPIgm5#STz%E0j7 z+}u1oJlxsY+1uOO#>PfpU*E*UL|Iu`T3VWskx@}mQA0yRSXh{yo!#2ndf~!_t*x!D zuCBVey33a@pEGC9^y$<4`uf`2+w1G=1q1{P3=Bd-LfYEeGBYz{V`Iz9%e%X~rKF^C zb91LmnGz8ZF?sUjB}hB+qP{xapHuRm)EUZxBC10=g*(Ne*OCW`}dze zfBydc`|sbs|NsAg%iReR7#J8BOM?7@862M7NCR<_yxm>g6ZW30W?*38EbxddW?BKNtopRBW6D0hG_Lvxk<3U0OFKZjS%ezxQAdVza; z7RGbbcdm`%*g7<0>f?*b~AE{d`G;EM> zu{-#PBf2R$!RxQ{cFui=TB;geR;maHN`DYpd8>h8M$WA-6Q}un`B(e>tjzA6%eP&) z9jq*t$y3s;#>cd@tfdS zJd`_N-kR5ClIiEa`((e{mEzHP6+0b$PY9 z#S0~#U}23J_hf#*Rq5k;qnjmpPmKE)gAtokmEc6{b^Dr{63rG(`SwR9|8$+5eA;I> zDJ%J3iG~--5>JLj@SQ<_B&pjb@1~3|Bp3I z8CJ`;%~UzwwIM3&fWhnM#v;GI+umDg>YXF;mC^LU+uij-4&wd*moEnHsdxGIk!uBGg#9*|FWYwIEuy0;!!tmkf zuS8GV4?j6gD`uQe8sr{G(eW^^r)YxJ%?NlV=~4?muF_zkR|}pDl6ff*EHfwd_Cf*u6z%k&oacMxEI< zYp-kGalO(xS@Q0^CUK>Y!tTy{?k`(@C1if@ygb##&(3q5S*;5I+gso)GGF3dTO5D=;nIcTCU#R| zzI1+aQtW7%Z)7JVrM&KXPjtde%hpe#?i&ll`GwZ2dWcS3`7c8K@4+aQ4f{MEls4@1 zwea83nlODOYh&@5iIWOlQd2nZ<^Fp7M<(&WHR}%@?IPluDzyx2_=8+`>fD*|Zl_qX zR72#U%11hv4)1Mo4q;N`=I_azW*V3H{!7Dq#_85CG8m2@+_y2wbaM9xo%z+q?Efb= ztz@mY4RW~m;Yhxc?UW+Hykkv=_qyyjQSewlUeEW`fzMS(R396+6<@EOxl@?+V^_7I z+>ttuiQ0Qr{JtKz^|<2f=bdMsE#nsIn^`Q-{krDg^e^XhCX`IFY&#Y`=Ye9y9cIQ* zgSRD)HL1_$urGS?wc|#736GKI!RLG|D5ngmiFt#6^z-! z;_hk~z7w6kh`q_@{=tBG>n1GaZz~U$jnh5xCEs<&0s)EZj)j_44RNmGEQ*)e4_%Qn z=zX|DihbwL3B2Kpn69%v(`{{2-#q^;OZ)dVD#tgsI;Z-G?T~xT+@C-1zvY#ejM|=W zI4|mJwxt$a^|ES@n{&|FRepx*dSUzau&)d|N=$bjJoYaoOzW>XfW6iQnGpOz=`yM-nt^ZvO zTWae3&+qxu?`U@l?mYIdp-V2}>5V=!hZ8?;^eeD6zK}Fy zeiYsyVC2qt{^Qd42K%C#PjyXa);-^2cC-11xU23C_I&n^*%J!iziEvA$Z^ZcF6A4; z;~O`bn@Sk#WKxpYEvyfg?)}AkRKB2GUD&q4;+xq`W<$@jat#lr{a>1BP^AB=DAuku zscN;YfQxR2EkkLwf?e7})>lVj3J!k#>X^wd@oM{R=6gj32QN-v#pqag?B%p4rzbxB zf3zfctH_^SiiNlAJIWuhFn)Sst##e(e`&r_TFhQH?zY|C}1e|u*3m4o}L7EC+!?SI2|c1?x1iigzJChSzK;$Cot zS$el^PteVM3-$g^j-GJ+e`)Q;q{R#$`F^l03ilCTqh;N(ZTAe*Q}s!+g)Tk4)3|4M zg5G|M|IEjla&%fU+*#t7S~jW$m_NFga+~qqa^AFuOB84Ew9JT`CY_}r@>JGJ{BCI3 zFSDAsFm}!9Z{@{~%G!v(<6JgTjw94|LiR-Wr4!{=nAd)PonuwE_*Ijro70!4OWEF7 z)lHbjHhuAD+jC2&yLbrKKKvhU9nY)sOVv=dL08K8@>Ls^2Y*@KeDPlNoq5*24-S6s z>|-Mvbft=lUb>~^Ic|H+dSci59c5Rq2h9k9B_U}(`Yo03-@LFM+v8eQAQMR@T@jrk6 zbuO1?Ww!1&Sx`Nfh`I6L6^9K*qVw&*M`5rqB5yjyry2_%#$>GBn>+*WvPmZT~ubp8pf( zf9uqU58c0T6(@h$CZU9*bMCb0?DpT~CuV!XCGSJ(jwYMa`xHN%T9DDOi~DN6gVF{c zo3y0oO~yhFZ)=`y@_(>A=PLX5MH+5qQ)L}IxLPLq*Q+FdivG#G{d~fczwu{uFMShy zz;|kDT^z%2=^rvdB|L6@+3X!VufBibeKU2xb+vr&{~XrJDMDK62n z=hf}R{q{RDPFVe4ILmu$!`T@tvrPiHLvCoj3r%9V{vp>SNIdFHs_DO?C+-4&PVZ{? z{?n1?&zD0ct;ah)B{V*oRju^2Tz2a5*Osoak`jNW9+!){d1U>^GChayqUM%Td-qTH z%>HcW{D5W8|5g|=U#p8Yxa}@6-~5wi_MLOQZ;s|4|IK;R?odbnH(~F0=Xl>7{(57= zXQ3apErR#o=%?h>9o(x|s3_G}{&AxH!Y5Ca3XZcjrCVma_%6J<=86A`-{Nx?uRoGI zFX8d8`rv(=?liGnW&3TI=e$f@sP3+%qOC*3>GTTyKKX1rOML~ozrN2|Zr(YcTBwjx z%~teJ;mV=Ao1D)Ho{Utw`@Z-&i+OSRnuv3XxqF-DdKa8-XL5c0Rw} zmkIB+-(6up_9HXCIzjmF`ZtYd`wsoTCMQw&wfreJ(=DMJHS-cS+deoo^-;0(xpUla zpB;Gp`)--Tw)_J>U)!vG^Zn`eGLWMe+=+y8fgHHY81bAM$L z_)ld0QmAf-R7-ze$G4HaX|9mP1v!m>{EF7!A3wSK&EcW`onUzzn;(DvGjn{bp^b-97#J8BJYD@<);T3K0RX}=BMbll literal 0 HcmV?d00001 diff --git a/wadsrc/static/fonts/consolefont/0400.png b/wadsrc/static/fonts/consolefont/0400.png new file mode 100644 index 0000000000000000000000000000000000000000..d3f3786eed6c88af93f7068731763ed5a9932be5 GIT binary patch literal 2073 zcmeAS@N?(olHy`uVBq!ia0y~yU}#`qU@+idW?*1=r`6QMz`($g?&#~tz_78O`%fY( z0|SFXvPY0F14ES>14Ba#1H&(no)-)Zr3MTPuM!v-tY$DUh!@P+6==i2z|0Wf6XMFi zz`)4J*w@$B-`_uf{`~dp*YDrI|NQy$_wV0-|NcG0C>RZaVI2Z$w_D{I7#JB!g8YL2 zk8HpY{GDBufq{Xuz$3Dlfr0N32s4Umc!5eCi4xa{lHmNblJdl&REC1Y%)Ao4ywnl} z6Foyc(-ilJAO;5JU{4pvkO=p;(;pVyHsEP~tm1q5dwl}$4~L+Aum8QfwL8+7Q>Z27 zsHW)qZFLnf(mTuwav$7kFfZ7D|1l?*+WI2#nwz0oOHy*|t}z{2*v5BnZ{zdN6?WHu z{jjjPHmO)|)}B*yt+!^+J*++};mgc+3Ez^~$)~F}Nt;jOG%ZmM;GXeWKV;>a;wn1B80s`%i|cdtEv zUU;JC{uyVFh@HWLQ-Zn|7{+9EUJPDUleO)3)&71X-r7UGcP4!K`|iY+f4Q}H+@38w zy^GB{`RatQHM}nZxBcXte^L6!uOKyZ*7z%vq@I|Ct^MS2USn~{M|}(SOMOzJ3<Uk})t^^kh)=u}59nXsS0&?#JUf^A~_|VMXw^O)oncewfxsJ7A#bp+?;7q@1#SM@vL-gw<)GQa zd}fnf!l5rizh=&7dKugP%ydrBcVPjenc5Py&#vCF@aOkCd(84cf9cnkoHrRXYvo1e z%9mgID|g| 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 zcmeAS@N?(olHy`uVBq!ia0y~yU}#`qU~u4IW?*1=%F*x3z`($g?&#~tz_78O`%fY( z0|SFXvPY0F14ES>14Ba#1H&(no)-)Zr3MTPuM!v-tY$DUh!@P+6==i2z|0Wf6XMFi zz`)4J$i&3d(9qD|-#>r;{PpYC@87@w{Q2|u@84$_1*0J_tV6)@MqCX810zF8kYDis zkqsDvzq6|{FfecyctjR6FbJ;&VMZAVUoQp*28j~ah?3y^w370~qEv>0#LT=By}Z;C z1rt3(J<}BTh#&?ARy$7@$B+!?wKIF0R$1}1Je0c|d;fpqPUFe*%@{-OoV``&8SLe% zUSM;2+u!Eg4G+HY*BkHtxh2Jq``(sc4m#hBmaa@zq zv0<&a;@fk)cixwG--)W(zuv5&aMA|OeL2VeKg{p@Tcf%mgebj@yL2%1_s__1lL>D7dbU2u zx7eCmZF4Q-^^@&C9)3(tcBt`U3_sNQo}uYFuRGhr4?%T4?US`$T;o2xPOoLpDyz%C zYV5TlLU#u|^?iQp_L*hLDm*9CO8>3%nZo;0dBQno)t7$+Wz%C6_&r^u3*+Da>Hm>+ zOKIZk)E2YMh5zF(Pq$h6$|3*OEqTES-_D<~Qm|EXUVoiqdBKy`%)f5Gg+A>$dG~`pDdJ(<48??&j%kXn<<(meHONXL%(Gq09ett-17c4eYzW`6I?2mAVb zw(YsJ^7ry1l^+f~;FdPEx*4gXx4wjHl^IXiVJWZ9L#+}nvK8xsO=i7n5p4H6^Uql? zb~^i%8SHO&Ds;52`9I;e)rAf>-T6Y?k@c-2t3NN`TVwIo<@{Wu-`rbxJ0?BU=Kd*n zqQY!??I+#GY+XKIasuQ9vJ?~6J-hse_g+u!BtD+`z6alNIb3bnA^*XJB9y?pPq_y?3R49Ki@Q1arvyFSwdCIP6yr>Z|m~;W*wb7 z(SG*wr}IqeIGv|I4ER-@VDQy>a&aoZfJUXuntAn-)C|>^0#fl9U>>I8vaUkL zoc+RLu}oij%+wMTB&zy$1o8PP91l!-6VliFzD|C_^y`dyGi~#K2rvFxI8ogoPu=kO zrt22_m_w&Coo>u()NqW?*s$-O*GF@VRdFsM1Ei4t%I$Prr0%C z-{#ya_4M441)>d)fA6=EHMy-uUc5e~2d%EbomQx(3a!{{f-Jytw%8!&Aq?~6QH#;3B zreyN$W8r`PWnp(M*Ql>*sVbC84|=?mZ_DkUbqD(A&tqnhU%K=1YsS}{uN_{9EUs{T zde3Ctl_NP;4xblC#u_{?^>LR!xYO@y$ILekhW1G{OWds9AK4aFDQA&YbM{E%3*MI; zC*S^^A#HKt*_|H+=b!&p;M)>6<#A!l`(ti3oWA|bT@GhY;QTgsmfZg}AL{vRx?eu9 wSlM6}Z2n4R*7Dv@d@By;F4C~+e3^6m|MuU1vhvmH7J%woPgg&ebxsLQ0BNA!3jhEB literal 0 HcmV?d00001 From 44c8c2a79cccdd1d7b929b15fb40365153960fa3 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers 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 a151f1095..a777cdef0 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 0702781e9..18ca18978 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 zcmd;Q;9&p(7X}6f9|i`7SOx}$d|tPFIKjZcaD#z? z;UxnD!!HH~25v?M1{p>M22SQI5ctmkq1jopva(`gva-Me(OFq+Y*|@}(cv(Wz^p75 z4v>=Yz`$sbDxR#Yz^tsqnDEfx#4L~iS5{VhR#Hr4B!ml6oD~xp4U%JI&&rC92Z?9> z2eBh#Kx(u8GjeBT1tw-?C4pQ5GJ^-iNQ#e-k55cYf(k@ug-1q4Mn^{{LInb|qN8JC Vq9eoO;Q}d%@rg)UK&HU(e*pccUo!vz 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 new file mode 100644 index 0000000000000000000000000000000000000000..b3cff0d2e82676ec9eb09a401387b5075b6f2de1 GIT binary patch literal 353 zcmWe+;9&p(9|i`7Xa)v`ECvRKDh39IE(QjM*$fN}YZw?9_A)RqoMT{MxX-}A@PUDW zfsv7cL5PuoL79<(!I+VO!I_bPA&8NIfq^*-1Xv-|e+I6stmv$)ti+g@tgNj64BS~+ zfmum`p`oFHNpOBZaCmrdU^Ix&la&>p6&@ZF6B!&B4;9GD3Qx+)$_ft$2{5u`Wd+1! zWpP01|0n_=Gr$5#P!(`3P=Vl-tSpF@M2L#eM7S-HDOp)rkuhL*@qnBi9UUK^7@r6h o06RP;CMGc{F$Saq%ufoBj894g842=dJjkDkiC}+1yblWn05LXf0ssI2 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 new file mode 100644 index 0000000000000000000000000000000000000000..ce8fc1b10317b6c9eee4a2694398c756773b5ddb GIT binary patch literal 296 zcmWe&;9&p(4+aK?PzDBu6b1%{5(Wl_76t}}sSFGZ%NQ6K)-y0L>|kJEILN@jaEgI} z;Wh&U!y5($hCd7p3_Oes4AP7Y3=AAuaPXgjD=RBHD?TYDB`GT_>puf`R#sqEbP@=p zA@LIv6BA=Ve4ebV_^jx}#Q2!Vm=vf0)U?pR#H_6U94uK`0Wd~j5>zA 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 2716d1eb1..6f33c718e 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 05d818f14..bc8f54ada 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 d389dc530..861b506a8 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 677b99160..0e70deb1a 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 66b4b84f1..d86618ebe 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 826f44181..97645273d 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 bb6ae9886..f9cd2f6f4 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 769076d4d..4f27a6969 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 1afc68e43..679735c12 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 11416367c..97201a582 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 dddfe2d46..2842587b4 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 7c8f207d6..98ff00203 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 5845d47c3..fa56229ad 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 c752be66d..1849d471c 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 4b12820f0..6f0603781 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 12d5db1b5..c75fc166d 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 fbbd2e166..cf4fa1270 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 7edde60c4..0903299ab 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 c3dad0c76..972a47b0c 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 36290df47..ce0a73725 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 d86618ebe..8d30c0538 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 6f0603781..3ff4828b1 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 7e0db353f..75efc56e4 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 1ab1e7c64..c18d8bd13 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 1b3131f83..b4ecdeb9c 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 a777cdef0..b8725eae6 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 a01f5325a..7f68ebae7 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 c18d8bd13..e0bc0d639 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 e6e453d36..c0f125b46 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 a8f77268c..df955bb78 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 70eceb727..8648daf2d 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 2f372968c..7bc799797 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 73ff9ef9d..a7cbdb517 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 2bec17803..bf61ce282 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 a7cbdb517..328c7aa94 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 31e241418..762a0f015 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 8d30c0538..991849e56 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 efcfe74da..2c639d3c9 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 4f27a6969..77f45d1cf 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 98b8197bc..c26d36765 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 7ecb80621..8005be330 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 6689f771b..19cb91557 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 83f4f66da..0ac367d1f 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 2b6301653..fbfa21e9f 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 98ff00203..3e9b6be0d 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 cf4fa1270..c6d0eea82 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 05ac7adf5..9027065e8 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 95bd5ab4c..b3541b91a 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 6df82ab82..80d5623f1 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 f24b139fc..874306c93 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 a6c52d03f..c65dfb9bf 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 59bff9f61..99050e1c9 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 0903299ab..0e4d243dc 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 f4def3569..63af00965 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 000000000..4639aca99 --- /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 c6d0eea82..1c525409a 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 75ae54222..c3187eb8b 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 d43087eeb..496d452f3 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 4639aca99..5e629dc97 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 1c525409a..72d337716 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 c3187eb8b..d46e1681f 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 496d452f3..1facbc50f 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 874306c93..7ec552871 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 c26d36765..5562fe690 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 8005be330..e2e2492f0 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 5562fe690..88de868d4 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 fbfa21e9f..80f47417a 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 7ec552871..a16e42cc8 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 99050e1c9..28a0a7b47 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 0e4d243dc..1fb36558c 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 63af00965..56846b8ed 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 88de868d4..3d841eeb5 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 e2e2492f0..442f3b489 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 28a0a7b47..b1c8e6992 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 1fb36558c..4a4d69e64 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 56846b8ed..eb469e285 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 97645273d..fc84aa0d4 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 7f68ebae7..8d7fb2470 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 435b38ed6..4f776a1dc 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 cbe7f1047..c536611ae 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 762a0f015..c6ee1dddc 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 679735c12..d57361eac 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 3d841eeb5..ebcb35498 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 e20553673..8a2335fa7 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 02201a0dd..dccfc6566 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 10bd91140..659830827 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 c60b84694..32ec955ac 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 4a4d69e64..38d71e8ef 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 7393877b6..fb82cb36b 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 8807fb19c..ec9bdcb67 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 eb469e285..e1bcd0b62 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 38d71e8ef..5fddf02c0 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 a16e42cc8..759a0466f 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 72d337716..f2c1c50e2 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 zcmd;Q5MW?nU}11!U|{fJU|jMU|=X>{(e^iP7O8HajPX9TOfH z7@d{%pN%UkD={WKJTy2lD=X_i14Jt;XI55HOk{W@M35ybD?BzUijMU|=Xj*m}FOo9rA$7W>( yhet+6Mn*@2%>K^+aW4xG$c@o4(J|4H;UH64xwEoT65|s=2&5V0R*2ys@;?CLUS8Ay 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 zcmd;Q5MW?nU}11!U|{fJU|jMU|=XjMU|=XkzS8IzQm6%!c^<}>hQ zX2yhPW<|$?xLH~MK?31HnOTuBSy`d+AOV5Q%2!Zs2Tn{lGME(Z=!G2^- 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 zcmd;Q;Adc9U}kV(U|{fJU|jMU|=X{(e^iP7O8HXA319TOfH z7@d{%pOFcql$9$hD={WKJTy2lD=X_i18-JVWO7zkQcPrcBt(QeD=RE9D=Q{48qN=j z&x(!*@j%9KfsBca$;t|i&&vAG%#)QBn3$CnngkLC$@762fl2Z4(ed$#iAf+!_`#M0 yhet+6Mn*@2%>B>654I*TIyxpgCOR@4WEMy)C_XDIB{4n`gg|-`t_B$k!T$jmYGlv= literal 301 zcmd;Q;9&p(7X}6f9|i`7SOx}$d|tPFIKjZcaD#z? z;UxnD!!HH~25v?M1{p>M22SQI5ctmkq1jopva(`gva-Me(OFq+Y*|@}(cv(Wz^p75 z4v>=Yz`$sbDxR#Yz^tsqnDEfx#4L~iS5{VhR#Hr4B!ml6oD~xp4U%JI&&rC92Z?9> z2eBh#Kx(u8GjeBT1tw-?C4pQ5GJ^-iNQ#e-k55cYf(k@ug-1q4Mn^{{LInb|qN8JC Vq9eoO;Q}d%@rg)UK&HU(e*pccUo!vz diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C5.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C5.lmp new file mode 100644 index 0000000000000000000000000000000000000000..0dbe640a80f45642c79f41995747d142f7cf9a2d GIT binary patch literal 323 zcmd;Q5Mp3pU}JD$U|{fJU|jMU|=Xs)W@Uv&$7N*&het+6Mn*@2Ec*|&o{b0O_UM@CnCQrGkn!x?Sy?HG R@rfV=(hc$h#C#C>9{?{sW^@1m 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 zcmWe*;9&rP1O^6%3ek1hHen0|TS8vi>u1Wo0GCgolR)CuU`3{b%IN%1Vlf z43C8H*t4=?BBQ}<29B((=y(t_E9*aq6B(106&erX@ML8LCT3-YCV^~)2_(hGN5{t} zCMH1zg2N*tBO{}uL8kp@;K|AgjgF3qj){&8hnW!?6CWR$7#|-46973PJTWUP7$y*$ zl$8~ll9d$*7l2v|vL0e+3YrSAa*!E`Fn7d5^oPO(Vv@45;*+wn;0}ZM0z&==0QaYe A-T(jq literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C7.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C7.lmp new file mode 100644 index 0000000000000000000000000000000000000000..ed06351c51938b51c31a6b27cdc86f2ca47dbd5b GIT binary patch literal 343 zcmd;M5MlrU2L=WPPX-2tFa`#O90mr4W(Ed^xeN>p+Zh-b&M`1BJY`^D_|3q;Ai&7L zpu)(&V9LnA;Ksr zF)1l2D~p#UD=R4>E9*Z4PgYh^N=ix!h)B=M;$_Xsiik@F$?#@n#iXQxbjKtmC1z#u zv1DZhf@N4hGFe$1Tv=J6Nr^Eq4J=t%ktq=2z?j6Om^g?zAZ;;OSsa{T)p2o2aUjz{ zqKR2q92{9$fr(iOs7l$hvVs#qHfQ~304a>m%HjagiBO%9Ae|uV;-LZ{wICHB`ab|j CT4}TZ literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C8.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C8.lmp new file mode 100644 index 0000000000000000000000000000000000000000..1d9b9fd6a131ac48b1976a631ecfccce2dd5b8f3 GIT binary patch literal 307 zcmd;M5MW?nU}11zU|{fMU|jPU|=X=U|?uvU|^Wbz`(GHfq~&T0|Uct1_p+A z3=9kmj0_Bdj0_A)j0_AMELmXipN%6cD=RTRJ~1mR>pv@3R#r-UWMpJ`bPALk9UdMY z86Fs)mGz&6Co3yHGCVvyJTy2sF)Qmo12fnRka%che0(?v$AH8Iva-Tsv$7%+v$Dby zv$BFgx)}trvVtOGvx1YdvO-g`vcN_%@@Hj*M`nRc3r)((3Iv(T#Fv#74pstJ#>|@q j)dVsPqzGgu$XJjmp)i4%q^zv?q^zuHm;l&$P~txToL^!) literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C9.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C9.lmp new file mode 100644 index 0000000000000000000000000000000000000000..798544f375aa14994799f70d7e6456949fa88484 GIT binary patch literal 307 zcmd;M5MW?nU}11zU|{fMU|jPU|=X=U|?uvU|^Wez`(GIfq`Kk0|Ucl1_p)~ z3=9kmj0_Bdj0_A)j0_AMELmXipN%6cD=RTRJ~1mR>pv@3R#r-UWMpJ`bPALk9UdMY z86Fs)mGz&6Co3yHGCVvyJTy2sF)QmoGjCQ_R%m2=d^iZlWM%zl;>*ek&x%aU$_h`+ z$_fVQV&u=t3XjYRPRhy(P07jvo5UcHl@$~jn*}l@G$|`95M&xiFgzBb3Zar2>`ai= jU@?%XAjKd7kntenLSX_iNm*I(Nm*IZFafY$DDfWvu}oqX 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 zcmd;M5MW?nU}11zU|{fMU|jPU|=X=U|?utU|^WZz`(GUfq~%=0|Uc#1_p-L z3=9na7#J7?7#SE885tNjShB$2KO09@R#swsd}3Bs)_+#6tgMvy$jHd>=oBb7Iy^i) zGCVLoE9*ZqZ&p@Td}Mfdcz9@VaAH>0ep`p?LpnHd_L6`7co z6`q)t6%5kIAds0E9-NsKoRpOnnv#_THVq^g8lIU2GAJ}DD=QFWAV_yiI9L%}A;^*# qunjPU|^_XU|{HDU|?9pz`(GLfq~&90|Ub?1_p+= z3=9m6j0_B-j0_B#j0_CyELmXipOqskD=RTRJ~1mR>pu%uR#r-UWMpJ`bV^p%e?}&d z8jxUgczAeZcwl^1)_(^6tgOi7toX?A@bK`^;NV24SXg3KXk>hRI0(l;#e(9qA``Q+ z!V|Nyf(z1|$!{U^P%H!F-TWAY~x2 iutc!2AT^;dv7q>@n53+%_@u0?Xpk7hIFPk4{2u@_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 zcmZQ)5MW?nU|~>UU|`T;U|?`$U|DN0I=2We#CK^P5U{RaS}bTS(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 zcmZQ)5MW?nU|~>UU|=w1U|?`(U|@)1U|`5&U|?uwU|^U5lI6)l0sonKv$C?H<749E z<6~lC60@@YGx23*g=YoFCnhE)#Ycz7XJ!3o-Xf$D-Jf^`C(mEbt!yykjy! 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 zcmd;L5M*FrU}Z31U|=w3U|_IkU|2tpCi+Sy`c3S^t^%v$8^?K|*l+pHUzyD?B(MD>^pz2FR#tdW zbXHbyd}3l^QhaoHJWMngBpMTw7$2V$4^|5@AT&HND<%n~G$}D2WB|yfm~gl)AO_eK LF#R$He~&WItKuxi9Ra; 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 zcmWe+;9&p(9|i`75C#T@7zPH0Tm}Y)ItB)Yeg+1H1q=)f8yOfF4lyt=Tw`Ehc*DTJ z@Rxysfsc`aL7tI;L64Dv!IqJM!HbcBfrU8>1pb5Qh^(yt3_Mv`8Ch9b(IC+*s6b3o zR#tdcOiWB7R3I=hD=RcBIx;#QCJ>*M6`U0v8ICLvniU@t8iS-FJS!_J5G=r+l@$;J zwuOTQ!u-zwWw0`4Wo4m=2F61KLScr7M#h7j7Yes6F)}mCuL>*XX41p%1VllPXc+4g#~0zR@Q$2c}-~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 zcmWe&;Adc9U}o@OU|jRU|^_VU|{HEU|^Wdz`(GMfq~%=0|Ub~1_p-L3=9na z7#J7?85tN<85tNX85tP77#SF%7#SE?xw4SJe-`enteE)t#KgqJq@=8@|I9pDSplJu z;gOM%;o-Sy?eLSuv53(b18Cfq@{mG4O+xu)shh%mbky*9QlK6)}Un N91{-)U@xPF2mqo2Zh`;+ 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 zcmWe+5MW?nU}5lKU|jMU|=X@U|?uqU|^WRz`(GUfq~%=0|Ub~1_p+g3=9mv z85kIN7#SF385tP#7#SFB85tOS7#SEM85tNjShB$2KO09@R#sw6OiWf*)_+#6tgNKK z(9qD(z$7R)AUHfcG&nFiE9*Z4Ggu1?PgYiZcz8@qOk{9iJV;z1D=R!UD=RoW38WxA z94yF@l@$~jn-vg~mBqu71*ZQqvS($5M}pa4F_5WDY*|_1Spi8Hf9 ztp6+^6A~dxLK8s(JXu+xktrbiB4a>q1-mLbIzB!=F+LF_0P;&rOiW@@Qeq6$FG=B% U@kvREAOj)ZPE1S$c^e)W01f_aF#rGn 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 zcmWe+5MW?nU}5lKU|jMU|=X@U|?uqU|^WYz`(GGfq`K&0|UcR1_p*33=9l! z7#J8B85tPF7#SG!7#SFB85tOS7#SEM85tNjShB$2KO09@R#sw6OiWf*)_+#6tgNKK z(9qD(z$7R)AUHfcG&nFiE9*ZCPgYiZcz8@qOk{9iJX9b!JPBk_csN*qB`Yf+CM$~v zO8;kO%|a3Z8N$Stl@*>9kOWl((#6Q0l@%Td7Yk0w%KFd1k(Ct`8JiW52vHcC2oe;? z$_kIo$_kB40ofTD19Bt-Gl-o9c3gCHe0+Rjd?H93M3n8c){#2BbwlENe7ladla P=0m)ln3xFiHasu@yh&`$ 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 zcmWe+5M*FrU}f-OU|jMU|=X@U|?uqU|^WUz`(GSfq`Ks0|Uc31_p*F3=9lE z85kIN85tN97#SFh7#SEG85tM?7#SF185tNjS+c<3KRZWOR#sw6OiWf*)_*pxtgNKK z(9qD(z$7R)AUHfcG&nFiE9*ZCZ&p@Te0X?FOiW~OV0>2Ae`da{tkA6B@Fb8~;o%@5 zCibkX(CDmyn5-;bmMk#+pOGUgD?B&>%mE96Ok?28$_ft(&B_W$f+_`R2Pq8=PlO8w zr(|XQ2bmcYo)wS?Q5c#CwK^s%G%^Kbbz}_4xe)h7N5{vxqepAg{v%1OOKaZ!iD= 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 zcmWe+5MW?nU}5lKU|jMU|=X@U|?uqU|^Wcz`(Gafq`KU0|UcF1_p*_3=9mv z7#JA%7#SFp85tO?85tP77#SEM85tPT7#SEiShB$2KO09@R#sw6OiWf*)_+#6tgNKK z(9qD(z$7R)AUHfcG&nFiE9*ZKA4p4lcz8@qOk{9id{)+fM*ggv`COj)EASNq|hXq3a2MLA;K{#MRkbw}v@T`C&s7jD_M)s_%pcuGVa0jMU|=X@U|?utU|^WVz`(GMfq~%=0|UcV1_p*_3=9lE z85kIN85tN985tN%85tP77#SEM85tPT7#SGYS+c<3KPyL8R#sw6OiWf*)_)eRtgNKK z(9qD(z@)6K|BOr^H6X!&;PCL!;K1mttp5!BSy_?ES@GfFF)=Zb!GZBmv9QFf;P51n zhVXE(7<*P$P<&QEOjZ^*OBR^^&&URnhYNv>V+P43LDhitLDfKof>S`ovxBV+NQ5X0 zO$3SYXJv&YW`#zkfQ*cc0l63Cw4nH`_~_{P`1r*5M35N54>2(@iAhO`F))9IN5&^5 SC4$U{gh66rA}9>tAp-!(sBygj literal 353 zcmWe+;9&p(9|i`7Xa)v`ECvRKDh39IE(QjM*$fN}YZw?9_A)RqoMT{MxX-}A@PUDW zfsv7cL5PuoL79<(!I+VO!I_bPA&8NIfq^*-1Xv-|e+I6stmv$)ti+g@tgNj64BS~+ zfmum`p`oFHNpOBZaCmrdU^Ix&la&>p6&@ZF6B!&B4;9GD3Qx+)$_ft$2{5u`Wd+1! zWpP01|0n_=Gr$5#P!(`3P=Vl-tSpF@M2L#eM7S-HDOp)rkuhL*@qnBi9UUK^7@r6h o06RP;CMGc{F$Saq%ufoBj894g842=dJjkDkiC}+1yblWn05LXf0ssI2 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D8.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D8.lmp new file mode 100644 index 0000000000000000000000000000000000000000..cd90d1827288438ace8eaeb0fae3e96a9861a739 GIT binary patch literal 355 zcmWe+;A3E5U}W%NU|jPU|=X?U|?uxU|^WZz`(GIfq`Kk0|Uc(1_p))3=9k( z85kH?85tPF7#SEe7#SEW85tP77#SF%7#SE?S+c<3KQnh$R#sw6ObnQt^`D6+D=R55 zG&D3cFexB93nCB@93CDT92gxLo|W~VkvA(VK0G`oCMGgCFg_L}!jqL19G;Ywl@%Ty z9uE>=$;t|d$;x75&&mpqO$0IjGx9*h!s8Ru!3Ki`lCr|n)6%m7z`8&xlEPyX)3dUI zQ$WVBXJrK>#wMm_WpT1(WrZe!#CWo@LL*aBv$C=xW0JD6{xk4qWrfE_N5{vBZf`VdVViJ>*5@SG0c(SrWVw1unD>< 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 zcmWe&5MW?nU}5lJU|jLU|=X=U|?urU|^WTz`(GPfq~&L0|Ubq1_p*F3=9mP zL8=)U7(^Kv7*rV<7)%)%7+e?`7+5&6;NU+CS5{VZVp38{N>Wx<)_)f6tgOH!2uMTX zCnhE)#$;vvXJ7_vW#P%nicd;ROpK3-j7b5B3uI-5$AaZRL}*|lNRTxvD=0EHD~pFE zD=Ppb!pM@96&?u@2u#Y#`p?9il@$)*hl1>5W&&vksSgDi3$h0!kd>8{7!wb24^LKB zOk#X|Qc_ZUG*|_9R#s?ybWCDWVoW4R0muX4(J>&Wf#tcfvLYj+W8&i>{zLXV0Adnp A(f|Me literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DA.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DA.lmp new file mode 100644 index 0000000000000000000000000000000000000000..2e1e45bf51f84ff515240b7988653be79537e1f8 GIT binary patch literal 337 zcmWe&5MW?nU}5lJU|jLU|=X=U|?urU|^Waz`(GKfq`Kw0|UcR1_p*}3=9k} z7#JA-GB7ZRGBPlzGBPljGBPl@FfuT(aAd*3e-^H+tmwp~q?DATtgNj6EZkXHfk_aM zhQv=yOiYXc@p-bc;*$~+6XRndV^W|3P}4#K6SK1ZGc$p>JSS(Ru+gK zn3R?EpOGaiD?Ab+5DKz^fi){DC^8l*0y2_8AS)|87Gw$-C&t8QW&LMh26I?=va(_l ykjLU|=X=U|?uvU|^WRz`(GEfq`Kk0|UcF1_p*F3=9n4 z7#JA17#SF385tP#7#SGs7#SFR85tN@IkMp3KPy*OR&-)gQc6lvR#w)3R_?5Fl$e+p9}^jql9lzJi9ahVG#X}PXkcPi)_+FU ztgP_hgsd!HmaMD*kO%`?R#tcrNEt{dFexkRKUgRjCKL*?52PqItJuUkOGiLBO{|@;^QG6MGgc2 Du1sy* 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 zcmWe&;Adc9U}o@OU|jLU|=X?U|{HEU|^Wbz`(GPfq~%w0|UcJ1_p*p3=9kp z85kJ8GB7Z3GBPm8FfuUcF)}dNGBPkQb7aB6e`c<%tmwp~q?DATtgNj6jJzPJz$6Gr z%gXxCz?YR3nVba@N=!^li~$MpXJv&YX2mBZCML$mM8>2*#e(8Nnn5@;FcD-J6Nt^t zl9d$z;({1~Nm*I{L5xt4*^F=np)fNdlRR literal 296 zcmWe&;9&p(4+aK?PzDBu6b1%{5(Wl_76t}}sSFGZ%NQ6K)-y0L>|kJEILN@jaEgI} z;Wh&U!y5($hCd7p3_Oes4AP7Y3=AAuaPXgjD=RBHD?TYDB`GT_>puf`R#sqEbP@=p zA@LIv6BA=Ve4ebV_^jx}#Q2!Vm=vf0)U?pR#H_6U94uK`0Wd~j5>zAjQU|`5&U|^_XU|{HCU|^Wfz`(GDfq~%^0|Ub& z1_p*-3=9msj0_ACj0_A)j0_Cgj0_Ac%vm7tpM@nWD>Nx9>pu%?R#s?yB8bJ7l@$;k z4Q8@uWd#I=MuOO^+*w({!GVD>AbnX`|CyOU3^uN;tl;qI==j7WkSR>eSy|y(S?ruy zSpkuek&!VVos2A5S>cfg(eUv2tgQbGtXWw>k+E4>5F;YPqa!21;vm(rSy>?a0>eWi nVfHaVT+G6rl@%BcQOd%Wl@%BYHVx$b00@gED=QFW5X_4JB;s3R 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 zcmd;Q5N2RtU}kV(U|@)0U|=X=U|{HBU|?9nz`(GFfq~%)0|UcT1_p+23=9nHj0_AC zj0_B#j0_AGj0_C!j0_ARj0_A6!dckBe~@@&bYygVOms|4d_rPke0+RjMg~|sFfuqW zI5;#sJUlEsJS-$EDJu&s9uOQF5EvL37z`2*4-1EhM@PoS1xLrl#wJC^CnY5&B|*&r zSqxH?l@%TbVrOM#{by#$$_hxz%Hjsm@n{0UDKLRVh>FlekN{6sR%m1j$b`rkke$pt zSy}PX(I6McCxQf6xU#ZhVqy}Lk`iOGvi^g(N#S6(fDB~i$jZt}OiWA!+0V`bGAAqR FKLAhfZzBKz 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 zcmWe&;9&p(4+aK?00stzSOx}$90mr48U_Z29tH-6xeN>p>lhdq_AxLpoM&KQc)-BG z@R5Omfr*iUL70(&L4}cl!I+VOfs;841pc#dfT*mj_>`=y|4dw2Sy@TZ(b3T{Nm*I{ z8M(8vQetAFqhn&C6QTUX#F+5V;Lz~+tgQbGJXu+Zk>TNykR$R0oI;k_>?92#n9lN=(ek3W$WN2#ilm42%I`s6aq)aCCThaA0UO wR3JP!JUBQYI6NFC5FZ*Gkdzb<83}S1BUe^de0)+?R&+GT8%z+dvO}o<0LCd~9RL6T literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0110.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0110.lmp new file mode 100644 index 0000000000000000000000000000000000000000..d69253bc5a241bad58b7b0d1afe6e91a1e56899a GIT binary patch literal 339 zcmWe+;9&p(9|i`75C#T@7zPH0Tm}Y)ItB)Yeg+1H1q=)f8yOfF4lyt=Tw`Ehc*DTJ z@Rxysfsc`aL7tI;L64Dv!IqJM!HbcBfrU8>1pb5Qh^(yt3_KuiR#r5Gf(XPUWo3nD z#l*xULRADNW@UwDMMp-*!vx~9vVyasBg2seLbKvyLSv9rglA=C1%d_Gv$6tWz_xI( zK$!m-pbS>VtgI{)(ZG0!Kq$=c(8zd@^FraaB}RsahlhuT27?^P$d#299vTP&(OFsl mLENOs$k5>6=%lQy|4bZNSy@T(@kv=(S^rsBK;~p+{RaShGic-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 zcmd;M;Adc9U}kV&U|{fMU|jPU|^_XU|{HDU|?9pz`(GLfq~&90|Ub?1_p+= z3=9m6j0_B-j0_B#j0_CyELmXipOqskD=RTRJ~1mR>pu%uR#r-UWMpJ`bV^p%e?}&d z8jxUgczAeZcwl^1)_(^6tgOi7toX?A@bK`^;NV24SXg3KXk>hRI0(l;#e(9qA``Q+ z!V|Nyf(z1|$!{U^P%H!F-TWAY~x2 iutc!2AT^;dv7q>@n53+%_@u0?Xpk7hIFPk4{2u@_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 zcmd;Q;9&p(7X}6fUj_z-Fa`#ObOr{73I+y-P6h^sSquyes~H#=_AoFooM&KQc)-BG z@R5Om;V%ON11BQ`gD@il0|QGI82kq@0+X_`{xk4oWd%fn1;GSVARG)L<6$ZS0)qnr z0)vBNU;@Fxp`oFn2!X)J=jRU|^_ZU|{HBU|?9lz`(GUfq`K!0|Ubu1_p+! zAk{osDBwQ}PgYi9N>Wl%Vtjm3QdSmNAT&NPDJCW|G6p2T%$t>!6&RVA7#|ZK6Auz$ z;>*g4&kBx=PfCnWN&*Wp@@Hj*$7cn{AWZ+yz>$>|7@d_B9G{i-pMg0mD=;gIg(WL1 Y6wGG=sRVIBdj5kLksxsp10?ew0I^X;x&QzG literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0404.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0404.lmp new file mode 100644 index 0000000000000000000000000000000000000000..b225754a9dd0f48fec26cd34019042073963522a GIT binary patch literal 286 zcmd;M;9&p(2L=WPPX-2tFa`#OR0aly5(Wl_Rt5%!X$%Yu%NZCLb}%q7oMd2NxW&N0 z@S1^v;SU1?11}>30}D$Q82o4A$jZt}jE_&u%F6oB$d#3q5+4~E86KSiyXW+@oijNEr4-XFw4o-v$ghs~4hl6koR3I`jD=R!PD=QeLB{(T7D>Nl53vLET zZ)j3hRv_Gr6tG*MDp(-OIaso?Kq~(;fEe*vSs;N>uojlAte7N-Kr~DMWCBP9i2e@% DDtB2^ literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0405.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0405.lmp new file mode 100644 index 0000000000000000000000000000000000000000..59a40625fad24730dc5c73eca92631615263e317 GIT binary patch literal 327 zcmd;Q;9&p(7X}7~PzDBu3ftfct(q^vBEP)uT0)_(?`tgOh;(9qDt ztgJwoKyYYiaA- zH3MctB+LvD17u4$%odP}(3F&irSTbAS&1?6@i8eNLs_!25>v9W SSV6u@Oa$8l^(h;a{to~<2WL9~ 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(1qKENLk0#0Ck6(FU}2~9Ul`PA0HDFlbDqS n76^_{OiWCQj}DKA3B<%C#>Xec!&Ss2fm9?V#>2EAoBAIBat0|0 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 zcmd;L;Adc9U}i92U|=w3U|?`yU|#R$He~&WItKuxi9Ra; 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 zcmd;O;9&p(8wLgj7X}6fUj_z-a0Uj3Lf0{_`qva%u*v$FoPv1VljB3R+!AThSAtkB?Kurym%R#r@Sd{)+f z4wkH}P!NNG2V?{o$49~hB4c7=Vxl8Mqd~eDxU;eX!b3wt0|Ns?v$Fn!_<`ZUfx*F{ a;b3{LtgOh$$jF$O_$-h#2iPz$@gD%H!$TDS literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0409.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0409.lmp new file mode 100644 index 0000000000000000000000000000000000000000..b8289d6c3fd3f42f6ddf8e583211c53814fed8ac GIT binary patch literal 451 zcmb1S;9&rP90mr4QU(TwItB)Yeg+1H1q=)f8yOfF4lyt=Tw-8gc*wxO@QQ(f;WGmR z!yg6)23|%6202Cs27N{b1_wq4hCoIJh9pJ?hI~c_h8ji&hE7HXhG~op42u~V7&b66 zFzjYzVBlcM0)zh`Modyx)_(>bumG5djE4%u#KgozN5{m#1p))Z!$ZSEg9BrrDgpvS zLqmfD10e$3Sy=&*(b3V-k&%%g1zcHKf#F~yvp`&ytSpE+WJW+ZNQx&b3&cRE<;ltl zj0^_@B-;Z60|H={fm8&7)PzE9=gGAO@tZ>G7w~EKy+5te-@6ctbiD( zBS4(Mc#wmkGJ!FPi6Et5Wr2Z#fuS%xp#g!R;V@28WI!a?MXYRDSy|E1pul5i2HBJK F9{{#{jV=HH literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/040A.lmp new file mode 100644 index 0000000000000000000000000000000000000000..d9c758d1fa60d79a4eda76060fb7d343a4c91b26 GIT binary patch literal 428 zcmWe<;9&rP6b1%{QU(TwHULxXi%7aEF0`;VAM3W{^Eu{{heqhcW;F 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 zcmd;Q;9&p(7X}6fUj_z-Fa`#ObOr{73I+y-P6h^sSquyes~H#=_AoFooMd2NxW&N0 z@S1^v;X4BZ12ZE710N#;0|QGI82kq@0+X_`{xk4oWd%fn1;GSVARG)L<6$ZS0)qnr z0)vBNU;@Fxp`oFn2!X)J=hoSy}NhASE0yp8x=o1y=t6 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 zcmWe&;A3E5U}ErKU|@)3U|`5%U|^_bU|{HBU|^Wbz`(GMfq`K+0|Ub;1_p-P3=9l! z85kHC7#SEu7#SGU7#SGM7#SE`7#SFtc(PEye~>_AbYygVOms|Sd{!1%ATTmGFgQ3g zJUj*}5D*+15EvL37z`5#4~>itjgF3lYXO-W4kEHZS~#+@;!Lp28Sy|!nS%Klv zp&;E1JXu+R(OChZp`pQG;~03evI0T;;LzZ}!04>3{|tN}g90K$i~hGArvp I5198K0F&WmWB>pF 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 zcmWe&5M*FrU}f-NU|Nx9>pv@NR#s?yVpbME6Ig-) zOtG?MWd(#sCuU{wF=u6g)G;t;Wrb#Cv9f1n1q6mhCT3;vvSei?C1z#)XJE<73Qow% zV&l%r3JeU4jLAxji3f?ZW@UwgB-pvKvH}AFqvIpPLE?-cD}%zbvN$*(hJ{CFW&H<< zh6hJyWpRM42n~${2{OQqV9&}542=wr2AK=94|o67!IqU3nV1MN5X6j0NlF3fL{b=?3|0uTKRzWXF)1lA zJ_c+UPgYiBQc6-%QhZE&B1jWYR#s?abWCDmVq!el6rQZCn8f(R#Q6C57?=u>VKDq3 E0Ae0rH2?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 zcmWe&5M*FrU}f-NU|jRU|^_VU|{HHU|?9zz`$^Tfq~%)0|UcL1_p+I3=9my zj0_Cgj0_CUj0_A>j0_Cfj0_Cbj0_B{Tv4{F)?8EaIXY}hlfXkJPGn4$PWRb fk>Qb%k>TO-Sy}%<=EcOvCnhE)CV|3)9W}@RUm15d literal 331 zcmWe&;9&p(4+aK?a0Uj3bOr{73I+y-P6h^sSquyes~H#=_AxLpoMT{MxXZx6@REUn z;U@zF0~aF$gES)pgAOADgAF4{APWinXW-7tiiwE_gQTpi{|r1?SplKpp~1ny!GSSQ z0TvjDgbKt&Mn*?R1_r`aK#U9x4NL^7V9CmgPRhz+Wy{J+3=Izk32|p-1xIFOB?bmU zlyHG{Bt}AXFtKN4B}PU@f^;)-L)ejE6%ZFChK7emhDOK4fE0k87#>UQnpALnRu%_KR#s?YR@Q$85F-U55InI#Qad;?D=Rc9D=QEz%afHAoRpOn hnv#_j7!Oj;la&>jn3WZtn3WYg@rVLbaPY)u765ZDAXfkY delta 89 zcmbQoG>>UQnp9wXRu%_KR#s?YR@Q$85F-U55IC_xQadm)D=Rc9D+@&bXW+@o3QWq% f3Qft%0%-#aL?&isg(qfZ1x`Goz!Vrb@tFkxaYP_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}i93U|?`%U|jRU|^_VU|{HEU|^WVz`(GWfq`K?0|Ucu1_p-X zAk{osDBwRcPgYi9N>Wl%Vtjm3QdSmNAT&NPDJCW|G6p6P7@3$D9}^!F4-*KEj8968 tPf9`v#30Q5&&-mQ6&#jMU|`5&U|^_WU|{HBU|^Wbz`(GUfq~&L0|Ubi1_p*V z3=9lRj0_B7j0_Cgj0_C+j0_Axj0_B^j0_Crj0_9{%vm7tpN};wD=Q@_E9*ZGdsbFf zQc@C#&Bd9Om6e#7m>3V@ad3lVQj(GqlM+FEcAl)Pr1<#wq@={e_^hm~|7_e@S&=a@ zk&)5yU_JxHa8|CYtnm1l=t!t2OIB8RY*rR42UvA<3`i>je^ypdWNcP=ba;FU$VFLM z{~0;6vce;?f}=r(akFG)1;%G({byp&$_md4j*QRBf{QT=WMx5wva*6fszFAw@MmR( zheyZ9Cnko+#KeP){m;sml@%Et9vT`R9v&VU4)O&^C@C@;3}RwpKtgQ1AdkjF0Z0Vw Kb%?V-jMU|`5&U|^_WU|{HBU|^Wbz`(GUfq`KU0|UcJ1_p+k z3=9l!85kHC85tNP7#SE07#SG685tN-85tPL85tM^n6p6OKObvWR#r+^xanN%8UVNlA%`@mX0}|Jk^+vLa(* zA|s>Y!F*P(tgP_(nCM6-mjf&v9RpI!!kv{B9vvQ^0pwHd+TduAK5mw*tibrJ ztp7~xSy|y(!IAMjMU|`5&U|^_WU|{HBU|^Wbz`(GUfq`Kk0|Uc31_p+Q z3=9lE7#JA%85tPV85tPt7#SEs7#SEc85tO=85tM^nX^FPKR;_$R#r+Y!F(1TklEq!G0~9_0cP&3tWdC;=opX&Ccdn!(CDo2=eG6 zS;5gDBY0S{vI66?vi>uGgo8q}vVtSyv$EjAjKW!2q2Y-T(X6askRGtXLRncc;aTC~ z(ed$#iQzFZ@gNKSGYe*A#bjkghKGlShKGlTM}~v^!6E>%J1H_63}RwpK!WVNAkW4_ O0Z0VweUM5B{tp0Wp?}Q) 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 zcmWe)5N2RtU||SgU|@(~U|>jMU|`5&U|^_WU|{HBU|^Wbz`(GUfq~%=0|Ucl1_p-b z3=9na7#J8t7#SF}85tOy7#SF185tPL85tNl85tM^n6p6OKObvWR#r+^xanN%8UVNlA%`@mX0}|Jk^+vLa(* zA|s>Y!F(nrklCzUSy|!nG0~9_K}Mdete7OQ!sr-~E(ZRrteEhutnldY_!N+atgQbG zAU#1@S;5gDgSc6;vI65l!kk%I;X&b9!IAMHn2Rxn5h$Xu{+QdW3) zbbNebVt7nUJjnR}3@lk$F)>+LtbAEnk>TN?q2b}-;gR7W4>3Rj10<6a84U(8F(9}8 VXX6EVJst``YQcd4aV?1a4*>USgJb{z 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 zcmWe)5Mp3pU}gwlU|@(~U|>jMU|`5&U|^_WU|{HBU|^Wbz`(GXfq~%|0|Uc#1_p*# z3=9na85kG@85tPV85tPt7#SEs85tOI7#SE^7#SG&nX^FPKQC)mR#r+?Wd%pZXJx@f7zM$~Kw?>0!63z8^Mt^5hKEPT$0sI+ z$Hc^g%>BsJUl!y9OMy@a8P_!R#Id%7{tWHfP|sm;RX3R9tuF>;BWxh H3c>#Yn>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 zcmWe)5M^LsU}FeiU|@(~U|>jMU|`5&U|^_WU|{HBU|^Wbz`(GUfq`KU0|Uba1_p+w z3=9na7#J8N85tOi85tOS7#SGS7#SEU85tP585tOan6p6OzW{4iR#r+Y!F+bEtgP_(nCM6dmkDAQI|o=*bPPxfqd-;o;Ho@rjAyF){HVtNz2>!xT*g2VzN!b3xY zg98HtgF|3q0pVZ}2_oTQkx5xup&+Y6K`e-QAXXrVK!^o~CuL=UiC~ZfSRF(ONFo44 zAjH5P4S=Wv`7AmqD+?6tScJf4{AU2E0);$C71RROtgLWQ;Ddyq?qJQziiZhB#(=#5 OicFAoAXOkb>puWSO~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 zcmWe&5N2RtU}5lJU|jLU|=X?U|{HAU|?9xz`(GZfq~&N0|Ub=1_lNOMg|5^ zMg|5AMg|6JMg|5yMh1pNMh1owMg|5B_AD6q&&HjVm6a3^0x4NpS^rsiv$9fRVxq&t z!z06EQlKI+;h~|y!GVE+!7*7`{~4IU+FAIsvXVdwK}y5J!;?T#!dY42u~}K+kx5xu zp^@<*0wx|58JiUf5)T9sVAg*|A&}avK#*oI5e$<1&m@?Y6`loA2a*Z^5&xM5va%q8 zVEY5WN?BO5vVxjLU|=X?U|{HAU|^WTz`(G9fq~&D0|Uct1_p*t3=9lh zj0_Blj0_Ccj0_BZj0_Bkj0_AVj0_AM>{&4IpN%^!D=R4;1X8lHvi`I3W@V+s#6*XO zhew9Tq(DVt!b3xYg98HtgJZI?{cw`nt9Y`(!MEqwE&dLgkjD?7U-5dZ`&cKjLU|=X?U|{HAU|^Wbz`(GXfq~%^0|Ub&1_p-T3=9my zj0_B#j0_BRj0_Axj0_B^j0_AFj0_B%>{&4IpPf4^D=R4;1X8lHvi`I2W@V+s#6*XO zhew9Tq(DVt!b3xYg98HtgJZI?{<8>x^njFr6orR}CuL>*XBN!L3e5_SOv=g%jf@8o zAWf{9>|3L*1*J(l@$}76&#(EmBr7Rl?4%HX3xrsK?s5k`_ICbm6a774^;@UkCinm dD?AY@1aTTjC>|yh83XbJNC<2v$ObUuKL8gKeggmi 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 zcmWe&5Mp3pU}o@OU|jLU|=X?U|{HDU|?9vz`(GFfq~&N0|UcL1_p+|3=9my zj0_B#j0_C+j0_B+j0_A}j0_C5j0_Cy>{&4IpOrf+D=R4;1X8lHvi`I1W@V+s#6*XO zhew9Tq-16NXJi5?28qXnhlU0R2L=WP$7E&wXAsKDicHQ*0x1P44i67cf(nNvW`##4 zWo3m%#)Al$a8P_!C`dREM1WcU83jRx2ZD5hiC~b_e`fxyEQlhIL;#3@sRYS`v}6T< zSpOL~z>WxxPRh#SWz9ko4NJ^|i-OGps|||J3XX@Wh1kUi4vg?bs362y%&b{i@i3vt Q7?1}*LSTzQ)_@uR0a?|5r~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 zcmZQ)5N2RtU|~>UU|`T;U|?`zU|@)0U|=X_U|{HEU|^WXz`(%3oCN~^8HBU4!ec>9 z6bu#*ij2*QjERnnj*bC?_^hn|j6zvi;gMOP;h~|S;UEwh8IzUupGhz)D?BSWGCUk2 g92pK$%q)UU|_IdU|{fNU|>jQU|^_XU|^WUz`(EyB+H+L4*oL>WMySV#zaR( zN5_Ccd{)+fCc&(%@T}1A(9qCu5QvP7$;$fAD3p~I9+?#!86FN1j|>MXW)RNG3W|)) dijIeZ#Kgp;tgQba@$gu53$y++FoVVZ0{~@kIIREx literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CE.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00CE.lmp new file mode 100644 index 0000000000000000000000000000000000000000..d2fafed01f763615e88fbce700af23fad7886259 GIT binary patch literal 222 zcmd;L5Mf|oU}Z31U|=w3U|_IkU|2tpCi+Sy`c3S^t@Yva&*>K|;v*KcjF~R(NniR%A?cWOQ^47{q5~{bvx#$_fvP z&dLf64-E|s2Z6}Q7??zGbXHbyWOz74CNdnP17uQYcw$y`JQO4*CMH2GjtNJ$6vPI* J3uGSDnE=iwM#=yH 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}i92U|=w3U|?`yU|2tp5xwSy_?EAcjy@R#+lP3>p7t5X#C5iqDFSiH?kpjsb)CtgQcxf*@6);h~|S s;UEwh83Pv$jtmcn2uFs4)PjtNOwNjqhl0e!#3VcxvVbkj`VVy=05r)&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 zcmWe;;Aa4V5C#T@7zPH06b1%{90mr41_lO(DGUq@D;O9U_AoFoTwq{ec*4NI@Q;Ck zL4uKi!GMv0!IhDLA(D}SA(xSXp`MX}VIm^~!$L*|1~%p_5cm(GBeJr5gRu(&B7K%6<$SjZq zCtFrlQgk%T(wO*okZ4v?Od`lhV2>rm#K$DY$Hc@Zrlf$>G4f_*CC0=jCV@dpR@Q%z oNLoyMd{RfUshIPVq!cPB_*X~Wc+95&&mo94-b!y zkBp9qPmE8=%KFbFkd>7c9T^!O850>DpO}~g5@Zz2%8E(K3XP13iHVL+OiD>f%gXxC zz><{}6P}d?vMV$?CO!scBUmOpC@YJNJu53TCOSG1q?$D=D?BJXD~lZ@7#$Onl$G_L zktHiDC?+e511uH~b^%x{DJzQ;EEWmT3~~V6{Fund7_gB-U>jo+<3S)gCMGfl zl@*te6&{}gQ5*`A{?Ejol@*s24q}5$2#rt7%KFdDmX(DN3yubfv9M-kMZ)w($HYUO z8=sbv0d`*1zh_L_w 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 zcmWe)5N2RtU||SgU|@)0U|`5$U|^_YU|^WQz`(GCfq`KM0|Ucp1_p-v3=9lk7#JA1 z7#SE885tNX7#SFX85tPT85tNV85tP585tO6Gcqu6uxG)*e>U!{tgOVOw6wIO#H_5W z|E#=OS!s!BNhz7>iHV6BP?5xpq_mW@l$4~Tl&q}(Ec_rXDQRgbNl8hGiEy#_6c95j zD=Q`?B@LvGH7hGVDJ?6D55!0TX=P>uNhd)OgJt%D=QLaMs!R(NHsIqn;_@Lr=?_oIg!!P zAUi=~F-a*PA0#HmCxUDNdp#y8DJ3Z>F+M&KWG*-`Vqy{#lM)l-qd{JR1Xp|_NChak Hkb@EcPAiFF literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D4.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D4.lmp new file mode 100644 index 0000000000000000000000000000000000000000..e184d5c1e6dfd3133d5cb1b81d655e4a75b4f80e GIT binary patch literal 432 zcmWe)5Mf|oU}XqkU|@)0U|`5$U|^_YU|^WQz`(GSfq`K+0|UcF1_p)~3=9kmj0_AC zj0_C=j0_B}j0_CXj0_9~j0_A-j0_A@7#SFrFfuT3vS-1-e|GMytgOVOw6wIO#H_5W z|7^TjS!s!BNhz7>iHV6BP?5xpq_mW@l$4~Tl&q}(ECOIXDQRgbNl8hGiC{ry!K|#< ztoRfVCo3x}CM6{;E9*ZKM^;vBVpe=oT2>Z6YgSf#3djIP&aABXnAEJ8M5u6dB1o8l zD=RB5Ix#CNJU#`YJQSqhKS(@21|$yRf{Y1`Pt3~t4>Be;E;TD0CL9dX47M{VE-Mmd zNOVkmR@Q%z`;xNa(^4|Pevgcf23ZOAN=#A;$R~-3@rfXlz+n)Rl$4T`lo%hM2(k$r cDlsvMiAjlx@zEfULBcIQ5u^eXZpdK@0OCfC4*&oF 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 zcmWe)5N2RtU||SgU|@)0U|`5$U|^_YU|^WQz`(GCfq`Kc0|Uba1_p-b3=9na7#J8t z85tO~85tNH85tNN85tN#7#SGa7#SF5FfuT#U}Rw6V9$bq|7_e@Sy_omX=!OmiCI}$ z|5Q~ zQ$U=otgM)nl(ej@|BM`2SxISG@kwb}S$wQnS@9_#{S2I0SxNC(Suu%F;pjw|aC~%D zR(O00M0F@g{y#`{d~|$PIEV)_Bs4w|YIJlGLNquUE}E7V2{R%(CO#|cKZ9^qR#H+{ zR(x7Y2FRINkiHV6BSy}%XnLvs`;)xkaX(?$bDM?8wSy}%XgtD>{(z6niQqs~= zl9G}V6XC+Ksaf$UAYN8hR!mAt8b~!qR#tRMR(w)gRu(U7R#top$P7lXOJWkCg3*Z} zL1xyhtnm00h`Laa+<&kThy~Ib8lMPq7FcUIOfWbaB*?%4c2guwcXUiV$ZnymERd7Z zQZhhZ$%>4Q2H6AhKy*r0Oi~KS{fUY3i6Fy}{2P;$l#-N`7$2VqG8+^EX)!U0iAjlx U@zEeZLBcLR5u^eXcF5rh08n6!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 zcmWe);Aa4V00stz7zPH0JO&1aMg|6kDGUq@D;O9U_AoFoTw-8gc*(%P@RxysL6DJw zL4%Qj!H$uEA&8NIA&rrNp^}k-p@)%yVICs`0}Fc=4E$%}&C1G3OiD{jOG*R_{%7RN z%1TR2OG?R1PfSeANX*It3ngYGrKO~$q$DM!#ARjuXW$2EOG!&hNlHpeOiW6Fip8gZ zm|0nIF)1l&ATidgtoWp~tSokptgN`?)c6#zO4h8bn8dWKEH+NCXjXJ0SeQR6D?C0W zD=RJ~H7hF=qyTJDcw$;sTyk1gR#s>{$UO|4Sy|zUX>rM^Sy@?JtXWyX(O_YYtgOiR zl;l)qh-h?7Jjez7Sy}OEDH+Tl??pyO!z_wPN&z`OF)=<7Vi8|fR&-2KQc6-%Vtjle l*g(FlteCWzn8d`S#Kib$uzx_|m6Zk36c2Js)_>&C1ONqMi@5** literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D9.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00D9.lmp new file mode 100644 index 0000000000000000000000000000000000000000..3bcc286e3fae743800fcbaf30cc72b6f8f27f8df GIT binary patch literal 377 zcmWe&5N2RtU}5lJU|@(~U|`5%U|^_aU|^WQz`(GYfq~&L0|Ub~1_p)~3=9lE85kHi z85tO485tN185tN{7#SGC85tNd85tN@xU-PKe-_@Xtmx>N7!Zz0%*x98&%&3L6&f8K z9T^!N6B8bs2o(yCkAZ>ctgQbG%wS_!__MO2S3R3J1aE9*Zq6UY#dmSC^~ zkc}V_Fpdrl2fL3yD+}b>=;-L^nDFQrkSjpm2o8^ojEoEq4-b!wgnA=1Iyw?63f2ko ReoQ>bZ}BlnVDF;^5CGOPf zIx;dkCMG;M5h@fO9|Hr?AR+#&tmt?!NK8yhN=k!@!3~c|NlDMj`p?V+65(Ub%8E`( z%F6oB#GI8Co|Od>2#5v=FtTK2g-1d~LSwSB{xh&N7!Zz0%*x98&&rpT6&f8K z9T^!N6B8bsn3eUPg+D7RD?C012BNdF{xb_^Wrb!%$Adv)Vp394T2|J7CLxe!gbgt% zDd|~R{~1}cvciKCva~KX@may)k&%&+;o;%ok&z%XVIGQvii1o5`#UBcjQU|`5&U|^_XU|{HFU|?9vz`(GVfq~%~0|UcH z1_lNmMg|6XMg|5gMg|5GMg|63Mg|5J<}48S&%%Qj#NM~Dza G!+!uSm}1}n 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 zcmWe);Aa4V00stz6b1%{3I+y-9tH-61q=)fTNoG^PB1Vq++<*2c*VfL@SA~wfrpWS zL6(t$L64Dv!H$uE!HBGA&ZfLp^TA%fq_2@9sCE0MaD!&Mn}hhL3~ygSS&O= zG&D3E1R^72pkl$1;o%U$$Z(jt==kV(Fo;P^OoFP*%8E<`TND`&qW&|nWMu`$XJv7M z=)|lnh(HWPAQ&!?2oVT`3qVzbg3JY(5t#y20df#XAOpufeR#swUcz9%FbYvt*0Z1S;1!5qG z{LjFWl@$=5mBqoFl@$op0pf!s17JD=-V literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E0.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E0.lmp new file mode 100644 index 0000000000000000000000000000000000000000..fcd055e48d19771692bd764f3117f472591fd66e GIT binary patch literal 303 zcmd;Q5MW?nU}SJ%U|{fJU|jMU|=X>{(e^iP7O8HajPX9TOfH z7@d{%pN%UkD={WKJTy2lD=X_i14Jt;XI55HOk{W@M35ybD?BzUijMU|=Xj*m}FOo9rA$7W>( yhet+6Mn*@2%>K^+aW4xG$c@o4(J|4H;UH64xwEoT65|s=2&5V0R*2ys@;?CH?_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 zcmd;Q5M*FrU}A7#U|{fJU|jMU|=XjMU|=XvI3Lh zj<_&C1G(iOI_P&%vIRm6aGB4q~%$g4i+Pfq~Ik zS^pWCKuTG;va%9m!ox#@6SK0i{xk4qWkn`uWhKQ#hDSm~xU;gt60@>mBBSB_p!lrl zcn}X{3>V0l$e66G(DV!Z 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 zcmd;Q5Mp3pU}kV(U|{fJU|jMU|=Xs)W@Uv&$7N*&het+6Mn*@2Ec*|&o{b0O_UM@CnCQrGkn!x?Sy?HG R@rfV=(hc$h#C#C>9{?+cW^n)j 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 zcmWe*;9+23`1?PBfq@}|fq|ijfq|ipfq|iifq`K*0|UcK1_p+$3=9m17#JANGcYhb zU|?YQ$iTqB#K^!P%*eo?!pOj2%E-Xr#>l`B&d9)!!N|Z+$;iOa#mK-gn~{NmlQ|0n z{3|4dw2S&1>>;i18aSy@^C89B4E zl42smBOyHYtgM*GXfT_BBP%O99>mPb`VZnn#$;uM#)CLKSy_RJSy`b;AX{MqN%8T~ z@$rd?Nl<~{@W{x>$mnR0Y5y5`va&*>qhq3Dq9em$W`xGX$44f{$H%|~K#mAc%*qOe z2?Qr)Wre0>Wd*_opw@z{hZvfIrUI-SWJV&)9q|zTp)i4%q^zv?q^vBs!yvwZkpBTZ COp4k7 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E7.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00E7.lmp new file mode 100644 index 0000000000000000000000000000000000000000..3e66da3e69bdfce6cc9a03d0a6b5fc10175b48ff GIT binary patch literal 446 zcmWe+5M=-X9|i`72nGg*3lqjr&M+`AykcNrU}j`skYQwCFkxh1 z@MdISNM>YUs9y8|tXWwxiK!q-wydn^q{Ni0EKc^UteCVEkQPCftgKM5ENfO) zBuJ8r8>As6IUc4BBoUvIl?9RrPfSTpiBE)>$C{ND4%Weyl@%GElAM^Bk_fT~F3y>i z6&;WhJJhWo2=) oW@W`E#)AR`Bn0v;L?|UI>pv3jPU|=X=U|?uvU|^Wbz`(GHfq~&T0|Uct1_p+A z3}EF9f{Y9dN{kE)94uL2@Slw%D=RB8K0YxkE9*ZiS5{U^d}L%~cytPs8yy}V9vL1O zpOy8Wg(oX3J~BK!JUlcwI58{hKLaz^43KzeWPE%$2*-fL1+ucjW3#d%6SK0y6SJ~{ zLAn_Pva*6AW3z&jva&)`va-NNGV*6-g-2$AObboQ$_fOT%EXtI6%JMcSH{en1=R#H g4WtNUC&*ZkDWNcdn53+%_@u0?XqW)lc~Ig%0GQZfH~;_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 zcmd;M5MW?nU}SJ$U|{fMU|jPU|=X=U|?uvU|^Wez`(GIfq`Kk0|Ucl1_p)~ z3}EF9f{Y9dN{kE)94uL2@Slw%D=RB8K0YxkE9*ZiS5{U^d}L%~cytPs8yy}V9vL1O zpOy8Wg(oX3J~BK!JUlcwI58{hKQnJuR#s?ae0(?v$7E&wXX4As3eSp6%*qN+%*qM| z>0;#1$_kIn3Qo$(3Qft%0-MAjkd+k_8Jh(%B{V53D-dKFNH9DWq6(ps8SG4u)nGA@ gsUXE50g&+^<3eEqF-cij@kv=((J%q9UMTS&0IkJh6951J 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 zcmd;M5MW?nU}SJ$U|{fMU|jPU|=X=U|?utU|^WZz`(GUfq~%=0|Uc#1_p-L z3=9na7#J7?7#SE885tNjShB$2KO09@R#swsd}3Bs)_+#6tgMvy$jHd>=oBb7Iy^i) zGCVLoE9*ZqZ&p@Td}Mfdcz9@VaAH>0ep`p?LpnHd_L6`7co z6`q)t6%5kIAds0E9-NsKoRpOnnv#_THVq^g8lIU2GAJ}DD=QFWAV_yiI9L%}A;^*# qunDN0I=2We#CK^P5U{RaS{rZN}+ 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 zcmZQ)5MW?nU}R8XU|=w1U|?`(U|@)1U|`5&U|?uwU|^WRz`(%5lZ68QGxKI;Wktuw z#K*_S#Ka_KW&LO3%gPGR3XV@qOiYT84v){u`p?Lpl@%VD6&w?j7$2V$4_3w?kd+k_ d8JiW81X7rk7!T455)6+;u_5a}12b6QKLEOwGClwR 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 zcmd;L5M*FrU}7*}U|=w3U|_IkU|2tpCi+Sy`c3S^t^%v$8^?K|*l+pHUzyD?B(MD>^pz2FR#tdW zbXHbyd}3l^QhaoHJWMngBpMTw7$2V$4^|5@AT&HND<%n~G$}D2WB|yfm~gl)AO_eK LF|J_ZJcMGOoK+ZY%a_A@XrFfwIj zWo7+mV9CmgOa?Ldv$DbxL1J+HpMgIsD=0oIIzA>oK0YQUCNV4PKO-MVJ~%!xF)=AV rIy@dB6cdveAD-% z%E}7QiiwFygbD;EW@UwDMMp-*!vx~9vVyasBg2seLbKvyLSv9rglA=C1%d_Gv$6tW zz_xI(K$!m-pbS>VtgI{)(ZG0!Kq$=c(8zd@^FraaB}RsahlhuT27?^P$d#299vTP& o(OFslLENOs$k5>6=%lQy|4bZNSy@T(@kt=hv9N&5$;$c<01ZcK-T(jq 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 zcmWe&;Aa2<4+aK?a0Uj3bOr{73I+y-P6h^s*$fN}>lhdq4lyt=Tw`Ehc+J4T@Q;Ck zL6DJwL6wn#!IF`I!HbcBA&QZKft4!@3H)c_&dQ33k55cYOiW73%KFdDla&<^8W|oL z85tfP4-*Iv504BF4GxaU%KFd5o0XN77#bcL85$iElbDtDpOG&sD<&x`F)}hT5@Pm$ z29~U>nDDGDR`x8gI7k^tEIcSHiw!Im8VD9+&B_W73eU=72MGoSf(02_va*6=va&eX zz!n8Vtq4kj7#<4M%Ab`L6O$Da85tcN85kG{avK9bSP2UZM8Z4}3UYmLFjx^Y$jdSD LU;y?qYKQ;;o!M@G 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 zcmWe+5MW?nU}W%NU|jMU|=X@U|?uqU|^WRz`(GUfq~%=0|Ub~1_p+g3=9mv z85kIN7#SF385tP#7#SFB85tOS7#SEM85tNjShB$2KO09@R#sw6OiWf*)_+#6tgNKK z(9qD(z$7R)AUHfcG&nFiE9*Z4Ggu1?PgYiZcz8@qOk{9iJV;z1D=R!UD=RoW38WxA z94yF@l@$~jn-vg~mBqu71*ZQqvS($5M}pa4F_5WDY*|_1Spi8Hf9 ztp6+^6A~dxLK8s(JXu+xktrbiB4a>q1-mLbIzB!=F+LF_0P;&rOiW@@Qeq6$FG=B% U@kvREAOj)ZPE1S$c^e)W014`CE&u=k 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 zcmWe+5MW?nU}W%NU|jMU|=X@U|?uqU|^WYz`(GGfq`K&0|UcR1_p*33=9l! zK&lxT7{nME81xt!7;G6C7o zXJ*Yp5&;>)#Fmv6o)wS;RRq$-$exuI9tjrOFaWqUY{~!t literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F4.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F4.lmp new file mode 100644 index 0000000000000000000000000000000000000000..bd207c5204de8834d08e52165421c76bbc8605c6 GIT binary patch literal 358 zcmWe+5M*FrU}ErLU|jMU|=X@U|?uqU|^WUz`(GSfq`Ks0|Uc31_p*F3=9lE z85kIN85tN97#SFh7#SEG85tM?7#SF185tNjS+c<3KRZWOR#sw6OiWf*)_*pxtgNKK z(9qD(z$7R)AUHfcG&nFiE9*ZCZ&p@Te0X?FOiW~OV0>2Ae`da{tkA6B@Fb8~;o%@5 zCibkX(CDmyn5-;bmMk#+pOGUgD?B&>%mE96Ok?28$_ft(&B_W$f+_`R2Pq8=PlO8w zr(|XQ2bmcYo)wS?Q5c#CwK^s%G%^Kbbz}_4xe)h7N5{vxqepAg{v%1OO80Z!G`- 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 zcmWe+5MW?nU}W%NU|jMU|=X@U|?uqU|^Wcz`(Gafq`KU0|UcF1_p*_3=9mv z7#JA%7#SFp85tO?85tP77#SEM85tPT7#SEiShB$2KO09@R#sw6OiWf*)_+#6tgNKK z(9qD(z$7R)AUHfcG&nFiE9*ZKA4p4lcz8@qOk{9id{)+fM*ggv`COj)EASNq|hXq3a2MLA;K{#MRkbw}v@T`C&s7jD_M)s_%pcuGVa0IHJpcdz 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 zcmWe+;Aa2<9|i`7PzDBuBnAeCLIwtgHUlhdq4lyt=TxDQjc*elM@RNao zftQhiL6MPx!IY7K!HbcBA(D}SA&rrNft@7_4F0onWMyR~#>B*AWo7+m;mXQN3JeVm z4Gm1n%KFd91X2SM3BnVc0L9v%}D6B!&B4;2eb%nA-q0%-^j z2aB<1Wd+4&1;k`!akFHB>HmyuAbGeD$T((@ToP0bNFP)UR46zFWIQ|A%78?Ovd~13 z7=Kn)SYlRaWD3a0$QY1&K~4*b&x((Zj*pK|j86oKA^Z>%6O)*flo$i^XLw|MQc@zw Pd`K81CMJTy03I>`#cgrA literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F8.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F8.lmp new file mode 100644 index 0000000000000000000000000000000000000000..5595260bb37a9558f04605c9504ef71b12eaa2cc GIT binary patch literal 355 zcmWe+;A3E5`1jw3fq@~Efq@~Ffq|infq|i&fq`Kr0|Ub<1_p+G3=9nC85kHIFfcHD zWME)mWn^FwV`N~^U}RvhWMp9QVq{>5Vq{=oWyu1A|IFN3Sy_oOF)?6n)_*3RtgNKK z(9qD(z@&iaEQmlraCmrVaA0&~cvjYbM&7Kf`0((Un3%}m!1!2@2v1g4aClNyR#td; zcsxjeB`Yf+CM%1LJu53bHW9@9&&UH23y)7s2OA6)NXiONPfO1V0P6y&ND7ZlOwY;+ zP5~Lio|P4l7@L@ymBq=Dl@*!@6649r3XM!j&C1G(j7iGM`p>|dl@%Tz9UUJZpBSGA y7U9Xt3JQveiAhXKN{j(1;mOJhiA@TRj895R1R2Z#@-)cbiHV6>Sy}(#p#cCdcX4e1 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 zcmWe&5MW?nU}W%MU|jLU|=X=U|?urU|^WTz`(GPfq~&L0|Ubq1_p*F3=9mP z85kH?7#SEu85tN<85tN%85tN{7#SE?II`g2KMPk@R&-)gQc6lvR#w)37VfO9z$6Gr zL*geUCML#YW&LMh25V*E$;ygPN=!_QkBN*)0f`G_WrfFrJeU?ND6H7hG9GBzuV zhb1d303^c5l9d%62@wcP%F6oB#GI8C4&jG_>|jLU|=X=U|?urU|^Waz`(GKfq`Kw0|UcR1_p*}3=9k} z7#JA-GB7ZRGBPlzGBPljGBPl@FfuT(aAd*3e-^H+tmwp~q?DATtgNj6EZkXHfk_aM zhQv=yOiYXc@p-bc;*$~+6XRndV^W|3P}4#K6SK1ZGc$p>JSS(Ru+gK zn3R?EpOGaiD?Ab+5DKz^fi){DC^8l*0y2_8AS)|87Gw$-C&t8QW&LMh26I?=va(_l yk5 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FB.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FB.lmp new file mode 100644 index 0000000000000000000000000000000000000000..e58cbf9c07c9c23d781b012d281e9a8ee097b8d5 GIT binary patch literal 346 zcmWe&5M*FrU}ErKU|jLU|=X=U|?uvU|^WRz`(GEfq`Kk0|UcF1_p*F3=9n4 z7#JA17#SF385tP#7#SGs7#SFR85tN@IkMp3KPy*OR&-)gQc6lvR#w)3R_?5Fl$e+p9}^jql9lzJi9ahVG#X}PXkcPi)_+FU ztgP_hgsd!HmaMD*kO%`?R#tcrNEt{dFexkRKUgRjCKL*?52PqItJuUkOGiLBO{|@;^QG6MGgc2 Ds!(m& literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FC.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FC.lmp new file mode 100644 index 0000000000000000000000000000000000000000..7c32f19b7c03bf55867f5d42dfc0323f3e591aa7 GIT binary patch literal 330 zcmWe&;Aa2<4+aK?PzDBu6b1%{G6n{QP6h^sxeN>p8yOfF4lpn#Kaho5Pw!ySYlRuQet9ad`x6a3REm89;6wBLjw~*hB1NI+$>pH z0U$1j5tx*f^&i9t1)0qVR}cy_BQhDJ2ZR%2;-Th-C1%AW#>XcmCB;XB)$wIz1;uBD l#z)5_CMCv1f~jQU|`5&U|^_XU|{HCU|^Wfz`(GDfq~%^0|Ub& z1_p*-3=9msj0_ACj0_A)j0_Cgj0_Ac%vm7tpM@nWD>Nx9>pu%?R#s?yB8bJ7l@$;k z4Q8@uWd#I=MuOO^+*w({!GVD>AbnX`|CyOU3^uN;tl;qI==j7WkSR>eSy|y(S?ruy zSpkuek&!VVos2A5S>cfg(eUv2tgQbGtXWw>k+E4>5F;YPqa!21;vm(rSy>?a0>eWi nVfHaVT+G6rl@%BcQOd%Wl@%BYHVx$b00@gED=QFW5X_4JAzNEu literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FE.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FE.lmp new file mode 100644 index 0000000000000000000000000000000000000000..e75fab9f77980e61681b53054691055443227d87 GIT binary patch literal 349 zcmd;Q5M}@Y7X}7~7zPH05(Wl_9tH-6B@7GDM zpvlOj7z#yE34g3d*M@C0R$Hzp+#Kb2gCdS9dCuU@T#RDUQ1A~J@ z!^6YF!o$Nt!jiJGz~TYHp#gz`fq}sw@$j&4n0Rz#Y+P`3Tx@JoWPDOmVp0;+9FWBz zMOj(laUgb9R@Q%JmaMFRq^vA%5FL*u5S#)NNQ9^eO#}(>WMzd$rhrU{i~-rn%#)QB z9~}*HaeN|3fQ2h7D<&o;F)1lACM)Ydh?^7+b_>WrR*tN!ti;5`M3DXLEFg2Tvi<`A DOX_bR literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FF.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00FF.lmp new file mode 100644 index 0000000000000000000000000000000000000000..fa4fe5448940e8468e1b26e75752d90b5bc76207 GIT binary patch literal 298 zcmWe&;Aa2<4+aK?00stzNCpOmR0alyVg?3=CI$wEX$%Yus~H#=b}}$99A{u)xWmA} z@PUDW;XeZd11}>3gCrvZgAyYH12c0L2>fSe$;t{%%F6oB$PVI%#wTWF{b%6J%8E?R z3J8w|^SH9I!Vh-Ap!lq;;NZZ(7?2*2W+o7Wl`AVNI6OK!J~0VoA{%E` zRzPHAWMm9T8;lno9*?FWGCVpm5+umL54JWdFg!F8W-Bw?fuRsnz-|rz Nvq2sS1epT!835HGTbTd= 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 zcmWe;;Aa4V5C#T@7zPH06b1%{90mr41_lO(DGUq@D;O9U_AoFoTwq{ec*4NI@Q;Ck zL4uKi!GMv0!IhDLA(D}SA(xSXp`MX}VIm^~!$L*|1~%p_5cm(GBeJr5gRu(&B7K%6<$SjZq zCtFrlQgk%T(wO*okZ4v?Od`lhV2>rm#K$DY$Hc@Zrlf$>G4f_*CC0=jCV@dpR@Q%z oNLoyMd{RS9 z76|h{1C+tan3a`jLU|=X?U|{HDU|?9vz`(GFfq~&N0|UcL1_p+|3=9my zj0_B#j0_C+j0_B+j0_A}j0_C5j0_Cy>{&4IpOrf+D=R4;1X8lHvi`I1W@V+s#6*XO zhew9Tq-16NXJi5?28qXnhlU0R2L=WP$7E&wXAsKDicHQ*0x1P44i67cf(nNvW`##4 zWo3m%#)Al$a8P_!C`dREM1WcU83jRx2ZD5hiC~b_e`fxyEQlhIL;#3@sRYS`v}6T< zSpOL~z>WxxPRh#SWz9ko4NJ^|i-OGps|||J3XX@Wh1kUi4vg?bs362y%&b{i@i3vt Q7?1}*LSTzQ)_@uR0a?|5r~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 zcmWe);Aa4V00stzCTN?;i16+kub4H5C{zo4h#&0i-m@Q zbVf%E+7G3XTVh#b;&lGQz|{;bJ_@Sy?a_2FE02Wrat_ zL}z8i!o(s$DxnPkP0Y&r&&H9J6%iH|5fPh}^`D(BD=RuW N2E^oG0jtdV4*;Jgb>RR2 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 zcmd;M5N2RtU}11zU|ISdR88yFZEjxaDV++bi}cmq<%$iN`X z$iSe+$iQI9$iU#k$iNWK$iTqDo&^K{nYgpEvXbIKASEj+>pvrJR#r+(Omuj7cw~4? z3REN}JTx>oI503UI3_FWKLdYORuV`BNKJTncoI}BJTfUOD>O15M8L#CL1KX*0?Y#I z4Fu@`6Tu(}h!}_!3X%u_5ePA`O9Mc%{~1`bvVx d6`lwcg1Un>D=Qu*6d40{E-TnBi1A?Ne*p5=bB_Q3 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0405.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0405.lmp new file mode 100644 index 0000000000000000000000000000000000000000..1e8606805a55cd76b7ae66532816065673b0dd4d GIT binary patch literal 372 zcmWe&;Aa2<4+aK?Kn4beR0alyY6b>|J_ZJcMGOoK+ZY%aPBAbr++$#1_{6}#z{beH zAjQbQpvTC-;K<0p5YEWJkj==zz|4{b2LGAZva%9mViL2mxLCm=Sy}%XIkK`6!^1-( zp`wv7@gPyYl$7|G=*aN!q^zuf!04>3{|x+DS<#6xiHYIi@mW~`!7#DNn53+%&`6M2 zcnnlsD9DcB=)|n70FYv^Ua$>;i7CipfnX(xNm*IJARSBGS&%m0M6%R6w4dls~m}rP*nBUn! O!4V1a_B8512D9UTJ(@mX15 ovC#0)(9m!Yh>VPZiUmi8heHG-!(r;82tp5xwSy_?EAcjy@R#+lP3>p7t5X#C5iqDFSiH?kpjsb)CtgQcxf*@6);h~|S s;UEwh83Pv$jtmcn2uFs4)PjtNOwNjqhl0e!#3VcxvVbkj`VVy=05r)&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 zcmd;Q;Aa2<7X}6fUj_z-2nGg*6b1%{0tN<#S_TG&E(QjMDGUq@^B5QyRxmIy>|tPF zxWK@`@R)&t;Tr=30|z4m13OC=82o2v%gPE*Ov%d1`p?dul@%Hv6Q2TO$Hc_MgV-Ed zS;5iKG4W|oPF7ZQB3Km{YgSft5=cFW6_Wx|fM7B3gROuN(Me!+AhG!P#Kc4pPE1My y>0sc?$_kB%iI0hi21{jS{f7y~$3#a*M#q3`VBpQl0&4;=i 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 zcmb1U;Aa4V5(Wl_S_TG&HUDMpv1_)V8+P6;Kj(m5XZ>CP{hc<(8kEXFpH6aVI?C2!wyCUhU1J34A&SL7@jgR zFnnfYU|?WkVBiK}mMk#%&&`sRm6DW|1!g3H7!3Si85j`{6H7`=jE|2`OiWBlf{Vq( z#6*XOM@NIiVd|p8Bg4bPBO@cDV<77Iva*6B!(*Z& zWd%paV6r0PL1O$MBjOS2p=z84U(8F)=W) zfS8z=aFEi_;P6DKUa$qBAXkP)g2Y(4va$lBlR!=bIRnHEh(zHAg4Bga!(;JVhDD4F3>z647!EKpFq~&(V7SZ3!0?KZ zf#EA70|Ntp7CQJ35{pkvj0c05=;*|(EU;K$WOQ^)WH=baK*a(eVj$6Am{??dVtfop zJSGON7i>vnOd^=h%KFdBnw1qAlLTc2#-u=5q46+QOgu;yT|PL`Q*40jUd&j*f|mi;0ekjEsc&BP=d1J|-qEHZ~?E7R8R} zgp}0O=s1vGR<5k9(74pBtnfIH5)d~e28A06a&t6XHWb8)28sO#DUOVZNlA%=a5=NG lQsU#{<6@#yQvS1XfOzq7V1Kf+Wo4zrfK_p@fW4XZ9{?9Rr#=7x 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 zcmWe);Aa4V00stzC5Pt!jEsiq4UA68%8H1N23e2=(#w^V6&w#111sUm$_ho|@@HiQ$0TKCg-6FgwSZj} z2~rXr9vd4S6AN=a*u?1Ai0FuDkdFUsoLN~BVPO#wU={2fSy|E1F|o0USy}%%*ujcH G#D4%vNp-9M literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040C.lmp new file mode 100644 index 0000000000000000000000000000000000000000..e2d73e5c0abf56eede9ec3e735980750996c2932 GIT binary patch literal 431 zcmWe)5Mp3pU}gwlU|>jLU|^_VU|{HBU|?9lz`(GDfq~%!0|Ub~1_p-b3=9mv85kIZ z7#SF}7#SFx85tO&7#SGy85tOw7#SEQGcqtNVq{=o=FdV0|3P9g@$rfAU=R}%pOyv| z3r|W+OiW5jijR+ujL*t~h@~VYCZ(mNB_+nkCqc#HLHv}=^u)x(lnkgCnkE04nLr|( z%vo6=T};ebS>ah(9IRPc(J3GSMwYCs@W`wzcJ{2S$fTsCw5+WE46IpML6NapS!|qH zS&{LHNl9QE89+*7v$9yZv$8_N!Qx3NAmz*;8?sn&yh b3&?380p_f%n5-;*=BzBR7O>9*z~p}bjhKkA 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 zcmWe&5Mf|oU}f-NU|@)1U|`5&U|?uwU|^Wfz`(GFfq~%$0|Ubc1_lOpMg|61Mg|6B zMg|5SMh1ptMh1ooMh1p9Mh1q-j0_B{tXU8szyhKFv$AJpg+|6CWo2c7#KL2;vi`Gj zWMzfML`Q=};erfIARVlnP^su7Bn=GASy`c3Ss=;i=;-Lk=y-@^D9AJhmaMGcgsd!9 zevkoKS@F@)Fz3-VELOiVPyNKm-M#K(h7$@puW|kADvU literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/040F.lmp new file mode 100644 index 0000000000000000000000000000000000000000..faee951767d09a3348cb324e26ae80a9994fc3f2 GIT binary patch literal 370 zcmWe&5MlrU4+aK?7zPH00tN<#76t}}84L^zYZw?94l^(?Twq{exXZx6@QQ(f;X4BZ z10N#;gAyYHgBc?OgBK$MLmVRm0|S2+I`|I~3yp~m4h{_ukB$kCjL*sfiv>nU1_uU) zhet+-M&&83I6&e{6 zp9E3^;zY+sN5_CH19M_xBBNunvLMQ$<748JFpY{%gct>KaeQJ-JP5=@MUAFAa&u1F_Dqc(J>&0!+a5)2(lWaAL0OzI?ntStS4f 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 zcmd;P5MW?nU}P|1U|?`%U|jRU|^_ZU|{HBU|?9lz`(GUfq`K!0|Ubu1_p+! z3=9k`JXt8F+M&iDJu&s5E`GD6cZB}83Phv=FQ5=3XDuljE{+ri3f== z@nvPjX9Y*bCnd%wC4q$)`LnXZa&%m6O6_}O9!jhF0 Y3g$C`RD!r5J^w+BNRT*)0h0L-0ItbJw*UYD literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0454.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0454.lmp new file mode 100644 index 0000000000000000000000000000000000000000..65262f563d068b6f6120fef02cc13bd80af0f6fd GIT binary patch literal 286 zcmd;M;9+23`1{|1fq}u3fq@~6fq@~Ffq|iffq|iwfq`Kf0|Ucy1_p*53=9k>85kID zF)%Q^W?*3W!@$76%gDgM!jc6B|Cuu2Wo4zrM@B}5N2fr!(c$6Y zk>P>ySy}%Xc(StMBg4bP!$X6E6QKg3k@4~2ARGe~h)m4N3Qx?+3WjM3PRhy(P07lF zn*q`rnv|6l2sa}I>=vjB7Km~VmaHt0%Kr=?MtoKlNFWrfg(WL1CJ7=C4HE#F08#;> G{{sM3Hd{{s 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 zcmd;Q;9+23`1{|5fq@~Efq@}|fq|itfq|imfq`K*0|Ubv1_p+`3=9nC7#JAtGcYiG zU|?WiWMp6vVq{=YW@KP6V`N}pV#xvn4k-Pfku57LDLy_aD+?qPlbDtDpMfVUD>5`R zG&C_QD-b3S92y!Nnv#_j5D!%m7!wl{otTvs08NN20#hLR;bwqT1jc7& z1t&qxfY}fUGXul`*%A)31*9T0B_$~mCJ>#Ll@%Ei69ac?d`4DQVoZE|ObW literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0456.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0456.lmp new file mode 100644 index 0000000000000000000000000000000000000000..4a6c9ed19378e797f09f83f31c9ff1cdd959e05b GIT binary patch literal 134 zcmZQ$;9+23`1@ahfq}u0fq}t^fq@~Ifq@}~fq|ivfq{X6CkqAq2MI*S$Hd3S$Hc@W qW@Ui|g5wht6O-bj!{cEBF)@kp@k#M;6){O56-kNlFfGWY{s#bW7Apk+ literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0457.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0457.lmp new file mode 100644 index 0000000000000000000000000000000000000000..9da5a4b0cc6a5238c41a88902b110b56c429c7d7 GIT binary patch literal 198 zcmd;L;Aa2<0|o{La|Q+m2L=X)5C#T@3|J_ZJcMGOoK+ZY%a_A@XrFfwIj zWo7+mV9CmgOa?Ldv$DbxL1J+HpMgIsD=0oIIzA>oK0YQUCNV4PKO-MVJ~%!xF)=AV rIy@dB6cdveADRq^tjNTytp9ARSy_PyR(Lo_j4dlGG&mS6&6bsw6%!tx zmGz&4B`Yfw#9-h783D%ekuZVCn3$ND=*ZA$kS+%9tgL|W(9qDpz`)R~tp6Z>V0ds~ daByfiSe`2@D>5=NGA1TI3na|}HVjPs2LM)rMG*i1 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 zcmb1S;9+23`1?PHfq|ivfq|ipfq|i)fq`KG0|UcG1_p*h3=9mH7#J8HGB7Z_VqjqS z%)r3#hk=2Cmyv-%j*)>upOJyVfsuhBkdc8QiIIUJpOJx~hLM4xlaYa88Y2V4Vnzmr z4U7y7yBQf6I9Rg4;6I2Fla!V9pMeJ~045^ip#m{6F)`86F)?s~z`*eE(D2aUz!<2C zfWXku(BQy8hyZt1RzPHQbaZrNWF$xdS5{VFIM~Q65SJw@3!)C05fBcN;>pSaF%W8b zva$jr!@&T__Q1e^0GMSU6@ef%p-|g-va-UXqa#Bjqa#BTp@xDC1lbu7ot5>Ug(E8~ zAO`9P5GODmD_d4pR&+Ed@YtC_ I_GJAB04T(dDgXcg literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045A.lmp new file mode 100644 index 0000000000000000000000000000000000000000..983dc518e141735e5764e5d476d473225db737f5 GIT binary patch literal 428 zcmWe<;9+23`1?PFfq|ivfq|iofq`K<0|Ubf1_p+m3=9mX7#J8XGcYjRVPIf*%D}+z zje&uIosoe-f{}qilaYbJijjfAn~{Mbf{}qCm63s=h>?Mzo{@o}hmnC{CL;sG5=I6F z2A(Vw@E;@)lL!Lw@$rcn8DN3X_?VcO=*aNM_^d35KnzGAIx-q25FHaA57HK&1l0mE zH8K%IW@Y_nVadu0O@uN6L3%(UUPkU}ek7%8HH#IgXtfWKY(A02H!`E&u=k 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 zcmd;Q;9+23`1{|5fq}u7fq@~6fq@~Nfq|idfq|iufq`Kb0|Ucq1_p*b3=9k>85kID zF)%Q^W?*3W&cMLH%*epN$H>6Iz>)<9|3Qqvq^zv}3_Mv`0g+%qFaZ?^2ZP9Xn2LbF z;DCU@;NTdTKyYwqXlN)xATTmIJUl!m8m=WUJ}WCc6l`YJe+G`MERc1P;ZXhINm*IZ zkuhLtu$3TIN@RFUd}3DCe^&OateD8~@K`82EjlthE-ULl8(UUZR(uRd2?xw40IuLz A`v3p{ literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045C.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045C.lmp new file mode 100644 index 0000000000000000000000000000000000000000..fa32fac29e1b5e864aa2662cdad35504c4fece7b GIT binary patch literal 331 zcmWe&;A3E5`2XL7fq@~Cfq@~5fq|i#fq|iifq`Kz0|Uc41_p-R3=9mX7#J9CGcYi` zWnf@nU}RtrVPs%XV`N}3V`N}(VPs%n;>kh*|3Lzg(UH;dG0`!R@mX15fxyV%z~JD} z@bDO@KtOP4Kww~CU@%M|JTx*oG&(vGt_5UjIEcssY2nDqiqFal1j{mVWo3oOX9b2w zhk|r7@ML8LMrQ?thK2@%jbq@=$_fPWgF}M@1EaID{xk4_3<`)0jn4u(BMD?8YgSeO z$T=KrSy|yRF)1K1maMFR#H=h%)~u}1=tPhRb5>SNRu&gaR#rGz7Zb=JZsx44$gHgY IJYe2`02ljbU;qFB literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045E.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045E.lmp new file mode 100644 index 0000000000000000000000000000000000000000..d8c0f6904a080f2517bc1eb7f77e44ebf35aee65 GIT binary patch literal 351 zcmWe&5M*FrU}ErKU|Nx9>pv@NR#s?yVpbME6Ig-) zOtG?MWd(#sCuU{wF=u6g)G;t;Wrb#Cv9f1n1q6mhCT3;vvSei?C1z#)XJE<73Qow% zV&l%r3JeU4jLAxji3f?ZW@UwgB-pvKvH}AFqvIpPLE?-cD}%zbvN$*(hJ{CFW&H<< zh6hJyWpRM42n~${2{OQqV9&}542=wr2AK=94|dn{(}UTN?;i16+ zkub4H5C{zo4h#&0i-B}SgA_+b!}JD5Cn4MOpP4l)D=;PrWD09mR&YFw6`BZVfpq+5 f-~elbC}FtKIL^Sp zz|50{0{(*p5>t|rk`m+NlajKszyhK1iAgark&!VlfxyVb#Q2!_n0S~#aAbT^Vti5( rLLdfV?tf;MtgPVptgQbG>|oJQ7&|&5EI0-#o&+)x$_A^-%K8rgxW7W0 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 zcmWe&;Aa2<4+aK?00stzBnAeCQU(Tw4h9B>ISdR88yFZEjxaDVTw`Ehc*VfL@Q;Ck zL5PuoL5-1t!Ge*2!HbcBA&QZKfrmK@1pYJef+#4CPsz&q&&ZdRl@u8n9UT)B6B8ew z2o;Kt3=Itr4-b!yj06cW@MmQuMMs811cL*kv$Fn!#G*lZ;z1xL2Bt1FB?W2$nEKDa znw1p*vWtr)D+_K~KztHdIx8yxRV*nfDJv@=9A;X0d}3BgOiWTrRybT;Jjku#;o-r7 z(O@w~-mI+f;Nalkz<}WJXpq}LBJm*iCnbeP#>Z!6{b%CN0-2KnB0>IUW`S7G2@M$l DQIvE2 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 5fddf02c0..6a16508c3 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 1794c6c03..f3a0b6186 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 fc84aa0d4..488ac4f0d 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 2c639d3c9..07a46147e 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 77f45d1cf..4f27a6969 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 ebcb35498..047dadc2f 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 442f3b489..3a9678549 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 19cb91557..7106443d0 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 0ac367d1f..ae7894082 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 80f47417a..26a42d539 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 9fb39bfc6..470a58a25 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 9027065e8..2c3f25318 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 b3541b91a..212dd0dab 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 759a0466f..fb0372201 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 c65dfb9bf..6841ce6bd 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 b1c8e6992..f12d3a7c4 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 6a16508c3..1cf100198 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 e1bcd0b62..15606fd78 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 047dadc2f..5f8465eea 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 4e4a5382f..4c84513bb 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 18ca18978..b8043f089 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(1qKENLk0#0Ck6(FU}4g92*-Oo1B%En3R1u(QAoBAIBamXnD literal 142 zcmZQ$;Aa2<1qKENeFg>wX9fm_a0Uj3Yz78~dXNNH783Z+z@L>B5E2#^78Vi>6^Dw2 ogn)!&v$CQSv$DWqK_NjwK|vv5@kn9;0YO1Q0pXEwy{N_m0GTN(J^%m! diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0023.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0023.lmp index 4975a93a94542f1c454f8c52a3b1fe1cbd5af6e3..67c7b74c5fcefe36750a650530445876f10bf569 100644 GIT binary patch literal 251 zcmd;O;9&p(8wLgjcLoNAAO;48WCjL?5(Wl_Rt5%!X$%Yu3mF&~HZd?T9A;o(xWd4| z@RWgp;R6E$12bC|6#NGJeL4uKifrU8>1UMkne-Jk%D+|Pp%F6oBzz>ql%1X(~%8G(8!D7kr@$vD=$qBL1 zk&%f|b)i9_p;6J%5s~3RK`=3pmhh~sED+Ah$^si74lzCystu$hE-Nc56vTjv#Y9HN t#Ky)ZgoH;%CPBqQLqbA9I4m?c7$yeN0x}weVa5kRj1Pj^mIdL0WC2Z_T`~Xw 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 zcmd;Q;9&p(7X}7~PzDBu3ftfct(!)yV$Av7g9DH0|Sot%{w5fc*wcPYr} ji7^TBu_+*1ShBJble4l|*|M^d5);9Whx(KaO8*A{m>p&a literal 350 zcmd;Q;Aa2<7X}6fUj_z-L5ZiLr@^;okyv$EJgUW$#4hL{NRDLcsXksxpW=YRzW E0Gs7)-~a#s 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 f81e36ca3c082a0701c2b9712f7483d1b327e329..2f4b2f9f9688a1c823c8c2378a7544a59e670de5 100644 GIT binary patch literal 263 zcmd;O;9&p(8wLgjF9rsNXa)v`Tm}Y)1_lO(i3|)3a~K#HmNPIgY+_(wILyGnaE*b1 z;ROQ&!%qeV21cf=tgI|fW)PY6pMfPSD>5l7i-RRADsz`z)Y2*?d!*9AibKu-A20C6_d3;>nRPGSH6 literal 300 zcmWe&;Aa2<4+aK?2nGg*Oa=yqY6b>|J_ZJcnG6gJOBfg!)-y0L>|$VGILg4laDjn= z;Wh&U!!rg3hMx=!4BU(i3^I%i3=Aw;V8Fu+rv8KYF_BqW+$>pH0nu4mV1dZ+tSm0p ztgHYK11thk%*mFO6&@QKo0avS1I$cJ&C2@Ej$pDunCV$r|5-uI_(Tws1;k8G12LIF z%vi7}6NCveff2-vj|VXsK+MR(mi}j8&B_W2iiL=PTncti2vh*#K!{&JUI1$W E0Dr++{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 zcmd;M;9&p(2L=X)00stzcm@WB0tN<#Mg|6kNem1Oiy0UgwlFX-9A#i&xW>T1@SK5x z;Rgc)11lo~gAgMF0~2!=2(Yn$$gHgYj9gh+N%8SnNr{O`Sy}%Xc(Sq*V`AbHV-n(H zQ=kG75#ceRDalEZ@lb)#_>`>Bl&q|9m_Sfs7FZxM5vn2rDiE9i6$nkt$_h+ON(_Vv zL?>ru1;)n21jB5JPtM9>2?`DlfSCbuAxJg=WD5&NR#r5~43H~99FS}bNGS)*D*))c BS?2%% literal 343 zcmd;Q;Aa2<7X}7~5C#T@6b1%{G6n{QE(QjMc?=8;n-~}vjxjJW++tv0c*nrNz{JSF zAjZhRpvB0*V8_V7;LFIsz|5Ql0vs$LGArvp6L(ftVr*M`=1~U&V76eik5DwFeRV+R^D~ly4I5-TUE<7(c@%bWdH#k1_lOQ1_lN_1_lOG1_lOu1_lOC1_p*81_p*G1_p*`1_p-z|0l}m IF#Z1z0Drj%0{{R3 delta 34 mcma#?kYQzDWdH#g1_lOY1_lOQ1_lOm1_lNP1_p+SdO83oW&)W2 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 zcmd;J;9&p(4F(1VLk0#0I|c>@Uj_z-7zPH0Tm}Y)ItB)Yeg*~x7M3h9_|L?Vm6eqg z8y}yQmGz&ID=RBGC@d@@COj3&4GfM54-1P($jbW9z>}2~9}ylK8ygiGng|sL4o?Od c6ai7el9d%0la<8*qGLfSm_d?RoDk|i0Az|S;Q#;t literal 176 zcmd;J;Aa2<4F(1V69xtb7X}7~Fa`#O3sUQW+Ss=g(q5dB8lDVNla-Yf5t9TJi;s$kii(Pfii(Mj1F2)=&B}_2iinPh wiH?bhiOS0Q4-!cVkBCo7j895TOwP*s&%~XTm6ZqqSy@^CS=gb*W@Y^c0M))VzW@LL 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 xcmazEQekIcWnf_V{$GWGfkBmlfkB6Xfx(P{fx&@+fx(l3fgzBAfnlPq9sqw61x5e> delta 53 zcmWHF(dA@dWnf_V@?VF6fkBsnfkBUffx(o4fx(`Efx(l3fgy;2fgy^4fgzfKf#Lr| I6+OoP0K{1c3IG5A 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 zcmZQ$U}j)o`2Amjfq_ATfq}t*fq}t-fq}t+fq}t;fq{X6IST~-gXqw#EEGBr$`63j ISy@^C0e<-vR{#J2 literal 140 zcmd;KU}a!n`1Rj{fq}u2fq}t_fq}t=fq}t~fq@}{fq@~3fq@~1fq|infq|icfq|im ufq|i$fq~)we+Jep2mrGZQz^u^tL=0A7Buos!icW&*02}lF|9=2%_bAr@ 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 delta 38 tcmWG=Q($9YVPIhR@n3;~fkBahfkBIbfx(!8fx(7>fx(r5fnlPi8USYs1h)VH delta 49 zcmZ<@(BxoXVPIhR`d@>AfkBgjfkBIbfx(!8fx(7>fx(r5fx(Y~fx(}Ff#Lr|1vSS1 E0HpZ`VgLXD 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 zcmd;O;9&p(8wLgj7X}6fUj_z-a0Uj3BnAeCTm}Y)3I+y-W(Ed^J_ZJcnG6gJOBfg! z)-f}8l@$zTK&=J< DHVZeD literal 236 zcmWe&;Aa2<4+aK?00stzNCpOmWCjL?JO&1aN(Kgo76t}}eg+1HSquyeOBom#HZU+S z>}FtKIL5%haFKz5;Wh&U!xIJu1|H@t5cto{l9d$@ot5>Ui#01NATm5F>pv%3R#tdy zY;0E6e-1D+F*PgeKRbfS24SXWW&LLbG2;_KOcoF`Jq^TU1~Fs7qD&Ab$OJ|ZGd>=~ bWB@TEBf(78tgN6QkYx-kSy>@q2Gnf;!GuS4 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 d14522144268158ebd2c5e9f7b5a6e22ea792cbf..d5d083529c2be86d2171afc9bfb27a5a9d5ccd26 100644 GIT binary patch delta 129 zcmaFN_?U4*h)rN{XlQV7aA;^sR@Q$8o~*2Z(CFysn3%}GB&YyOd=?l4#)AY{va&z| z94uK`!4oG)T7gu@$0Wta!<2`IhlhrTM#slzWM%zlQGjV`T0u%oMK+-NUGBP+gG&DXd>pufeR#rf0XlQ6~aBy%8l0bN9Xn1fUR3Hlp G{09J>N*b*I delta 74 zcmZo?Y-gOH&loh(K+-NEA|fa#G&DXd>pufeR#rf0XlQ6qP*6||l0bN9Xn0T}R3Hlp G{09JA|BP%|S&`wP;aOQ6ELmBBAR#7}EHD5GfEfP) Dy^}6k delta 128 zcmey&_?dA+fLc&!cwkIc)_(?`tgN8KtgN7jn3#xor~pfRR#s?4Ohm-QGClvGn5--o zn9}g@h-i>9kP5Kg@Q8@$h{UWcmc*>A|BP%|SrOr(;aOQ6ELmBBAR#7}EHD5GfEfP) Dxc)9m 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 VGA2GTF)=YdJ`JRhCkqAq2LOJ5Asqk! delta 87 zcmcc2c$sm6t87qEctmJSR@Q$8j;ySph?wxucqk_#K4M~$lYUTmcyvrmL_|1PoF^+Q VA|^gDF)=YdJ`JRhCkqAq2LOBqArb%p diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0035.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0035.lmp index 4d98ea367f1615adbf3aaa9131e9936bf5965f12..9b45ff9c36ac58b59dc4e715f0d8bbd9af798b6e 100644 GIT binary patch literal 241 zcmd;P;9&p(69xtbR|W=#Fa`#ObOr{73I+y-P6h^sSquyes~H#=_AoFooMm8OcmPt& zlZ68QGw@_(g@#8)M#f}ig~nuMfdv9XgF`_a7MK7_XncHdd{!2cKvq^Dia=ym77Iuq z9%=?iDM&>qOdv2aD=RcKGCDdDsvJ~u JDjSsk4*;CUNm&2@ literal 241 zcmd;P;9&p(69xtbR|W=#Fa`#ObOr{73I+y-P6h^sSquyes~H#=_AoFooMm8OcmPt& zlZ68QGw@_(g@s2(M#g4kg~euNfdzuXLc%~C7MK7_SbTg)d{!2cKvq@|ia=ym77Iuq z9%=?iDM&>aOdu#SD=RE4GCDdDsv;ydD=R!aHZd_3B*2oD6&{J~u JDjSsk4*;mENp%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 delta 172 zcmaFO_?mHodwpndaBz5ZR@Q$8o~*2x@bJ*^@W>drKyYGWVrY1HbZ`t*1xtKZ7Kp1bVw{z1xtKZ7KpI zV0>0qKq6E{U`ke2a8gzl3rqz}AOI#18l4g!8WSHG3Ks|u4Gj$r4i1mu%F6oB$d#29 K9g{Tif;a$GRyS4v delta 148 zcmaFP_?&TqdwpztVpdjcczjmYe+HhctjO5t=*Y;}knm`zKzMX&d}Mrbdwo%F6oB$d#29 K9h*Gyf;a$Od^dOi diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0039.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/0039.lmp index 09fcfd9ba69ce721a856245e5119be5762163e33..51dca4479345237d5954e0f4a4014c1466306cec 100644 GIT binary patch delta 167 zcmaFC_=0hQXMI{qVoX+6R(N7o)_(?`tgOVel=$extgKL&KzK@0e0)+?RxnH;I4vtH z7$lGc)e@MNmBkVd5d@n75(tig2!aKI6BA=%BBLY2P{{Y1`AO-*c literal 112 zcmd;J;9_84`148EG*|$n2c!Z-|Ns9V0ABzf)Bpeg 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 b72431f9dbf3760499278abc334d1bae072fb9a3..3c359ff41f5fa5609b2c617f6786060708548273 100644 GIT binary patch literal 129 zcmd;J;AUW8`2Synfq_Ajfq_Avfq}t}fq@}_fq@~3fq|izfq|g`q=J(%D=X_iBU4sZ zRu(%;R#sM8R@Q$8maMGEq^vA9RuG*E6$wp*h=eAlKt%%Mv$EJ&va&!l%nYze|NjF3 DZ6PFP literal 119 zcmd;J;AUW8`14fpcSy}&?*t4?2;}c^+qKup%c6=&?$H1MH6&@Lxnw1)x2$E%B t&B_W2ip|PmW6jD+PfO3r`p>|Ul@$`3mBr4Im6e_d5@5~(0S*ZD9{`5LFMa?3 literal 186 zcmd;L;AH>-0|o{LGX@3*I|c>@4+aK?5C#T@BnAeCA_fMAb_NE9Squyes~H#=*ch|2 zvi`F&XJv(FW&LMi&B_W-56H^;&&-~c6&{}$3le4G1hL~&Av{KI2rnx&7A(uamX#GA z8JU`u#m<(Ml^&Z2(!#)+l@$~eo0Y}Enw6EFmY$XMpMfPSDYFi!vg literal 186 zcmd;L;AH>-0|o{LdjX$%Yuix?Of)-W(IYyl}`&H@20 z2=$+VB`Yf=HYpvrRR#td?L}FHSe0p+L)_*3>tgNv3sF=i55RaKXD=RE6F*PMC>pu%CNE1j8 QD|1#BNQ8|sD=X_i0M|D*z5oCK diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/003F.lmp index 132acc43c246ac84d02904fde3eb9bb2ecf5854c..f682a107a86543854a63623ec4d2a1bf293cf644 100644 GIT binary patch literal 252 zcmd;M;9&p(2L=WPPX-2tAO;48Xa)v`90mr4S_TG&J_ZJc`3wvU8yFZE4l*z>oMT{M zxXr-8@PdJX;WJ1hOBNXXXJE<7icZYR0y6@WK@6U(tiX7%ESUJu02PRiPs~b8f~p9J z$jS^YND>^T2h literal 236 zcmd;L;Aa2<0|o{L7X}7~2nGg*90mr41_lO(DGUq@D;O9Ub}}$9oMK>LxD8UspM?(o zGw^3+#Uw&Oe0+RjRu)(+G(ILKCOSGgIwCwG9wrt86^o9DhKWVT#K%MR$0tG6MI^$l j0WtqGuw-S0CT3-ELus%;U_3+sL}M2K83NJ*qW=Q`4_!)( 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 zcmd;O;9&p(8wLgj7X}6fUj_z-a0Uj3BnAeCTm}Y)3I+y-W(Ed^J_ZJcnG6gJOBfg! z)-fOcc|2bH)vI3&Bvi@^Itp)%q Cw>Ojk literal 236 zcmWe&;Aa2<4+aK?00stzNCpOmWCjL?JO&1aN(Kgo76t}}eg+1HSquyeOBom#HZU+S z>}FtKIL5%haFKz5;Wh&U!xNAJ%vm7tpMfPSDpuf)R#s3Dn8lWr6&@Lxnw9mR z5yXs-2QisI%-BQ_lNrKH&&vAG0%E48ftaiyW_%)u$p&J^f|=|PCP*6xg2@SH#)53) aV$I45hz!rl`p?ahl@$=3mGz$o>NWtZy+?Kc 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 5ed5da4ddb5756ea0c8b9c420aad0371f9b609d9..f369520997db7158136d0c9b280792ea429ad2c2 100644 GIT binary patch literal 218 zcmd;L;9&p(0|o{LM+OFlAO;48WCjL?5(Wl_Rt5%!X$%Yu%NZCLb}%q7oCGOk$pQlo zDE*&-B`Yg5F)Irs0HVPHf$ISdR88yFZEjxaDV+yE(L$pQmz zDE*&-B`Yg5F)Irs0HVPHf$hIIRgVj0|Ns? fCj$e+BnAeC*%Ni`xFWN%{xh&-WwAt0OjZW~%ODNl 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 delta 259 zcmX@iw3msUpFxm;fq``*yJEyf1_p-13=9l+7#J8nF)%Q&Gcqv9F)}ddF)}dlF=v6m ze;(GXtgM)rtgQcB>{(e^iP7O8HU}q&9TOfH7@d{%pPef!D={WKJTy2lD=X_i+r$Qu zR5tdkteD7XumB@ZR#rk>a#nOah?|x5pMf_kDjMU|=Xs)W@Uv&$7N*&het+6Mn*@2Ec*|&o{b0O_UM@CnCQrGkn!x?Sy?HG R@rfV=(hc$h#C#C>9{?{sW^@1m 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 zcmd;M;Aa2<2L=WPPX-2tFa`#OR0aly5(Wl_Rt5%!ISdR88yFZEjxaDV++bi}c+J4T z@P~ncftQhiL5`7ufrTXt4E{55WMyR~#m6UQWo7+m>S;2`gf%vQ}4yanNg^?glAWLAj Mft&(T0iyo{06G6%4FCWD literal 343 zcmd;M5MlrU2L=WPPX-2tFa`#O90mr4W(Ed^xeN>p+Zh-b&M`1BJY`^D_|3q;Ai&7L zpu)(&V9LnA;Ksr zF)1l2D~p#UD=R4>E9*Z4PgYh^N=ix!h)B=M;$_Xsiik@F$?#@n#iXQxbjKtmC1z#u zv1DZhf@N4hGFe$1Tv=J6Nr^Eq4J=t%ktq=2z?j6Om^g?zAZ;;OSsa{T)p2o2aUjz{ zqKR2q92{9$fr(iOs7l$hvVs#qHfQ~304a>m%HjagiBO%9Ae|uV;-LZ{wICHB`ab|j CT4}TZ diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CA.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00CA.lmp index 1b90d3d2103d27cd7ccbeac1d7cc68db70237984..2fafebc108afed8d739be37780a6d1ced3de7528 100644 GIT binary patch delta 138 zcmdnQw25g#M}1aSXjW)se0(?v$7E&wXXMYy3XRT+Ow7s(Pt3{+j?c>a&mfSM6&{?G z6`Yin6`GQj6$ldy4bRF7PRz;*P0Gp&OoZx=2?r~JD`eu!%8CICfs}xh|7YgSf*3uS HolzSAUL-UF delta 138 zcmdnQw25g#M}1~yXjW)se0(?v$7E&wXXMY!42{l;Ow7s(Pt3{+j?c>a&mfSQ86KRO z6`Yin6`GQj6$ldy4bRL9PRz;*P0Gp&OoZx=2?r~JD`eu!%!~mGfs}xh|7YgS%mf=f InVnG^09mdx^8f$< diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D0.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D0.lmp index 8ff24b7e3f89219404d11f501e46125b3e0a2e6a..f8cfb111468a6d9b6b15a784d8909279fb657338 100644 GIT binary patch literal 333 zcmWe+;9&p(9|i`7PzDBuI0goWdTOt;h~|yAcrw>Wo3nj27*9z mR@Q$IHz_hQG&ndqDJ$zg6Gv87R#JR?QdU+L*t;N;{sRD>Cum9l literal 339 zcmWe+;9&p(9|i`75C#T@7zPH0Tm}Y)ItB)Yeg+1H1q=)f8yOfF4lyt=Tw`Ehc*DTJ z@Rxysfsc`aL7tI;L64Dv!IqJM!HbcBfrU8>1pb5Qh^(yt3_Mv`8Ch9b(IC+*s6b3o zR#tdcOiWB7R3I=hD=RcBIx;#QCJ>*M6`U0v8ICLvniU@t8iS-FJS!_J5G=r+l@$;J zwuOTQ!u-zwWw0`4Wo4m=2F61KLScr7M#h7j7Yes6F)}mCuL>*XX41p%1VllPXc+4g#~0zR@Q$2c}-~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 zcmd;M;9&p(2L=X)Kn4beBnAeCVg?3=76t}}sSFGZ%NQ6KHZw3V9AIEzILpAmaEpO~ z;W+~X!xshyhW{XqJXt8FlekN{6sR%m1j$b`rkke$pt zSy}PX(I6McCxQf6xU#ZhVqy}Lk`iOGvi^g(N#S6(fDB~i$jZt}OiWA!+0V`bGAAqR FKLAhfZzBKz 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 zcmWe+;9&p(9|i`7PzDBuI0goWdTOt;h~|yAcrw>Wo3nj27*9z mR@Q$IHz_hQG&ndqDJ$zg6Gv87R#JR?QdU+L*t;N;{sRD>Cum9l literal 339 zcmWe+;9&p(9|i`75C#T@7zPH0Tm}Y)ItB)Yeg+1H1q=)f8yOfF4lyt=Tw`Ehc*DTJ z@Rxysfsc`aL7tI;L64Dv!IqJM!HbcBfrU8>1pb5Qh^(yt3_KuiR#r5Gf(XPUWo3nD z#l*xULRADNW@UwDMMp-*!vx~9vVyasBg2seLbKvyLSv9rglA=C1%d_Gv$6tWz_xI( zK$!m-pbS>VtgI{)(ZG0!Kq$=c(8zd@^FraaB}RsahlhuT27?^P$d#299vTP&(OFsl mLENOs$k5>6=%lQy|4bZNSy@T(@kv=(S^rsBK;~p+{RaShGic-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_6qi28MeK3=HoX7#MytFfgz)GB5~EbgYTt$;t{$%F2oi&&rBV%*y)D zz>}2~o|Kgp9hsOF9t#!7%F4=0i42bkkITyX&&r;a6%!dA9s^~kMMp-aWM%zlW6jD+ QiI309`p?b`(vbBZ0C9^dyZ`_I delta 124 zcmbQqG?Qt9j_7#?28IU=3=AI`7#RLCFfed3GB5~FbgYTt$jS;#%F2oi&&uLt%F4>h z`p>|Vl@*?pl@%QslNFx`6#&VkM25$N$7W^yXJyaIiir#lkAt$)q9bEK3fWk*va;eq JW^gcqNB~3HDklH{ 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}j+S^wEsvcTX! E0N2D4y#N3J delta 51 zcmX@Ye3*HI8KZb)cz9@FU`$rle+HhctnldQ$k52>$k55YjOqMY(a}j+S^wFYvq0cK E0Lq>ceEyoPx~GgC&!#8yKPxx_AbYygVOms|Sd{!1%ATTmGFgQ3g zJUj*}5D*+15EvL37z`5#4~>itjgF24YhmVvni&qI|1&XXWrb&Dv9o4n1%j0@vSek2 zM`mTQv1erkhDV2j%wgcm$_k2%&B_W04Gj$j8_mF`&HWlR1 zfXLAJERf5RK<;AA$_fCvkc%xVD?BD91ti9jl@*YfmBr1Pl@%JD2ohn=%8JR#;sMzY V*2M%ejh8tqD>5tVKOdO)9{@))Yh?fc literal 331 zcmWe&;A3E5U}ErKU|@)3U|`5%U|^_bU|{HBU|^Wbz`(GMfq`K+0|Ub;1_p-P3=9l! z85kHC7#SEu7#SGU7#SGM7#SE`7#SFtc(PEye~>_AbYygVOms|Sd{!1%ATTmGFgQ3g zJUj*}5D*+15EvL37z`5#4~>itjgF3lYXO-W4kEHZS~#+@;!Lp28Sy|!nS%Klv zp&;E1JXu+R(OChZp`pQG;~03evI0T;;LzZ}!04>3{|tN}g90K$i~hGArvp I5198K0F&WmWB>pF 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)_#28LA(3=CTt7#I#PFfd$ZU|@L0z`*dGfq{X8k%2*SqOC_9UshIR zOmuW~WOR6Bd{$Og)_(>*5Cy@3@$rdSS^qiMva%u*6H}nfn1sY6G=`o? Pq@=|7nE0%$iTB+BTH!9k delta 137 zcmZ3*w2WzjjN()V28I<33=EqY7#Q|3Ffd$XU|@K}z`*dCfq{XAk%2*UqOC_1PgYiB zOmuW~WOR6Bd{)+f2EHsf2#g0Y|8uZqWkn_?CS_%TnK3CzDQF6#lfeoZc(StMQ<4&s Nk`m)%;wL_K2LPGREhzv1 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0025.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0025.lmp index f81e36ca3c082a0701c2b9712f7483d1b327e329..46264c2214bd37e920bf1bf40560ec4ead5ecd04 100644 GIT binary patch literal 281 zcmd;O;Aa2<8wLgj9|i`7cm@WBVg?3=b_NE9nG6gJOBfg!)-y0L>|$VGIK#le@PL7V z;R^!;0|z4m10!=52ynB2$gHgY46IpM(TRy!SzN4HS>ciKP@&+Mn5-;Lwydn^$mm3< zSWJ9;Ru%_aR#tFuC`b%y6gyj1R$yQtNQ4c<3=Re{S=q9(BBLWgOcu7RtkCdq5R;iL zD=Qq#|J_ZJcnG6gJOBfg!)-y0L>|$VGILg4laDjn= z;Wh&U!!rg3hMx=!4BU(i3^I%i3=Aw;V8Fu+rv8KYF_BqW+$>pH0nu4mV1dZ+tSm0p ztgHYK11thk%*mFO6&@QKo0avS1I$cJ&C2@Ej$pDunCV$r|5-uI_(Tws1;k8G12LIF z%vi7}6NCveff2-vj|VXsK+MR(mi}j8&B_W2iiL=PTncti2vh*#K!{&JUI1$W E0Dr++{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 xcmazEQekIcWnf_V@?V94fkBmlfkB6Xfx(P{fx&@+fx(l3fgzBAfnlPq9squ@1w#M; delta 53 zcmWHF(dA@dWnf_V@?VF6fkBsnfkBUffx(o4fx(`Efx(l3fgy;2fgy^4fgzfKf#Lr| I6+OoP0K{1c3IG5A 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`2Amnfq_Affq}t-fq}t^fq}t?fq@~6fq@}`fq{X6H46g%gIJ-FiCI}- XRzNhI6%J=bCqZQ+W8$GKu;%{&;^7`i literal 140 zcmd;KU}a!n`1Rj{fq}u2fq}t_fq}t=fq}t~fq@}{fq@~3fq@~1fq|infq|icfq|im ufq|i$fq~)we+Jep2mrGZQz^u^tL=0A7Buos!icW&*02}lF|9=2%_bAr@ 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 delta 38 tcmWG=Q($9YVPIhR`d@*8fkBahfkBIbfx(!8fx(7>fx(r5fnlPi8USXq1hfDE delta 49 zcmZ<@(BxoXVPIhR`d@>AfkBgjfkBIbfx(!8fx(7>fx(r5fx(Y~fx(}Ff#Lr|1vSS1 E0HpZ`VgLXD 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 zcmd;O;Aa2<8wLgjR|W|HUV0V7*hR(uTDTn3QZ=opY% L23D~BSy}%90MI&& literal 236 zcmWe&;Aa2<4+aK?00stzNCpOmWCjL?JO&1aN(Kgo76t}}eg+1HSquyeOBom#HZU+S z>}FtKIL5%haFKz5;Wh&U!xIJu1|H@t5cto{l9d$@ot5>Ui#01NATm5F>pv%3R#tdy zY;0E6e-1D+F*PgeKRbfS24SXWW&LLbG2;_KOcoF`Jq^TU1~Fs7qD&Ab$OJ|ZGd>=~ bWB@TEBf(78tgN6QkYx-kSy>@q2Gnf;!GuS4 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0030.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0030.lmp index d14522144268158ebd2c5e9f7b5a6e22ea792cbf..62e3543edc4de69d18c32c0ec4993e6af8f2c564 100644 GIT binary patch literal 287 zcmd;O;Aa2<8wLgj4+aK?2nGg*ECvRK8U_Z22@DJjOBfg!wlgp=oMvEPxX-}A@R5Om zftitkL70(&frUK_2L3Z~XJut2CZ(mNB_(EMW&LO5&B{uPj*gCwiHVL*%z%o-L`TQR z$HzxTMy6zC{b%3@X-P~>OauugCc(sF;^R}m2FJvwq=D42W@Saj#Aju3v1VmOgBW0~ z@o6a;Ss)M@9Szr-l#-T`l$4klpO^^J3UWqtczAeZcxZTdcp}spX)!S|G4U}mG0`A3 O5U0n3Tmg1EvbO+E_*{?x literal 227 zcmd;P;9&p(69xtbM+OFl00stzLT1 zz{HUS2mcwlva+HfAU-SWKLbxzR!~S-SV%}nSXe4lARsI{IyyEsGAJ1;z!DEJAPB65 zB`XUgz`>H06#^FE$;x6$gs2FI34n}dzDE%J*dtX7) literal 135 zcmZQ);9&p(6$Sp8yOfFjxsPX++<*2cnea<$iN`R z$iSe*$iTqCo&^K{8CaoAc8;v9#K_3#=)|lnuxNZ@QdSllXI55XOiVOXm_I8kIzApG z6de;C84gy;pOqCHos^Xo8X1|G7!6|mXW$2M6SJ}c6H~IX0>a}#MuNm*5x?f?J) literal 243 zcmd;P;9&p(69xtbcLoNA2nGg*Oa=yqDh39IZUzR1ISdR8YZ(|A_AxLpoM&KQcmz_+ zk_85AY+x!YE9*Z4PgYiVd{$OgP-u8y3{)T}F)J%5A|@sx9xA{RpOqCF5fc%Sgd`9U zla&>ih%6AFmBkVb6#y9)6qA+30y8u`JR%xoAjm9;wGk1~5s6t@EFd!&*|M@C!b8Ke SvN%|v#xg-&3ladi_dftnT}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 zcmd;O;Aa2<8wLgje+CAIBnAeCQU(TwP6h^sxeN>p8yOfFjxsPX++<*2c+0@R@SlN! zL6DJwL6MPxfq^v(0=Qs|{~)3G#H6e&kWgeyQdSmNC^#A_6c7m(;?K$o1hK%{(ZoW- zld`e`K*WCrkU9`65JUunbb!S|K`gKVU=~;`93&PR8K0Gf5KD><2Z2Zs0kW5oH!CY9 zJTx>oI503UI3_FWKS(4cCI+M~GCU?FE9*ZKcUD$bQalKxWMyUjXJH3B5=8t50B@3C A{Qv*} literal 233 zcmd;P;9&p(69xtbR|W=#Fa`#ObOr{73I+y-P6h^sSquyes~H#=_AoFooMm8OxC2tm zk_84FQ2IXuOIB8RL{=6^AT%i}3oH;A0}%*^3&cYNLK8tMc(SrsV!*~^K~z8mK!R|A zfS9bTprov<@HD8FpqS*en8dW?B$z;GOnhQuVlqU4kt-`JIwn3IB$So)pNRuvK8XAe E0Q_J_r2qf` 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 zcmd;O;Aa2<8wLgjZw3a2CvhgSd%_NlA%GDJdx_=}>jS(J}FfNf3|* k6N`z7k55WU1lg1X6^n@nS)7uRl9ZB!Vh7ZMtgNj608|xQQ~&?~ literal 211 zcmd;P;9&p(69xtbM+OE4KL!SdXa)v`3pufeR#sqOU?2+%3kyUaPgYh?czAS7OhiODOiM&ed}3l^VtjlW$YiJ)ApIcx9{@`M BKHvZV 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 zcmd;O;Aa2<8wLi3U}qOng=rSU5a9JUlcq93mVL7!4BU z&&rBUj7dxk50B5v3J8XYMaCp$Wraq9#KL2s>Ox}@v$BGt6SJ}cK#Kn}@MmQOCnjZO z1;&FEL#zRbfw;lZ@mX2%ARQ2O(MefZ;gOMviP0d|e+Is+tmydotgOVC=$Pop@WjOb m46IpM@gU>aI6%TN(GblrkFm35WhF*NCT3;*=U{<&_CEm9DP?y6 literal 241 zcmd;P;9&p(69xtbR|W=#Fa`#ObOr{73I+y-P6h^sSquyes~H#=_AoFooMm8OcmPt& zlZ68QGw@_(g@s2(M#g4kg~euNfdzuXLc%~C7MK7_SbTg)d{!2cKvq@|ia=ym77Iuq z9%=?iDM&>aOdu#SD=RE4GCDdDsv;ydD=R!aHZd_3B*2oD6&{J~u JDjSsk4*;mENp%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 zcmd;O;Aa2<8wLgj4+aK?2nGg*ECvRK8U_Z22@DJjOBfg!b}%q7oMB*Kc)-BG@P&ba zfs2uWL4lEhfrUK_2L3Z~XJut2#e+afR#w)3M&7Kfl$e<4@bK`+@R$^+NKANWXmD^~ zU|?`eR@Q$8{;aGdkP48R@bK^?s91PpQdU-IWITv~iG_m10zm|r1=brJos^Xo9+Q-n z6`csO0c0LTEIKhOD<%mp77tPq6B8ew1QBD+$_h_R%F1Hn$jXY2j){o}t7Of}iie4U T`~lMSpMe$XMRqnQBkMl^hLd7t literal 235 zcmd;P;9&p(69xtbM+OFl00stzLe+N0I;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 zcmd;O;Aa2<8wLgjHwFfV00stzC8CbKj662GyvcRmE7#J%Y!Gg<%N5f>JAuRr^tQZgrVit(}&%mFR zl@uKr6B8319iNzz0@A_Amz5Qd05GAXm`E4^2{G|zWo0GB#K*_P$0sI&L|C{%M#Axb E0Koc8EC2ui literal 188 zcmd;P;9&p(69xtbTLuOOHwFd|9tH-6xeN>pYe9-x zvcTX!14~v`WO7y(m=Tr;Wdy}T87wdn7O)6URu)JEtThXygeNO2C^|YiJ~lZy8LX5i lD=R!aJS;pcIyn_&EF*VTR&;c1d}3lMn9sxo(+r~j0|53RH*f#| 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 zcmd;O;Aa2<8wLgjUj_z-BnAeCQU(TwP6h^sxeN>p8yOfFjxsPX++<*2c+0@Rz{tqJ zAi~JNpvlO&yJh!r27l9lzJkuNPRJ|-qQB`YN+CNd@| zE9*Z4e^ypfJQ&18M#jL!Vq#)KLt~<&LqlWYVd?@Spvq$R#rR+Btb+&BVnS^ z(J?XcP_@BeQ3n33ERbM)JV-ncE*2V{n3WY7nUa+ifDi+*z)Bz{g7k)i#6lzEv$7Ck zNzsv!k>TNqiHYIiV4HcfvSPwRLxY0@0|SF&KrZA3yE-~NJUlWS!O4g&pd{tgQb48ZKao literal 232 zcmd;P;9&p(69xtbR|W=#PzDBuGzJESas~#54h9B>nG6gJs~8vrNt6Hp diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003A.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003A.lmp index 65609d3f2b7c45129167140077f0fbe89c450a50..772fe07a567f425b693e1529b5195a38276c1d4a 100644 GIT binary patch literal 125 zcmZQ);ALQ7`2Sypfq_Alfq}tOTW(R#tRk jVpbLhi~$x3j){Q?1xLqZWr2la;^U!0Ai4i&=KKc$Fuo)e literal 112 zcmd;J;9_84`148EG*|$n2c!Z-|Ns9V0ABzf)Bpeg diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/003B.lmp index b72431f9dbf3760499278abc334d1bae072fb9a3..61b0a858ba6f560d1ba46c4608ebe32588782291 100644 GIT binary patch literal 139 zcmd;J;A3E5`2Synfq_Ajfq_Avfq}t+fq@}}fq@}|fq|i#fq|h5q=JVrD=X_iBXbrA zaI%8P)U2%k46IpM(TRy!SsZL&Mm$t3I3@-n791S|6N`zD&&uLp&B_8x!p(vh`Tsuv D1bHZI literal 119 zcmd;J;AUW8`14 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)nl28Qhn3=F3k7#Qv|Ffe>(U|?WpWMGhHWMI%|WMFV&WMGJ3 TWMIgd=xWBoz@L>hvF;lHo&yY> delta 62 zcmey$^o41Hgl-=L1H&Q)28L}63=F3j7#Qv`Ffe>#U|?WlWMGhDWMI%^WMFV)WMBwq SWMIgi=xWBy$d@v){u=<0hYTSA 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 zcmd;O;Aa2<8wLgjHwFfVKn4be7zPH0bOr{7A_fMAS_TG&4h9B>$qWn(^B5QyRx&U! zY++zv*ay8Q8M2LZf36v$Fm(vSnq($3%meOl(}FtKIL5%haFKz5;Wh&U!xNAJ%vm7tpMfPSDpuf)R#s3Dn8lWr6&@Lxnw9mR z5yXs-2QisI%-BQ_lNrKH&&vAG0%E48ftaiyW_%)u$p&J^f|=|PCP*6xg2@SH#)53) aV$I45hz!rl`p?ahl@$=3mGz$o>NWtZy+?Kc 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 ffc3e01efd506436f5e918f2e05658b52fc6916e..13bd903ad167180b83da091f8bc18e412d8122c3 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/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 zcmWe;5Mf|oU}XqlU|@)0U|>jNU|=X>U|?uqU|^WQz`(GOfq`Ko0|UbW1_p*J3=9k} z7#J8B7#SF(7#SFh85tP785tN-85tNV7#SG47#SF5F)}a+GG~Fne}2}itgMuztgQdM z>{(e^Nl8f{HaBNhR#swSVq!dq$H@(nNl8jdOiBdtIe4u0 zXJthsWkn|e zvO=Tdvf{&|6JhG&DRsJUlWSx4+S6*a7aL03nKsj2LRa7gI)jt literal 411 zcmWe)5M^LsU}FeiU|@(~U|>jMU|`5&U|^_WU|{HBU|^Wbz`(GUfq`KU0|Uba1_p+w z3=9na7#J8N85tOi85tOS7#SGS7#SEU85tP585tOan6p6OzW{4iR#r+Y!F+bEtgP_(nCM6dmkDAQI|o=*bPPxfqd-;o;Ho@rjAyF){HVtNz2>!vhXJrLOgoi>vc*Nu)#&-bEBNCAS delta 47 zcmaFB@_=Q+Gp4k(i7#^GVq&7h!^0!PW8#vsvi>vhXJrLOgolO(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 zcmWe+5MlrU9|i`72nGg*3(9X!fz`~vd1OJ)0v$C?%lG4)BlG3uWvi>vjW@Ujm zDVgbsiHT`Yk;IIow3M`zl%%BitgQbG{8?FvNhxV*DJdyQiHS)mP_g)wq?8npaUgM! z7+Y3WbW&nURu(5)R#r?JNK$|aWc7ar)~u{ZkPH_`R#r@6N_rO9V325hN>&y~G(0gS z1!6R7R#rGnZDf2(dP+LTaJVRYR#tR0$lk2~3?Lih;}fAa#>XUqRI+7d#e*#eI|Hot yKO<{aR$@w8Ru(5~R#to>$ab(0$VP||$X84(AjzyOP7nDMpv%a>;K<0p5X#8Fkj}`!P|3)^(8>gsO`Mi3Ns6hKGlTCqc!+~ zn5--$vG|m%EU;K0TwO3oEIK+VD+@_1F$L;0s2E#TR(L!}kdrMdD+#O`?C6+yuxM6N zOd`k$V6mi__?X1_n3(v)loXI-75gRu(&B7K%6<$SjZq zCtFrlQgk%T(wO*okZ4v?Od`lhV2>rm#K$DY$Hc@Zrlf$>G4f_*CC0=jCV@dpR@Q%z oNLoyMd{RISdR88yFZEjxaDVTxVclc*VfL@RxysL4c8g zL79<(!I+VO!I_bPA&`-QA)b+eA)Aqbfq_2@9sCE0MaD!&Mn}hhL3~ygSS&O=G&D3E z1R^72pkl$1AW^VbI80r1d}wTZe0+RpTw-DpR9#k9aAHbUR#s?CBFMh~OsrX1p&$_s z)~u{ZkRYm1Xgo+KSXF#VRu)KAD2M@31(E~_MT1NL3x&rdK~zD7xU;gtqd`{1B&B3! z{b%CN%8HJOiI0y@0`r+Uv$DY61DgrrfgBtUGWS0VdsbFTOiT<&A1f=!wOLtN{{hxH Bb$BGA&ZfLp^TA%fq_2@9sCE0MaD!&Mn}hhL3~ygSS&O= zG&D3E1R^72pkl$1;o%U$$Z(jt==kV(Fo;P^OoFP*%8E<`TND`&qW&|nWMu`$XJv7M z=)|lnh(HWPAQ&!?2oVT`3qVzbg3JY(5t#y20df#XAO{(e^iP7O8HU}q&9TOfH7@d{%pPef!D={WKJTy2lD=X_i+r$Qu zR5tdkteD7XumB@ZR#rk>a#nOah?|x5pMf_kDjMU|=Xs)W@Uv&$7N*&het+6Mn*@2Ec*|&o{b0O_UM@CnCQrGkn!x?Sy?HG R@rfV=(hc$h#C#C>9{?+cW^n)j 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 zcmd;M;Adc9`1{|1fq}u3fq@~6fq@~Ffq|iffq|iwfq`KT0|Ubb1_p*B3=9l67#J8{ zGcYjxVPIh3Wn^HGV`N}pVaWo6|4bZNSy@T(@kv=(S^pWiva*t5z#s+6jf{^^OiW5j z%F6oBz>}4gl#-H?0wU6(0x>CRAcJB+DtMVd%>N85Sy?eDSy>$HSy`b;=~?k0r7T%l zkx;R~n3N=t@gQ}9F>rM$U?W+wvH}ycvN+fvG*l~C8B11Ha3V|~J}Zj@supZvBuEp; O5}0iur+`#|=>GtQdS3|u literal 446 zcmWe+5M=-X9|i`72nGg*3lqjr&M+`AykcNrU}j`skYQwCFkxh1 z@MdISNM>YUs9y8|tXWwxiK!q-wydn^q{Ni0EKc^UteCVEkQPCftgKM5ENfO) zBuJ8r8>As6IUc4BBoUvIl?9RrPfSTpiBE)>$C{ND4%Weyl@%GElAM^Bk_fT~F3y>i z6&;WhJJhWo2=) oW@W`E#)AR`Bn0v;L?|UI>pv3a&mfSM6&{?G z6`Yin6`GQj6$ldy4bRF7PRz;*P0Gp&OoZx=2?r~JD`eu!%8CICfs}xh|7YgSf*3uS HolzSAUL-UF delta 138 zcmdnQw25g#M}1~yXjW)se0(?v$7E&wXXMY!42{l;Ow7s(Pt3{+j?c>a&mfSQ86KRO z6`Yin6`GQj6$ldy4bRL9PRz;*P0Gp&OoZx=2?r~JD`eu!%!~mGfs}xh|7YgS%mf=f InVnG^09mdx^8f$< diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F0.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/00F0.lmp index cf2be1ed35bb6daedde4c686a5fed94eed208d34..730bbce6f6c91c280d58bb05a2f056935274ee82 100644 GIT binary patch literal 333 zcmWe+;9+23`1{|7fq@~Efq@~8fq@~Pfq|icfq`Kn0|Ub%1_p-B3=9lM7#J9?GB7Ya zV_;zT&cMLH!N|ZM$;iN_> zWo3oNB*w%fLRADNW@Uv&M@B}+!vx|X0^ukEF)=Y9bHHW<#%E=LWCLNg1jJ-zB_?KN zfoQM_5Cdc-i2l#Ol9dJ0!oiZ26$&#nG%_BfAQWT{SW9ALczAetXlO9VVT@c^S>d69 oAP}9E^&iAdii`{m4vtRB%KFd5k(HH|6d#|Im6ZkdF36<+046zVMgRZ+ literal 339 zcmWe+;9+23`1{|7fq@}}fq@~0fq@~Hfq|ipfq|i)fq`KG0|UcG1_p*h3=9m{7#JAd zfK)RuFz_)lFvv49Fz7KdFxWCOFnBRCFt9LZfxv$d9g&swpMfVUD-% z%E}7QiiwFygbD;EW@UwDMMp-*!vx~9vVyasBg2seLbKvyLSv9rglA=C1%d_Gv$6tW zz_xI(K$!m-pbS>VtgI{)(ZG0!Kq$=c(8zd@^FraaB}RsahlhuT27?^P$d#299vTP& o(OFslLENOs$k5>6=%lQy|4bZNSy@T(@kt=hv9N&5$;$c<01ZcK-T(jq 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 zcmd;M;9+23`1{|1fq@~Afq@~3fq|izfq|igfq`Kv0|Ub{1_p-B3=9kh7#JANGB7aQ zVqjo+&cML%g@J+LKLY~;15XwT_zx0@j*p3tkB^CoNzBRu3j~LShlhuUg#^XJ1VTc> z!@|PDLSQOllEM=clfo0@VFFoM0g+i*f$<>I|1)u9Wd+1Qgdm(qWKK+0Rxrq9kh0Lo q(BNpuVqzg6r2 literal 349 zcmd;Q5M}@Y7X}7~7zPH05(Wl_9tH-6B@7GDM zpvlOj7z#yE34g3d*M@C0R$Hzp+#Kb2gCdS9dCuU@T#RDUQ1A~J@ z!^6YF!o$Nt!jiJGz~TYHp#gz`fq}sw@$j&4n0Rz#Y+P`3Tx@JoWPDOmVp0;+9FWBz zMOj(laUgb9R@Q%JmaMFRq^vA%5FL*u5S#)NNQ9^eO#}(>WMzd$rhrU{i~-rn%#)QB z9~}*HaeN|3fQ2h7D<&o;F)1lACM)Ydh?^7+b_>WrR*tN!ti;5`M3DXLEFg2Tvi<`A DOX_bR diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0110.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/0110.lmp index d4842663efb90b349696d8b9ddd877b8a76b817f..d69534d77b0e812d9783e963808788929b25a150 100644 GIT binary patch literal 405 zcmWe);Aa4V00stzCDMpv%a>;K<0p5X#8Fkj}`!P|3)^(8>gsO`Mi3Ns6hKGlTCqc!+~ zn5--$vG|m%EU;K0TwO3oEIK+VD+@_1F$L;0s2E#TR(L!}kdrMdD+#O`?C6+yuxM6N zOd`k$V6mi__?X1_n3(v)loXI-75gRu(&B7K%6<$SjZq zCtFrlQgk%T(wO*okZ4v?Od`lhV2>rm#K$DY$Hc@Zrlf$>G4f_*CC0=jCV@dpR@Q%z oNLoyMd{R_> zWo3oNB*w%fLRADNW@Uv&M@B}+!vx|X0^ukEF)=Y9bHHW<#%E=LWCLNg1jJ-zB_?KN zfoQM_5Cdc-i2l#Ol9dJ0!oiZ26$&#nG%_BfAQWT{SW9ALczAetXlO9VVT@c^S>d69 oAP}9E^&iAdii`{m4vtRB%KFd5k(HH|6d#|Im6ZkdF36<+046zVMgRZ+ literal 339 zcmWe+;9+23`1{|7fq@}}fq@~0fq@~Hfq|ipfq|i)fq`KG0|UcG1_p*h3=9m{7#JAd zfK)RuFz_)lFvv49Fz7KdFxWCOFnBRCFt9LZfxv$d9g&swpMeL&&B}^~P!NHbq^zv) zteBXXM5v0u#H_5)tmw$-c$h$ZR#tFUbYwWPKxkHcOlS;}itwzgtU#~;dsbFJ4A>S9 z76|h{1C+tan3a`@@HiQ$0TKCg-6FkXJy60#3Df|qr+okqhmm_{~7opMrTFG qMnp$M$0lZF{b%FI%8CdJi-?HL%KFbP%$AiE9UTK=bFe@Z{|5kh1U&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)nl28Qhn3=F3k7#Qv|Ffe>(U|?WpWMGhHWMI%|WMFV&WMGJ3 TWMIgd=xWBoz@L>hvF;lHo&yY> delta 62 zcmey$^o41Hgl-=L1H&Q)28L}63=F3j7#Qv`Ffe>#U|?WlWMGhDWMI%^WMFV)WMBwq SWMIgi=xWBy$d@v){u=<0hYTSA 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_thlgM4 delta 37 tcmey*{EvA;0_R;u28LIR3=Cg4W~MXpaAswt#K*rhd=!oc;q^zv}Y@AtHNnv3T5wRd1J4aSlR#HrCY+_c{ Le@?b6DEJQmz3dlY delta 64 zcmeys^pR6PYDG6)@14t@1D~pXgD=Rb{ES{8-mGz&28DwG>D{od- zWK4K;QdVSQB3J_pdsbFxVthXdt#3n8j2AiV6%#@XtmBq=Nl?4)KV$RA6&&uLp&B}^S z0SPd&WMzd%W@WKY{2)@##+j8B8K0Px1U7>KBo&*L#mb$P6&el}PfE$k`p>`&GBJyV zH!CYLCOkSRD>5+=tbv(5D=RcHJ|;0MiyOp@j*bSYXJ*UF3I{ujhYe(Y4A{}ESy|y} zX<1pktXWy1(TN~8>#$^Hg{EX>@v&rOMS>j1%$$`Kla}2~o|Kgp9hsOF9t#!7%F4=0i42bkkITyX&&r;a6%!dA9s^~kMMp-aWM%zlW6jD+ QiI309`p?b`(vbBZ0C9^dyZ`_I delta 124 zcmbQqG?Qt9j_7#?28IU=3=AI`7#RLCFfed3GB5~FbgYTt$jS;#%F2oi&&uLt%F4>h z`p>|Vl@*?pl@%QslNFx`6#&VkM25$N$7W^yXJyaIiir#lkAt$)q9bEK3fWk*va;eq JW^gcqNB~3HDklH{ 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}j+S^wEsvcTX! E0N2D4y#N3J delta 51 zcmX@Ye3*HI8KZb)cz9@FU`$rle+HhctnldQ$k52>$k55YjOqMY(a}j+S^wFYvq0cK E0Lq>ceEyoPx~GgC&!#8yKPxx_AbYygVOms|Sd{!1%ATTmGFgQ3g zJUj*}5D*+15EvL37z`5#4~>itjgF24YhmVvni&qI|1&XXWrb&Dv9o4n1%j0@vSek2 zM`mTQv1erkhDV2j%wgcm$_k2%&B_W04Gj$j8_mF`&HWlR1 zfXLAJERf5RK<;AA$_fCvkc%xVD?BD91ti9jl@*YfmBr1Pl@%JD2ohn=%8JR#;sMzY V*2M%ejh8tqD>5tVKOdO)9{@uuYhnNZ literal 331 zcmWe&;A3E5`2XL7fq@~Cfq@~5fq|i#fq|iifq`Kz0|Uc41_p-R3=9mX7#J9CGcYi` zWnf@nU}RtrVPs%XV`N}3V`N}(VPs%n;>kh*|3Lzg(UH;dG0`!R@mX15fxyV%z~JD} z@bDO@KtOP4Kww~CU@%M|JTx*oG&(vGt_5UjIEcssY2nDqiqFal1j{mVWo3oOX9b2w zhk|r7@ML8LMrQ?thK2@%jbq@=$_fPWgF}M@1EaID{xk4_3<`)0jn4u(BMD?8YgSeO z$T=KrSy|yRF)1K1maMFR#H=h%)~u}1=tPhRb5>SNRu&gaR#rGz7Zb=JZsx44$gHgY IJYe2`02ljbU;qFB diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045F.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/045F.lmp index 6f14a75d5fcd37bc4604878db0f6ade66c5c8e0b..25df0250e6dbe58f251429a2a51e395c5ed930cb 100644 GIT binary patch delta 141 zcmZ3+w2EnhjN)_#28LA(3=CTt7#I#PFfd$ZU|@L0z`*dGfq{X8k%2*SqOC_9UshIR zOmuW~WOR6Bd{$Og)_(>*5Cy@3@$rdSS^qiMva%u*6H}nfn1sY6G=`o? Pq@=|7nE0%$iTB+BTH!9k delta 137 zcmZ3*w2WzjjN()V28I<33=EqY7#Q|3Ffd$XU|@K}z`*dCfq{XAk%2*UqOC_1PgYiB zOmuW~WOR6Bd{)+f2EHsf2#g0Y|8uZqWkn_?CS_%TnK3CzDQF6#lfeoZc(StMQ<4&s Nk`m)%;wL_K2LPGREhzv1 From 7060f9cc052ca8fa6c85eb8275775acf2b942315 Mon Sep 17 00:00:00 2001 From: Nemrtvi 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 f2c1c50e2..a43247c25 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 70f6a5b22..18e1f0e29 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 fb0372201..389f9a54a 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=GRz1OgZs7!ny67>XDe7@8Rv7^W~VFf3(YVA#gMz;Kv>f#CuJ1H)Yg z28LG*3=H2H7#Nrs85o2a85mR;85m3%85rCc85qJR2CidCijGd2oWLkDS)MTz0QS2O AU;qFB delta 105 zcmaFC^o1!+7#P?X85sB&85ral85j&085kTH85n{X85oi$`mW>2ijGdo%KFdFoRyU| H@qZ=&b$Ju? 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 zcmWe&5Mf|oU}f-NU|@)0U|=XB)# z$0sJGq-20(;Qoq^j0}&AiHwdQF@$H|hl@%Hj z9UU1N6CE8L9U6}i3l0tq508!xkA#WEfHcL&N5{lO#-xDM@xjfHiHwX%1PQS~gxJ`# zvO=RHqhVsvNm*H}V6pgkuvYG@tl&tHnwS`{Gq}L|KrR7kVd4c##m9g}v$C@OGxB9+ zg+|82#6-s@CZ(jLf$ZYX%8HJR43CV7jE+xCOahzBpOqCJ9v&VY9~m7Jp9r=Kq%|=S V?B~S9q@VMc@L{{WmScwqnl 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=G1VR`X7%~_b7-|?87$z_JYBfH>@ISy_pZk%^Nn7^?wG!5ZfP delta 145 zcmZ3^yqP&vgn^#{1R@w17;+dG7#bKD7^W~VFsxu;VA#XJz;J3 z3=BMs3=C3?3=Haw3=Bq$3=Gzc3=IB^3=GMP3=HLr3=G|j3=H!p2JX=2%*slPiH?bm r3{On_&&C1b#YD#>W@Y_nXUob;jEn>^Iaso?va%*mU=*M1%$NcI3)vsv 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 zcmWe&5M*FrU}ErKU|jRU|^_VU|{HHU|?9zz`$^Tfq~%)0|UcL1_p+I3=9my zj0_Cgj0_CUj0_A>j0_Cfj0_Cbj0_B{Tv4{F)?8EaIXY}hlfXkJPGn4$PWRb fk>Qb%k>TO-Sy}%<=EcOvCnhE)CV|3)9W}@RT8(!! literal 331 zcmWe&;9+23`1{|3fq@~Mfq@~Nfq|idfq|iufq`Kb0|Ucq1_p+G3=9nC7#JAtGB7Z_ zWME+U$-uzC#mK-Q&B(x@!^ps3!w3?{LIVF8xU;fiV&cIdDJ$zg15Z{~KxlYqaBy&N zU<_1%1qLFa0x^-1(b18Cfp8TNBSS+26G19iva+I+va(p&va%9G!-GLW+*w({ky%-Z zfq@VuTwooEkq{kB>{(ffk&%%g-HhB2b|hE@#6^jr;h~YC(J?U~1z;zJhlfXkTnTex lKxkxmWMpJ`czjmYe~=L|@$rd?iHS)dPccDkgBY0g9{{)|XG{P9 diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044B.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigupper/044B.lmp index a74ca7122e80de22c46db5c17f54ec3052c7bcd7..80f3a7c6fdf52d307a19e18ca6a97a28d46cc3b3 100644 GIT binary patch delta 98 zcmeyu^n%G(h=GTJf#L7}00stzLCB;S~b|!*>P-1|~)Z24O}91{FpI22(}`1~*0qhVY4j>sXSaqmw2lFp5l;XAA`Z DqHhvh delta 105 zcmaFC^o1!v*!Fqm#0-{ 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 b8725eae6..5d67b3bce 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 132507299..63a69733b 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 d90cb330b..1d3c92c23 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 4c84513bb..6ec033c9e 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 b8043f089..9495cf5e6 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 007e3ea12..bfc20d71e 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 5e3dc9669..81da37591 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 37d372edb..67c78c36b 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 000000000..ea018b6d5 --- /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 3a86bfcdf..b8eac3744 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 e88bbeda8..d6098ab31 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 c536611ae..b94d19535 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 d102e59f7..b9f18a24c 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 0606b2dea..000000000 --- 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 791290cea..000000000 --- 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 bfc20d71e..2bac1ff91 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 14a50c7c9..000000000 --- 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 5ae1af065..000000000 --- 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 ff9a69792..9a57741ba 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 2bac1ff91..daeb50fe2 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 ad510383b..000000000 --- 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 b9de5e798..000000000 --- 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 03a6202b9..000000000 --- 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 b3cebfccf..0143fcb25 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 8314107df..be2229807 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 46fcb59e1..af1f1251c 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 504fe8afe..0022f527a 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 5ff82f0de..c39bc8385 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 0c1d6d230..19a7b57c2 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 e4cd09a42..e0891342f 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 73b2d9bc6..cf4a702d6 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 17f5521e2..bd6e2612a 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 4ffa768c8..fa4bd43c1 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 b505d0982..4fdf12cf3 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 471b19b9f..000000000 --- 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 fa56229ad..d4ad5ec89 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 6628703ab..6facdde72 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 4c3a3b541..35e7be700 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 07a46147e..ebced3c7c 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 4f27a6969..c9ffa40f8 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 5f8465eea..ff451dd17 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 7106443d0..03b66986d 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 389f9a54a..1f073bf72 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 cfcf37e90..705f29798 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 000000000..b48bb98d4 --- /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 8aa33926e..7921d1dce 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 50a89061c..4ab1812d3 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 94c79b109..b75b27b5f 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 2c9caaec3..63bda28ff 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 991849e56..0d27c6d1a 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 afa6dd454..37b280b5d 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 55c04c944..61b9ec267 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 025880fc4..29fe587fa 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 dfbf559f7..39201c79a 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 daeb50fe2..db6b79cde 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 db6b79cde..6244225ca 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 54da9e7d5..2a681a71d 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 58ad5ac11..964a23d76 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 d1cbe48a3..4a2db9faf 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