diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 52af19b7b..671c1d117 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -802,6 +802,7 @@ set (PCH_SOURCES core/palette.cpp core/zcompile.cpp core/statusbar.cpp + core/gi.cpp core/console/c_console.cpp core/console/d_event.cpp @@ -810,7 +811,7 @@ set (PCH_SOURCES common/audio/sound/oalsound.cpp common/audio/sound/s_environment.cpp common/audio/sound/s_sound.cpp - #common/audio/sound/s_reverbedit.cpp + common/audio/sound/s_reverbedit.cpp common/audio/music/music_midi_base.cpp common/audio/music/music.cpp common/audio/music/i_music.cpp @@ -910,6 +911,7 @@ set (PCH_SOURCES common/filesystem/resourcefile.cpp common/engine/cycler.cpp common/engine/d_event.cpp + common/engine/date.cpp common/engine/stats.cpp common/engine/sc_man.cpp common/engine/palettecontainer.cpp @@ -924,6 +926,13 @@ set (PCH_SOURCES common/objects/dobject.cpp common/objects/dobjgc.cpp common/objects/dobjtype.cpp + common/menu/joystickmenu.cpp + common/menu/menu.cpp + common/menu/messagebox.cpp + common/menu/optionmenu.cpp + common/menu/resolutionmenu.cpp + common/menu/menudef.cpp + common/menu/savegamemanager.cpp common/rendering/v_framebuffer.cpp common/rendering/v_video.cpp @@ -975,22 +984,12 @@ set (PCH_SOURCES common/scripting/backend/codegen.cpp - core/textures/buildtiles.cpp - #core/textures/texture.cpp + core/textures/buildtiles.cpp core/music/s_advsound.cpp - core/menu/imagescroller.cpp - core/menu/joystickmenu.cpp - core/menu/listmenu.cpp - core/menu/savegamemanager.cpp core/menu/loadsavemenu.cpp - core/menu/menu.cpp - core/menu/menudef.cpp - core/menu/menuinput.cpp - core/menu/messagebox.cpp - core/menu/optionmenu.cpp - core/menu/resolutionmenu.cpp + core/menu/razemenu.cpp ) if( ${HAVE_VM_JIT} ) diff --git a/source/blood/src/animatesprite.cpp b/source/blood/src/animatesprite.cpp index 2a34619b6..cf5b65665 100644 --- a/source/blood/src/animatesprite.cpp +++ b/source/blood/src/animatesprite.cpp @@ -39,7 +39,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "view.h" #include "nnexts.h" #include "zstring.h" -#include "menu.h" +#include "razemenu.h" #include "gstrings.h" #include "v_2ddrawer.h" #include "v_video.h" diff --git a/source/blood/src/blood.cpp b/source/blood/src/blood.cpp index 25d96ff29..008ad91af 100644 --- a/source/blood/src/blood.cpp +++ b/source/blood/src/blood.cpp @@ -51,7 +51,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "gamecontrol.h" #include "m_argv.h" #include "statistics.h" -#include "menu.h" +#include "razemenu.h" #include "raze_sound.h" #include "nnexts.h" #include "secrets.h" @@ -61,6 +61,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "choke.h" #include "d_net.h" #include "v_video.h" +#include "v_draw.h" +#include "texturemanager.h" #include "statusbar.h" BEGIN_BLD_NS @@ -394,6 +396,16 @@ void GameInterface::DrawBackground() DrawTexture(twod, tileGetTexture(2518, true), 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, TAG_DONE); } +#define x(a, b) registerName(#a, b); +static void SetTileNames() +{ + auto registerName = [](const char* name, int index) + { + TexMan.AddAlias(name, tileGetTexture(index)); + }; +#include "namelist.h" +} +#undef x void ReadAllRFS(); @@ -416,6 +428,7 @@ void GameInterface::app_init() levelLoadDefaults(); LoadDefinitions(); + SetTileNames(); TileFiles.SetBackup(); powerupInit(); diff --git a/source/blood/src/blood.h b/source/blood/src/blood.h index cf59adac2..80a49bd88 100644 --- a/source/blood/src/blood.h +++ b/source/blood/src/blood.h @@ -80,11 +80,8 @@ struct GameInterface : ::GameInterface void MenuClosed() override; bool CanSave() override; bool StartGame(FNewGameStartup& gs) override; - void DrawNativeMenuText(int fontnum, int state, double xpos, double ypos, float fontscale, const char* text, int flags) override; - void DrawMenuCaption(const DVector2& origin, const char* text) override; - bool SaveGame(FSaveGameNode*) override; - bool LoadGame(FSaveGameNode*) override; - void DrawCenteredTextScreen(const DVector2& origin, const char* text, int position, bool bg) override; + bool SaveGame() override; + bool LoadGame() override; void QuitToTitle() override; FString GetCoordString() override; ReservedSpace GetReservedScreenSpace(int viewsize) override; diff --git a/source/blood/src/common_game.h b/source/blood/src/common_game.h index e3f697399..c5cec7676 100644 --- a/source/blood/src/common_game.h +++ b/source/blood/src/common_game.h @@ -42,59 +42,57 @@ void _consoleSysMsg(const char* pMessage, ...); #define ThrowError(...) \ { \ - _SetErrorLoc(__FILE__,__LINE__); \ I_Error(__VA_ARGS__); \ } // print error to console only #define consoleSysMsg(...) \ { \ - _SetErrorLoc(__FILE__,__LINE__); \ _consoleSysMsg(__VA_ARGS__); \ } #define dassert(x) assert(x) - -#define kMaxSectors MAXSECTORS -#define kMaxWalls MAXWALLS -#define kMaxSprites MAXSPRITES - -#define kMaxTiles MAXTILES -#define kMaxStatus MAXSTATUS -#define kMaxPlayers 8 #define kMaxViewSprites maxspritesonscreen -#define kMaxVoxels MAXVOXELS +enum +{ + kMaxSectors = MAXSECTORS, + kMaxWalls = MAXWALLS, + kMaxSprites = MAXSPRITES, -#define kTicRate 120 -#define kTicsPerFrame 4 -#define kTicsPerSec (kTicRate/kTicsPerFrame) + kMaxTiles = MAXTILES, + kMaxStatus = MAXSTATUS, + kMaxPlayers = 8, + kMaxVoxels = MAXVOXELS, -#define TILTBUFFER 4078 + kTicRate = 120, + kTicsPerFrame = 4, + kTicsPerSec = (kTicRate / kTicsPerFrame), -#define kExplodeMax 8 + kExplodeMax = 8, -#define kLensSize 80 -#define kViewEffectMax 19 + kLensSize = 80, + kViewEffectMax = 19, -#define kNoTile -1 + kNoTile = -1, -// defined by NoOne: -// ------------------------------- + //= = = = // = defined = by = NoOne: + //= = = = // = ------------------------------- -#define kMaxPAL 5 -#define kUserPLUStart 15 + kMaxPAL = 5, + kUserPLUStart = 15, -#define kDmgFall 0 -#define kDmgBurn 1 -#define kDmgBullet 2 -#define kDmgExplode 3 -#define kDmgChoke 4 -#define kDmgSpirit 5 -#define kDmgElectric 6 -#define kDmgMax 7 + kDmgFall = 0, + kDmgBurn = 1, + kDmgBullet = 2, + kDmgExplode = 3, + kDmgChoke = 4, + kDmgSpirit = 5, + kDmgElectric = 6, + kDmgMax = 7, +}; // MEDIUM ///////////////////////////////////////////////////// enum { diff --git a/source/blood/src/controls.cpp b/source/blood/src/controls.cpp index a00e79f7e..7045e49c2 100644 --- a/source/blood/src/controls.cpp +++ b/source/blood/src/controls.cpp @@ -26,7 +26,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "mmulti.h" #include "view.h" #include "gamestate.h" -#include "menu.h" +#include "razemenu.h" BEGIN_BLD_NS diff --git a/source/blood/src/credits.cpp b/source/blood/src/credits.cpp index 7e963f4d2..40d53543b 100644 --- a/source/blood/src/credits.cpp +++ b/source/blood/src/credits.cpp @@ -38,7 +38,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "screenjob.h" #include "gamestate.h" #include "seq.h" -#include "menu.h" +#include "razemenu.h" BEGIN_BLD_NS diff --git a/source/blood/src/d_menu.cpp b/source/blood/src/d_menu.cpp index d03e98d81..36e05073d 100644 --- a/source/blood/src/d_menu.cpp +++ b/source/blood/src/d_menu.cpp @@ -2,8 +2,9 @@ /* Copyright (C) 2010-2019 EDuke32 developers and contributors Copyright (C) 2019 Nuke.YKT +Copyright (C) 2020 Christoph Oelckers -This file is part of NBlood. +This file is part of Raze. NBlood is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 @@ -27,7 +28,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "compat.h" #include "mmulti.h" #include "c_bind.h" -#include "menu.h" +#include "razemenu.h" #include "gamestate.h" #include "blood.h" @@ -36,6 +37,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "view.h" #include "sound.h" #include "v_video.h" +#include "v_draw.h" +#include "vm.h" bool ShowOptionMenu(); @@ -118,112 +121,34 @@ void CGameMenuItemQAV::Draw(void) } - static std::unique_ptr itemBloodQAV; // This must be global to ensure that the animation remains consistent across menus. - void UpdateNetworkMenus(void) { - // For now disable the network menu item as it is not yet functional. + // For now disable the network menu item as it is not functional. for (auto name : { NAME_Mainmenu, NAME_IngameMenu }) { - FMenuDescriptor** desc = MenuDescriptors.CheckKey(name); - if (desc != NULL && (*desc)->mType == MDESC_ListMenu) + DMenuDescriptor** desc = MenuDescriptors.CheckKey(name); + if (desc != NULL && (*desc)->IsKindOf(RUNTIME_CLASS(DListMenuDescriptor))) { - FListMenuDescriptor* ld = static_cast(*desc); + DListMenuDescriptor* ld = static_cast(*desc); for (auto& li : ld->mItems) { - if (li->GetAction(nullptr) == NAME_MultiMenu) + if (li->mAction == NAME_MultiMenu) { - li->mEnabled = false; + li->mEnabled = -1; } } } } } -//---------------------------------------------------------------------------- -// -// Implements the native looking menu used for the main menu -// and the episode/skill selection screens, i.e. the parts -// that need to look authentic -// -//---------------------------------------------------------------------------- - -class BloodListMenu : public DListMenu -{ - using Super = DListMenu; -protected: - - void PostDraw() - { - // For narrow screens this would be mispositioned so skip drawing it there. - double ratio = screen->GetWidth() / double(screen->GetHeight()); - if (ratio > 1.32) itemBloodQAV->Draw(); - } - -}; - - -//---------------------------------------------------------------------------- -// -// -// -//---------------------------------------------------------------------------- - -class BloodImageScreen : public ImageScreen -{ - CGameMenuItemQAV anim; -public: - BloodImageScreen(FImageScrollerDescriptor::ScrollerItem* desc) - : ImageScreen(desc), anim(169, 100, mDesc->text.GetChars(), false, true) - { - - } - - void Drawer() override - { - anim.Draw(); - } -}; - -class DBloodImageScrollerMenu : public DImageScrollerMenu -{ - ImageScreen* newImageScreen(FImageScrollerDescriptor::ScrollerItem* desc) override - { - if (desc->type >= 0) return DImageScrollerMenu::newImageScreen(desc); - return new BloodImageScreen(desc); - } -}; - - //---------------------------------------------------------------------------- // // Menu related game interface functions // //---------------------------------------------------------------------------- -void GameInterface::DrawNativeMenuText(int fontnum, int state, double xpos, double ypos, float fontscale, const char* text, int flags) -{ - if (!text) return; - int shade = (state != NIT_InactiveState) ? 32 : 48; - int pal = (state != NIT_InactiveState) ? 5 : 5; - if (state == NIT_SelectedState) shade = 32 - (I_GetBuildTime() & 63); - auto gamefont = fontnum == NIT_BigFont ? BigFont : SmallFont; - - if (flags & LMF_Centered) - { - int width = gamefont->StringWidth(text); - xpos -= width / 2; - } - DrawText(twod, gamefont, CR_UNDEFINED, xpos+1, ypos+1, text, DTA_Color, 0xff000000, //DTA_Alpha, 0.5, - DTA_FullscreenScale, FSMode_Fit320x200, TAG_DONE); - - DrawText(twod, gamefont, CR_UNDEFINED, xpos, ypos, text, DTA_TranslationIndex, TRANSLATION(Translation_Remap, pal), DTA_Color, shadeToLight(shade), - DTA_FullscreenScale, FSMode_Fit320x200, TAG_DONE); -} - - void GameInterface::MenuOpened() { itemBloodQAV.reset(new CGameMenuItemQAV(160, 100, "BDRIP.QAV", true)); @@ -245,7 +170,7 @@ bool GameInterface::StartGame(FNewGameStartup& gs) { if (g_gameType & GAMEFLAG_SHAREWARE) { - M_StartMessage(GStrings("BUYBLOOD"), 1, -1); // unreachable because we do not support Blood SW versions yet. + M_StartMessage(GStrings("BUYBLOOD"), 1, NAME_None); // unreachable because we do not support Blood SW versions yet. return false; } } @@ -261,41 +186,6 @@ FSavegameInfo GameInterface::GetSaveSig() return { SAVESIG_BLD, MINSAVEVER_BLD, SAVEVER_BLD }; } -// This also gets used by the summary and the loading screen -void DrawMenuCaption(const char* text) -{ - double scalex = 1.; // Expand the box if the text is longer - int width = BigFont->StringWidth(text); - int boxwidth = tileWidth(2038); - if (boxwidth - 10 < width) scalex = double(width) / (boxwidth - 10); - - DrawTexture(twod, tileGetTexture(2038, true), 160, 20, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_CenterOffsetRel, true, DTA_ScaleX, scalex, TAG_DONE); - DrawText(twod, BigFont, CR_UNDEFINED, 160 - width/2, 20 - tileHeight(4193) / 2, text, DTA_FullscreenScale, FSMode_Fit320x200Top, TAG_DONE); -} - -void GameInterface::DrawMenuCaption(const DVector2& origin, const char* text) -{ - Blood::DrawMenuCaption(text); -} - -void GameInterface::DrawCenteredTextScreen(const DVector2& origin, const char* text, int position, bool bg) -{ - if (text) - { - int height = SmallFont->GetHeight(); - - auto lines = FString(text).Split("\n"); - int y = 100 - (height * lines.Size() / 2); - for (auto& l : lines) - { - int width = SmallFont->StringWidth(l); - int x = 160 - width / 2; - DrawText(twod, SmallFont, CR_UNTRANSLATED, x, y, l, DTA_FullscreenScale, FSMode_Fit320x200, TAG_DONE); - y += height; - } - } -} - void GameInterface::QuitToTitle() { Mus_Stop(); @@ -304,20 +194,43 @@ void GameInterface::QuitToTitle() END_BLD_NS +using namespace Blood; //---------------------------------------------------------------------------- // -// Class registration +// // //---------------------------------------------------------------------------- - -static TMenuClassDescriptor _lm("Blood.ListMenu"); -static TMenuClassDescriptor _mm("Blood.MainMenu"); -static TMenuClassDescriptor _im("Blood.ImageScrollerMenu"); - -void RegisterBloodMenus() +DEFINE_ACTION_FUNCTION(DListMenuItemBloodDripDrawer, Draw) { - menuClasses.Push(&_lm); - menuClasses.Push(&_mm); - menuClasses.Push(&_im); + // For narrow screens this would be mispositioned so skip drawing it there. + double ratio = screen->GetWidth() / double(screen->GetHeight()); + if (ratio > 1.32) itemBloodQAV->Draw(); + return 0; } + +DEFINE_ACTION_FUNCTION(_ImageScrollerPageQavDrawer, LoadQav) +{ + PARAM_PROLOGUE; + PARAM_STRING(str); + auto qav = new CGameMenuItemQAV(160, 100, str, false, true); + ACTION_RETURN_POINTER(qav); +} + +DEFINE_ACTION_FUNCTION(_ImageScrollerPageQavDrawer, DestroyQav) +{ + PARAM_PROLOGUE; + PARAM_POINTER(qav, CGameMenuItemQAV); + if (qav) delete qav; + return 0; +} + +DEFINE_ACTION_FUNCTION(_ImageScrollerPageQavDrawer, DrawQav) +{ + PARAM_PROLOGUE; + PARAM_POINTER(qav, CGameMenuItemQAV); + qav->Draw(); + return 0; +} + + diff --git a/source/blood/src/endgame.cpp b/source/blood/src/endgame.cpp index 96e4544fa..f7a7ebf29 100644 --- a/source/blood/src/endgame.cpp +++ b/source/blood/src/endgame.cpp @@ -87,6 +87,18 @@ static void drawTextScreenBackground(void) } } +// One these screens get scriptified this should use the version in BloodMenuDelegate. +static void DrawCaption(const char* text) +{ + double scalex = 1.; // Expand the box if the text is longer + int width = BigFont->StringWidth(text); + int boxwidth = tileWidth(2038); + if (boxwidth - 10 < width) scalex = double(width) / (boxwidth - 10); + + DrawTexture(twod, tileGetTexture(2038, true), 160, 20, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_CenterOffsetRel, true, DTA_ScaleX, scalex, TAG_DONE); + DrawText(twod, BigFont, CR_UNDEFINED, 160 - width / 2, 20 - tileHeight(4193) / 2, text, DTA_FullscreenScale, FSMode_Fit320x200Top, TAG_DONE); +} + class DBloodSummaryScreen : public DScreenJob { @@ -141,7 +153,7 @@ class DBloodSummaryScreen : public DScreenJob drawTextScreenBackground(); if (gGameOptions.nGameType == 0) { - DrawMenuCaption(GStrings("TXTB_LEVELSTATS")); + DrawCaption(GStrings("TXTB_LEVELSTATS")); if (bPlayerCheated) { auto text = GStrings("TXTB_CHEATED"); @@ -154,7 +166,7 @@ class DBloodSummaryScreen : public DScreenJob } else { - DrawMenuCaption(GStrings("TXTB_FRAGSTATS")); + DrawCaption(GStrings("TXTB_FRAGSTATS")); DrawKills(); } int myclock = int(clock * 120 / 1'000'000'000); @@ -301,7 +313,7 @@ public: { twod->ClearScreen(); drawTextScreenBackground(); - DrawMenuCaption(pzLoadingScreenText1); + DrawCaption(pzLoadingScreenText1); viewDrawText(1, rec->DisplayName(), 160, 50, -128, 0, 1, 1); auto text = GStrings("TXTB_PLSWAIT"); diff --git a/source/blood/src/globals.cpp b/source/blood/src/globals.cpp index 14eebbde3..7f52a50ed 100644 --- a/source/blood/src/globals.cpp +++ b/source/blood/src/globals.cpp @@ -58,12 +58,9 @@ void _SetErrorLoc(const char *pzFile, int nLine) // by NoOne: show warning msgs in game instead of throwing errors (in some cases) void _consoleSysMsg(const char* pzFormat, ...) { - char buffer[1024]; va_list args; va_start(args, pzFormat); - vsprintf(buffer, pzFormat, args); - - Printf(TEXTCOLOR_RED "%s(%i): %s\n", _module, _line, buffer); + VPrintf(PRINT_LOW, TEXTCOLOR_RED "%s\n", args); } END_BLD_NS diff --git a/source/blood/src/hudsprites.cpp b/source/blood/src/hudsprites.cpp index ca14fae03..30860b12d 100644 --- a/source/blood/src/hudsprites.cpp +++ b/source/blood/src/hudsprites.cpp @@ -39,7 +39,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "view.h" #include "nnexts.h" #include "zstring.h" -#include "menu.h" +#include "razemenu.h" #include "gstrings.h" #include "v_2ddrawer.h" #include "v_video.h" diff --git a/source/blood/src/levels.cpp b/source/blood/src/levels.cpp index 5b94ad66e..0e08167a6 100644 --- a/source/blood/src/levels.cpp +++ b/source/blood/src/levels.cpp @@ -38,7 +38,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "sound.h" #include "view.h" #include "eventq.h" -#include "menu.h" +#include "razemenu.h" BEGIN_BLD_NS diff --git a/source/blood/src/loadsave.cpp b/source/blood/src/loadsave.cpp index a4f6c68af..77924749b 100644 --- a/source/blood/src/loadsave.cpp +++ b/source/blood/src/loadsave.cpp @@ -474,7 +474,7 @@ void LoadSave::Write(void *pData, int nSize) ThrowError("File error #%d writing save file.", errno); } -bool GameInterface::LoadGame(FSaveGameNode* node) +bool GameInterface::LoadGame() { sndKillAllSounds(); sfxKillAllSounds(); @@ -534,7 +534,7 @@ bool GameInterface::LoadGame(FSaveGameNode* node) return true; } -bool GameInterface::SaveGame(FSaveGameNode* node) +bool GameInterface::SaveGame() { LoadSave::hSFile = WriteSavegameChunk("snapshot.bld"); diff --git a/source/blood/src/loadsave.h b/source/blood/src/loadsave.h index e0a598d2c..732a41763 100644 --- a/source/blood/src/loadsave.h +++ b/source/blood/src/loadsave.h @@ -41,8 +41,6 @@ public: virtual void Load(void); void Read(void *, int); void Write(void *, int); - static void LoadGame(FSavegameNode *); - static void SaveGame(FSavegameNode*); }; void LoadSaveSetup(void); diff --git a/source/blood/src/misc.h b/source/blood/src/misc.h index 3b539d1d0..d25f692c2 100644 --- a/source/blood/src/misc.h +++ b/source/blood/src/misc.h @@ -143,6 +143,5 @@ void tilePrecacheTile(int nTile, int nType, HitList& hits); char tileGetSurfType(int hit); void scrLoadPalette(void); -void DrawMenuCaption(const char* text); END_BLD_NS diff --git a/source/blood/src/namelist.h b/source/blood/src/namelist.h new file mode 100644 index 000000000..4f513a378 --- /dev/null +++ b/source/blood/src/namelist.h @@ -0,0 +1,2 @@ +// names for everything that gets accessed by scripts. +x(MENUBAR, 2038) diff --git a/source/blood/src/prediction.cpp b/source/blood/src/prediction.cpp index c28022998..db808be38 100644 --- a/source/blood/src/prediction.cpp +++ b/source/blood/src/prediction.cpp @@ -39,7 +39,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "view.h" #include "nnexts.h" #include "zstring.h" -#include "menu.h" +#include "razemenu.h" #include "gstrings.h" #include "v_2ddrawer.h" #include "v_video.h" diff --git a/source/blood/src/sbar.cpp b/source/blood/src/sbar.cpp index 6fd4cd610..ff993c522 100644 --- a/source/blood/src/sbar.cpp +++ b/source/blood/src/sbar.cpp @@ -39,7 +39,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "view.h" #include "nnexts.h" #include "zstring.h" -#include "menu.h" +#include "razemenu.h" #include "gstrings.h" #include "v_2ddrawer.h" #include "v_video.h" @@ -47,6 +47,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "glbackend/glbackend.h" #include "statusbar.h" #include "automap.h" +#include "v_draw.h" CVARD(Bool, hud_powerupduration, true, CVAR_ARCHIVE/*|CVAR_FRONTEND_BLOOD*/, "enable/disable displaying the remaining seconds for power-ups") diff --git a/source/blood/src/view.cpp b/source/blood/src/view.cpp index 4d6a81b44..e60f0736d 100644 --- a/source/blood/src/view.cpp +++ b/source/blood/src/view.cpp @@ -39,13 +39,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "view.h" #include "nnexts.h" #include "zstring.h" -#include "menu.h" +#include "razemenu.h" #include "gstrings.h" #include "v_2ddrawer.h" #include "v_video.h" #include "v_font.h" #include "statusbar.h" #include "automap.h" +#include "v_draw.h" #include "glbackend/glbackend.h" BEGIN_BLD_NS diff --git a/source/build/src/engine.cpp b/source/build/src/engine.cpp index 6aa23f294..d35a5a155 100644 --- a/source/build/src/engine.cpp +++ b/source/build/src/engine.cpp @@ -23,7 +23,7 @@ #include "v_2ddrawer.h" #include "v_draw.h" #include "stats.h" -#include "menu.h" +#include "razemenu.h" #include "version.h" #include "earcut.hpp" #include "gamestate.h" diff --git a/source/build/src/polymost.cpp b/source/build/src/polymost.cpp index 74dada52e..34addb9d9 100644 --- a/source/build/src/polymost.cpp +++ b/source/build/src/polymost.cpp @@ -35,6 +35,7 @@ bool hw_int_useindexedcolortextures; CUSTOM_CVARD(Bool, hw_useindexedcolortextures, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "enable/disable indexed color texture rendering") { hw_int_useindexedcolortextures = self; + if (screen) screen->SetTextureFilterMode(); } diff --git a/source/common/2d/v_2ddrawer.cpp b/source/common/2d/v_2ddrawer.cpp index acdef7bff..22d8565a4 100644 --- a/source/common/2d/v_2ddrawer.cpp +++ b/source/common/2d/v_2ddrawer.cpp @@ -439,6 +439,9 @@ void F2DDrawer::AddTexture(FGameTexture* img, DrawParms& parms) std::swap(v1, v2); } + auto osave = offset; + if (parms.nooffset) offset = { 0,0 }; + if (parms.rotateangle == 0) { double x = parms.x - parms.left * xscale; @@ -461,10 +464,10 @@ void F2DDrawer::AddTexture(FGameTexture* img, DrawParms& parms) if (x < (double)parms.lclip || y < (double)parms.uclip || x + w >(double)parms.rclip || y + h >(double)parms.dclip) { - dg.mScissor[0] = parms.lclip; - dg.mScissor[1] = parms.uclip; - dg.mScissor[2] = parms.rclip; - dg.mScissor[3] = parms.dclip; + dg.mScissor[0] = parms.lclip + int(offset.X); + dg.mScissor[1] = parms.uclip + int(offset.Y); + dg.mScissor[2] = parms.rclip + int(offset.X); + dg.mScissor[3] = parms.dclip + int(offset.Y); dg.mFlags |= DTF_Scissor; } else @@ -475,10 +478,10 @@ void F2DDrawer::AddTexture(FGameTexture* img, DrawParms& parms) dg.mVertCount = 4; dg.mVertIndex = (int)mVertices.Reserve(4); TwoDVertex* ptr = &mVertices[dg.mVertIndex]; - ptr->Set(x, y, 0, u1, v1, vertexcolor); ptr++; - ptr->Set(x, y + h, 0, u1, v2, vertexcolor); ptr++; - ptr->Set(x + w, y, 0, u2, v1, vertexcolor); ptr++; - ptr->Set(x + w, y + h, 0, u2, v2, vertexcolor); ptr++; + Set(ptr, x, y, 0, u1, v1, vertexcolor); ptr++; + Set(ptr, x, y + h, 0, u1, v2, vertexcolor); ptr++; + Set(ptr, x + w, y, 0, u2, v1, vertexcolor); ptr++; + Set(ptr, x + w, y + h, 0, u2, v2, vertexcolor); ptr++; } else { @@ -502,25 +505,26 @@ void F2DDrawer::AddTexture(FGameTexture* img, DrawParms& parms) double x4 = parms.x + xscale * (xd2 * cosang + yd2 * sinang); double y4 = parms.y - yscale * (xd2 * sinang - yd2 * cosang); - dg.mScissor[0] = parms.lclip; - dg.mScissor[1] = parms.uclip; - dg.mScissor[2] = parms.rclip; - dg.mScissor[3] = parms.dclip; + dg.mScissor[0] = parms.lclip + int(offset.X); + dg.mScissor[1] = parms.uclip + int(offset.Y); + dg.mScissor[2] = parms.rclip + int(offset.X); + dg.mScissor[3] = parms.dclip + int(offset.Y); dg.mFlags |= DTF_Scissor; dg.mVertCount = 4; dg.mVertIndex = (int)mVertices.Reserve(4); TwoDVertex* ptr = &mVertices[dg.mVertIndex]; - ptr->Set(x1, y1, 0, u1, v1, vertexcolor); ptr++; - ptr->Set(x2, y2, 0, u1, v2, vertexcolor); ptr++; - ptr->Set(x3, y3, 0, u2, v1, vertexcolor); ptr++; - ptr->Set(x4, y4, 0, u2, v2, vertexcolor); ptr++; + Set(ptr, x1, y1, 0, u1, v1, vertexcolor); ptr++; + Set(ptr, x2, y2, 0, u1, v2, vertexcolor); ptr++; + Set(ptr, x3, y3, 0, u2, v1, vertexcolor); ptr++; + Set(ptr, x4, y4, 0, u2, v2, vertexcolor); ptr++; } dg.mIndexIndex = mIndices.Size(); dg.mIndexCount += 6; AddIndices(dg.mVertIndex, 6, 0, 1, 2, 1, 3, 2); AddCommand(&dg); + offset = osave; } //========================================================================== @@ -561,6 +565,9 @@ void F2DDrawer::AddShape(FGameTexture* img, DShape2D* shape, DrawParms& parms) shape->dirty = false; } + auto osave = offset; + if (parms.nooffset) offset = { 0,0 }; + double minx = 16383, miny = 16383, maxx = -16384, maxy = -16384; for ( int i=0; i(double)parms.rclip || maxy >(double)parms.dclip) { - dg.mScissor[0] = parms.lclip; - dg.mScissor[1] = parms.uclip; - dg.mScissor[2] = parms.rclip; - dg.mScissor[3] = parms.dclip; + dg.mScissor[0] = parms.lclip + int(offset.X); + dg.mScissor[1] = parms.uclip + int(offset.Y); + dg.mScissor[2] = parms.rclip + int(offset.X); + dg.mScissor[3] = parms.dclip + int(offset.Y); dg.mFlags |= DTF_Scissor; } else @@ -583,7 +590,7 @@ void F2DDrawer::AddShape(FGameTexture* img, DShape2D* shape, DrawParms& parms) dg.mVertIndex = (int)mVertices.Reserve(dg.mVertCount); TwoDVertex *ptr = &mVertices[dg.mVertIndex]; for ( int i=0; imTransformedVertices[i].X, shape->mTransformedVertices[i].Y, 0, shape->mCoords[i].X, shape->mCoords[i].Y, vertexcolor); + Set(&ptr[i], shape->mTransformedVertices[i].X, shape->mTransformedVertices[i].Y, 0, shape->mCoords[i].X, shape->mCoords[i].Y, vertexcolor); dg.mIndexIndex = mIndices.Size(); dg.mIndexCount += shape->mIndices.Size(); for ( int i=0; imIndices.Size()); i+=3 ) @@ -599,6 +606,7 @@ void F2DDrawer::AddShape(FGameTexture* img, DShape2D* shape, DrawParms& parms) AddIndices(dg.mVertIndex, 3, shape->mIndices[i], shape->mIndices[i+1], shape->mIndices[i+2]); } AddCommand(&dg); + offset = osave; } //========================================================================== @@ -655,7 +663,7 @@ void F2DDrawer::AddPoly(FGameTexture *texture, FVector2 *points, int npoints, u = t * cosrot - v * sinrot; v = v * cosrot + t * sinrot; } - mVertices[poly.mVertIndex+i].Set(points[i].X, points[i].Y, 0, u*uscale, v*vscale, color0); + Set(&mVertices[poly.mVertIndex+i], points[i].X, points[i].Y, 0, u*uscale, v*vscale, color0); } poly.mIndexIndex = mIndices.Size(); @@ -694,10 +702,10 @@ void F2DDrawer::AddPoly(FGameTexture* img, FVector4* vt, size_t vtcount, unsigne dg.mType = DrawTypeTriangles; if (clipx1 > 0 || clipy1 > 0 || clipx2 < GetWidth() - 1 || clipy2 < GetHeight() - 1) { - dg.mScissor[0] = clipx1; - dg.mScissor[1] = clipy1; - dg.mScissor[2] = clipx2 + 1; - dg.mScissor[3] = clipy2 + 1; + dg.mScissor[0] = clipx1 + int(offset.X); + dg.mScissor[1] = clipy1 + int(offset.Y); + dg.mScissor[2] = clipx2 + 1 + int(offset.X); + dg.mScissor[3] = clipy2 + 1 + int(offset.Y); dg.mFlags |= DTF_Scissor; } @@ -712,7 +720,7 @@ void F2DDrawer::AddPoly(FGameTexture* img, FVector4* vt, size_t vtcount, unsigne for (size_t i=0;iSet(vt[i].X, vt[i].Y, 0.f, vt[i].Z, vt[i].W, color); + Set(ptr, vt[i].X, vt[i].Y, 0.f, vt[i].Z, vt[i].W, color); ptr++; } @@ -841,18 +849,18 @@ void F2DDrawer::AddFlatFill(int left, int top, int right, int bottom, FGameTextu dg.mVertIndex = (int)mVertices.Reserve(4); auto ptr = &mVertices[dg.mVertIndex]; - ptr->Set(left, top, 0, fU1, fV1, color); ptr++; + Set(ptr, left, top, 0, fU1, fV1, color); ptr++; if (local_origin < 4) { - ptr->Set(left, bottom, 0, fU1, fV2, color); ptr++; - ptr->Set(right, top, 0, fU2, fV1, color); ptr++; + Set(ptr, left, bottom, 0, fU1, fV2, color); ptr++; + Set(ptr, right, top, 0, fU2, fV1, color); ptr++; } else { - ptr->Set(left, bottom, 0, fU2, fV1, color); ptr++; - ptr->Set(right, top, 0, fU1, fV2, color); ptr++; + Set(ptr, left, bottom, 0, fU2, fV1, color); ptr++; + Set(ptr, right, top, 0, fU1, fV2, color); ptr++; } - ptr->Set(right, bottom, 0, fU2, fV2, color); ptr++; + Set(ptr, right, bottom, 0, fU2, fV2, color); ptr++; dg.mIndexIndex = mIndices.Size(); dg.mIndexCount += 6; AddIndices(dg.mVertIndex, 6, 0, 1, 2, 1, 3, 2); @@ -875,10 +883,10 @@ void F2DDrawer::AddColorOnlyQuad(int x1, int y1, int w, int h, PalEntry color, F dg.mVertIndex = (int)mVertices.Reserve(4); dg.mRenderStyle = style? *style : LegacyRenderStyles[STYLE_Translucent]; auto ptr = &mVertices[dg.mVertIndex]; - ptr->Set(x1, y1, 0, 0, 0, color); ptr++; - ptr->Set(x1, y1 + h, 0, 0, 0, color); ptr++; - ptr->Set(x1 + w, y1, 0, 0, 0, color); ptr++; - ptr->Set(x1 + w, y1 + h, 0, 0, 0, color); ptr++; + Set(ptr, x1, y1, 0, 0, 0, color); ptr++; + Set(ptr, x1, y1 + h, 0, 0, 0, color); ptr++; + Set(ptr, x1 + w, y1, 0, 0, 0, color); ptr++; + Set(ptr, x1 + w, y1 + h, 0, 0, 0, color); ptr++; dg.mIndexIndex = mIndices.Size(); dg.mIndexCount += 6; AddIndices(dg.mVertIndex, 6, 0, 1, 2, 1, 3, 2); @@ -911,10 +919,10 @@ void F2DDrawer::AddLine(double x1, double y1, double x2, double y2, int clipx1, if (clipx1 > 0 || clipy1 > 0 || clipx2 < GetWidth()- 1 || clipy2 < GetHeight() - 1) { - dg.mScissor[0] = clipx1; - dg.mScissor[1] = clipy1; - dg.mScissor[2] = clipx2 + 1; - dg.mScissor[3] = clipy2 + 1; + dg.mScissor[0] = clipx1 + int(offset.X); + dg.mScissor[1] = clipy1 + int(offset.Y); + dg.mScissor[2] = clipx2 + 1 + int(offset.X); + dg.mScissor[3] = clipy2 + 1 + int(offset.Y); dg.mFlags |= DTF_Scissor; } @@ -922,8 +930,8 @@ void F2DDrawer::AddLine(double x1, double y1, double x2, double y2, int clipx1, dg.mRenderStyle = LegacyRenderStyles[STYLE_Translucent]; dg.mVertCount = 2; dg.mVertIndex = (int)mVertices.Reserve(2); - mVertices[dg.mVertIndex].Set(x1, y1, 0, 0, 0, p); - mVertices[dg.mVertIndex+1].Set(x2, y2, 0, 0, 0, p); + Set(&mVertices[dg.mVertIndex], x1, y1, 0, 0, 0, p); + Set(&mVertices[dg.mVertIndex+1], x2, y2, 0, 0, 0, p); AddCommand(&dg); } @@ -958,10 +966,10 @@ void F2DDrawer::AddThickLine(int x1, int y1, int x2, int y2, double thickness, u dg.mVertIndex = (int)mVertices.Reserve(4); dg.mRenderStyle = LegacyRenderStyles[STYLE_Translucent]; auto ptr = &mVertices[dg.mVertIndex]; - ptr->Set(corner0.X, corner0.Y, 0, 0, 0, p); ptr++; - ptr->Set(corner1.X, corner1.Y, 0, 0, 0, p); ptr++; - ptr->Set(corner2.X, corner2.Y, 0, 0, 0, p); ptr++; - ptr->Set(corner3.X, corner3.Y, 0, 0, 0, p); ptr++; + Set(ptr, corner0.X, corner0.Y, 0, 0, 0, p); ptr++; + Set(ptr, corner1.X, corner1.Y, 0, 0, 0, p); ptr++; + Set(ptr, corner2.X, corner2.Y, 0, 0, 0, p); ptr++; + Set(ptr, corner3.X, corner3.Y, 0, 0, 0, p); ptr++; dg.mIndexIndex = mIndices.Size(); dg.mIndexCount += 6; AddIndices(dg.mVertIndex, 6, 0, 1, 2, 1, 3, 2); @@ -985,7 +993,7 @@ void F2DDrawer::AddPixel(int x1, int y1, uint32_t color) dg.mRenderStyle = LegacyRenderStyles[STYLE_Translucent]; dg.mVertCount = 1; dg.mVertIndex = (int)mVertices.Reserve(1); - mVertices[dg.mVertIndex].Set(x1, y1, 0, 0, 0, p); + Set(&mVertices[dg.mVertIndex], x1, y1, 0, 0, 0, p); AddCommand(&dg); } diff --git a/source/common/2d/v_2ddrawer.h b/source/common/2d/v_2ddrawer.h index ff23f7919..9fc5227e7 100644 --- a/source/common/2d/v_2ddrawer.h +++ b/source/common/2d/v_2ddrawer.h @@ -167,6 +167,7 @@ public: bool isIn2D; bool locked; // prevents clearing of the data so it can be reused multiple times (useful for screen fades) float screenFade = 1.f; + DVector2 offset; public: int fullscreenautoaspect = 0; int cliptop = -1, clipleft = -1, clipwidth = -1, clipheight = -1; @@ -216,6 +217,19 @@ public: void SetClipRect(int x, int y, int w, int h); void GetClipRect(int* x, int* y, int* w, int* h); + DVector2 SetOffset(const DVector2& vec) + { + auto v = offset; + offset = vec; + return v; + } + + void Set(TwoDVertex* v, double xx, double yy, double zz, double uu, double vv, PalEntry col) + { + v->Set(xx + offset.X, yy + offset.Y, zz, uu, vv, col); + } + + int DrawCount() const { return mData.Size(); diff --git a/source/common/2d/v_draw.cpp b/source/common/2d/v_draw.cpp index 86a85c55c..ef34bbb57 100644 --- a/source/common/2d/v_draw.cpp +++ b/source/common/2d/v_draw.cpp @@ -417,8 +417,6 @@ DEFINE_ACTION_FUNCTION(_Screen, GetFullscreenRect) PARAM_FLOAT(virth); PARAM_INT(fsmode); - if (!twod->HasBegun2D()) ThrowAbortException(X_OTHER, "Attempt to draw to screen outside a draw function"); - DrawParms parms; DoubleRect rect; parms.viewport.width = twod->GetWidth(); @@ -705,6 +703,7 @@ bool ParseDrawTextureTags(F2DDrawer *drawer, FGameTexture *img, double x, double parms->rotateangle = 0; parms->flipoffsets = false; parms->indexed = false; + parms->nooffset = false; // Parse the tag list for attributes. (For floating point attributes, // consider that the C ABI dictates that all floats be promoted to @@ -916,6 +915,10 @@ bool ParseDrawTextureTags(F2DDrawer *drawer, FGameTexture *img, double x, double parms->flipoffsets = ListGetInt(tags); break; + case DTA_NoOffset: + parms->nooffset = ListGetInt(tags); + break; + case DTA_SrcX: parms->srcx = ListGetDouble(tags) / img->GetDisplayWidth(); break; @@ -1531,9 +1534,30 @@ void DrawFrame(F2DDrawer* twod, PalEntry color, int left, int top, int width, in twod->AddColorOnlyQuad(right, top - offset, offset, height + 2 * offset, color); } +DEFINE_ACTION_FUNCTION(_Screen, DrawLineFrame) +{ + PARAM_PROLOGUE; + PARAM_COLOR(color); + PARAM_INT(left); + PARAM_INT(top); + PARAM_INT(width); + PARAM_INT(height); + PARAM_INT(thickness); + DrawFrame(twod, color, left, top, width, height, thickness); + return 0; +} + void V_CalcCleanFacs(int designwidth, int designheight, int realwidth, int realheight, int* cleanx, int* cleany, int* _cx1, int* _cx2) { if (designheight < 240 && realheight >= 480) designheight = 240; *cleanx = *cleany = std::min(realwidth / designwidth, realheight / designheight); } + +DEFINE_ACTION_FUNCTION(_Screen, SetOffset) +{ + PARAM_PROLOGUE; + PARAM_FLOAT(x); + PARAM_FLOAT(y); + ACTION_RETURN_VEC2(twod->SetOffset(DVector2(x, y))); +} \ No newline at end of file diff --git a/source/common/2d/v_draw.h b/source/common/2d/v_draw.h index dc9b8d28c..b7eafbbec 100644 --- a/source/common/2d/v_draw.h +++ b/source/common/2d/v_draw.h @@ -131,6 +131,7 @@ enum DTA_FlipOffsets, // Flips offsets when using DTA_FlipX and DTA_FlipY, this cannot be automatic due to unexpected behavior with unoffsetted graphics. DTA_Indexed, // Use an indexed texture combined with the given translation. DTA_CleanTop, // Like DTA_Clean but aligns to the top of the screen instead of the center. + DTA_NoOffset, // Ignore 2D drawer's offset. }; @@ -198,6 +199,7 @@ struct DrawParms bool burn; bool flipoffsets; bool indexed; + bool nooffset; int8_t fsscalemode; double srcx, srcy; double srcwidth, srcheight; diff --git a/source/common/audio/music/music.cpp b/source/common/audio/music/music.cpp index 198b9975f..c10474d90 100644 --- a/source/common/audio/music/music.cpp +++ b/source/common/audio/music/music.cpp @@ -99,7 +99,7 @@ SoundStream *S_CreateCustomStream(size_t size, int samplerate, int numchannels, { int flags = 0; if (numchannels < 2) flags |= SoundStream::Mono; - auto stream = GSnd->CreateStream(cb, size, flags, samplerate, userdata); + auto stream = GSnd->CreateStream(cb, int(size), flags, samplerate, userdata); if (stream) stream->Play(true, 1); return stream; } diff --git a/source/common/audio/sound/s_sound.cpp b/source/common/audio/sound/s_sound.cpp index a38dc9eb8..550924854 100644 --- a/source/common/audio/sound/s_sound.cpp +++ b/source/common/audio/sound/s_sound.cpp @@ -50,7 +50,6 @@ enum }; static FRandom pr_soundpitch ("SoundPitch"); SoundEngine* soundEngine; -int sfx_empty = -1; //========================================================================== // @@ -713,10 +712,9 @@ sfxinfo_t *SoundEngine::LoadSound(sfxinfo_t *sfx) { unsigned int i; - // If the sound doesn't exist, replace it with the empty sound. - if (sfx->lumpnum == -1) + if (sfx->lumpnum == sfx_empty) { - sfx->lumpnum = sfx_empty; + return sfx; } // See if there is another sound already initialized with this lump. If so, @@ -1532,31 +1530,12 @@ int SoundEngine::AddSoundLump(const char* logicalname, int lump, int CurrentPitc S_sfx.Reserve(1); sfxinfo_t &newsfx = S_sfx.Last(); - newsfx.data.Clear(); newsfx.name = logicalname; newsfx.lumpnum = lump; newsfx.next = 0; - newsfx.index = 0; - newsfx.Volume = 1; - newsfx.Attenuation = 1; newsfx.PitchMask = CurrentPitchMask; - newsfx.DefPitch = 0.0; - newsfx.DefPitchMax = 0.0; newsfx.NearLimit = nearlimit; - newsfx.LimitRange = 256 * 256; - newsfx.bRandomHeader = false; - newsfx.bLoadRAW = false; - newsfx.b16bit = false; - newsfx.bUsed = false; - newsfx.bSingular = false; - newsfx.bTentative = false; newsfx.ResourceId = resid; - newsfx.RawRate = 0; - newsfx.link = sfxinfo_t::NO_LINK; - newsfx.Rolloff.RolloffType = ROLLOFF_Doom; - newsfx.Rolloff.MinDistance = 0; - newsfx.Rolloff.MaxDistance = 0; - newsfx.LoopStart = -1; if (resid >= 0) ResIdMap[resid] = S_sfx.Size() - 1; return (int)S_sfx.Size()-1; diff --git a/source/common/audio/sound/s_soundinternal.h b/source/common/audio/sound/s_soundinternal.h index 58b3a27c1..b3292637f 100644 --- a/source/common/audio/sound/s_soundinternal.h +++ b/source/common/audio/sound/s_soundinternal.h @@ -8,7 +8,12 @@ struct FRandomSoundList uint32_t Owner = 0; }; -extern int sfx_empty; +enum +{ + sfx_empty = -1 +}; + + // // SoundFX struct. @@ -17,71 +22,38 @@ struct sfxinfo_t { // Next field is for use by the system sound interface. // A non-null data means the sound has been loaded. - SoundHandle data; + SoundHandle data{}; - FString name; // [RH] Sound name defined in SNDINFO - int lumpnum; // lump number of sfx + FString name; // [RH] Sound name defined in SNDINFO + int lumpnum = sfx_empty; // lump number of sfx - unsigned int next, index; // [RH] For hashing - float Volume; + unsigned int next = -1, index = 0; // [RH] For hashing + float Volume = 1.f; - int ResourceId; // Resource ID as implemented by Blood. Not used by Doom but added for completeness. - uint8_t PitchMask; - int16_t NearLimit; // 0 means unlimited - float LimitRange; // Range for sound limiting (squared for faster computations) - float DefPitch; // A defined pitch instead of a random one the sound plays at, similar to A_StartSound. - float DefPitchMax; // Randomized range with stronger control over pitch itself. + int ResourceId = -1; // Resource ID as implemented by Blood. Not used by Doom but added for completeness. + float LimitRange = 256*256; // Range for sound limiting (squared for faster computations) + float DefPitch = 0.f; // A defined pitch instead of a random one the sound plays at, similar to A_StartSound. + float DefPitchMax = 0.f; // Randomized range with stronger control over pitch itself. - unsigned bRandomHeader:1; - unsigned bLoadRAW:1; - unsigned b16bit:1; - unsigned bUsed:1; - unsigned bSingular:1; + int16_t NearLimit = 4; // 0 means unlimited. + uint8_t PitchMask = 0; + bool bRandomHeader = false; + bool bLoadRAW = false; + bool b16bit = false; + bool bUsed = false; + bool bSingular = false; + bool bTentative = true; - unsigned bTentative:1; TArray UserData; - int RawRate; // Sample rate to use when bLoadRAW is true + int RawRate = 0; // Sample rate to use when bLoadRAW is true + int LoopStart = -1; // -1 means no specific loop defined - int LoopStart; // -1 means no specific loop defined - - unsigned int link; + unsigned int link = NO_LINK;; enum { NO_LINK = 0xffffffff }; - FRolloffInfo Rolloff; - float Attenuation; // Multiplies the attenuation passed to S_Sound. - - void MarkUsed(); // Marks this sound as used. - - void Clear() - { - data.Clear(); - lumpnum = -1; // lump number of sfx - next = -1; - index = 0; // [RH] For hashing - Volume = 1.f; - ResourceId = -1; - PitchMask = 0; - NearLimit = 4; // 0 means unlimited - LimitRange = 256*256; - - bRandomHeader = false; - bLoadRAW = false; - b16bit= false; - bUsed = false; - bSingular = false; - - bTentative = true; - - RawRate = 0; // Sample rate to use when bLoadRAW is true - - LoopStart = 0; // -1 means no specific loop defined - - link = NO_LINK; - - Rolloff = {}; - Attenuation = 1.f; - } + FRolloffInfo Rolloff{}; + float Attenuation = 1.f; // Multiplies the attenuation passed to S_Sound. }; // Rolloff types diff --git a/source/common/engine/date.cpp b/source/common/engine/date.cpp new file mode 100644 index 000000000..c409416f8 --- /dev/null +++ b/source/common/engine/date.cpp @@ -0,0 +1,248 @@ +/* +** date.cpp +** +** VM exports for engine backend classes +** +**--------------------------------------------------------------------------- +** +** 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 "c_dispatch.h" +#include "vm.h" +#include "zstring.h" +#include "printf.h" + +time_t epochoffset = 0; // epoch start in seconds (0 = January 1st, 1970) + + +//========================================================================== +// +// CCMD setdate +// +// Set the time to a specific value +// +//========================================================================== + +UNSAFE_CCMD(setdate) +{ + if (argv.argc() != 3) + { + Printf("setdate HH:MM:SS DD-MM-YYYY: Set the current date\n"); + return; + } + + time_t today; + time(&today); + struct tm* timeinfo = localtime(&today); + if (timeinfo != nullptr) + { + auto clock = FString(argv[1]).Split(":"); + auto date = FString(argv[2]).Split("-"); + if(clock.Size() != 3 || date.Size() != 3) + { + Printf("setdate HH:MM:SS DD-MM-YYYY: Set the current date\n"); + return; + } + + if(!clock[0].IsInt()) + { + Printf("Invalid hour\n"); + return; + } + if (!clock[1].IsInt()) + { + Printf("Invalid minutes\n"); + return; + } + if (!clock[2].IsInt()) + { + Printf("Invalid seconds\n"); + return; + } + if (!date[0].IsInt()) + { + Printf("Invalid day\n"); + return; + } + if (!date[1].IsInt()) + { + Printf("Invalid month\n"); + return; + } + if (!date[2].IsInt()) + { + Printf("Invalid year\n"); + return; + } + + //Set Date + timeinfo->tm_hour = int( clock[0].ToLong() ); + timeinfo->tm_min = int( clock[1].ToLong() ); + timeinfo->tm_sec = int( clock[2].ToLong() ); + timeinfo->tm_mday = int( date[0].ToLong() ); + timeinfo->tm_mon = int( date[1].ToLong() - 1); // Month interally is 0 - 11 + timeinfo->tm_year = int( date[2].ToLong() - 1900 ); // Year interally is 00 - 138 + + time_t newTime = mktime(timeinfo); + tm* t_old = localtime(&today); + time_t oldTime = mktime(t_old); + + if (newTime == -1 || oldTime == -1) + { + Printf("Unable to set the date\n"); + return; + } + + epochoffset = newTime - oldTime; + + // This deals with some inconsistent display behaviour for DST + // In this case, we want to emulate GCC's behaviour + today += epochoffset; + struct tm* t_new = localtime(&today); + if (t_new != nullptr) + { + char timeString[1024]; + if (strftime(timeString, sizeof(timeString), "%H", t_new)) + { + auto hour = FString(timeString).ToLong(); + if (hour - clock[0].ToLong() == -1 || hour - clock[0].ToLong() == 23) + epochoffset += 3600; + else if (hour - clock[0].ToLong() == 1 || hour - clock[0].ToLong() == -23) + epochoffset -= 3600; + } + } + + return; + } + else + { + Printf("Unable to set the date\n"); + return; + } +} + +CCMD(getdate) +{ + time_t now; + time(&now); + now += epochoffset; + struct tm* timeinfo = localtime(&now); + if (timeinfo != nullptr) + { + char timeString[1024]; + if (strftime(timeString, sizeof(timeString), "%H:%M:%S %d-%m-%Y%n", timeinfo)) + Printf("%s\n", timeString); + else + Printf("Error Retrieving Current Date\n"); + } + else + { + Printf("Error Retrieving Current Date\n"); + } +} + +//===================================================================================== +// +// +// +//===================================================================================== + +extern time_t epochoffset; + +static int GetEpochTime() +{ + time_t now; + time(&now); + return now != (time_t)(-1) ? int(now + epochoffset) : -1; +} + +//Returns an empty string if the Strf tokens are valid, otherwise returns the problematic token +static FString CheckStrfString(FString timeForm) +{ + // Valid Characters after % + const char validSingles[] = { 'a','A','b','B','c','C','d','D','e','F','g','G','h','H','I','j','m','M','n','p','r','R','S','t','T','u','U','V','w','W','x','X','y','Y','z','Z' }; + + timeForm.Substitute("%%", "%a"); //Prevent %% from causing tokenizing problems + timeForm = "a" + timeForm; //Prevent %* at the beginning from causing a false error from tokenizing + + auto tokens = timeForm.Split("%"); + for (auto t : tokens) + { + bool found = false; + // % at end + if (t.Len() == 0) return FString("%"); + + // Single Character + for (size_t i = 0; i < sizeof(validSingles) / sizeof(validSingles[0]); i++) + { + if (t[0] == validSingles[i]) + { + found = true; + break; + } + } + if (found) continue; + return FString("%") + t[0]; + } + return ""; +} + +static void FormatTime(const FString& timeForm, int timeVal, FString* result) +{ + FString error = CheckStrfString(timeForm); + if (!error.IsEmpty()) + ThrowAbortException(X_FORMAT_ERROR, "'%s' is not a valid format specifier of SystemTime.Format()", error.GetChars()); + + time_t val = timeVal; + struct tm* timeinfo = localtime(&val); + if (timeinfo != nullptr) + { + char timeString[1024]; + if (strftime(timeString, sizeof(timeString), timeForm, timeinfo)) + *result = timeString; + } +} + +DEFINE_ACTION_FUNCTION_NATIVE(_SystemTime, Now, GetEpochTime) +{ + PARAM_PROLOGUE; + ACTION_RETURN_INT(GetEpochTime()); +} + +DEFINE_ACTION_FUNCTION_NATIVE(_SystemTime, Format, FormatTime) +{ + PARAM_PROLOGUE; + PARAM_STRING(timeForm); + PARAM_INT(timeVal); + FString result; + FormatTime(timeForm, timeVal, &result); + ACTION_RETURN_STRING(result); +} + + diff --git a/source/common/engine/i_interface.h b/source/common/engine/i_interface.h index 80cc3b1e9..d50acb81b 100644 --- a/source/common/engine/i_interface.h +++ b/source/common/engine/i_interface.h @@ -22,6 +22,10 @@ struct SystemCallbacks void (*MenuDim)(); FString(*GetPlayerName)(int i); bool (*DispatchEvent)(event_t* ev); + bool (*CheckGame)(const char* nm); + int (*GetGender)(); + void (*MenuClosed)(); + bool (*CheckMenudefOption)(const char* opt); }; extern SystemCallbacks sysCallbacks; @@ -36,3 +40,6 @@ struct WadStuff extern FString endoomName; extern bool batchrun; extern float menuBlurAmount; +extern bool generic_ui; + +void UpdateGenericUI(bool cvar); diff --git a/source/common/engine/i_net.h b/source/common/engine/i_net.h index e50955295..87d720014 100644 --- a/source/common/engine/i_net.h +++ b/source/common/engine/i_net.h @@ -81,5 +81,6 @@ struct doomcom_t extern doomcom_t doomcom; extern bool netgame, multiplayer; +extern int consoleplayer; #endif diff --git a/source/common/engine/namedef.h b/source/common/engine/namedef.h index e6bdcee92..64d8c5490 100644 --- a/source/common/engine/namedef.h +++ b/source/common/engine/namedef.h @@ -715,8 +715,10 @@ xx(MainmenuTextOnly) xx(Episodemenu) xx(Playerclassmenu) xx(HexenDefaultPlayerclassmenu) +xx(ListMenuItemBloodDripDrawer) xx(Skillmenu) xx(Startgame) +xx(StartgameNoSkill) xx(StartgameConfirm) xx(StartgameConfirmed) xx(Loadgamemenu) @@ -1078,6 +1080,7 @@ xx(PlayerSkin) xx(NewPlayerMenu) xx(AltHud) xx(GameScreen) +xx(ListM) // summary xx(cwidth) @@ -1086,3 +1089,14 @@ xx(wrapwidth) xx(scalefactorx) xx(scalefactory) xx(scalemode) + +xy(menu_cursor, "menu/cursor") +xy(menu_choose, "menu/choose") +xy(menu_backup, "menu/backup") +xy(menu_clear, "menu/clear") +xy(menu_dismiss, "menu/dismiss") +xy(menu_change, "menu/change") +xy(menu_advance, "menu/advance") + +xx(zoomsize) + diff --git a/source/common/engine/sc_man.cpp b/source/common/engine/sc_man.cpp index 6cf0044c3..e3225d396 100644 --- a/source/common/engine/sc_man.cpp +++ b/source/common/engine/sc_man.cpp @@ -1044,8 +1044,8 @@ bool FScanner::ScanValue(bool allowfloat, bool evaluate) auto d = constants.CheckKey(String); if (!d) return false; if (!allowfloat && int64_t(*d) != *d) return false; - BigNumber = *d; - Number = *d; + BigNumber = int64_t(*d); + Number = int(*d); Float = *d; } if (neg) @@ -1231,8 +1231,8 @@ void FScanner::AddSymbol(const char *name, int64_t value) { Symbol sym; sym.tokenType = TK_IntConst; - sym.Number = value; - sym.Float = value; + sym.Number = int(value); + sym.Float = double(value); symbols.Insert(name, sym); } diff --git a/source/common/engine/stringtable.cpp b/source/common/engine/stringtable.cpp index 8927011dc..eea149ef0 100644 --- a/source/common/engine/stringtable.cpp +++ b/source/common/engine/stringtable.cpp @@ -39,6 +39,7 @@ #include "filesystem.h" #include "sc_man.h" #include "printf.h" +#include "i_interface.h" //========================================================================== // @@ -237,12 +238,12 @@ bool FStringTable::ParseLanguageCSV(int lumpnum, const TArray &buffer) if (filterstr.IsNotEmpty()) { bool ok = false; - if (callbacks && callbacks->ValidFilter) + if (sysCallbacks.CheckGame) { auto filter = filterstr.Split(" ", FString::TOK_SKIPEMPTY); for (auto& entry : filter) { - if (callbacks->ValidFilter(entry)) + if (sysCallbacks.CheckGame(entry)) { ok = true; break; @@ -356,7 +357,7 @@ void FStringTable::LoadLanguage (int lumpnum, const TArray &buffer) sc.MustGetStringName("ifgame"); sc.MustGetStringName("("); sc.MustGetString(); - skip |= (!callbacks || !callbacks->ValidFilter || !callbacks->ValidFilter(sc.String)); + skip |= (!sysCallbacks.CheckGame || !sysCallbacks.CheckGame(sc.String)); sc.MustGetStringName(")"); sc.MustGetString(); @@ -564,7 +565,7 @@ const char *FStringTable::GetString(const char *name, uint32_t *langtable, int g { return nullptr; } - if (gender == -1 && callbacks && callbacks->GetPlayerGender) gender = callbacks->GetPlayerGender(); + if (gender == -1 && sysCallbacks.GetGender) gender = sysCallbacks.GetGender(); if (gender < 0 || gender > 3) gender = 0; FName nm(name, true); if (nm != NAME_None) @@ -597,7 +598,7 @@ const char *FStringTable::GetLanguageString(const char *name, uint32_t langtable { return nullptr; } - if (gender == -1 && callbacks && callbacks->GetPlayerGender) gender = callbacks->GetPlayerGender(); + if (gender == -1 && sysCallbacks.GetGender) gender = sysCallbacks.GetGender(); if (gender < 0 || gender > 3) gender = 0; FName nm(name, true); if (nm != NAME_None) @@ -665,3 +666,5 @@ const char *StringMap::MatchString (const char *string) const } FStringTable GStrings; + + diff --git a/source/common/engine/stringtable.h b/source/common/engine/stringtable.h index 6562834b5..0467b27ed 100644 --- a/source/common/engine/stringtable.h +++ b/source/common/engine/stringtable.h @@ -50,13 +50,6 @@ #include "name.h" -struct StringtableCallbacks -{ - // These two functions would create a dependency on the game code so they are installed as callbacks. - bool (*ValidFilter)(const char* str); - int (*GetPlayerGender)(); -}; - struct TableElement { int filenum; @@ -108,7 +101,6 @@ public: return GetString(name, nullptr); } bool exists(const char *name); - void SetCallbacks(StringtableCallbacks* cb) { callbacks = cb; } void InsertString(int lumpnum, int langid, FName label, const FString& string); @@ -118,8 +110,7 @@ private: StringMacroMap allMacros; LangMap allStrings; TArray> currentLanguageSet; - StringtableCallbacks* callbacks = nullptr; - + void LoadLanguage (int lumpnum, const TArray &buffer); TArray> parseCSV(const TArray &buffer); bool ParseLanguageCSV(int lumpnum, const TArray &buffer); diff --git a/source/common/fonts/v_text.cpp b/source/common/fonts/v_text.cpp index 375e2d67b..742a99e6f 100644 --- a/source/common/fonts/v_text.cpp +++ b/source/common/fonts/v_text.cpp @@ -46,6 +46,7 @@ #include "gstrings.h" #include "vm.h" #include "serializer.h" +#include "c_cvars.h" //========================================================================== // @@ -240,3 +241,46 @@ DEFINE_ACTION_FUNCTION(FFont, BreakLines) auto broken = V_BreakLines(self, maxwidth, text, true); ACTION_RETURN_OBJECT(Create(broken)); } + + +bool generic_ui; +EXTERN_CVAR(String, language) + +bool CheckFontComplete(FFont* font) +{ + // Also check if the SmallFont contains all characters this language needs. + // If not, switch back to the original one. + return font->CanPrint(GStrings["REQUIRED_CHARACTERS"]); +} + +void UpdateGenericUI(bool cvar) +{ + auto switchstr = GStrings["USE_GENERIC_FONT"]; + generic_ui = (cvar || (switchstr && strtoll(switchstr, nullptr, 0))); + if (!generic_ui) + { + // Use the mod's SmallFont if it is complete. + // Otherwise use the stock Smallfont if it is complete. + // If none is complete, fall back to the VGA font. + // The font being set here will be used in 3 places: Notifications, centered messages and menu confirmations. + if (CheckFontComplete(SmallFont)) + { + AlternativeSmallFont = SmallFont; + } + else if (OriginalSmallFont && CheckFontComplete(OriginalSmallFont)) + { + AlternativeSmallFont = OriginalSmallFont; + } + else + { + AlternativeSmallFont = NewSmallFont; + } + + // Todo: Do the same for the BigFont + } +} + +CUSTOM_CVAR(Bool, ui_generic, false, CVAR_NOINITCALL) // This is for allowing to test the generic font system with all languages +{ + UpdateGenericUI(self); +} diff --git a/source/common/menu/joystickmenu.cpp b/source/common/menu/joystickmenu.cpp new file mode 100644 index 000000000..4baea836f --- /dev/null +++ b/source/common/menu/joystickmenu.cpp @@ -0,0 +1,198 @@ +/* +** joystickmenu.cpp +** The joystick configuration menus +** +**--------------------------------------------------------------------------- +** Copyright 2010 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 "menu.h" +#include "m_joy.h" +#include "vm.h" + +static TArray Joysticks; + +DEFINE_ACTION_FUNCTION(IJoystickConfig, GetSensitivity) +{ + PARAM_SELF_STRUCT_PROLOGUE(IJoystickConfig); + ACTION_RETURN_FLOAT(self->GetSensitivity()); +} + +DEFINE_ACTION_FUNCTION(IJoystickConfig, SetSensitivity) +{ + PARAM_SELF_STRUCT_PROLOGUE(IJoystickConfig); + PARAM_FLOAT(sens); + self->SetSensitivity((float)sens); + return 0; +} + +DEFINE_ACTION_FUNCTION(IJoystickConfig, GetAxisScale) +{ + PARAM_SELF_STRUCT_PROLOGUE(IJoystickConfig); + PARAM_INT(axis); + ACTION_RETURN_FLOAT(self->GetAxisScale(axis)); +} + +DEFINE_ACTION_FUNCTION(IJoystickConfig, SetAxisScale) +{ + PARAM_SELF_STRUCT_PROLOGUE(IJoystickConfig); + PARAM_INT(axis); + PARAM_FLOAT(sens); + self->SetAxisScale(axis, (float)sens); + return 0; +} + +DEFINE_ACTION_FUNCTION(IJoystickConfig, GetAxisDeadZone) +{ + PARAM_SELF_STRUCT_PROLOGUE(IJoystickConfig); + PARAM_INT(axis); + ACTION_RETURN_FLOAT(self->GetAxisDeadZone(axis)); +} + +DEFINE_ACTION_FUNCTION(IJoystickConfig, SetAxisDeadZone) +{ + PARAM_SELF_STRUCT_PROLOGUE(IJoystickConfig); + PARAM_INT(axis); + PARAM_FLOAT(dz); + self->SetAxisDeadZone(axis, (float)dz); + return 0; +} + +DEFINE_ACTION_FUNCTION(IJoystickConfig, GetAxisMap) +{ + PARAM_SELF_STRUCT_PROLOGUE(IJoystickConfig); + PARAM_INT(axis); + ACTION_RETURN_INT(self->GetAxisMap(axis)); +} + +DEFINE_ACTION_FUNCTION(IJoystickConfig, SetAxisMap) +{ + PARAM_SELF_STRUCT_PROLOGUE(IJoystickConfig); + PARAM_INT(axis); + PARAM_INT(map); + self->SetAxisMap(axis, (EJoyAxis)map); + return 0; +} + +DEFINE_ACTION_FUNCTION(IJoystickConfig, GetName) +{ + PARAM_SELF_STRUCT_PROLOGUE(IJoystickConfig); + ACTION_RETURN_STRING(self->GetName()); +} + +DEFINE_ACTION_FUNCTION(IJoystickConfig, GetAxisName) +{ + PARAM_SELF_STRUCT_PROLOGUE(IJoystickConfig); + PARAM_INT(axis); + ACTION_RETURN_STRING(self->GetAxisName(axis)); +} + +DEFINE_ACTION_FUNCTION(IJoystickConfig, GetNumAxes) +{ + PARAM_SELF_STRUCT_PROLOGUE(IJoystickConfig); + ACTION_RETURN_INT(self->GetNumAxes()); +} + + +void UpdateJoystickMenu(IJoystickConfig *selected) +{ + DMenuDescriptor **desc = MenuDescriptors.CheckKey(NAME_JoystickOptions); + DMenuDescriptor **ddesc = MenuDescriptors.CheckKey("JoystickOptionsDefaults"); + if (ddesc == nullptr) return; // without any data the menu cannot be set up and must remain empty. + if (desc != NULL && (*desc)->IsKindOf(RUNTIME_CLASS(DOptionMenuDescriptor))) + { + DOptionMenuDescriptor *opt = (DOptionMenuDescriptor *)*desc; + DOptionMenuDescriptor *dopt = (DOptionMenuDescriptor *)*ddesc; + if (dopt == nullptr) return; + DMenuItemBase *it; + + int i; + int itemnum = -1; + + I_GetJoysticks(Joysticks); + if ((unsigned)itemnum >= Joysticks.Size()) + { + itemnum = Joysticks.Size() - 1; + } + if (selected != NULL) + { + for (i = 0; (unsigned)i < Joysticks.Size(); ++i) + { + if (Joysticks[i] == selected) + { + itemnum = i; + break; + } + } + } + opt->mItems = dopt->mItems; + + it = opt->GetItem("ConfigureMessage"); + if (it != nullptr) it->SetValue(0, !!Joysticks.Size()); + it = opt->GetItem("ConnectMessage1"); + if (it != nullptr) it->SetValue(0, !use_joystick); + it = opt->GetItem("ConnectMessage2"); + if (it != nullptr) it->SetValue(0, !use_joystick); + + for (int i = 0; i < (int)Joysticks.Size(); ++i) + { + it = CreateOptionMenuItemJoyConfigMenu(Joysticks[i]->GetName(), Joysticks[i]); + GC::WriteBarrier(opt, it); + opt->mItems.Push(it); + if (i == itemnum) opt->mSelectedItem = opt->mItems.Size(); + } + if (opt->mSelectedItem >= (int)opt->mItems.Size()) + { + opt->mSelectedItem = opt->mItems.Size() - 1; + } + //opt->CalcIndent(); + + // If the joystick config menu is open, close it if the device it's open for is gone. + if (CurrentMenu != nullptr && (CurrentMenu->IsKindOf("JoystickConfigMenu"))) + { + auto p = CurrentMenu->PointerVar("mJoy"); + if (p != nullptr) + { + unsigned i; + for (i = 0; i < Joysticks.Size(); ++i) + { + if (Joysticks[i] == p) + { + break; + } + } + if (i == Joysticks.Size()) + { + CurrentMenu->Close(); + } + } + } + } +} + diff --git a/source/common/menu/menu.cpp b/source/common/menu/menu.cpp new file mode 100644 index 000000000..6191f1b60 --- /dev/null +++ b/source/common/menu/menu.cpp @@ -0,0 +1,1235 @@ +/* +** menu.cpp +** Menu base class and global interface +** +**--------------------------------------------------------------------------- +** Copyright 2010 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 "c_dispatch.h" +#include "d_gui.h" +#include "c_buttons.h" +#include "c_console.h" +#include "c_bind.h" +#include "d_eventbase.h" +#include "g_input.h" +#include "configfile.h" +#include "gstrings.h" +#include "menu.h" +#include "vm.h" +#include "v_video.h" +#include "i_system.h" +#include "types.h" +#include "texturemanager.h" +#include "v_draw.h" +#include "vm.h" +#include "gamestate.h" +#include "i_interface.h" +#include "menustate.h" +#include "i_time.h" +#include "printf.h" + +void M_StartControlPanel(bool makeSound, bool scaleoverride = false); + +int DMenu::InMenu; +static ScaleOverrider *CurrentScaleOverrider; +extern int chatmodeon; +// +// Todo: Move these elsewhere +// +CVAR (Int, m_showinputgrid, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CVAR(Bool, m_blockcontrollers, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) + +CVAR (Float, snd_menuvolume, 0.6f, CVAR_ARCHIVE) +CVAR(Int, m_use_mouse, 2, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) +CVAR(Int, m_show_backbutton, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) +CVAR(Bool, m_cleanscale, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +// Option Search +CVAR(Bool, os_isanyof, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) + + +static DMenu *GetCurrentMenu() +{ + return CurrentMenu; +} + +DEFINE_ACTION_FUNCTION_NATIVE(DMenu, GetCurrentMenu, GetCurrentMenu) +{ + ACTION_RETURN_OBJECT(CurrentMenu); +} + +static int GetMenuTime() +{ + return MenuTime; +} + +DEFINE_ACTION_FUNCTION_NATIVE(DMenu, MenuTime, GetMenuTime) +{ + ACTION_RETURN_INT(MenuTime); +} + +EMenuState menuactive; +FButtonStatus MenuButtons[NUM_MKEYS]; +int MenuButtonTickers[NUM_MKEYS]; +bool MenuButtonOrigin[NUM_MKEYS]; +int BackbuttonTime; +float BackbuttonAlpha; +static bool MenuEnabled = true; +DMenu *CurrentMenu; +int MenuTime; +DObject* menuDelegate; +static MenuTransition transition; + + +extern PClass *DefaultListMenuClass; +extern PClass *DefaultOptionMenuClass; + + +#define KEY_REPEAT_DELAY (GameTicRate*5/12) +#define KEY_REPEAT_RATE (3) + +bool OkForLocalization(FTextureID texnum, const char* substitute); + +//============================================================================ +// +// +// +//============================================================================ + +IMPLEMENT_CLASS(DMenuDescriptor, false, false) +IMPLEMENT_CLASS(DListMenuDescriptor, false, false) +IMPLEMENT_CLASS(DOptionMenuDescriptor, false, false) +IMPLEMENT_CLASS(DImageScrollerDescriptor, false, false) + +DMenuDescriptor *GetMenuDescriptor(int name) +{ + DMenuDescriptor **desc = MenuDescriptors.CheckKey(ENamedName(name)); + return desc ? *desc : nullptr; +} + +DEFINE_ACTION_FUNCTION_NATIVE(DMenuDescriptor, GetDescriptor, GetMenuDescriptor) +{ + PARAM_PROLOGUE; + PARAM_NAME(name); + ACTION_RETURN_OBJECT(GetMenuDescriptor(name.GetIndex())); +} + +size_t DMenuDescriptor::PropagateMark() +{ + for (auto item : mItems) GC::Mark(item); + return 0; +} + + +void DListMenuDescriptor::Reset() +{ + // Reset the default settings (ignore all other values in the struct) + mSelectOfsX = 0; + mSelectOfsY = 0; + mSelector.SetInvalid(); + mDisplayTop = 0; + mXpos = 0; + mYpos = 0; + mLinespacing = 0; + mNetgameMessage = ""; + mFont = NULL; + mFontColor = CR_UNTRANSLATED; + mFontColor2 = CR_UNTRANSLATED; + mFromEngine = false; + mVirtWidth = mVirtHeight = -1; // default to clean scaling +} + +DEFINE_ACTION_FUNCTION(DListMenuDescriptor, Reset) +{ + PARAM_SELF_PROLOGUE(DListMenuDescriptor); + self->Reset(); + return 0; +} + + +void DOptionMenuDescriptor::Reset() +{ + // Reset the default settings (ignore all other values in the struct) + mPosition = 0; + mScrollTop = 0; + mIndent = 0; + mDontDim = 0; + mFont = BigUpper; +} + +void M_MarkMenus() +{ + MenuDescriptorList::Iterator it(MenuDescriptors); + MenuDescriptorList::Pair *pair; + while (it.NextPair(pair)) + { + GC::Mark(pair->Value); + } + GC::Mark(CurrentMenu); + GC::Mark(menuDelegate); + GC::Mark(transition.previous); + GC::Mark(transition.current); +} + + +//============================================================================ +// +// Transition animation +// +//============================================================================ + +bool MenuTransition::StartTransition(DMenu* from, DMenu* to, MenuTransitionType animtype) +{ + if (!from->canAnimate() || !to->canAnimate() || animtype == MA_None) + { + return false; + } + else + { + start = I_GetTimeNS() * (120. / 1'000'000'000.); + length = 30; + dir = animtype == MA_Advance ? 1 : -1; + destroyprev = animtype == MA_Return; + previous = from; + current = to; + if (from) GC::WriteBarrier(from); + if (to) GC::WriteBarrier(to); + return true; + } +} + +bool MenuTransition::Draw() +{ + double now = I_GetTimeNS() * (120. / 1'000'000'000); + if (now < start + length) + { + double factor = screen->GetWidth()/2; + double phase = (now - start) / double(length) * M_PI + M_PI / 2; + DVector2 origin; + + origin.Y = 0; + origin.X = factor * dir * (sin(phase) - 1.); + twod->SetOffset(origin); + previous->CallDrawer(); + origin.X = factor * dir * (sin(phase) + 1.); + twod->SetOffset(origin); + current->CallDrawer(); + origin = { 0,0 }; + twod->SetOffset(origin); + return true; + } + if (destroyprev && previous) previous->Destroy(); + previous = nullptr; + current = nullptr; + return false; +} + + +//============================================================================ +// +// DMenu base class +// +//============================================================================ + +IMPLEMENT_CLASS(DMenu, false, true) + +IMPLEMENT_POINTERS_START(DMenu) + IMPLEMENT_POINTER(mParentMenu) +IMPLEMENT_POINTERS_END + +DMenu::DMenu(DMenu *parent) +{ + mParentMenu = parent; + mMouseCapture = false; + mBackbuttonSelected = false; + DontDim = false; + GC::WriteBarrier(this, parent); +} + +//============================================================================= +// +// +// +//============================================================================= + +bool DMenu::CallResponder(event_t *ev) +{ + if (ev->type == EV_GUI_Event) + { + IFVIRTUAL(DMenu, OnUIEvent) + { + FUiEvent e = ev; + VMValue params[] = { (DObject*)this, &e }; + int retval; + VMReturn ret(&retval); + InMenu++; + VMCall(func, params, 2, &ret, 1); + InMenu--; + return !!retval; + } + } + else + { + IFVIRTUAL(DMenu, OnInputEvent) + { + FInputEvent e = ev; + VMValue params[] = { (DObject*)this, &e }; + int retval; + VMReturn ret(&retval); + InMenu++; + VMCall(func, params, 2, &ret, 1); + InMenu--; + return !!retval; + } + } + return false; +} + +//============================================================================= +// +// +// +//============================================================================= + +bool DMenu::CallMenuEvent(int mkey, bool fromcontroller) +{ + IFVIRTUAL(DMenu, MenuEvent) + { + VMValue params[] = { (DObject*)this, mkey, fromcontroller }; + int retval; + VMReturn ret(&retval); + InMenu++; + VMCall(func, params, 3, &ret, 1); + InMenu--; + return !!retval; + } + else return false; +} +//============================================================================= +// +// +// +//============================================================================= + +static void SetMouseCapture(bool on) +{ + if (on) I_SetMouseCapture(); + else I_ReleaseMouseCapture(); +} +DEFINE_ACTION_FUNCTION_NATIVE(DMenu, SetMouseCapture, SetMouseCapture) +{ + PARAM_PROLOGUE; + PARAM_BOOL(on); + SetMouseCapture(on); + return 0; +} + +void DMenu::Close () +{ + if (CurrentMenu == nullptr) return; // double closing can happen in the save menu. + assert(CurrentMenu == this); + CurrentMenu = mParentMenu; + + if (CurrentMenu != nullptr) + { + GC::WriteBarrier(CurrentMenu); + IFVIRTUALPTR(CurrentMenu, DMenu, OnReturn) + { + VMValue params[] = { CurrentMenu }; + VMCall(func, params, 1, nullptr, 0); + } + if (transition.StartTransition(this, CurrentMenu, MA_Return)) + { + return; + } + } + + Destroy(); + if (CurrentMenu == nullptr) + { + M_ClearMenus(); + } +} + + +static void Close(DMenu *menu) +{ + menu->Close(); +} + +DEFINE_ACTION_FUNCTION_NATIVE(DMenu, Close, Close) +{ + PARAM_SELF_PROLOGUE(DMenu); + self->Close(); + return 0; +} + +//============================================================================= +// +// +// +//============================================================================= + +void DMenu::CallTicker() +{ + IFVIRTUAL(DMenu, Ticker) + { + VMValue params[] = { (DObject*)this }; + VMCall(func, params, 1, nullptr, 0); + } +} + + +void DMenu::CallDrawer() +{ + IFVIRTUAL(DMenu, Drawer) + { + VMValue params[] = { (DObject*)this }; + VMCall(func, params, 1, nullptr, 0); + twod->ClearClipRect(); // make sure the scripts don't leave a valid clipping rect behind. + } +} + +bool DMenu::TranslateKeyboardEvents() +{ + IFVIRTUAL(DMenu, TranslateKeyboardEvents) + { + VMValue params[] = { (DObject*)this }; + int retval; + VMReturn ret(&retval); + VMCall(func, params, countof(params), &ret, 1); + return !!retval; + } + return true; +} + +//============================================================================= +// +// +// +//============================================================================= + +void M_DoStartControlPanel (bool scaleoverride) +{ + // intro might call this repeatedly + if (CurrentMenu != nullptr) + return; + + buttonMap.ResetButtonStates (); + for (int i = 0; i < NUM_MKEYS; ++i) + { + MenuButtons[i].ReleaseKey(0); + } + + C_HideConsole (); // [RH] Make sure console goes bye bye. + menuactive = MENU_On; + BackbuttonTime = 0; + BackbuttonAlpha = 0; + if (scaleoverride && !CurrentScaleOverrider) CurrentScaleOverrider = new ScaleOverrider(twod); + else if (!scaleoverride && CurrentScaleOverrider) + { + delete CurrentScaleOverrider; + CurrentScaleOverrider = nullptr; + } +} + + +bool M_IsAnimated() +{ + if (ConsoleState == c_down) return false; + if (!CurrentMenu) return false; + if (CurrentMenu->Animated) return true; + if (transition.previous) return true; + return false; +} + + +//============================================================================= +// +// +// +//============================================================================= + +void M_ActivateMenu(DMenu *menu) +{ + if (menuactive == MENU_Off) menuactive = MENU_On; + if (CurrentMenu != nullptr) + { + if (CurrentMenu->mMouseCapture) + { + CurrentMenu->mMouseCapture = false; + I_ReleaseMouseCapture(); + } + transition.StartTransition(CurrentMenu, menu, MA_Advance); + } + CurrentMenu = menu; + GC::WriteBarrier(CurrentMenu); +} + +DEFINE_ACTION_FUNCTION(DMenu, ActivateMenu) +{ + PARAM_SELF_PROLOGUE(DMenu); + M_ActivateMenu(self); + return 0; +} + +//============================================================================= +// +// +// +//============================================================================= + +bool M_SetSpecialMenu(FName& menu, int param); // game specific checks + +void M_SetMenu(FName menu, int param) +{ + if (!M_SetSpecialMenu(menu, param)) return; + + DMenuDescriptor **desc = MenuDescriptors.CheckKey(menu); + if (desc != nullptr) + { + + if ((*desc)->IsKindOf(RUNTIME_CLASS(DListMenuDescriptor))) + { + DListMenuDescriptor *ld = static_cast(*desc); + if (ld->mAutoselect >= 0 && ld->mAutoselect < (int)ld->mItems.Size()) + { + // recursively activate the autoselected item without ever creating this menu. + ld->mItems[ld->mAutoselect]->Activate(); + } + else + { + PClass *cls = ld->mClass; + if (cls == nullptr) cls = DefaultListMenuClass; + if (cls == nullptr) cls = PClass::FindClass("ListMenu"); + + DMenu *newmenu = (DMenu *)cls->CreateNew(); + IFVIRTUALPTRNAME(newmenu, "ListMenu", Init) + { + VMValue params[3] = { newmenu, CurrentMenu, ld }; + VMCall(func, params, 3, nullptr, 0); + } + M_ActivateMenu(newmenu); + } + } + else if ((*desc)->IsKindOf(RUNTIME_CLASS(DOptionMenuDescriptor))) + { + DOptionMenuDescriptor *ld = static_cast(*desc); + PClass *cls = ld->mClass; + if (cls == nullptr) cls = DefaultOptionMenuClass; + if (cls == nullptr) cls = PClass::FindClass("OptionMenu"); + + DMenu *newmenu = (DMenu*)cls->CreateNew(); + IFVIRTUALPTRNAME(newmenu, "OptionMenu", Init) + { + VMValue params[3] = { newmenu, CurrentMenu, ld }; + VMCall(func, params, 3, nullptr, 0); + } + M_ActivateMenu(newmenu); + } + else if ((*desc)->IsKindOf(RUNTIME_CLASS(DImageScrollerDescriptor))) + { + auto ld = static_cast(*desc); + PClass* cls = ld->mClass; + if (cls == nullptr) cls = DefaultOptionMenuClass; + if (cls == nullptr) cls = PClass::FindClass("ImageScrollerMenu"); + + DMenu* newmenu = (DMenu*)cls->CreateNew(); + IFVIRTUALPTRNAME(newmenu, "ImageScrollerMenu", Init) + { + VMValue params[3] = { newmenu, CurrentMenu, ld }; + VMCall(func, params, 3, nullptr, 0); + } + M_ActivateMenu(newmenu); + } + return; + } + else + { + PClass *menuclass = PClass::FindClass(menu); + if (menuclass != nullptr) + { + if (menuclass->IsDescendantOf("GenericMenu")) + { + DMenu *newmenu = (DMenu*)menuclass->CreateNew(); + + IFVIRTUALPTRNAME(newmenu, "GenericMenu", Init) + { + VMValue params[3] = { newmenu, CurrentMenu }; + VMCall(func, params, 2, nullptr, 0); + } + M_ActivateMenu(newmenu); + return; + } + } + } + Printf("Attempting to open menu of unknown type '%s'\n", menu.GetChars()); + M_ClearMenus(); +} + +DEFINE_ACTION_FUNCTION(DMenu, SetMenu) +{ + PARAM_PROLOGUE; + PARAM_NAME(menu); + PARAM_INT(mparam); + M_SetMenu(menu, mparam); + return 0; +} +//============================================================================= +// +// +// +//============================================================================= + +bool M_Responder (event_t *ev) +{ + int ch = 0; + bool keyup = false; + int mkey = NUM_MKEYS; + bool fromcontroller = true; + + if (chatmodeon) + { + return false; + } + + if (CurrentMenu != nullptr && menuactive != MENU_Off) + { + // There are a few input sources we are interested in: + // + // EV_KeyDown / EV_KeyUp : joysticks/gamepads/controllers + // EV_GUI_KeyDown / EV_GUI_KeyUp : the keyboard + // EV_GUI_Char : printable characters, which we want in string input mode + // + // This code previously listened for EV_GUI_KeyRepeat to handle repeating + // in the menus, but that doesn't work with gamepads, so now we combine + // the multiple inputs into buttons and handle the repetition manually. + if (ev->type == EV_GUI_Event) + { + fromcontroller = false; + if (ev->subtype == EV_GUI_KeyRepeat) + { + // We do our own key repeat handling but still want to eat the + // OS's repeated keys. + return true; + } + else if (ev->subtype == EV_GUI_BackButtonDown || ev->subtype == EV_GUI_BackButtonUp) + { + mkey = MKEY_Back; + keyup = ev->subtype == EV_GUI_BackButtonUp; + } + else if (ev->subtype != EV_GUI_KeyDown && ev->subtype != EV_GUI_KeyUp) + { + // do we want mouse input? + if (ev->subtype >= EV_GUI_FirstMouseEvent && ev->subtype <= EV_GUI_LastMouseEvent) + { + if (!m_use_mouse) + return true; + } + + // pass everything else on to the current menu + return CurrentMenu->CallResponder(ev); + } + else if (CurrentMenu->TranslateKeyboardEvents()) + { + ch = ev->data1; + keyup = ev->subtype == EV_GUI_KeyUp; + switch (ch) + { + case GK_BACK: mkey = MKEY_Back; break; + case GK_ESCAPE: mkey = MKEY_Back; break; + case GK_RETURN: mkey = MKEY_Enter; break; + case GK_UP: mkey = MKEY_Up; break; + case GK_DOWN: mkey = MKEY_Down; break; + case GK_LEFT: mkey = MKEY_Left; break; + case GK_RIGHT: mkey = MKEY_Right; break; + case GK_BACKSPACE: mkey = MKEY_Clear; break; + case GK_PGUP: mkey = MKEY_PageUp; break; + case GK_PGDN: mkey = MKEY_PageDown; break; + default: + if (!keyup) + { + return CurrentMenu->CallResponder(ev); + } + break; + } + } + } + else if (menuactive != MENU_WaitKey && (ev->type == EV_KeyDown || ev->type == EV_KeyUp)) + { + // eat blocked controller events without dispatching them. + if (ev->data1 >= KEY_FIRSTJOYBUTTON && m_blockcontrollers) return true; + + keyup = ev->type == EV_KeyUp; + + ch = ev->data1; + switch (ch) + { + case KEY_JOY1: + case KEY_JOY3: + case KEY_JOY15: + case KEY_PAD_A: + mkey = MKEY_Enter; + break; + + case KEY_JOY2: + case KEY_JOY14: + case KEY_PAD_B: + mkey = MKEY_Back; + break; + + case KEY_JOY4: + case KEY_PAD_X: + mkey = MKEY_Clear; + break; + + case KEY_JOY5: + case KEY_PAD_LSHOULDER: + mkey = MKEY_PageUp; + break; + + case KEY_JOY6: + case KEY_PAD_RSHOULDER: + mkey = MKEY_PageDown; + break; + + case KEY_PAD_DPAD_UP: + case KEY_PAD_LTHUMB_UP: + case KEY_JOYAXIS2MINUS: + case KEY_JOYPOV1_UP: + mkey = MKEY_Up; + break; + + case KEY_PAD_DPAD_DOWN: + case KEY_PAD_LTHUMB_DOWN: + case KEY_JOYAXIS2PLUS: + case KEY_JOYPOV1_DOWN: + mkey = MKEY_Down; + break; + + case KEY_PAD_DPAD_LEFT: + case KEY_PAD_LTHUMB_LEFT: + case KEY_JOYAXIS1MINUS: + case KEY_JOYPOV1_LEFT: + mkey = MKEY_Left; + break; + + case KEY_PAD_DPAD_RIGHT: + case KEY_PAD_LTHUMB_RIGHT: + case KEY_JOYAXIS1PLUS: + case KEY_JOYPOV1_RIGHT: + mkey = MKEY_Right; + break; + } + } + + if (mkey != NUM_MKEYS) + { + if (keyup) + { + MenuButtons[mkey].ReleaseKey(ch); + return false; + } + else + { + MenuButtons[mkey].PressKey(ch); + MenuButtonOrigin[mkey] = fromcontroller; + if (mkey <= MKEY_PageDown) + { + MenuButtonTickers[mkey] = KEY_REPEAT_DELAY; + } + CurrentMenu->CallMenuEvent(mkey, fromcontroller); + return true; + } + } + return CurrentMenu->CallResponder(ev) || !keyup; + } + else if (MenuEnabled) + { + if (ev->type == EV_KeyDown) + { + // Pop-up menu? + if (ev->data1 == KEY_ESCAPE) + { + M_StartControlPanel(true); + M_SetMenu(NAME_Mainmenu, -1); + return true; + } + return false; + } + else if (ev->type == EV_GUI_Event && ev->subtype == EV_GUI_LButtonDown && + ConsoleState != c_down && gamestate != GS_LEVEL && m_use_mouse) + { + M_StartControlPanel(true); + M_SetMenu(NAME_Mainmenu, -1); + return true; + } + } + return false; +} + +//============================================================================= +// +// +// +//============================================================================= + +void M_Ticker (void) +{ + MenuTime++; + if (CurrentMenu != nullptr && menuactive != MENU_Off) + { + CurrentMenu->CallTicker(); + } + + // Check again because menu could be closed from Ticker() + if (CurrentMenu != nullptr && menuactive != MENU_Off) + { + for (int i = 0; i < NUM_MKEYS; ++i) + { + if (MenuButtons[i].bDown) + { + if (MenuButtonTickers[i] > 0 && --MenuButtonTickers[i] <= 0) + { + MenuButtonTickers[i] = KEY_REPEAT_RATE; + CurrentMenu->CallMenuEvent(i, MenuButtonOrigin[i]); + } + } + } + if (BackbuttonTime > 0) + { + if (BackbuttonAlpha < 1.f) BackbuttonAlpha += .1f; + if (BackbuttonAlpha > 1.f) BackbuttonAlpha = 1.f; + BackbuttonTime--; + } + else + { + if (BackbuttonAlpha > 0) BackbuttonAlpha -= .1f; + if (BackbuttonAlpha < 0) BackbuttonAlpha = 0; + } + } +} + +//============================================================================= +// +// +// +//============================================================================= + +void M_Drawer (void) +{ + PalEntry fade = 0; + + if (CurrentMenu != nullptr && menuactive != MENU_Off) + { + if (!CurrentMenu->DontBlur) screen->BlurScene(menuBlurAmount); + if (!CurrentMenu->DontDim) + { + if (sysCallbacks.MenuDim) sysCallbacks.MenuDim(); + } + bool going = false; + if (transition.previous) + { + going = transition.Draw(); + if (!going) + { + if (transition.dir == -1) delete transition.previous; + transition.previous = nullptr; + transition.current = nullptr; + } + } + if (!going) + { + CurrentMenu->CallDrawer(); + } + } +} + + +//============================================================================= +// +// +// +//============================================================================= + +void M_ClearMenus() +{ + if (menuactive == MENU_Off) return; + + transition.previous = transition.current = nullptr; + transition.dir = 0; + + while (CurrentMenu != nullptr) + { + DMenu* parent = CurrentMenu->mParentMenu; + CurrentMenu->Destroy(); + CurrentMenu = parent; + } + menuactive = MENU_Off; + if (CurrentScaleOverrider) delete CurrentScaleOverrider; + CurrentScaleOverrider = nullptr; + if (sysCallbacks.MenuClosed) sysCallbacks.MenuClosed(); +} + +//============================================================================= +// +// +// +//============================================================================= + +void M_PreviousMenu() +{ + if (CurrentMenu != nullptr) + { + DMenu* parent = CurrentMenu->mParentMenu; + CurrentMenu->Destroy(); + CurrentMenu = parent; + } +} + +//============================================================================= +// +// +// +//============================================================================= + +void M_Init (void) +{ + try + { + M_ParseMenuDefs(); + GC::AddMarkerFunc(M_MarkMenus); + } + catch (CVMAbortException &err) + { + err.MaybePrintMessage(); + Printf("%s", err.stacktrace.GetChars()); + I_FatalError("Failed to initialize menus"); + } + M_CreateMenus(); +} + + +//============================================================================= +// +// +// +//============================================================================= + +void M_EnableMenu (bool on) +{ + MenuEnabled = on; +} + + +//============================================================================= +// +// [RH] Most menus can now be accessed directly +// through console commands. +// +//============================================================================= + +CCMD (openmenu) +{ + if (argv.argc() < 2) + { + Printf("Usage: openmenu \"menu_name\"\n"); + return; + } + M_StartControlPanel (true); + M_SetMenu(argv[1], -1); +} + +CCMD (closemenu) +{ + M_ClearMenus(); +} + +CCMD (prevmenu) +{ + M_PreviousMenu(); +} + +CCMD(menuconsole) +{ + M_ClearMenus(); + C_ToggleConsole(); +} + +// This really should be in the script but we can't do scripted CCMDs yet. +CCMD(undocolorpic) +{ + if (CurrentMenu != NULL) + { + IFVIRTUALPTR(CurrentMenu, DMenu, ResetColor) + { + VMValue params[] = { (DObject*)CurrentMenu }; + VMCall(func, params, countof(params), nullptr, 0); + } + } +} + + +DEFINE_GLOBAL(menuactive) +DEFINE_GLOBAL(BackbuttonTime) +DEFINE_GLOBAL(BackbuttonAlpha) +DEFINE_GLOBAL(GameTicRate) +DEFINE_GLOBAL(menuDelegate) + +DEFINE_FIELD(DMenu, mParentMenu) +DEFINE_FIELD(DMenu, mMouseCapture); +DEFINE_FIELD(DMenu, mBackbuttonSelected); +DEFINE_FIELD(DMenu, DontDim); +DEFINE_FIELD(DMenu, DontBlur); +DEFINE_FIELD(DMenu, AnimatedTransition); +DEFINE_FIELD(DMenu, Animated); + +DEFINE_FIELD(DMenuDescriptor, mMenuName) +DEFINE_FIELD(DMenuDescriptor, mNetgameMessage) +DEFINE_FIELD(DMenuDescriptor, mClass) + +DEFINE_FIELD(DMenuItemBase, mXpos) +DEFINE_FIELD(DMenuItemBase, mYpos) +DEFINE_FIELD(DMenuItemBase, mAction) +DEFINE_FIELD(DMenuItemBase, mEnabled) + +DEFINE_FIELD(DListMenuDescriptor, mItems) +DEFINE_FIELD(DListMenuDescriptor, mSelectedItem) +DEFINE_FIELD(DListMenuDescriptor, mSelectOfsX) +DEFINE_FIELD(DListMenuDescriptor, mSelectOfsY) +DEFINE_FIELD(DListMenuDescriptor, mSelector) +DEFINE_FIELD(DListMenuDescriptor, mDisplayTop) +DEFINE_FIELD(DListMenuDescriptor, mXpos) +DEFINE_FIELD(DListMenuDescriptor, mYpos) +DEFINE_FIELD(DListMenuDescriptor, mWLeft) +DEFINE_FIELD(DListMenuDescriptor, mWRight) +DEFINE_FIELD(DListMenuDescriptor, mLinespacing) +DEFINE_FIELD(DListMenuDescriptor, mAutoselect) +DEFINE_FIELD(DListMenuDescriptor, mFont) +DEFINE_FIELD(DListMenuDescriptor, mFontColor) +DEFINE_FIELD(DListMenuDescriptor, mFontColor2) +DEFINE_FIELD(DListMenuDescriptor, mAnimatedTransition) +DEFINE_FIELD(DListMenuDescriptor, mCenter) +DEFINE_FIELD(DListMenuDescriptor, mVirtWidth) +DEFINE_FIELD(DListMenuDescriptor, mVirtHeight) + +DEFINE_FIELD(DOptionMenuDescriptor, mItems) +DEFINE_FIELD(DOptionMenuDescriptor, mTitle) +DEFINE_FIELD(DOptionMenuDescriptor, mSelectedItem) +DEFINE_FIELD(DOptionMenuDescriptor, mDrawTop) +DEFINE_FIELD(DOptionMenuDescriptor, mScrollTop) +DEFINE_FIELD(DOptionMenuDescriptor, mScrollPos) +DEFINE_FIELD(DOptionMenuDescriptor, mIndent) +DEFINE_FIELD(DOptionMenuDescriptor, mPosition) +DEFINE_FIELD(DOptionMenuDescriptor, mDontDim) +DEFINE_FIELD(DOptionMenuDescriptor, mFont) + +DEFINE_FIELD(FOptionMenuSettings, mTitleColor) +DEFINE_FIELD(FOptionMenuSettings, mFontColor) +DEFINE_FIELD(FOptionMenuSettings, mFontColorValue) +DEFINE_FIELD(FOptionMenuSettings, mFontColorMore) +DEFINE_FIELD(FOptionMenuSettings, mFontColorHeader) +DEFINE_FIELD(FOptionMenuSettings, mFontColorHighlight) +DEFINE_FIELD(FOptionMenuSettings, mFontColorSelection) +DEFINE_FIELD(FOptionMenuSettings, mLinespacing) + +DEFINE_FIELD(DImageScrollerDescriptor, mItems) +DEFINE_FIELD(DImageScrollerDescriptor, textBackground) +DEFINE_FIELD(DImageScrollerDescriptor, textBackgroundBrightness) +DEFINE_FIELD(DImageScrollerDescriptor,textFont) +DEFINE_FIELD(DImageScrollerDescriptor, textScale) +DEFINE_FIELD(DImageScrollerDescriptor, mAnimatedTransition) +DEFINE_FIELD(DImageScrollerDescriptor, virtWidth) +DEFINE_FIELD(DImageScrollerDescriptor, virtHeight) + + +struct IJoystickConfig; +// These functions are used by dynamic menu creation. +DMenuItemBase * CreateOptionMenuItemStaticText(const char *name, int v) +{ + auto c = PClass::FindClass("OptionMenuItemStaticText"); + auto p = c->CreateNew(); + FString namestr = name; + VMValue params[] = { p, &namestr, v }; + auto f = dyn_cast(c->FindSymbol("Init", false)); + VMCall(f->Variants[0].Implementation, params, countof(params), nullptr, 0); + return (DMenuItemBase*)p; +} + +DMenuItemBase * CreateOptionMenuItemJoyConfigMenu(const char *label, IJoystickConfig *joy) +{ + auto c = PClass::FindClass("OptionMenuItemJoyConfigMenu"); + auto p = c->CreateNew(); + FString namestr = label; + VMValue params[] = { p, &namestr, joy }; + auto f = dyn_cast(c->FindSymbol("Init", false)); + VMCall(f->Variants[0].Implementation, params, countof(params), nullptr, 0); + return (DMenuItemBase*)p; +} + +DMenuItemBase * CreateOptionMenuItemSubmenu(const char *label, FName cmd, int center) +{ + auto c = PClass::FindClass("OptionMenuItemSubmenu"); + auto p = c->CreateNew(); + FString namestr = label; + VMValue params[] = { p, &namestr, cmd.GetIndex(), center, false }; + auto f = dyn_cast(c->FindSymbol("Init", false)); + VMCall(f->Variants[0].Implementation, params, countof(params), nullptr, 0); + return (DMenuItemBase*)p; +} + +DMenuItemBase * CreateOptionMenuItemControl(const char *label, FName cmd, FKeyBindings *bindings) +{ + auto c = PClass::FindClass("OptionMenuItemControlBase"); + auto p = c->CreateNew(); + FString namestr = label; + VMValue params[] = { p, &namestr, cmd.GetIndex(), bindings }; + auto f = dyn_cast(c->FindSymbol("Init", false)); + VMCall(f->Variants[0].Implementation, params, countof(params), nullptr, 0); + return (DMenuItemBase*)p; +} + +DMenuItemBase * CreateOptionMenuItemCommand(const char *label, FName cmd, bool centered) +{ + auto c = PClass::FindClass("OptionMenuItemCommand"); + auto p = c->CreateNew(); + FString namestr = label; + VMValue params[] = { p, &namestr, cmd.GetIndex(), centered, false }; + auto f = dyn_cast(c->FindSymbol("Init", false)); + VMCall(f->Variants[0].Implementation, params, countof(params), nullptr, 0); + auto unsafe = dyn_cast(c->FindSymbol("mUnsafe", false)); + unsafe->Type->SetValue(reinterpret_cast(p) + unsafe->Offset, 0); + return (DMenuItemBase*)p; +} + +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)); + 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; +} + +DMenuItemBase * CreateListMenuItemText(double x, double y, int height, int hotkey, const char *text, FFont *font, PalEntry color1, PalEntry color2, FName command, int param) +{ + auto c = PClass::FindClass("ListMenuItemTextItem"); + auto p = c->CreateNew(); + FString keystr = FString(char(hotkey)); + FString textstr = text; + VMValue params[] = { p, x, y, height, &keystr, &textstr, font, int(color1.d), int(color2.d), command.GetIndex(), param }; + auto f = dyn_cast(c->FindSymbol("InitDirect", false)); + VMCall(f->Variants[0].Implementation, params, countof(params), nullptr, 0); + return (DMenuItemBase*)p; +} + +DMenuItemBase* CreateListMenuItemStaticText(double x, double y, const char* text, FFont* font, PalEntry color, bool centered) +{ + auto c = PClass::FindClass("ListMenuItemStaticText"); + auto p = c->CreateNew(); + FString textstr = text; + VMValue params[] = { p, x, y, &textstr, font, int(color.d), centered }; + auto f = dyn_cast(c->FindSymbol("InitDirect", false)); + VMCall(f->Variants[0].Implementation, params, countof(params), nullptr, 0); + return (DMenuItemBase*)p; +} + +bool DMenuItemBase::Activate() +{ + IFVIRTUAL(DMenuItemBase, Activate) + { + VMValue params[] = { (DObject*)this }; + int retval; + VMReturn ret(&retval); + VMCall(func, params, countof(params), &ret, 1); + return !!retval; + } + return false; +} + +bool DMenuItemBase::SetString(int i, const char *s) +{ + IFVIRTUAL(DMenuItemBase, SetString) + { + FString namestr = s; + VMValue params[] = { (DObject*)this, i, &namestr }; + int retval; + VMReturn ret(&retval); + VMCall(func, params, countof(params), &ret, 1); + return !!retval; + } + return false; +} + +bool DMenuItemBase::GetString(int i, char *s, int len) +{ + IFVIRTUAL(DMenuItemBase, GetString) + { + VMValue params[] = { (DObject*)this, i }; + int retval; + FString retstr; + VMReturn ret[2]; ret[0].IntAt(&retval); ret[1].StringAt(&retstr); + VMCall(func, params, countof(params), ret, 2); + strncpy(s, retstr, len); + return !!retval; + } + return false; +} + + +bool DMenuItemBase::SetValue(int i, int value) +{ + IFVIRTUAL(DMenuItemBase, SetValue) + { + VMValue params[] = { (DObject*)this, i, value }; + int retval; + VMReturn ret(&retval); + VMCall(func, params, countof(params), &ret, 1); + return !!retval; + } + return false; +} + +bool DMenuItemBase::GetValue(int i, int *pvalue) +{ + IFVIRTUAL(DMenuItemBase, GetValue) + { + VMValue params[] = { (DObject*)this, i }; + int retval[2]; + VMReturn ret[2]; ret[0].IntAt(&retval[0]); ret[1].IntAt(&retval[1]); + VMCall(func, params, countof(params), ret, 2); + *pvalue = retval[1]; + return !!retval[0]; + } + return false; +} + +IMPLEMENT_CLASS(DMenuItemBase, false, false) diff --git a/source/common/menu/menu.h b/source/common/menu/menu.h new file mode 100644 index 000000000..86db161ce --- /dev/null +++ b/source/common/menu/menu.h @@ -0,0 +1,327 @@ +#ifndef __M_MENU_MENU_H__ +#define __M_MENU_MENU_H__ + + + + +#include "dobject.h" +#include "c_cvars.h" +#include "v_font.h" +#include "textures.h" + +EXTERN_CVAR(Float, snd_menuvolume) +EXTERN_CVAR(Int, m_use_mouse); + + +struct event_t; +class FTexture; +class FFont; +enum EColorRange : int; +class FKeyBindings; +struct FBrokenLines; + +enum EMenuKey +{ + MKEY_Up, + MKEY_Down, + MKEY_Left, + MKEY_Right, + MKEY_PageUp, + MKEY_PageDown, + //----------------- Keys past here do not repeat. + MKEY_Enter, + MKEY_Back, // Back to previous menu + MKEY_Clear, // Clear keybinding/flip player sprite preview + NUM_MKEYS, + + // These are not buttons but events sent from other menus + + MKEY_Input, // Sent when input is confirmed + MKEY_Abort, // Input aborted + MKEY_MBYes, + MKEY_MBNo, +}; + + +class DMenu; +extern DMenu *CurrentMenu; +extern int MenuTime; +class DMenuItemBase; +extern DObject* menuDelegate; + +//============================================================================= +// +// menu descriptor. This is created from the menu definition lump +// Items must be inserted in the order they are cycled through with the cursor +// +//============================================================================= + +class DMenuDescriptor : public DObject +{ + DECLARE_CLASS(DMenuDescriptor, DObject) +public: + FName mMenuName = NAME_None; + FString mNetgameMessage; + PClass *mClass = nullptr; + bool mProtected = false; + TArray mItems; + + size_t PropagateMark() override; +}; + + +class DListMenuDescriptor : public DMenuDescriptor +{ + DECLARE_CLASS(DListMenuDescriptor, DMenuDescriptor) + +public: + int mSelectedItem; + double mSelectOfsX; + double mSelectOfsY; + FTextureID mSelector; + int mDisplayTop; + double mXpos, mYpos; + int mWLeft, mWRight; + int mLinespacing; // needs to be stored for dynamically created menus + int mAutoselect; // this can only be set by internal menu creation functions + FFont *mFont; + EColorRange mFontColor; + EColorRange mFontColor2; + bool mCenter; + bool mFromEngine; + bool mAnimated; + bool mAnimatedTransition; + int mVirtWidth; + int mVirtHeight; + + void Reset(); +}; + +struct FOptionMenuSettings +{ + EColorRange mTitleColor; + EColorRange mFontColor; + EColorRange mFontColorValue; + EColorRange mFontColorMore; + EColorRange mFontColorHeader; + EColorRange mFontColorHighlight; + EColorRange mFontColorSelection; + int mLinespacing; +}; + +class DOptionMenuDescriptor : public DMenuDescriptor +{ + DECLARE_CLASS(DOptionMenuDescriptor, DMenuDescriptor) + +public: + FString mTitle; + int mSelectedItem; + int mDrawTop; + int mScrollTop; + int mScrollPos; + int mIndent; + int mPosition; + bool mDontDim; + FFont *mFont; + + void CalcIndent(); + DMenuItemBase *GetItem(FName name); + void Reset(); + ~DOptionMenuDescriptor() = default; +}; + +class DImageScrollerDescriptor : public DMenuDescriptor +{ + DECLARE_CLASS(DOptionMenuDescriptor, DMenuDescriptor) +public: + FTextureID textBackground; + PalEntry textBackgroundBrightness; + + FFont *textFont; + double textScale; + bool mAnimatedTransition; + int virtWidth, virtHeight; + +}; + +typedef TMap MenuDescriptorList; + +extern FOptionMenuSettings OptionSettings; +extern MenuDescriptorList MenuDescriptors; + +#define CURSORSPACE (14 * CleanXfac_1) + +//============================================================================= +// +// +// +//============================================================================= + +struct FMenuRect +{ + int x, y; + int width, height; + + void set(int _x, int _y, int _w, int _h) + { + x = _x; + y = _y; + width = _w; + height = _h; + } + + bool inside(int _x, int _y) + { + return _x >= x && _x < x+width && _y >= y && _y < y+height; + } + +}; + + +enum MenuTransitionType +{ // Note: This enum is for logical categories, not visual types. + MA_None, + MA_Return, + MA_Advance, +}; + +class DMenu; + +struct MenuTransition +{ + DMenu* previous; + DMenu* current; + + double start; + int32_t length; + int8_t dir; + bool destroyprev; + + bool StartTransition(DMenu* from, DMenu* to, MenuTransitionType animtype); + bool Draw(); + +}; + + + +class DMenu : public DObject +{ + DECLARE_CLASS (DMenu, DObject) + HAS_OBJECT_POINTERS + + + +public: + enum + { + MOUSE_Click, + MOUSE_Move, + MOUSE_Release + }; + + TObjPtr mParentMenu; + bool mMouseCapture; + bool mBackbuttonSelected; + bool DontDim; + bool DontBlur; + bool Animated; + bool AnimatedTransition; + static int InMenu; + + DMenu(DMenu *parent = NULL); + bool TranslateKeyboardEvents(); + virtual void Close(); + + bool CallResponder(event_t *ev); + bool CallMenuEvent(int mkey, bool fromcontroller); + void CallTicker(); + void CallDrawer(); + bool canAnimate() { return AnimatedTransition; } +}; + +//============================================================================= +// +// base class for menu items +// +//============================================================================= + +class DMenuItemBase : public DObject +{ + DECLARE_CLASS(DMenuItemBase, DObject) +public: + double mXpos, mYpos; + FName mAction; + int mEnabled; + + bool Activate(); + bool SetString(int i, const char *s); + bool GetString(int i, char *s, int len); + bool SetValue(int i, int value); + bool GetValue(int i, int *pvalue); + void OffsetPositionY(int ydelta) { mYpos += ydelta; } + double GetY() { return mYpos; } +}; + +//============================================================================= +// +// +// +//============================================================================= +struct FOptionValues +{ + struct Pair + { + double Value; + FString TextValue; + FString Text; + }; + + TArray mValues; +}; + +typedef TMap< FName, FOptionValues* > FOptionMap; + +extern FOptionMap OptionValues; + + +//============================================================================= +// +// +// +//============================================================================= + +struct event_t; +void M_EnableMenu (bool on) ; +bool M_Responder (event_t *ev); +void M_Ticker (void); +void M_Drawer (void); +void M_Init (void); +void M_CreateMenus(); +void M_ActivateMenu(DMenu *menu); +void M_ClearMenus (); +void M_PreviousMenu (); +void M_ParseMenuDefs(); +void M_DoStartControlPanel(bool scaleoverride); +void M_SetMenu(FName menu, int param = -1); +void M_StartMessage(const char *message, int messagemode, FName action = NAME_None); +DMenu *StartPickerMenu(DMenu *parent, const char *name, FColorCVar *cvar); +void M_MarkMenus(); +FTextureID GetMenuTexture(const char* const name); +void DeinitMenus(); +bool M_Active(); +bool M_IsAnimated(); + + +struct IJoystickConfig; +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 * 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); +DMenuItemBase* CreateListMenuItemStaticText(double x, double y, const char* text, FFont* font, PalEntry color, bool centered = false); + +void UpdateVRModes(bool considerQuadBuffered=true); + +#endif diff --git a/source/common/menu/menudef.cpp b/source/common/menu/menudef.cpp new file mode 100644 index 000000000..ad89b6c27 --- /dev/null +++ b/source/common/menu/menudef.cpp @@ -0,0 +1,1442 @@ +/* +** menudef.cpp +** MENUDEF parser amd menu generation code +** +**--------------------------------------------------------------------------- +** Copyright 2010 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 "menu.h" +#include "filesystem.h" +#include "c_bind.h" +#include "i_music.h" +#include "i_sound.h" +#include "cmdlib.h" +#include "vm.h" +#include "types.h" +#include "m_argv.h" +#include "i_soundfont.h" +#include "i_system.h" +#include "v_video.h" +#include "gstrings.h" +#include +#include "texturemanager.h" +#include "printf.h" +#include "i_interface.h" +#include "templates.h" + + +bool CheckSkipGameOptionBlock(FScanner& sc); + +MenuDescriptorList MenuDescriptors; +static DListMenuDescriptor *DefaultListMenuSettings; // contains common settings for all list menus +static DOptionMenuDescriptor *DefaultOptionMenuSettings; // contains common settings for all Option menus +FOptionMenuSettings OptionSettings; +FOptionMap OptionValues; +bool mustPrintErrors; +PClass *DefaultListMenuClass; +PClass *DefaultOptionMenuClass; + +void I_BuildALDeviceList(FOptionValues *opt); +void I_BuildALResamplersList(FOptionValues *opt); + + + +DEFINE_GLOBAL_NAMED(OptionSettings, OptionMenuSettings) + +DEFINE_ACTION_FUNCTION(FOptionValues, GetCount) +{ + PARAM_PROLOGUE; + PARAM_NAME(grp); + int cnt = 0; + FOptionValues **pGrp = OptionValues.CheckKey(grp); + if (pGrp != nullptr) + { + cnt = (*pGrp)->mValues.Size(); + } + ACTION_RETURN_INT(cnt); +} + +DEFINE_ACTION_FUNCTION(FOptionValues, GetValue) +{ + PARAM_PROLOGUE; + PARAM_NAME(grp); + PARAM_UINT(index); + double val = 0; + FOptionValues **pGrp = OptionValues.CheckKey(grp); + if (pGrp != nullptr) + { + if (index < (*pGrp)->mValues.Size()) + { + val = (*pGrp)->mValues[index].Value; + } + } + ACTION_RETURN_FLOAT(val); +} + +DEFINE_ACTION_FUNCTION(FOptionValues, GetTextValue) +{ + PARAM_PROLOGUE; + PARAM_NAME(grp); + PARAM_UINT(index); + FString val; + FOptionValues **pGrp = OptionValues.CheckKey(grp); + if (pGrp != nullptr) + { + if (index < (*pGrp)->mValues.Size()) + { + val = (*pGrp)->mValues[index].TextValue; + } + } + ACTION_RETURN_STRING(val); +} + +DEFINE_ACTION_FUNCTION(FOptionValues, GetText) +{ + PARAM_PROLOGUE; + PARAM_NAME(grp); + PARAM_UINT(index); + FString val; + FOptionValues **pGrp = OptionValues.CheckKey(grp); + if (pGrp != nullptr) + { + if (index < (*pGrp)->mValues.Size()) + { + val = (*pGrp)->mValues[index].Text; + } + } + ACTION_RETURN_STRING(val); +} + + +void DeinitMenus() +{ + M_ClearMenus(); + { + FOptionMap::Iterator it(OptionValues); + + FOptionMap::Pair *pair; + + while (it.NextPair(pair)) + { + delete pair->Value; + pair->Value = nullptr; + } + } + MenuDescriptors.Clear(); + OptionValues.Clear(); + if (menuDelegate) + { + menuDelegate->Destroy(); + menuDelegate = nullptr; + } +} + +FTextureID GetMenuTexture(const char* const name) +{ + const FTextureID texture = TexMan.CheckForTexture(name, ETextureType::MiscPatch); + + if (!texture.Exists() && mustPrintErrors) + { + Printf("Missing menu texture: \"%s\"\n", name); + } + + return texture; +} + +//============================================================================= +// +// +// +//============================================================================= + +static void SkipSubBlock(FScanner &sc) +{ + sc.MustGetStringName("{"); + sc.SkipToEndOfBlock(); +} + +//============================================================================= +// +// +// +//============================================================================= + +static bool CheckSkipGameBlock(FScanner &sc, bool yes = true) +{ + bool filter = false; + sc.MustGetStringName("("); + do + { + sc.MustGetString(); + if (sysCallbacks.CheckGame) filter |= sysCallbacks.CheckGame(sc.String); + } + while (sc.CheckString(",")); + sc.MustGetStringName(")"); + if (filter != yes) + { + SkipSubBlock(sc); + return !sc.CheckString("else"); + } + return false; +} + +//============================================================================= +// +// +// +//============================================================================= + +static bool CheckSkipOptionBlock(FScanner &sc) +{ + bool filter = false; + sc.MustGetStringName("("); + do + { + sc.MustGetString(); + if (sysCallbacks.CheckMenudefOption && sysCallbacks.CheckMenudefOption(sc.String)) filter = true; + else if (sc.Compare("Windows")) + { + #ifdef _WIN32 + filter = true; + #endif + } + else if (sc.Compare("unix")) + { + #ifdef __unix__ + filter = true; + #endif + } + else if (sc.Compare("Mac")) + { + #ifdef __APPLE__ + filter = true; + #endif + } + else if (sc.Compare("OpenAL")) + { + filter |= IsOpenALPresent(); + } + else if (sc.Compare("MMX")) + { + #ifdef HAVE_MMX + filter = true; + #endif + } + } + while (sc.CheckString(",")); + sc.MustGetStringName(")"); + if (!filter) + { + SkipSubBlock(sc); + return !sc.CheckString("else"); + } + return false; +} + +//============================================================================= +// +// +// +//============================================================================= + +static void ParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc) +{ + bool sizeset = false; + bool sizecompatible = true; + sc.MustGetStringName("{"); + while (!sc.CheckString("}")) + { + sc.MustGetString(); + if (sc.Compare("else")) + { + SkipSubBlock(sc); + } + else if (sc.Compare("ifgame")) + { + if (!CheckSkipGameBlock(sc)) + { + // recursively parse sub-block + ParseListMenuBody(sc, desc); + } + } + else if (sc.Compare("ifnotgame")) + { + if (!CheckSkipGameBlock(sc, false)) + { + // recursively parse sub-block + ParseListMenuBody(sc, desc); + } + } + else if (sc.Compare("ifoption")) + { + if (!CheckSkipOptionBlock(sc)) + { + // recursively parse sub-block + ParseListMenuBody(sc, desc); + } + } + else if (sc.Compare("Class")) + { + sc.MustGetString(); + PClass *cls = PClass::FindClass(sc.String); + if (cls == nullptr || !cls->IsDescendantOf("ListMenu")) + { + sc.ScriptError("Unknown menu class '%s'", sc.String); + } + desc->mClass = cls; + sizecompatible = false; + } + else if (sc.Compare("Selector")) + { + sc.MustGetString(); + desc->mSelector = GetMenuTexture(sc.String); + sc.MustGetStringName(","); + sc.MustGetFloat(); + desc->mSelectOfsX = sc.Float; + sc.MustGetStringName(","); + sc.MustGetFloat(); + desc->mSelectOfsY = sc.Float; + } + else if (sc.Compare("Linespacing")) + { + sc.MustGetNumber(); + desc->mLinespacing = sc.Number; + } + else if (sc.Compare("Position")) + { + sc.MustGetFloat(); + desc->mXpos = sc.Float; + sc.MustGetStringName(","); + sc.MustGetFloat(); + desc->mYpos = sc.Float; + } + else if (sc.Compare("Centermenu")) + { + desc->mCenter = true; + } + else if (sc.Compare("animatedtransition")) + { + desc->mAnimatedTransition = true; + } + else if (sc.Compare("MouseWindow")) + { + sc.MustGetNumber(); + desc->mWLeft = sc.Number; + sc.MustGetStringName(","); + sc.MustGetNumber(); + desc->mWRight = sc.Number; + } + else if (sc.Compare("Font")) + { + sc.MustGetString(); + FFont *newfont = V_GetFont(sc.String); + if (newfont != nullptr) desc->mFont = newfont; + if (sc.CheckString(",")) + { + sc.MustGetString(); + desc->mFontColor2 = desc->mFontColor = V_FindFontColor((FName)sc.String); + if (sc.CheckString(",")) + { + sc.MustGetString(); + desc->mFontColor2 = V_FindFontColor((FName)sc.String); + } + } + else + { + desc->mFontColor = OptionSettings.mFontColor; + desc->mFontColor2 = OptionSettings.mFontColorValue; + } + } + else if (sc.Compare("NetgameMessage")) + { + sc.MustGetString(); + desc->mNetgameMessage = sc.String; + } + else if (sc.Compare("size")) + { + if (sc.CheckNumber()) + { + desc->mVirtWidth = sc.Number; + sc.MustGetStringName(","); + sc.MustGetNumber(); + desc->mVirtHeight = sc.Number; + } + else + { + sc.MustGetString(); + if (sc.Compare("clean")) + { + desc->mVirtWidth = -1; + } + else if (sc.Compare("optclean")) + { + desc->mVirtWidth = -2; + } + else + { + sc.ScriptError("Invalid value '%s' for 'size'", sc.String); + } + } + } + else + { + // all item classes from which we know that they support sized scaling. + // If anything else comes through here the option to swich scaling mode is disabled for this menu. + static const char* const compatibles[] = { "StaticPatch", "StaticText", "StaticTextCentered", "TextItem", "PatchItem", "PlayerDisplay", nullptr }; + if (sc.MatchString(compatibles) < 0) sizecompatible = false; + + bool success = false; + FStringf buildname("ListMenuItem%s", sc.String); + PClass *cls = PClass::FindClass(buildname); + 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 protected init method. + { + auto &args = func->Variants[0].Proto->ArgumentTypes; + TArray params; + int start = 1; + + params.Push(0); + if (args.Size() > 1 && args[1] == NewPointer(PClass::FindClass("ListMenuDescriptor"))) + { + params.Push(desc); + start = 2; + } + auto TypeCVar = NewPointer(NewStruct("CVar", nullptr, true)); + + // Note that this array may not be reallocated so its initial size must be the maximum possible elements. + TArray strings(args.Size()); + for (unsigned i = start; i < args.Size(); i++) + { + sc.MustGetString(); + if (args[i] == TypeString) + { + strings.Push(sc.String); + params.Push(&strings.Last()); + } + else if (args[i] == TypeName) + { + params.Push(FName(sc.String).GetIndex()); + } + else if (args[i] == TypeColor) + { + params.Push(V_GetColor(nullptr, sc)); + } + else if (args[i] == TypeFont) + { + auto f = V_GetFont(sc.String); + if (f == nullptr) + { + sc.ScriptError("Unknown font %s", sc.String); + } + params.Push(f); + } + else if (args[i] == TypeTextureID) + { + auto f = TexMan.CheckForTexture(sc.String, ETextureType::MiscPatch); + if (!f.Exists()) + { + sc.ScriptMessage("Unknown texture %s", sc.String); + } + params.Push(f.GetIndex()); + } + else if (args[i]->isIntCompatible()) + { + char *endp; + int v = (int)strtoll(sc.String, &endp, 0); + if (*endp != 0) + { + // special check for font color ranges. + v = V_FindFontColor(sc.String); + if (v == CR_UNTRANSLATED && !sc.Compare("untranslated")) + { + // todo: check other data types that may get used. + sc.ScriptError("Integer expected, got %s", sc.String); + } + } + if (args[i] == TypeBool) v = !!v; + params.Push(v); + } + else if (args[i]->isFloat()) + { + char *endp; + double v = strtod(sc.String, &endp); + if (*endp != 0) + { + sc.ScriptError("Float expected, got %s", sc.String); + } + params.Push(v); + } + else if (args[i] == TypeCVar) + { + auto cv = FindCVar(sc.String, nullptr); + if (cv == nullptr && *sc.String) + { + sc.ScriptError("Unknown CVar %s", sc.String); + } + params.Push(cv); + } + else + { + sc.ScriptError("Invalid parameter type %s for menu item", args[i]->DescriptiveName()); + } + if (sc.CheckString(",")) + { + if (i == args.Size() - 1) + { + sc.ScriptError("Too many parameters for %s", cls->TypeName.GetChars()); + } + } + else + { + if (i < args.Size() - 1 && !(func->Variants[0].ArgFlags[i + 1] & VARF_Optional)) + { + sc.ScriptError("Insufficient parameters for %s", cls->TypeName.GetChars()); + } + break; + } + } + DMenuItemBase *item = (DMenuItemBase*)cls->CreateNew(); + params[0] = item; + VMCallWithDefaults(func->Variants[0].Implementation, params, nullptr, 0); + desc->mItems.Push((DMenuItemBase*)item); + + if (cls->IsDescendantOf("ListMenuItemSelectable")) + { + desc->mYpos += desc->mLinespacing; + if (desc->mSelectedItem == -1) desc->mSelectedItem = desc->mItems.Size() - 1; + } + success = true; + } + } + if (!success) + { + sc.ScriptError("Unknown keyword '%s'", sc.String); + } + } + } + if (!sizeset && sizecompatible) // allow unclean scaling on this menu + { + desc->mVirtWidth = -2; + } + for (auto &p : desc->mItems) + { + GC::WriteBarrier(p); + } +} + +//============================================================================= +// +// +// +//============================================================================= + +static bool CheckCompatible(DMenuDescriptor *newd, DMenuDescriptor *oldd) +{ + if (oldd->mClass == nullptr) return true; + return newd->mClass->IsDescendantOf(oldd->mClass); +} + +static int GetGroup(DMenuItemBase *desc) +{ + if (desc->IsKindOf(NAME_OptionMenuItemCommand)) return 2; + if (desc->IsKindOf(NAME_OptionMenuItemSubmenu)) return 1; + if (desc->IsKindOf(NAME_OptionMenuItemControlBase)) return 3; + if (desc->IsKindOf(NAME_OptionMenuItemOptionBase)) return 4; + if (desc->IsKindOf(NAME_OptionMenuSliderBase)) return 4; + if (desc->IsKindOf(NAME_OptionMenuFieldBase)) return 4; + if (desc->IsKindOf(NAME_OptionMenuItemColorPicker)) return 4; + if (desc->IsKindOf(NAME_OptionMenuItemStaticText)) return 5; + if (desc->IsKindOf(NAME_OptionMenuItemStaticTextSwitchable)) return 5; + return 0; +} + +static bool FindMatchingItem(DMenuItemBase *desc) +{ + int grp = GetGroup(desc); + if (grp == 0) return false; // no idea what this is. + if (grp == 5) return true; // static texts always match + + FName name = desc->mAction; + + if (grp == 1) + { + // Check for presence of menu + auto menu = MenuDescriptors.CheckKey(name); + if (menu == nullptr) return false; + } + else if (grp == 4) + { + static const FName CVarBlacklist[] = { + NAME_snd_waterlp, NAME_snd_output, NAME_snd_output_format, NAME_snd_speakermode, NAME_snd_resampler, NAME_AlwaysRun }; + + // Check for presence of CVAR and blacklist + auto cv = FindCVar(name.GetChars(), nullptr); + if (cv == nullptr) return true; + + for (auto bname : CVarBlacklist) + { + if (name == bname) return true; + } + } + + MenuDescriptorList::Iterator it(MenuDescriptors); + MenuDescriptorList::Pair *pair; + while (it.NextPair(pair)) + { + for (auto it : pair->Value->mItems) + { + if (it->mAction == name && GetGroup(it) == grp) return true; + } + } + return false; +} + +static bool ReplaceMenu(FScanner &sc, DMenuDescriptor *desc) +{ + DMenuDescriptor **pOld = MenuDescriptors.CheckKey(desc->mMenuName); + if (pOld != nullptr && *pOld != nullptr) + { + if ((*pOld)->mProtected) + { + // If this tries to replace an option menu with an option menu, let's append all new entries to the old menu. + // Otherwise bail out because for list menus it's not that simple. + if (!desc->IsKindOf(RUNTIME_CLASS(DOptionMenuDescriptor)) || !(*pOld)->IsKindOf(RUNTIME_CLASS(DOptionMenuDescriptor))) + { + sc.ScriptMessage("Cannot replace protected menu %s.", desc->mMenuName.GetChars()); + return true; + } + for (int i = desc->mItems.Size()-1; i >= 0; i--) + { + if (FindMatchingItem(desc->mItems[i])) + { + desc->mItems.Delete(i); + } + } + if (desc->mItems.Size() > 0) + { + auto sep = CreateOptionMenuItemStaticText(" "); + (*pOld)->mItems.Push(sep); + sep = CreateOptionMenuItemStaticText("---------------", 1); + (*pOld)->mItems.Push(sep); + for (auto it : desc->mItems) + { + (*pOld)->mItems.Push(it); + } + desc->mItems.Clear(); + //sc.ScriptMessage("Merged %d items into %s", desc->mItems.Size(), desc->mMenuName.GetChars()); + } + return true; + } + + if (!CheckCompatible(desc, *pOld)) + { + sc.ScriptMessage("Tried to replace menu '%s' with a menu of different type", desc->mMenuName.GetChars()); + return true; + } + } + MenuDescriptors[desc->mMenuName] = desc; + GC::WriteBarrier(desc); + return false; +} + +//============================================================================= +// +// +// +//============================================================================= + +static void ParseListMenu(FScanner &sc) +{ + sc.MustGetString(); + + DListMenuDescriptor *desc = Create(); + desc->Reset(); + desc->mMenuName = sc.String; + desc->mSelectedItem = -1; + desc->mAutoselect = -1; + desc->mSelectOfsX = DefaultListMenuSettings->mSelectOfsX; + desc->mSelectOfsY = DefaultListMenuSettings->mSelectOfsY; + desc->mSelector = DefaultListMenuSettings->mSelector; + desc->mDisplayTop = DefaultListMenuSettings->mDisplayTop; + desc->mXpos = DefaultListMenuSettings->mXpos; + desc->mYpos = DefaultListMenuSettings->mYpos; + desc->mLinespacing = DefaultListMenuSettings->mLinespacing; + desc->mNetgameMessage = DefaultListMenuSettings->mNetgameMessage; + desc->mFont = DefaultListMenuSettings->mFont; + desc->mFontColor = DefaultListMenuSettings->mFontColor; + desc->mFontColor2 = DefaultListMenuSettings->mFontColor2; + desc->mClass = nullptr; + desc->mWLeft = 0; + desc->mWRight = 0; + desc->mCenter = false; + desc->mFromEngine = fileSystem.GetFileContainer(sc.LumpNum) == 0; // flags menu if the definition is from the IWAD. + + ParseListMenuBody(sc, desc); + ReplaceMenu(sc, desc); +} + +//============================================================================= +// +// +// +//============================================================================= + +static void ParseOptionValue(FScanner &sc) +{ + FOptionValues *val = new FOptionValues; + sc.MustGetString(); + FName optname = sc.String; + sc.MustGetStringName("{"); + while (!sc.CheckString("}")) + { + FOptionValues::Pair &pair = val->mValues[val->mValues.Reserve(1)]; + sc.MustGetFloat(); + pair.Value = sc.Float; + sc.MustGetStringName(","); + sc.MustGetString(); + pair.Text = strbin1(sc.String); + } + FOptionValues **pOld = OptionValues.CheckKey(optname); + if (pOld != nullptr && *pOld != nullptr) + { + delete *pOld; + } + OptionValues[optname] = val; +} + + +//============================================================================= +// +// +// +//============================================================================= + +static void ParseOptionString(FScanner &sc) +{ + FOptionValues *val = new FOptionValues; + sc.MustGetString(); + FName optname = sc.String; + sc.MustGetStringName("{"); + while (!sc.CheckString("}")) + { + FOptionValues::Pair &pair = val->mValues[val->mValues.Reserve(1)]; + sc.MustGetString(); + pair.Value = DBL_MAX; + pair.TextValue = sc.String; + sc.MustGetStringName(","); + sc.MustGetString(); + pair.Text = strbin1(sc.String); + } + FOptionValues **pOld = OptionValues.CheckKey(optname); + if (pOld != nullptr && *pOld != nullptr) + { + delete *pOld; + } + OptionValues[optname] = val; +} + + +//============================================================================= +// +// +// +//============================================================================= + +static void ParseOptionSettings(FScanner &sc) +{ + sc.MustGetStringName("{"); + while (!sc.CheckString("}")) + { + sc.MustGetString(); + if (sc.Compare("else")) + { + SkipSubBlock(sc); + } + else if (sc.Compare("ifgame")) + { + if (!CheckSkipGameBlock(sc)) + { + // recursively parse sub-block + ParseOptionSettings(sc); + } + } + else if (sc.Compare("ifnotgame")) + { + if (!CheckSkipGameBlock(sc, false)) + { + // recursively parse sub-block + ParseOptionSettings(sc); + } + } + else if (sc.Compare("Linespacing")) + { + sc.MustGetNumber(); + OptionSettings.mLinespacing = sc.Number; + } + else if (sc.Compare("LabelOffset")) + { + sc.MustGetNumber(); + // ignored + } + else + { + sc.ScriptError("Unknown keyword '%s'", sc.String); + } + } +} + +//============================================================================= +// +// +// +//============================================================================= + +static void ParseOptionMenuBody(FScanner &sc, DOptionMenuDescriptor *desc) +{ + sc.MustGetStringName("{"); + while (!sc.CheckString("}")) + { + sc.MustGetString(); + if (sc.Compare("else")) + { + SkipSubBlock(sc); + } + else if (sc.Compare("ifgame")) + { + if (!CheckSkipGameBlock(sc)) + { + // recursively parse sub-block + ParseOptionMenuBody(sc, desc); + } + } + else if (sc.Compare("ifnotgame")) + { + if (!CheckSkipGameBlock(sc, false)) + { + // recursively parse sub-block + ParseOptionMenuBody(sc, desc); + } + } + else if (sc.Compare("ifoption")) + { + if (!CheckSkipOptionBlock(sc)) + { + // recursively parse sub-block + ParseOptionMenuBody(sc, desc); + } + } + else if (sc.Compare("Class")) + { + sc.MustGetString(); + PClass *cls = PClass::FindClass(sc.String); + if (cls == nullptr || !cls->IsDescendantOf("OptionMenu")) + { + sc.ScriptError("Unknown menu class '%s'", sc.String); + } + desc->mClass = cls; + } + else if (sc.Compare({ "Title", "Caption" })) + { + sc.MustGetString(); + desc->mTitle = sc.String; + } + else if (sc.Compare("Position")) + { + sc.MustGetNumber(); + desc->mPosition = sc.Number; + } + else if (sc.Compare("DefaultSelection")) + { + sc.MustGetNumber(); + desc->mSelectedItem = sc.Number; + } + else if (sc.Compare("ScrollTop")) + { + sc.MustGetNumber(); + desc->mScrollTop = sc.Number; + } + else if (sc.Compare("Indent")) + { + sc.MustGetNumber(); + desc->mIndent = sc.Number; + } + else + { + bool success = false; + FStringf buildname("OptionMenuItem%s", sc.String); + // Handle one special case: MapControl maps to Control with one parameter different + PClass *cls = PClass::FindClass(buildname); + if (cls != nullptr && cls->IsDescendantOf("OptionMenuItem")) + { + 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. + { + auto &args = func->Variants[0].Proto->ArgumentTypes; + TArray params; + + params.Push(0); + auto TypeCVar = NewPointer(NewStruct("CVar", nullptr, true)); + + // Note that this array may not be reallocated so its initial size must be the maximum possible elements. + TArray strings(args.Size()); + for (unsigned i = 1; i < args.Size(); i++) + { + sc.MustGetString(); + if (args[i] == TypeString) + { + strings.Push(sc.String); + params.Push(&strings.Last()); + } + else if (args[i] == TypeName) + { + params.Push(FName(sc.String).GetIndex()); + } + else if (args[i] == TypeColor) + { + params.Push(V_GetColor(nullptr, sc)); + } + else if (args[i]->isIntCompatible()) + { + char *endp; + int v = (int)strtoll(sc.String, &endp, 0); + if (*endp != 0) + { + // special check for font color ranges. + v = V_FindFontColor(sc.String); + if (v == CR_UNTRANSLATED && !sc.Compare("untranslated")) + { + // todo: check other data types that may get used. + sc.ScriptError("Integer expected, got %s", sc.String); + } + // Color ranges need to be marked for option menu items to support an older feature where a boolean number could be passed instead. + v |= 0x12340000; + } + if (args[i] == TypeBool) v = !!v; + params.Push(v); + } + else if (args[i]->isFloat()) + { + char *endp; + double v = strtod(sc.String, &endp); + if (*endp != 0) + { + sc.ScriptError("Float expected, got %s", sc.String); + } + params.Push(v); + } + else if (args[i] == TypeCVar) + { + auto cv = FindCVar(sc.String, nullptr); + if (cv == nullptr && *sc.String) + { + if (func->Variants[0].ArgFlags[i] & VARF_Optional) + sc.ScriptMessage("Unknown CVar %s", sc.String); + else + sc.ScriptError("Unknown CVar %s", sc.String); + } + params.Push(cv); + } + else + { + sc.ScriptError("Invalid parameter type %s for menu item", args[i]->DescriptiveName()); + } + if (sc.CheckString(",")) + { + if (i == args.Size() - 1) + { + sc.ScriptError("Too many parameters for %s", cls->TypeName.GetChars()); + } + } + else + { + if (i < args.Size() - 1 && !(func->Variants[0].ArgFlags[i + 1] & VARF_Optional)) + { + sc.ScriptError("Insufficient parameters for %s", cls->TypeName.GetChars()); + } + break; + } + } + + DMenuItemBase *item = (DMenuItemBase*)cls->CreateNew(); + params[0] = item; + VMCallWithDefaults(func->Variants[0].Implementation, params, nullptr, 0); + desc->mItems.Push((DMenuItemBase*)item); + + success = true; + } + } + if (!success) + { + sc.ScriptError("Unknown keyword '%s'", sc.String); + } + } + } + for (auto &p : desc->mItems) + { + GC::WriteBarrier(p); + } +} + +//============================================================================= +// +// +// +//============================================================================= + +static void ParseOptionMenu(FScanner &sc) +{ + sc.MustGetString(); + + DOptionMenuDescriptor *desc = Create(); + desc->mFont = BigUpper; + desc->mMenuName = sc.String; + desc->mSelectedItem = -1; + desc->mScrollPos = 0; + desc->mClass = nullptr; + desc->mPosition = DefaultOptionMenuSettings->mPosition; + desc->mScrollTop = DefaultOptionMenuSettings->mScrollTop; + desc->mIndent = DefaultOptionMenuSettings->mIndent; + desc->mDontDim = DefaultOptionMenuSettings->mDontDim; + desc->mProtected = sc.CheckString("protected"); + + ParseOptionMenuBody(sc, desc); + ReplaceMenu(sc, desc); +} + + +//============================================================================= +// +// +// +//============================================================================= + +static void ParseAddOptionMenu(FScanner &sc) +{ + sc.MustGetString(); + + DMenuDescriptor **pOld = MenuDescriptors.CheckKey(sc.String); + if (pOld == nullptr || *pOld == nullptr || !(*pOld)->IsKindOf(RUNTIME_CLASS(DOptionMenuDescriptor))) + { + sc.ScriptError("%s is not an option menu that can be extended", sc.String); + } + ParseOptionMenuBody(sc, (DOptionMenuDescriptor*)(*pOld)); +} + + +//============================================================================= +// +// +// +//============================================================================= + +static void ParseImageScrollerBody(FScanner& sc, DImageScrollerDescriptor* desc) +{ + sc.MustGetStringName("{"); + while (!sc.CheckString("}")) + { + sc.MustGetString(); + if (sc.Compare("else")) + { + SkipSubBlock(sc); + } + else if (sc.Compare("ifgame")) + { + if (!CheckSkipGameBlock(sc)) + { + // recursively parse sub-block + ParseImageScrollerBody(sc, desc); + } + } + else if (sc.Compare("ifnotgame")) + { + if (!CheckSkipGameBlock(sc, false)) + { + // recursively parse sub-block + ParseImageScrollerBody(sc, desc); + } + } + else if (sc.Compare("ifoption")) + { + if (!CheckSkipOptionBlock(sc)) + { + // recursively parse sub-block + ParseImageScrollerBody(sc, desc); + } + } + else if (sc.Compare("animatedtransition")) + { + desc->mAnimatedTransition = true; + } + else if (sc.Compare("textBackground")) + { + sc.MustGetString(); + desc->textBackground = GetMenuTexture(sc.String); + } + else if (sc.Compare("textBackgroundBrightness")) + { + sc.MustGetFloat(); + int bb = clamp(int(sc.Float * 255), 0, 255); + desc->textBackgroundBrightness = PalEntry(255, bb, bb, bb); + } + else if (sc.Compare("textScale")) + { + sc.MustGetFloat(); + desc->textScale = sc.Float; + } + else if (sc.Compare("textFont")) + { + sc.MustGetString(); + FFont* newfont = V_GetFont(sc.String); + if (newfont != nullptr) desc->textFont = newfont; + } + else + { + bool success = false; + FStringf buildname("ImageScrollerPage%s", sc.String); + // Handle one special case: MapControl maps to Control with one parameter different + PClass* cls = PClass::FindClass(buildname); + if (cls != nullptr && cls->IsDescendantOf("ImageScrollerPage")) + { + 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 protected init method. + { + auto& args = func->Variants[0].Proto->ArgumentTypes; + TArray params; + + int start = 1; + + params.Push(0); + if (args.Size() > 1 && args[1] == NewPointer(PClass::FindClass("ImageScrollerDescriptor"))) + { + params.Push(desc); + start = 2; + } + auto TypeCVar = NewPointer(NewStruct("CVar", nullptr, true)); + + // Note that this array may not be reallocated so its initial size must be the maximum possible elements. + TArray strings(args.Size()); + for (unsigned i = start; i < args.Size(); i++) + { + sc.MustGetString(); + if (args[i] == TypeString) + { + strings.Push(sc.String); + params.Push(&strings.Last()); + } + else if (args[i] == TypeName) + { + params.Push(FName(sc.String).GetIndex()); + } + else if (args[i] == TypeColor) + { + params.Push(V_GetColor(nullptr, sc)); + } + else if (args[i]->isIntCompatible()) + { + char* endp; + int v = (int)strtoll(sc.String, &endp, 0); + if (*endp != 0) + { + // special check for font color ranges. + v = V_FindFontColor(sc.String); + if (v == CR_UNTRANSLATED && !sc.Compare("untranslated")) + { + // todo: check other data types that may get used. + sc.ScriptError("Integer expected, got %s", sc.String); + } + } + if (args[i] == TypeBool) v = !!v; + params.Push(v); + } + else if (args[i]->isFloat()) + { + char* endp; + double v = strtod(sc.String, &endp); + if (*endp != 0) + { + sc.ScriptError("Float expected, got %s", sc.String); + } + params.Push(v); + } + else if (args[i] == TypeCVar) + { + auto cv = FindCVar(sc.String, nullptr); + if (cv == nullptr && *sc.String) + { + if (func->Variants[0].ArgFlags[i] & VARF_Optional) + sc.ScriptMessage("Unknown CVar %s", sc.String); + else + sc.ScriptError("Unknown CVar %s", sc.String); + } + params.Push(cv); + } + else + { + sc.ScriptError("Invalid parameter type %s for image page", args[i]->DescriptiveName()); + } + if (sc.CheckString(",")) + { + if (i == args.Size() - 1) + { + sc.ScriptError("Too many parameters for %s", cls->TypeName.GetChars()); + } + } + else + { + if (i < args.Size() - 1 && !(func->Variants[0].ArgFlags[i + 1] & VARF_Optional)) + { + sc.ScriptError("Insufficient parameters for %s", cls->TypeName.GetChars()); + } + break; + } + } + + DMenuItemBase* item = (DMenuItemBase*)cls->CreateNew(); + params[0] = item; + VMCallWithDefaults(func->Variants[0].Implementation, params, nullptr, 0); + desc->mItems.Push((DMenuItemBase*)item); + + success = true; + } + } + if (!success) + { + sc.ScriptError("Unknown keyword '%s'", sc.String); + } + } + } +} + +//============================================================================= +// +// +// +//============================================================================= + +static void ParseImageScroller(FScanner& sc) +{ + sc.MustGetString(); + + DImageScrollerDescriptor* desc = Create(); + + desc->mMenuName = sc.String; + desc->textBackground.SetInvalid(); + desc->textBackgroundBrightness = 0xffffffff; + desc->textFont = SmallFont; + desc->textScale = 1; + desc->mAnimatedTransition = false; + desc->virtWidth = 320; + desc->virtHeight = 200; + + ParseImageScrollerBody(sc, desc); + bool scratch = ReplaceMenu(sc, desc); + if (scratch) delete desc; +} + + +//============================================================================= +// +// +// +//============================================================================= + +void M_ParseMenuDefs() +{ + int lump, lastlump = 0; + + // these are supposed to get GC'd after parsing is complete. + DefaultListMenuSettings = Create(); + DefaultOptionMenuSettings = Create(); + DefaultListMenuSettings->Reset(); + DefaultOptionMenuSettings->Reset(); + + int IWADMenu = fileSystem.CheckNumForName("MENUDEF", ns_global, fileSystem.GetIwadNum()); + + while ((lump = fileSystem.FindLump ("MENUDEF", &lastlump)) != -1) + { + FScanner sc(lump); + + mustPrintErrors = lump >= IWADMenu; + sc.SetCMode(true); + while (sc.GetString()) + { + if (sc.Compare("LISTMENU")) + { + ParseListMenu(sc); + } + else if (sc.Compare("DEFAULTLISTMENU")) + { + ParseListMenuBody(sc, DefaultListMenuSettings); + if (DefaultListMenuSettings->mItems.Size() > 0) + { + I_FatalError("You cannot add menu items to the menu default settings."); + } + } + else if (sc.Compare("OPTIONVALUE")) + { + ParseOptionValue(sc); + } + else if (sc.Compare("OPTIONSTRING")) + { + ParseOptionString(sc); + } + else if (sc.Compare("OPTIONMENUSETTINGS")) + { + ParseOptionSettings(sc); + } + else if (sc.Compare("OPTIONMENU")) + { + ParseOptionMenu(sc); + } + else if (sc.Compare("ADDOPTIONMENU")) + { + ParseAddOptionMenu(sc); + } + else if (sc.Compare("DEFAULTOPTIONMENU")) + { + ParseOptionMenuBody(sc, DefaultOptionMenuSettings); + if (DefaultOptionMenuSettings->mItems.Size() > 0) + { + I_FatalError("You cannot add menu items to the menu default settings."); + } + } + else if (sc.Compare("IMAGESCROLLER")) + { + ParseImageScroller(sc); + } + else + { + sc.ScriptError("Unknown keyword '%s'", sc.String); + } + } + if (Args->CheckParm("-nocustommenu")) break; + } + DefaultListMenuClass = DefaultListMenuSettings->mClass; + DefaultListMenuSettings = nullptr; + DefaultOptionMenuClass = DefaultOptionMenuSettings->mClass; + DefaultOptionMenuSettings = nullptr; +} + + +//============================================================================= +// +// Initialize the music configuration submenus +// +//============================================================================= +extern "C" +{ + extern int adl_getBanksCount(); + extern const char *const *adl_getBankNames(); +} + +static void InitMusicMenus() +{ + DMenuDescriptor **advmenu = MenuDescriptors.CheckKey("AdvSoundOptions"); + auto soundfonts = sfmanager.GetList(); + std::tuple sfmenus[] = { std::make_tuple("GusConfigMenu", SF_SF2 | SF_GUS, "midi_config"), + std::make_tuple("WildMidiConfigMenu", SF_GUS, "wildmidi_config"), + std::make_tuple("TimidityConfigMenu", SF_SF2 | SF_GUS, "timidity_config"), + std::make_tuple("FluidPatchsetMenu", SF_SF2, "fluid_patchset"), + std::make_tuple("ADLMIDICustomBanksMenu", SF_WOPL, "adl_custom_bank"), + std::make_tuple("OPNMIDICustomBanksMenu", SF_WOPN, "opn_custom_bank")}; + + for (auto &p : sfmenus) + { + DMenuDescriptor **menu = MenuDescriptors.CheckKey(std::get<0>(p)); + + if (menu != nullptr) + { + if (soundfonts.Size() > 0) + { + for (auto &entry : soundfonts) + { + if (entry.type & std::get<1>(p)) + { + FString display = entry.mName; + display.ReplaceChars("_", ' '); + auto it = CreateOptionMenuItemCommand(display, FStringf("%s \"%s\"", std::get<2>(p), entry.mName.GetChars()), true); + static_cast(*menu)->mItems.Push(it); + } + } + } + else if (advmenu != nullptr) + { + // Remove the item for this submenu + auto d = static_cast(*advmenu); + auto it = d->GetItem(std::get<0>(p)); + if (it != nullptr) d->mItems.Delete(d->mItems.Find(it)); + } + } + } + + DMenuDescriptor **menu = MenuDescriptors.CheckKey("ADLBankMenu"); + + if (menu != nullptr) + { + const char* const* adl_bank_names; + int adl_banks_count = ZMusic_GetADLBanks(&adl_bank_names); + for (int i=0; i < adl_banks_count; i++) + { + auto it = CreateOptionMenuItemCommand(adl_bank_names[i], FStringf("adl_bank %d", i), true); + static_cast(*menu)->mItems.Push(it); + } + } +} + +//============================================================================= +// +// Special menus will be created once all engine data is loaded +// +//============================================================================= + +void M_CreateMenus() +{ + InitMusicMenus(); + FOptionValues **opt = OptionValues.CheckKey(NAME_Mididevices); + if (opt != nullptr) + { + I_BuildMIDIMenuList(*opt); + } + opt = OptionValues.CheckKey(NAME_Aldevices); + if (opt != nullptr) + { + I_BuildALDeviceList(*opt); + } + opt = OptionValues.CheckKey(NAME_Alresamplers); + if (opt != nullptr) + { + I_BuildALResamplersList(*opt); + } +} + + diff --git a/source/common/menu/messagebox.cpp b/source/common/menu/messagebox.cpp new file mode 100644 index 000000000..8b43d8d76 --- /dev/null +++ b/source/common/menu/messagebox.cpp @@ -0,0 +1,105 @@ +/* +** messagebox.cpp +** Confirmation, notification screns +** +**--------------------------------------------------------------------------- +** Copyright 2010 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 "menu.h" +#include "gstrings.h" +#include "i_video.h" +#include "c_dispatch.h" +#include "vm.h" +#include "menustate.h" + +void M_StartControlPanel(bool makeSound, bool scaleoverride = false); +FName MessageBoxClass = NAME_MessageBoxMenu; + +CVAR(Bool, m_quickexit, false, CVAR_ARCHIVE) + +typedef void(*hfunc)(); +DEFINE_ACTION_FUNCTION(DMessageBoxMenu, CallHandler) +{ + PARAM_PROLOGUE; + PARAM_POINTERTYPE(Handler, hfunc); + Handler(); + return 0; +} + +//============================================================================= +// +// +// +//============================================================================= + +DMenu *CreateMessageBoxMenu(DMenu *parent, const char *message, int messagemode, bool playsound, FName action = NAME_None, hfunc handler = nullptr) +{ + auto c = PClass::FindClass(MessageBoxClass); + if (!c->IsDescendantOf(NAME_MessageBoxMenu)) c = PClass::FindClass(NAME_MessageBoxMenu); + auto p = c->CreateNew(); + FString namestr = message; + + IFVIRTUALPTRNAME(p, NAME_MessageBoxMenu, Init) + { + VMValue params[] = { p, parent, &namestr, messagemode, playsound, action.GetIndex(), reinterpret_cast(handler) }; + VMCall(func, params, countof(params), nullptr, 0); + return (DMenu*)p; + } + return nullptr; +} + +//============================================================================= +// +// +// +//============================================================================= + +void M_StartMessage(const char *message, int messagemode, FName action) +{ + if (CurrentMenu == NULL) + { + // only play a sound if no menu was active before + M_StartControlPanel(menuactive == MENU_Off); + } + DMenu *newmenu = CreateMessageBoxMenu(CurrentMenu, message, messagemode, false, action); + newmenu->mParentMenu = CurrentMenu; + M_ActivateMenu(newmenu); +} + +DEFINE_ACTION_FUNCTION(DMenu, StartMessage) +{ + PARAM_PROLOGUE; + PARAM_STRING(msg); + PARAM_INT(mode); + PARAM_NAME(action); + M_StartMessage(msg, mode, action); + return 0; +} diff --git a/source/common/menu/optionmenu.cpp b/source/common/menu/optionmenu.cpp new file mode 100644 index 000000000..99069d176 --- /dev/null +++ b/source/common/menu/optionmenu.cpp @@ -0,0 +1,68 @@ +/* +** optionmenu.cpp +** Handler class for the option menus and associated items +** +**--------------------------------------------------------------------------- +** Copyright 2010-2017 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_video.h" +#include "menu.h" +#include "vm.h" + + +//============================================================================= +// +// +// +//============================================================================= + +DMenuItemBase *DOptionMenuDescriptor::GetItem(FName name) +{ + for(unsigned i=0;imAction; + if (nm == name) return mItems[i]; + } + return NULL; +} + +void SetCVarDescription(FBaseCVar* cvar, const FString* label) +{ + cvar->AddDescription(*label); +} + +DEFINE_ACTION_FUNCTION_NATIVE(_OptionMenuItemOption, SetCVarDescription, SetCVarDescription) +{ + PARAM_PROLOGUE; + PARAM_POINTER(cv, FBaseCVar); + PARAM_STRING(label); + SetCVarDescription(cv, &label); + return 0; +} \ No newline at end of file diff --git a/source/core/menu/resolutionmenu.cpp b/source/common/menu/resolutionmenu.cpp similarity index 100% rename from source/core/menu/resolutionmenu.cpp rename to source/common/menu/resolutionmenu.cpp diff --git a/source/core/menu/savegamemanager.cpp b/source/common/menu/savegamemanager.cpp similarity index 50% rename from source/core/menu/savegamemanager.cpp rename to source/common/menu/savegamemanager.cpp index a62be3068..935b6dedd 100644 --- a/source/core/menu/savegamemanager.cpp +++ b/source/common/menu/savegamemanager.cpp @@ -4,7 +4,7 @@ ** **--------------------------------------------------------------------------- ** Copyright 2001-2010 Randy Heit -** Copyright 2010 Christoph Oelckers +** Copyright 2010-2020 Christoph Oelckers ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without @@ -38,68 +38,16 @@ #include "m_png.h" #include "filesystem.h" #include "v_text.h" -#include "d_event.h" #include "gstrings.h" -#include "d_gui.h" -#include "v_draw.h" -#include "files.h" -#include "resourcefile.h" -#include "cmdlib.h" -#include "files.h" -#include "savegamehelp.h" -#include "i_specialpaths.h" -#include "c_dispatch.h" -#include "build.h" #include "serializer.h" +#include "vm.h" +#include "i_system.h" +#include "v_video.h" #include "findfile.h" -#include "inputstate.h" -#include "gamestate.h" +#include "v_draw.h" +#include "savegamemanager.h" -FSavegameManager savegameManager; -FString BackupSaveGame; - -void DoLoadGame(const char* name) -{ - if (OpenSaveGameForRead(name)) - { - if (gi->LoadGame(nullptr)) - { - gameaction = ga_level; - } - else - { - I_Error("%s: Failed to load savegame", name); - } - } - else - { - I_Error("%s: Failed to open savegame", name); - } -} - -void FSavegameManager::LoadGame(FSaveGameNode* node) -{ - inputState.ClearAllInput(); - gi->FreeLevelData(); - DoLoadGame(node->Filename); - BackupSaveGame = node->Filename; -} - -void FSavegameManager::SaveGame(FSaveGameNode* node, bool ok4q, bool forceq) -{ - if (OpenSaveGameForWrite(node->Filename, node->SaveTitle)) - { - if (gi->SaveGame(node) && FinishSavegameWrite()) - { - FString fn = node->Filename; - FString desc = node->SaveTitle; - NotifyNewSave(fn, desc, ok4q, forceq); - Printf(PRINT_NOTIFY, "%s\n", GStrings("GAME SAVED")); - BackupSaveGame = node->Filename; - } - } -} //============================================================================= // @@ -107,7 +55,7 @@ void FSavegameManager::SaveGame(FSaveGameNode* node, bool ok4q, bool forceq) // //============================================================================= -void FSavegameManager::ClearSaveGames() +void FSavegameManagerBase::ClearSaveGames() { for (unsigned i = 0; ibNoDelete ? index - 1 : index; if (listindex < 0) return index; @@ -155,13 +103,20 @@ int FSavegameManager::RemoveSaveSlot(int index) return index; } +DEFINE_ACTION_FUNCTION(FSavegameManager, RemoveSaveSlot) +{ + PARAM_SELF_STRUCT_PROLOGUE(FSavegameManagerBase); + PARAM_INT(sel); + ACTION_RETURN_INT(self->RemoveSaveSlot(sel)); +} + //============================================================================= // // // //============================================================================= -int FSavegameManager::InsertSaveNode(FSaveGameNode *node) +int FSavegameManagerBase::InsertSaveNode(FSaveGameNode *node) { if (SaveGames.Size() == 0) { @@ -175,7 +130,7 @@ int FSavegameManager::InsertSaveNode(FSaveGameNode *node) else { // Add node at top of list unsigned int i = 0; - if (SaveGames[0] == &NewSaveNode) i++; // To not insert above the "new savegame" dummy entry. + //if (SaveGames[0] == &NewSaveNode) i++; // To not insert above the "new savegame" dummy entry. for (; i < SaveGames.Size(); i++) { if (SaveGames[i]->bOldVersion || node->SaveTitle.CompareNoCase(SaveGames[i]->SaveTitle) <= 0) @@ -188,72 +143,13 @@ int FSavegameManager::InsertSaveNode(FSaveGameNode *node) } } -//============================================================================= -// -// M_ReadSaveStrings -// -// Find savegames and read their titles -// -//============================================================================= - -void FSavegameManager::ReadSaveStrings() -{ - if (SaveGames.Size() == 0) - { - void *filefirst; - findstate_t c_file; - FString filter; - - LastSaved = LastAccessed = -1; - quickSaveSlot = nullptr; - filter = G_BuildSaveName("*"); - filefirst = I_FindFirst(filter.GetChars(), &c_file); - if (filefirst != ((void *)(-1))) - { - do - { - // I_FindName only returns the file's name and not its full path - FString filepath = G_BuildSaveName(I_FindName(&c_file)); - - FResourceFile *savegame = FResourceFile::OpenResourceFile(filepath, true, true); - if (savegame != nullptr) - { - FResourceLump *info = savegame->FindLump("info.json"); - if (info == nullptr) - { - // savegame info not found. This is not a savegame so leave it alone. - delete savegame; - continue; - } - auto fr = info->NewReader(); - FString title; - int check = G_ValidateSavegame(fr, &title, true); - fr.Close(); - delete savegame; - if (check != 0) - { - FSaveGameNode *node = new FSaveGameNode; - node->Filename = filepath; - node->bOldVersion = check == -1; - node->bMissingWads = check == -2; - node->SaveTitle = title; - InsertSaveNode(node); - } - } - } while (I_FindNext (filefirst, &c_file) == 0); - I_FindClose (filefirst); - } - } -} - - //============================================================================= // // // //============================================================================= -void FSavegameManager::NotifyNewSave(const FString &file, const FString &title, bool okForQuicksave, bool forceQuicksave) +void FSavegameManagerBase::NotifyNewSave(const FString &file, const FString &title, bool okForQuicksave, bool forceQuicksave) { FSaveGameNode *node; @@ -278,7 +174,7 @@ void FSavegameManager::NotifyNewSave(const FString &file, const FString &title, if (okForQuicksave) { if (quickSaveSlot == nullptr || quickSaveSlot == (FSaveGameNode*)1 || forceQuicksave) quickSaveSlot = node; - LastAccessed = LastSaved = i - 1; // without item + LastAccessed = LastSaved = i; } return; } @@ -294,7 +190,7 @@ void FSavegameManager::NotifyNewSave(const FString &file, const FString &title, if (okForQuicksave) { if (quickSaveSlot == nullptr || quickSaveSlot == (FSaveGameNode*)1 || forceQuicksave) quickSaveSlot = node; - LastAccessed = LastSaved = index - 1; // without item + LastAccessed = LastSaved = index; } else { @@ -302,27 +198,31 @@ void FSavegameManager::NotifyNewSave(const FString &file, const FString &title, } } + //============================================================================= // // Loads the savegame // //============================================================================= -void FSavegameManager::LoadSavegame(int Selected) +void FSavegameManagerBase::LoadSavegame(int Selected) { - auto sel = savegameManager.GetSavegame(Selected); - if (sel && !sel->bOldVersion && !sel->bMissingWads) + PerformLoadGame(SaveGames[Selected]->Filename.GetChars(), true); + if (quickSaveSlot == (FSaveGameNode*)1) { - savegameManager.LoadGame(SaveGames[Selected]); - if (quickSaveSlot == (FSaveGameNode*)1) - { - quickSaveSlot = SaveGames[Selected]; - } - M_ClearMenus(); - LastAccessed = Selected; + quickSaveSlot = SaveGames[Selected]; } + M_ClearMenus(); + LastAccessed = Selected; } +DEFINE_ACTION_FUNCTION(FSavegameManager, LoadSavegame) +{ + PARAM_SELF_STRUCT_PROLOGUE(FSavegameManagerBase); + PARAM_INT(sel); + self->LoadSavegame(sel); + return 0; +} //============================================================================= // @@ -330,13 +230,12 @@ void FSavegameManager::LoadSavegame(int Selected) // //============================================================================= -void FSavegameManager::DoSave(int Selected, const char *savegamestring) +void FSavegameManagerBase::DoSave(int Selected, const char *savegamestring) { if (Selected != 0) { - auto node = *SaveGames[Selected]; - node.SaveTitle = savegamestring; - savegameManager.SaveGame(&node, true, false); + auto node = SaveGames[Selected]; + PerformSaveGame(node->Filename.GetChars(), savegamestring); } else { @@ -346,18 +245,25 @@ void FSavegameManager::DoSave(int Selected, const char *savegamestring) for (i = 0;; ++i) { - filename = G_BuildSaveName(FStringf("save%04d", i)); + filename = BuildSaveName("save", i); if (!FileExists(filename)) { break; } } - FSaveGameNode sg{ savegamestring, filename }; - savegameManager.SaveGame(&sg, true, false); + PerformSaveGame(filename, savegamestring); } M_ClearMenus(); } +DEFINE_ACTION_FUNCTION(FSavegameManager, DoSave) +{ + PARAM_SELF_STRUCT_PROLOGUE(FSavegameManagerBase); + PARAM_INT(sel); + PARAM_STRING(name); + self->DoSave(sel, name); + return 0; +} //============================================================================= // @@ -365,7 +271,7 @@ void FSavegameManager::DoSave(int Selected, const char *savegamestring) // //============================================================================= -unsigned FSavegameManager::ExtractSaveData(int index) +unsigned FSavegameManagerBase::ExtractSaveData(int index) { FResourceFile *resf; FSaveGameNode *node; @@ -406,15 +312,7 @@ unsigned FSavegameManager::ExtractSaveData(int index) } info->Unlock(); - FString comment, fcomment, ncomment, mtime; - - arc("Creation Time", comment) - ("Map Label", fcomment) - ("Map Name", ncomment) - ("Map Time", mtime); - - comment.AppendFormat("\n%s - %s\n%s", fcomment.GetChars(), ncomment.GetChars(), mtime.GetChars()); - SaveCommentString = comment; + SaveCommentString = ExtractSaveComment(arc); FResourceLump *pic = resf->FindLump("savepic.png"); if (pic != nullptr) @@ -438,7 +336,6 @@ unsigned FSavegameManager::ExtractSaveData(int index) { delete SavePic; SavePic = nullptr; - SavePicData.Clear(); } } } @@ -453,7 +350,7 @@ unsigned FSavegameManager::ExtractSaveData(int index) // //============================================================================= -void FSavegameManager::UnloadSaveData() +void FSavegameManagerBase::UnloadSaveData() { if (SavePic != nullptr) { @@ -462,7 +359,13 @@ void FSavegameManager::UnloadSaveData() SaveCommentString = ""; SavePic = nullptr; - SavePicData.Clear(); +} + +DEFINE_ACTION_FUNCTION(FSavegameManager, UnloadSaveData) +{ + PARAM_SELF_STRUCT_PROLOGUE(FSavegameManagerBase); + self->UnloadSaveData(); + return 0; } //============================================================================= @@ -471,7 +374,7 @@ void FSavegameManager::UnloadSaveData() // //============================================================================= -void FSavegameManager::ClearSaveStuff() +void FSavegameManagerBase::ClearSaveStuff() { UnloadSaveData(); if (quickSaveSlot == (FSaveGameNode*)1) @@ -480,6 +383,12 @@ void FSavegameManager::ClearSaveStuff() } } +DEFINE_ACTION_FUNCTION(FSavegameManager, ClearSaveStuff) +{ + PARAM_SELF_STRUCT_PROLOGUE(FSavegameManagerBase); + self->ClearSaveStuff(); + return 0; +} //============================================================================= // @@ -487,13 +396,22 @@ void FSavegameManager::ClearSaveStuff() // //============================================================================= -bool FSavegameManager::DrawSavePic(int x, int y, int w, int h) +bool FSavegameManagerBase::DrawSavePic(int x, int y, int w, int h) { if (SavePic == nullptr) return false; DrawTexture(twod, SavePic, x, y, DTA_DestWidth, w, DTA_DestHeight, h, DTA_Masked, false, TAG_DONE); return true; } +DEFINE_ACTION_FUNCTION(FSavegameManager, DrawSavePic) +{ + PARAM_SELF_STRUCT_PROLOGUE(FSavegameManagerBase); + PARAM_INT(x); + PARAM_INT(y); + PARAM_INT(w); + PARAM_INT(h); + ACTION_RETURN_BOOL(self->DrawSavePic(x, y, w, h)); +} //============================================================================= // @@ -501,7 +419,7 @@ bool FSavegameManager::DrawSavePic(int x, int y, int w, int h) // //============================================================================= -void FSavegameManager::SetFileInfo(int Selected) +void FSavegameManagerBase::SetFileInfo(int Selected) { if (!SaveGames[Selected]->Filename.IsEmpty()) { @@ -509,6 +427,14 @@ void FSavegameManager::SetFileInfo(int Selected) } } +DEFINE_ACTION_FUNCTION(FSavegameManager, SetFileInfo) +{ + PARAM_SELF_STRUCT_PROLOGUE(FSavegameManagerBase); + PARAM_INT(i); + self->SetFileInfo(i); + return 0; +} + //============================================================================= // @@ -516,11 +442,16 @@ void FSavegameManager::SetFileInfo(int Selected) // //============================================================================= -unsigned FSavegameManager::SavegameCount() +unsigned FSavegameManagerBase::SavegameCount() { return SaveGames.Size(); } +DEFINE_ACTION_FUNCTION(FSavegameManager, SavegameCount) +{ + PARAM_SELF_STRUCT_PROLOGUE(FSavegameManagerBase); + ACTION_RETURN_INT(self->SavegameCount()); +} //============================================================================= // @@ -528,11 +459,17 @@ unsigned FSavegameManager::SavegameCount() // //============================================================================= -FSaveGameNode *FSavegameManager::GetSavegame(int i) +FSaveGameNode *FSavegameManagerBase::GetSavegame(int i) { return SaveGames[i]; } +DEFINE_ACTION_FUNCTION(FSavegameManager, GetSavegame) +{ + PARAM_SELF_STRUCT_PROLOGUE(FSavegameManagerBase); + PARAM_INT(i); + ACTION_RETURN_POINTER(self->GetSavegame(i)); +} //============================================================================= // @@ -540,13 +477,19 @@ FSaveGameNode *FSavegameManager::GetSavegame(int i) // //============================================================================= -void FSavegameManager::InsertNewSaveNode() +void FSavegameManagerBase::InsertNewSaveNode() { NewSaveNode.SaveTitle = GStrings("NEWSAVE"); NewSaveNode.bNoDelete = true; SaveGames.Insert(0, &NewSaveNode); } +DEFINE_ACTION_FUNCTION(FSavegameManager, InsertNewSaveNode) +{ + PARAM_SELF_STRUCT_PROLOGUE(FSavegameManagerBase); + self->InsertNewSaveNode(); + return 0; +} //============================================================================= // @@ -554,7 +497,7 @@ void FSavegameManager::InsertNewSaveNode() // //============================================================================= -bool FSavegameManager::RemoveNewSaveNode() +bool FSavegameManagerBase::RemoveNewSaveNode() { if (SaveGames[0] == &NewSaveNode) { @@ -564,176 +507,35 @@ bool FSavegameManager::RemoveNewSaveNode() return false; } -//============================================================================= -// -// -// -//============================================================================= - -CVAR(Bool, saveloadconfirmation, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) - -CVAR(Int, autosavenum, 0, CVAR_NOSET | CVAR_ARCHIVE | CVAR_GLOBALCONFIG) -static int nextautosave = -1; -CVAR(Int, disableautosave, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) -CUSTOM_CVAR(Int, autosavecount, 4, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +DEFINE_ACTION_FUNCTION(FSavegameManager, RemoveNewSaveNode) { - if (self < 1) - self = 1; + PARAM_SELF_STRUCT_PROLOGUE(FSavegameManagerBase); + ACTION_RETURN_INT(self->RemoveNewSaveNode()); } -CVAR(Int, quicksavenum, 0, CVAR_NOSET | CVAR_ARCHIVE | CVAR_GLOBALCONFIG) -static int nextquicksave = -1; - CUSTOM_CVAR(Int, quicksavecount, 4, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) + +DEFINE_ACTION_FUNCTION(FSavegameManager, ReadSaveStrings) { - if (self < 1) - self = 1; + PARAM_SELF_STRUCT_PROLOGUE(FSavegameManagerBase); + self->ReadSaveStrings(); + return 0; } -void M_Autosave() +DEFINE_ACTION_FUNCTION(FSavegameManager, ExtractSaveData) { - if (disableautosave) return; - if (!gi->CanSave()) return; - FString description; - FString file; - // Keep a rotating sets of autosaves - UCVarValue num; - const char* readableTime; - int count = autosavecount != 0 ? autosavecount : 1; - - if (nextautosave == -1) - { - nextautosave = (autosavenum + 1) % count; - } - - num.Int = nextautosave; - autosavenum.ForceSet(num, CVAR_Int); - - FSaveGameNode sg; - sg.Filename = G_BuildSaveName(FStringf("auto%04d", nextautosave)); - readableTime = myasctime(); - sg.SaveTitle.Format("Autosave %s", readableTime); - nextautosave = (nextautosave + 1) % count; - savegameManager.SaveGame(&sg, false, false); -} - -CCMD(autosave) -{ - gameaction = ga_autosave; -} - -CCMD(rotatingquicksave) -{ - if (!gi->CanSave()) return; - FString description; - FString file; - // Keep a rotating sets of quicksaves - UCVarValue num; - const char* readableTime; - int count = quicksavecount != 0 ? quicksavecount : 1; - - if (nextquicksave == -1) - { - nextquicksave = (quicksavenum + 1) % count; - } - - num.Int = nextquicksave; - quicksavenum.ForceSet(num, CVAR_Int); - - FSaveGameNode sg; - sg.Filename = G_BuildSaveName(FStringf("quick%04d", nextquicksave)); - readableTime = myasctime(); - sg.SaveTitle.Format("Quicksave %s", readableTime); - nextquicksave = (nextquicksave + 1) % count; - savegameManager.SaveGame(&sg, false, false); + PARAM_SELF_STRUCT_PROLOGUE(FSavegameManagerBase); + PARAM_INT(sel); + ACTION_RETURN_INT(self->ExtractSaveData(sel)); } -//============================================================================= -// -// -// -//============================================================================= +DEFINE_FIELD(FSaveGameNode, SaveTitle); +DEFINE_FIELD(FSaveGameNode, Filename); +DEFINE_FIELD(FSaveGameNode, bOldVersion); +DEFINE_FIELD(FSaveGameNode, bMissingWads); +DEFINE_FIELD(FSaveGameNode, bNoDelete); -CCMD(quicksave) -{ // F6 - if (!gi->CanSave()) return; +DEFINE_FIELD_X(SavegameManager, FSavegameManagerBase, WindowSize); +DEFINE_FIELD_X(SavegameManager, FSavegameManagerBase, quickSaveSlot); +DEFINE_FIELD_X(SavegameManager, FSavegameManagerBase, SaveCommentString); - if (savegameManager.quickSaveSlot == NULL || savegameManager.quickSaveSlot == (FSaveGameNode*)1) - { - M_StartControlPanel(true); - M_SetMenu(NAME_Savegamemenu); - return; - } - - auto slot = savegameManager.quickSaveSlot; - - // [mxd]. Just save the game, no questions asked. - if (!saveloadconfirmation) - { - savegameManager.SaveGame(savegameManager.quickSaveSlot, true, true); - return; - } - - FString tempstring = GStrings("QSPROMPT"); - tempstring.Substitute("%s", slot->SaveTitle.GetChars()); - M_StartControlPanel(true); - - DMenu* newmenu = CreateMessageBoxMenu(CurrentMenu, tempstring, 0, INT_MAX, false, NAME_None, [](bool res) - { - if (res) - { - savegameManager.SaveGame(savegameManager.quickSaveSlot, true, true); - } - return true; - }); - - M_ActivateMenu(newmenu); -} - -//============================================================================= -// -// -// -//============================================================================= - -CCMD(quickload) -{ // F9 -#if 0 - if (netgame) - { - M_StartControlPanel(true); - M_StartMessage(GStrings("QLOADNET"), 1); - return; - } -#endif - - if (savegameManager.quickSaveSlot == nullptr || savegameManager.quickSaveSlot == (FSaveGameNode*)1) - { - M_StartControlPanel(true); - // signal that whatever gets loaded should be the new quicksave - savegameManager.quickSaveSlot = (FSaveGameNode*)1; - M_SetMenu(NAME_Loadgamemenu); - return; - } - - // [mxd]. Just load the game, no questions asked. - if (!saveloadconfirmation) - { - savegameManager.LoadGame(savegameManager.quickSaveSlot); - return; - } - FString tempstring = GStrings("QLPROMPT"); - tempstring.Substitute("%s", savegameManager.quickSaveSlot->SaveTitle.GetChars()); - - M_StartControlPanel(true); - - DMenu* newmenu = CreateMessageBoxMenu(CurrentMenu, tempstring, 0, INT_MAX, false, NAME_None, [](bool res) - { - if (res) - { - savegameManager.LoadGame(savegameManager.quickSaveSlot); - } - return true; - }); - M_ActivateMenu(newmenu); -} diff --git a/source/common/menu/savegamemanager.h b/source/common/menu/savegamemanager.h new file mode 100644 index 000000000..754ddce23 --- /dev/null +++ b/source/common/menu/savegamemanager.h @@ -0,0 +1,61 @@ +#pragma once + +#include "zstring.h" +#include "tarray.h" + +class FGameTexture; +class FSerializer; + +// The savegame manager contains too much code that is game specific. Parts are shareable but need more work first. +struct FSaveGameNode +{ + FString SaveTitle; + FString Filename; + bool bOldVersion = false; + bool bMissingWads = false; + bool bNoDelete = false; +}; + +struct FSavegameManagerBase +{ +protected: + TArray SaveGames; + FSaveGameNode NewSaveNode; + int LastSaved = -1; + int LastAccessed = -1; + FGameTexture *SavePic = nullptr; + +public: + int WindowSize = 0; + FString SaveCommentString; + FSaveGameNode *quickSaveSlot = nullptr; + virtual ~FSavegameManagerBase(); + +protected: + int InsertSaveNode(FSaveGameNode *node); + virtual void PerformSaveGame(const char *fn, const char *sgdesc) = 0; + virtual void PerformLoadGame(const char *fn, bool) = 0; + virtual FString ExtractSaveComment(FSerializer &arc) = 0; + virtual FString BuildSaveName(const char* prefix, int slot) = 0; +public: + void NotifyNewSave(const FString &file, const FString &title, bool okForQuicksave, bool forceQuicksave); + void ClearSaveGames(); + + virtual void ReadSaveStrings() = 0; + void UnloadSaveData(); + + int RemoveSaveSlot(int index); + void LoadSavegame(int Selected); + void DoSave(int Selected, const char *savegamestring); + unsigned ExtractSaveData(int index); + void ClearSaveStuff(); + bool DrawSavePic(int x, int y, int w, int h); + void DrawSaveComment(FFont *font, int cr, int x, int y, int scalefactor); + void SetFileInfo(int Selected); + unsigned SavegameCount(); + FSaveGameNode *GetSavegame(int i); + void InsertNewSaveNode(); + bool RemoveNewSaveNode(); + +}; + diff --git a/source/common/rendering/gl/gl_samplers.cpp b/source/common/rendering/gl/gl_samplers.cpp index 0e2ef0546..ca3426e7a 100644 --- a/source/common/rendering/gl/gl_samplers.cpp +++ b/source/common/rendering/gl/gl_samplers.cpp @@ -125,7 +125,7 @@ void FSamplerManager::SetTextureFilterMode() { glSamplerParameteri(mSamplers[i], GL_TEXTURE_MIN_FILTER, TexFilter[filter].minfilter); glSamplerParameteri(mSamplers[i], GL_TEXTURE_MAG_FILTER, TexFilter[filter].magfilter); - glSamplerParameterf(mSamplers[i], GL_TEXTURE_MAX_ANISOTROPY_EXT, gl_texture_filter_anisotropic); + glSamplerParameterf(mSamplers[i], GL_TEXTURE_MAX_ANISOTROPY_EXT, filter > 0? gl_texture_filter_anisotropic : 1.0); } glSamplerParameteri(mSamplers[CLAMP_XY_NOMIP], GL_TEXTURE_MIN_FILTER, TexFilter[filter].magfilter); glSamplerParameteri(mSamplers[CLAMP_XY_NOMIP], GL_TEXTURE_MAG_FILTER, TexFilter[filter].magfilter); diff --git a/source/common/scripting/frontend/zcc-parse.lemon b/source/common/scripting/frontend/zcc-parse.lemon index 9bf5932cf..79e52d831 100644 --- a/source/common/scripting/frontend/zcc-parse.lemon +++ b/source/common/scripting/frontend/zcc-parse.lemon @@ -234,6 +234,7 @@ class_head(X) ::= EXTEND CLASS(T) IDENTIFIER(A). X = head; } + class_head(X) ::= CLASS(T) IDENTIFIER(A) class_ancestry(B) class_flags(C). { NEW_AST_NODE(Class,head,T); @@ -394,6 +395,17 @@ struct_def(X) ::= STRUCT(T) IDENTIFIER(A) struct_flags(S) LBRACE opt_struct_body X = def; } +struct_def(X) ::= EXTEND STRUCT(T) IDENTIFIER(A) LBRACE opt_struct_body(B) RBRACE opt_semicolon. +{ + NEW_AST_NODE(Struct,def,T); + def->NodeName = A.Name(); + def->Body = B; + def->Type = nullptr; + def->Symbol = nullptr; + def->Flags = ZCC_Extension; + X = def; +} + %type struct_flags{ClassFlagsBlock} struct_flags(X) ::= . { X.Flags = 0; X.Version = {0, 0}; } struct_flags(X) ::= struct_flags(A) UI. { X.Flags = A.Flags | ZCC_UIFlag; } diff --git a/source/common/scripting/frontend/zcc_compile.cpp b/source/common/scripting/frontend/zcc_compile.cpp index a4908e7bc..ac22942fd 100644 --- a/source/common/scripting/frontend/zcc_compile.cpp +++ b/source/common/scripting/frontend/zcc_compile.cpp @@ -377,8 +377,30 @@ void ZCCCompiler::ProcessMixin(ZCC_MixinDef *cnode, PSymbolTreeNode *treenode) void ZCCCompiler::ProcessStruct(ZCC_Struct *cnode, PSymbolTreeNode *treenode, ZCC_Class *outer) { - Structs.Push(new ZCC_StructWork(static_cast(cnode), treenode, outer)); - ZCC_StructWork *cls = Structs.Last(); + ZCC_StructWork* cls = nullptr; + + // If this is a struct extension, put the new node directly into the existing class. + if (cnode->Flags == ZCC_Extension) + { + for (auto strct : Structs) + { + if (strct->NodeName() == cnode->NodeName) + { + cls = strct; + break; + } + } + if (cls == nullptr) + { + Error(cnode, "Struct %s cannot be found in the current translation unit.", FName(cnode->NodeName).GetChars()); + return; + } + } + else + { + Structs.Push(new ZCC_StructWork(static_cast(cnode), treenode, outer)); + cls = Structs.Last(); + } auto node = cnode->Body; PSymbolTreeNode *childnode; @@ -494,7 +516,15 @@ ZCCCompiler::ZCCCompiler(ZCC_AST &ast, DObject *_outer, PSymbolTable &_symbols, ProcessClass(static_cast(node), tnode); break; } + goto common; case AST_Struct: + if (static_cast(node)->Flags == ZCC_Extension) + { + ProcessStruct(static_cast(node), tnode, nullptr); + break; + } + + common: case AST_ConstantDef: case AST_Enum: if ((tnode = AddTreeNode(static_cast(node)->NodeName, node, GlobalTreeNodes))) diff --git a/source/common/scripting/interface/vmnatives.cpp b/source/common/scripting/interface/vmnatives.cpp index 4fa160ac5..25d5ccba8 100644 --- a/source/common/scripting/interface/vmnatives.cpp +++ b/source/common/scripting/interface/vmnatives.cpp @@ -47,6 +47,7 @@ #include "gstrings.h" #include "printf.h" #include "s_music.h" +#include "i_interface.h" //========================================================================== @@ -354,6 +355,18 @@ DEFINE_ACTION_FUNCTION_NATIVE(FFont, GetCursor, GetCursor) ACTION_RETURN_STRING(FString(self->GetCursor())); } +static int GetGlyphHeight(FFont* fnt, int code) +{ + auto glyph = fnt->GetChar(code, CR_UNTRANSLATED, nullptr); + return glyph ? (int)glyph->GetDisplayHeight() : 0; +} + +DEFINE_ACTION_FUNCTION_NATIVE(FFont, GetGlyphHeight, GetGlyphHeight) +{ + PARAM_SELF_STRUCT_PROLOGUE(FFont); + PARAM_INT(code); + ACTION_RETURN_INT(GetGlyphHeight(self, code)); +} //========================================================================== // // file system @@ -541,7 +554,7 @@ DEFINE_ACTION_FUNCTION(_CVar, FindCVar) // // //============================================================================= -#if 0 + DEFINE_ACTION_FUNCTION(FKeyBindings, SetBind) { PARAM_SELF_STRUCT_PROLOGUE(FKeyBindings); @@ -623,7 +636,7 @@ DEFINE_ACTION_FUNCTION(DOptionMenuItemCommand, DoCommand) C_DoCommand(cmd); return 0; } -#endif + DEFINE_ACTION_FUNCTION(_Console, MidPrint) { PARAM_PROLOGUE; @@ -659,3 +672,5 @@ DEFINE_FIELD_X(MusPlayingInfo, MusPlayingInfo, loop); DEFINE_GLOBAL_NAMED(PClass::AllClasses, AllClasses) DEFINE_GLOBAL(Bindings) +DEFINE_GLOBAL(AutomapBindings) +DEFINE_GLOBAL(generic_ui) diff --git a/source/common/textures/texturemanager.cpp b/source/common/textures/texturemanager.cpp index c396f3437..4a505600b 100644 --- a/source/common/textures/texturemanager.cpp +++ b/source/common/textures/texturemanager.cpp @@ -265,6 +265,11 @@ FTextureID FTextureManager::CheckForTexture (const char *name, ETextureType uset } } } + if (!(flags & TEXMAN_NoAlias)) + { + int* alias = aliases.CheckKey(name); + if (alias) return FTextureID(*alias); + } return FTextureID(-1); } @@ -1539,6 +1544,19 @@ void FTextureManager::SetTranslation(FTextureID fromtexnum, FTextureID totexnum) } +//----------------------------------------------------------------------------- +// +// Adds an alias name to the texture manager. +// Aliases are only checked if no real texture with the given name exists. +// +//----------------------------------------------------------------------------- + +void FTextureManager::AddAlias(const char* name, FGameTexture* tex) +{ + FTextureID id = tex->GetID(); + if (tex != Textures[id.GetIndex()].Texture || !tex->isValid()) return; // Whatever got passed in here was not valid, so ignore the alias. + aliases.Insert(name, id.GetIndex()); +} //========================================================================== // diff --git a/source/common/textures/texturemanager.h b/source/common/textures/texturemanager.h index 6001a1c0a..ecf6b2b1e 100644 --- a/source/common/textures/texturemanager.h +++ b/source/common/textures/texturemanager.h @@ -89,7 +89,8 @@ public: TEXMAN_ShortNameOnly = 16, TEXMAN_DontCreate = 32, TEXMAN_Localize = 64, - TEXMAN_ForceLookup = 128 + TEXMAN_ForceLookup = 128, + TEXMAN_NoAlias = 256, }; enum @@ -144,6 +145,8 @@ public: tmanips.Remove(cname); } + void AddAlias(const char* name, FGameTexture* tex); + private: // texture counting @@ -190,6 +193,7 @@ private: TArray Translation; TMap tmanips; + TMap aliases; public: diff --git a/source/common/utility/name.cpp b/source/common/utility/name.cpp index a34575df7..b1355a020 100644 --- a/source/common/utility/name.cpp +++ b/source/common/utility/name.cpp @@ -73,8 +73,10 @@ bool FName::NameManager::Inited; static const char *PredefinedNames[] = { #define xx(n) #n, +#define xy(n, s) s, #include "namedef.h" #undef xx +#undef xy }; // CODE -------------------------------------------------------------------- diff --git a/source/common/utility/name.h b/source/common/utility/name.h index 482e4f66f..de8984073 100644 --- a/source/common/utility/name.h +++ b/source/common/utility/name.h @@ -40,8 +40,10 @@ enum ENamedName { #define xx(n) NAME_##n, +#define xy(n, s) NAME_##n, #include "namedef.h" #undef xx +#undef xy }; class FString; diff --git a/source/core/cheats.cpp b/source/core/cheats.cpp index 16b56dd86..be05af107 100644 --- a/source/core/cheats.cpp +++ b/source/core/cheats.cpp @@ -252,11 +252,11 @@ void ChangeLevel(MapRecord* map, int skill) // //--------------------------------------------------------------------------- -void DeferedStartGame(MapRecord* map, int skill) +void DeferedStartGame(MapRecord* map, int skill, bool nostopsound) { g_nextmap = map; g_nextskill = skill; - gameaction = ga_newgame; + gameaction = nostopsound? ga_newgamenostopsound : ga_newgame; } //--------------------------------------------------------------------------- diff --git a/source/core/console/c_console.cpp b/source/core/console/c_console.cpp index 87f626de6..9a22a59d2 100644 --- a/source/core/console/c_console.cpp +++ b/source/core/console/c_console.cpp @@ -62,9 +62,12 @@ #include "v_video.h" #include "v_draw.h" #include "g_input.h" -#include "menu.h" +#include "razemenu.h" #include "raze_music.h" #include "gstrings.h" +#include "menustate.h" +#include "i_interface.h" +#include "vm.h" #define LEFTMARGIN 8 #define RIGHTMARGIN 8 @@ -108,6 +111,8 @@ constate_e ConsoleState = c_up; double NotifyFontScale = 1; +DEFINE_GLOBAL(NotifyFontScale) + void C_SetNotifyFontScale(double scale) { NotifyFontScale = scale; @@ -165,9 +170,6 @@ CVAR(Int, developer, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) EXTERN_CVAR(Int, uiscale); -CVAR(Bool, generic_ui, false, CVAR_ARCHIVE) - - struct History { struct History *Older; diff --git a/source/core/console/d_event.cpp b/source/core/console/d_event.cpp index 7ad95a489..2af44f0b8 100644 --- a/source/core/console/d_event.cpp +++ b/source/core/console/d_event.cpp @@ -38,7 +38,7 @@ #include "c_console.h" #include "d_gui.h" #include "inputstate.h" -#include "menu.h" +#include "razemenu.h" #include "gamestate.h" #include "gamecontrol.h" #include "uiinput.h" diff --git a/source/core/ct_chat.cpp b/source/core/ct_chat.cpp index 049178dd4..0cce9c3c5 100644 --- a/source/core/ct_chat.cpp +++ b/source/core/ct_chat.cpp @@ -36,9 +36,10 @@ #include "vm.h" #include "c_buttons.h" #include "v_draw.h" -#include "menu.h" +#include "razemenu.h" #include "gamestruct.h" #include "gamecvars.h" +#include "menustate.h" enum { diff --git a/source/core/d_net.cpp b/source/core/d_net.cpp index d719a479c..e159034b4 100644 --- a/source/core/d_net.cpp +++ b/source/core/d_net.cpp @@ -46,7 +46,7 @@ #include #include "version.h" -#include "menu.h" +#include "razemenu.h" #include "i_video.h" #include "c_console.h" #include "d_net.h" diff --git a/source/core/gamecontrol.cpp b/source/core/gamecontrol.cpp index 23cd4b0eb..05f8e1303 100644 --- a/source/core/gamecontrol.cpp +++ b/source/core/gamecontrol.cpp @@ -41,7 +41,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "i_specialpaths.h" #include "raze_music.h" #include "statistics.h" -#include "menu.h" +#include "razemenu.h" #include "gstrings.h" #include "quotemgr.h" #include "mapinfo.h" @@ -71,15 +71,20 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "uiinput.h" #include "d_net.h" #include "automap.h" +#include "v_draw.h" +#include "gi.h" CVAR(Bool, autoloadlights, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR(Bool, autoloadbrightmaps, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVARD(Bool, invertmousex, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "invert horizontal mouse movement") CVARD(Bool, invertmouse, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "invert vertical mouse movement") +EXTERN_CVAR(Bool, ui_generic) + CUSTOM_CVAR(String, language, "auto", CVAR_ARCHIVE | CVAR_NOINITCALL | CVAR_GLOBALCONFIG) { GStrings.UpdateLanguage(self); + UpdateGenericUI(ui_generic); } CUSTOM_CVAR(Int, mouse_capturemode, 1, CVAR_GLOBALCONFIG | CVAR_ARCHIVE) @@ -132,8 +137,6 @@ bool AppActive = true; FString currentGame; FString LumpFilter; -TMap NameToTileIndex; // for assigning names to tiles. The menu accesses this list. By default it gets everything from the dynamic tile map in Duke Nukem and Redneck Rampage. - // Todo: Add additional definition file for the other games or textures not in that list so that the menu does not have to rely on indices. CVAR(Bool, queryiwad, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG); CVAR(String, defaultiwad, "", CVAR_ARCHIVE | CVAR_GLOBALCONFIG); @@ -158,12 +161,6 @@ int StrTable_GetGender() bool validFilter(const char* str); -static StringtableCallbacks stblcb = -{ - validFilter, - StrTable_GetGender -}; - extern int chatmodeon; bool System_WantGuiCapture() @@ -465,7 +462,7 @@ namespace ShadowWarrior { ::GameInterface* CreateInterface(); } -namespace Powerslave +namespace Exhumed { ::GameInterface* CreateInterface(); } @@ -482,7 +479,7 @@ void CheckFrontend(int flags) } else if (flags & GAMEFLAG_PSEXHUMED) { - gi = Powerslave::CreateInterface(); + gi = Exhumed::CreateInterface(); } else { @@ -493,6 +490,8 @@ void CheckFrontend(int flags) void I_StartupJoysticks(); void I_ShutdownInput(); int RunGame(); +void System_MenuClosed(); +void System_MenuDim(); int GameMain() { @@ -512,9 +511,13 @@ int GameMain() nullptr, System_GetSceneRect, nullptr, - nullptr, + System_MenuDim, nullptr, System_DispatchEvent, + validFilter, + StrTable_GetGender, + System_MenuClosed, + nullptr }; try @@ -533,7 +536,7 @@ int GameMain() r = -1; } DeleteScreenJob(); - M_ClearMenus(true); + DeinitMenus(); if (gi) { gi->FreeGameData(); // Must be done before taking down any subsystems. @@ -551,7 +554,6 @@ int GameMain() TileFiles.CloseAll(); // delete the texture data before shutting down graphics. GLInterface.Deinit(); I_ShutdownGraphics(); - M_DeinitMenus(); engineUnInit(); if (gi) { @@ -745,6 +747,7 @@ static TArray SetupGame() currentGame = LumpFilter; currentGame.Truncate(currentGame.IndexOf(".")); CheckFrontend(g_gameType); + gameinfo.gametype = g_gameType; return usedgroups; } @@ -851,10 +854,10 @@ int RunGame() TexMan.Init([]() {}, [](BuildInfo &) {}); V_InitFonts(); TileFiles.Init(); - sfx_empty = fileSystem.FindFile("engine/dsempty.lmp"); // this must be done outside the sound code because it's initialized late. I_InitSound(); Mus_InitMusic(); S_ParseSndInfo(); + S_ParseReverbDef(); InitStatistics(); LoadScripts(); SetDefaultStrings(); @@ -870,8 +873,11 @@ int RunGame() if (exec) exec->ExecCommands(); SetupGameButtons(); + gameinfo.mBackButton = "engine/graphics/m_back.png"; gi->app_init(); + SetDefaultMenuColors(); M_Init(); + BuildGameMenus(); if (!(paletteloaded & PALETTE_MAIN)) I_FatalError("No palette found."); @@ -1791,3 +1797,70 @@ void playerProcessHelpers(fixed_t* q16ang, double* angAdjust, fixed_t* angTarget *q16horiz += FloatToFixed(scaleAdjust * *horizAdjust); } } + +bool M_Active() +{ + return CurrentMenu != nullptr || ConsoleState == c_down || ConsoleState == c_falling; +} + +struct gamefilter +{ + const char* gamename; + int gameflag; +}; + +static const gamefilter games[] = { + { "Duke", GAMEFLAG_DUKE}, + { "Nam", GAMEFLAG_NAM | GAMEFLAG_NAPALM}, + { "NamOnly", GAMEFLAG_NAM}, // for cases where the difference matters. + { "Napalm", GAMEFLAG_NAPALM}, + { "WW2GI", GAMEFLAG_WW2GI}, + { "Redneck", GAMEFLAG_RR}, + { "RedneckRides", GAMEFLAG_RRRA}, + { "Deer", GAMEFLAG_DEER}, + { "Blood", GAMEFLAG_BLOOD}, + { "ShadowWarrior", GAMEFLAG_SW}, + { "Exhumed", GAMEFLAG_POWERSLAVE | GAMEFLAG_EXHUMED}, + { "Plutopak", GAMEFLAG_PLUTOPAK}, + { "Worldtour", GAMEFLAG_WORLDTOUR}, + { "Shareware", GAMEFLAG_SHAREWARE}, +}; + +bool validFilter(const char* str) +{ + for (auto& gf : games) + { + if (g_gameType & gf.gameflag) + { + if (!stricmp(str, gf.gamename)) return true; + } + } + return false; +} + +#include "vm.h" + +DEFINE_ACTION_FUNCTION(_Screen, GetViewWindow) +{ + PARAM_PROLOGUE; + if (numret > 0) ret[0].SetInt(windowxy1.x); + if (numret > 1) ret[1].SetInt(windowxy1.y); + if (numret > 2) ret[2].SetInt(windowxy2.x - windowxy1.x + 1); + if (numret > 3) ret[3].SetInt(windowxy2.y - windowxy1.y + 1); + return MIN(numret, 4); +} + +DEFINE_ACTION_FUNCTION_NATIVE(_Build, ShadeToLight, shadeToLight) +{ + PARAM_PROLOGUE; + PARAM_INT(shade); + ACTION_RETURN_INT(shadeToLight(shade)); +} + +extern bool demoplayback; +DEFINE_GLOBAL(multiplayer) +DEFINE_GLOBAL(netgame) +DEFINE_GLOBAL(gameaction) +DEFINE_GLOBAL(gamestate) +DEFINE_GLOBAL(demoplayback) +DEFINE_GLOBAL(consoleplayer) diff --git a/source/core/gamecontrol.h b/source/core/gamecontrol.h index db8b0d09d..5a5bf85fa 100644 --- a/source/core/gamecontrol.h +++ b/source/core/gamecontrol.h @@ -22,15 +22,11 @@ extern cycle_t drawtime, actortime, thinktime, gameupdatetime; extern bool r_NoInterpolate; struct MapRecord; -struct FSaveGameNode; extern MapRecord* g_nextmap; -extern int g_nextskill; -extern FSaveGameNode* g_savenode; +extern int g_nextskill; extern FMemArena dump; // this is for memory blocks than cannot be deallocated without some huge effort. Put them in here so that they do not register on shutdown. -extern TMap NameToTileIndex; - int CONFIG_Init(); // I am not sure if anything below will survive for long... @@ -60,7 +56,7 @@ int GetAutomapZoom(int gZoom); void DrawCrosshair(int deftile, int health, double xdelta, double ydelta, double scale, PalEntry color = 0xffffffff); void updatePauseStatus(); -void DeferedStartGame(MapRecord* map, int skill); +void DeferedStartGame(MapRecord* map, int skill, bool nostopsound = false); void ChangeLevel(MapRecord* map, int skill); void CompleteLevel(MapRecord* map); diff --git a/source/core/gamestate.h b/source/core/gamestate.h index a18921542..8a601e86b 100644 --- a/source/core/gamestate.h +++ b/source/core/gamestate.h @@ -40,7 +40,9 @@ enum gameaction_t : int ga_savegame, // save the game ga_autosave, // autosave the game (for triggering a save from within the game.) ga_completed, // Level was exited. - ga_nextlevel // Actually start the next level. + ga_nextlevel, // Actually start the next level. + ga_loadgamehidecon, + ga_newgamenostopsound, // start a new game }; extern gamestate_t gamestate; extern gameaction_t gameaction; diff --git a/source/core/gamestruct.h b/source/core/gamestruct.h index f4c029f60..3808c8672 100644 --- a/source/core/gamestruct.h +++ b/source/core/gamestruct.h @@ -33,21 +33,6 @@ struct FSavegameInfo int currentsavever; }; -struct FSaveGameNode -{ - FString SaveTitle; - FString Filename; - bool bOldVersion = false; - bool bMissingWads = false; - bool bNoDelete = false; - bool bIsExt = false; - - bool isValid() const - { - return Filename.IsNotEmpty() && !bOldVersion && !bMissingWads; - } -}; - struct ReservedSpace { int top; @@ -71,7 +56,6 @@ struct GameInterface virtual void FreeGameData() {} virtual void PlayHudSound() {} virtual GameStats getStats() { return {}; } - virtual void DrawNativeMenuText(int fontnum, int state, double xpos, double ypos, float fontscale, const char* text, int flags) {} virtual void MainMenuOpened() {} virtual void MenuOpened() {} virtual void MenuClosed() {} @@ -80,12 +64,9 @@ struct GameInterface virtual void CustomMenuSelection(int menu, int item) {} virtual bool StartGame(FNewGameStartup& gs) { return false; } virtual FSavegameInfo GetSaveSig() { return { "", 0, 0}; } - virtual bool DrawSpecialScreen(const DVector2 &origin, int tilenum) { return false; } - virtual void DrawCenteredTextScreen(const DVector2& origin, const char* text, int position, bool withbg = true); virtual double SmallFontScale() { return 1; } - virtual void DrawMenuCaption(const DVector2& origin, const char* text) {} - virtual bool SaveGame(FSaveGameNode*) { return true; } - virtual bool LoadGame(FSaveGameNode*) { return true; } + virtual bool SaveGame() { return true; } + virtual bool LoadGame() { return true; } virtual void SerializeGameState(FSerializer& arc) {} virtual void DrawPlayerSprite(const DVector2& origin, bool onteam) {} virtual void QuitToTitle() {} diff --git a/source/core/gi.cpp b/source/core/gi.cpp new file mode 100644 index 000000000..abcf03e1e --- /dev/null +++ b/source/core/gi.cpp @@ -0,0 +1,52 @@ +/* +** gi.cpp +** Holds same game-dependant info +** +**--------------------------------------------------------------------------- +** 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 "gi.h" +#include "sc_man.h" +#include "filesystem.h" +#include "v_video.h" +#include "vm.h" +#include "c_cvars.h" + +gameinfo_t gameinfo; + +EXTERN_CVAR(Float, turbo) + + +DEFINE_GLOBAL(gameinfo) +DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, gametype) +DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mBackButton) +DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mSliderColor) + diff --git a/source/core/gi.h b/source/core/gi.h new file mode 100644 index 000000000..4a8c2622f --- /dev/null +++ b/source/core/gi.h @@ -0,0 +1,55 @@ +/* +** gi.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 __GI_H__ +#define __GI_H__ + +#include "basics.h" +#include "zstring.h" +#include "name.h" + + + +struct gameinfo_t +{ + int gametype; + FName mSliderColor; + FString mBackButton; +}; + + +extern gameinfo_t gameinfo; + +bool CheckGame(const char *string, bool chexisdoom); + +#endif //__GI_H__ diff --git a/source/core/initfs.cpp b/source/core/initfs.cpp index 33b04446f..f18fd50d3 100644 --- a/source/core/initfs.cpp +++ b/source/core/initfs.cpp @@ -376,6 +376,9 @@ void InitFileSystem(TArray& groups) LumpFilterInfo lfi; lfi.dotFilter = LumpFilter; + + if (g_gameType & (GAMEFLAG_DUKE | GAMEFLAG_NAM | GAMEFLAG_NAPALM | GAMEFLAG_WW2GI | GAMEFLAG_RRALL)) lfi.gameTypeFilter.Push("DukeEngine"); + lfi.postprocessFunc = [&]() { DeleteStuff(fileSystem, todelete, groups.Size()); diff --git a/source/core/mainloop.cpp b/source/core/mainloop.cpp index 20949aace..b7ed6f5f6 100644 --- a/source/core/mainloop.cpp +++ b/source/core/mainloop.cpp @@ -67,7 +67,7 @@ #include "d_net.h" #include "gamecontrol.h" #include "c_console.h" -#include "menu.h" +#include "razemenu.h" #include "i_system.h" #include "raze_sound.h" #include "raze_music.h" @@ -76,7 +76,6 @@ #include "screenjob.h" #include "mmulti.h" #include "c_console.h" -#include "menu.h" #include "uiinput.h" #include "v_video.h" #include "glbackend/glbackend.h" @@ -86,6 +85,8 @@ #include "mapinfo.h" #include "automap.h" #include "statusbar.h" +#include "gamestruct.h" +#include "savegamehelp.h" CVAR(Bool, vid_activeinbackground, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Bool, r_ticstability, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) @@ -103,7 +104,7 @@ int entertic; int oldentertics; int gametic; -extern FString BackupSaveGame; +FString BackupSaveGame; void DoLoadGame(const char* name); @@ -146,7 +147,9 @@ static void GameTicker() C_ClearMessages(); if (BackupSaveGame.IsNotEmpty() && cl_resumesavegame) { +#if 0 DoLoadGame(BackupSaveGame); +#endif } else { @@ -184,8 +187,9 @@ static void GameTicker() break; case ga_newgame: - newGameStarted = true; FX_StopAllSounds(); + case ga_newgamenostopsound: + newGameStarted = true; FX_SetReverb(0); gi->FreeLevelData(); C_ClearMessages(); @@ -206,7 +210,7 @@ static void GameTicker() case ga_mainmenunostopsound: gi->FreeLevelData(); gamestate = GS_MENUSCREEN; - M_StartControlPanel(false); + M_StartControlPanel(ga == ga_mainmenu); M_SetMenu(NAME_Mainmenu); break; @@ -339,12 +343,14 @@ void Display() } screen->FrameTime = I_msTimeFS(); + tileUpdateAnimations(); screen->BeginFrame(); twodpsp.Clear(); twodpsp.SetSize(screen->GetWidth(), screen->GetHeight()); twodpsp.ClearClipRect(); twod->Clear(); - twod->SetSize(screen->GetWidth(), screen->GetHeight()); + //twod->SetSize(screen->GetWidth(), screen->GetHeight()); + twod->Begin(screen->GetWidth(), screen->GetHeight()); twod->ClearClipRect(); switch (gamestate) { @@ -643,6 +649,7 @@ void MainLoop () Printf (PRINT_BOLD, "\n%s\n", error.GetMessage()); } gi->ErrorCleanup(); + M_ClearMenus(); C_FullConsole(); gameaction = ga_nothing; } @@ -651,6 +658,8 @@ void MainLoop () error.MaybePrintMessage(); Printf("%s", error.stacktrace.GetChars()); gi->ErrorCleanup(); + twod->SetOffset(DVector2(0, 0)); + M_ClearMenus(); C_FullConsole(); } } diff --git a/source/core/mapinfo.cpp b/source/core/mapinfo.cpp index eaea5cf0f..4ddee3b0c 100644 --- a/source/core/mapinfo.cpp +++ b/source/core/mapinfo.cpp @@ -38,6 +38,12 @@ #include "filesystem.h" #include "printf.h" +FString gSkillNames[MAXSKILLS]; +FString gVolumeNames[MAXVOLUMES]; +FString gVolumeSubtitles[MAXVOLUMES]; +int32_t gVolumeFlags[MAXVOLUMES]; +int gDefaultVolume = 0, gDefaultSkill = 1; + MapRecord mapList[512]; // Due to how this gets used it needs to be static. EDuke defines 7 episode plus one spare episode with 64 potential levels each and relies on the static array which is freely accessible by scripts. MapRecord *currentLevel; // level that is currently played. (The real level, not what script hacks modfifying the current level index can pretend.) MapRecord* lastLevel; // Same here, for the last level. diff --git a/source/core/mapinfo.h b/source/core/mapinfo.h index f9f1d1b70..9a1e0050d 100644 --- a/source/core/mapinfo.h +++ b/source/core/mapinfo.h @@ -7,6 +7,27 @@ #undef GetMessage // Windows strikes... #endif + +enum EMax +{ + MAXSKILLS = 7, + MAXVOLUMES = 7, + MAXMENUGAMEPLAYENTRIES = 7, +}; + +enum EVolFlags +{ + EF_HIDEFROMSP = 1, +}; + +// These get filled in by the map definition parsers of the front ends. +extern FString gSkillNames[MAXSKILLS]; +extern FString gVolumeNames[MAXVOLUMES]; +extern FString gVolumeSubtitles[MAXVOLUMES]; +extern int32_t gVolumeFlags[MAXVOLUMES]; +extern int gDefaultVolume, gDefaultSkill; + + // Localization capable replacement of the game specific solutions. inline void MakeStringLocalizable(FString "e) diff --git a/source/core/menu/imagescroller.cpp b/source/core/menu/imagescroller.cpp deleted file mode 100644 index 47bfa7ff9..000000000 --- a/source/core/menu/imagescroller.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/* -** imagescroller.cpp -** Scrolls through multiple fullscreen image pages, -** -**--------------------------------------------------------------------------- -** 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 "v_font.h" -#include "cmdlib.h" -#include "gstrings.h" -#include "d_gui.h" -#include "d_event.h" -#include "menu.h" -#include "v_draw.h" -#include "gamecontrol.h" -#include "build.h" -#include "zstring.h" - -//============================================================================= -// -// Fullscreen image drawer (move to its own source file!) -// -//============================================================================= - -void ImageScreen::Drawer() -{ - if (mDesc == nullptr) - { - // don't let bogus definitions crash this. - } - else if (mDesc->type == 0) - { - auto tileindexp = NameToTileIndex.CheckKey(FName(mDesc->text, true)); - int tileindex = 0; - if (tileindexp == nullptr) - { - // If this isn't a name, try a literal tile index; - auto c = mDesc->text.GetChars(); - if (*c == '#') tileindex = (int)strtoll(c + 1, nullptr, 0); - // Error out if the screen cannot be found, this is always a definition error that needs to be reported. - else I_Error("Invalid menu screen '%s'", mDesc->text.GetChars()); - } - else tileindex = *tileindexp; - if (!gi->DrawSpecialScreen(origin, tileindex)) // allows the front end to do custom handling for a given image. - { - DrawTexture(twod, tileGetTexture(tileindex), origin.X, origin.Y, DTA_FullscreenScale, FSMode_Fit320x200, DTA_TopLeft, true, DTA_LegacyRenderStyle, STYLE_Normal, TAG_DONE); - } - } - else if (mDesc->type > 0) - { - gi->DrawCenteredTextScreen(origin, mDesc->text, mDesc->type); - } - // QAVs are handled in the Blood frontend. Maybe they should be moved out? Stuff for later, but this is a feature where it is feasible. -} - -ImageScreen* DImageScrollerMenu::newImageScreen(FImageScrollerDescriptor::ScrollerItem* desc) -{ - return new ImageScreen(desc); -} - -void DImageScrollerMenu::Init(DMenu* parent, FImageScrollerDescriptor* desc) -{ - mParentMenu = parent; - index = 0; - mDesc = desc; - canAnimate = !!(mDesc->mFlags & LMF_Animate); - - mCurrent = newImageScreen(&mDesc->mItems[0]); - mCurrent->canAnimate = canAnimate; - isAnimated = true; -} - -bool DImageScrollerMenu::MenuEvent(int mkey, bool fromcontroller) -{ - if (mDesc->mItems.Size() <= 1) - { - if (mkey == MKEY_Enter) mkey = MKEY_Back; - else if (mkey == MKEY_Right || mkey == MKEY_Left) return true; - } - switch (mkey) - { - case MKEY_Back: - // Before going back the currently running transition must be terminated. - pageTransition.previous = nullptr; - if (pageTransition.current) pageTransition.current->origin = { 0,0 }; - return DMenu::MenuEvent(mkey, fromcontroller); - - - case MKEY_Left: - if (pageTransition.previous == nullptr) - { - if (--index < 0) index = mDesc->mItems.Size() - 1; - auto next = newImageScreen(&mDesc->mItems[index]); - next->canAnimate = canAnimate; - if (!pageTransition.StartTransition(mCurrent, next, MA_Return)) - { - delete mCurrent; - } - mCurrent = next; - gi->MenuSound(ChooseSound); - } - return true; - - case MKEY_Right: - case MKEY_Enter: - if (pageTransition.previous == nullptr) - { - int oldindex = index; - if (++index >= (int)mDesc->mItems.Size()) index = 0; - - auto next = newImageScreen(&mDesc->mItems[index]); - next->canAnimate = canAnimate; - if (!pageTransition.StartTransition(mCurrent, next, MA_Advance)) - { - delete mCurrent; - } - mCurrent = next; - gi->MenuSound(ChooseSound); - } - return true; - - default: - return DMenu::MenuEvent(mkey, fromcontroller); - } -} - -bool DImageScrollerMenu::MouseEvent(int type, int x, int y) -{ - // Todo: Implement some form of drag event to switch between pages. - if (type == MOUSE_Release) - { - return MenuEvent(MKEY_Enter, false); - } - - return DMenu::MouseEvent(type, x, y); -} - -void DImageScrollerMenu::Ticker() -{ -} - -void DImageScrollerMenu::Drawer() -{ - if (pageTransition.previous != nullptr) - { - auto res = pageTransition.Draw(); - if (res) return; - delete pageTransition.previous; - pageTransition.previous = nullptr; - } - mCurrent->origin = origin; - mCurrent->Drawer(); - mCurrent->origin = {}; -} - diff --git a/source/core/menu/joystickmenu.cpp b/source/core/menu/joystickmenu.cpp deleted file mode 100644 index 0c3163f53..000000000 --- a/source/core/menu/joystickmenu.cpp +++ /dev/null @@ -1,434 +0,0 @@ -/* -** joystickmenu.cpp -** The joystick configuration menus -** -**--------------------------------------------------------------------------- -** Copyright 2010 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 "menu.h" -#include "c_dispatch.h" -#include "filesystem.h" -#include "sc_man.h" -#include "v_font.h" -#include "c_bind.h" -#include "d_event.h" -#include "d_gui.h" -#include "m_joy.h" -#include "v_video.h" - -#define NO_IMP -#include "optionmenuitems.h" - - -static TArray Joysticks; -IJoystickConfig *SELECTED_JOYSTICK; - -FOptionMenuDescriptor *UpdateJoystickConfigMenu(IJoystickConfig *joy); - -//============================================================================= -// -// -// -//============================================================================= - -class FOptionMenuSliderJoySensitivity : public FOptionMenuSliderBase -{ -public: - FOptionMenuSliderJoySensitivity(const char *label, double min, double max, double step, int showval) - : FOptionMenuSliderBase(label, min, max, step, showval) - { - } - - double GetSliderValue() - { - return SELECTED_JOYSTICK->GetSensitivity(); - } - - void SetSliderValue(double val) - { - SELECTED_JOYSTICK->SetSensitivity(float(val)); - } -}; - -//============================================================================= -// -// -// -//============================================================================= - -class FOptionMenuSliderJoyScale : public FOptionMenuSliderBase -{ - int mAxis; - int mNeg; - -public: - FOptionMenuSliderJoyScale(const char *label, int axis, double min, double max, double step, int showval) - : FOptionMenuSliderBase(label, min, max, step, showval) - { - mAxis = axis; - mNeg = 1; - } - - double GetSliderValue() - { - double d = SELECTED_JOYSTICK->GetAxisScale(mAxis); - mNeg = d < 0? -1:1; - return d; - } - - void SetSliderValue(double val) - { - SELECTED_JOYSTICK->SetAxisScale(mAxis, float(val * mNeg)); - } -}; - -//============================================================================= -// -// -// -//============================================================================= - -class FOptionMenuSliderJoyDeadZone : public FOptionMenuSliderBase -{ - int mAxis; - int mNeg; - -public: - FOptionMenuSliderJoyDeadZone(const char *label, int axis, double min, double max, double step, int showval) - : FOptionMenuSliderBase(label, min, max, step, showval) - { - mAxis = axis; - mNeg = 1; - } - - double GetSliderValue() - { - double d = SELECTED_JOYSTICK->GetAxisDeadZone(mAxis); - mNeg = d < 0? -1:1; - return d; - } - - void SetSliderValue(double val) - { - SELECTED_JOYSTICK->SetAxisDeadZone(mAxis, float(val * mNeg)); - } -}; - -//============================================================================= -// -// -// -//============================================================================= - -class FOptionMenuItemJoyMap : public FOptionMenuItemOptionBase -{ - int mAxis; -public: - - FOptionMenuItemJoyMap(const char *label, int axis, const char *values, int center) - : FOptionMenuItemOptionBase(label, "none", values, NULL, center) - { - mAxis = axis; - } - - int GetSelection() - { - double f = SELECTED_JOYSTICK->GetAxisMap(mAxis); - FOptionValues **opt = OptionValues.CheckKey(mValues); - if (opt != NULL && *opt != NULL) - { - // Map from joystick axis to menu selection. - for(unsigned i = 0; i < (*opt)->mValues.Size(); i++) - { - if (fabs(f - (*opt)->mValues[i].Value) < FLT_EPSILON) - { - return i; - } - } - } - return -1; - } - - void SetSelection(int selection) - { - FOptionValues **opt = OptionValues.CheckKey(mValues); - // Map from menu selection to joystick axis. - if (opt == NULL || *opt == NULL || (unsigned)selection >= (*opt)->mValues.Size()) - { - selection = JOYAXIS_None; - } - else - { - selection = (int)(*opt)->mValues[selection].Value; - } - SELECTED_JOYSTICK->SetAxisMap(mAxis, (EJoyAxis)selection); - } -}; - -//============================================================================= -// -// -// -//============================================================================= - -class FOptionMenuItemInverter : public FOptionMenuItemOptionBase -{ - int mAxis; -public: - - FOptionMenuItemInverter(const char *label, int axis, int center) - : FOptionMenuItemOptionBase(label, "none", "YesNo", NULL, center) - { - mAxis = axis; - } - - int GetSelection() - { - float f = SELECTED_JOYSTICK->GetAxisScale(mAxis); - return f > 0? 0:1; - } - - void SetSelection(int Selection) - { - float f = fabs(SELECTED_JOYSTICK->GetAxisScale(mAxis)); - if (Selection) f*=-1; - SELECTED_JOYSTICK->SetAxisScale(mAxis, f); - } -}; - -class DJoystickConfigMenu : public DOptionMenu -{ -}; - - -//============================================================================= -// -// Executes a CCMD, action is a CCMD name -// -//============================================================================= - -class FOptionMenuItemJoyConfigMenu : public FOptionMenuItemSubmenu -{ - IJoystickConfig *mJoy; -public: - FOptionMenuItemJoyConfigMenu(const char *label, IJoystickConfig *joy) - : FOptionMenuItemSubmenu(label, "JoystickConfigMenu") - { - mJoy = joy; - } - - bool Activate(FName caller) override - { - UpdateJoystickConfigMenu(mJoy); - return FOptionMenuItemSubmenu::Activate(caller); - } -}; - - -/*======================================= - * - * Joystick Menu - * - *=======================================*/ - -FOptionMenuDescriptor *UpdateJoystickConfigMenu(IJoystickConfig *joy) -{ - FMenuDescriptor **desc = MenuDescriptors.CheckKey(NAME_JoystickConfigMenu); - if (desc != NULL && (*desc)->mType == MDESC_OptionsMenu) - { - FOptionMenuDescriptor *opt = (FOptionMenuDescriptor *)*desc; - FOptionMenuItem *it; - for(unsigned i=0;imItems.Size();i++) - { - delete opt->mItems[i]; - opt->mItems.Clear(); - } - if (joy == NULL) - { - opt->mTitle = "$JOYMNU_TITLE"; - it = new FOptionMenuItemStaticText("$JOYMNU_INVALID"); - opt->mItems.Push(it); - } - else - { - opt->mTitle.Format("%s", joy->GetName().GetChars()); - - SELECTED_JOYSTICK = joy; - - it = new FOptionMenuSliderJoySensitivity("$JOYMNU_OVRSENS", 0, 2, 0.1, 3); - opt->mItems.Push(it); - it = new FOptionMenuItemStaticText(" "); - opt->mItems.Push(it); - - if (joy->GetNumAxes() > 0) - { - it = new FOptionMenuItemStaticText("$JOYMNU_AXIS"); - opt->mItems.Push(it); - - for (int i = 0; i < joy->GetNumAxes(); ++i) - { - it = new FOptionMenuItemStaticText(" "); - opt->mItems.Push(it); - - it = new FOptionMenuItemJoyMap(joy->GetAxisName(i), i, "JoyAxisMapNames", false); - opt->mItems.Push(it); - it = new FOptionMenuSliderJoyScale("$JOYMNU_OVRSENS", i, 0, 4, 0.1, 3); - opt->mItems.Push(it); - it = new FOptionMenuItemInverter("$JOYMNU_INVERT", i, false); - opt->mItems.Push(it); - it = new FOptionMenuSliderJoyDeadZone("$JOYMNU_DEADZONE", i, 0, 0.9, 0.05, 3); - opt->mItems.Push(it); - } - } - else - { - it = new FOptionMenuItemStaticText("$JOYMNU_NOAXES"); - opt->mItems.Push(it); - } - } - opt->mScrollPos = 0; - opt->mSelectedItem = -1; - opt->mIndent = 0; - opt->CalcIndent(); - return opt; - } - return NULL; -} - - - -void UpdateJoystickMenu(IJoystickConfig *selected) -{ - FMenuDescriptor **desc = MenuDescriptors.CheckKey(NAME_JoystickOptions); - if (desc != NULL && (*desc)->mType == MDESC_OptionsMenu) - { - FOptionMenuDescriptor *opt = (FOptionMenuDescriptor *)*desc; - FOptionMenuItem *it; - - for(unsigned i=0;imItems.Size();i++) - { - delete opt->mItems[i]; - } - opt->mItems.Clear(); - - int i; - int itemnum = -1; - - I_GetJoysticks(Joysticks); - if ((unsigned)itemnum >= Joysticks.Size()) - { - itemnum = Joysticks.Size() - 1; - } - if (selected != NULL) - { - for (i = 0; (unsigned)i < Joysticks.Size(); ++i) - { - if (Joysticks[i] == selected) - { - itemnum = i; - break; - } - } - } - - // Todo: Block joystick for changing this one. - it = new FOptionMenuItemOption("$JOYMNU_ENABLE", "use_joystick", "YesNo", NULL, false); - opt->mItems.Push(it); - #if 0//def _WIN32 - it = new FOptionMenuItemOption("Enable DirectInput controllers", "joy_dinput", "YesNo", NULL, false); - opt->mItems.Push(it); - it = new FOptionMenuItemOption("Enable XInput controllers", "joy_xinput", "YesNo", NULL, false); - opt->mItems.Push(it); - it = new FOptionMenuItemOption("Enable raw PlayStation 2 adapters", "joy_ps2raw", "YesNo", NULL, false); - opt->mItems.Push(it); - #endif - - it = new FOptionMenuItemStaticText(" "); - opt->mItems.Push(it); - - if (Joysticks.Size() == 0) - { - it = new FOptionMenuItemStaticText("$JOYMNU_NOCON"); - opt->mItems.Push(it); - if (!use_joystick) - { - it = new FOptionMenuItemStaticText("$JOYMNU_DISABLED1"); - opt->mItems.Push(it); - it = new FOptionMenuItemStaticText("$JOYMNU_DISABLED2"); - opt->mItems.Push(it); - } - } - else - { - it = new FOptionMenuItemStaticText("$JOYMNU_CONFIG"); - opt->mItems.Push(it); - - for (int i = 0; i < (int)Joysticks.Size(); ++i) - { - it = new FOptionMenuItemJoyConfigMenu(Joysticks[i]->GetName(), Joysticks[i]); - opt->mItems.Push(it); - if (i == itemnum) opt->mSelectedItem = opt->mItems.Size(); - } - } - if (opt->mSelectedItem >= (int)opt->mItems.Size()) - { - opt->mSelectedItem = opt->mItems.Size() - 1; - } - - opt->CalcIndent(); - - // If the joystick config menu is open, close it if the device it's - // open for is gone. - for (i = 0; (unsigned)i < Joysticks.Size(); ++i) - { - if (Joysticks[i] == SELECTED_JOYSTICK) - { - break; - } - } - if (i == (int)Joysticks.Size()) - { - SELECTED_JOYSTICK = NULL; - if (CurrentMenu != NULL && dynamic_cast(CurrentMenu)) - { - CurrentMenu->Close(); - } - } - } -} - -static TMenuClassDescriptor _im("JoystickConfigMenu"); - -void RegisterJoystickMenus() -{ - menuClasses.Push(&_im); -} diff --git a/source/core/menu/listmenu.cpp b/source/core/menu/listmenu.cpp deleted file mode 100644 index 0fb79dfbd..000000000 --- a/source/core/menu/listmenu.cpp +++ /dev/null @@ -1,634 +0,0 @@ -/* -** listmenu.cpp -** A simple menu consisting of a list of items -** -**--------------------------------------------------------------------------- -** Copyright 2010 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 "cmdlib.h" -#include "gstrings.h" -#include "d_gui.h" -#include "d_event.h" -#include "menu.h" -#include "v_draw.h" -#include "gamecontrol.h" -#include "build.h" -#include "v_video.h" - -//============================================================================= -// -// -// -//============================================================================= - -DListMenu::DListMenu(DMenu *parent, FListMenuDescriptor *desc) -: DMenu(parent) -{ - mDesc = NULL; - if (desc != NULL) Init(parent, desc); -} - -//============================================================================= -// -// -// -//============================================================================= - -void DListMenu::Init(DMenu *parent, FListMenuDescriptor *desc) -{ - mParentMenu = parent; - mDesc = desc; - canAnimate = !!(mDesc->mFlags & LMF_Animate); - if (mDesc->mScriptId >= 0) scriptID = mDesc->mScriptId; -#if 0 - if (desc->mCenter) - { - int center = 160; - for(unsigned i=0;imItems.Size(); i++) - { - int xpos = mDesc->mItems[i]->GetX(); - int width = mDesc->mItems[i]->GetWidth(); - int curx = mDesc->mSelectOfsX; - - if (width > 0 && mDesc->mItems[i]->Selectable()) - { - int left = 160 - (width - curx) / 2 - curx; - if (left < center) center = left; - } - } - for(unsigned i=0;imItems.Size(); i++) - { - int width = mDesc->mItems[i]->GetWidth(); - - if (width > 0) - { - mDesc->mItems[i]->SetX(center); - } - } - } -#endif -} - -//============================================================================= -// -// -// -//============================================================================= - -FListMenuItem *DListMenu::GetItem(FName name) -{ - for(unsigned i=0;imItems.Size(); i++) - { - FName nm = mDesc->mItems[i]->GetAction(NULL); - if (nm == name) return mDesc->mItems[i]; - } - return NULL; -} - -//============================================================================= -// -// -// -//============================================================================= - -bool DListMenu::Responder (event_t *ev) -{ - if (ev->type == EV_GUI_Event) - { - if (ev->subtype == EV_GUI_KeyDown) - { - int ch = tolower (ev->data1); - - for(unsigned i = mDesc->mSelectedItem + 1; i < mDesc->mItems.Size(); i++) - { - if (mDesc->mItems[i]->CheckHotkey(ch)) - { - mDesc->mSelectedItem = i; - SelectionChanged(); - M_MenuSound(CursorSound); - return true; - } - } - for(int i = 0; i < mDesc->mSelectedItem; i++) - { - if (mDesc->mItems[i]->CheckHotkey(ch)) - { - mDesc->mSelectedItem = i; - SelectionChanged(); - M_MenuSound(CursorSound); - return true; - } - } - } - } - return Super::Responder(ev); -} - -//============================================================================= -// -// -// -//============================================================================= - -bool DListMenu::MenuEvent (int mkey, bool fromcontroller) -{ - int startedAt = mDesc->mSelectedItem; - - switch (mkey) - { - case MKEY_Up: - do - { - if (--mDesc->mSelectedItem < 0) mDesc->mSelectedItem = mDesc->mItems.Size()-1; - } - while (!mDesc->mItems[mDesc->mSelectedItem]->Selectable() && mDesc->mSelectedItem != startedAt); - SelectionChanged(); - M_MenuSound(CursorSound); - return true; - - case MKEY_Down: - do - { - if (++mDesc->mSelectedItem >= (int)mDesc->mItems.Size()) mDesc->mSelectedItem = 0; - } - while (!mDesc->mItems[mDesc->mSelectedItem]->Selectable() && mDesc->mSelectedItem != startedAt); - SelectionChanged(); - M_MenuSound(CursorSound); - return true; - - case MKEY_Enter: - if (mDesc->mSelectedItem >= 0 && mDesc->mItems[mDesc->mSelectedItem]->Activate(mDesc->mMenuName)) - { - M_MenuSound(AdvanceSound); - } - return true; - - default: - return Super::MenuEvent(mkey, fromcontroller); - } -} - -//============================================================================= -// -// -// -//============================================================================= - -bool DListMenu::MouseEvent(int type, int xx, int yy) -{ - int sel = -1; - - // convert x/y from screen to virtual coordinates, according to CleanX/Yfac use in DrawTexture - //x = ((x - (screen->GetWidth() / 2)) / CleanXfac) + 160; - //y = ((y - (screen->GetHeight() / 2)) / CleanYfac) + 100; - - - int width43 = (screen->GetHeight() * 4 / 3); - int x = (xx - (screen->GetWidth() - width43) / 2) * 320 / width43; - int y = yy * 200 / screen->GetHeight(); - - if (mFocusControl != NULL) - { - mFocusControl->MouseEvent(type, x, y); - return true; - } - else - { - if ((mDesc->mWLeft <= 0 || x > mDesc->mWLeft) && - (mDesc->mWRight <= 0 || x < mDesc->mWRight)) - { - for(unsigned i=0;imItems.Size(); i++) - { - if (mDesc->mItems[i]->CheckCoordinate(x, y)) - { - if ((int)i != mDesc->mSelectedItem) - { - // no sound. This is too noisy. - } - mDesc->mSelectedItem = i; - SelectionChanged(); - mDesc->mItems[i]->MouseEvent(type, x, y); - return true; - } - } - } - } - mDesc->mSelectedItem = -1; - return Super::MouseEvent(type, x, y); -} - -//============================================================================= -// -// -// -//============================================================================= - -void DListMenu::Ticker () -{ - Super::Ticker(); - for(unsigned i=0;imItems.Size(); i++) - { - mDesc->mItems[i]->Ticker(); - } -} - -//============================================================================= -// -// -// -//============================================================================= - -void DListMenu::PreDraw() -{ - if (mDesc->mCaption.IsNotEmpty()) - { - gi->DrawMenuCaption(origin, GStrings.localize(mDesc->mCaption)); - } -} - -void DListMenu::Drawer () -{ - PreDraw(); - for(unsigned i=0;imItems.Size(); i++) - { - mDesc->mItems[i]->Drawer(this, origin, mDesc->mSelectedItem == (int)i); - } - if (mDesc->mSelectedItem >= 0 && mDesc->mSelectedItem < (int)mDesc->mItems.Size()) - mDesc->mItems[mDesc->mSelectedItem]->DrawSelector(mDesc->mSelectOfsX, mDesc->mSelectOfsY, mDesc->mSelector); - PostDraw(); - Super::Drawer(); -} - -//============================================================================= -// -// base class for menu items -// -//============================================================================= - -FListMenuItem::~FListMenuItem() -{ -} - -bool FListMenuItem::CheckCoordinate(int x, int y) -{ - return false; -} - -void FListMenuItem::Ticker() -{ -} - -void FListMenuItem::Drawer(DListMenu* menu, const DVector2& origin, bool selected) -{ -} - -bool FListMenuItem::Selectable() -{ - return false; -} - -void FListMenuItem::DrawSelector(int xofs, int yofs, FGameTexture *tex) -{ - if (tex) - { - DrawTexture (twod, tex, mXpos + xofs, mYpos + yofs, DTA_Clean, true, TAG_DONE); - } -} - -bool FListMenuItem::Activate(FName) -{ - return false; // cannot be activated -} - -FName FListMenuItem::GetAction(int *pparam) -{ - return mAction; -} - -bool FListMenuItem::SetString(int i, const char *s) -{ - return false; -} - -bool FListMenuItem::GetString(int i, char *s, int len) -{ - return false; -} - -bool FListMenuItem::SetValue(int i, int value) -{ - return false; -} - -bool FListMenuItem::GetValue(int i, int *pvalue) -{ - return false; -} - -void FListMenuItem::Enable(bool on) -{ - mEnabled = on; -} - -bool FListMenuItem::MenuEvent(int mkey, bool fromcontroller) -{ - return false; -} - -bool FListMenuItem::MouseEvent(int type, int x, int y) -{ - return false; -} - -bool FListMenuItem::CheckHotkey(int c) -{ - return false; -} - -int FListMenuItem::GetWidth() -{ - return 0; -} - - -//============================================================================= -// -// static patch -// -//============================================================================= - -FListMenuItemStaticPatch::FListMenuItemStaticPatch(int x, int y, FGameTexture *patch, bool centered) -: FListMenuItem(x, y) -{ - mTexture = patch; - mCentered = centered; -} - -void FListMenuItemStaticPatch::Drawer(DListMenu* menu, const DVector2& origin, bool selected) -{ - if (!mTexture) - { - return; - } - - int x = mXpos; - FGameTexture *tex = mTexture; - if (mYpos >= 0) - { - if (mCentered) x -= tex->GetDisplayWidth()/2; - DrawTexture (twod, tex, x, mYpos, DTA_Clean, true, TAG_DONE); - } - else - { - int x = (mXpos - 160) * CleanXfac + (screen->GetWidth()>>1); - if (mCentered) x -= (tex->GetDisplayWidth()*CleanXfac)/2; - DrawTexture (twod, tex, x, -mYpos*CleanYfac, DTA_CleanNoMove, true, TAG_DONE); - } -} - -//============================================================================= -// -// static text -// -//============================================================================= - -FListMenuItemStaticText::FListMenuItemStaticText(int x, int y, const char *text, FFont *font, EColorRange color, bool centered) -: FListMenuItem(x, y) -{ - mText = text; - mFont = font; - mColor = color; - mCentered = centered; -} - -void FListMenuItemStaticText::Drawer(DListMenu* menu, const DVector2& origin, bool selected) -{ - const char *text = mText; - if (text != NULL) - { - if (mYpos >= 0) - { - int x = mXpos; - if (mCentered) x -= mFont->StringWidth(text)/2; - DrawText(twod, mFont, mColor, x, mYpos, text, DTA_Clean, true, TAG_DONE); - } - else - { - int x = (mXpos - 160) * CleanXfac + (screen->GetWidth()>>1); - if (mCentered) x -= (mFont->StringWidth(text)*CleanXfac)/2; - DrawText (twod, mFont, mColor, x, -mYpos*CleanYfac, text, DTA_CleanNoMove, true, TAG_DONE); - } - } -} - -FListMenuItemStaticText::~FListMenuItemStaticText() -{ - if (mText != NULL) delete [] mText; -} - -//============================================================================= -// -// native static text item -// -//============================================================================= - -FListMenuItemNativeStaticText::FListMenuItemNativeStaticText(int x, int y, const FString& text, int fontnum, int palnum, bool centered) - : FListMenuItem(x, y) -{ - mText = text; - mFontnum = fontnum; - mPalnum = palnum; - mCentered = centered; -} - -void FListMenuItemNativeStaticText::Drawer(DListMenu* menu, const DVector2& origin, bool selected) -{ - const char* text = mText; - if (mText.Len() && !mHidden) - { - gi->DrawNativeMenuText(mFontnum, mPalnum, origin.X + mXpos, origin.Y + mYpos, 1.f, GStrings.localize(text), menu->Descriptor()->mFlags); - } -} - -//============================================================================= -// -// base class for selectable items -// -//============================================================================= - -FListMenuItemSelectable::FListMenuItemSelectable(int x, int y, int height, FName action, int param) -: FListMenuItem(x, y, action) -{ - mHeight = height; - mParam = param; - mHotkey = 0; -} - -bool FListMenuItemSelectable::CheckCoordinate(int x, int y) -{ - return mEnabled && y >= mYpos && y < mYpos + mHeight; // no x check here -} - -bool FListMenuItemSelectable::Selectable() -{ - return mEnabled && !mHidden; -} - -bool FListMenuItemSelectable::Activate(FName caller) -{ - return M_SetMenu(mAction, mParam, caller); -} - -FName FListMenuItemSelectable::GetAction(int *pparam) -{ - if (pparam != NULL) *pparam = mParam; - return mAction; -} - -bool FListMenuItemSelectable::CheckHotkey(int c) -{ - return c == tolower(mHotkey); -} - -bool FListMenuItemSelectable::MouseEvent(int type, int x, int y) -{ - if (type == DMenu::MOUSE_Release) - { - if (NULL != CurrentMenu && CurrentMenu->MenuEvent(MKEY_Enter, true)) - { - return true; - } - } - return false; -} - -//============================================================================= -// -// text item -// -//============================================================================= - -FListMenuItemText::FListMenuItemText(int x, int y, int height, int hotkey, const FString &text, FFont *font, EColorRange color, EColorRange color2, FName child, int param) -: FListMenuItemSelectable(x, y, height, child, param) -{ - mText = text; - mFont = font; - mColor = color; - mColorSelected = color2; - mFont = NewSmallFont; - mHotkey = hotkey; -} - -FListMenuItemText::~FListMenuItemText() -{ -} - -void FListMenuItemText::Drawer(DListMenu* menu, const DVector2& origin, bool selected) -{ - const char *text = GStrings(mText); - if (mText.Len()) - { - DrawText(twod, mFont, selected ? mColorSelected : mColor, mXpos - mFont->StringWidth(text)/2, mYpos, text, DTA_Clean, true, TAG_DONE); - } -} - -int FListMenuItemText::GetWidth() -{ - const char *text = mText; - if (mText.Len()) - { - return mFont->StringWidth(GStrings.localize(text)); - } - return 1; -} - - -//============================================================================= -// -// native text item -// -//============================================================================= - -FListMenuItemNativeText::FListMenuItemNativeText(int x, int y, int height, int hotkey, const FString& text, int fontnum, int palnum, float fontscale, FName child, int param) - : FListMenuItemSelectable(x, y, height, child, param) -{ - mText = text; - mFontnum = NIT_BigFont; - mPalnum = NIT_ActiveColor; - mFontscale = fontscale; - mHotkey = hotkey; -} - -FListMenuItemNativeText::~FListMenuItemNativeText() -{ -} - -void FListMenuItemNativeText::Drawer(DListMenu* menu, const DVector2& origin, bool selected) -{ - const char* text = mText; - if (mText.Len() && !mHidden) - { - auto state = selected ? NIT_SelectedState : mEnabled ? NIT_ActiveState : NIT_InactiveState; - gi->DrawNativeMenuText(mFontnum, state, origin.X + mXpos, origin.Y + mYpos, 1.f, GStrings.localize(text), menu->Descriptor()->mFlags); - } -} - -int FListMenuItemNativeText::GetWidth() -{ - return 1; -} - - -//============================================================================= -// -// patch item -// -//============================================================================= - -FListMenuItemPatch::FListMenuItemPatch(int x, int y, int height, int hotkey, FGameTexture *patch, FName child, int param) -: FListMenuItemSelectable(x, y, height, child, param) -{ - mHotkey = hotkey; - mTexture = patch; -} - -void FListMenuItemPatch::Drawer(DListMenu* menu, const DVector2& origin, bool selected) -{ - DrawTexture (twod, mTexture, mXpos, mYpos, DTA_Clean, true, TAG_DONE); -} - -int FListMenuItemPatch::GetWidth() -{ - return mTexture - ? mTexture->GetDisplayWidth() - : 0; -} - diff --git a/source/core/menu/loadsavemenu.cpp b/source/core/menu/loadsavemenu.cpp index 944b928ea..8e3a025c0 100644 --- a/source/core/menu/loadsavemenu.cpp +++ b/source/core/menu/loadsavemenu.cpp @@ -4,7 +4,7 @@ ** **--------------------------------------------------------------------------- ** Copyright 2001-2010 Randy Heit -** Copyright 2010 Christoph Oelckers +** Copyright 2010-2020 Christoph Oelckers ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without @@ -33,612 +33,124 @@ ** */ -#include "menu.h" +#include "razemenu.h" #include "version.h" #include "m_png.h" #include "filesystem.h" #include "v_text.h" -#include "d_event.h" #include "gstrings.h" -#include "d_gui.h" -#include "v_draw.h" -#include "files.h" -#include "resourcefile.h" -#include "savegamehelp.h" -#include "i_specialpaths.h" -#include "findfile.h" +#include "serializer.h" +#include "vm.h" +#include "i_system.h" #include "v_video.h" +#include "findfile.h" +#include "v_draw.h" +#include "savegamehelp.h" +//============================================================================= +// +// M_ReadSaveStrings +// +// Find savegames and read their titles +// +//============================================================================= - -class DLoadSaveMenu : public DListMenu +void FSavegameManager::ReadSaveStrings() { - using Super = DListMenu; - -protected: - - int Selected = 0; - int TopItem = 0; - - - int savepicLeft; - int savepicTop; - int savepicWidth; - int savepicHeight; - - int rowHeight; - int listboxLeft; - int listboxTop; - int listboxWidth; - - int listboxRows; - int listboxHeight; - int listboxRight; - int listboxBottom; - - int commentLeft; - int commentTop; - int commentWidth; - int commentHeight; - int commentRight; - int commentBottom; - int commentRows; - - double FontScale; - DTextEnterMenu *mInput = nullptr; - TArray BrokenSaveComment; - bool mEntering = false; - - - //============================================================================= - // - // End of static savegame maintenance code - // - //============================================================================= - - DLoadSaveMenu() + if (SaveGames.Size() == 0) { - savegameManager.ReadSaveStrings(); - } + void *filefirst; + findstate_t c_file; + FString filter; - void Init(DMenu* parent, FListMenuDescriptor* desc) override - { - Super::Init(parent, desc); - int Width43 = screen->GetHeight() * 4 / 3; - int Left43 = (screen->GetWidth() - Width43) / 2; - float wScale = Width43 / 640.; - savepicLeft = Left43 + int(20 * wScale); - savepicTop = mDesc->mYpos * screen->GetHeight() / 200 ; - savepicWidth = int(240 * wScale); - savepicHeight = int(180 * wScale); - - - FontScale = std::max(screen->GetHeight() / 480, 1); - rowHeight = std::max(int((NewConsoleFont->GetHeight() + 1) * FontScale), 1); - listboxLeft = savepicLeft + savepicWidth + int(20 * wScale); - listboxTop = savepicTop; - listboxWidth = Width43 + Left43 - listboxLeft - int(30 * wScale); - int listboxHeight1 = screen->GetHeight() - listboxTop - int(20*wScale); - listboxRows = (listboxHeight1 - 1) / rowHeight; - listboxHeight = listboxRows * rowHeight + 1; - listboxRight = listboxLeft + listboxWidth; - listboxBottom = listboxTop + listboxHeight; - - commentLeft = savepicLeft; - commentTop = savepicTop + savepicHeight + int(16 * wScale); - commentWidth = savepicWidth; - commentHeight = listboxHeight - savepicHeight - (16 * wScale); - commentRight = commentLeft + commentWidth; - commentBottom = commentTop + commentHeight; - commentRows = commentHeight / rowHeight; - UpdateSaveComment(); - } - - //============================================================================= - // - // - // - //============================================================================= - - void Drawer() override - { - Super::Drawer(); - - int i; - unsigned j; - bool didSeeSelected = false; - - // Draw picture area - /* - if (gameaction == ga_loadgame || gameaction == ga_loadgamehidecon || gameaction == ga_savegame) + LastSaved = LastAccessed = -1; + quickSaveSlot = nullptr; + filter = G_BuildSaveName("*"); + filefirst = I_FindFirst(filter.GetChars(), &c_file); + if (filefirst != ((void *)(-1))) { - return; - } - */ - - PalEntry frameColor(255, 80, 80, 80); // todo: pick a proper color per game. - PalEntry fillColor(160, 0, 0, 0); - DrawFrame(twod, frameColor, savepicLeft, savepicTop, savepicWidth, savepicHeight, -1); - if (!savegameManager.DrawSavePic(savepicLeft, savepicTop, savepicWidth, savepicHeight)) - { - twod->AddColorOnlyQuad(savepicLeft, savepicTop, savepicWidth, savepicHeight, fillColor); - - if (savegameManager.SavegameCount() > 0) + do { - if (Selected >= savegameManager.SavegameCount()) Selected = 0; - FString text = (Selected == -1 || !savegameManager.GetSavegame(Selected)->bOldVersion) ? GStrings("MNU_NOPICTURE") : GStrings("MNU_DIFFVERSION"); - int textlen = NewSmallFont->StringWidth(text) * CleanXfac; + // I_FindName only returns the file's name and not its full path + FString filepath = G_BuildSaveName(I_FindName(&c_file)); - DrawText(twod, NewSmallFont, CR_GOLD, savepicLeft + (savepicWidth - textlen) / 2, - savepicTop + (savepicHeight - rowHeight) / 2, text, DTA_CleanNoMove, true, TAG_DONE); - } - } - - // Draw comment area - DrawFrame(twod, frameColor, commentLeft, commentTop, commentWidth, commentHeight, -1); - twod->AddColorOnlyQuad(commentLeft, commentTop, commentWidth, commentHeight, fillColor); - - int numlinestoprint = std::min(commentRows, (int)BrokenSaveComment.Size()); - for (int i = 0; i < numlinestoprint; i++) - { - DrawText(twod, NewConsoleFont, CR_ORANGE, commentLeft / FontScale, (commentTop + rowHeight * i) / FontScale, BrokenSaveComment[i].Text, - DTA_VirtualWidthF, screen->GetWidth() / FontScale, DTA_VirtualHeightF, screen->GetHeight() / FontScale, DTA_KeepRatio, true, TAG_DONE); - } - - - // Draw file area - DrawFrame(twod, frameColor, listboxLeft, listboxTop, listboxWidth, listboxHeight, -1); - twod->AddColorOnlyQuad(listboxLeft, listboxTop, listboxWidth, listboxHeight, fillColor); - - if (savegameManager.SavegameCount() == 0) - { - FString text = GStrings("MNU_NOFILES"); - int textlen = int(NewConsoleFont->StringWidth(text) * FontScale); - - DrawText(twod, NewConsoleFont, CR_GOLD, (listboxLeft + (listboxWidth - textlen) / 2) / FontScale, (listboxTop + (listboxHeight - rowHeight) / 2) / FontScale, text, - DTA_VirtualWidthF, screen->GetWidth() / FontScale, DTA_VirtualHeightF, screen->GetHeight() / FontScale, DTA_KeepRatio, true, TAG_DONE); - return; - } - - j = TopItem; - for (i = 0; i < listboxRows && j < savegameManager.SavegameCount(); i++) - { - int colr; - auto& node = *savegameManager.GetSavegame(j); - if (node.bOldVersion) - { - colr = CR_RED; - } - else if (node.bMissingWads) - { - colr = CR_YELLOW; - } - else if (j == Selected) - { - colr = CR_WHITE; - } - else - { - colr = CR_TAN; - } - - //screen->SetClipRect(listboxLeft, listboxTop+rowHeight*i, listboxRight, listboxTop+rowHeight*(i+1)); - - if ((int)j == Selected) - { - twod->AddColorOnlyQuad(listboxLeft, listboxTop + rowHeight * i, listboxWidth, rowHeight, mEntering ? PalEntry(255, 255, 0, 0) : PalEntry(255, 0, 0, 255)); - didSeeSelected = true; - if (!mEntering) + FResourceFile *savegame = FResourceFile::OpenResourceFile(filepath, true, true); + if (savegame != nullptr) { - DrawText(twod, NewConsoleFont, colr, (listboxLeft + 1) / FontScale, (listboxTop + rowHeight * i + FontScale) / FontScale, node.SaveTitle, - DTA_VirtualWidthF, screen->GetWidth() / FontScale, DTA_VirtualHeightF, screen->GetHeight() / FontScale, DTA_KeepRatio, true, TAG_DONE); - } - else - { - FStringf s("%s%c", mInput->GetText(), NewConsoleFont->GetCursor()); - int length = int(NewConsoleFont->StringWidth(s) * FontScale); - int displacement = std::min(0, listboxWidth - 2 - length); - DrawText(twod, NewConsoleFont, CR_WHITE, (listboxLeft + 1 + displacement) / FontScale, (listboxTop + rowHeight * i + FontScale) / FontScale, s, - DTA_VirtualWidthF, screen->GetWidth() / FontScale, DTA_VirtualHeightF, screen->GetHeight() / FontScale, DTA_KeepRatio, true, TAG_DONE); - } - } - else - { - DrawText(twod, NewConsoleFont, colr, (listboxLeft + 1) / FontScale, (listboxTop + rowHeight * i + FontScale) / FontScale, node.SaveTitle, - DTA_VirtualWidthF, screen->GetWidth() / FontScale, DTA_VirtualHeightF, screen->GetHeight() / FontScale, DTA_KeepRatio, true, TAG_DONE); - } - //screen->ClearClipRect(); - j++; - } - } - - void UpdateSaveComment() - { - BrokenSaveComment = V_BreakLines(NewConsoleFont, int(commentWidth / FontScale), savegameManager.SaveCommentString); - } - - //============================================================================= - // - // - // - //============================================================================= - - bool MenuEvent(int mkey, bool fromcontroller) override - { - auto& manager = savegameManager; - switch (mkey) - { - case MKEY_Up: - if (manager.SavegameCount() > 1) - { - if (Selected == -1) Selected = TopItem; - else - { - if (--Selected < 0) Selected = manager.SavegameCount() - 1; - if (Selected < TopItem) TopItem = Selected; - else if (Selected >= TopItem + listboxRows) TopItem = std::max(0, Selected - listboxRows + 1); - } - manager.UnloadSaveData(); - manager.ExtractSaveData(Selected); - UpdateSaveComment(); - } - return true; - - case MKEY_Down: - if (manager.SavegameCount() > 1) - { - if (Selected == -1) Selected = TopItem; - else - { - if (++Selected >= manager.SavegameCount()) Selected = 0; - if (Selected < TopItem) TopItem = Selected; - else if (Selected >= TopItem + listboxRows) TopItem = std::max(0, Selected - listboxRows + 1); - } - manager.UnloadSaveData(); - manager.ExtractSaveData(Selected); - UpdateSaveComment(); - } - return true; - - case MKEY_PageDown: - if (manager.SavegameCount() > 1) - { - if (TopItem >= manager.SavegameCount() - listboxRows) - { - TopItem = 0; - if (Selected != -1) Selected = 0; - } - else - { - TopItem = std::min(TopItem + listboxRows, int(manager.SavegameCount()) - listboxRows); - if (TopItem > Selected&& Selected != -1) Selected = TopItem; - } - manager.UnloadSaveData(); - manager.ExtractSaveData(Selected); - UpdateSaveComment(); - } - return true; - - case MKEY_PageUp: - if (manager.SavegameCount() > 1) - { - if (TopItem == 0) - { - TopItem = std::max(0, int(manager.SavegameCount()) - listboxRows); - if (Selected != -1) Selected = TopItem; - } - else - { - TopItem = std::max(int(TopItem - listboxRows), 0); - if (Selected >= TopItem + listboxRows) Selected = TopItem; - } - manager.UnloadSaveData(); - manager.ExtractSaveData(Selected); - UpdateSaveComment(); - } - return true; - - case MKEY_Enter: - return false; // This event will be handled by the subclasses - - case MKEY_MBYes: - { - if (Selected < manager.SavegameCount()) - { - Selected = manager.RemoveSaveSlot(Selected); - UpdateSaveComment(); - } - return true; - } - - default: - return Super::MenuEvent(mkey, fromcontroller); - } - } - - //============================================================================= - // - // - // - //============================================================================= - - bool MouseEvent(int type, int x, int y) override - { - auto& manager = savegameManager; - if (x >= listboxLeft && x < listboxLeft + listboxWidth && - y >= listboxTop && y < listboxTop + listboxHeight) - { - int lineno = (y - listboxTop) / rowHeight; - - if (TopItem + lineno < manager.SavegameCount()) - { - Selected = TopItem + lineno; - manager.UnloadSaveData(); - manager.ExtractSaveData(Selected); - UpdateSaveComment(); - if (type == MOUSE_Release) - { - if (MenuEvent(MKEY_Enter, true)) + FResourceLump *info = savegame->FindLump("info.json"); + if (info == nullptr) { - return true; + // savegame info not found. This is not a savegame so leave it alone. + delete savegame; + continue; + } + auto fr = info->NewReader(); + FString title; + int check = G_ValidateSavegame(fr, &title, true); + fr.Close(); + delete savegame; + if (check != 0) + { + FSaveGameNode *node = new FSaveGameNode; + node->Filename = filepath; + node->bOldVersion = check == -1; + node->bMissingWads = check == -2; + node->SaveTitle = title; + InsertSaveNode(node); } } - } - else Selected = -1; - } - else Selected = -1; - - return Super::MouseEvent(type, x, y); - } - - //============================================================================= - // - // - // - //============================================================================= - - bool Responder(event_t * ev) override - { - auto& manager = savegameManager; - if (ev->type == EV_GUI_Event) - { - if (ev->subtype == EV_GUI_KeyDown) - { - if ((unsigned)Selected < manager.SavegameCount()) - { - switch (ev->data1) - { - case GK_F1: - manager.SetFileInfo(Selected); - UpdateSaveComment(); - return true; - - case GK_DEL: - case '\b': - { - FString EndString; - EndString.Format("%s" TEXTCOLOR_WHITE "%s" TEXTCOLOR_NORMAL "?\n\n%s", - GStrings("MNU_DELETESG"), manager.GetSavegame(Selected)->SaveTitle.GetChars(), GStrings("PRESSYN")); - M_StartMessage(EndString, 0, -1); - } - return true; - } - } - } - else if (ev->subtype == EV_GUI_WheelUp) - { - if (TopItem > 0) TopItem--; - return true; - } - else if (ev->subtype == EV_GUI_WheelDown) - { - if (TopItem < manager.SavegameCount() - listboxRows) TopItem++; - return true; - } - } - return Super::Responder(ev); - } -}; - -//============================================================================= -// -// -// -//============================================================================= - -class DSaveMenu : public DLoadSaveMenu -{ - using Super = DLoadSaveMenu; - FString mSaveName; -public: - - - //============================================================================= - // - // - // - //============================================================================= - - DSaveMenu() - { - savegameManager.InsertNewSaveNode(); - TopItem = 0; - Selected = savegameManager.ExtractSaveData (-1); - UpdateSaveComment(); - } - - //============================================================================= - // - // - // - //============================================================================= - - void Destroy() override - { - if (savegameManager.RemoveNewSaveNode()) - { - Selected--; - } - Super::Destroy(); - } - //============================================================================= - // - // - // - //============================================================================= - - bool MenuEvent (int mkey, bool fromcontroller) override - { - if (Super::MenuEvent(mkey, fromcontroller)) - { - return true; - } - if (Selected == -1) - { - return false; - } - - if (mkey == MKEY_Enter) - { - FString SavegameString = (Selected != 0)? savegameManager.GetSavegame(Selected)->SaveTitle : FString(); - mInput = new DTextEnterMenu(this, NewConsoleFont, SavegameString, listboxWidth, false, false); - M_ActivateMenu(mInput); - mEntering = true; - } - else if (mkey == MKEY_Input) - { - mEntering = false; - mSaveName = mInput->GetText(); - mInput = nullptr; - } - else if (mkey == MKEY_Abort) - { - mEntering = false; - mInput = nullptr; - } - return false; - } - - //============================================================================= - // - // - // - //============================================================================= - - bool MouseEvent(int type, int x, int y) override - { - if (mSaveName.Len() > 0) - { - // Do not process events when saving is in progress to avoid update of the current index, - // i.e. Selected member variable must remain unchanged - return true; - } - - return Super::MouseEvent(type, x, y); - } - - //============================================================================= - // - // - // - //============================================================================= - - bool Responder (event_t *ev) override - { - if (ev->subtype == EV_GUI_KeyDown) - { - if (Selected != -1) - { - switch (ev->data1) - { - case GK_DEL: - case '\b': - // cannot delete 'new save game' item - if (Selected == 0) return true; - break; - - case 'N': - Selected = TopItem = 0; - savegameManager.UnloadSaveData(); - return true; - } - } - } - return Super::Responder(ev); - } - - //============================================================================= - // - // - // - //============================================================================= - - void Ticker() override - { - if (mSaveName.Len() > 0) - { - savegameManager.DoSave(Selected, mSaveName); + } while (I_FindNext (filefirst, &c_file) == 0); + I_FindClose (filefirst); } } - -}; - -//============================================================================= -// -// -// -//============================================================================= - -class DLoadMenu : public DLoadSaveMenu -{ - using Super = DLoadSaveMenu; - -public: - - //============================================================================= - // - // - // - //============================================================================= - - DLoadMenu() - { - TopItem = 0; - Selected = savegameManager.ExtractSaveData(-1); - UpdateSaveComment(); - } - - //============================================================================= - // - // - // - //============================================================================= - - bool MenuEvent(int mkey, bool fromcontroller) override - { - if (Super::MenuEvent(mkey, fromcontroller)) - { - return true; - } - if (Selected == -1 || savegameManager.SavegameCount() == 0) - { - return false; - } - - if (mkey == MKEY_Enter) - { - savegameManager.LoadSavegame(Selected); - return true; - } - return false; - } -}; - -static TMenuClassDescriptor _lm("LoadMenu"); -static TMenuClassDescriptor _sm("SaveMenu"); - -void RegisterLoadsaveMenus() -{ - menuClasses.Push(&_sm); - menuClasses.Push(&_lm); } + + +//============================================================================= +// +// +// +//============================================================================= + +void FSavegameManager::PerformLoadGame(const char *f, bool s) +{ + G_LoadGame(f); +} + +void FSavegameManager::PerformSaveGame(const char *f, const char *s) +{ + G_SaveGame(f, s, false, false); +} + +FString FSavegameManager::BuildSaveName(const char* fn, int slot) +{ + return G_BuildSaveName(FStringf("%s%04d", fn, slot)); +} + +//============================================================================= +// +// +// +//============================================================================= + +FString FSavegameManager::ExtractSaveComment(FSerializer& arc) +{ + FString comment, fcomment, ncomment, mtime; + + arc("Creation Time", comment) + ("Map Label", fcomment) + ("Map Name", ncomment) + ("Map Time", mtime); + + comment.AppendFormat("\n%s - %s\n%s", fcomment.GetChars(), ncomment.GetChars(), mtime.GetChars()); + return comment; +} + +FSavegameManager savegameManager; + +DEFINE_ACTION_FUNCTION(FSavegameManager, GetManager) +{ + PARAM_PROLOGUE; + ACTION_RETURN_POINTER(&savegameManager); +} + diff --git a/source/core/menu/menu.cpp b/source/core/menu/menu.cpp deleted file mode 100644 index b85375ffc..000000000 --- a/source/core/menu/menu.cpp +++ /dev/null @@ -1,1091 +0,0 @@ -/* -** menu.cpp -** Menu base class and global interface -** -**--------------------------------------------------------------------------- -** Copyright 2010 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 "c_dispatch.h" -#include "d_gui.h" -#include "c_console.h" -#include "c_bind.h" -#include "c_cvars.h" -#include "d_event.h" -//#include "i_input.h" -#include "gameconfigfile.h" -#include "gstrings.h" -#include "menu.h" -#include "textures.h" -#include "c_buttons.h" -#include "v_2ddrawer.h" -#include "printf.h" -#include "v_draw.h" -#include "gamecontrol.h" -#include "pragmas.h" -#include "build.h" -#include "statistics.h" -#include "m_joy.h" -#include "raze_sound.h" -#include "texturemanager.h" -#include "v_video.h" -#include "gamestate.h" - -void RegisterDuke3dMenus(); -void RegisterBloodMenus(); -void RegisterSWMenus(); -void RegisterPSMenus(); -void RegisterLoadsaveMenus(); -void RegisterOptionMenus(); -void RegisterJoystickMenus(); -void UpdateJoystickMenu(IJoystickConfig* joy); -bool help_disabled, credits_disabled; -int g_currentMenu; // accessible by CON scripts - contains the current menu's script ID if defined or INT_MAX if none given. -TArray toDelete; - -// -// Todo: Move these elsewhere -// -EXTERN_CVAR (Bool, show_messages) - - -CVAR(Bool, menu_sounds, true, CVAR_ARCHIVE) // added mainly because RR's sounds are so supremely annoying. -//CVAR (Float, snd_menuvolume, 0.6f, CVAR_ARCHIVE) the current sound engine cannot deal with this. -CVAR(Int, m_use_mouse, 2, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) -CVAR(Int, m_show_backbutton, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) - -TArray menuClasses(TArray::ENoInit(0)); - -DMenu *CurrentMenu; -bool DMenu::InMenu; - -FNewGameStartup NewGameStartupInfo; -EMenuState menuactive; -bool M_DemoNoPlay; -FButtonStatus MenuButtons[NUM_MKEYS]; -int MenuButtonTickers[NUM_MKEYS]; -bool MenuButtonOrigin[NUM_MKEYS]; -int BackbuttonTime; -float BackbuttonAlpha; -static bool MenuEnabled = true; - - -#define KEY_REPEAT_DELAY (MENU_TICRATE*5/12) -#define KEY_REPEAT_RATE (3) - - -static MenuTransition transition; - -bool MenuTransition::StartTransition(DMenu *from, DMenu *to, MenuTransitionType animtype) -{ - if (!from->canAnimate || !to->canAnimate || animtype == MA_None) - { - return false; - } - else - { - start = I_GetTimeNS() * (120. / 1'000'000'000.); - length = 30; - dir = animtype == MA_Advance? 1 : -1; - previous = from; - current = to; - return true; - } -} - -bool MenuTransition::Draw() -{ - double now = I_GetTimeNS() * (120. / 1'000'000'000); - if (now < start + length) - { - double factor = 120 * xdim / ydim; - double phase = (now - start) / double(length) * M_PI + M_PI/2; - - previous->origin.X = factor * dir * (sin(phase) - 1.); - current->origin.X = factor * dir * (sin(phase) + 1.); - previous->Drawer(); - current->Drawer(); - return true; - } - return false; -} - -//============================================================================ -// -// DMenu base class -// -//============================================================================ - - -DMenu::DMenu(DMenu *parent) -{ - mParentMenu = parent; - mMouseCapture = false; - mBackbuttonSelected = false; -} - -bool DMenu::Responder (event_t *ev) -{ - bool res = false; - if (ev->type == EV_GUI_Event) - { - if (ev->subtype == EV_GUI_LButtonDown) - { - res = MouseEventBack(MOUSE_Click, ev->data1, ev->data2); - // make the menu's mouse handler believe that the current coordinate is outside the valid range - if (res) ev->data2 = -1; - res |= MouseEvent(MOUSE_Click, ev->data1, ev->data2); - if (res) - { - SetCapture(); - } - - } - else if (ev->subtype == EV_GUI_MouseMove) - { - BackbuttonTime = BACKBUTTON_TIME; - if (mMouseCapture || m_use_mouse == 1) - { - res = MouseEventBack(MOUSE_Move, ev->data1, ev->data2); - if (res) ev->data2 = -1; - res |= MouseEvent(MOUSE_Move, ev->data1, ev->data2); - } - } - else if (ev->subtype == EV_GUI_LButtonUp) - { - if (mMouseCapture) - { - ReleaseCapture(); - res = MouseEventBack(MOUSE_Release, ev->data1, ev->data2); - if (res) ev->data2 = -1; - res |= MouseEvent(MOUSE_Release, ev->data1, ev->data2); - } - } - } - return false; -} - -//============================================================================= -// -// -// -//============================================================================= - -bool DMenu::MenuEvent (int mkey, bool fromcontroller) -{ - switch (mkey) - { - case MKEY_Back: - { - //if (scriptID != 0) - { - M_MenuSound(CurrentMenu->mParentMenu? BackSound : CloseSound); - Close(); - if (!CurrentMenu && gamestate == GS_MENUSCREEN) C_FullConsole(); - return true; - } - } - } - return false; -} - -//============================================================================= -// -// -// -//============================================================================= - -void DMenu::Close () -{ - assert(CurrentMenu == this); - - CurrentMenu = mParentMenu; - if (mParentMenu && transition.StartTransition(this, mParentMenu, MA_Return)) - { - g_currentMenu = CurrentMenu->scriptID; - } - else - { - Destroy(); - toDelete.Push(this); - if (CurrentMenu == NULL) - { - M_ClearMenus(); - } - else - { - g_currentMenu = CurrentMenu->scriptID; - } - } -} - -//============================================================================= -// -// -// -//============================================================================= - -bool DMenu::MouseEvent(int type, int x, int y) -{ - return true; -} - -//============================================================================= -// -// -// -//============================================================================= - -bool DMenu::MouseEventBack(int type, int x, int y) -{ - if (m_show_backbutton >= 0) - { - auto texid = TexMan.CheckForTexture("engine/graphics/m_back.png", ETextureType::Any); - if (texid.isValid()) - { - auto tex = TexMan.GetGameTexture(texid); - if (m_show_backbutton&1) x -= screen->GetWidth() - tex->GetDisplayWidth() * CleanXfac; - if (m_show_backbutton&2) y -= screen->GetHeight() - tex->GetDisplayHeight() * CleanYfac; - mBackbuttonSelected = ( x >= 0 && x < tex->GetDisplayWidth() * CleanXfac && - y >= 0 && y < tex->GetDisplayHeight() * CleanYfac); - if (mBackbuttonSelected && type == MOUSE_Release) - { - if (m_use_mouse == 2) mBackbuttonSelected = false; - MenuEvent(MKEY_Back, true); - } - return mBackbuttonSelected; - } - } - return false; -} - -//============================================================================= -// -// -// -//============================================================================= - -void DMenu::SetCapture() -{ - if (!mMouseCapture) - { - mMouseCapture = true; - I_SetMouseCapture(); - } -} - -void DMenu::ReleaseCapture() -{ - if (mMouseCapture) - { - mMouseCapture = false; - I_ReleaseMouseCapture(); - } -} - -//============================================================================= -// -// -// -//============================================================================= - -void DMenu::Ticker () -{ -} - -void DMenu::Drawer () -{ - if (this == CurrentMenu && BackbuttonAlpha > 0 && m_show_backbutton >= 0 && m_use_mouse) - { - auto texid = TexMan.CheckForTexture("engine/graphics/m_back.png", ETextureType::Any); - if (texid.isValid()) - { - auto tex = TexMan.GetGameTexture(texid); - int w = tex->GetDisplayWidth() * CleanXfac; - int h = tex->GetDisplayHeight() * CleanYfac; - int x = (!(m_show_backbutton & 1)) ? 0 : screen->GetWidth() - w; - int y = (!(m_show_backbutton & 2)) ? 0 : screen->GetHeight() - h; - if (mBackbuttonSelected && (mMouseCapture || m_use_mouse == 1)) - { - DrawTexture(twod, tex, x, y, DTA_CleanNoMove, true, DTA_ColorOverlay, MAKEARGB(40, 255, 255, 255), TAG_DONE); - } - else - { - DrawTexture(twod, tex, x, y, DTA_CleanNoMove, true, DTA_Alpha, BackbuttonAlpha, TAG_DONE); - } - } - } -} - - -bool DMenu::DimAllowed() -{ - return true; -} - -bool DMenu::TranslateKeyboardEvents() -{ - return true; -} - -//============================================================================= -// -// -// -//============================================================================= - -void M_StartControlPanel (bool makeSound) -{ - static bool created = false; - // intro might call this repeatedly - if (CurrentMenu != NULL) - return; - - if (!created) // Cannot do this earlier. - { - created = true; - M_CreateMenus(); - } - GSnd->SetSfxPaused(true, PAUSESFX_MENU); - gi->MenuOpened(); - if (makeSound) M_MenuSound(ActivateSound); - - inputState.ClearAllInput(); - for (int i = 0; i < NUM_MKEYS; ++i) - { - MenuButtons[i].ReleaseKey(0); - } - - C_HideConsole (); // [RH] Make sure console goes bye bye. - menuactive = MENU_On; - // Pause sound effects before we play the menu switch sound. - // That way, it won't be paused. - //P_CheckTickerPaused (); - - BackbuttonTime = 0; - BackbuttonAlpha = 0; -} - -void Menu_Open(int playerid) -{ - M_StartControlPanel(CurrentMenu == nullptr); -} - -//============================================================================= -// -// -// -//============================================================================= - -void M_ActivateMenu(DMenu *menu) -{ - g_currentMenu = menu->scriptID; - if (menuactive == MENU_Off) menuactive = MENU_On; - if (CurrentMenu != NULL) - { - CurrentMenu->ReleaseCapture(); - transition.StartTransition(CurrentMenu, menu, MA_Advance); - } - CurrentMenu = menu; -} - -//============================================================================= -// -// -// -//============================================================================= - -bool M_SetMenu(FName menu, int param, FName caller) -{ -#if 0 - // skip the menu and go right into the first level. - // For tracking memory leaks that normally require operating the menu to start the game so that they always get the same allocation number. - NewGameStartupInfo.Episode = NewGameStartupInfo.Skill = 0; - menu = NAME_Startgame; -#endif - // some menus need some special treatment (needs to be adjusted for the various frontends. - switch (caller.GetIndex()) - { - case NAME_Episodemenu: - case NAME_TargetMenu: - // sent from the episode menu - NewGameStartupInfo.Episode = param; - NewGameStartupInfo.Level = 0; - NewGameStartupInfo.Skill = gDefaultSkill; - break; - - case NAME_WeaponMenu: - NewGameStartupInfo.Skill = param; - break; - - case NAME_Skillmenu: - NewGameStartupInfo.Skill = param; - break; - - case NAME_EngineCredits: - case NAME_EngineCredits2: - { - auto m = CurrentMenu; - CurrentMenu = m->mParentMenu; - m->mParentMenu = nullptr; - toDelete.Push(m); - break; - } - } - - switch (menu.GetIndex()) - { - case NAME_Startgame: - if (caller == NAME_Mainmenu || caller == NAME_IngameMenu) NewGameStartupInfo.Episode = param; - if (gi->StartGame(NewGameStartupInfo)) - { - M_ClearMenus(); - STAT_StartNewGame(gVolumeNames[NewGameStartupInfo.Episode], NewGameStartupInfo.Skill); - inputState.ClearAllInput(); - } - - return false; - - case NAME_CustomSubMenu1: - menu = ENamedName(menu.GetIndex() + param); - break; - -#if 0 - case NAME_StartgameConfirm: - { - // sent from the skill menu for a skill that needs to be confirmed - NewGameStartupInfo.Skill = param; - - const char *msg = AllSkills[param].MustConfirmText; - if (*msg==0) msg = GStrings("NIGHTMARE"); - M_StartMessage (msg, 0, -1, NAME_StartgameConfirmed); - return; - } -#endif - - case NAME_Savegamemenu: - if (!gi->CanSave()) - { - // cannot save outside the game. - M_StartMessage (GStrings("SAVEDEAD"), 1, -1); - return true; - } - break; - - case NAME_Quitmenu: - // This is no separate class - C_DoCommand("menu_quit"); - return true; - - case NAME_EndGameMenu: - // This is no separate class - C_DoCommand("menu_endgame"); - return true; - } - - // End of special checks - - FMenuDescriptor **desc = MenuDescriptors.CheckKey(menu); - if (desc != NULL) - { - /* - if ((*desc)->mNetgameMessage.IsNotEmpty() && netgame && !demoplayback) - { - M_StartMessage((*desc)->mNetgameMessage, 1); - return; - } - */ - - if ((*desc)->mType == MDESC_ListMenu) - { - FListMenuDescriptor *ld = static_cast(*desc); - if (ld->mAutoselect >= 0 && ld->mAutoselect < (int)ld->mItems.Size()) - { - // recursively activate the autoselected item without ever creating this menu. - ld->mItems[ld->mAutoselect]->Activate(ld->mMenuName); - } - else - { - DListMenu* newmenu; - if (ld->mClass != NAME_None) - { - auto ndx = menuClasses.FindEx([=](const auto p) { return p->mName == ld->mClass; }); - if (ndx == menuClasses.Size()) - { - I_Error("Bad menu class %s\n", ld->mClass.GetChars()); - return true; - } - else - { - newmenu = (DListMenu*)menuClasses[ndx]->CreateNew(); - } - } - else - { - newmenu = new DListMenu; - } - newmenu->Init(CurrentMenu, ld); - M_ActivateMenu(newmenu); - } - } - else if ((*desc)->mType == MDESC_OptionsMenu) - { - FOptionMenuDescriptor *ld = static_cast(*desc); - DOptionMenu* newmenu = nullptr; - if (ld->mClass != NAME_None) - { - auto ndx = menuClasses.FindEx([=](const auto p) { return p->mName == ld->mClass; }); - if (ndx == menuClasses.Size()) - { - I_Error("Bad menu class %s\n", ld->mClass.GetChars()); - } - else - { - newmenu = (DOptionMenu*)menuClasses[ndx]->CreateNew(); - } - } - else - { - newmenu = new DOptionMenu; - } - newmenu->Init(CurrentMenu, ld); - M_ActivateMenu(newmenu); - } - else if ((*desc)->mType == MDESC_ImageScroller) - { - FImageScrollerDescriptor* ld = static_cast(*desc); - DImageScrollerMenu* newmenu; - if (ld->mClass != NAME_None) - { - auto ndx = menuClasses.FindEx([=](const auto p) { return p->mName == ld->mClass; }); - if (ndx == menuClasses.Size()) - { - I_Error("Bad menu class %s\n", ld->mClass.GetChars()); - return true; - } - else - { - newmenu = (DImageScrollerMenu*)menuClasses[ndx]->CreateNew(); - } - } - else - { - newmenu = new DImageScrollerMenu; - } - newmenu->Init(CurrentMenu, ld); - M_ActivateMenu(newmenu); - } - return true; - } - else - { - /* - const PClass *menuclass = PClass::FindClass(menu); - if (menuclass != NULL) - { - if (menuclass->IsDescendantOf(RUNTIME_CLASS(DMenu))) - { - DMenu *newmenu = (DMenu*)menuclass->CreateNew(); - newmenu->mParentMenu = CurrentMenu; - M_ActivateMenu(newmenu); - return true; - } - } - */ - } - Printf("Attempting to open menu of unknown type '%s'\n", menu.GetChars()); - M_ClearMenus(); - return false; -} - -//============================================================================= -// -// -// -//============================================================================= - -bool M_DoResponder (event_t *ev) -{ - int ch = 0; - bool keyup = false; - int mkey = NUM_MKEYS; - bool fromcontroller = true; - - if (chatmodeon) - { - return false; - } - - if (CurrentMenu != NULL && menuactive != MENU_Off) - { - // There are a few input sources we are interested in: - // - // EV_KeyDown / EV_KeyUp : joysticks/gamepads/controllers - // EV_GUI_KeyDown / EV_GUI_KeyUp : the keyboard - // EV_GUI_Char : printable characters, which we want in string input mode - // - // This code previously listened for EV_GUI_KeyRepeat to handle repeating - // in the menus, but that doesn't work with gamepads, so now we combine - // the multiple inputs into buttons and handle the repetition manually. - if (ev->type == EV_GUI_Event) - { - fromcontroller = false; - if (ev->subtype == EV_GUI_KeyRepeat) - { - // We do our own key repeat handling but still want to eat the - // OS's repeated keys. - return true; - } - else if (ev->subtype == EV_GUI_BackButtonDown || ev->subtype == EV_GUI_BackButtonUp) - { - mkey = MKEY_Back; - keyup = ev->subtype == EV_GUI_BackButtonUp; - } - else if (ev->subtype != EV_GUI_KeyDown && ev->subtype != EV_GUI_KeyUp) - { - // do we want mouse input? - if (ev->subtype >= EV_GUI_FirstMouseEvent && ev->subtype <= EV_GUI_LastMouseEvent) - { - if (!m_use_mouse) - return true; - } - - // pass everything else on to the current menu - return CurrentMenu->Responder(ev); - } - else if (CurrentMenu->TranslateKeyboardEvents()) - { - ch = ev->data1; - keyup = ev->subtype == EV_GUI_KeyUp; - switch (ch) - { - case GK_BACK: mkey = MKEY_Back; break; - case GK_ESCAPE: mkey = MKEY_Back; break; - case GK_RETURN: mkey = MKEY_Enter; break; - case GK_UP: mkey = MKEY_Up; break; - case GK_DOWN: mkey = MKEY_Down; break; - case GK_LEFT: mkey = MKEY_Left; break; - case GK_RIGHT: mkey = MKEY_Right; break; - case GK_BACKSPACE: mkey = MKEY_Clear; break; - case GK_PGUP: mkey = MKEY_PageUp; break; - case GK_PGDN: mkey = MKEY_PageDown; break; - default: - if (!keyup) - { - return CurrentMenu->Responder(ev); - } - break; - } - } - } - else if (menuactive != MENU_WaitKey && (ev->type == EV_KeyDown || ev->type == EV_KeyUp)) - { - keyup = ev->type == EV_KeyUp; - - ch = ev->data1; - switch (ch) - { - case KEY_JOY1: - case KEY_PAD_A: - mkey = MKEY_Enter; - break; - - case KEY_JOY2: - case KEY_PAD_B: - mkey = MKEY_Back; - break; - - case KEY_JOY3: - case KEY_PAD_X: - mkey = MKEY_Clear; - break; - - case KEY_JOY5: - case KEY_PAD_LSHOULDER: - mkey = MKEY_PageUp; - break; - - case KEY_JOY6: - case KEY_PAD_RSHOULDER: - mkey = MKEY_PageDown; - break; - - case KEY_PAD_DPAD_UP: - case KEY_PAD_LTHUMB_UP: - case KEY_JOYAXIS1MINUS: - case KEY_JOYPOV1_UP: - mkey = MKEY_Up; - break; - - case KEY_PAD_DPAD_DOWN: - case KEY_PAD_LTHUMB_DOWN: - case KEY_JOYAXIS1PLUS: - case KEY_JOYPOV1_DOWN: - mkey = MKEY_Down; - break; - - case KEY_PAD_DPAD_LEFT: - case KEY_PAD_LTHUMB_LEFT: - case KEY_JOYAXIS2MINUS: - case KEY_JOYPOV1_LEFT: - mkey = MKEY_Left; - break; - - case KEY_PAD_DPAD_RIGHT: - case KEY_PAD_LTHUMB_RIGHT: - case KEY_JOYAXIS2PLUS: - case KEY_JOYPOV1_RIGHT: - mkey = MKEY_Right; - break; - } - } - - if (mkey != NUM_MKEYS) - { - if (keyup) - { - MenuButtons[mkey].ReleaseKey(ch); - return false; - } - else - { - MenuButtons[mkey].PressKey(ch); - MenuButtonOrigin[mkey] = fromcontroller; - if (mkey <= MKEY_PageDown) - { - MenuButtonTickers[mkey] = KEY_REPEAT_DELAY; - } - CurrentMenu->MenuEvent(mkey, fromcontroller); - return true; - } - } - return CurrentMenu->Responder(ev) || !keyup; - } - else if (MenuEnabled) - { - if (ev->type == EV_KeyDown) - { - // Pop-up menu? - if (ev->data1 == KEY_ESCAPE) // Should we let the games handle Escape for special actions, like backing out of cameras? - { - if (gamestate != GS_STARTUP && gamestate != GS_INTRO) - { - M_StartControlPanel(true); - M_SetMenu(gi->CanSave()? NAME_IngameMenu : NAME_Mainmenu, -1); - if (gamestate == GS_FULLCONSOLE) gamestate = GS_MENUSCREEN; - } - return true; - } - return false; - } - else if (ev->type == EV_GUI_Event && ev->subtype == EV_GUI_LButtonDown && - ConsoleState != c_down && m_use_mouse) - { - M_StartControlPanel(true); - M_SetMenu(NAME_Mainmenu, -1); - return true; - } - } - return false; -} - -bool M_Responder(event_t* ev) -{ - bool res = false; - // delayed deletion, so that self-deleting menus don't crash if they are getting accessed after being closed. - try - { - res = M_DoResponder(ev); - } - catch (...) - { - for (auto p : toDelete) delete p; - toDelete.Clear(); - throw; - } - for (auto p : toDelete) delete p; - toDelete.Clear(); - return res; -} - -//============================================================================= -// -// -// -//============================================================================= - -void M_Ticker (void) -{ - if (CurrentMenu != NULL && menuactive != MENU_Off) - { - if (transition.previous) transition.previous->Ticker(); - if (CurrentMenu == nullptr) return; // In case one of the sub-screens has closed the menu. - CurrentMenu->Ticker(); - - for (int i = 0; i < NUM_MKEYS; ++i) - { - if (MenuButtons[i].bDown) - { - if (MenuButtonTickers[i] > 0 && --MenuButtonTickers[i] <= 0) - { - MenuButtonTickers[i] = KEY_REPEAT_RATE; - CurrentMenu->MenuEvent(i, MenuButtonOrigin[i]); - } - } - } - if (BackbuttonTime > 0) - { - if (BackbuttonAlpha < 1.0f) BackbuttonAlpha += 0.1f; - BackbuttonTime--; - } - else - { - if (BackbuttonAlpha > 0) BackbuttonAlpha -= 0.1f; - if (BackbuttonAlpha < 0) BackbuttonAlpha = 0; - } - } -} - -//============================================================================= -// -// -// -//============================================================================= - -void M_Drawer (void) -{ - PalEntry fade = 0x70000000; - - if (CurrentMenu != NULL && menuactive != MENU_Off) - { - if (CurrentMenu->DimAllowed() && fade && gamestate != GS_MENUSCREEN) twod->AddColorOnlyQuad(0, 0, screen->GetWidth(), screen->GetHeight(), fade); - - bool going = false; - if (transition.previous) - { - going = transition.Draw(); - if (!going) - { - if (transition.dir == -1) delete transition.previous; - transition.previous = nullptr; - transition.current = nullptr; - } - } - if (!going) - { - assert(CurrentMenu); - CurrentMenu->origin = { 0,0 }; - CurrentMenu->Drawer(); - } - } -} - -//============================================================================= -// -// -// -//============================================================================= - -void M_UnpauseSound() -{ - GSnd->SetSfxPaused(false, PAUSESFX_MENU); -} - -void M_ClearMenus (bool final) -{ - if (menuactive == MENU_Off) return; - M_DemoNoPlay = false; - transition.previous = transition.current = nullptr; - transition.dir = 0; - auto menu = CurrentMenu; - while (menu != nullptr) - { - auto nextm = menu->mParentMenu; - menu->Destroy(); - delete menu; - menu = nextm; - } - CurrentMenu = nullptr; - menuactive = MENU_Off; - M_UnpauseSound(); - inputState.ClearAllInput(); - if (!final) - { - gi->MenuClosed(); - } -} - -bool M_Active() -{ - return CurrentMenu != nullptr || ConsoleState == c_down || ConsoleState == c_falling; -} - -//============================================================================= -// -// -// -//============================================================================= - -void M_MenuSound(EMenuSounds snd) -{ - if (menu_sounds) gi->MenuSound(snd); -} - -//============================================================================= -// -// -// -//============================================================================= - -void M_PreviousMenu() -{ - if (CurrentMenu != nullptr) - { - DMenu* parent = CurrentMenu->mParentMenu; - CurrentMenu->Destroy(); - CurrentMenu = parent; - } -} - -//============================================================================= -// -// -// -//============================================================================= - -void M_Init (void) -{ - RegisterDuke3dMenus(); - RegisterBloodMenus(); - RegisterSWMenus(); - RegisterPSMenus(); - RegisterLoadsaveMenus(); - RegisterOptionMenus(); - RegisterJoystickMenus(); - M_ParseMenuDefs(); - UpdateJoystickMenu(nullptr); -} - - -//============================================================================= -// -// -// -//============================================================================= - -void M_EnableMenu (bool on) -{ - MenuEnabled = on; -} - - -bool M_IsAnimated() -{ - if (ConsoleState == c_down) return false; - if (!CurrentMenu) return false; - if (CurrentMenu->IsAnimated()) return true; - if(transition.previous) return true; - return false; -} - - -//============================================================================= -// -// [RH] Most menus can now be accessed directly -// through console commands. -// -//============================================================================= - - -CCMD (openmenu) -{ - if (argv.argc() < 2) - { - Printf("Usage: openmenu \"menu_name\""); - return; - } - M_StartControlPanel (true); - M_SetMenu(argv[1], -1); -} - -CCMD (closemenu) -{ - M_ClearMenus(); -} - -EXTERN_CVAR (Int, screenblocks) - -CCMD(menuconsole) -{ - M_ClearMenus(); - C_ToggleConsole(); -} - -CCMD(reset2defaults) -{ - C_SetDefaultBindings (); - C_SetCVarsToDefaults (); -} - -CCMD(reset2saved) -{ - GameConfig->DoGlobalSetup (); - GameConfig->DoGameSetup (currentGame); -} - -CCMD(menu_main) -{ - M_StartControlPanel(true); - M_SetMenu(gi->CanSave() ? NAME_IngameMenu : NAME_Mainmenu, -1); -} - -CCMD(openhelpmenu) -{ - if (!help_disabled) - { - M_StartControlPanel(true); - M_SetMenu(NAME_HelpMenu); - } -} - -CCMD(opensavemenu) -{ - if (gi->CanSave()) - { - M_StartControlPanel(true); - M_SetMenu(NAME_Savegamemenu); - } -} - -CCMD(openloadmenu) -{ - M_StartControlPanel(true); - M_SetMenu(NAME_Loadgamemenu); -} - diff --git a/source/core/menu/menu.h b/source/core/menu/menu.h deleted file mode 100644 index 453ebe885..000000000 --- a/source/core/menu/menu.h +++ /dev/null @@ -1,844 +0,0 @@ -#ifndef __M_MENU_MENU_H__ -#define __M_MENU_MENU_H__ - - - - -#include "v_font.h" -#include "c_cvars.h" -#include "version.h" -#include "textures.h" -#include "zstring.h" -#include "v_draw.h" -#include "menustate.h" -#include "gamestruct.h" - -EXTERN_CVAR(Float, snd_menuvolume) -EXTERN_CVAR(Int, m_use_mouse); - -enum EMax -{ - MAXSKILLS = 7, - MAXVOLUMES = 7, - MAXMENUGAMEPLAYENTRIES = 7, -}; - -// These get filled in by the map definition parsers of the front ends. -extern FString gSkillNames[MAXSKILLS]; -extern FString gVolumeNames[MAXVOLUMES]; -extern FString gVolumeSubtitles[MAXVOLUMES]; -extern int32_t gVolumeFlags[MAXVOLUMES]; -extern int gDefaultVolume, gDefaultSkill; - -const int MENU_TICRATE = 30; -extern bool help_disabled, credits_disabled; -extern int g_currentMenu; - -enum MenuTransitionType -{ // Note: This enum is for logical categories, not visual types. - MA_None, - MA_Return, - MA_Advance, -}; - -class DMenu; - -struct MenuTransition -{ - DMenu* previous; - DMenu* current; - - double start; - int32_t length; - int32_t dir; - - bool StartTransition(DMenu* from, DMenu* to, MenuTransitionType animtype); - bool Draw(); - -}; - -enum -{ - EF_HIDEFROMSP = 1 << 0, -}; - -enum MenuGameplayEntryFlags -{ - MGE_Locked = 1u << 0u, - MGE_Hidden = 1u << 1u, - MGE_UserContent = 1u << 2u, -}; - -typedef struct MenuGameplayEntry -{ - char name[64]; - uint8_t flags; - - bool isValid() const { return name[0] != '\0'; } -} MenuGameplayEntry; - -typedef struct MenuGameplayStemEntry -{ - MenuGameplayEntry entry; - MenuGameplayEntry subentries[MAXMENUGAMEPLAYENTRIES]; -} MenuGameplayStemEntry; - -extern MenuGameplayStemEntry g_MenuGameplayEntries[MAXMENUGAMEPLAYENTRIES]; - - -enum EMenuSounds : int -{ - ActivateSound, - CursorSound, - AdvanceSound, - BackSound, - CloseSound, - PageSound, - ChangeSound, - ChooseSound -}; - -EXTERN_CVAR(Bool, menu_sounds) - -struct event_t; -class FGameTexture; -class FFont; -enum EColorRange : int; -class FPlayerClass; -class FKeyBindings; - -enum EMenuKey -{ - MKEY_Up, - MKEY_Down, - MKEY_Left, - MKEY_Right, - MKEY_PageUp, - MKEY_PageDown, - //----------------- Keys past here do not repeat. - MKEY_Enter, - MKEY_Back, // Back to previous menu - MKEY_Clear, // Clear keybinding/flip player sprite preview - NUM_MKEYS, - - // These are not buttons but events sent from other menus - - MKEY_Input, // Sent when input is confirmed - MKEY_Abort, // Input aborted - MKEY_MBYes, - MKEY_MBNo, -}; - -enum ENativeFontValues -{ - NIT_BigFont, - NIT_SmallFont, - - NIT_ActiveColor = -1, - NIT_InactiveColor = -2, - NIT_SelectedColor = -3, - - NIT_ActiveState = 1, - NIT_InactiveState = 2, - NIT_SelectedState = 3 - // positive values for color are direct palswap indices. -}; - -extern FNewGameStartup NewGameStartupInfo; -extern EMenuState menuactive; - - -//============================================================================= -// -// menu descriptor. This is created from the menu definition lump -// Items must be inserted in the order they are cycled through with the cursor -// -//============================================================================= - -enum EMenuDescriptorType -{ - MDESC_ListMenu, - MDESC_OptionsMenu, - MDESC_ImageScroller, -}; - -struct FMenuDescriptor -{ - FName mMenuName; - FString mNetgameMessage; - int mType; - FName mClass; - - virtual ~FMenuDescriptor() {} -}; - -class FListMenuItem; -class FOptionMenuItem; - -enum ListMenuFlags -{ - LMF_Centered = 1, - LMF_DontSpace = 2, - LMF_Animate = 4, -}; - -struct FListMenuDescriptor : public FMenuDescriptor -{ - TDeletingArray mItems; - FString mCaption; - int mSelectedItem; - int mSelectOfsX; - int mSelectOfsY; - FGameTexture *mSelector; - int mDisplayTop; - int mXpos, mYpos, mYbotton; - int mWLeft, mWRight; - int mLinespacing; // needs to be stored for dynamically created menus - int mAutoselect; // this can only be set by internal menu creation functions - int mScriptId; - int mSecondaryId; - int mNativeFontNum, mNativePalNum; - float mNativeFontScale; - FFont *mFont; - EColorRange mFontColor; - EColorRange mFontColor2; - FMenuDescriptor *mRedirect; // used to redirect overlong skill and episode menus to option menu based alternatives - int mFlags; - int mSpacing; - - FListMenuDescriptor() - { - Reset(); - } - - void Reset(); -}; - -struct FOptionMenuSettings -{ - EColorRange mTitleColor; - EColorRange mFontColor; - EColorRange mFontColorValue; - EColorRange mFontColorMore; - EColorRange mFontColorHeader; - EColorRange mFontColorHighlight; - EColorRange mFontColorSelection; - int mLinespacing; -}; - -struct FOptionMenuDescriptor : public FMenuDescriptor -{ - TDeletingArray mItems; - FString mTitle; - int mSelectedItem; - int mDrawTop; - int mScrollTop; - int mScrollPos; - int mIndent; - int mPosition; - bool mDontDim; - - void CalcIndent(); - FOptionMenuItem *GetItem(FName name); - void Reset() - { - // Reset the default settings (ignore all other values in the struct) - mPosition = 0; - mScrollTop = 0; - mIndent = 0; - mDontDim = 0; - } - -}; - -struct FImageScrollerDescriptor : public FMenuDescriptor -{ - struct ScrollerItem - { - int type; // 0: fullscreen image; 1: centered text - int scriptID; - FString text; - }; - int mFlags = 0; - - TArray mItems; -}; - - - -typedef TMap MenuDescriptorList; - -extern FOptionMenuSettings OptionSettings; -extern MenuDescriptorList MenuDescriptors; - -#define CURSORSPACE (14 * CleanXfac_1) - -//============================================================================= -// -// -// -//============================================================================= - -struct FMenuRect -{ - int x, y; - int width, height; - - void set(int _x, int _y, int _w, int _h) - { - x = _x; - y = _y; - width = _w; - height = _h; - } - - bool inside(int _x, int _y) - { - return _x >= x && _x < x+width && _y >= y && _y < y+height; - } - -}; - - -class DMenu -{ -protected: - bool mMouseCapture; - bool mBackbuttonSelected; - -public: - enum - { - MOUSE_Click, - MOUSE_Move, - MOUSE_Release - }; - - enum - { - BACKBUTTON_TIME = 4*MENU_TICRATE - }; - - static bool InMenu; - - DMenu *mParentMenu; - DVector2 origin = { 0,0 }; - int scriptID = INT_MAX; - bool canAnimate = false; - bool isAnimated = false; // set to true when uncapped frame rate is needed. - - DMenu(DMenu *parent = NULL); - virtual ~DMenu() = default; - virtual bool Responder (event_t *ev); - virtual bool MenuEvent (int mkey, bool fromcontroller); - virtual void Ticker (); - virtual void PreDraw() {} - virtual void PostDraw() {} - virtual void Drawer (); - virtual bool DimAllowed (); - virtual bool TranslateKeyboardEvents(); - virtual void Close(); - virtual bool MouseEvent(int type, int x, int y); - virtual void Destroy() {} - bool IsAnimated() const { return isAnimated; } - bool MouseEventBack(int type, int x, int y); - void SetCapture(); - void ReleaseCapture(); - void SetOrigin(); - bool HasCapture() - { - return mMouseCapture; - } -}; - -//============================================================================= -// -// base class for menu items -// -//============================================================================= - -class DListMenu; - -class FListMenuItem -{ -protected: - int mXpos, mYpos; - int mHeight; - FName mAction; - -public: - bool mEnabled, mHidden; - - FListMenuItem(int xpos = 0, int ypos = 0, FName action = NAME_None) - { - mXpos = xpos; - mYpos = ypos; - mAction = action; - mEnabled = true; - mHidden = false; - } - - virtual ~FListMenuItem(); - - virtual bool CheckCoordinate(int x, int y); - virtual void Ticker(); - virtual void Drawer(DListMenu *menu, const DVector2& origin, bool selected); - virtual bool Selectable(); - virtual bool Activate(FName caller); - virtual FName GetAction(int *pparam); - virtual bool SetString(int i, const char *s); - virtual bool GetString(int i, char *s, int len); - virtual bool SetValue(int i, int value); - virtual bool GetValue(int i, int *pvalue); - virtual void Enable(bool on); - virtual bool MenuEvent (int mkey, bool fromcontroller); - virtual bool MouseEvent(int type, int x, int y); - virtual bool CheckHotkey(int c); - virtual int GetWidth(); - virtual void DrawSelector(int xofs, int yofs, FGameTexture *tex); - void OffsetPositionY(int ydelta) { mYpos += ydelta; } - int GetY() { return mYpos; } - int GetX() { return mXpos; } - void SetX(int x) { mXpos = x; } - void SetY(int x) { mYpos = x; } - void SetHeight(int x) { mHeight = x; } - void SetAction(FName action) { mAction = action; } -}; - -class FListMenuItemStaticPatch : public FListMenuItem -{ -protected: - FGameTexture *mTexture; - bool mCentered; - -public: - FListMenuItemStaticPatch(int x, int y, FGameTexture *patch, bool centered); - void Drawer(DListMenu* menu, const DVector2& origin, bool selected); -}; - -class FListMenuItemStaticText : public FListMenuItem -{ -protected: - const char *mText; - FFont *mFont; - EColorRange mColor; - bool mCentered; - -public: - FListMenuItemStaticText(int x, int y, const char *text, FFont *font, EColorRange color, bool centered); - ~FListMenuItemStaticText(); - void Drawer(DListMenu* menu, const DVector2& origin, bool selected) override; -}; - -class FListMenuItemNativeStaticText : public FListMenuItem -{ -protected: - FString mText; - int mFontnum; - int mPalnum; - bool mCentered; - -public: - FListMenuItemNativeStaticText(int x, int y, const FString & text, int fontnum, int palnum, bool centered); - void Drawer(DListMenu* menu, const DVector2& origin, bool selected) override; -}; - -//============================================================================= -// -// selectable items -// -//============================================================================= - -class FListMenuItemSelectable : public FListMenuItem -{ -protected: - int mHotkey; - int mParam; - -public: - FListMenuItemSelectable(int x, int y, int height, FName childmenu, int mParam = -1); - bool CheckCoordinate(int x, int y) override; - bool Selectable() override; - bool CheckHotkey(int c) override; - bool Activate(FName caller) override; - bool MouseEvent(int type, int x, int y) override; - FName GetAction(int *pparam) override; -}; - -class FListMenuItemText : public FListMenuItemSelectable -{ - FString mText; - FFont *mFont; - EColorRange mColor; - EColorRange mColorSelected; -public: - FListMenuItemText(int x, int y, int height, int hotkey, const FString &text, FFont *font, EColorRange color, EColorRange color2, FName child, int param = 0); - ~FListMenuItemText(); - void Drawer(DListMenu* menu, const DVector2& origin, bool selected) override; - int GetWidth() override; -}; - -class FListMenuItemNativeText : public FListMenuItemSelectable -{ - // This draws the item with the game frontend's native text drawer and uses a front end defined font, it takes only symbolic constants as parameters. - FString mText; - int mFontnum; - int mPalnum; - float mFontscale; -public: - FListMenuItemNativeText(int x, int y, int height, int hotkey, const FString& text, int fontnum, int palnum, float fontscale, FName child, int param = 0); - ~FListMenuItemNativeText(); - void Drawer(DListMenu* menu, const DVector2& origin, bool selected) override; - int GetWidth() override; - void DrawSelector(int xofs, int yofs, FGameTexture* tex) override { } // The text drawer handles this itself. -}; - - -class FListMenuItemPatch : public FListMenuItemSelectable -{ - FGameTexture* mTexture; -public: - FListMenuItemPatch(int x, int y, int height, int hotkey, FGameTexture* patch, FName child, int param = 0); - void Drawer(DListMenu* menu, const DVector2& origin, bool selected) override; - int GetWidth() override; -}; - -//============================================================================= -// -// list menu class runs a menu described by a FListMenuDescriptor -// -//============================================================================= - -class DListMenu : public DMenu -{ - typedef DMenu Super; -protected: - FListMenuDescriptor *mDesc = nullptr; - FListMenuItem *mFocusControl = nullptr; - -public: - DListMenu(DMenu *parent = NULL, FListMenuDescriptor *desc = NULL); - virtual void Init(DMenu *parent = NULL, FListMenuDescriptor *desc = NULL); - FListMenuItem *GetItem(FName name); - bool Responder (event_t *ev) override; - bool MenuEvent (int mkey, bool fromcontroller) override; - bool MouseEvent(int type, int x, int y) override; - void Ticker () override; - void Drawer () override; - void PreDraw() override; - virtual void SelectionChanged() {} - void SetFocus(FListMenuItem *fc) - { - mFocusControl = fc; - } - bool CheckFocus(FListMenuItem *fc) - { - return mFocusControl == fc; - } - void ReleaseFocus() - { - mFocusControl = NULL; - } - const FListMenuDescriptor* Descriptor() const - { - return mDesc; - } -}; - - -//============================================================================= -// -// base class for menu items -// -//============================================================================= - -class FOptionMenuItem : public FListMenuItem -{ -protected: - FString mLabel; - bool mCentered = false; - - void drawText(int x, int y, int color, const char * text, bool grayed = false); - - int drawLabel(int indent, int y, EColorRange color, bool grayed = false); - void drawValue(int indent, int y, int color, const char *text, bool grayed = false); - - int CursorSpace(); - - -public: - - FOptionMenuItem(const char *text, FName action = NAME_None, bool center = false) - : FListMenuItem(0, 0, action) - { - mLabel = text; - mCentered = center; - } - - ~FOptionMenuItem(); - virtual int Draw(FOptionMenuDescriptor *desc, int y, int indent, bool selected); - virtual bool Selectable(); - virtual int GetIndent(); - virtual bool MouseEvent(int type, int x, int y); -}; - -//============================================================================= -// -// -// -//============================================================================= -struct FOptionValues -{ - struct Pair - { - double Value; - FString TextValue; - FString Text; - }; - - TArray mValues; -}; - -typedef TMap< FName, FOptionValues* > FOptionMap; - -extern FOptionMap OptionValues; - - -//============================================================================= -// -// Option menu class runs a menu described by a FOptionMenuDescriptor -// -//============================================================================= - -class DOptionMenu : public DMenu -{ - using Super = DMenu; - bool CanScrollUp; - bool CanScrollDown; - int VisBottom; - FOptionMenuItem *mFocusControl; - -protected: - FOptionMenuDescriptor *mDesc; - - int GetPosition(); - -public: - FOptionMenuItem *GetItem(FName name); - DOptionMenu(DMenu *parent = NULL, FOptionMenuDescriptor *desc = NULL); - virtual void Init(DMenu *parent = NULL, FOptionMenuDescriptor *desc = NULL); - int FirstSelectable(); - bool Responder (event_t *ev); - bool MenuEvent (int mkey, bool fromcontroller); - bool MouseEvent(int type, int x, int y); - void Ticker (); - void Drawer (); - virtual int GetIndent(); - const FOptionMenuDescriptor *GetDescriptor() const { return mDesc; } - void SetFocus(FOptionMenuItem *fc) - { - mFocusControl = fc; - } - bool CheckFocus(FOptionMenuItem *fc) - { - return mFocusControl == fc; - } - void ReleaseFocus() - { - mFocusControl = NULL; - } -}; - -FFont *OptionFont(); -int OptionHeight(); -int OptionWidth(const char * s); -void DrawOptionText(int x, int y, int color, const char *text, bool grayed = false); - -//============================================================================= -// -// ImageScroller -// -//============================================================================= -class ImageScreen; - -class DImageScrollerMenu : public DMenu -{ - DMenu* mCurrent = nullptr; - FImageScrollerDescriptor* mDesc = nullptr; - int index = 0; - MenuTransition pageTransition = {}; - -protected: - virtual ImageScreen* newImageScreen(FImageScrollerDescriptor::ScrollerItem* desc); - -public: - void Init(DMenu* parent = nullptr, FImageScrollerDescriptor* desc = nullptr); - bool MenuEvent(int mkey, bool fromcontroller); - bool MouseEvent(int type, int x, int y); - void Ticker(); - void Drawer(); -}; - -//============================================================================= -// -// Input some text -// -//============================================================================= - -class DTextEnterMenu : public DMenu -{ - using Super = DMenu; - - FString mEnterString; - int mEnterSize; - bool mInputGridOkay; - int InputGridX; - int InputGridY; - int CursorSize; - bool AllowColors; - FFont *displayFont; - - - void AppendChar(int ch); - -public: - - // [TP] Added allowcolors - DTextEnterMenu(DMenu *parent, FFont *dpf, FString textbuffer, int maxlen, bool showgrid, bool allowcolors = false); - - void Drawer (); - bool MenuEvent (int mkey, bool fromcontroller); - bool Responder(event_t *ev); - bool TranslateKeyboardEvents(); - bool MouseEvent(int type, int x, int y); - const char* GetText() { return mEnterString.GetChars(); } - -}; - -//============================================================================= -// -// Show a fullscreen image / centered text screen for an image scroller -// -//============================================================================= - -class ImageScreen : public DMenu -{ -protected: - const FImageScrollerDescriptor::ScrollerItem* mDesc; -public: - ImageScreen(const FImageScrollerDescriptor::ScrollerItem* it) - { - mDesc = it; - } - void Drawer() override; -}; - - - -struct event_t; -void M_EnableMenu (bool on) ; -bool M_Responder (event_t *ev); -void M_Ticker (void); -void M_Drawer (void); -void M_PreviousMenu(); -void M_Init (void); -void M_CreateMenus(); -void M_ActivateMenu(DMenu *menu); -void M_ClearMenus (bool final = false); -void M_ParseMenuDefs(); -void M_StartupSkillMenu(FNewGameStartup *gs); -int M_GetDefaultSkill(); -void M_StartControlPanel (bool makeSound); -bool M_SetMenu(FName menu, int param = -1, FName callingMenu = NAME_None); -void M_NotifyNewSave (const char *file, const char *title, bool okForQuicksave); -void M_StartMessage(const char *message, int messagemode, int scriptId, FName action = NAME_None); -void M_UnhideCustomMenu(int menu, int itemmask); -void M_MenuSound(EMenuSounds snd); -void M_Autosave(); -bool M_Active(); -void M_DeinitMenus(); -void M_UnpauseSound(); - - -void I_SetMouseCapture(); -void I_ReleaseMouseCapture(); - -struct MenuClassDescriptor; -extern TArray menuClasses; - -using hFunc = std::function; -DMenu* CreateMessageBoxMenu(DMenu* parent, const char* message, int messagemode, int scriptID, bool playsound, FName action = NAME_None, hFunc handler = nullptr); - - -struct MenuClassDescriptor -{ - FName mName; - MenuClassDescriptor(const char* name) : mName(name) - { - //menuClasses.Push(this); - } - - virtual DMenu* CreateNew() = 0; -}; - -template struct TMenuClassDescriptor : public MenuClassDescriptor -{ - TMenuClassDescriptor(const char* name) : MenuClassDescriptor(name) - {} - DMenu* CreateNew() - { - return new Menu; - } -}; - - -struct FSavegameManager -{ -private: - TArray SaveGames; - FSaveGameNode NewSaveNode; - int LastSaved = -1; - int LastAccessed = -1; - TArray SavePicData; - FGameTexture *SavePic = nullptr; - -public: - int WindowSize = 0; - FString SaveCommentString; - FSaveGameNode *quickSaveSlot = nullptr; - ~FSavegameManager(); - -private: - int InsertSaveNode(FSaveGameNode *node); -public: - void NotifyNewSave(const FString &file, const FString &title, bool okForQuicksave, bool forceQuicksave); - void ClearSaveGames(); - - void ReadSaveStrings(); - void UnloadSaveData(); - - int RemoveSaveSlot(int index); - void LoadSavegame(int Selected); - void DoSave(int Selected, const char *savegamestring); - unsigned ExtractSaveData(int index); - void ClearSaveStuff(); - bool DrawSavePic(int x, int y, int w, int h); - void DrawSaveComment(FFont *font, int cr, int x, int y, int scalefactor); - void SetFileInfo(int Selected); - unsigned SavegameCount(); - FSaveGameNode *GetSavegame(int i); - void InsertNewSaveNode(); - bool RemoveNewSaveNode(); - - void LoadGame(FSaveGameNode* node); - void SaveGame(FSaveGameNode* node, bool ok4q, bool forceq); - -}; - -extern FSavegameManager savegameManager; -extern DMenu* CurrentMenu; - -bool M_IsAnimated(); - - -#endif diff --git a/source/core/menu/menudef.cpp b/source/core/menu/menudef.cpp deleted file mode 100644 index bd0e551ee..000000000 --- a/source/core/menu/menudef.cpp +++ /dev/null @@ -1,1560 +0,0 @@ -/* -** menudef.cpp -** MENUDEF parser amd menu generation code -** -**--------------------------------------------------------------------------- -** Copyright 2010 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 "menu.h" -#include "c_dispatch.h" -#include "filesystem.h" -#include "sc_man.h" -#include "v_font.h" -#include "c_bind.h" -#include "d_event.h" -#include "d_gui.h" -#include "printf.h" -#include "gamecontrol.h" -#include "cmdlib.h" -#include "c_cvars.h" -#include "optionmenuitems.h" -#include "i_soundfont.h" -#include "zstring.h" -#include "texturemanager.h" -#include "v_video.h" -#include - -// Menu-relevant content that gets filled in by scripts. This will get processed after the game has loaded. -FString gSkillNames[MAXSKILLS]; -FString gVolumeNames[MAXVOLUMES]; -FString gVolumeSubtitles[MAXVOLUMES]; -int32_t gVolumeFlags[MAXVOLUMES]; -int gDefaultVolume = 0, gDefaultSkill = 1; -MenuGameplayStemEntry g_MenuGameplayEntries[MAXMENUGAMEPLAYENTRIES]; - -MenuDescriptorList MenuDescriptors; -static FListMenuDescriptor DefaultListMenuSettings; // contains common settings for all list menus -static FOptionMenuDescriptor DefaultOptionMenuSettings; // contains common settings for all Option menus -FOptionMenuSettings OptionSettings; -FOptionMap OptionValues; - -void I_BuildMIDIMenuList(FOptionValues* opt); -void I_BuildALDeviceList(FOptionValues *opt); -void I_BuildALResamplersList(FOptionValues* opt); - -bool IsOpenALPresent(); - -void M_DeinitMenus() -{ - { - MenuDescriptorList::Iterator it(MenuDescriptors); - - MenuDescriptorList::Pair *pair; - - while (it.NextPair(pair)) - { - delete pair->Value; - pair->Value = NULL; - } - } - - { - FOptionMap::Iterator it(OptionValues); - - FOptionMap::Pair *pair; - - while (it.NextPair(pair)) - { - delete pair->Value; - pair->Value = NULL; - } - } - MenuDescriptors.Clear(); - OptionValues.Clear(); - - CurrentMenu = NULL; - DefaultListMenuSettings.mItems.Clear(); -} - -static FGameTexture* GetMenuTexture(const char* const name) -{ - auto texid = TexMan.CheckForTexture(name, ETextureType::Any); - if (!texid.isValid()) - { - Printf("Missing menu texture: \"%s\"\n", name); - } - - return TexMan.GetGameTexture(texid); -} - -//============================================================================= -// -// -// -//============================================================================= - -static void SkipSubBlock(FScanner &sc) -{ - sc.MustGetStringName("{"); - int depth = 1; - while (depth > 0) - { - sc.MustGetString(); - if (sc.Compare("{")) depth++; - if (sc.Compare("}")) depth--; - } -} - -//============================================================================= -// -// -// -//============================================================================= - -struct gamefilter -{ - const char* gamename; - int gameflag; -}; - -static const gamefilter games[] = { - { "Duke", GAMEFLAG_DUKE}, - { "Nam", GAMEFLAG_NAM|GAMEFLAG_NAPALM}, - { "NamOnly", GAMEFLAG_NAM}, // for cases where the difference matters. - { "Napalm", GAMEFLAG_NAPALM}, - { "WW2GI", GAMEFLAG_WW2GI}, - { "Redneck", GAMEFLAG_RR}, - { "RedneckRides", GAMEFLAG_RRRA}, - { "Deer", GAMEFLAG_DEER}, - { "Blood", GAMEFLAG_BLOOD}, - { "ShadowWarrior", GAMEFLAG_SW}, - { "Exhumed", GAMEFLAG_POWERSLAVE|GAMEFLAG_EXHUMED}, - { "Worldtour", GAMEFLAG_WORLDTOUR}, -}; - -// for other parts that need to filter by game name. -bool validFilter(const char *str) -{ - for (auto &gf : games) - { - if (g_gameType & gf.gameflag) - { - if (!stricmp(str, gf.gamename)) return true; - } - } - return false; -} - - -static bool CheckSkipGameBlock(FScanner &sc, bool negate = false) -{ - int filter = 0; - sc.MustGetStringName("("); - do - { - sc.MustGetString(); - int gi = sc.MustMatchString(&games[0].gamename, sizeof(games[0])); - - filter |= games[gi].gameflag; - } - while (sc.CheckString(",")); - if (negate) filter = ~filter; - sc.MustGetStringName(")"); - if (!(filter & g_gameType)) - { - SkipSubBlock(sc); - return !sc.CheckString("else"); - } - return false; -} - -//============================================================================= -// -// -// -//============================================================================= - -static bool CheckSkipOptionBlock(FScanner &sc) -{ - bool filter = false; - sc.MustGetStringName("("); - do - { - sc.MustGetString(); - if (sc.Compare("Windows")) - { - #ifdef _WIN32 - filter = true; - #endif - } - else if (sc.Compare("unix")) - { - #ifdef __unix__ - filter = true; - #endif - } - else if (sc.Compare("Mac")) - { - #ifdef __APPLE__ - filter = true; - #endif - } - - if (sc.Compare("openal")) - { - if (IsOpenALPresent()) - filter = true; - } - } - while (sc.CheckString(",")); - sc.MustGetStringName(")"); - if (!filter) - { - SkipSubBlock(sc); - return !sc.CheckString("else"); - } - return false; -} - -//============================================================================= -// -// -// -//============================================================================= - -static bool CheckSkipNoSwBlock(FScanner& sc) -{ - sc.MustGetStringName("("); - sc.MustGetString(); - bool res = sc.Compare("true"); - sc.MustGetStringName(")"); - if ((!(g_gameType & GAMEFLAG_SHAREWARE)) == res) - { - SkipSubBlock(sc); - return !sc.CheckString("else"); - } - return false; -} - -//============================================================================= -// -// -// -//============================================================================= - -static void ParseListMenuBody(FScanner &sc, FListMenuDescriptor *desc) -{ - sc.MustGetStringName("{"); - while (!sc.CheckString("}")) - { - sc.MustGetString(); - if (sc.Compare("else")) - { - SkipSubBlock(sc); - } - else if (sc.Compare("ifgame")) - { - if (!CheckSkipGameBlock(sc)) - { - // recursively parse sub-block - ParseListMenuBody(sc, desc); - } - } - else if (sc.Compare("ifnotgame")) - { - if (!CheckSkipGameBlock(sc, true)) - { - // recursively parse sub-block - ParseListMenuBody(sc, desc); - } - } - else if (sc.Compare("ifoption")) - { - if (!CheckSkipOptionBlock(sc)) - { - // recursively parse sub-block - ParseListMenuBody(sc, desc); - } - } - else if (sc.Compare("ifshareware")) - { - if (!CheckSkipNoSwBlock(sc)) - { - // recursively parse sub-block - ParseListMenuBody(sc, desc); - } - } - else if (sc.Compare("Class")) - { - sc.MustGetString(); - FString s = sc.String; - s.Substitute("$", gi->Name()); - desc->mClass = s; - } - else if (sc.Compare("Selector")) - { - sc.MustGetString(); - desc->mSelector = GetMenuTexture(sc.String); - sc.MustGetStringName(","); - sc.MustGetNumber(); - desc->mSelectOfsX = sc.Number; - sc.MustGetStringName(","); - sc.MustGetNumber(); - desc->mSelectOfsY = sc.Number; - } - else if (sc.Compare("Linespacing")) - { - sc.MustGetNumber(); - desc->mLinespacing = sc.Number; - } - else if (sc.Compare("Position")) - { - sc.MustGetNumber(); - desc->mXpos = sc.Number; - sc.MustGetStringName(","); - sc.MustGetNumber(); - desc->mYpos = sc.Number; - if (sc.CheckString(",")) - { - sc.MustGetNumber(); - desc->mYbotton = sc.Number; - } - } - else if (sc.Compare("Centermenu")) - { - desc->mFlags |= LMF_Centered; - } - else if (sc.Compare("animatedtransition")) - { - desc->mFlags |= LMF_Animate; - } - else if (sc.Compare("Fixedspacing")) - { - sc.MustGetNumber(); - desc->mSpacing = sc.Number; - } - else if (sc.Compare("MouseWindow")) - { - sc.MustGetNumber(); - desc->mWLeft = sc.Number; - sc.MustGetStringName(","); - sc.MustGetNumber(); - desc->mWRight = sc.Number; - } - else if (sc.Compare("StaticPatch") || sc.Compare("StaticPatchCentered")) - { - bool centered = sc.Compare("StaticPatchCentered"); - sc.MustGetNumber(); - int x = sc.Number; - sc.MustGetStringName(","); - sc.MustGetNumber(); - int y = sc.Number; - sc.MustGetStringName(","); - sc.MustGetString(); - auto tex = GetMenuTexture(sc.String); - - FListMenuItem *it = new FListMenuItemStaticPatch(x, y, tex, centered); - desc->mItems.Push(it); - } - else if (sc.Compare("ScriptId")) - { - sc.MustGetNumber(); - desc->mScriptId = sc.Number; - } - else if (sc.Compare("Caption")) - { - sc.MustGetString(); - desc->mCaption = sc.String; - } - else if (sc.Compare("StaticText") || sc.Compare("StaticTextCentered")) - { - bool centered = sc.Compare("StaticTextCentered"); - sc.MustGetNumber(); - int x = sc.Number; - sc.MustGetStringName(","); - sc.MustGetNumber(); - int y = sc.Number; - sc.MustGetStringName(","); - sc.MustGetString(); - FListMenuItem *it = new FListMenuItemStaticText(x, y, sc.String, desc->mFont, desc->mFontColor, centered); - desc->mItems.Push(it); - } - else if (sc.Compare("PatchItem")) - { - sc.MustGetString(); - auto tex = GetMenuTexture(sc.String); - sc.MustGetStringName(","); - sc.MustGetString(); - int hotkey = sc.String[0]; - sc.MustGetStringName(","); - sc.MustGetString(); - FName action = sc.String; - int param = 0; - if (sc.CheckString(",")) - { - sc.MustGetNumber(); - param = sc.Number; - } - - FListMenuItem *it = new FListMenuItemPatch(desc->mXpos, desc->mYpos, desc->mLinespacing, hotkey, tex, action, param); - desc->mItems.Push(it); - desc->mYpos += desc->mLinespacing; - if (desc->mSelectedItem == -1) desc->mSelectedItem = desc->mItems.Size()-1; - } - else if (sc.Compare("TextItem")) - { - sc.MustGetString(); - FString text = sc.String; - sc.MustGetStringName(","); - sc.MustGetString(); - int hotkey = sc.String[0]; - sc.MustGetStringName(","); - sc.MustGetString(); - FName action = sc.String; - int param = 0; - if (sc.CheckString(",")) - { - sc.MustGetNumber(); - param = sc.Number; - } - - FListMenuItem *it = new FListMenuItemText(desc->mXpos, desc->mYpos, desc->mLinespacing, hotkey, text, desc->mFont, desc->mFontColor, desc->mFontColor2, action, param); - desc->mItems.Push(it); - desc->mYpos += desc->mLinespacing; - if (desc->mSelectedItem == -1) desc->mSelectedItem = desc->mItems.Size()-1; - - } - else if (sc.Compare("NativeTextItem")) - { - sc.MustGetString(); - FString text = sc.String; - sc.MustGetStringName(","); - sc.MustGetString(); - int hotkey = sc.String[0]; - sc.MustGetStringName(","); - sc.MustGetString(); - FName action = sc.String; - int param = 0; - if (sc.CheckString(",")) - { - sc.MustGetNumber(); - param = sc.Number; - } - - auto it = new FListMenuItemNativeText(desc->mXpos, desc->mYpos, desc->mLinespacing, hotkey, text, desc->mNativeFontNum, desc->mNativePalNum, desc->mNativeFontScale, action, param); - desc->mItems.Push(it); - desc->mYpos += desc->mLinespacing; - if (desc->mSelectedItem == -1) desc->mSelectedItem = desc->mItems.Size() - 1; - - } - else if (sc.Compare("Font")) - { - sc.MustGetString(); - FFont* newfont = V_GetFont(sc.String); - if (newfont != NULL) desc->mFont = newfont; - if (sc.CheckString(",")) - { - sc.MustGetString(); - desc->mFontColor2 = desc->mFontColor = V_FindFontColor((FName)sc.String); - if (sc.CheckString(",")) - { - sc.MustGetString(); - desc->mFontColor2 = V_FindFontColor((FName)sc.String); - } - } - else - { - desc->mFontColor = OptionSettings.mFontColor; - desc->mFontColor2 = OptionSettings.mFontColorValue; - } - } - else if (sc.Compare("NetgameMessage")) - { - sc.MustGetString(); - desc->mNetgameMessage = sc.String; - } - else - { - sc.ScriptError("Unknown keyword '%s'", sc.String); - } - } -} - -//============================================================================= -// -// -// -//============================================================================= - -static bool CheckCompatible(FMenuDescriptor *newd, FMenuDescriptor *oldd) -{ - /*if (oldd->mClass == NULL)*/ return true; - //return oldd->mClass == newd->mClass; -} - -static bool ReplaceMenu(FScanner &sc, FMenuDescriptor *desc) -{ - FMenuDescriptor **pOld = MenuDescriptors.CheckKey(desc->mMenuName); - if (pOld != NULL && *pOld != NULL) - { - if (CheckCompatible(desc, *pOld)) - { - delete *pOld; - } - else - { - sc.ScriptMessage("Tried to replace menu '%s' with a menu of different type", desc->mMenuName.GetChars()); - return true; - } - } - MenuDescriptors[desc->mMenuName] = desc; - return false; -} - -//============================================================================= -// -// -// -//============================================================================= - -static void ParseListMenu(FScanner &sc) -{ - sc.MustGetString(); - - FListMenuDescriptor *desc = new FListMenuDescriptor; - desc->mType = MDESC_ListMenu; - desc->mMenuName = sc.String; - desc->mSelectedItem = -1; - desc->mAutoselect = -1; - desc->mSelectOfsX = DefaultListMenuSettings.mSelectOfsX; - desc->mSelectOfsY = DefaultListMenuSettings.mSelectOfsY; - desc->mSelector = DefaultListMenuSettings.mSelector; - desc->mDisplayTop = DefaultListMenuSettings.mDisplayTop; - desc->mXpos = DefaultListMenuSettings.mXpos; - desc->mYpos = DefaultListMenuSettings.mYpos; - desc->mLinespacing = DefaultListMenuSettings.mLinespacing; - desc->mNetgameMessage = DefaultListMenuSettings.mNetgameMessage; - desc->mFont = DefaultListMenuSettings.mFont; - desc->mFontColor = DefaultListMenuSettings.mFontColor; - desc->mFontColor2 = DefaultListMenuSettings.mFontColor2; - desc->mClass = NULL; - desc->mRedirect = NULL; - desc->mWLeft = 0; - desc->mWRight = 0; - - ParseListMenuBody(sc, desc); - bool scratch = ReplaceMenu(sc, desc); - if (scratch) delete desc; -} - -//============================================================================= -// -// -// -//============================================================================= - -static void ParseImageScrollerBody(FScanner &sc, FImageScrollerDescriptor *desc) -{ - sc.MustGetStringName("{"); - while (!sc.CheckString("}")) - { - sc.MustGetString(); - if (sc.Compare("else")) - { - SkipSubBlock(sc); - } - else if (sc.Compare("ifgame")) - { - if (!CheckSkipGameBlock(sc)) - { - // recursively parse sub-block - ParseImageScrollerBody(sc, desc); - } - } - else if (sc.Compare("ifnotgame")) - { - if (!CheckSkipGameBlock(sc, true)) - { - // recursively parse sub-block - ParseImageScrollerBody(sc, desc); - } - } - else if (sc.Compare("ifshareware")) - { - if (!CheckSkipNoSwBlock(sc)) - { - // recursively parse sub-block - ParseImageScrollerBody(sc, desc); - } - } - else if (sc.Compare("ifoption")) - { - if (!CheckSkipOptionBlock(sc)) - { - // recursively parse sub-block - ParseImageScrollerBody(sc, desc); - } - } - else if (sc.Compare("Class")) - { - sc.MustGetString(); - FString s = sc.String; - s.Substitute("$", gi->Name()); - desc->mClass = s; - } - else if (sc.Compare("TextItem") || sc.Compare("ImageItem")) - { - FImageScrollerDescriptor::ScrollerItem item; - int type = sc.Compare("TextItem"); - sc.MustGetString(); - item.text = strbin1(sc.String); - if (type) - { - sc.MustGetStringName(","); - sc.MustGetNumber(); - item.type = sc.Number; // y-coordinate - } - else item.type = 0; - item.scriptID = INT_MAX; - if (sc.CheckString(",")) - { - sc.MustGetNumber(); - item.scriptID = sc.Number; - } - desc->mItems.Push(item); - } - else if (sc.Compare("qavanimationitem")) - { - if (!(g_gameType & GAMEFLAG_BLOOD)) - { - I_Error("QAV animations not available!"); // these (currently) only exist in Blood. - } - FImageScrollerDescriptor::ScrollerItem item; - sc.GetString(); - item.text = sc.String; - item.type = -1; - item.scriptID = INT_MAX; - desc->mItems.Push(item); - } - else if (sc.Compare("animatedtransition")) - { - desc->mFlags |= LMF_Animate; - } - else - { - sc.ScriptError("Unknown keyword '%s'", sc.String); - } - } -} - - -//============================================================================= -// -// -// -//============================================================================= - -static void ParseImageScroller(FScanner &sc) -{ - sc.MustGetString(); - - FImageScrollerDescriptor *desc = new FImageScrollerDescriptor; - desc->mType = MDESC_ImageScroller; - desc->mMenuName = sc.String; - desc->mClass = NAME_None; - - ParseImageScrollerBody(sc, desc); - bool scratch = ReplaceMenu(sc, desc); - if (scratch) delete desc; -} - -//============================================================================= -// -// -// -//============================================================================= - -static void ParseOptionValue(FScanner &sc) -{ - FName optname; - - FOptionValues *val = new FOptionValues; - sc.MustGetString(); - optname = sc.String; - sc.MustGetStringName("{"); - while (!sc.CheckString("}")) - { - FOptionValues::Pair &pair = val->mValues[val->mValues.Reserve(1)]; - sc.MustGetFloat(); - pair.Value = sc.Float; - sc.MustGetStringName(","); - sc.MustGetString(); - pair.Text = strbin1(sc.String); - } - FOptionValues **pOld = OptionValues.CheckKey(optname); - if (pOld != NULL && *pOld != NULL) - { - delete *pOld; - } - OptionValues[optname] = val; -} - - -//============================================================================= -// -// -// -//============================================================================= - -static void ParseOptionString(FScanner &sc) -{ - FName optname; - - FOptionValues *val = new FOptionValues; - sc.MustGetString(); - optname = sc.String; - sc.MustGetStringName("{"); - while (!sc.CheckString("}")) - { - FOptionValues::Pair &pair = val->mValues[val->mValues.Reserve(1)]; - sc.MustGetString(); - pair.Value = DBL_MAX; - pair.TextValue = sc.String; - sc.MustGetStringName(","); - sc.MustGetString(); - pair.Text = strbin1(sc.String); - } - FOptionValues **pOld = OptionValues.CheckKey(optname); - if (pOld != NULL && *pOld != NULL) - { - delete *pOld; - } - OptionValues[optname] = val; -} - - -//============================================================================= -// -// -// -//============================================================================= - -static void ParseOptionSettings(FScanner &sc) -{ - sc.MustGetStringName("{"); - while (!sc.CheckString("}")) - { - sc.MustGetString(); - if (sc.Compare("else")) - { - SkipSubBlock(sc); - } - else if (sc.Compare("ifgame")) - { - if (!CheckSkipGameBlock(sc)) - { - // recursively parse sub-block - ParseOptionSettings(sc); - } - } - else if (sc.Compare("ifnotgame")) - { - if (!CheckSkipGameBlock(sc, true)) - { - // recursively parse sub-block - ParseOptionSettings(sc); - } - } - else if (sc.Compare("Linespacing")) - { - sc.MustGetNumber(); - OptionSettings.mLinespacing = sc.Number; - } - else if (sc.Compare("LabelOffset")) - { - sc.MustGetNumber(); - // ignored - } - else - { - sc.ScriptError("Unknown keyword '%s'", sc.String); - } - } -} - -//============================================================================= -// -// -// -//============================================================================= - -static void ParseOptionMenuBody(FScanner &sc, FOptionMenuDescriptor *desc) -{ - sc.MustGetStringName("{"); - while (!sc.CheckString("}")) - { - sc.MustGetString(); - if (sc.Compare("else")) - { - SkipSubBlock(sc); - } - else if (sc.Compare("ifgame")) - { - if (!CheckSkipGameBlock(sc)) - { - // recursively parse sub-block - ParseOptionMenuBody(sc, desc); - } - } - else if (sc.Compare("ifnotgame")) - { - if (!CheckSkipGameBlock(sc, true)) - { - // recursively parse sub-block - ParseOptionMenuBody(sc, desc); - } - } - else if (sc.Compare("ifshareware")) - { - if (!CheckSkipNoSwBlock(sc)) - { - // recursively parse sub-block - ParseOptionMenuBody(sc, desc); - } - } - else if (sc.Compare("ifoption")) - { - if (!CheckSkipOptionBlock(sc)) - { - // recursively parse sub-block - ParseOptionMenuBody(sc, desc); - } - } - else if (sc.Compare("Class")) - { - sc.MustGetString(); - FString s = sc.String; - s.Substitute("$", gi->Name()); - desc->mClass = s; - } - else if (sc.Compare("Title") || sc.Compare("Caption")) - { - sc.MustGetString(); - desc->mTitle = sc.String; - } - else if (sc.Compare("Position")) - { - sc.MustGetNumber(); - desc->mPosition = sc.Number; - } - else if (sc.Compare("DefaultSelection")) - { - sc.MustGetNumber(); - desc->mSelectedItem = sc.Number; - } - else if (sc.Compare("ScrollTop")) - { - sc.MustGetNumber(); - desc->mScrollTop = sc.Number; - } - else if (sc.Compare("Indent")) - { - sc.MustGetNumber(); - desc->mIndent = sc.Number; - } - else if (sc.Compare("Submenu")) - { - sc.MustGetString(); - FString label = sc.String; - sc.MustGetStringName(","); - sc.MustGetString(); - FOptionMenuItem *it = new FOptionMenuItemSubmenu(label, sc.String); - desc->mItems.Push(it); - } - else if (sc.Compare("LabeledSubmenu")) - { - sc.MustGetString(); - FString label = sc.String; - sc.MustGetStringName(","); - sc.MustGetString(); - auto cvar = FindCVar(sc.String, nullptr); - sc.MustGetStringName(","); - sc.MustGetString(); - FOptionMenuItem* it = new FOptionMenuItemLabeledSubmenu(label, cvar, sc.String); - desc->mItems.Push(it); - } - else if (sc.Compare("Option")) - { - sc.MustGetString(); - FString label = sc.String; - sc.MustGetStringName(","); - sc.MustGetString(); - FString cvar = sc.String; - sc.MustGetStringName(","); - sc.MustGetString(); - FString values = sc.String; - FString check; - int center = 0; - if (sc.CheckString(",")) - { - sc.MustGetString(); - if (*sc.String != 0) check = sc.String; - if (sc.CheckString(",")) - { - sc.MustGetNumber(); - center = sc.Number; - } - } - FOptionMenuItem *it = new FOptionMenuItemOption(label, cvar, values, check, center); - desc->mItems.Push(it); - } - else if (sc.Compare("Command")) - { - sc.MustGetString(); - FString label = sc.String; - sc.MustGetStringName(","); - sc.MustGetString(); - FOptionMenuItem *it = new FOptionMenuItemCommand(label, sc.String); - desc->mItems.Push(it); - } - else if (sc.Compare("SafeCommand")) - { - sc.MustGetString(); - FString label = sc.String; - sc.MustGetStringName(","); - sc.MustGetString(); - FOptionMenuItem *it = new FOptionMenuItemSafeCommand(label, sc.String); - desc->mItems.Push(it); - } - else if (sc.Compare("Control") || sc.Compare("MapControl")) - { - bool map = sc.Compare("MapControl"); - sc.MustGetString(); - FString label = sc.String; - sc.MustGetStringName(","); - sc.MustGetString(); - FOptionMenuItem *it = new FOptionMenuItemControl(label, sc.String, map? &AutomapBindings : &Bindings); - desc->mItems.Push(it); - } - else if (sc.Compare("StaticText")) - { - sc.MustGetString(); - FString label = sc.String; - EColorRange cr = OptionSettings.mFontColorHeader; - if (sc.CheckString(",")) - { - sc.MustGetNumber(); - cr = sc.Number? OptionSettings.mFontColorHeader : OptionSettings.mFontColor; // fixme! - } - FOptionMenuItem *it = new FOptionMenuItemStaticText(label, cr); - desc->mItems.Push(it); - } - else if (sc.Compare("StaticTextSwitchable")) - { - sc.MustGetString(); - FString label = sc.String; - sc.MustGetStringName(","); - sc.MustGetString(); - FString label2 = sc.String; - sc.MustGetStringName(","); - sc.MustGetString(); - FName action = sc.String; - EColorRange cr = OptionSettings.mFontColorHeader; - if (sc.CheckString(",")) - { - sc.MustGetNumber(); - cr = sc.Number ? OptionSettings.mFontColorHeader : OptionSettings.mFontColor; // fixme! - } - FOptionMenuItem *it = new FOptionMenuItemStaticTextSwitchable(label, label2, action, cr); - desc->mItems.Push(it); - } - else if (sc.Compare("Slider")) - { - sc.MustGetString(); - FString text = sc.String; - sc.MustGetStringName(","); - sc.MustGetString(); - FString action = sc.String; - sc.MustGetStringName(","); - sc.MustGetFloat(); - double min = sc.Float; - sc.MustGetStringName(","); - sc.MustGetFloat(); - double max = sc.Float; - sc.MustGetStringName(","); - sc.MustGetFloat(); - double step = sc.Float; - int showvalue = 1; - if (sc.CheckString(",")) - { - sc.MustGetNumber(); - showvalue = sc.Number; - } - FOptionMenuItem *it = new FOptionMenuSliderCVar(text, action, min, max, step, showvalue); - desc->mItems.Push(it); - } - // [TP] -- Text input widget - else if ( sc.Compare( "TextField" )) - { - sc.MustGetString(); - FString label = sc.String; - sc.MustGetStringName( "," ); - sc.MustGetString(); - FString cvar = sc.String; - FString check; - - if ( sc.CheckString( "," )) - { - sc.MustGetString(); - check = sc.String; - } - - FOptionMenuItem* it = new FOptionMenuTextField( label, cvar, check ); - desc->mItems.Push( it ); - } - // [TP] -- Number input widget - else if ( sc.Compare( "NumberField" )) - { - sc.MustGetString(); - FString label = sc.String; - sc.MustGetStringName( "," ); - sc.MustGetString(); - FString cvar = sc.String; - float minimum = 0.0f; - float maximum = 100.0f; - float step = 1.0f; - FString check; - - if ( sc.CheckString( "," )) - { - sc.MustGetFloat(); - minimum = (float) sc.Float; - sc.MustGetStringName( "," ); - sc.MustGetFloat(); - maximum = (float) sc.Float; - - if ( sc.CheckString( "," )) - { - sc.MustGetFloat(); - step = (float) sc.Float; - - if ( sc.CheckString( "," )) - { - sc.MustGetString(); - check = sc.String; - } - } - } - - FOptionMenuItem* it = new FOptionMenuNumberField( label, cvar, - minimum, maximum, step, check ); - desc->mItems.Push( it ); - } - else - { - sc.ScriptError("Unknown keyword '%s'", sc.String); - } - } -} - -//============================================================================= -// -// -// -//============================================================================= - -static void ParseOptionMenu(FScanner &sc) -{ - sc.MustGetString(); - - FOptionMenuDescriptor *desc = new FOptionMenuDescriptor; - desc->mType = MDESC_OptionsMenu; - desc->mMenuName = sc.String; - desc->mSelectedItem = -1; - desc->mScrollPos = 0; - desc->mClass = NULL; - desc->mPosition = DefaultOptionMenuSettings.mPosition; - desc->mScrollTop = DefaultOptionMenuSettings.mScrollTop; - desc->mIndent = DefaultOptionMenuSettings.mIndent; - desc->mDontDim = DefaultOptionMenuSettings.mDontDim; - - ParseOptionMenuBody(sc, desc); - bool scratch = ReplaceMenu(sc, desc); - if (scratch) delete desc; -} - - -//============================================================================= -// -// -// -//============================================================================= - -void M_ParseMenuDefs() -{ - int lump, lastlump = 0; - - //OptionSettings.mTitleColor = CR_RED;// V_FindFontColor(gameinfo.mTitleColor); - OptionSettings.mFontColor = CR_RED; - OptionSettings.mFontColorValue = CR_GRAY; - OptionSettings.mFontColorMore = CR_GRAY; - OptionSettings.mFontColorHeader = CR_GOLD; - OptionSettings.mFontColorHighlight = CR_YELLOW; - OptionSettings.mFontColorSelection = CR_BRICK; - - if (g_gameType & (GAMEFLAG_NAM | GAMEFLAG_NAPALM | GAMEFLAG_WW2GI)) - { - OptionSettings.mFontColor = CR_DARKGREEN; - OptionSettings.mFontColorHeader = CR_DARKGRAY; - OptionSettings.mFontColorHighlight = CR_WHITE; - OptionSettings.mFontColorSelection = CR_DARKGREEN; - } - else if (g_gameType & GAMEFLAG_BLOOD) - { - OptionSettings.mFontColorHeader = CR_DARKGRAY; - OptionSettings.mFontColorHighlight = CR_WHITE; - OptionSettings.mFontColorSelection = CR_DARKRED; - } - else if (g_gameType & GAMEFLAG_RRALL) - { - OptionSettings.mFontColor = CR_BROWN; - OptionSettings.mFontColorHeader = CR_DARKBROWN; - OptionSettings.mFontColorHighlight = CR_ORANGE; - OptionSettings.mFontColorSelection = CR_TAN; - } - else if (g_gameType & GAMEFLAG_SW) - { - OptionSettings.mFontColorHeader = CR_DARKRED; - OptionSettings.mFontColorHighlight = CR_WHITE; - } - - DefaultListMenuSettings.Reset(); - DefaultOptionMenuSettings.Reset(); - - M_DeinitMenus(); - while ((lump = fileSystem.FindLumpFullName("engine/menudef.txt", &lastlump)) != -1) - { - FScanner sc(lump); - - sc.SetCMode(true); - while (sc.GetString()) - { - if (sc.Compare("LISTMENU")) - { - ParseListMenu(sc); - } - else if (sc.Compare("ImageScroller")) - { - ParseImageScroller(sc); - } - else if (sc.Compare("DEFAULTLISTMENU")) - { - ParseListMenuBody(sc, &DefaultListMenuSettings); - if (DefaultListMenuSettings.mItems.Size() > 0) - { - I_Error("You cannot add menu items to the menu default settings."); - } - } - else if (sc.Compare("OPTIONVALUE")) - { - ParseOptionValue(sc); - } - else if (sc.Compare("OPTIONSTRING")) - { - ParseOptionString(sc); - } - else if (sc.Compare("OPTIONMENUSETTINGS")) - { - ParseOptionSettings(sc); - } - else if (sc.Compare("OPTIONMENU")) - { - ParseOptionMenu(sc); - } - else if (sc.Compare("DEFAULTOPTIONMENU")) - { - ParseOptionMenuBody(sc, &DefaultOptionMenuSettings); - if (DefaultOptionMenuSettings.mItems.Size() > 0) - { - I_Error("You cannot add menu items to the menu default settings."); - } - } - else - { - sc.ScriptError("Unknown keyword '%s'", sc.String); - } - } - } -} - - -//============================================================================= -// -// Unlocks a custom menu from a script -// -//============================================================================= - -void M_UnhideCustomMenu(int menu, int iSet) -{ - FName menuname = FName(ENamedName(NAME_CustomSubMenu1 + menu)); - auto desc = MenuDescriptors.CheckKey(menuname); - if (desc != NULL && (*desc)->mType == MDESC_ListMenu) - { - FListMenuDescriptor* ld = static_cast(*desc); - for (unsigned int b = 0; b < MAXMENUGAMEPLAYENTRIES; ++b) - { - if (b >= ld->mItems.Size()) return; - if (iSet & (1u << b)) - { - ld->mItems[b]->mHidden = false; - ld->mItems[b]->mEnabled = true; - } - } - } -} - -//============================================================================= -// -// Creates the episode menu -// -//============================================================================= - -static void BuildEpisodeMenu() -{ - // Build episode menu - int addedVolumes = 0; - FMenuDescriptor **desc = MenuDescriptors.CheckKey(NAME_Episodemenu); - if (desc != NULL && (*desc)->mType == MDESC_ListMenu) - { - FListMenuDescriptor *ld = static_cast(*desc); - ld->mSelectedItem = gDefaultVolume; - int y = ld->mYpos; - - for (int i = 0; i < MAXVOLUMES; i++) - { - if (gVolumeNames[i].IsNotEmpty() && !(gVolumeFlags[i] & EF_HIDEFROMSP)) - - { - auto it = new FListMenuItemNativeText(ld->mXpos, y, ld->mLinespacing, gVolumeNames[i][0], gVolumeNames[i], NIT_BigFont, NIT_ActiveState, 1, NAME_Skillmenu, i); - if ((g_gameType & GAMEFLAG_DUKE) && (g_gameType & GAMEFLAG_SHAREWARE) && i > 0) - { - it->mEnabled = false; - } - y += ld->mLinespacing; - ld->mItems.Push(it); - addedVolumes++; - if (gVolumeSubtitles[i].IsNotEmpty()) - { - auto it = new FListMenuItemNativeStaticText(ld->mXpos, y, gVolumeSubtitles[i], NIT_SmallFont, NIT_ActiveState, false); - y += ld->mLinespacing * 6 / 10; - ld->mItems.Push(it); - } - } - } -#if 0 // this needs to be backed by a working selection menu, until that gets done it must be disabled. - if (!(g_gameType & GAMEFLAG_SHAREWARE)) - { - //auto it = new FListMenuItemNativeStaticText(ld->mXpos, "", NIT_SmallFont); // empty entry as spacer. - //ld->mItems.Push(it); - - y += ld->mLinespacing / 3; - auto it = new FListMenuItemNativeText(ld->mXpos, y, ld->mLineSpacing, 0, "$MNU_USERMAP", NIT_BigFont, NIT_ActiveState, 1, NAME_UsermapMenu); - ld->mItems.Push(it); - addedVolumes++; - } -#endif - if (addedVolumes == 1) - { - ld->mAutoselect = 0; - } - } - - // Build skill menu - int addedSkills = 0; - desc = MenuDescriptors.CheckKey(NAME_Skillmenu); - if (desc != NULL && (*desc)->mType == MDESC_ListMenu) - { - FListMenuDescriptor* ld = static_cast(*desc); - ld->mSelectedItem = gDefaultSkill; - int y = ld->mYpos; - - for (int i = 0; i < MAXSKILLS; i++) - { - if (gSkillNames[i].IsNotEmpty()) - { - auto it = new FListMenuItemNativeText(ld->mXpos, y, ld->mLinespacing, gSkillNames[i][0], gSkillNames[i], NIT_BigFont, NIT_ActiveState, 1, NAME_Startgame, i); - y += ld->mLinespacing; - ld->mItems.Push(it); - addedSkills++; - } - } - if (addedSkills == 0) - { - // Need to add one item with the default skill so that the menu does not break. - auto it = new FListMenuItemNativeText(ld->mXpos, 0, ld->mLinespacing, 0, "", NIT_BigFont, NIT_ActiveState, 1, NAME_Startgame, gDefaultSkill); - ld->mItems.Push(it); - } - if (addedSkills == 1) - { - ld->mAutoselect = 0; - } - } - - if (g_MenuGameplayEntries[0].entry.isValid()) - { - int e = 0; - FMenuDescriptor** desc = MenuDescriptors.CheckKey("CustomGameMenu"); - if (desc != NULL && (*desc)->mType == MDESC_ListMenu) - { - FListMenuDescriptor* ldo = static_cast(*desc); - - for (MenuGameplayStemEntry const& stem : g_MenuGameplayEntries) - { - MenuGameplayEntry const& entry = stem.entry; - if (!entry.isValid()) - break; - - int s = 0; - FMenuDescriptor** sdesc = MenuDescriptors.CheckKey(FName(FStringf("CustomSubMenu%d", e+1))); - if (sdesc != NULL && (*sdesc)->mType == MDESC_ListMenu) - { - FListMenuDescriptor* ld = static_cast(*sdesc); - ld->mCaption = entry.name; - - for (MenuGameplayEntry const& subentry : stem.subentries) - { - if (!subentry.isValid()) - break; - - auto li = new FListMenuItemNativeText(ld->mXpos, 0, ld->mLinespacing, 0, subentry.name, NIT_BigFont, NIT_ActiveColor, 1.f, subentry.flags & MGE_UserContent ? NAME_UsermapMenu : NAME_Skillmenu); - - if (subentry.flags & MGE_Locked) li->mEnabled = false; - if (subentry.flags & MGE_Hidden) li->mHidden = true; - ld->mItems.Push(li); - ++s; - } - } - FName link = entry.flags & MGE_UserContent ? NAME_UsermapMenu : s == 0 ? NAME_Skillmenu : NAME_CustomSubMenu1; - - auto li = new FListMenuItemNativeText(ldo->mXpos, 0, ldo->mLinespacing, 0, entry.name, NIT_BigFont, NIT_ActiveColor, 1.f, link, e); - if (entry.flags & MGE_Locked) li->mEnabled = false; - if (entry.flags & MGE_Hidden) li->mHidden = true; - ldo->mItems.Push(li); - e++; - } - } - if (e > 0) - { - for (auto name : { NAME_Mainmenu, NAME_IngameMenu }) - { - FMenuDescriptor** desc = MenuDescriptors.CheckKey(name); - if (desc != NULL && (*desc)->mType == MDESC_ListMenu) - { - FListMenuDescriptor* ld = static_cast(*desc); - auto li = ld->mItems[0]; - if (li->GetAction(nullptr) == NAME_Episodemenu) - { - li->SetAction(NAME_CustomGameMenu); - } - } - } - } - } -} - -//============================================================================= -// -// Reads any XHAIRS lumps for the names of crosshairs and -// adds them to the display options menu. -// -//============================================================================= - -static void InitCrosshairsList() -{ - int lastlump, lump; - - lastlump = 0; - - FOptionValues **opt = OptionValues.CheckKey(NAME_Crosshairs); - if (opt == NULL) - { - return; // no crosshair value list present. No need to go on. - } - - FOptionValues::Pair *pair = &(*opt)->mValues[(*opt)->mValues.Reserve(1)]; - pair->Value = 0; - pair->Text = "None"; - - while ((lump = fileSystem.FindLump("XHAIRS", &lastlump)) != -1) - { - FScanner sc(lump); - while (sc.GetNumber()) - { - FOptionValues::Pair value; - value.Value = sc.Number; - sc.MustGetString(); - value.Text = sc.String; - if (value.Value != 0) - { // Check if it already exists. If not, add it. - unsigned int i; - - for (i = 1; i < (*opt)->mValues.Size(); ++i) - { - if ((*opt)->mValues[i].Value == value.Value) - { - break; - } - } - if (i < (*opt)->mValues.Size()) - { - (*opt)->mValues[i].Text = value.Text; - } - else - { - (*opt)->mValues.Push(value); - } - } - } - } -} - -//============================================================================= -// -// Initialize the music configuration submenus -// -//============================================================================= -extern "C" -{ - extern int adl_getBanksCount(); - extern const char* const* adl_getBankNames(); -} - -static void InitMusicMenus() -{ - FMenuDescriptor** advmenu = MenuDescriptors.CheckKey(NAME_AdvSoundOptions); - auto soundfonts = sfmanager.GetList(); - std::tuple sfmenus[] = { - std::make_tuple("FluidPatchsetMenu", SF_SF2, "fluid_patchset") }; - - for (auto& p : sfmenus) - { - FMenuDescriptor** menu = MenuDescriptors.CheckKey(std::get<0>(p)); - - if (menu != nullptr) - { - if (soundfonts.Size() > 0) - { - for (auto& entry : soundfonts) - { - if (entry.type & std::get<1>(p)) - { - FString display = entry.mName; - display.ReplaceChars("_", ' '); - auto it = new FOptionMenuItemCommand (display, FStringf("%s \"%s\"", std::get<2>(p), entry.mName.GetChars())/*, true*/); - static_cast(*menu)->mItems.Push(it); - } - } - } - else if (advmenu != nullptr) - { - // Remove the item for this submenu - auto d = static_cast(*advmenu); - auto it = d->GetItem(std::get<0>(p)); - if (it != nullptr) d->mItems.Delete(d->mItems.Find(it)); - } - } - } -} - -//============================================================================= -// -// Special menus will be created once all engine data is loaded -// -//============================================================================= - -void M_CreateMenus() -{ - BuildEpisodeMenu(); - InitCrosshairsList(); - InitMusicMenus(); - - FOptionValues** opt = OptionValues.CheckKey(NAME_Mididevices); - if (opt != nullptr) - { - I_BuildMIDIMenuList(*opt); - } -#ifndef NO_OPENAL - opt = OptionValues.CheckKey(NAME_Aldevices); - if (opt != nullptr) - { - I_BuildALDeviceList(*opt); - } - opt = OptionValues.CheckKey(NAME_Alresamplers); - if (opt != nullptr) - { - I_BuildALResamplersList(*opt); - } -#endif // !NO_OPENAL -} - -//============================================================================= -// -// Returns the default skill level. -// -//============================================================================= - -int M_GetDefaultSkill() -{ - return gDefaultSkill; -} - -void FListMenuDescriptor::Reset() -{ - // Reset the default settings (ignore all other values in the struct) - mSelectOfsX = 0; - mSelectOfsY = 0; - mSelector = nullptr; - mDisplayTop = 0; - mXpos = 0; - mYpos = 0; - mLinespacing = 0; - mNetgameMessage = ""; - mFont = NULL; - mFontColor = CR_UNTRANSLATED; - mFontColor2 = CR_UNTRANSLATED; - mScriptId = -1; - mSecondaryId = 0; - mNativeFontNum = NIT_BigFont; - mNativePalNum = NIT_ActiveColor; - mNativeFontScale = 1.f; - mFlags = 0; - mSpacing = 0; -} diff --git a/source/core/menu/menuinput.cpp b/source/core/menu/menuinput.cpp deleted file mode 100644 index 44a5e9a61..000000000 --- a/source/core/menu/menuinput.cpp +++ /dev/null @@ -1,374 +0,0 @@ -/* -** menuinput.cpp -** The string input code -** -**--------------------------------------------------------------------------- -** Copyright 2001-2010 Randy Heit -** Copyright 2010 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 "menu.h" -#include "c_cvars.h" -#include "d_event.h" -#include "d_gui.h" -#include "v_font.h" -#include "v_text.h" -#include "v_draw.h" -#include "v_video.h" - -#define INPUTGRID_WIDTH 13 -#define INPUTGRID_HEIGHT 5 - -// Heretic and Hexen do not, by default, come with glyphs for all of these -// characters. Oh well. Doom and Strife do. -static const char InputGridChars[INPUTGRID_WIDTH * INPUTGRID_HEIGHT] = - "ABCDEFGHIJKLM" - "NOPQRSTUVWXYZ" - "0123456789+-=" - ".,!?@'\":;[]()" - "<>^#$%&*/_ \b"; - - -CVAR(Bool, m_showinputgrid, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) - -//============================================================================= -// -// -// -//============================================================================= - -// [TP] Added allowcolors -DTextEnterMenu::DTextEnterMenu(DMenu *parent, FFont *dpf, FString textbuffer, int maxlen, bool showgrid, bool allowcolors) -: DMenu(parent) -{ - mEnterString = textbuffer; - mEnterSize = maxlen; - mInputGridOkay = (showgrid && (m_showinputgrid == 0)) || (m_showinputgrid >= 1); - if (mEnterString.Len() > 0) - { - InputGridX = INPUTGRID_WIDTH - 1; - InputGridY = INPUTGRID_HEIGHT - 1; - } - else - { - // If we are naming a new save, don't start the cursor on "end". - InputGridX = 0; - InputGridY = 0; - } - AllowColors = allowcolors; // [TP] - displayFont = dpf; - CursorSize = displayFont->StringWidth(displayFont->GetCursor()); -} - -//============================================================================= -// -// -// -//============================================================================= - -bool DTextEnterMenu::TranslateKeyboardEvents() -{ - return mInputGridOkay; -} - -//============================================================================= -// -// -// -//============================================================================= - -bool DTextEnterMenu::Responder(event_t *ev) -{ - if (ev->type == EV_GUI_Event) - { - // Save game and player name string input - if (ev->subtype == EV_GUI_Char) - { - mInputGridOkay = false; - AppendChar(ev->data1); - return true; - } - char ch = (char)ev->data1; - if ((ev->subtype == EV_GUI_KeyDown || ev->subtype == EV_GUI_KeyRepeat) && ch == '\b') - { - if (mEnterString.Len() > 0) - { - mEnterString.DeleteLastCharacter(); - } - } - else if (ev->subtype == EV_GUI_KeyDown) - { - if (ch == GK_ESCAPE) - { - DMenu *parent = mParentMenu; - parent->MenuEvent(MKEY_Abort, false); - Close(); - return true; - } - else if (ch == '\r') - { - if (mEnterString.Len() > 0) - { - // [TP] If we allow color codes, colorize the string now. - //if (AllowColors) - //mEnterString = mEnterString.Filter(); - - DMenu *parent = mParentMenu; - parent->MenuEvent(MKEY_Input, false); - Close(); - return true; - } - } - } - if (ev->subtype == EV_GUI_KeyDown || ev->subtype == EV_GUI_KeyRepeat) - { - return true; - } - } - return Super::Responder(ev); -} - -//============================================================================= -// -// -// -//============================================================================= - -bool DTextEnterMenu::MouseEvent(int type, int x, int y) -{ - const int cell_width = 18 * CleanXfac_1; - const int cell_height = 16 * CleanYfac_1; - const int screen_y = screen->GetHeight() - INPUTGRID_HEIGHT * cell_height; - const int screen_x = (screen->GetWidth() - INPUTGRID_WIDTH * cell_width) / 2; - - if (x >= screen_x && x < screen_x + INPUTGRID_WIDTH * cell_width && y >= screen_y) - { - InputGridX = (x - screen_x) / cell_width; - InputGridY = (y - screen_y) / cell_height; - if (type == DMenu::MOUSE_Release) - { - if (MenuEvent(MKEY_Enter, true)) - { - //M_MenuSound(CursorSound); - if (m_use_mouse == 2) InputGridX = InputGridY = -1; - } - } - return true; - } - else - { - InputGridX = InputGridY = -1; - } - return Super::MouseEvent(type, x, y); -} - -//============================================================================= -// -// -// -//============================================================================= - -void DTextEnterMenu::AppendChar(int ch) -{ - FStringf newstring("%s%c%c", mEnterString.GetChars(), ch, displayFont->GetCursor()); - if (mEnterSize < 0 || displayFont->StringWidth(newstring) < mEnterSize) - { - mEnterString.AppendCharacter(ch); - } -} - -//============================================================================= -// -// -// -//============================================================================= - -bool DTextEnterMenu::MenuEvent (int key, bool fromcontroller) -{ - if (key == MKEY_Back) - { - mParentMenu->MenuEvent(MKEY_Abort, false); - return Super::MenuEvent(key, fromcontroller); - } - if (fromcontroller) - { - mInputGridOkay = true; - } - - if (mInputGridOkay) - { - int ch; - - if (InputGridX == -1 || InputGridY == -1) - { - InputGridX = InputGridY = 0; - } - switch (key) - { - case MKEY_Down: - InputGridY = (InputGridY + 1) % INPUTGRID_HEIGHT; - return true; - - case MKEY_Up: - InputGridY = (InputGridY + INPUTGRID_HEIGHT - 1) % INPUTGRID_HEIGHT; - return true; - - case MKEY_Right: - InputGridX = (InputGridX + 1) % INPUTGRID_WIDTH; - return true; - - case MKEY_Left: - InputGridX = (InputGridX + INPUTGRID_WIDTH - 1) % INPUTGRID_WIDTH; - return true; - - case MKEY_Clear: - if (mEnterString.Len() > 0) - { - mEnterString.DeleteLastCharacter(); - } - return true; - - case MKEY_Enter: - assert(unsigned(InputGridX) < INPUTGRID_WIDTH && unsigned(InputGridY) < INPUTGRID_HEIGHT); - if (mInputGridOkay) - { - ch = InputGridChars[InputGridX + InputGridY * INPUTGRID_WIDTH]; - if (ch == 0) // end - { - if (mEnterString.Len() > 0) - { - DMenu *parent = mParentMenu; - parent->MenuEvent(MKEY_Input, false); - Close(); - return true; - } - } - else if (ch == '\b') // bs - { - if (mEnterString.Len() > 0) - { - mEnterString.DeleteLastCharacter(); - } - } - else - { - AppendChar(ch); - } - } - return true; - - default: - break; // Keep GCC quiet - } - } - return false; -} - -//============================================================================= -// -// -// -//============================================================================= - -void DTextEnterMenu::Drawer () -{ - mParentMenu->Drawer(); - if (mInputGridOkay) - { - const int cell_width = 18 * CleanXfac; - const int cell_height = 12 * CleanYfac; - const int top_padding = cell_height / 2 - displayFont->GetHeight() * CleanYfac / 2; - - // Darken the background behind the character grid. - // Unless we frame it with a border, I think it looks better to extend the - // background across the full width of the screen. - twod->AddColorOnlyQuad(0 /*screen->GetWidth()/2 - 13 * cell_width / 2*/, - screen->GetHeight() - INPUTGRID_HEIGHT * cell_height, - screen->GetWidth() /*13 * cell_width*/, - INPUTGRID_HEIGHT * cell_height, 0xc8000000); - - if (InputGridX >= 0 && InputGridY >= 0) - { - // Highlight the background behind the selected character. - twod->AddColorOnlyQuad( - InputGridX * cell_width - INPUTGRID_WIDTH * cell_width / 2 + screen->GetWidth() / 2, - InputGridY * cell_height - INPUTGRID_HEIGHT * cell_height + screen->GetHeight(), - cell_width, cell_height, PalEntry(255, 255, 248, 220)); - } - - for (int y = 0; y < INPUTGRID_HEIGHT; ++y) - { - const int yy = y * cell_height - INPUTGRID_HEIGHT * cell_height + screen->GetHeight(); - for (int x = 0; x < INPUTGRID_WIDTH; ++x) - { - int width; - const int xx = x * cell_width - INPUTGRID_WIDTH * cell_width / 2 + screen->GetWidth() / 2; - const int ch = InputGridChars[y * INPUTGRID_WIDTH + x]; - auto pic = displayFont->GetChar(ch, CR_DARKGRAY, &width); - EColorRange color; - int remap; - - // The highlighted character is yellow; the rest are dark gray. - color = (x == InputGridX && y == InputGridY) ? CR_YELLOW : CR_DARKGRAY; - remap = displayFont->GetColorTranslation(color); - - if (pic != NULL) - { - // Draw a normal character. - DrawTexture(twod, pic, xx + cell_width/2 - width*CleanXfac_1/2, yy + top_padding, - DTA_TranslationIndex, remap, - DTA_CleanNoMove_1, true, - TAG_DONE); - } - else if (ch == ' ') - { - // Draw the space as a box outline. We also draw it 50% wider than it really is. - const int x1 = xx + cell_width/2 - width * CleanXfac_1 * 3 / 4; - const int x2 = x1 + width * 3 * CleanXfac_1 / 2; - const int y1 = yy + top_padding; - const int y2 = y1 + displayFont->GetHeight() * CleanYfac_1; - auto palcolor = PalEntry(255, 160, 160, 160); - twod->AddColorOnlyQuad(x1, y1, x2 - x1, CleanYfac_1, palcolor); // top - twod->AddColorOnlyQuad(x1, y2, x2 - x1, CleanYfac_1, palcolor); // bottom - twod->AddColorOnlyQuad(x1, y1+CleanYfac_1, CleanXfac_1, y2 - y1, palcolor); // left - twod->AddColorOnlyQuad(x2-CleanXfac_1, y1+CleanYfac_1, CleanXfac_1, CleanYfac_1, palcolor); // right - } - else if (ch == '\b' || ch == 0) - { - // Draw the backspace and end "characters". - const char *const str = ch == '\b' ? "BS" : "ED"; - DrawText(twod, NewSmallFont, color, - xx + cell_width/2 - displayFont->StringWidth(str)*CleanXfac_1/2, - yy + top_padding, str, DTA_CleanNoMove_1, true, TAG_DONE); - } - } - } - } - Super::Drawer(); -} \ No newline at end of file diff --git a/source/core/menu/messagebox.cpp b/source/core/menu/messagebox.cpp deleted file mode 100644 index ddef3f5d9..000000000 --- a/source/core/menu/messagebox.cpp +++ /dev/null @@ -1,468 +0,0 @@ -/* -** messagebox.cpp -** Confirmation, notification screns -** -**--------------------------------------------------------------------------- -** Copyright 2010 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 "menu.h" -#include "d_event.h" -#include "d_gui.h" -#include "v_text.h" -#include "v_draw.h" -#include "gstrings.h" -#include "c_dispatch.h" -#include "statistics.h" -#include "v_2ddrawer.h" -#include "v_video.h" -#include "i_time.h" -#include "engineerrors.h" - -extern FSaveGameNode *quickSaveSlot; - - -void GameInterface::DrawCenteredTextScreen(const DVector2& origin, const char* text, int position, bool bg) -{ - double scale = SmallFontScale(); - int formatwidth = int(320 / scale); - auto lines = V_BreakLines(SmallFont, formatwidth, text, true); - auto fheight = bg? 10 : SmallFont->GetHeight()* scale; // Fixme: Get spacing for text pages from elsewhere. - if (!bg) - { - auto totaltextheight = lines.Size() * fheight; - position -= totaltextheight / 2; - } - - double y = origin.Y + position; - for (auto& line : lines) - { - double x = origin.X + 160 - line.Width * scale * 0.5; - DrawText(twod, SmallFont, CR_UNTRANSLATED, x, y, line.Text, DTA_FullscreenScale, FSMode_Fit320x200, DTA_ScaleX, scale, DTA_ScaleY, scale, TAG_DONE); - y += fheight; - } -} - -class DMessageBoxMenu : public DMenu -{ - using Super = DMenu; - FString mFullMessage; - TArray mMessage; - int mMessageMode; - int messageSelection; - int mMouseLeft, mMouseRight, mMouseY; - FName mAction; - std::function mActionFunc; - -public: - - DMessageBoxMenu(DMenu *parent = NULL, const char *message = NULL, int messagemode = 0, bool playsound = false, FName action = NAME_None, hFunc handler = nullptr); - void Destroy(); - void Init(DMenu *parent, const char *message, int messagemode, bool playsound = false); - void Drawer(); - bool Responder(event_t *ev); - bool MenuEvent(int mkey, bool fromcontroller); - bool MouseEvent(int type, int x, int y); - void CloseSound(); - virtual void HandleResult(bool res); -}; - - -//============================================================================= -// -// -// -//============================================================================= - -DMessageBoxMenu::DMessageBoxMenu(DMenu *parent, const char *message, int messagemode, bool playsound, FName action, hFunc handler) -: DMenu(parent) -{ - mAction = action; - mActionFunc = handler; - messageSelection = 0; - mMouseLeft = 140; - mMouseY = INT_MIN; - int mr1 = 170 + SmallFont->StringWidth(GStrings["TXT_YES"]); - int mr2 = 170 + SmallFont->StringWidth(GStrings["TXT_NO"]); - mMouseRight = std::max(mr1, mr2); - - Init(parent, message, messagemode, playsound); -} - -//============================================================================= -// -// -// -//============================================================================= - -void DMessageBoxMenu::Init(DMenu *parent, const char *message, int messagemode, bool playsound) -{ - mParentMenu = parent; - if (message != NULL) - { - mFullMessage = message; - mMessage = V_BreakLines(SmallFont, 300, GStrings.localize(message)); - } - mMessageMode = messagemode; - if (playsound) - { - //S_StopSound (CHAN_VOICE); - //S_Sound (CHAN_VOICE | CHANF_UI, "menu/prompt", snd_menuvolume, ATTN_NONE); - } -} - -//============================================================================= -// -// -// -//============================================================================= - -void DMessageBoxMenu::Destroy() -{ - mMessage.Reset(); -} - -//============================================================================= -// -// -// -//============================================================================= - -void DMessageBoxMenu::CloseSound() -{ - M_MenuSound(CurrentMenu ? BackSound : ::CloseSound); -} - -//============================================================================= -// -// -// -//============================================================================= - -void DMessageBoxMenu::HandleResult(bool res) -{ - if (mMessageMode == 0) - { - if (mActionFunc) - { - if (mActionFunc(res)) Close(); - } - else if (mAction == NAME_None && mParentMenu) - { - mParentMenu->MenuEvent(res ? MKEY_MBYes : MKEY_MBNo, false); - Close(); - } - else - { - Close(); - if (res) M_SetMenu(mAction, -1); - } - CloseSound(); - } -} - -//============================================================================= -// -// -// -//============================================================================= -CVAR(Bool, m_generic_messagebox, false, CVAR_ARCHIVE) - -void DMessageBoxMenu::Drawer() -{ - int y; - PalEntry fade = 0; - - int fontheight = SmallFont->GetHeight(); - //V_SetBorderNeedRefresh(); - //ST_SetNeedRefresh(); - - y = 100; - - if (m_generic_messagebox) - { - if (mMessage.Size()) - { - for (unsigned i = 0; i < mMessage.Size(); i++) - y -= SmallFont->GetHeight() / 2; - - for (unsigned i = 0; i < mMessage.Size(); i++) - { - DrawText(twod, SmallFont, CR_UNTRANSLATED, 160 - mMessage[i].Width / 2, y, mMessage[i].Text, - DTA_Clean, true, TAG_DONE); - y += fontheight; - } - } - - if (mMessageMode == 0) - { - y += fontheight; - mMouseY = y; - DrawText(twod, SmallFont, - messageSelection == 0 ? OptionSettings.mFontColorSelection : OptionSettings.mFontColor, - 160, y, GStrings["TXT_YES"], DTA_Clean, true, TAG_DONE); - DrawText(twod, SmallFont, - messageSelection == 1 ? OptionSettings.mFontColorSelection : OptionSettings.mFontColor, - 160, y + fontheight + 1, GStrings["TXT_NO"], DTA_Clean, true, TAG_DONE); - - if (messageSelection >= 0) - { - auto time = I_msTime() / 30; - if (((time >> 2) % 8) < 6) - { - DrawText(twod, SmallFont, OptionSettings.mFontColorSelection, - (150 - 160) * CleanXfac + screen->GetWidth() / 2, - (y + (fontheight + 1) * messageSelection - 100 + fontheight / 2 - 5) * CleanYfac + screen->GetHeight() / 2, - "\xd", - DTA_CellX, 8 * CleanXfac, - DTA_CellY, 8 * CleanYfac, - TAG_DONE); - } - } - } - } - else - { - twod->ClearScreen(0xa0000000); - gi->DrawCenteredTextScreen(origin, mFullMessage, 100, false); - } -} - -//============================================================================= -// -// -// -//============================================================================= - -bool DMessageBoxMenu::Responder(event_t *ev) -{ - if (ev->type == EV_GUI_Event && ev->subtype == EV_GUI_KeyDown) - { - if (mMessageMode == 0) - { - int ch = tolower(ev->data1); - if (ch == 'n' || ch == ' ') - { - HandleResult(false); - return true; - } - else if (ch == 'y') - { - HandleResult(true); - return true; - } - } - else - { - Close(); - return true; - } - return false; - } - else if (ev->type == EV_KeyDown) - { - Close(); - return true; - } - return Super::Responder(ev); -} - -//============================================================================= -// -// -// -//============================================================================= - -bool DMessageBoxMenu::MenuEvent(int mkey, bool fromcontroller) -{ - if (mMessageMode == 0) - { - if ((mkey == MKEY_Up || mkey == MKEY_Down) && m_generic_messagebox) - { - //S_Sound (CHAN_VOICE | CHANF_UI, "menu/cursor", snd_menuvolume, ATTN_NONE); - messageSelection = !messageSelection; - return true; - } - else if (mkey == MKEY_Enter) - { - // 0 is yes, 1 is no - HandleResult(!messageSelection); - return true; - } - else if (mkey == MKEY_Back) - { - HandleResult(false); - return true; - } - return false; - } - else - { - Close(); - CloseSound(); - return true; - } -} - -//============================================================================= -// -// -// -//============================================================================= - -bool DMessageBoxMenu::MouseEvent(int type, int x, int y) -{ - if (mMessageMode == 1 || m_generic_messagebox) - { - if (type == MOUSE_Click) - { - return MenuEvent(MKEY_Enter, true); - } - return false; - } - else - { - int sel = -1; - int fh = SmallFont->GetHeight() + 1; - - // convert x/y from screen to virtual coordinates, according to CleanX/Yfac use in DrawTexture - x = ((x - (screen->GetWidth() / 2)) / CleanXfac) + 160; - y = ((y - (screen->GetHeight() / 2)) / CleanYfac) + 100; - - if (x >= mMouseLeft && x <= mMouseRight && y >= mMouseY && y < mMouseY + 2 * fh) - { - sel = y >= mMouseY + fh; - } - if (sel != -1 && sel != messageSelection) - { - M_MenuSound(CursorSound); - } - messageSelection = sel; - if (type == MOUSE_Release) - { - return MenuEvent(MKEY_Enter, true); - } - return true; - } -} - -//============================================================================= -// -// -// -//============================================================================= - -//============================================================================= -// -// -// -//============================================================================= - -void M_StartMessage(const char *message, int messagemode, int scriptId, FName action) -{ - if (CurrentMenu == NULL) - { - // only play a sound if no menu was active before - M_StartControlPanel(menuactive == MENU_Off); - } - DMenu *newmenu = new DMessageBoxMenu(CurrentMenu, message, messagemode, false, action); - newmenu->mParentMenu = CurrentMenu; - newmenu->scriptID = scriptId; - M_ActivateMenu(newmenu); -} - - -//============================================================================= -// -// -// -//============================================================================= - -DMenu* CreateMessageBoxMenu(DMenu* parent, const char* message, int messagemode, int scriptId, bool playsound, FName action, hFunc handler) -{ - auto newmenu = new DMessageBoxMenu(CurrentMenu, message, messagemode, false, action, handler); - newmenu->scriptID = scriptId; - return newmenu; - -} - - -void ActivateEndGameMenu() -{ -} - -CCMD (menu_endgame) -{ // F7 - if (!gi->CanSave()) - { - return; - } - - M_StartControlPanel (true); - FString tempstring; - tempstring << GStrings("ENDGAME") << "\n\n" << GStrings("PRESSYN"); - DMenu* newmenu = CreateMessageBoxMenu(CurrentMenu, tempstring, 0, 501, false, NAME_None, [](bool res) - { - if (res) - { - STAT_Cancel(); - M_ClearMenus(); - gi->QuitToTitle(); - return false; - } - return true; - }); - - M_ActivateMenu(newmenu); -} - -//============================================================================= -// -// -// -//============================================================================= - -CCMD (menu_quit) -{ // F10 - - M_StartControlPanel (true); - - FString EndString; - EndString << GStrings("CONFIRM_QUITMSG") << "\n\n" << GStrings("PRESSYN"); - - DMenu *newmenu = CreateMessageBoxMenu(CurrentMenu, EndString, 0, 500, false, NAME_None, [](bool res) - { - if (res) gi->ExitFromMenu(); - return true; - }); - - M_ActivateMenu(newmenu); -} - - diff --git a/source/core/menu/optionmenu.cpp b/source/core/menu/optionmenu.cpp deleted file mode 100644 index acadaba78..000000000 --- a/source/core/menu/optionmenu.cpp +++ /dev/null @@ -1,569 +0,0 @@ -/* -** optionmenu.cpp -** Handler class for the option menus and associated items -** -**--------------------------------------------------------------------------- -** Copyright 2010 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 "cmdlib.h" -#include "gstrings.h" -#include "d_gui.h" -#include "d_event.h" -#include "c_dispatch.h" -#include "c_console.h" -#include "c_cvars.h" -#include "c_bind.h" -#include "gameconfigfile.h" -#include "menu.h" -#include "v_draw.h" -#include "v_2ddrawer.h" -#include "v_video.h" -#include "i_time.h" - -//============================================================================= -// -// Draws a string in the console font, scaled to the 8x8 cells -// used by the default console font. -// -//============================================================================= - -FFont *OptionFont() -{ - return NewSmallFont; -} - -int OptionHeight() -{ - return OptionFont()->GetHeight(); -} - -int OptionWidth(const char * s) -{ - return OptionFont()->StringWidth(s); -} - -void DrawOptionText(int x, int y, int color, const char *text, bool grayed) -{ - PalEntry overlay = grayed? PalEntry(96,48,0,0) : PalEntry(0,0,0); - DrawText (twod, OptionFont(), color, x, y, text, DTA_CleanNoMove_1, true, DTA_ColorOverlay, overlay, TAG_END); -} - -int DOptionMenu::GetPosition() -{ - return mDesc->mPosition * screen->GetHeight() * 2 / CleanYfac_1 / 1080; // y position uses a 1920x1080 screen as reference but has to adjust to scaled 320x200 content. -} - -//============================================================================= -// -// -// -//============================================================================= - -DOptionMenu::DOptionMenu(DMenu *parent, FOptionMenuDescriptor *desc) -: DMenu(parent) -{ - CanScrollUp = false; - CanScrollDown = false; - VisBottom = 0; - mFocusControl = NULL; - Init(parent, desc); -} - -//============================================================================= -// -// -// -//============================================================================= - -void DOptionMenu::Init(DMenu *parent, FOptionMenuDescriptor *desc) -{ - mParentMenu = parent; - mDesc = desc; - if (mDesc != NULL && mDesc->mSelectedItem == -1) mDesc->mSelectedItem = FirstSelectable(); - -} - -//============================================================================= -// -// -// -//============================================================================= - -int DOptionMenu::FirstSelectable() -{ - if (mDesc != NULL) - { - // Go down to the first selectable item - int i = -1; - do - { - i++; - } - while (i < (int)mDesc->mItems.Size() && !mDesc->mItems[i]->Selectable()); - if (i>=0 && i < (int)mDesc->mItems.Size()) return i; - } - return -1; -} - -//============================================================================= -// -// -// -//============================================================================= - -FOptionMenuItem *DOptionMenu::GetItem(FName name) -{ - for(unsigned i=0;imItems.Size(); i++) - { - FName nm = mDesc->mItems[i]->GetAction(NULL); - if (nm == name) return mDesc->mItems[i]; - } - return NULL; -} - -//============================================================================= -// -// -// -//============================================================================= - -bool DOptionMenu::Responder (event_t *ev) -{ - if (ev->type == EV_GUI_Event) - { - if (ev->subtype == EV_GUI_WheelUp) - { - int scrollamt = std::min(2, mDesc->mScrollPos); - mDesc->mScrollPos -= scrollamt; - return true; - } - else if (ev->subtype == EV_GUI_WheelDown) - { - if (CanScrollDown) - { - if (VisBottom < (int)(mDesc->mItems.Size()-2)) - { - mDesc->mScrollPos += 2; - VisBottom += 2; - } - else - { - mDesc->mScrollPos++; - VisBottom++; - } - } - return true; - } - } - return Super::Responder(ev); -} - -//============================================================================= -// -// -// -//============================================================================= - -bool DOptionMenu::MenuEvent (int mkey, bool fromcontroller) -{ - int startedAt = mDesc->mSelectedItem; - - switch (mkey) - { - case MKEY_Up: - if (mDesc->mSelectedItem == -1) - { - mDesc->mSelectedItem = FirstSelectable(); - break; - } - do - { - --mDesc->mSelectedItem; - - if (mDesc->mScrollPos > 0 && - mDesc->mSelectedItem <= mDesc->mScrollTop + mDesc->mScrollPos) - { - mDesc->mScrollPos = std::max(mDesc->mSelectedItem - mDesc->mScrollTop - 1, 0); - } - - if (mDesc->mSelectedItem < 0) - { - // Figure out how many lines of text fit on the menu - int y = GetPosition(); - - y *= CleanYfac_1; - int rowheight = OptionSettings.mLinespacing * CleanYfac_1; - int maxitems = (screen->GetHeight() - rowheight - y) / rowheight + 1; - - mDesc->mScrollPos = std::max(0, (int)mDesc->mItems.Size() - maxitems + mDesc->mScrollTop); - mDesc->mSelectedItem = mDesc->mItems.Size()-1; - } - } - while (!mDesc->mItems[mDesc->mSelectedItem]->Selectable() && mDesc->mSelectedItem != startedAt); - break; - - case MKEY_Down: - if (mDesc->mSelectedItem == -1) - { - mDesc->mSelectedItem = FirstSelectable(); - break; - } - do - { - ++mDesc->mSelectedItem; - - if (CanScrollDown && mDesc->mSelectedItem == VisBottom) - { - mDesc->mScrollPos++; - VisBottom++; - } - if (mDesc->mSelectedItem >= (int)mDesc->mItems.Size()) - { - if (startedAt == -1) - { - mDesc->mSelectedItem = -1; - mDesc->mScrollPos = -1; - break; - } - else - { - mDesc->mSelectedItem = 0; - mDesc->mScrollPos = 0; - } - } - } - while (!mDesc->mItems[mDesc->mSelectedItem]->Selectable() && mDesc->mSelectedItem != startedAt); - break; - - case MKEY_PageUp: - if (mDesc->mScrollPos > 0) - { - mDesc->mScrollPos -= VisBottom - mDesc->mScrollPos - mDesc->mScrollTop; - if (mDesc->mScrollPos < 0) - { - mDesc->mScrollPos = 0; - } - if (mDesc->mSelectedItem != -1) - { - mDesc->mSelectedItem = mDesc->mScrollTop + mDesc->mScrollPos + 1; - while (!mDesc->mItems[mDesc->mSelectedItem]->Selectable()) - { - if (++mDesc->mSelectedItem >= (int)mDesc->mItems.Size()) - { - mDesc->mSelectedItem = 0; - } - } - if (mDesc->mScrollPos > mDesc->mSelectedItem) - { - mDesc->mScrollPos = mDesc->mSelectedItem; - } - } - } - break; - - case MKEY_PageDown: - if (CanScrollDown) - { - int pagesize = VisBottom - mDesc->mScrollPos - mDesc->mScrollTop; - mDesc->mScrollPos += pagesize; - if (mDesc->mScrollPos + mDesc->mScrollTop + pagesize > (int)mDesc->mItems.Size()) - { - mDesc->mScrollPos = mDesc->mItems.Size() - mDesc->mScrollTop - pagesize; - } - if (mDesc->mSelectedItem != -1) - { - mDesc->mSelectedItem = mDesc->mScrollTop + mDesc->mScrollPos; - while (!mDesc->mItems[mDesc->mSelectedItem]->Selectable()) - { - if (++mDesc->mSelectedItem >= (int)mDesc->mItems.Size()) - { - mDesc->mSelectedItem = 0; - } - } - if (mDesc->mScrollPos > mDesc->mSelectedItem) - { - mDesc->mScrollPos = mDesc->mSelectedItem; - } - } - } - break; - - case MKEY_Enter: - if (mDesc->mSelectedItem >= 0 && mDesc->mItems[mDesc->mSelectedItem]->Activate(mDesc->mMenuName)) - { - return true; - } - // fall through to default - default: - if (mDesc->mSelectedItem >= 0 && - mDesc->mItems[mDesc->mSelectedItem]->MenuEvent(mkey, fromcontroller)) return true; - return Super::MenuEvent(mkey, fromcontroller); - } - - if (mDesc->mSelectedItem != startedAt) - { - M_MenuSound(CursorSound); - } - return true; -} - -//============================================================================= -// -// -// -//============================================================================= - -bool DOptionMenu::MouseEvent(int type, int x, int y) -{ - y = (y / CleanYfac_1) - mDesc->mDrawTop; - - if (mFocusControl) - { - mFocusControl->MouseEvent(type, x, y); - return true; - } - else - { - int yline = (y / OptionSettings.mLinespacing); - if (yline >= mDesc->mScrollTop) - { - yline += mDesc->mScrollPos; - } - if ((unsigned)yline < mDesc->mItems.Size() && mDesc->mItems[yline]->Selectable()) - { - if (yline != mDesc->mSelectedItem) - { - mDesc->mSelectedItem = yline; - //M_MenuSound(CursorSound); too noisy - - } - mDesc->mItems[yline]->MouseEvent(type, x, y); - return true; - } - } - mDesc->mSelectedItem = -1; - return Super::MouseEvent(type, x, y); -} - -//============================================================================= -// -// -// -//============================================================================= - -void DOptionMenu::Ticker () -{ - Super::Ticker(); - for(unsigned i=0;imItems.Size(); i++) - { - mDesc->mItems[i]->Ticker(); - } -} - -//============================================================================= -// -// -// -//============================================================================= -int DOptionMenu::GetIndent() -{ - int indent = std::max(0, (mDesc->mIndent + 40) - CleanWidth_1 / 2); - return screen->GetWidth() / 2 + indent * CleanXfac_1; -} - -void DOptionMenu::Drawer () -{ - int y = GetPosition(); - - if (mDesc->mTitle.IsNotEmpty()) - { - gi->DrawMenuCaption(origin, GStrings.localize(mDesc->mTitle)); - } - mDesc->mDrawTop = y; - int fontheight = OptionSettings.mLinespacing * CleanYfac_1; - y *= CleanYfac_1; - - int indent = GetIndent(); - - int ytop = y + mDesc->mScrollTop * 8 * CleanYfac_1; - int lastrow = screen->GetHeight() - OptionFont()->GetHeight() * CleanYfac_1; - - unsigned i; - for (i = 0; i < mDesc->mItems.Size() && y <= lastrow; i++, y += fontheight) - { - // Don't scroll the uppermost items - if ((int)i == mDesc->mScrollTop) - { - i += mDesc->mScrollPos; - if (i >= mDesc->mItems.Size()) break; // skipped beyond end of menu - } - bool isSelected = mDesc->mSelectedItem == (int)i; - int cur_indent = mDesc->mItems[i]->Draw(mDesc, y, indent, isSelected); - if (cur_indent >= 0 && isSelected && mDesc->mItems[i]->Selectable()) - { - auto time = I_msTime() / 30; - if ((((time>>2)%8) < 6) || CurrentMenu != this) - { - DrawOptionText(cur_indent + 3 * CleanXfac_1, y, OptionSettings.mFontColorSelection, "◄"); - //M_DrawConText(OptionSettings.mFontColorSelection, cur_indent + 3 * CleanXfac_1, y+fontheight-9*CleanYfac_1, "\xd"); - } - } - } - - CanScrollUp = (mDesc->mScrollPos > 0); - CanScrollDown = (i < mDesc->mItems.Size()); - VisBottom = i - 1; - - if (CanScrollUp) - { - DrawOptionText(screen->GetWidth() - 11 * CleanXfac_1, ytop, OptionSettings.mFontColorSelection, "▲"); - //M_DrawConText(CR_ORANGE, 3 * CleanXfac_1, ytop, "\x1a"); - } - if (CanScrollDown) - { - DrawOptionText(screen->GetWidth() - 11 * CleanXfac_1 , y - 8*CleanYfac_1, OptionSettings.mFontColorSelection, "▼"); - //M_DrawConText(CR_ORANGE, 3 * CleanXfac_1, y - 8*CleanYfac_1, "\x1b"); - } - Super::Drawer(); -} - - -//============================================================================= -// -// base class for menu items -// -//============================================================================= - -FOptionMenuItem::~FOptionMenuItem() -{ -} - -int FOptionMenuItem::Draw(FOptionMenuDescriptor *desc, int y, int indent, bool selected) -{ - return indent; -} - -bool FOptionMenuItem::Selectable() -{ - return true; -} - -bool FOptionMenuItem::MouseEvent(int type, int x, int y) -{ - if (Selectable() && type == DMenu::MOUSE_Release) - { - return CurrentMenu->MenuEvent(MKEY_Enter, true); - } - return false; -} - - -int FOptionMenuItem::GetIndent() -{ - if (mCentered) return 0; - if (screen->GetWidth() < 640) return screen->GetWidth() / 2; - return OptionWidth(GStrings.localize(mLabel)); -} - -void FOptionMenuItem::drawText(int x, int y, int color, const char * text, bool grayed) -{ - DrawOptionText(x, y, color, text, grayed); -} - -int FOptionMenuItem::drawLabel(int indent, int y, EColorRange color, bool grayed) -{ - const char *label = GStrings.localize(mLabel); - int x; - int w = OptionWidth(label) * CleanXfac_1; - if (!mCentered) x = indent - w; - else x = (screen->GetWidth() - w) / 2; - DrawOptionText(x, y, color, label, grayed); - return x; -} - -void FOptionMenuItem::drawValue(int indent, int y, int color, const char *text, bool grayed) -{ - DrawOptionText(indent + CursorSpace(), y, color, text, grayed); -} - -int FOptionMenuItem::CursorSpace() -{ - return (14 * CleanXfac_1); -} - -void FOptionMenuDescriptor::CalcIndent() -{ - // calculate the menu indent - int widest = 0, thiswidth; - - for (unsigned i = 0; i < mItems.Size(); i++) - { - thiswidth = mItems[i]->GetIndent(); - if (thiswidth > widest) widest = thiswidth; - } - mIndent = widest + 4; -} - -//============================================================================= -// -// -// -//============================================================================= - -FOptionMenuItem *FOptionMenuDescriptor::GetItem(FName name) -{ - for(unsigned i=0;iGetAction(NULL); - if (nm == name) return mItems[i]; - } - return NULL; -} - -class PlayerMenu : public DOptionMenu -{ - using Super = DOptionMenu; - -public: - void Drawer() - { - // Hack: The team item is #3. This part doesn't work properly yet. - gi->DrawPlayerSprite(origin, (mDesc->mSelectedItem == 3)); - Super::Drawer(); - } -}; - -static TMenuClassDescriptor _ppm("NewPlayerMenu"); - -void RegisterOptionMenus() -{ - menuClasses.Push(&_ppm); -} diff --git a/source/core/menu/optionmenuitems.h b/source/core/menu/optionmenuitems.h deleted file mode 100644 index 28d922cd3..000000000 --- a/source/core/menu/optionmenuitems.h +++ /dev/null @@ -1,1003 +0,0 @@ -/* -** optionmenuitems.h -** Control items for option menus -** -**--------------------------------------------------------------------------- -** Copyright 2010 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_text.h" -#include "v_draw.h" -#include "gstrings.h" -#include "v_font.h" -#include "cmdlib.h" -#include "templates.h" - - -void M_DrawConText (int color, int x, int y, const char *str); -void M_SetVideoMode(); - - - -//============================================================================= -// -// opens a submenu, action is a submenu name -// -//============================================================================= - -class FOptionMenuItemSubmenu : public FOptionMenuItem -{ - int mParam; -public: - FOptionMenuItemSubmenu(const char *label, const char *menu, int param = 0) - : FOptionMenuItem(label, menu) - { - mParam = param; - } - - int Draw(FOptionMenuDescriptor *desc, int y, int indent, bool selected) override - { - drawLabel(indent, y, selected? OptionSettings.mFontColorSelection : OptionSettings.mFontColorMore); - return indent; - } - - bool Activate(FName caller) override - { - M_MenuSound(CursorSound); - M_SetMenu(mAction, mParam, static_cast(CurrentMenu)->GetDescriptor()->mMenuName); - return true; - } -}; - - -//============================================================================= -// -// opens a submenu, command is a submenu name -// -//============================================================================= - -class FOptionMenuItemLabeledSubmenu : public FOptionMenuItemSubmenu -{ - FBaseCVar *mLabelCVar; -public: - FOptionMenuItemLabeledSubmenu(const char * label, FBaseCVar *labelcvar, FName command, int param = 0) - : FOptionMenuItemSubmenu(label, command.GetChars(), param) - { - mLabelCVar = labelcvar; - } - - int Draw(FOptionMenuDescriptor *desc, int y, int indent, bool selected) override - { - drawLabel(indent, y, selected? OptionSettings.mFontColorSelection : OptionSettings.mFontColor); - - auto text = mLabelCVar? mLabelCVar->GetHumanString() : ""; - if (text[0] == 0) text = GStrings("notset"); - drawValue(indent, y, OptionSettings.mFontColorValue, text); - return indent; - } -}; - - -//============================================================================= -// -// Executes a CCMD, action is a CCMD name -// -//============================================================================= - -class FOptionMenuItemCommand : public FOptionMenuItemSubmenu -{ -public: - FOptionMenuItemCommand(const char *label, const char *menu) - : FOptionMenuItemSubmenu(label, menu) - { - } - - bool Activate(FName caller) override - { - M_MenuSound(AdvanceSound); - C_DoCommand(mAction.GetChars()); - return true; - } - -}; - -//=============================================================================* -// -// Executes a CCMD after confirmation, action is a CCMD name -// -//============================================================================= - -class FOptionMenuItemSafeCommand : public FOptionMenuItemCommand -{ - // action is a CCMD - FString mPrompt; - int mScriptId; // shouldn't be used, but just in case. -public: - FOptionMenuItemSafeCommand(const char *label, const char *menu, const char *prompt = nullptr, int scriptid = INT_MAX) - : FOptionMenuItemCommand(label, menu) - { - mPrompt = prompt; - mScriptId = scriptid; - } - - bool MenuEvent (int mkey, bool fromcontroller) override - { - if (mkey == MKEY_MBYes) - { - C_DoCommand(mAction.GetChars()); - return true; - } - return FOptionMenuItemCommand::MenuEvent(mkey, fromcontroller); - } - - bool Activate(FName caller) override - { - FString msg; - msg << GStrings.localize(mPrompt.IsNotEmpty()? mPrompt.GetChars() : "$SAFEMESSAGE") << "\n\n" << GStrings.localize("$PRESSYN"); - auto actionLabel = GStrings.localize(mLabel.GetChars()); - - //FStringf FullString("%s%s%s\n\n%s", TEXTCOLOR_WHITE, actionLabel, TEXTCOLOR_NORMAL, msg); - FStringf FullString("- %s -\n%s", actionLabel, msg.GetChars()); - M_StartMessage(FullString, 0, mScriptId); - return true; - } -}; - -//============================================================================= -// -// Base class for option lists -// -//============================================================================= - -class FOptionMenuItemOptionBase : public FOptionMenuItem -{ -protected: - // action is a CVAR - FName mValues; // Entry in OptionValues table - FBaseCVar *mGrayCheck; - int mCenter; -public: - - enum - { - OP_VALUES = 0x11001 - }; - - FOptionMenuItemOptionBase(const char *label, const char *menu, const char *values, const char *graycheck, int center) - : FOptionMenuItem(label, menu) - { - mValues = values; - mGrayCheck = (FBoolCVar*)FindCVar(graycheck, NULL); - mCenter = center; - } - - bool SetString(int i, const char *newtext) override - { - if (i == OP_VALUES) - { - FOptionValues **opt = OptionValues.CheckKey(newtext); - mValues = newtext; - if (opt != NULL && *opt != NULL) - { - int s = GetSelection(); - if (s >= (int)(*opt)->mValues.Size()) s = 0; - SetSelection(s); // readjust the CVAR if its value is outside the range now - return true; - } - } - return false; - } - - - - //============================================================================= - virtual int GetSelection() = 0; - virtual void SetSelection(int Selection) = 0; - - //============================================================================= - int Draw(FOptionMenuDescriptor *desc, int y, int indent, bool selected) override - { - if (mCenter) - { - indent = (twod->GetWidth() / 2); - } - drawLabel(indent, y, selected? OptionSettings.mFontColorSelection : OptionSettings.mFontColor, isGrayed()); - - int Selection = GetSelection(); - const char *text; - FOptionValues **opt = OptionValues.CheckKey(mValues); - if (Selection < 0 || opt == NULL || *opt == NULL) - { - text = "Unknown"; - } - else - { - text = (*opt)->mValues[Selection].Text; - } - if (*text == '$') text = GStrings(text + 1); - - drawValue(indent, y, OptionSettings.mFontColorValue, text, isGrayed()); - return indent; - } - - //============================================================================= - bool MenuEvent (int mkey, bool fromcontroller) override - { - FOptionValues **opt = OptionValues.CheckKey(mValues); - if (opt != NULL && *opt != NULL && (*opt)->mValues.Size() > 0) - { - int Selection = GetSelection(); - if (mkey == MKEY_Left) - { - if (Selection == -1) Selection = 0; - else if (--Selection < 0) Selection = (*opt)->mValues.Size()-1; - } - else if (mkey == MKEY_Right || mkey == MKEY_Enter) - { - if (++Selection >= (int)(*opt)->mValues.Size()) Selection = 0; - } - else - { - return FOptionMenuItem::MenuEvent(mkey, fromcontroller); - } - SetSelection(Selection); - M_MenuSound(ChangeSound); - } - return true; - } - - virtual bool isGrayed() - { - return mGrayCheck != NULL && !(mGrayCheck->GetGenericRep(CVAR_Bool).Bool); - } - - bool Selectable() override - { - return !isGrayed(); - } -}; - -//============================================================================= -// -// Change a CVAR, action is the CVAR name -// -//============================================================================= - -class FOptionMenuItemOption : public FOptionMenuItemOptionBase -{ - // action is a CVAR - FBaseCVar *mCVar; -public: - - FOptionMenuItemOption(const char *label, const char *menu, const char *values, const char *graycheck, int center) - : FOptionMenuItemOptionBase(label, menu, values, graycheck, center) - { - mCVar = FindCVar(mAction.GetChars(), NULL); - } - - //============================================================================= - int GetSelection() override - { - int Selection = -1; - FOptionValues **opt = OptionValues.CheckKey(mValues); - if (opt != NULL && *opt != NULL && mCVar != NULL && (*opt)->mValues.Size() > 0) - { - if ((*opt)->mValues[0].TextValue.IsEmpty()) - { - UCVarValue cv = mCVar->GetGenericRep(CVAR_Float); - for(unsigned i = 0; i < (*opt)->mValues.Size(); i++) - { - if (fabs(cv.Float - (*opt)->mValues[i].Value) < FLT_EPSILON) - { - Selection = i; - break; - } - } - } - else - { - UCVarValue cv = mCVar->GetGenericRep(CVAR_String); - for(unsigned i = 0; i < (*opt)->mValues.Size(); i++) - { - if ((*opt)->mValues[i].TextValue.CompareNoCase(cv.String) == 0) - { - Selection = i; - break; - } - } - } - } - return Selection; - } - - void SetSelection(int Selection) override - { - UCVarValue value; - FOptionValues **opt = OptionValues.CheckKey(mValues); - if (opt != NULL && *opt != NULL && mCVar != NULL && (*opt)->mValues.Size() > 0) - { - if ((*opt)->mValues[0].TextValue.IsEmpty()) - { - value.Float = (float)(*opt)->mValues[Selection].Value; - mCVar->SetGenericRep (value, CVAR_Float); - } - else - { - value.String = (*opt)->mValues[Selection].TextValue.LockBuffer(); - mCVar->SetGenericRep (value, CVAR_String); - (*opt)->mValues[Selection].TextValue.UnlockBuffer(); - } - } - } -}; - -//============================================================================= -// -// This class is used to capture the key to be used as the new key binding -// for a control item -// -//============================================================================= - -class DEnterKey : public DMenu -{ - int *pKey; - -public: - DEnterKey(DMenu *parent, int *keyptr) - : DMenu(parent) - { - pKey = keyptr; - SetMenuMessage(1); - menuactive = MENU_WaitKey; // There should be a better way to disable GUI capture... - } - - bool TranslateKeyboardEvents() override - { - return false; - } - - void SetMenuMessage(int which) - { - DOptionMenu *m = static_cast(mParentMenu); - if (m) - { - FListMenuItem *it = m->GetItem(NAME_Controlmessage); - if (it != NULL) - { - it->SetValue(0, which); - } - } - } - - bool Responder(event_t *ev) override - { - if (ev->type == EV_KeyDown) - { - *pKey = ev->data1; - menuactive = MENU_On; - SetMenuMessage(0); - auto p = mParentMenu; - Close(); - p->MenuEvent((ev->data1 == KEY_ESCAPE)? MKEY_Abort : MKEY_Input, 0); - return true; - } - return false; - } - - void Drawer() override - { - mParentMenu->Drawer(); - } -}; - -//============================================================================= -// -// // Edit a key binding, Action is the CCMD to bind -// -//============================================================================= - -class FOptionMenuItemControl : public FOptionMenuItem -{ - FKeyBindings *mBindings; - int mInput; - bool mWaiting; -public: - - FOptionMenuItemControl(const char *label, const char *menu, FKeyBindings *bindings) - : FOptionMenuItem(label, menu) - { - mBindings = bindings; - mWaiting = false; - } - - - //============================================================================= - int Draw(FOptionMenuDescriptor *desc, int y, int indent, bool selected) override - { - drawLabel(indent, y, mWaiting? OptionSettings.mFontColorHighlight: - (selected? OptionSettings.mFontColorSelection : OptionSettings.mFontColor)); - - auto binds = mBindings->GetKeysForCommand(mAction.GetChars()); - auto description = C_NameKeys(binds.Data(), binds.Size()); - - if (description.Len() > 0) - { - drawValue(indent, y, CR_WHITE, description); - } - else - { - drawValue(indent, y, CR_BLACK, "---"); - } - return indent; - } - - //============================================================================= - bool MenuEvent(int mkey, bool fromcontroller) override - { - if (mkey == MKEY_Input) - { - mWaiting = false; - mBindings->SetBind(mInput, mAction.GetChars()); - return true; - } - else if (mkey == MKEY_Clear) - { - mBindings->UnbindACommand(mAction.GetChars()); - return true; - } - else if (mkey == MKEY_Abort) - { - mWaiting = false; - return true; - } - return false; - } - - bool Activate(FName caller) override - { - M_MenuSound(AdvanceSound); - mWaiting = true; - DMenu *input = new DEnterKey(CurrentMenu, &mInput); - M_ActivateMenu(input); - return true; - } -}; - -//============================================================================= -// -// -// -//============================================================================= - -class FOptionMenuItemStaticText : public FOptionMenuItem -{ - EColorRange mColor; -public: - FOptionMenuItemStaticText(const char *label, EColorRange color = CR_UNDEFINED) - : FOptionMenuItem(label, NAME_None, true) - { - mColor = color == CR_UNDEFINED? (EColorRange)OptionSettings.mFontColor : color; - } - - int Draw(FOptionMenuDescriptor *desc, int y, int indent, bool selected) override - { - drawLabel(indent, y, mColor); - return -1; - } - - bool Selectable() override - { - return false; - } - -}; - -//============================================================================= -// -// -// -//============================================================================= - -class FOptionMenuItemStaticTextSwitchable : public FOptionMenuItem -{ - EColorRange mColor; - FString mAltText; - int mCurrent; - -public: - FOptionMenuItemStaticTextSwitchable(const char *label, const char *label2, FName action, EColorRange color = CR_UNDEFINED) - : FOptionMenuItem(label, action, true) - { - mColor = color == CR_UNDEFINED? (EColorRange)OptionSettings.mFontColor : color; - mAltText = label2; - mCurrent = 0; - } - - int Draw(FOptionMenuDescriptor *desc, int y, int indent, bool selected) override - { - const char *txt = GStrings.localize(mCurrent? mAltText.GetChars() : mLabel.GetChars()); - int w = OptionWidth(txt) * CleanXfac_1; - int x = (twod->GetWidth() - w) / 2; - drawText(x, y, mColor, txt); - return -1; - } - - bool SetValue(int i, int val) override - { - if (i == 0) - { - mCurrent = val; - return true; - } - return false; - } - - bool SetString(int i, const char *newtext) override - { - if (i == 0) - { - mAltText = newtext; - return true; - } - return false; - } - - bool Selectable() override - { - return false; - } -}; - -//============================================================================= -// -// -// -//============================================================================= - -class FOptionMenuSliderBase : public FOptionMenuItem -{ - // action is a CVAR - double mMin, mMax, mStep; - int mShowValue; - int mDrawX; - int mSliderShort; - -public: - FOptionMenuSliderBase(const char *label, double min, double max, double step, int showval, FName command = NAME_None) - : FOptionMenuItem(label, command) - { - mMin = min; - mMax = max; - mStep = step; - mShowValue = showval; - mDrawX = 0; - mSliderShort = 0; - } - - virtual double GetSliderValue() = 0; - virtual void SetSliderValue(double val) = 0; - - //============================================================================= - // - // Draw a slider. Set fracdigits negative to not display the current value numerically. - // - //============================================================================= - - void DrawSliderElement (int color, int x, int y, const char * str) - { - DrawText (twod, ConFont, color, x, y, str, DTA_CellX, 16 * CleanXfac_1, DTA_CellY, 16 * CleanYfac_1, TAG_DONE); - } - - void DrawSlider (int x, int y, double min, double max, double cur, int fracdigits, int indent) - { - char textbuf[16]; - double range; - int maxlen = 0; - int right = x + (12*16 + 4) * CleanXfac_1; - int cy = y;// +(OptionSettings.mLinespacing - 8) * CleanYfac_1; - - range = max - min; - double ccur = clamp(cur, min, max) - min; - - if (fracdigits >= 0) - { - snprintf(textbuf, countof(textbuf), "%.*f", fracdigits, max); - maxlen = NewSmallFont->StringWidth(textbuf) * CleanXfac_1; - } - - mSliderShort = right + maxlen > twod->GetWidth(); - - if (!mSliderShort) - { - DrawSliderElement(CR_WHITE, x, cy, "\x10\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x12"); - DrawSliderElement(CR_ORANGE, x + int((5 + ((ccur * 78) / range)) * 2*CleanXfac_1), cy, "\x13"); - } - else - { - // On 320x200 we need a shorter slider - DrawSliderElement(CR_WHITE, x, cy, "\x10\x11\x11\x11\x11\x11\x12"); - DrawSliderElement(CR_ORANGE, x + int((5 + ((ccur * 38) / range)) * 2*CleanXfac_1), cy, "\x13"); - right -= 5*8*CleanXfac_1; - } - - if (fracdigits >= 0 && right + maxlen <= twod->GetWidth()) - { - snprintf(textbuf, countof(textbuf), "%.*f", fracdigits, cur); - drawText(right, y, CR_DARKGRAY, textbuf); - } - } - - - //============================================================================= - int Draw(FOptionMenuDescriptor *desc, int y, int indent, bool selected) override - { - drawLabel(indent, y, selected? OptionSettings.mFontColorSelection : OptionSettings.mFontColor); - mDrawX = indent + CursorSpace(); - DrawSlider (mDrawX, y, mMin, mMax, GetSliderValue(), mShowValue, indent); - return indent; - } - - //============================================================================= - bool MenuEvent (int mkey, bool fromcontroller) override - { - double value = GetSliderValue(); - - if (mkey == MKEY_Left) - { - value -= mStep; - } - else if (mkey == MKEY_Right) - { - value += mStep; - } - else - { - return FOptionMenuItem::MenuEvent(mkey, fromcontroller); - } - SetSliderValue(clamp(value, mMin, mMax)); - M_MenuSound(ChangeSound); - return true; - } - - bool MouseEvent(int type, int x, int y) override - { - DOptionMenu *lm = static_cast(CurrentMenu); - if (type != DMenu::MOUSE_Click) - { - if (!lm->CheckFocus(this)) return false; - } - if (type == DMenu::MOUSE_Release) - { - lm->ReleaseFocus(); - } - - int slide_left = mDrawX+16*CleanXfac_1; - int slide_right = slide_left + (10*16*CleanXfac_1 >> mSliderShort); // 10 char cells with 8 pixels each. - - if (type == DMenu::MOUSE_Click) - { - if (x < slide_left || x >= slide_right) return true; - } - - x = clamp(x, slide_left, slide_right); - double v = mMin + ((x - slide_left) * (mMax - mMin)) / (slide_right - slide_left); - if (v != GetSliderValue()) - { - SetSliderValue(v); - M_MenuSound(ChangeSound); - } - if (type == DMenu::MOUSE_Click) - { - lm->SetFocus(this); - } - return true; - } - -}; - -//============================================================================= -// -// -// -//============================================================================= - -class FOptionMenuSliderCVar : public FOptionMenuSliderBase -{ - FBaseCVar *mCVar; -public: - FOptionMenuSliderCVar(const char *label, const char *menu, double min, double max, double step, int showval) - : FOptionMenuSliderBase(label, min, max, step, showval) - { - mCVar = FindCVar(menu, NULL); - } - - double GetSliderValue() override - { - if (mCVar != NULL) - { - return mCVar->GetGenericRep(CVAR_Float).Float; - } - else - { - return 0; - } - } - - void SetSliderValue(double val) override - { - if (mCVar != NULL) - { - UCVarValue value; - value.Float = (float)val; - mCVar->SetGenericRep(value, CVAR_Float); - } - } -}; - -//============================================================================= -// -// -// -//============================================================================= - -class FOptionMenuSliderVar : public FOptionMenuSliderBase -{ - float *mPVal; -public: - - FOptionMenuSliderVar(const char *label, float *pVal, double min, double max, double step, int showval) - : FOptionMenuSliderBase(label, min, max, step, showval) - { - mPVal = pVal; - } - - double GetSliderValue() override - { - return *mPVal; - } - - void SetSliderValue(double val) override - { - *mPVal = (float)val; - } -}; - - -//============================================================================= -// -// [TP] FOptionMenuFieldBase -// -// Base class for input fields -// -//============================================================================= - -class FOptionMenuFieldBase : public FOptionMenuItem -{ -public: - FOptionMenuFieldBase ( const char* label, const char* menu, const char* graycheck ) : - FOptionMenuItem ( label, menu ), - mCVar ( FindCVar( mAction.GetChars(), NULL )), - mGrayCheck (( graycheck && strlen( graycheck )) ? FindCVar( graycheck, NULL ) : NULL ) {} - - const char* GetCVarString() - { - if ( mCVar == NULL ) - return ""; - - return mCVar->GetGenericRep( CVAR_String ).String; - } - - virtual FString Represent() - { - return GetCVarString(); - } - - int Draw ( FOptionMenuDescriptor*, int y, int indent, bool selected ) override - { - bool grayed = mGrayCheck != NULL && !( mGrayCheck->GetGenericRep( CVAR_Bool ).Bool ); - drawLabel(indent, y, selected ? OptionSettings.mFontColorSelection : OptionSettings.mFontColor, grayed); - drawValue(indent, y, OptionSettings.mFontColorValue, Represent(), grayed); - return indent; - } - - bool GetString ( int i, char* s, int len ) override - { - if ( i == 0 ) - { - strncpy( s, GetCVarString(), len ); - s[len - 1] = '\0'; - return true; - } - - return false; - } - - bool SetString ( int i, const char* s ) override - { - if ( i == 0 ) - { - if ( mCVar ) - { - UCVarValue vval; - vval.String = s; - mCVar->SetGenericRep( vval, CVAR_String ); - } - - return true; - } - - return false; - } - -protected: - // Action is a CVar in this class and derivatives. - FBaseCVar* mCVar; - FBaseCVar* mGrayCheck; -}; - -//============================================================================= -// -// [TP] FOptionMenuTextField -// -// A text input field widget, for use with string CVars. -// -//============================================================================= - -class FOptionMenuTextField : public FOptionMenuFieldBase -{ -public: - FOptionMenuTextField ( const char *label, const char* menu, const char* graycheck ) : - FOptionMenuFieldBase ( label, menu, graycheck ), - mEntering ( false ) {} - - FString Represent() override - { - if (mEntering) - { - FString text; - text = mInput->GetText(); - text += '_'; - return text; - } - else return FString(GetCVarString()); - } - - int Draw(FOptionMenuDescriptor*desc, int y, int indent, bool selected) override - { - if (mEntering) - { - // reposition the text so that the cursor is visible when in entering mode. - FString text = Represent(); - int tlen = NewSmallFont->StringWidth(text) * CleanXfac_1; - int newindent = twod->GetWidth() - tlen - CursorSpace(); - if (newindent < indent) indent = newindent; - } - return FOptionMenuFieldBase::Draw(desc, y, indent, selected); - } - - bool MenuEvent ( int mkey, bool fromcontroller ) override - { - if ( mkey == MKEY_Enter ) - { - M_MenuSound(AdvanceSound); - mEntering = true; - mInput = new DTextEnterMenu(CurrentMenu, NewSmallFont, GetCVarString(), 256, fromcontroller ); - M_ActivateMenu( mInput ); - return true; - } - else if ( mkey == MKEY_Input ) - { - if ( mCVar ) - { - UCVarValue vval; - vval.String = mInput->GetText(); - mCVar->SetGenericRep( vval, CVAR_String ); - } - - mEntering = false; - mInput = nullptr; - return true; - } - else if ( mkey == MKEY_Abort ) - { - mEntering = false; - mInput = nullptr; - return true; - } - - return FOptionMenuItem::MenuEvent( mkey, fromcontroller ); - } - -private: - bool mEntering; - DTextEnterMenu* mInput; -}; - -//============================================================================= -// -// [TP] FOptionMenuNumberField -// -// A numeric input field widget, for use with number CVars where sliders are inappropriate (i.e. -// where the user is interested in the exact value specifically) -// -//============================================================================= - -class FOptionMenuNumberField : public FOptionMenuFieldBase -{ -public: - FOptionMenuNumberField ( const char *label, const char* menu, float minimum, float maximum, - float step, const char* graycheck ) - : FOptionMenuFieldBase ( label, menu, graycheck ), - mMinimum ( minimum ), - mMaximum ( maximum ), - mStep ( step ) - { - if ( mMaximum <= mMinimum ) - std::swap( mMinimum, mMaximum ); - - if ( mStep <= 0 ) - mStep = 1; - } - - bool MenuEvent ( int mkey, bool fromcontroller ) override - { - if ( mCVar ) - { - float value = mCVar->GetGenericRep( CVAR_Float ).Float; - - if ( mkey == MKEY_Left ) - { - value -= mStep; - - if ( value < mMinimum ) - value = mMaximum; - } - else if ( mkey == MKEY_Right || mkey == MKEY_Enter ) - { - value += mStep; - - if ( value > mMaximum ) - value = mMinimum; - } - else - return FOptionMenuItem::MenuEvent( mkey, fromcontroller ); - - UCVarValue vval; - vval.Float = value; - mCVar->SetGenericRep( vval, CVAR_Float ); - M_MenuSound(ChangeSound); - } - - return true; - } - -private: - float mMinimum; - float mMaximum; - float mStep; -}; diff --git a/source/core/menu/razemenu.cpp b/source/core/menu/razemenu.cpp new file mode 100644 index 000000000..6f01f0a06 --- /dev/null +++ b/source/core/menu/razemenu.cpp @@ -0,0 +1,725 @@ +/* +** menu.cpp +** Menu base class and global interface +** +**--------------------------------------------------------------------------- +** Copyright 2010 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 "c_dispatch.h" +#include "d_gui.h" +#include "c_buttons.h" +#include "c_console.h" +#include "c_bind.h" +#include "d_eventbase.h" +#include "g_input.h" +#include "configfile.h" +#include "gstrings.h" +#include "menu.h" +#include "vm.h" +#include "v_video.h" +#include "i_system.h" +#include "types.h" +#include "texturemanager.h" +#include "v_draw.h" +#include "vm.h" +#include "gamestate.h" +#include "i_interface.h" +#include "d_event.h" +#include "st_start.h" +#include "i_system.h" +#include "gameconfigfile.h" +#include "gamecontrol.h" +#include "raze_sound.h" +#include "gamestruct.h" +#include "razemenu.h" +#include "mapinfo.h" +#include "statistics.h" +#include "i_net.h" +#include "savegamehelp.h" +#include "gi.h" + +EXTERN_CVAR(Int, cl_gfxlocalization) +EXTERN_CVAR(Bool, m_quickexit) +EXTERN_CVAR(Bool, saveloadconfirmation) // [mxd] +EXTERN_CVAR(Bool, quicksaverotation) +EXTERN_CVAR(Bool, show_messages) +CVAR(Bool, menu_sounds, true, CVAR_ARCHIVE) // added mainly because RR's sounds are so supremely annoying. + +typedef void(*hfunc)(); +DMenu* CreateMessageBoxMenu(DMenu* parent, const char* message, int messagemode, bool playsound, FName action = NAME_None, hfunc handler = nullptr); +bool OkForLocalization(FTextureID texnum, const char* substitute); +void D_ToggleHud(); +void I_WaitVBL(int count); + +extern bool hud_toggled; +bool help_disabled; +FNewGameStartup NewGameStartupInfo; + + +//FNewGameStartup NewGameStartupInfo; + + +bool M_SetSpecialMenu(FName& menu, int param) +{ + // Engine credits need a different approach to work with the option search +#if 0 + // Transitions between the engine credits pages need to pop off the last slide + if (!strnicmp(menu.GetChars(), "EngineCredits", 13) && CurrentMenu && !strnicmp(CurrentMenu->GetClass()->TypeName.GetChars(), "EngineCredits", 13)) + { + auto m = CurrentMenu; + CurrentMenu = m->mParentMenu; + m->mParentMenu = nullptr; + m->Destroy(); + } +#endif + + switch (menu.GetIndex()) + { + case NAME_Mainmenu: + if (gi->CanSave()) menu = NAME_IngameMenu; + break; + + case NAME_Skillmenu: + // sent from the episode menu + NewGameStartupInfo.Episode = param; + NewGameStartupInfo.Level = 0; + NewGameStartupInfo.Skill = gDefaultSkill; + return true; + + case NAME_Startgame: + case NAME_StartgameNoSkill: + menu = NAME_Startgame; + NewGameStartupInfo.Skill = param; + if (menu == NAME_StartgameNoSkill) NewGameStartupInfo.Episode = param; + if (gi->StartGame(NewGameStartupInfo)) + { + M_ClearMenus(); + STAT_StartNewGame(gVolumeNames[NewGameStartupInfo.Episode], NewGameStartupInfo.Skill); + inputState.ClearAllInput(); + } + return false; + + case NAME_CustomSubMenu1: + menu = ENamedName(menu.GetIndex() + param); + break; + + case NAME_Savegamemenu: + if (!gi->CanSave()) + { + // cannot save outside the game. + M_StartMessage(GStrings("SAVEDEAD"), 1, NAME_None); + return true; + } + break; + + case NAME_Quitmenu: + // This is no separate class + C_DoCommand("menu_quit"); + return false; + + case NAME_EndGameMenu: + // This is no separate class + C_DoCommand("menu_endgame"); + return false; +} + + // End of special checks + return true; +} + +//============================================================================= +// +// +// +//============================================================================= + +void M_StartControlPanel(bool makeSound, bool) +{ + static bool created = false; + // intro might call this repeatedly + if (CurrentMenu != NULL) + return; + + if (!created) // Cannot do this earlier. + { + created = true; + M_CreateMenus(); + } + GSnd->SetSfxPaused(true, PAUSESFX_MENU); + gi->MenuOpened(); + if (makeSound && menu_sounds) gi->MenuSound(ActivateSound); + M_DoStartControlPanel(false); +} + + +void System_MenuClosed() +{ + GSnd->SetSfxPaused(false, PAUSESFX_MENU); + inputState.ClearAllInput(); + gi->MenuClosed(); +} + +//========================================================================== +// +// +// +//========================================================================== + +void System_MenuDim() +{ + if (gamestate != GS_MENUSCREEN) // With GS_MENUSCREEN we can assume that the background has been tuned for proper menu display already. + { + Dim(twod, 0, 0.5f, 0, 0, screen->GetWidth(), screen->GetHeight()); + } +} + +//============================================================================= +// +// +// +//============================================================================= + +CCMD(menu_quit) +{ // F10 + + M_StartControlPanel(true); + + FString EndString; + EndString << GStrings("CONFIRM_QUITMSG") << "\n\n" << GStrings("PRESSYN"); + + DMenu* newmenu = CreateMessageBoxMenu(CurrentMenu, EndString, 0, false, NAME_None, []() + { + gi->ExitFromMenu(); + }); + + M_ActivateMenu(newmenu); +} + +//============================================================================= +// +// +// +//============================================================================= + +CCMD(menu_endgame) +{ // F7 + if (!gi->CanSave()) + { + return; + } + + M_StartControlPanel(true); + FString tempstring; + tempstring << GStrings("ENDGAME") << "\n\n" << GStrings("PRESSYN"); + DMenu* newmenu = CreateMessageBoxMenu(CurrentMenu, tempstring, 0, false, NAME_None, []() + { + STAT_Cancel(); + M_ClearMenus(); + gi->QuitToTitle(); + }); + + M_ActivateMenu(newmenu); +} + +//============================================================================= +// +// +// +//============================================================================= + + +//============================================================================= +// +// +// +//============================================================================= + +CCMD(quicksave) +{ // F6 + if (!gi->CanSave()) return; + + if (savegameManager.quickSaveSlot == NULL || savegameManager.quickSaveSlot == (FSaveGameNode*)1) + { + M_StartControlPanel(true); + M_SetMenu(NAME_Savegamemenu); + return; + } + + auto slot = savegameManager.quickSaveSlot; + + // [mxd]. Just save the game, no questions asked. + if (!saveloadconfirmation) + { + G_SaveGame(savegameManager.quickSaveSlot->Filename, savegameManager.quickSaveSlot->SaveTitle, true, true); + return; + } + + FString tempstring = GStrings("QSPROMPT"); + tempstring.Substitute("%s", slot->SaveTitle.GetChars()); + M_StartControlPanel(true); + + DMenu* newmenu = CreateMessageBoxMenu(CurrentMenu, tempstring, 0, false, NAME_None, []() + { + G_SaveGame(savegameManager.quickSaveSlot->Filename, savegameManager.quickSaveSlot->SaveTitle, true, true); + }); + + M_ActivateMenu(newmenu); +} + +//============================================================================= +// +// +// +//============================================================================= + +CCMD(quickload) +{ // F9 + if (netgame) + { + M_StartControlPanel(true); + M_StartMessage(GStrings("QLOADNET"), 1); + return; + } + + if (savegameManager.quickSaveSlot == nullptr || savegameManager.quickSaveSlot == (FSaveGameNode*)1) + { + M_StartControlPanel(true); + // signal that whatever gets loaded should be the new quicksave + savegameManager.quickSaveSlot = (FSaveGameNode*)1; + M_SetMenu(NAME_Loadgamemenu); + return; + } + + // [mxd]. Just load the game, no questions asked. + if (!saveloadconfirmation) + { + G_LoadGame(savegameManager.quickSaveSlot->Filename); + return; + } + FString tempstring = GStrings("QLPROMPT"); + tempstring.Substitute("%s", savegameManager.quickSaveSlot->SaveTitle.GetChars()); + + M_StartControlPanel(true); + + DMenu* newmenu = CreateMessageBoxMenu(CurrentMenu, tempstring, 0, false, NAME_None, []() + { + G_LoadGame(savegameManager.quickSaveSlot->Filename); + }); + M_ActivateMenu(newmenu); +} + +//============================================================================= +// +// Creation wrapper +// +//============================================================================= + +static DMenuItemBase* CreateCustomListMenuItemText(double x, double y, int height, int hotkey, const char* text, FFont* font, PalEntry color1, PalEntry color2, FName command, int param) +{ + const char* classname = + (g_gameType & GAMEFLAG_BLOOD) ? "ListMenuItemBloodTextItem" : + (g_gameType & GAMEFLAG_SW) ? "ListMenuItemSWTextItem" : + (g_gameType & GAMEFLAG_PSEXHUMED) ? "ListMenuItemExhumedTextItem" : "ListMenuItemDukeTextItem"; + auto c = PClass::FindClass(classname); + auto p = c->CreateNew(); + FString keystr = FString(char(hotkey)); + FString textstr = text; + VMValue params[] = { p, x, y, height, &keystr, &textstr, font, int(color1.d), int(color2.d), command.GetIndex(), param }; + auto f = dyn_cast(c->FindSymbol("InitDirect", false)); + VMCall(f->Variants[0].Implementation, params, countof(params), nullptr, 0); + return (DMenuItemBase*)p; +} + +//============================================================================= +// +// Creates the episode menu +// +//============================================================================= + +static void BuildEpisodeMenu() +{ + // Build episode menu + int addedVolumes = 0; + DMenuDescriptor** desc = MenuDescriptors.CheckKey(NAME_Episodemenu); + if (desc != nullptr && (*desc)->IsKindOf(RUNTIME_CLASS(DListMenuDescriptor))) + { + DListMenuDescriptor* ld = static_cast(*desc); + + DMenuItemBase* popped = nullptr; + if (ld->mItems.Size() && ld->mItems.Last()->IsKindOf(NAME_ListMenuItemBloodDripDrawer)) + { + ld->mItems.Pop(popped); + } + + ld->mSelectedItem = gDefaultVolume + ld->mItems.Size(); // account for pre-added items + int y = ld->mYpos; + + for (int i = 0; i < MAXVOLUMES; i++) + { + if (gVolumeNames[i].IsNotEmpty() && !(gVolumeFlags[i] & EF_HIDEFROMSP)) + + { + int isShareware = ((g_gameType & GAMEFLAG_DUKE) && (g_gameType & GAMEFLAG_SHAREWARE) && i > 0); + auto it = CreateCustomListMenuItemText(ld->mXpos, y, ld->mLinespacing, gVolumeNames[i][0], + gVolumeNames[i], ld->mFont, 0, isShareware, NAME_Skillmenu, i); // font colors are not used, so hijack one for the shareware flag. + + y += ld->mLinespacing; + ld->mItems.Push(it); + addedVolumes++; + if (gVolumeSubtitles[i].IsNotEmpty()) + { + auto it = CreateListMenuItemStaticText(ld->mXpos, y, gVolumeSubtitles[i], SmallFont, CR_GRAY, false); + y += ld->mLinespacing * 6 / 10; + ld->mItems.Push(it); + } + } + } +#if 0 // this needs to be backed by a working selection menu, until that gets done it must be disabled. + if (!(g_gameType & GAMEFLAG_SHAREWARE)) + { + //auto it = new FListMenuItemNativeStaticText(ld->mXpos, "", NIT_SmallFont); // empty entry as spacer. + //ld->mItems.Push(it); + + y += ld->mLinespacing / 3; + auto it = CreateCustomListMenuItemText(ld->mXpos, y, ld->mLinespacing, 'U', "$MNU_USERMAP", ld->mFont, 0, 0, NAME_UsermapMenu); + ld->mItems.Push(it); + addedVolumes++; + } +#endif + if (addedVolumes == 1) + { + ld->mAutoselect = 0; + } + if (popped) ld->mItems.Push(popped); + } + + // Build skill menu + int addedSkills = 0; + desc = MenuDescriptors.CheckKey(NAME_Skillmenu); + if (desc != nullptr && (*desc)->IsKindOf(RUNTIME_CLASS(DListMenuDescriptor))) + { + DListMenuDescriptor* ld = static_cast(*desc); + DMenuItemBase* popped = nullptr; + if (ld->mItems.Size() && ld->mItems.Last()->IsKindOf(NAME_ListMenuItemBloodDripDrawer)) + { + ld->mItems.Pop(popped); + } + + ld->mSelectedItem = gDefaultVolume + ld->mItems.Size(); // account for pre-added items + int y = ld->mYpos; + + for (int i = 0; i < MAXSKILLS; i++) + { + if (gSkillNames[i].IsNotEmpty()) + { + auto it = CreateCustomListMenuItemText(ld->mXpos, y, ld->mLinespacing, gSkillNames[i][0], gSkillNames[i], ld->mFont, 0, 0, NAME_Startgame, i); + y += ld->mLinespacing; + ld->mItems.Push(it); + addedSkills++; + } + } + if (addedSkills == 0) + { + // Need to add one item with the default skill so that the menu does not break. + auto it = CreateCustomListMenuItemText(ld->mXpos, y, ld->mLinespacing, 0, "", ld->mFont, 0, 0, NAME_Startgame, gDefaultSkill); + ld->mItems.Push(it); + } + if (addedSkills == 1) + { + ld->mAutoselect = 0; + } + if (popped) ld->mItems.Push(popped); + } +} + +//============================================================================= +// +// Reads any XHAIRS lumps for the names of crosshairs and +// adds them to the display options menu. +// +//============================================================================= + +static void InitCrosshairsList() +{ + int lastlump, lump; + + lastlump = 0; + + FOptionValues **opt = OptionValues.CheckKey(NAME_Crosshairs); + if (opt == nullptr) + { + return; // no crosshair value list present. No need to go on. + } + + FOptionValues::Pair *pair = &(*opt)->mValues[(*opt)->mValues.Reserve(1)]; + pair->Value = 0; + pair->Text = "None"; + + while ((lump = fileSystem.FindLump("XHAIRS", &lastlump)) != -1) + { + FScanner sc(lump); + while (sc.GetNumber()) + { + FOptionValues::Pair value; + value.Value = sc.Number; + sc.MustGetString(); + value.Text = sc.String; + if (value.Value != 0) + { // Check if it already exists. If not, add it. + unsigned int i; + + for (i = 1; i < (*opt)->mValues.Size(); ++i) + { + if ((*opt)->mValues[i].Value == value.Value) + { + break; + } + } + if (i < (*opt)->mValues.Size()) + { + (*opt)->mValues[i].Text = value.Text; + } + else + { + (*opt)->mValues.Push(value); + } + } + } + } +} + +//========================================================================== +// +// 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. +// +// The default is 3, which only replaces known content with non-default texts. +// +//========================================================================== + +bool CheckSkipGameOptionBlock(FScanner& sc) { return false; } // not applicable + +#if 0 +CUSTOM_CVAR(Int, cl_gfxlocalization, 3, CVAR_ARCHIVE) +{ + if (self < 0 || self > 4) self = 0; +} + +bool OkForLocalization(FTextureID texnum, const char* substitute) +{ + if (!texnum.isValid()) return false; + + // First the unconditional settings, 0='never' and 1='always'. + if (cl_gfxlocalization == 1 || gameinfo.forcetextinmenus) return false; + if (cl_gfxlocalization == 0 || gameinfo.forcenogfxsubstitution) return true; + return TexMan.OkForLocalization(texnum, substitute, cl_gfxlocalization); +} + +#endif +void SetDefaultMenuColors() +{ + PClass* cls = nullptr; + //OptionSettings.mTitleColor = CR_RED;// V_FindFontColor(gameinfo.mTitleColor); + OptionSettings.mFontColor = CR_RED; + OptionSettings.mFontColorValue = CR_GRAY; + OptionSettings.mFontColorMore = CR_GRAY; + OptionSettings.mFontColorHeader = CR_GOLD; + OptionSettings.mFontColorHighlight = CR_YELLOW; + OptionSettings.mFontColorSelection = CR_BRICK; + gameinfo.mSliderColor = "Orange"; + + if (g_gameType & GAMEFLAG_BLOOD) + { + OptionSettings.mFontColorHeader = CR_DARKGRAY; + OptionSettings.mFontColorHighlight = CR_WHITE; + OptionSettings.mFontColorSelection = CR_DARKRED; + gameinfo.mSliderColor = "Red"; + cls = PClass::FindClass("BloodMenuDelegate"); + } + else if (g_gameType & GAMEFLAG_SW) + { + OptionSettings.mFontColorHeader = CR_DARKRED; + OptionSettings.mFontColorHighlight = CR_WHITE; + gameinfo.mSliderColor = "Red"; + cls = PClass::FindClass("SWMenuDelegate"); + } + else if (g_gameType & GAMEFLAG_PSEXHUMED) + { + OptionSettings.mFontColorHeader = CR_LIGHTBLUE; + OptionSettings.mFontColorHighlight = CR_SAPPHIRE; + OptionSettings.mFontColorSelection = CR_ORANGE; + OptionSettings.mFontColor = CR_FIRE; + gameinfo.mSliderColor = "Yellow"; + cls = PClass::FindClass("ExhumedMenuDelegate"); + } + else + { + if (g_gameType & (GAMEFLAG_NAM | GAMEFLAG_NAPALM | GAMEFLAG_WW2GI)) + { + OptionSettings.mFontColor = CR_DARKGREEN; + OptionSettings.mFontColorHeader = CR_DARKGRAY; + OptionSettings.mFontColorHighlight = CR_WHITE; + OptionSettings.mFontColorSelection = CR_DARKGREEN; + gameinfo.mSliderColor = "Green"; + } + else if (g_gameType & GAMEFLAG_RRALL) + { + OptionSettings.mFontColor = CR_BROWN; + OptionSettings.mFontColorHeader = CR_DARKBROWN; + OptionSettings.mFontColorHighlight = CR_ORANGE; + OptionSettings.mFontColorSelection = CR_TAN; + gameinfo.mSliderColor = "Tan"; + } + cls = PClass::FindClass("DukeMenuDelegate"); + } + if (!cls) cls = PClass::FindClass("RazeMenuDelegate"); + if (cls) menuDelegate = cls->CreateNew(); +} + +void BuildGameMenus() +{ + BuildEpisodeMenu(); + InitCrosshairsList(); + UpdateJoystickMenu(nullptr); +} + + +//============================================================================= +// +// [RH] Most menus can now be accessed directly +// through console commands. +// +//============================================================================= + +EXTERN_CVAR(Int, screenblocks) + +CCMD(reset2defaults) +{ + C_SetDefaultBindings(); + C_SetCVarsToDefaults(); +} + +CCMD(reset2saved) +{ + GameConfig->DoGlobalSetup(); + GameConfig->DoGameSetup(currentGame); +} + +CCMD(menu_main) +{ + M_StartControlPanel(true); + M_SetMenu(NAME_Mainmenu, -1); +} + +CCMD(openhelpmenu) +{ + if (!help_disabled) + { + M_StartControlPanel(true); + M_SetMenu(NAME_HelpMenu); + } +} + +CCMD(opensavemenu) +{ + if (gi->CanSave()) + { + M_StartControlPanel(true); + M_SetMenu(NAME_Savegamemenu); + } +} + +CCMD(openloadmenu) +{ + M_StartControlPanel(true); + M_SetMenu(NAME_Loadgamemenu); +} + + +// The sound system is not yet capable of resolving this properly. +DEFINE_ACTION_FUNCTION(_RazeMenuDelegate, PlaySound) +{ + PARAM_SELF_STRUCT_PROLOGUE(void); + PARAM_NAME(name); + EMenuSounds soundindex; + + switch (name.GetIndex()) + { + case NAME_menu_cursor: + soundindex = CursorSound; + break; + + case NAME_menu_choose: + soundindex = ChooseSound; + break; + + case NAME_menu_backup: + soundindex = BackSound; + break; + + case NAME_menu_clear: + case NAME_menu_dismiss: + soundindex = CloseSound; + break; + + case NAME_menu_change: + soundindex = ChangeSound; + break; + + case NAME_menu_advance: + soundindex = AdvanceSound; + break; + + default: + return 0; + } + gi->MenuSound(soundindex); + return 0; +} + +// C_ToggleConsole cannot be exported for security reasons as it can be used to make the engine unresponsive. +DEFINE_ACTION_FUNCTION(_RazeMenuDelegate, MenuDismissed) +{ + if (CurrentMenu == nullptr && gamestate == GS_MENUSCREEN) C_ToggleConsole(); + return 0; +} + +DEFINE_ACTION_FUNCTION(_PlayerMenu, DrawPlayerSprite) +{ + PARAM_PROLOGUE; + PARAM_INT(selected); + gi->DrawPlayerSprite(DVector2(0.,0.), selected); + return 0; +} + diff --git a/source/core/menu/razemenu.h b/source/core/menu/razemenu.h new file mode 100644 index 000000000..25a16b28f --- /dev/null +++ b/source/core/menu/razemenu.h @@ -0,0 +1,41 @@ +#pragma once +#include "menu.h" +#include "gamestruct.h" +#include "c_cvars.h" +#include "savegamemanager.h" + +extern bool help_disabled; + +void M_StartControlPanel (bool makeSound, bool scaleoverride = false); + + +extern FNewGameStartup NewGameStartupInfo; +void M_StartupEpisodeMenu(FNewGameStartup *gs); +void M_StartupSkillMenu(FNewGameStartup *gs); +void SetDefaultMenuColors(); +void BuildGameMenus(); + +class FSavegameManager : public FSavegameManagerBase +{ + void PerformSaveGame(const char *fn, const char *sgdesc) override; + void PerformLoadGame(const char *fn, bool) override; + FString ExtractSaveComment(FSerializer &arc) override; + FString BuildSaveName(const char* prefix, int slot) override; + void ReadSaveStrings() override; +}; + +extern FSavegameManager savegameManager; + +enum EMenuSounds : int +{ + ActivateSound, + CursorSound, + AdvanceSound, + BackSound, + CloseSound, + PageSound, + ChangeSound, + ChooseSound +}; + +EXTERN_CVAR(Bool, menu_sounds) diff --git a/source/core/ns.h b/source/core/ns.h index b97f6907a..82d397fd3 100644 --- a/source/core/ns.h +++ b/source/core/ns.h @@ -17,7 +17,7 @@ #define BEGIN_SW_NS namespace ShadowWarrior { #define END_SW_NS } -#define BEGIN_PS_NS namespace Powerslave { +#define BEGIN_PS_NS namespace Exhumed { #define END_PS_NS } #else diff --git a/source/core/savegamehelp.cpp b/source/core/savegamehelp.cpp index 9a347f7dc..59579fb7d 100644 --- a/source/core/savegamehelp.cpp +++ b/source/core/savegamehelp.cpp @@ -53,12 +53,15 @@ #include "gamestruct.h" #include "automap.h" #include "statusbar.h" +#include "gamestate.h" +#include "razemenu.h" static CompositeSavegameWriter savewriter; static FResourceFile *savereader; void LoadEngineState(); void SaveEngineState(); void WriteSavePic(FileWriter* file, int width, int height); +extern FString BackupSaveGame; CVAR(String, cl_savedir, "", CVAR_ARCHIVE|CVAR_GLOBALCONFIG) @@ -564,3 +567,129 @@ void LoadEngineState() fr.Close(); } } + +//============================================================================= +// +// +// +//============================================================================= + +CVAR(Bool, saveloadconfirmation, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) + +CVAR(Int, autosavenum, 0, CVAR_NOSET | CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +static int nextautosave = -1; +CVAR(Int, disableautosave, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CUSTOM_CVAR(Int, autosavecount, 4, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +{ + if (self < 1) + self = 1; +} + +CVAR(Int, quicksavenum, 0, CVAR_NOSET | CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +static int nextquicksave = -1; + CUSTOM_CVAR(Int, quicksavecount, 4, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +{ + if (self < 1) + self = 1; +} + + void DoLoadGame(const char* name) + { + if (OpenSaveGameForRead(name)) + { + if (gi->LoadGame()) + { + gameaction = ga_level; + } + else + { + I_Error("%s: Failed to load savegame", name); + } + } + else + { + I_Error("%s: Failed to open savegame", name); + } + } + + + void G_LoadGame(const char *filename) + { + inputState.ClearAllInput(); + gi->FreeLevelData(); + DoLoadGame(filename); + BackupSaveGame = filename; + } + + void G_SaveGame(const char *fn, const char *desc, bool ok4q, bool forceq) + { + if (OpenSaveGameForWrite(fn, desc)) + { + if (gi->SaveGame() && FinishSavegameWrite()) + { + savegameManager.NotifyNewSave(fn, desc, ok4q, forceq); + Printf(PRINT_NOTIFY, "%s\n", GStrings("GAME SAVED")); + BackupSaveGame = fn; + } + } + } + + +void M_Autosave() +{ + if (disableautosave) return; + if (!gi->CanSave()) return; + FString description; + FString file; + // Keep a rotating sets of autosaves + UCVarValue num; + const char* readableTime; + int count = autosavecount != 0 ? autosavecount : 1; + + if (nextautosave == -1) + { + nextautosave = (autosavenum + 1) % count; + } + + num.Int = nextautosave; + autosavenum.ForceSet(num, CVAR_Int); + + auto Filename = G_BuildSaveName(FStringf("auto%04d", nextautosave)); + readableTime = myasctime(); + FStringf SaveTitle("Autosave %s", readableTime); + nextautosave = (nextautosave + 1) % count; + G_SaveGame(Filename, SaveTitle, false, false); +} + +CCMD(autosave) +{ + gameaction = ga_autosave; +} + +CCMD(rotatingquicksave) +{ + if (!gi->CanSave()) return; + FString description; + FString file; + // Keep a rotating sets of quicksaves + UCVarValue num; + const char* readableTime; + int count = quicksavecount != 0 ? quicksavecount : 1; + + if (nextquicksave == -1) + { + nextquicksave = (quicksavenum + 1) % count; + } + + num.Int = nextquicksave; + quicksavenum.ForceSet(num, CVAR_Int); + + FSaveGameNode sg; + auto Filename = G_BuildSaveName(FStringf("quick%04d", nextquicksave)); + readableTime = myasctime(); + FStringf SaveTitle("Quicksave %s", readableTime); + nextquicksave = (nextquicksave + 1) % count; + G_SaveGame(Filename, SaveTitle, false, false); +} + + diff --git a/source/core/savegamehelp.h b/source/core/savegamehelp.h index 2cfbb58fc..ee086fc74 100644 --- a/source/core/savegamehelp.h +++ b/source/core/savegamehelp.h @@ -17,8 +17,12 @@ class FileReader; FString G_BuildSaveName (const char *prefix); int G_ValidateSavegame(FileReader &fr, FString *savetitle, bool formenu); +void G_LoadGame(const char* filename); +void G_SaveGame(const char* fn, const char* desc, bool ok4q, bool forceq); + void SaveEngineState(); void LoadEngineState(); +void M_Autosave(); #define SAVEGAME_EXT ".dsave" diff --git a/source/core/screenjob.cpp b/source/core/screenjob.cpp index 0df4952b8..ecef96a27 100644 --- a/source/core/screenjob.cpp +++ b/source/core/screenjob.cpp @@ -43,7 +43,7 @@ #include "s_soundinternal.h" #include "animtexture.h" #include "gamestate.h" -#include "menu.h" +#include "razemenu.h" #include "raze_sound.h" #include "SmackerDecoder.h" #include "movie/playmve.h" diff --git a/source/core/statusbar.cpp b/source/core/statusbar.cpp index 306dc3838..fba769692 100644 --- a/source/core/statusbar.cpp +++ b/source/core/statusbar.cpp @@ -59,7 +59,7 @@ #include "m_fixed.h" #include "gamecontrol.h" #include "gamestruct.h" -#include "menu.h" +#include "razemenu.h" #include "mapinfo.h" #include "../version.h" diff --git a/source/core/textures/buildtiles.cpp b/source/core/textures/buildtiles.cpp index 223ff1ed6..022f3cb72 100644 --- a/source/core/textures/buildtiles.cpp +++ b/source/core/textures/buildtiles.cpp @@ -619,6 +619,9 @@ int tileImportFromTexture(const char* fn, int tilenum, int alphacut, int istextu if (xsiz <= 0 || ysiz <= 0) return -2; + // create a new game texture here - we want to give it a new name! + tex = MakeGameTexture(tex->GetTexture(), FStringf("#%05d", tilenum), ETextureType::Override); + TexMan.AddGameTexture(tex); TileFiles.tiledata[tilenum].backup = TileFiles.tiledata[tilenum].texture = tex; if (istexture) tileSetHightileReplacement(tilenum, 0, fn, (float)(255 - alphacut) * (1.f / 255.f), 1.0f, 1.0f, 1.0, 1.0, 0); @@ -1028,6 +1031,27 @@ bool tileEqualTo(int me, int other) // //=========================================================================== +void tileUpdateAnimations() +{ + for (int i = 0; i < MAXTILES; i++) + { + if (picanm[i].sf & PICANM_ANIMTYPE_MASK) + { + int j = i + animateoffs(i, 0); + + auto id1 = TileFiles.tiledata[i].texture->GetID(); + auto id2 = TileFiles.tiledata[j].texture->GetID(); + TexMan.SetTranslation(id1, id2); + } + } +} + +//=========================================================================== +// +// Picks a texture for rendering for a given tilenum/palette combination +// +//=========================================================================== + bool PickTexture(int picnum, FGameTexture* tex, int paletteid, TexturePick& pick) { @@ -1194,3 +1218,22 @@ void processSetAnim(const char* cmd, FScriptPosition& pos, SetAnim& imp) TileSiz tilesiz; PicAnm picanm; + +#if 0 // this only gets in if unavoidable. It'd be preferable if the script side can solely operate on texture names. +#include "vm.h" + +static int GetTexture(int tile, int anim) +{ + if (tile < 0 || tile >= MAXTILES) return 0; + auto tex = tileGetTexture(tile, anim); + return tex ? tex->GetID().GetIndex() : 0; +} + +DEFINE_ACTION_FUNCTION_NATIVE(_TileFiles, GetTexture, GetTexture) +{ + PARAM_PROLOGUE; + PARAM_INT(tile); + PARAM_BOOL(animate); + ACTION_RETURN_INT(GetTexture(tile, animate)); +} +#endif diff --git a/source/core/textures/buildtiles.h b/source/core/textures/buildtiles.h index 99c461a9c..d8e445422 100644 --- a/source/core/textures/buildtiles.h +++ b/source/core/textures/buildtiles.h @@ -523,6 +523,7 @@ inline FGameTexture* tileGetTexture(int tile, bool animate = false) } bool tileEqualTo(int me, int other); +void tileUpdateAnimations(); bool PickTexture(int picnum, FGameTexture* tex, int paletteid, TexturePick& pick); diff --git a/source/exhumed/src/d_menu.cpp b/source/exhumed/src/d_menu.cpp index e8250ffdf..2174911c6 100644 --- a/source/exhumed/src/d_menu.cpp +++ b/source/exhumed/src/d_menu.cpp @@ -30,106 +30,19 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "gamestate.h" #include "mapinfo.h" #include "gamecontrol.h" - - -#include "menu/menu.h" // to override the local menu.h +#include "v_draw.h" +#include "vm.h" +#include "razemenu.h" #include "../../glbackend/glbackend.h" BEGIN_PS_NS -//---------------------------------------------------------------------------- -// -// Implements the native looking menu used for the main menu -// and the episode/skill selection screens, i.e. the parts -// that need to look authentic -// -//---------------------------------------------------------------------------- -void menu_DoPlasma(); -double zoomsize = 0; - -class PSMainMenu : public DListMenu -{ - - void Init(DMenu* parent, FListMenuDescriptor* desc) override - { - DListMenu::Init(parent, desc); - PlayLocalSound(StaticSound[kSound31], 0, false, CHANF_UI); - } - - void Ticker() override - { - // handle the menu zoom-in - if (zoomsize < 1.) - { - zoomsize += 0.0625; - if (zoomsize >= 1.) { - zoomsize = 1.; - } - } - } - - void PreDraw() override - { - if (mDesc->mMenuName == NAME_Mainmenu) - menu_DoPlasma(); - else - { - auto nLogoTile = EXHUMED ? kExhumedLogo : kPowerslaveLogo; - DrawRel(nLogoTile, 160, 40); - } - } -}; - - -//---------------------------------------------------------------------------- -// -// Menu related game interface functions -// -//---------------------------------------------------------------------------- - -void GameInterface::DrawNativeMenuText(int fontnum, int state, double xpos, double ypos, float fontscale, const char* text, int flags) -{ - int tilenum = (int)strtoll(text, nullptr, 0); - double y = ypos - tilesiz[tilenum].y / 2; - - int8_t shade; - - if (state == NIT_SelectedState) - { // currently selected menu item - shade = Sin(I_GetBuildTime() << 4) >> 9; - } - else if (state == NIT_ActiveState) { - shade = 0; - } - else { - shade = 25; - } - - // Todo: Replace the boxes with an empty one and draw the text with a font. - auto tex = tileGetTexture(tilenum); - - DrawTexture(twod, tex, 160, y + tex->GetDisplayHeight(), DTA_FullscreenScale, FSMode_Fit320x200, DTA_CenterOffset, true, DTA_ScaleX, zoomsize, DTA_ScaleY, zoomsize, - DTA_Color, shadeToLight(shade), TAG_DONE); - - // tilesizx is 51 - // tilesizy is 33 - - if (state == NIT_SelectedState) - { - tex = tileGetTexture(kMenuCursorTile); - DrawTexture(twod, tex, 62, ypos - 12, DTA_FullscreenScale, FSMode_Fit320x200, DTA_TopLeft, true, TAG_DONE); - DrawTexture(twod, tex, 207, ypos - 12, DTA_FullscreenScale, FSMode_Fit320x200, DTA_TopLeft, true, DTA_FlipX, true, TAG_DONE); - } -} - - void GameInterface::MenuOpened() { GrabPalette(); - zoomsize = 0; - StopAllSounds(); + menuDelegate->FloatVar(NAME_zoomsize) = 0; StopLocalSound(); } @@ -137,17 +50,21 @@ void GameInterface::MenuSound(EMenuSounds snd) { switch (snd) { - case CursorSound: - PlayLocalSound(StaticSound[kSound35], 0, false, CHANF_UI); - break; + case ActivateSound: + PlayLocalSound(StaticSound[kSound31], 0, false, CHANF_UI); + break; - case AdvanceSound: - case BackSound: - PlayLocalSound(StaticSound[kSound33], 0, false, CHANF_UI); - break; + case CursorSound: + PlayLocalSound(StaticSound[kSound35], 0, false, CHANF_UI); + break; - default: - return; + case AdvanceSound: + case BackSound: + PlayLocalSound(StaticSound[kSound33], 0, false, CHANF_UI); + break; + + default: + return; } } @@ -156,16 +73,10 @@ void GameInterface::QuitToTitle() gameaction = ga_mainmenu; } -void GameInterface::MenuClosed() -{ - -} - - bool GameInterface::StartGame(FNewGameStartup& gs) { - auto map = FindMapByLevelNum(gs.Episode); - DeferedStartGame(map, gs.Skill); // 0 is training, 1 is the regular game - the game does not have skill levels. + auto map = FindMapByLevelNum(gs.Skill); // 0 is training, 1 is the regular game - the game does not have skill levels. + DeferedStartGame(map, 1, true); return true; } @@ -174,26 +85,22 @@ FSavegameInfo GameInterface::GetSaveSig() return { SAVESIG_PS, MINSAVEVER_PS, SAVEVER_PS }; } -void GameInterface::DrawMenuCaption(const DVector2& origin, const char* text) -{ - // Fixme: should use the extracted font from the menu items (i.e. BigFont) and a stretched box for the menu items. - DrawText(twod, SmallFont, CR_UNTRANSLATED, 160 - SmallFont->StringWidth(text)/2, 10, text, DTA_FullscreenScale, FSMode_Fit320x200Top, TAG_DONE); -} - END_PS_NS -//---------------------------------------------------------------------------- -// -// Class registration -// -//---------------------------------------------------------------------------- +using namespace Exhumed; - -static TMenuClassDescriptor _mm("Exhumed.MainMenu"); - -void RegisterPSMenus() +DEFINE_ACTION_FUNCTION(_ListMenuItemExhumedPlasma, Draw) { - menuClasses.Push(&_mm); + menu_DoPlasma(); + return 0; } + +DEFINE_ACTION_FUNCTION(_ListMenuItemExhumedLogo, Draw) +{ + auto nLogoTile = EXHUMED ? kExhumedLogo : kPowerslaveLogo; + DrawRel(nLogoTile, 160, 40); + return 0; +} + diff --git a/source/exhumed/src/exhumed.cpp b/source/exhumed/src/exhumed.cpp index 8cd209610..a7c81e1e5 100644 --- a/source/exhumed/src/exhumed.cpp +++ b/source/exhumed/src/exhumed.cpp @@ -46,7 +46,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "cheathandler.h" #include "inputstate.h" #include "d_protocol.h" -#include "core/menu/menu.h" +#include "texturemanager.h" +#include "razemenu.h" BEGIN_PS_NS @@ -475,13 +476,26 @@ void ExitGame() throw CExitEvent(0); } +#define x(a, b) registerName(#a, b); +static void SetTileNames() +{ + auto registerName = [](const char* name, int index) + { + TexMan.AddAlias(name, tileGetTexture(index)); + }; +#include "namelist.h" +} +#undef x + void GameInterface::app_init() { int i; //int esi = 1; //int edi = esi; +#if 0 help_disabled = true; +#endif // Create the global level table. Parts of the engine need it, even though the game itself does not. for (int i = 0; i <= 32; i++) { @@ -507,6 +521,7 @@ void GameInterface::app_init() // temp - moving InstallEngine(); before FadeOut as we use nextpage() in FadeOut InstallEngine(); LoadDefinitions(); + SetTileNames(); TileFiles.SetBackup(); diff --git a/source/exhumed/src/exhumed.h b/source/exhumed/src/exhumed.h index bcfaac9f4..92f2bbf92 100644 --- a/source/exhumed/src/exhumed.h +++ b/source/exhumed/src/exhumed.h @@ -237,15 +237,12 @@ struct GameInterface : ::GameInterface void app_init() override; void clearlocalinputstate() override; bool GenerateSavePic() override; - void DrawNativeMenuText(int fontnum, int state, double xpos, double ypos, float fontscale, const char* text, int flags) override; void MenuOpened() override; void MenuSound(EMenuSounds snd) override; - void MenuClosed() override; bool StartGame(FNewGameStartup& gs) override; FSavegameInfo GetSaveSig() override; - void DrawMenuCaption(const DVector2& origin, const char* text) override; - bool LoadGame(FSaveGameNode* sv) override; - bool SaveGame(FSaveGameNode* sv) override; + bool LoadGame() override; + bool SaveGame() override; bool CanSave() override; ReservedSpace GetReservedScreenSpace(int viewsize) override { return { 0, 24 }; } void QuitToTitle() override; diff --git a/source/exhumed/src/gameloop.cpp b/source/exhumed/src/gameloop.cpp index 8d6c8d08c..ed7b58f4e 100644 --- a/source/exhumed/src/gameloop.cpp +++ b/source/exhumed/src/gameloop.cpp @@ -44,10 +44,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "cheathandler.h" #include "statistics.h" #include "g_input.h" -#include "core/menu/menu.h" +#include "razemenu.h" #include "d_net.h" #include "automap.h" #include "raze_music.h" +#include "v_draw.h" BEGIN_PS_NS @@ -137,7 +138,7 @@ static void Intermission(MapRecord *from_map, MapRecord *to_map) { TArray jobs; - StopAllSounds(); + if (from_map) StopAllSounds(); bCamera = false; automapMode = am_off; diff --git a/source/exhumed/src/input.cpp b/source/exhumed/src/input.cpp index 64b8d513c..ef8662fbe 100644 --- a/source/exhumed/src/input.cpp +++ b/source/exhumed/src/input.cpp @@ -21,7 +21,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "player.h" #include "status.h" #include "view.h" -#include "menu.h" +#include "razemenu.h" BEGIN_PS_NS diff --git a/source/exhumed/src/namelist.h b/source/exhumed/src/namelist.h new file mode 100644 index 000000000..2a6a22d87 --- /dev/null +++ b/source/exhumed/src/namelist.h @@ -0,0 +1,30 @@ +x(PowerslaveLogo, 3442) +x(MenuNewGameTile, 3460) +x(MenuLoadGameTile, 3461) +x(MenuMusicTile, 3465) +x(MenuSoundFxTile, 3466) +x(MenuCursorTile, 3468) +x(MenuBlank, 3469) +x(SkullHead, 3582) +x(ExhumedLogo, 3592) +x(Energy1, 3604) +x(Energy2, 3605) +x(ClockSymbol1, 3606) +x(ClockSymbol2, 3607) +x(ClockSymbol3, 3608) +x(ClockSymbol4, 3609) +x(ClockSymbol5, 3610) +x(ClockSymbol6, 3611) +x(ClockSymbol7, 3612) +x(ClockSymbol8, 3613) +x(ClockSymbol9, 3614) +x(ClockSymbol10, 3615) +x(ClockSymbol11, 3616) +x(ClockSymbol12, 3617) +x(ClockSymbol13, 3618) +x(ClockSymbol14, 3619) +x(ClockSymbol15, 3620) +x(ClockSymbol16, 3621) +x(TileLoboLaptop, 3623) +x(TileBMGLogo, 3368) +x(TilePIELogo, 3349) diff --git a/source/exhumed/src/names.h b/source/exhumed/src/names.h index a81d83371..bd0d6bb5d 100644 --- a/source/exhumed/src/names.h +++ b/source/exhumed/src/names.h @@ -3368,7 +3368,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #define kTile3346 3346 #define kTile3347 3347 #define kTile3348 3348 -#define kTilePIELogo 3349 #define kTile3350 3350 #define kTile3351 3351 #define kTile3352 3352 @@ -3387,7 +3386,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #define kTile3365 3365 // sky #define kTile3366 3366 // sky #define kTile3367 3367 // sky -#define kTileBMGLogo 3368 #define kTile3369 3369 #define kTile3370 3370 #define kTile3371 3371 @@ -3461,7 +3459,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #define kTile3439 3439 #define kTile3440 3440 #define kTile3441 3441 -#define kPowerslaveLogo 3442 #define kTile3443 3443 #define kTile3444 3444 #define kTile3445 3445 @@ -3479,16 +3476,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #define kTile3457 3457 #define kTile3458 3458 #define kTile3459 3459 -#define kMenuNewGameTile 3460 -#define kMenuLoadGameTile 3461 #define kTile3462 3462 #define kTile3463 3463 #define kTile3464 3464 -#define kMenuMusicTile 3465 -#define kMenuSoundFxTile 3466 #define kTile3467 3467 -#define kMenuCursorTile 3468 -#define kMenuBlankTitleTile 3469 #define kTile3470 3470 #define kTile3471 3471 #define kTile3472 3472 @@ -3601,7 +3592,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #define kTile3579 3579 #define kTile3580 3580 #define kTile3581 3581 -#define kSkullHead 3582 #define kTile3583 3583 #define kTile3584 3584 #define kTile3585 3585 @@ -3611,7 +3601,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #define kTile3589 3589 #define kTile3590 3590 #define kTile3591 3591 -#define kExhumedLogo 3592 #define kTile3593 3593 #define kTile3594 3594 #define kTile3595 3595 @@ -3623,26 +3612,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #define kTile3601 3601 #define kTile3602 3602 #define kTile3603 3603 -#define kEnergy1 3604 -#define kEnergy2 3605 -#define kClockSymbol1 3606 -#define kClockSymbol2 3607 -#define kClockSymbol3 3608 -#define kClockSymbol4 3609 -#define kClockSymbol5 3610 -#define kClockSymbol6 3611 -#define kClockSymbol7 3612 -#define kClockSymbol8 3613 -#define kClockSymbol9 3614 -#define kClockSymbol10 3615 -#define kClockSymbol11 3616 -#define kClockSymbol12 3617 -#define kClockSymbol13 3618 -#define kClockSymbol14 3619 -#define kClockSymbol15 3620 -#define kClockSymbol16 3621 #define kTile3622 3622 -#define kTileLoboLaptop 3623 #define kTile3624 3624 #define kTile3625 3625 #define kTile3626 3626 @@ -6164,4 +6134,16 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #define kTile6142 6142 #define kTile6143 6143 + +BEGIN_PS_NS + +#define x(a, b) k##a = b, +enum +{ +#include "namelist.h" +}; +#undef x + +END_PS_NS + #endif \ No newline at end of file diff --git a/source/exhumed/src/save.cpp b/source/exhumed/src/save.cpp index 6fd056eb5..1f530302b 100644 --- a/source/exhumed/src/save.cpp +++ b/source/exhumed/src/save.cpp @@ -34,14 +34,14 @@ void LoadTextureState(); static TArray sghelpers(TArray::NoInit); -bool GameInterface::SaveGame(FSaveGameNode* sv) +bool GameInterface::SaveGame() { for (auto sgh : sghelpers) sgh->Save(); SaveTextureState(); return 1; // CHECKME } -bool GameInterface::LoadGame(FSaveGameNode* sv) +bool GameInterface::LoadGame() { for (auto sgh : sghelpers) sgh->Load(); diff --git a/source/exhumed/src/sound.cpp b/source/exhumed/src/sound.cpp index 7b6aeb6ff..480690e3d 100644 --- a/source/exhumed/src/sound.cpp +++ b/source/exhumed/src/sound.cpp @@ -222,7 +222,6 @@ void InitFX(void) auto& S_sfx = soundEngine->GetSounds(); S_sfx.Resize(1); - S_sfx[0].Clear(); S_sfx[0].lumpnum = sfx_empty; for (size_t i = 0; i < kMaxSoundFiles; i++) { StaticSound[i] = LoadSound(SoundFiles[i]); diff --git a/source/games/duke/src/2d_r.cpp b/source/games/duke/src/2d_r.cpp index c26ebd48d..f5fcfd0d3 100644 --- a/source/games/duke/src/2d_r.cpp +++ b/source/games/duke/src/2d_r.cpp @@ -369,11 +369,11 @@ public: DRRLevelSummaryScreen(bool dofadeout = true) : DScreenJob(dofadeout? (fadein | fadeout) : fadein) { if (currentLevel->flags & MI_USERMAP) - gfx_offset = RRTILE403; + gfx_offset = BONUSPIC01; else if (!isRRRA()) - gfx_offset = RRTILE403 + clamp((currentLevel->levelNumber / 100) * 7 + (currentLevel->levelNumber % 100), 0, 13); + gfx_offset = BONUSPIC01 + clamp((currentLevel->levelNumber / 100) * 7 + (currentLevel->levelNumber % 100), 0, 13); else - gfx_offset = LEVELMAP + clamp((currentLevel->levelNumber / 100) * 7 + (currentLevel->levelNumber % 100), 0, 13); + gfx_offset = LEVELMAP01 + clamp((currentLevel->levelNumber / 100) * 7 + (currentLevel->levelNumber % 100), 0, 13); lastmapname = currentLevel->DisplayName(); @@ -544,7 +544,7 @@ public: int Frame(uint64_t clock, bool skiprequest) { int currentclock = int(clock * 120 / 1'000'000'000); - auto tex = tileGetTexture(RRTILE8677 + ((currentclock >> 4) & 1)); + auto tex = tileGetTexture(ENDGAME + ((currentclock >> 4) & 1)); DrawTexture(twod, tex, 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, TAG_DONE); if (!S_CheckSoundPlaying(-1, 35) && currentclock > 15*120) return 0; // make sure it stays, even if sound is off. if (skiprequest) diff --git a/source/games/duke/src/d_menu.cpp b/source/games/duke/src/d_menu.cpp index 6eecfd132..509854270 100644 --- a/source/games/duke/src/d_menu.cpp +++ b/source/games/duke/src/d_menu.cpp @@ -35,7 +35,7 @@ Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms #include "gamecvars.h" #include "gamecontrol.h" #include "c_bind.h" -#include "menu/menu.h" +#include "razemenu.h" #include "gstrings.h" #include "version.h" #include "names.h" @@ -46,177 +46,12 @@ Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms BEGIN_DUKE_NS -//---------------------------------------------------------------------------- -// -// -// -//---------------------------------------------------------------------------- - -static void Menu_DrawBackground(const DVector2 &origin) -{ - DrawTexture(twod, tileGetTexture(TILE_MENUSCREEN), origin.X + 160, origin.Y + 100, DTA_FullscreenScale, FSMode_Fit320x200, DTA_Color, 0xff808080, DTA_CenterOffset, true, TAG_DONE); -} - -//---------------------------------------------------------------------------- -// -// -// -//---------------------------------------------------------------------------- - -static void Menu_DrawCursor(double x, double y, double scale, bool right) -{ - int mclock = I_GetBuildTime(); - const int frames = isRR() ? 16 : 7; - int picnum; - if (!right) picnum = TILE_SPINNINGNUKEICON + ((mclock >> 3) % frames); - else picnum = TILE_SPINNINGNUKEICON + frames - 1 - ((frames - 1 + (mclock >> 3)) % frames); - int light = 231 + (calcSinTableValue(mclock<<5) / 768.); - PalEntry pe(255, light, light, light); - DrawTexture(twod, tileGetTexture(picnum), x, y, DTA_FullscreenScale, FSMode_Fit320x200, DTA_ScaleX, scale, DTA_ScaleY, scale, DTA_Color, pe, DTA_CenterOffsetRel, true, TAG_DONE); -} - -//---------------------------------------------------------------------------- -// -// Implements the native looking menu used for the main menu -// and the episode/skill selection screens, i.e. the parts -// that need to look authentic -// -//---------------------------------------------------------------------------- - -class DukeListMenu : public DListMenu -{ - using Super = DListMenu; -protected: - - void Ticker() override - { - // Lay out the menu. - int y_upper = mDesc->mYpos; - int y_lower = y_upper + mDesc->mYbotton; - int y = 0; - int spacing = 0; - const int height = 15; // cannot take value from the font because it would be inconsistent - - int totalheight = 0, numvalidentries = mDesc->mItems.Size(); - - for (unsigned e = 0; e < mDesc->mItems.Size(); ++e) - { - auto entry = mDesc->mItems[e]; - entry->mHidden = false; - entry->SetHeight(height); - totalheight += height; - } - if (mDesc->mSpacing <= 0) spacing = std::max(0, (y_lower - y_upper - totalheight) / (numvalidentries > 1 ? numvalidentries - 1 : 1)); - if (spacing <= 0) spacing = mDesc->mSpacing; - - int totalHeight; - for (unsigned e = 0; e < mDesc->mItems.Size(); ++e) - { - auto entry = mDesc->mItems[e]; - if (!entry->mHidden) - { - entry->SetY(y_upper + y); - y += height; - totalHeight = y; - y += spacing; - } - } - } -}; - -//---------------------------------------------------------------------------- -// -// -// -//---------------------------------------------------------------------------- - -class DukeMainMenu : public DukeListMenu -{ - virtual void Init(DMenu* parent = nullptr, FListMenuDescriptor* desc = nullptr) override - { - DukeListMenu::Init(parent, desc); - } - - void PreDraw() override - { - DukeListMenu::PreDraw(); - double x = origin.X + 160; - if (isRRRA()) - { - DrawTexture(twod, tileGetTexture(TILE_THREEDEE), x-5, origin.Y+57, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_ScaleX, 0.253, DTA_ScaleY, 0.253, DTA_CenterOffsetRel, true, TAG_DONE); - } - else if (isRR()) - { - DrawTexture(twod, tileGetTexture(TILE_INGAMEDUKETHREEDEE), x+5, origin.Y + 24, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_ScaleX, 0.36, DTA_ScaleY, 0.36, DTA_CenterOffsetRel, true, TAG_DONE); - } - else - { - DrawTexture(twod, tileGetTexture(TILE_INGAMEDUKETHREEDEE), x, origin.Y + 29, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_CenterOffsetRel, true, TAG_DONE); - if (PLUTOPAK) - { - int mclock = I_GetBuildTime(); - int light = 223 + (calcSinTableValue(mclock<<4) / 512.); - PalEntry pe(255, light, light, light); - DrawTexture(twod, tileGetTexture(TILE_PLUTOPAKSPRITE + 2), x + 100, origin.Y + 36, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_Color, pe, DTA_CenterOffsetRel, true, TAG_DONE); - } - } - - } -}; - - //---------------------------------------------------------------------------- // // Menu related game interface functions // //---------------------------------------------------------------------------- -void GameInterface::DrawNativeMenuText(int fontnum, int state, double oxpos, double ypos, float fontscale, const char* text, int flags) -{ - double xpos = oxpos; - int trans; - PalEntry pe; - - double scale = isRR() ? 0.4 : 1.; - if (flags & LMF_Centered) xpos -= BigFont->StringWidth(text) * scale * 0.5; - - if (state == NIT_InactiveState) - { - trans = TRANSLATION(Translation_Remap, 1); - pe = 0xffffffff; - } - else if (state == NIT_SelectedState) - { - trans = 0; - int mclock = I_GetBuildTime(); - int light = 231 + (calcSinTableValue(mclock<<5) / 768.); - pe = PalEntry(255, light, light, light); - } - else - { - trans = 0; - pe = 0xffa0a0a0; - } - - DrawText(twod, BigFont, CR_UNDEFINED, xpos, ypos, text, DTA_FullscreenScale, FSMode_Fit320x200, DTA_ScaleX, scale, DTA_ScaleY, scale, DTA_Color, pe, - DTA_TranslationIndex, trans, TAG_DONE); - - if (state == NIT_SelectedState) - { - const int cursorOffset = 110; - const double cursorScale = isRR() ? 0.2 : 1.0; - const double ymid = ypos + 7; // half height must be hardcoded or layouts will break. - if (flags & LMF_Centered) - { - Menu_DrawCursor(oxpos + cursorOffset, ymid, cursorScale, false); - Menu_DrawCursor(oxpos - cursorOffset, ymid, cursorScale, true); - } - else - Menu_DrawCursor(oxpos - cursorOffset, ymid, cursorScale, false); - } - -} - void GameInterface::MenuOpened() { StopCommentary(); @@ -253,10 +88,6 @@ void GameInterface::MenuSound(EMenuSounds snd) } } -void GameInterface::MenuClosed() -{ -} - bool GameInterface::CanSave() { if (ud.recstat == 2 || gamestate != GS_LEVEL) return false; @@ -270,7 +101,7 @@ bool GameInterface::StartGame(FNewGameStartup& gs) { if (g_gameType & GAMEFLAG_SHAREWARE) { - M_StartMessage(GStrings("BUYDUKE"), 1, -1); + M_StartMessage(GStrings("BUYDUKE"), 1, NAME_None); return false; } } @@ -295,6 +126,7 @@ bool GameInterface::StartGame(FNewGameStartup& gs) } Net_ClearFifo(); } + auto map = FindMapByLevelNum(levelnum(gs.Episode, gs.Level)); if (map) { @@ -310,30 +142,6 @@ FSavegameInfo GameInterface::GetSaveSig() return { SAVESIG_DN3D, MINSAVEVER_DN3D, SAVEVER_DN3D }; } -void GameInterface::DrawMenuCaption(const DVector2& origin, const char* text) -{ - DrawTexture(twod, tileGetTexture(TILE_MENUBAR), origin.X + 160, origin.Y + 19, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_Color, 0xff808080, DTA_CenterOffsetRel, 1, TAG_DONE); - - FString t = text; - size_t newlen = t.Len(); - if (t[t.Len() - 1] == ':') newlen--; - if (newlen > 63) newlen = 63; - t.Truncate(newlen); - double scale = isRR() ? 0.4 : 1.0; - double x = 160 + origin.X - BigFont->StringWidth(t) * scale * 0.5; - DrawText(twod, BigFont, CR_UNTRANSLATED, x, origin.Y + 12, t, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_ScaleX, scale, DTA_ScaleY, scale, TAG_DONE); -} - -void GameInterface::DrawCenteredTextScreen(const DVector2 &origin, const char *text, int position, bool bg) -{ - if (bg) Menu_DrawBackground(origin); - else if (!isRR()) - { - Menu_DrawCursor(160, 130, 1, false); - } - ::GameInterface::DrawCenteredTextScreen(origin, text, position, bg); -} - void GameInterface::DrawPlayerSprite(const DVector2& origin, bool onteam) { int mclock = I_GetBuildTime(); @@ -352,190 +160,5 @@ void GameInterface::QuitToTitle() gameaction = ga_startup; } -//---------------------------------------------------------------------------- -// -// -// -//---------------------------------------------------------------------------- - -static void shadowminitext(int32_t xx, int32_t yy, const char* t, int32_t p) -{ - double x = FixedToFloat(xx); - double y = FixedToFloat(yy); - - DrawText(twod, SmallFont2, CR_UNDEFINED, x + 1, y + 1, t, DTA_FullscreenScale, FSMode_Fit320x200, DTA_Color, 0xff000000, DTA_Alpha, 0.5, TAG_DONE); - DrawText(twod, SmallFont2, CR_UNDEFINED, x, y, t, DTA_FullscreenScale, FSMode_Fit320x200, DTA_TranslationIndex, TRANSLATION(Translation_Remap, p), TAG_DONE); -} - -static void mgametextcenter(int32_t xx, int32_t yy, const char* t) -{ - double x = FixedToFloat(xx) + 160. - SmallFont->StringWidth(t) * 0.5; - double y = FixedToFloat(yy); - - DrawText(twod, SmallFont, CR_UNDEFINED, x, y + 2, t, DTA_FullscreenScale, FSMode_Fit320x200, TAG_DONE); -} - -//---------------------------------------------------------------------------- -// -// allows the front end to override certain fullscreen image menus -// with custom implementations. -// -// This is needed because the credits screens in Duke Nukem -// are either done by providing an image or by printing text, based on the version used. -// -//---------------------------------------------------------------------------- - -bool GameInterface::DrawSpecialScreen(const DVector2& origin, int tilenum) -{ - // Older versions of Duke Nukem create the credits screens manually. - // On the latest version there's real graphics for this. - bool haveCredits = !(g_gameType & GAMEFLAG_DUKE) || (VOLUMEALL && PLUTOPAK); - - int32_t m, l; - if (!haveCredits) - { - if (tilenum == 2504) - { - Menu_DrawBackground(origin); - DrawMenuCaption(origin, GStrings("MNU_CREDITS")); - m = int(origin.X * 65536) + (20 << 16); - l = int(origin.Y * 65536) + (33 << 16); - - shadowminitext(m, l, "Original Concept", 12); l += 7 << 16; - shadowminitext(m, l, "Todd Replogle and Allen H. Blum III", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "Produced & Directed By", 12); l += 7 << 16; - shadowminitext(m, l, "Greg Malone", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "Executive Producer", 12); l += 7 << 16; - shadowminitext(m, l, "George Broussard", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "BUILD Engine", 12); l += 7 << 16; - shadowminitext(m, l, "Ken Silverman", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "Game Programming", 12); l += 7 << 16; - shadowminitext(m, l, "Todd Replogle", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "3D Engine/Tools/Net", 12); l += 7 << 16; - shadowminitext(m, l, "Ken Silverman", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "Network Layer/Setup Program", 12); l += 7 << 16; - shadowminitext(m, l, "Mark Dochtermann", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "Map Design", 12); l += 7 << 16; - shadowminitext(m, l, "Allen H. Blum III", 12); l += 7 << 16; - shadowminitext(m, l, "Richard Gray", 12); l += 7 << 16; - - m = int(origin.X * 65536) + (180 << 16); - l = int(origin.Y * 65536) + (33 << 16); - - shadowminitext(m, l, "3D Modeling", 12); l += 7 << 16; - shadowminitext(m, l, "Chuck Jones", 12); l += 7 << 16; - shadowminitext(m, l, "Sapphire Corporation", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "Artwork", 12); l += 7 << 16; - shadowminitext(m, l, "Dirk Jones, Stephen Hornback", 12); l += 7 << 16; - shadowminitext(m, l, "James Storey, David Demaret", 12); l += 7 << 16; - shadowminitext(m, l, "Douglas R. Wood", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "Sound Engine", 12); l += 7 << 16; - shadowminitext(m, l, "Jim Dose", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "Sound & Music Development", 12); l += 7 << 16; - shadowminitext(m, l, "Robert Prince", 12); l += 7 << 16; - shadowminitext(m, l, "Lee Jackson", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "Voice Talent", 12); l += 7 << 16; - shadowminitext(m, l, "Lani Minella - Voice Producer", 12); l += 7 << 16; - shadowminitext(m, l, "Jon St. John as \"Duke Nukem\"", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "Graphic Design", 12); l += 7 << 16; - shadowminitext(m, l, "Packaging, Manual, Ads", 12); l += 7 << 16; - shadowminitext(m, l, "Robert M. Atkins", 12); l += 7 << 16; - shadowminitext(m, l, "Michael Hadwin", 12); l += 7 << 16; - return true; - } - else if (tilenum == 2505) - { - Menu_DrawBackground(origin); - DrawMenuCaption(origin, GStrings("MNU_CREDITS")); - m = int(origin.X * 65536) + (20 << 16); - l = int(origin.Y * 65536) + (33 << 16); - - shadowminitext(m, l, "Special Thanks To", 12); l += 7 << 16; - shadowminitext(m, l, "Steven Blackburn, Tom Hall", 12); l += 7 << 16; - shadowminitext(m, l, "Scott Miller, Joe Siegler", 12); l += 7 << 16; - shadowminitext(m, l, "Terry Nagy, Colleen Compton", 12); l += 7 << 16; - shadowminitext(m, l, "HASH, Inc., FormGen, Inc.", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "The 3D Realms Beta Testers", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "Nathan Anderson, Wayne Benner", 12); l += 7 << 16; - shadowminitext(m, l, "Glenn Brensinger, Rob Brown", 12); l += 7 << 16; - shadowminitext(m, l, "Erik Harris, Ken Heckbert", 12); l += 7 << 16; - shadowminitext(m, l, "Terry Herrin, Greg Hively", 12); l += 7 << 16; - shadowminitext(m, l, "Hank Leukart, Eric Baker", 12); l += 7 << 16; - shadowminitext(m, l, "Jeff Rausch, Kelly Rogers", 12); l += 7 << 16; - shadowminitext(m, l, "Mike Duncan, Doug Howell", 12); l += 7 << 16; - shadowminitext(m, l, "Bill Blair", 12); l += 7 << 16; - - m = int(origin.X * 65536) + (160 << 16); - l = int(origin.Y * 65536) + (33 << 16); - - shadowminitext(m, l, "Company Product Support", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "The following companies were cool", 12); l += 7 << 16; - shadowminitext(m, l, "enough to give us lots of stuff", 12); l += 7 << 16; - shadowminitext(m, l, "during the making of Duke Nukem 3D.", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "Altec Lansing Multimedia", 12); l += 7 << 16; - shadowminitext(m, l, "for tons of speakers and the", 12); l += 7 << 16; - shadowminitext(m, l, "THX-licensed sound system.", 12); l += 7 << 16; - shadowminitext(m, l, "For info call 1-800-548-0620", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "Creative Labs, Inc.", 12); l += 7 << 16; - l += 3 << 16; - shadowminitext(m, l, "Thanks for the hardware, guys.", 12); l += 7 << 16; - return true; - } - else if (tilenum == 2506) - { - Menu_DrawBackground(origin); - DrawMenuCaption(origin, GStrings("MNU_CREDITS")); - mgametextcenter(int(origin.X * 65536), int(origin.Y * 65536) + (50 << 16), "Duke Nukem 3D is a trademark of"); - mgametextcenter(int(origin.X * 65536), int(origin.Y * 65536) + (59 << 16), "3D Realms Entertainment"); - mgametextcenter(int(origin.X * 65536), int(origin.Y * 65536) + (77 << 16), "Duke Nukem 3D"); - mgametextcenter(int(origin.X * 65536), int(origin.Y * 65536) + (86 << 16), "(C) 1996 3D Realms Entertainment"); - - if (VOLUMEONE) - { - mgametextcenter(int(origin.X * 65536), int(origin.Y * 65536) + (106 << 16), "Please read LICENSE.DOC for shareware"); - mgametextcenter(int(origin.X * 65536), int(origin.Y * 65536) + (115 << 16), "distribution grants and restrictions."); - } - mgametextcenter(int(origin.X * 65536), int(origin.Y * 65536) + ((VOLUMEONE ? 134 : 115) << 16), "Made in Dallas, Texas USA"); - return true; - } - } - return false; -} END_DUKE_NS - -//---------------------------------------------------------------------------- -// -// Class registration -// -//---------------------------------------------------------------------------- - - -static TMenuClassDescriptor _mm("Duke.MainMenu"); -static TMenuClassDescriptor _lm("Duke.ListMenu"); - -static TMenuClassDescriptor _ism("Duke.ImageScrollerMenu"); // does not implement a new class, we only need the descriptor. - -void RegisterDuke3dMenus() -{ - menuClasses.Push(&_mm); - menuClasses.Push(&_lm); - menuClasses.Push(&_ism); -} diff --git a/source/games/duke/src/dispatch.cpp b/source/games/duke/src/dispatch.cpp index c34984cf0..e1cb71262 100644 --- a/source/games/duke/src/dispatch.cpp +++ b/source/games/duke/src/dispatch.cpp @@ -252,7 +252,6 @@ int TILE_CAMCORNER; int TILE_CAMLIGHT; int TILE_STATIC; int TILE_BOTTOMSTATUSBAR; -int TILE_SPINNINGNUKEICON; int TILE_THREEDEE; int TILE_INGAMEDUKETHREEDEE; int TILE_PLUTOPAKSPRITE; diff --git a/source/games/duke/src/duke3d.h b/source/games/duke/src/duke3d.h index b918d7823..a13d7604b 100644 --- a/source/games/duke/src/duke3d.h +++ b/source/games/duke/src/duke3d.h @@ -9,7 +9,7 @@ #include "polymost.h" #include "gamecvars.h" -#include "menu/menu.h" +#include "razemenu.h" #include "funct.h" #include "gamecontrol.h" #include "gamevar.h" @@ -20,6 +20,8 @@ #include "sounds.h" #include "soundefs.h" #include "binaryangle.h" +#include "gamestruct.h" +#include "v_draw.h" BEGIN_DUKE_NS @@ -34,19 +36,14 @@ struct GameInterface : public ::GameInterface bool GenerateSavePic() override; void PlayHudSound() override; GameStats getStats() override; - void DrawNativeMenuText(int fontnum, int state, double xpos, double ypos, float fontscale, const char* text, int flags) override; void MenuOpened() override; void MenuSound(EMenuSounds snd) override; - void MenuClosed() override; bool CanSave() override; bool StartGame(FNewGameStartup& gs) override; FSavegameInfo GetSaveSig() override; - void DrawCenteredTextScreen(const DVector2& origin, const char* text, int position, bool bg) override; double SmallFontScale() override { return isRR() ? 0.5 : 1.; } - void DrawMenuCaption(const DVector2& origin, const char* text) override; void SerializeGameState(FSerializer& arc) override; void QuitToTitle() override; - bool DrawSpecialScreen(const DVector2& origin, int tilenum) override; FString GetCoordString() override; void ExitFromMenu() override; ReservedSpace GetReservedScreenSpace(int viewsize) override; diff --git a/source/games/duke/src/flags_d.cpp b/source/games/duke/src/flags_d.cpp index 3332f1e45..11f2dec90 100644 --- a/source/games/duke/src/flags_d.cpp +++ b/source/games/duke/src/flags_d.cpp @@ -253,7 +253,6 @@ void initactorflags_d() TILE_CAMLIGHT = CAMLIGHT; TILE_STATIC = STATIC; TILE_BOTTOMSTATUSBAR = isWorldTour()? WIDESCREENSTATUSBAR : BOTTOMSTATUSBAR; - TILE_SPINNINGNUKEICON = SPINNINGNUKEICON; TILE_THREEDEE = THREEDEE; TILE_INGAMEDUKETHREEDEE = INGAMEDUKETHREEDEE; TILE_PLUTOPAKSPRITE = PLUTOPAKSPRITE; diff --git a/source/games/duke/src/flags_r.cpp b/source/games/duke/src/flags_r.cpp index b1fd79c1b..900dc7ac7 100644 --- a/source/games/duke/src/flags_r.cpp +++ b/source/games/duke/src/flags_r.cpp @@ -222,7 +222,6 @@ void initactorflags_r() TILE_CAMLIGHT = CAMLIGHT; TILE_STATIC = STATIC; TILE_BOTTOMSTATUSBAR = BOTTOMSTATUSBAR; - TILE_SPINNINGNUKEICON = SPINNINGNUKEICON; TILE_THREEDEE = THREEDEE; TILE_INGAMEDUKETHREEDEE = INGAMEDUKETHREEDEE; TILE_PLUTOPAKSPRITE = PLUTOPAKSPRITE; diff --git a/source/games/duke/src/game.cpp b/source/games/duke/src/game.cpp index da43cf148..8ca840ebd 100644 --- a/source/games/duke/src/game.cpp +++ b/source/games/duke/src/game.cpp @@ -242,6 +242,27 @@ static void initTiles() tileDelete(FOF); } +#define x(a, b) registerName(#a, b); +#define y(a, b) // Do not create names for RRTILExxxx. +static void SetTileNames() +{ + auto registerName = [](const char* name, int index) + { + TexMan.AddAlias(name, tileGetTexture(index)); + }; + if (!isRR()) + { +#include "namelist_d.h" + } + else + { +#include "namelist_r.h" + } +} +#undef x +#undef y + + //--------------------------------------------------------------------------- // // set up the game module's state @@ -313,6 +334,7 @@ void GameInterface::app_init() } LoadDefinitions(); + SetTileNames(); TileFiles.SetBackup(); if (ud.multimode > 1) diff --git a/source/games/duke/src/gamedef.cpp b/source/games/duke/src/gamedef.cpp index d6d78b3ff..80e1aa490 100644 --- a/source/games/duke/src/gamedef.cpp +++ b/source/games/duke/src/gamedef.cpp @@ -40,12 +40,13 @@ Modifications for JonoF's port by Jonathon Fowler (jf@jonof.id.au) #include "printf.h" #include "filesystem.h" #include "mapinfo.h" -#include "menu.h" +#include "razemenu.h" #include "global.h" #include "m_argv.h" #include "sounds.h" #include "conlabel.h" #include "conlabeldef.h" +#include "gi.h" BEGIN_DUKE_NS @@ -1880,6 +1881,7 @@ int ConCompiler::parsecommand() else if (pcount == 31) g_gameType |= GAMEFLAG_PLUTOPAK | GAMEFLAG_WORLDTOUR; else if (pcount != 26) I_FatalError("Invalid CONs. Cannot detect version. gamestartup has %d entries", pcount); } + gameinfo.gametype = g_gameType; popscriptvalue(); auto parseone = [&]() { return params[pget++]; }; diff --git a/source/games/duke/src/gameloop.cpp b/source/games/duke/src/gameloop.cpp index b4bd5ee99..5f460686b 100644 --- a/source/games/duke/src/gameloop.cpp +++ b/source/games/duke/src/gameloop.cpp @@ -133,8 +133,8 @@ void GameInterface::Startup() } else { - if (!userConfig.nologo) fi.ShowLogo([](bool) { gameaction = ga_mainmenu; }); - else gameaction = ga_mainmenu; + if (!userConfig.nologo) fi.ShowLogo([](bool) { gameaction = ga_mainmenunostopsound; }); + else gameaction = ga_mainmenunostopsound; } } diff --git a/source/games/duke/src/namelist_d.h b/source/games/duke/src/namelist_d.h new file mode 100644 index 000000000..e098e67b4 --- /dev/null +++ b/source/games/duke/src/namelist_d.h @@ -0,0 +1,764 @@ +x(ARROW, 20) +x(FIRSTGUNSPRITE, 21) +x(CHAINGUNSPRITE, 22) +x(RPGSPRITE, 23) +x(FREEZESPRITE, 24) +x(SHRINKERSPRITE, 25) +x(HEAVYHBOMB, 26) +x(TRIPBOMBSPRITE, 27) +x(SHOTGUNSPRITE, 28) +x(DEVISTATORSPRITE, 29) +x(HEALTHBOX, 30) +x(AMMOBOX, 31) +x(GROWSPRITEICON, 32) +x(INVENTORYBOX, 33) +x(FREEZEAMMO, 37) +x(AMMO, 40) +x(BATTERYAMMO, 41) +x(DEVISTATORAMMO, 42) +x(RPGAMMO, 44) +x(GROWAMMO, 45) +x(CRYSTALAMMO, 46) +x(HBOMBAMMO, 47) +x(AMMOLOTS, 48) +x(SHOTGUNAMMO, 49) +x(COLA, 51) +x(SIXPAK, 52) +x(FIRSTAID, 53) +x(SHIELD, 54) +x(STEROIDS, 55) +x(AIRTANK, 56) +x(JETPACK, 57) +x(HEATSENSOR, 59) +x(ACCESSCARD, 60) +x(BOOTS, 61) +x(MIRRORBROKE, 70) +x(CLOUDYOCEAN, 78) +x(CLOUDYSKIES, 79) +x(MOONSKY1, 80) +x(MOONSKY2, 81) +x(MOONSKY3, 82) +x(MOONSKY4, 83) +x(BIGORBIT1, 84) +x(BIGORBIT2, 85) +x(BIGORBIT3, 86) +x(BIGORBIT4, 87) +x(BIGORBIT5, 88) +x(LA, 89) +x(REDSKY1, 98) +x(REDSKY2, 99) +x(ATOMICHEALTH, 100) +x(TECHLIGHT2, 120) +x(TECHLIGHTBUST2, 121) +x(TECHLIGHT4, 122) +x(TECHLIGHTBUST4, 123) +x(WALLLIGHT4, 124) +x(WALLLIGHTBUST4, 125) +x(ACCESSSWITCH, 130) +x(SLOTDOOR, 132) +x(LIGHTSWITCH, 134) +x(SPACEDOORSWITCH, 136) +x(SPACELIGHTSWITCH, 138) +x(FRANKENSTINESWITCH, 140) +x(NUKEBUTTON, 142) +x(MULTISWITCH, 146) +x(DOORTILE5, 150) +x(DOORTILE6, 151) +x(DOORTILE1, 152) +x(DOORTILE2, 153) +x(DOORTILE3, 154) +x(DOORTILE4, 155) +x(DOORTILE7, 156) +x(DOORTILE8, 157) +x(DOORTILE9, 158) +x(DOORTILE10, 159) +x(DOORSHOCK, 160) +x(DIPSWITCH, 162) +x(DIPSWITCH2, 164) +x(TECHSWITCH, 166) +x(DIPSWITCH3, 168) +x(ACCESSSWITCH2, 170) +x(REFLECTWATERTILE, 180) +x(FLOORSLIME, 200) +x(BIGFORCE, 230) +x(EPISODE, 247) +x(MASKWALL9, 255) +x(W_LIGHT, 260) +x(SCREENBREAK1, 263) +x(SCREENBREAK2, 264) +x(SCREENBREAK3, 265) +x(SCREENBREAK4, 266) +x(SCREENBREAK5, 267) +x(SCREENBREAK6, 268) +x(SCREENBREAK7, 269) +x(SCREENBREAK8, 270) +x(SCREENBREAK9, 271) +x(SCREENBREAK10, 272) +x(SCREENBREAK11, 273) +x(SCREENBREAK12, 274) +x(SCREENBREAK13, 275) +x(MASKWALL1, 285) +x(W_TECHWALL1, 293) +x(W_TECHWALL2, 297) +x(W_TECHWALL15, 299) +x(W_TECHWALL3, 301) +x(W_TECHWALL4, 305) +x(W_TECHWALL10, 306) +x(W_TECHWALL16, 307) +x(WATERTILE2, 336) +x(BPANNEL1, 341) +x(PANNEL1, 342) +x(PANNEL2, 343) +x(WATERTILE, 344) +x(STATIC, 351) +x(W_SCREENBREAK, 357) +x(W_HITTECHWALL3, 360) +x(W_HITTECHWALL4, 361) +x(W_HITTECHWALL2, 362) +x(W_HITTECHWALL1, 363) +x(MASKWALL10, 387) +x(MASKWALL11, 391) +x(DOORTILE22, 395) +x(FANSPRITE, 407) +x(FANSPRITEBROKE, 411) +x(FANSHADOW, 412) +x(FANSHADOWBROKE, 416) +x(DOORTILE18, 447) +x(DOORTILE19, 448) +x(DOORTILE20, 449) +x(SPACESHUTTLE, 487) +x(SATELLITE, 489) +x(VIEWSCREEN2, 499) +x(VIEWSCREENBROKE, 501) +x(VIEWSCREEN, 502) +x(GLASS, 503) +x(GLASS2, 504) +x(STAINGLASS1, 510) +x(MASKWALL5, 514) +x(SATELITE, 516) +x(FUELPOD, 517) +x(SLIMEPIPE, 538) +x(CRACK1, 546) +x(CRACK2, 547) +x(CRACK3, 548) +x(CRACK4, 549) +x(FOOTPRINTS, 550) +x(DOMELITE, 551) +x(CAMERAPOLE, 554) +x(CHAIR1, 556) +x(CHAIR2, 557) +x(BROKENCHAIR, 559) +x(MIRROR, 560) +x(WATERFOUNTAIN, 563) +x(WATERFOUNTAINBROKE, 567) +x(FEMMAG1, 568) +x(TOILET, 569) +x(STALL, 571) +x(STALLBROKE, 573) +x(FEMMAG2, 577) +x(REACTOR2, 578) +x(REACTOR2BURNT, 579) +x(REACTOR2SPARK, 580) +x(GRATE1, 595) +x(BGRATE1, 596) +x(SOLARPANNEL, 602) +x(NAKED1, 603) +x(ANTENNA, 607) +x(MASKWALL12, 609) +x(TOILETBROKE, 615) +x(PIPE2, 616) +x(PIPE1B, 617) +x(PIPE3, 618) +x(PIPE1, 619) +x(CAMERA1, 621) +x(BRICK, 626) +x(SPLINTERWOOD, 630) +x(PIPE2B, 633) +x(BOLT1, 634) +x(W_NUMBERS, 640) +x(WATERDRIP, 660) +x(WATERBUBBLE, 661) +x(WATERBUBBLEMAKER, 662) +x(W_FORCEFIELD, 663) +x(VACUUM, 669) +x(FOOTPRINTS2, 672) +x(FOOTPRINTS3, 673) +x(FOOTPRINTS4, 674) +x(EGG, 675) +x(SCALE, 678) +x(CHAIR3, 680) +x(CAMERALIGHT, 685) +x(MOVIECAMERA, 686) +x(IVUNIT, 689) +x(POT1, 694) +x(POT2, 695) +x(POT3, 697) +x(PIPE3B, 700) +x(WALLLIGHT3, 701) +x(WALLLIGHTBUST3, 702) +x(WALLLIGHT1, 703) +x(WALLLIGHTBUST1, 704) +x(WALLLIGHT2, 705) +x(WALLLIGHTBUST2, 706) +x(LIGHTSWITCH2, 712) +x(WAITTOBESEATED, 716) +x(DOORTILE14, 717) +x(STATUE, 753) +x(MIKE, 762) +x(VASE, 765) +x(SUSHIPLATE1, 768) +x(SUSHIPLATE2, 769) +x(SUSHIPLATE3, 774) +x(SUSHIPLATE4, 779) +x(DOORTILE16, 781) +x(SUSHIPLATE5, 792) +x(OJ, 806) +x(MASKWALL13, 830) +x(HURTRAIL, 859) +x(POWERSWITCH1, 860) +x(LOCKSWITCH1, 862) +x(POWERSWITCH2, 864) +x(ATM, 867) +x(STATUEFLASH, 869) +x(ATMBROKE, 888) +x(BIGHOLE2, 893) +x(STRIPEBALL, 901) +x(QUEBALL, 902) +x(POCKET, 903) +x(WOODENHORSE, 904) +x(TREE1, 908) +x(TREE2, 910) +x(CACTUS, 911) +x(MASKWALL2, 913) +x(MASKWALL3, 914) +x(MASKWALL4, 915) +x(FIREEXT, 916) +x(TOILETWATER, 921) +x(NEON1, 925) +x(NEON2, 926) +x(CACTUSBROKE, 939) +x(BOUNCEMINE, 940) +x(BROKEFIREHYDRENT, 950) +x(BOX, 951) +x(BULLETHOLE, 952) +x(BOTTLE1, 954) +x(BOTTLE2, 955) +x(BOTTLE3, 956) +x(BOTTLE4, 957) +x(FEMPIC5, 963) +x(FEMPIC6, 964) +x(FEMPIC7, 965) +x(HYDROPLANT, 969) +x(OCEANSPRITE1, 971) +x(OCEANSPRITE2, 972) +x(OCEANSPRITE3, 973) +x(OCEANSPRITE4, 974) +x(OCEANSPRITE5, 975) +x(GENERICPOLE, 977) +x(CONE, 978) +x(HANGLIGHT, 979) +x(HYDRENT, 981) +x(MASKWALL14, 988) +x(TIRE, 990) +x(PIPE5, 994) +x(PIPE6, 995) +x(PIPE4, 996) +x(PIPE4B, 997) +x(BROKEHYDROPLANT, 1003) +x(PIPE5B, 1005) +x(NEON3, 1007) +x(NEON4, 1008) +x(NEON5, 1009) +x(BOTTLE5, 1012) +x(BOTTLE6, 1013) +x(BOTTLE8, 1014) +x(SPOTLITE, 1020) +x(HANGOOZ, 1022) +x(MASKWALL15, 1024) +x(BOTTLE7, 1025) +x(HORSEONSIDE, 1026) +x(GLASSPIECES, 1031) +x(HORSELITE, 1034) +x(DONUTS, 1045) +x(NEON6, 1046) +x(MASKWALL6, 1059) +x(CLOCK, 1060) +x(RUBBERCAN, 1062) +x(BROKENCLOCK, 1067) +x(PLUG, 1069) +x(OOZFILTER, 1079) +x(FLOORPLASMA, 1082) +x(REACTOR, 1088) +x(REACTORSPARK, 1092) +x(REACTORBURNT, 1096) +x(DOORTILE15, 1102) +x(HANDSWITCH, 1111) +x(CIRCLEPANNEL, 1113) +x(CIRCLEPANNELBROKE, 1114) +x(PULLSWITCH, 1122) +x(MASKWALL8, 1124) +x(BIGHOLE, 1141) +x(ALIENSWITCH, 1142) +x(DOORTILE21, 1144) +x(HANDPRINTSWITCH, 1155) +x(BOTTLE10, 1157) +x(BOTTLE11, 1158) +x(BOTTLE12, 1159) +x(BOTTLE13, 1160) +x(BOTTLE14, 1161) +x(BOTTLE15, 1162) +x(BOTTLE16, 1163) +x(BOTTLE17, 1164) +x(BOTTLE18, 1165) +x(BOTTLE19, 1166) +x(DOORTILE17, 1169) +x(MASKWALL7, 1174) +x(JAILBARBREAK, 1175) +x(DOORTILE11, 1178) +x(DOORTILE12, 1179) +x(VENDMACHINE, 1212) +x(VENDMACHINEBROKE, 1214) +x(COLAMACHINE, 1215) +x(COLAMACHINEBROKE, 1217) +x(CRANEPOLE, 1221) +x(CRANE, 1222) +x(BARBROKE, 1225) +x(BLOODPOOL, 1226) +x(NUKEBARREL, 1227) +x(NUKEBARRELDENTED, 1228) +x(NUKEBARRELLEAKED, 1229) +x(CANWITHSOMETHING, 1232) +x(MONEY, 1233) +x(BANNER, 1236) +x(EXPLODINGBARREL, 1238) +x(EXPLODINGBARREL2, 1239) +x(FIREBARREL, 1240) +x(SEENINE, 1247) +x(SEENINEDEAD, 1248) +x(STEAM, 1250) +x(CEILINGSTEAM, 1255) +x(PIPE6B, 1260) +x(TRANSPORTERBEAM, 1261) +x(RAT, 1267) +x(TRASH, 1272) +x(FEMPIC1, 1280) +x(FEMPIC2, 1289) +x(BLANKSCREEN, 1293) +x(PODFEM1, 1294) +x(FEMPIC3, 1298) +x(FEMPIC4, 1306) +x(FEM1, 1312) +x(FEM2, 1317) +x(FEM3, 1321) +x(FEM5, 1323) +x(BLOODYPOLE, 1324) +x(FEM4, 1325) +x(FEM6, 1334) +x(FEM6PAD, 1335) +x(FEM8, 1336) +x(HELECOPT, 1346) +x(FETUSJIB, 1347) +x(HOLODUKE, 1348) +x(SPACEMARINE, 1353) +x(INDY, 1355) +x(FETUS, 1358) +x(FETUSBROKE, 1359) +x(MONK, 1352) +x(LUKE, 1354) +x(COOLEXPLOSION1, 1360) +x(WATERSPLASH2, 1380) +x(FIREVASE, 1390) +x(SCRATCH, 1393) +x(FEM7, 1395) +x(APLAYERTOP, 1400) +x(APLAYER, 1405) +x(PLAYERONWATER, 1420) +x(DUKELYINGDEAD, 1518) +x(DUKETORSO, 1520) +x(DUKEGUN, 1528) +x(DUKELEG, 1536) +x(SHARK, 1550) +x(BLOOD, 1620) +x(FIRELASER, 1625) +x(TRANSPORTERSTAR, 1630) +x(SPIT, 1636) +x(LOOGIE, 1637) +x(FIST, 1640) +x(FREEZEBLAST, 1641) +x(DEVISTATORBLAST, 1642) +x(SHRINKSPARK, 1646) +x(TONGUE, 1647) +x(MORTER, 1650) +x(SHRINKEREXPLOSION, 1656) +x(RADIUSEXPLOSION, 1670) +x(FORCERIPPLE, 1671) +x(LIZTROOP, 1680) +x(LIZTROOPRUNNING, 1681) +x(LIZTROOPSTAYPUT, 1682) +x(LIZTOP, 1705) +x(LIZTROOPSHOOT, 1715) +x(LIZTROOPJETPACK, 1725) +x(LIZTROOPDSPRITE, 1734) +x(LIZTROOPONTOILET, 1741) +x(LIZTROOPJUSTSIT, 1742) +x(LIZTROOPDUCKING, 1744) +x(HEADJIB1, 1768) +x(ARMJIB1, 1772) +x(LEGJIB1, 1776) +x(CANNONBALL, 1817) +x(OCTABRAIN, 1820) +x(OCTABRAINSTAYPUT, 1821) +x(OCTATOP, 1845) +x(OCTADEADSPRITE, 1855) +x(INNERJAW, 1860) +x(DRONE, 1880) +x(EXPLOSION2, 1890) +x(COMMANDER, 1920) +x(COMMANDERSTAYPUT, 1921) +x(RECON, 1960) +x(TANK, 1975) +x(PIGCOP, 2000) +x(PIGCOPSTAYPUT, 2001) +x(PIGCOPDIVE, 2045) +x(PIGCOPDEADSPRITE, 2060) +x(PIGTOP, 2061) +x(LIZMAN, 2120) +x(LIZMANSTAYPUT, 2121) +x(LIZMANSPITTING, 2150) +x(LIZMANFEEDING, 2160) +x(LIZMANJUMP, 2165) +x(LIZMANDEADSPRITE, 2185) +x(FECES, 2200) +x(LIZMANHEAD1, 2201) +x(LIZMANARM1, 2205) +x(LIZMANLEG1, 2209) +x(EXPLOSION2BOT, 2219) +x(USERWEAPON, 2235) +x(HEADERBAR, 2242) +x(JIBS1, 2245) +x(JIBS2, 2250) +x(JIBS3, 2255) +x(JIBS4, 2260) +x(JIBS5, 2265) +x(BURNING, 2270) +x(FIRE, 2271) +x(JIBS6, 2286) +x(BLOODSPLAT1, 2296) +x(BLOODSPLAT3, 2297) +x(BLOODSPLAT2, 2298) +x(BLOODSPLAT4, 2299) +x(OOZ, 2300) +x(OOZ2, 2309) +x(WALLBLOOD1, 2301) +x(WALLBLOOD2, 2302) +x(WALLBLOOD3, 2303) +x(WALLBLOOD4, 2304) +x(WALLBLOOD5, 2305) +x(WALLBLOOD6, 2306) +x(WALLBLOOD7, 2307) +x(WALLBLOOD8, 2308) +x(BURNING2, 2310) +x(FIRE2, 2311) +x(CRACKKNUCKLES, 2324) +x(SMALLSMOKE, 2329) +x(SMALLSMOKEMAKER, 2330) +x(FLOORFLAME, 2333) +x(ROTATEGUN, 2360) +x(GREENSLIME, 2370) +x(WATERDRIPSPLASH, 2380) +x(SCRAP6, 2390) +x(SCRAP1, 2400) +x(SCRAP2, 2404) +x(SCRAP3, 2408) +x(SCRAP4, 2412) +x(SCRAP5, 2416) +x(ORGANTIC, 2420) +x(BETAVERSION, 2440) +x(PLAYERISHERE, 2442) +x(PLAYERWASHERE, 2443) +x(SELECTDIR, 2444) +x(F1HELP, 2445) +x(NOTCHON, 2446) +x(NOTCHOFF, 2447) +x(GROWSPARK, 2448) +x(DUKEICON, 2452) +x(BADGUYICON, 2453) +x(FOODICON, 2454) +x(GETICON, 2455) +x(MENUSCREEN, 2456) +x(MENUBAR, 2457) +x(KILLSICON, 2458) +x(FIRSTAID_ICON, 2460) +x(HEAT_ICON, 2461) +x(BOTTOMSTATUSBAR, 2462) +x(BOOT_ICON, 2463) +x(FRAGBAR, 2465) +x(JETPACK_ICON, 2467) +x(AIRTANK_ICON, 2468) +x(STEROIDS_ICON, 2469) +x(HOLODUKE_ICON, 2470) +x(ACCESS_ICON, 2471) +x(DIGITALNUM, 2472) +x(DUKECAR, 2491) +x(CAMCORNER, 2482) +x(CAMLIGHT, 2484) +x(LOGO, 2485) +x(TITLE, 2486) +x(NUKEWARNINGICON, 2487) +x(MOUSECURSOR, 2488) +x(SLIDEBAR, 2489) +x(DREALMS, 2492) +x(BETASCREEN, 2493) +x(WINDOWBORDER1, 2494) +x(TEXTBOX, 2495) +x(WINDOWBORDER2, 2496) +x(DUKENUKEM, 2497) +x(THREEDEE, 2498) +x(INGAMEDUKETHREEDEE, 2499) +x(TENSCREEN, 2500) +x(PLUTOPAKSPRITE, 2501) +x(MENUPLUTOPAKSPRITE, 2503) +x(CREDITPAGE1, 2504) +x(CREDITPAGE2, 2505) +x(CREDITPAGE3, 2506) +x(DEVISTATOR, 2510) +x(KNEE, 2521) +x(CROSSHAIR, 2523) +x(FIRSTGUN, 2524) +x(FIRSTGUNRELOAD, 2528) +x(FALLINGCLIP, 2530) +x(CLIPINHAND, 2531) +x(HAND, 2532) +x(SHELL, 2533) +x(SHOTGUNSHELL, 2535) +x(CHAINGUN, 2536) +x(RPGGUN, 2544) +x(RPGMUZZLEFLASH, 2545) +x(FREEZE, 2548) +x(CATLITE, 2552) +x(SHRINKER, 2556) +x(HANDHOLDINGLASER, 2563) +x(TRIPBOMB, 2566) +x(LASERLINE, 2567) +x(HANDHOLDINGACCESS, 2568) +x(HANDREMOTE, 2570) +x(HANDTHROW, 2573) +x(TIP, 2576) +x(GLAIR, 2578) +x(SCUBAMASK, 2581) +x(SPACEMASK, 2584) +x(FORCESPHERE, 2590) +x(SHOTSPARK1, 2595) +x(RPG, 2605) +x(LASERSITE, 2612) +x(SHOTGUN, 2613) +x(BOSS1, 2630) +x(BOSS1STAYPUT, 2631) +x(BOSS1SHOOT, 2660) +x(BOSS1LOB, 2670) +x(BOSSTOP, 2696) +x(BOSS2, 2710) +x(BOSS3, 2760) +x(SPINNINGNUKEICON0, 2813) +x(SPINNINGNUKEICON1, 2814) +x(SPINNINGNUKEICON2, 2815) +x(SPINNINGNUKEICON3, 2816) +x(SPINNINGNUKEICON4, 2817) +x(SPINNINGNUKEICON5, 2818) +x(SPINNINGNUKEICON6, 2819) +x(BIGFNTCURSOR, 2820) +x(SMALLFNTCURSOR, 2821) +x(STARTALPHANUM, 2822) +x(ENDALPHANUM, 2915) +x(BIGALPHANUM, 2940) +x(BIGPERIOD, 3002) +x(BIGCOMMA, 3003) +x(BIGX, 3004) +x(BIGQ, 3005) +x(BIGSEMI, 3006) +x(BIGCOLIN, 3007) +x(THREEBYFIVE, 3010) +x(BIGAPPOS, 3022) +x(BLANK, 3026) +x(MINIFONT, 3072) +x(BUTTON1, 3164) +x(GLASS3, 3187) +x(RESPAWNMARKERRED, 3190) +x(RESPAWNMARKERYELLOW, 3200) +x(RESPAWNMARKERGREEN, 3210) +x(BONUSSCREEN, 3240) +x(VIEWBORDER, 3250) +x(VICTORY1, 3260) +x(ORDERING, 3270) +x(TEXTSTORY, 3280) +x(LOADSCREEN, 3281) +x(E1ENDSCREEN, 3292) +x(E2ENDSCREEN, 3293) +x(BORNTOBEWILDSCREEN, 3370) +x(BLIMP, 3400) +x(FEM9, 3450) +x(FOOTPRINT, 3701) +x(FRAMEEFFECT1_13, 3999) +x(POOP, 4094) +x(FRAMEEFFECT1, 4095) +x(PANNEL3, 4099) +x(SCREENBREAK14, 4120) +x(SCREENBREAK15, 4123) +x(SCREENBREAK19, 4125) +x(SCREENBREAK16, 4127) +x(SCREENBREAK17, 4128) +x(SCREENBREAK18, 4129) +x(W_TECHWALL11, 4130) +x(W_TECHWALL12, 4131) +x(W_TECHWALL13, 4132) +x(W_TECHWALL14, 4133) +x(W_TECHWALL5, 4134) +x(W_TECHWALL6, 4136) +x(W_TECHWALL7, 4138) +x(W_TECHWALL8, 4140) +x(W_TECHWALL9, 4142) +x(BPANNEL3, 4100) +x(W_HITTECHWALL16, 4144) +x(W_HITTECHWALL10, 4145) +x(W_HITTECHWALL15, 4147) +x(W_MILKSHELF, 4181) +x(W_MILKSHELFBROKE, 4203) +x(PURPLELAVA, 4240) +x(LAVABUBBLE, 4340) +x(DUKECUTOUT, 4352) +x(TARGET, 4359) +x(GUNPOWDERBARREL, 4360) +x(DUCK, 4361) +x(HATRACK, 4367) +x(DESKLAMP, 4370) +x(COFFEEMACHINE, 4372) +x(CUPS, 4373) +x(GAVALS, 4374) +x(GAVALS2, 4375) +x(POLICELIGHTPOLE, 4377) +x(FLOORBASKET, 4388) +x(PUKE, 4389) +x(DOORTILE23, 4391) +x(TOPSECRET, 4396) +x(SPEAKER, 4397) +x(TEDDYBEAR, 4400) +x(ROBOTDOG, 4402) +x(ROBOTPIRATE, 4404) +x(ROBOTMOUSE, 4407) +x(MAIL, 4410) +x(MAILBAG, 4413) +x(HOTMEAT, 4427) +x(COFFEEMUG, 4438) +x(DONUTS2, 4440) +x(TRIPODCAMERA, 4444) +x(METER, 4453) +x(DESKPHONE, 4454) +x(GUMBALLMACHINE, 4458) +x(GUMBALLMACHINEBROKE, 4459) +x(PAPER, 4460) +x(MACE, 4464) +x(GENERICPOLE2, 4465) +x(XXXSTACY, 4470) +x(WETFLOOR, 4495) +x(BROOM, 4496) +x(MOP, 4497) +x(LETTER, 4502) +x(PIRATE1A, 4510) +x(PIRATE4A, 4511) +x(PIRATE2A, 4512) +x(PIRATE5A, 4513) +x(PIRATE3A, 4514) +x(PIRATE6A, 4515) +x(PIRATEHALF, 4516) +x(CHESTOFGOLD, 4520) +x(SIDEBOLT1, 4525) +x(FOODOBJECT1, 4530) +x(FOODOBJECT2, 4531) +x(FOODOBJECT3, 4532) +x(FOODOBJECT4, 4533) +x(FOODOBJECT5, 4534) +x(FOODOBJECT6, 4535) +x(FOODOBJECT7, 4536) +x(FOODOBJECT8, 4537) +x(FOODOBJECT9, 4538) +x(FOODOBJECT10, 4539) +x(FOODOBJECT11, 4540) +x(FOODOBJECT12, 4541) +x(FOODOBJECT13, 4542) +x(FOODOBJECT14, 4543) +x(FOODOBJECT15, 4544) +x(FOODOBJECT16, 4545) +x(FOODOBJECT17, 4546) +x(FOODOBJECT18, 4547) +x(FOODOBJECT19, 4548) +x(FOODOBJECT20, 4549) +x(HEADLAMP, 4550) +x(TAMPON, 4557) +x(SKINNEDCHICKEN, 4554) +x(FEATHEREDCHICKEN, 4555) +x(ROBOTDOG2, 4560) +x(JOLLYMEAL, 4569) +x(DUKEBURGER, 4570) +x(SHOPPINGCART, 4576) +x(CANWITHSOMETHING2, 4580) +x(CANWITHSOMETHING3, 4581) +x(CANWITHSOMETHING4, 4582) +x(SNAKEP, 4590) +x(DOLPHIN1, 4591) +x(DOLPHIN2, 4592) +x(NEWBEAST, 4610) +x(NEWBEASTSTAYPUT, 4611) +x(NEWBEASTJUMP, 4690) +x(NEWBEASTHANG, 4670) +x(NEWBEASTHANGDEAD, 4671) +x(BOSS4, 4740) +x(BOSS4STAYPUT, 4741) +x(FEM10, 4864) +x(TOUGHGAL, 4866) +x(MAN, 4871) +x(MAN2, 4872) +x(WOMAN, 4874) +x(PLEASEWAIT, 4887) +x(NATURALLIGHTNING, 4890) +x(WEATHERWARN, 4893) +x(DUKETAG, 4900) +x(SIGN1, 4909) +x(SIGN2, 4912) +x(JURYGUY, 4943) + + +// New names from World Tour +x(WIDESCREENSTATUSBAR, 5120) +x(RPGGUNWIDE, 5121) +x(FIRSTGUNRELOADWIDE, 5122) +x(FREEZEWIDE, 5123) +x(FREEZEFIREWIDE, 5124) +x(SHRINKERWIDE, 5127) +x(CRACKKNUCKLESWIDE, 5129) +x(ONFIRESMOKE, 5143) +x(LAVASPLASH, 5371) +x(BOSS2STAYPUT, 2711) +x(BOSS3STAYPUT, 2761) +x(WTGLASS1, 5736) +x(WTGLASS2, 5737) +x(FLAMETHROWERSPRITE, 5134) +x(FLAMETHROWERAMMO, 5135) +x(FLAMETHROWER, 5138) +x(ONFIRE, 5152) +x(LAVAPOOL, 5304) +x(LAVAPOOLBUBBLE, 5207) +x(WHISPYSMOKE, 5268) +x(FLAMETHROWERFIRE, 5139) +x(FLAMETHROWERFLAME, 1891) +x(FLAMETHROWERPILOT, 5174) +x(FIREBALL, 5163) +x(BURNEDCORPSE, 5173) +x(FIREFLY, 5180) +x(FIREFLYSHRINKEFFECT, 5360) +x(FIREFLYGROWEFFECT, 5367) +x(FIREFLYFLYINGEFFECT, 5296) +x(DEVELOPERCOMMENTARY, 5294) +x(BOSS5, 5310) +x(BOSS5STAYPUT, 5311) +x(SERIOUSSAM, 5846) + diff --git a/source/games/duke/src/namelist_r.h b/source/games/duke/src/namelist_r.h new file mode 100644 index 000000000..ea59ca1a5 --- /dev/null +++ b/source/games/duke/src/namelist_r.h @@ -0,0 +1,1392 @@ +y(RRTILE11, 11) +x(PLEASEWAIT, 12) +x(RPG2SPRITE, 14) +x(DUKETAG, 15) +x(SIGN1, 16) +x(SIGN2, 17) +y(RRTILE18, 18) +y(RRTILE19, 19) +x(ARROW, 20) +x(FIRSTGUNSPRITE, 21) +x(CHAINGUNSPRITE, 22) +x(RPGSPRITE, 23) +x(FREEZESPRITE, 24) +x(SHRINKERSPRITE, 25) +x(HEAVYHBOMB, 26) +x(TRIPBOMBSPRITE, 27) +x(SHOTGUNSPRITE, 28) +x(DEVISTATORSPRITE, 29) +x(HEALTHBOX, 30) +x(AMMOBOX, 31) +x(GROWSPRITEICON, 32) +x(INVENTORYBOX, 33) +y(RRTILE34, 34) +y(RRTILE35, 35) +x(DESTRUCTO, 36) +x(FREEZEAMMO, 37) +y(RRTILE38, 38) +x(AMMO, 40) +x(BATTERYAMMO, 41) +x(DEVISTATORAMMO, 42) +x(SAWAMMO, 43) +x(RPGAMMO, 44) +x(GROWAMMO, 45) +x(CRYSTALAMMO, 46) +x(HBOMBAMMO, 47) +x(AMMOLOTS, 48) +x(SHOTGUNAMMO, 49) +x(COLA, 51) +x(SIXPAK, 52) +x(FIRSTAID, 53) +x(SHIELD, 54) +x(STEROIDS, 55) +x(AIRTANK, 56) +x(JETPACK, 57) +x(HEATSENSOR, 59) +x(ACCESSCARD, 60) +x(BOOTS, 61) +x(GUTMETER, 62) +y(RRTILE63, 63) +y(RRTILE64, 64) +y(RRTILE65, 65) +y(RRTILE66, 66) +y(RRTILE67, 67) +y(RRTILE68, 68) +x(MIRRORBROKE, 70) +x(SOUNDFX, 71) +x(TECHLIGHT2, 72) +x(TECHLIGHTBUST2, 73) +x(TECHLIGHT4, 74) +x(TECHLIGHTBUST4, 75) +x(WALLLIGHT4, 76) +x(WALLLIGHTBUST4, 77) +x(MOTOAMMO, 78) +x(BUTTON1, 80) +x(ACCESSSWITCH, 82) +x(SLOTDOOR, 84) +x(LIGHTSWITCH, 86) +x(SPACEDOORSWITCH, 88) +x(SPACELIGHTSWITCH, 90) +x(FRANKENSTINESWITCH, 92) +x(NUKEBUTTON, 94) +x(MULTISWITCH, 98) +x(DOORTILE1, 102) +x(DOORTILE2, 103) +x(DOORTILE3, 104) +x(DOORTILE4, 105) +x(DOORTILE5, 106) +x(DOORTILE6, 107) +x(DOORTILE7, 108) +x(DOORTILE8, 109) +x(DOORTILE9, 110) +x(DOORTILE10, 111) +x(DOORTILE14, 115) +x(DOORTILE15, 116) +x(DOORTILE16, 117) +x(DOORTILE18, 119) +x(DOORSHOCK, 120) +x(DIPSWITCH, 121) +x(DIPSWITCH2, 123) +x(TECHSWITCH, 125) +x(DIPSWITCH3, 127) +x(ACCESSSWITCH2, 129) +x(REFLECTWATERTILE, 131) +x(FLOORSLIME, 132) +x(BIGFORCE, 135) +x(EPISODE, 137) +x(MASKWALL1, 138) +x(MASKWALL2, 140) +x(MASKWALL3, 141) +x(MASKWALL4, 142) +x(MASKWALL5, 143) +x(MASKWALL6, 144) +x(MASKWALL8, 146) +x(MASKWALL9, 147) +x(MASKWALL10, 148) +x(MASKWALL11, 149) +x(MASKWALL12, 150) +x(MASKWALL13, 151) +x(MASKWALL14, 152) +x(MASKWALL15, 153) +x(FIREEXT, 155) +x(W_LIGHT, 156) +x(SCREENBREAK1, 159) +x(SCREENBREAK2, 160) +x(SCREENBREAK3, 161) +x(SCREENBREAK4, 162) +x(SCREENBREAK5, 163) +x(SCREENBREAK6, 164) +x(SCREENBREAK7, 165) +x(SCREENBREAK8, 166) +x(SCREENBREAK9, 167) +x(SCREENBREAK10, 168) +x(SCREENBREAK11, 169) +x(SCREENBREAK12, 170) +x(SCREENBREAK13, 171) +x(W_TECHWALL1, 185) +x(W_TECHWALL2, 186) +x(W_TECHWALL3, 187) +x(W_TECHWALL4, 188) +x(W_TECHWALL10, 189) +x(W_TECHWALL15, 191) +x(W_TECHWALL16, 192) +x(STATIC, 195) +x(W_SCREENBREAK, 199) +x(W_HITTECHWALL3, 205) +x(W_HITTECHWALL4, 206) +x(W_HITTECHWALL2, 207) +x(W_HITTECHWALL1, 208) +x(FANSPRITE, 210) +x(FANSPRITEBROKE, 215) +x(FANSHADOW, 216) +x(FANSHADOWBROKE, 219) +x(DOORTILE19, 229) +x(DOORTILE20, 230) +x(DOORTILE22, 232) +x(GRATE1, 234) +x(BGRATE1, 235) +x(SPLINTERWOOD, 237) +x(WATERDRIP, 239) +x(WATERBUBBLE, 240) +x(WATERBUBBLEMAKER, 241) +x(W_FORCEFIELD, 242) +x(WALLLIGHT3, 244) +x(WALLLIGHTBUST3, 245) +x(WALLLIGHT1, 246) +x(WALLLIGHTBUST1, 247) +x(WALLLIGHT2, 248) +x(WALLLIGHTBUST2, 249) +x(LIGHTSWITCH2, 250) +x(UFOBEAM, 252) +y(RRTILE280, 280) +y(RRTILE281, 281) +y(RRTILE282, 282) +y(RRTILE283, 283) +y(RRTILE285, 285) +y(RRTILE286, 286) +y(RRTILE287, 287) +y(RRTILE288, 288) +y(RRTILE289, 289) +y(RRTILE290, 290) +y(RRTILE291, 291) +y(RRTILE292, 292) +y(RRTILE293, 293) +y(RRTILE295, 295) +y(RRTILE296, 296) +y(RRTILE297, 297) +x(CDPLAYER, 370) +y(RRTILE380, 380) +x(BONUSPIC01, 403) +x(BONUSPIC02, 404) +x(BONUSPIC03, 405) +x(BONUSPIC04, 406) +x(BONUSPIC05, 407) +x(BONUSPIC06, 408) +x(BONUSPIC07, 409) +x(BONUSPIC08, 410) +x(BONUSPIC09, 411) +x(BONUSPIC10, 412) +x(BONUSPIC11, 413) +x(BONUSPIC12, 414) +x(BONUSPIC13, 415) +x(BONUSPIC14, 416) +x(BIGFNTCURSOR, 512) +x(SMALLFNTCURSOR, 513) +x(STARTALPHANUM, 514) +x(ENDALPHANUM, 607) +x(BIGALPHANUM, 632) +x(BIGPERIOD, 694) +x(BIGCOMMA, 695) +x(BIGX, 696) +x(BIGQ, 697) +x(BIGSEMI, 698) +x(BIGCOLIN, 699) +x(THREEBYFIVE, 702) +x(BIGAPPOS, 714) +x(MINIFONT, 718) +x(W_NUMBERS, 810) +x(BLANK, 820) +x(RESPAWNMARKERRED, 866) +x(RESPAWNMARKERYELLOW, 876) +x(RESPAWNMARKERGREEN, 886) +x(SPINNINGNUKEICON0, 896) +x(SPINNINGNUKEICON1, 897) +x(SPINNINGNUKEICON2, 898) +x(SPINNINGNUKEICON3, 899) +x(SPINNINGNUKEICON4, 900) +x(SPINNINGNUKEICON5, 901) +x(SPINNINGNUKEICON6, 902) +x(SPINNINGNUKEICON7, 903) +x(SPINNINGNUKEICON8, 904) +x(SPINNINGNUKEICON9, 905) +x(SPINNINGNUKEICON10, 906) +x(SPINNINGNUKEICON11, 907) +x(SPINNINGNUKEICON12, 908) +x(SPINNINGNUKEICON13, 909) +x(SPINNINGNUKEICON14, 910) +x(SPINNINGNUKEICON15, 911) +x(GUTMETER_LIGHT1, 920) +x(GUTMETER_LIGHT2, 921) +x(GUTMETER_LIGHT3, 922) +x(GUTMETER_LIGHT4, 923) +x(AMMO_ICON, 930) +x(CLOUDYSKIES, 1021) +x(MOONSKY1, 1022) +x(MOONSKY2, 1023) +x(MOONSKY3, 1024) +x(MOONSKY4, 1025) +x(BIGORBIT1, 1026) +x(BIGORBIT2, 1027) +x(BIGORBIT3, 1028) +x(BIGORBIT4, 1029) +x(BIGORBIT5, 1030) +x(LA, 1031) +x(REDSKY1, 1040) +x(REDSKY2, 1041) +x(WATERTILE, 1044) +x(WATERTILE2, 1045) +x(SATELLITE, 1049) +x(VIEWSCREEN2, 1052) +x(VIEWSCREENBROKE, 1054) +x(VIEWSCREEN, 1055) +x(GLASS, 1056) +x(GLASS2, 1057) +x(STAINGLASS1, 1063) +x(SATELITE, 1066) +x(FUELPOD, 1067) +x(SLIMEPIPE, 1070) +x(CRACK1, 1075) +x(CRACK2, 1076) +x(CRACK3, 1077) +x(CRACK4, 1078) +x(FOOTPRINTS, 1079) +x(DOMELITE, 1080) +x(CAMERAPOLE, 1083) +x(CHAIR1, 1085) +x(CHAIR2, 1086) +x(BROKENCHAIR, 1088) +x(MIRROR, 1089) +x(WATERFOUNTAIN, 1092) +x(WATERFOUNTAINBROKE, 1096) +x(FEMMAG1, 1097) +x(TOILET, 1098) +x(STALL, 1100) +x(STALLBROKE, 1102) +x(FEMMAG2, 1106) +x(REACTOR2, 1107) +x(REACTOR2BURNT, 1108) +x(REACTOR2SPARK, 1109) +x(SOLARPANNEL, 1114) +x(NAKED1, 1115) +x(ANTENNA, 1117) +x(TOILETBROKE, 1120) +x(PIPE2, 1121) +x(PIPE1B, 1122) +x(PIPE3, 1123) +x(PIPE1, 1124) +x(PIPE2B, 1126) +x(BOLT1, 1127) +x(PIPE3B, 1132) +x(CAMERA1, 1134) +x(BRICK, 1139) +x(VACUUM, 1141) +x(JURYGUY, 1142) +x(FOOTPRINTS2, 1144) +x(FOOTPRINTS3, 1145) +x(FOOTPRINTS4, 1146) +x(EGG, 1147) +x(SCALE, 1150) +x(CHAIR3, 1152) +x(CAMERALIGHT, 1157) +x(MOVIECAMERA, 1158) +x(FOOTPRINT, 1160) +x(IVUNIT, 1163) +x(POT1, 1164) +x(POT2, 1165) +x(POT3, 1166) +x(STATUE, 1168) +x(MIKE, 1170) +x(VASE, 1172) +x(SUSHIPLATE1, 1174) +x(SUSHIPLATE2, 1175) +x(SUSHIPLATE3, 1176) +x(SUSHIPLATE4, 1178) +x(SUSHIPLATE5, 1180) +x(BIGHOLE2, 1182) +x(STRIPEBALL, 1184) +x(QUEBALL, 1185) +x(POCKET, 1186) +x(WOODENHORSE, 1187) +x(TREE1, 1191) +x(TREE2, 1193) +x(CACTUS, 1194) +x(TOILETWATER, 1196) +x(NEON1, 1200) +x(NEON2, 1201) +x(CACTUSBROKE, 1203) +x(BOUNCEMINE, 1204) +x(BROKEFIREHYDRENT, 1210) +x(BOX, 1211) +x(BULLETHOLE, 1212) +x(BOTTLE1, 1215) +x(BOTTLE2, 1216) +x(BOTTLE3, 1217) +x(BOTTLE4, 1218) +x(BOTTLE5, 1219) +x(BOTTLE6, 1220) +x(BOTTLE7, 1221) +x(BOTTLE8, 1222) +x(SNAKEP, 1224) +x(DOLPHIN1, 1225) +x(DOLPHIN2, 1226) +x(HYDRENT, 1228) +x(TIRE, 1230) +x(PIPE5, 1232) +x(PIPE6, 1233) +x(PIPE4, 1234) +x(PIPE4B, 1235) +x(BROKEHYDROPLANT, 1237) +x(PIPE5B, 1239) +x(NEON3, 1241) +x(NEON4, 1242) +x(NEON5, 1243) +x(SPOTLITE, 1247) +x(HANGOOZ, 1249) +x(HORSEONSIDE, 1251) +x(GLASSPIECES, 1256) +x(HORSELITE, 1259) +x(DONUTS, 1263) +x(NEON6, 1264) +x(CLOCK, 1266) +x(RUBBERCAN, 1268) +x(BROKENCLOCK, 1270) +x(PLUG, 1272) +x(OOZFILTER, 1273) +x(FLOORPLASMA, 1276) +x(HANDPRINTSWITCH, 1278) +x(BOTTLE10, 1280) +x(BOTTLE11, 1281) +x(BOTTLE12, 1282) +x(BOTTLE13, 1283) +x(BOTTLE14, 1284) +x(BOTTLE15, 1285) +x(BOTTLE16, 1286) +x(BOTTLE17, 1287) +x(BOTTLE18, 1288) +x(BOTTLE19, 1289) +x(VENDMACHINE, 1291) +x(VENDMACHINEBROKE, 1293) +x(COLAMACHINE, 1294) +x(COLAMACHINEBROKE, 1296) +x(CRANEPOLE, 1298) +x(CRANE, 1299) +x(BARBROKE, 1302) +x(BLOODPOOL, 1303) +x(NUKEBARREL, 1304) +x(NUKEBARRELDENTED, 1305) +x(NUKEBARRELLEAKED, 1306) +x(CANWITHSOMETHING, 1309) +x(MONEY, 1310) +x(BANNER, 1313) +x(EXPLODINGBARREL, 1315) +x(EXPLODINGBARREL2, 1316) +x(FIREBARREL, 1317) +x(SEENINE, 1324) +x(SEENINEDEAD, 1325) +x(STEAM, 1327) +x(CEILINGSTEAM, 1332) +x(PIPE6B, 1337) +x(TRANSPORTERBEAM, 1338) +x(RAT, 1344) +x(TRASH, 1346) +x(HELECOPT, 1348) +x(FETUSJIB, 1349) +x(HOLODUKE, 1350) +x(MONK, 1354) +x(SPACEMARINE, 1355) +x(LUKE, 1356) +x(INDY, 1357) +x(FETUS, 1360) +x(FETUSBROKE, 1361) +x(WATERSPLASH2, 1383) +x(FIREVASE, 1388) +x(SCRATCH, 1389) +x(BLOOD, 1391) +x(TRANSPORTERSTAR, 1398) +x(LOOGIE, 1405) +x(FIST, 1408) +x(FREEZEBLAST, 1409) +x(DEVISTATORBLAST, 1410) +x(TONGUE, 1414) +x(MORTER, 1416) +x(MUD, 1420) +x(SHRINKEREXPLOSION, 1421) +x(RADIUSEXPLOSION, 1426) +x(FORCERIPPLE, 1427) +x(CANNONBALL, 1437) +x(INNERJAW, 1439) +x(EXPLOSION2, 1441) +x(EXPLOSION3, 1442) +x(JIBS1, 1463) +x(JIBS2, 1468) +x(JIBS3, 1473) +x(JIBS4, 1478) +x(JIBS5, 1483) +x(CRACKKNUCKLES, 1489) +x(HEADERBAR, 1493) +x(BURNING, 1494) +x(FIRE, 1495) +x(USERWEAPON, 1510) +x(JIBS6, 1515) +x(BLOODSPLAT1, 1525) +x(BLOODSPLAT3, 1526) +x(BLOODSPLAT2, 1527) +x(BLOODSPLAT4, 1528) +x(OOZ, 1529) +x(WALLBLOOD1, 1530) +x(WALLBLOOD2, 1531) +x(WALLBLOOD3, 1532) +x(WALLBLOOD4, 1533) +x(WALLBLOOD5, 1534) +x(WALLBLOOD6, 1535) +x(WALLBLOOD7, 1536) +x(WALLBLOOD8, 1537) +x(OOZ2, 1538) +x(BURNING2, 1539) +x(FIRE2, 1540) +x(SMALLSMOKE, 1554) +x(SMALLSMOKEMAKER, 1555) +x(FLOORFLAME, 1558) +x(GREENSLIME, 1575) +x(WATERDRIPSPLASH, 1585) +x(SCRAP6, 1595) +x(SCRAP1, 1605) +x(SCRAP2, 1609) +x(SCRAP3, 1613) +x(SCRAP4, 1617) +x(SCRAP5, 1621) +x(ROTATEGUN, 1624) +x(BETAVERSION, 1629) +x(PLAYERISHERE, 1630) +x(PLAYERWASHERE, 1631) +x(SELECTDIR, 1632) +x(F1HELP, 1633) +x(NOTCHON, 1634) +x(NOTCHOFF, 1635) +x(DRIVABLES, 1636) +x(DUKEICON, 1637) +x(BADGUYICON, 1638) +x(FOODICON, 1639) +x(GETICON, 1640) +x(MENUSCREEN, 1641) +x(MENUBAR, 1642) +x(KILLSICON, 1643) +x(FIRSTAID_ICON, 1645) +x(HEAT_ICON, 1646) +x(BOTTOMSTATUSBAR, 1647) +x(BOOT_ICON, 1648) +x(WEAPONBAR, 1649) +x(FRAGBAR, 1650) +x(JETPACK_ICON, 1652) +x(AIRTANK_ICON, 1653) +x(STEROIDS_ICON, 1654) +x(HOLODUKE_ICON, 1655) +x(ACCESS_ICON, 1656) +x(DIGITALNUM, 1657) +x(CAMCORNER, 1667) +x(CAMLIGHT, 1669) +x(LOGO, 1670) +x(TITLE, 1671) +x(NUKEWARNINGICON, 1672) +x(MOUSECURSOR, 1673) +x(SLIDEBAR, 1674) +x(DUKECAR, 1676) +x(DREALMS, 1677) +x(BETASCREEN, 1678) +x(WINDOWBORDER1, 1679) +x(TEXTBOX, 1680) +x(WINDOWBORDER2, 1681) +x(DUKENUKEM, 1682) +x(THREEDEE, 1683) +x(INGAMEDUKETHREEDEE, 1684) +x(TENSCREEN, 1685) +x(PLUTOPAKSPRITE, 1686) +x(CROSSHAIR, 1689) +x(FALLINGCLIP, 1699) +x(CLIPINHAND, 1700) +x(HAND, 1701) +x(SHELL, 1702) +x(SHOTGUNSHELL, 1704) +x(RPGMUZZLEFLASH, 1714) +x(CATLITE, 1721) +x(HANDHOLDINGLASER, 1732) +x(TRIPBOMB, 1735) +x(LASERLINE, 1736) +x(HANDHOLDINGACCESS, 1737) +x(HANDREMOTE, 1739) +x(TIP, 1745) +x(GLAIR, 1747) +x(SPACEMASK, 1753) +y(RRTILE1752, 1752) +x(FORCESPHERE, 1759) +x(SHOTSPARK1, 1764) +x(RPG, 1774) +x(RPG2, 1781) +y(RRTILE1790, 1790) +y(RRTILE1792, 1792) +y(RRTILE1801, 1801) +y(RRTILE1805, 1805) +y(RRTILE1807, 1807) +y(RRTILE1808, 1808) +y(RRTILE1812, 1812) +y(RRTILE1814, 1814) +y(RRTILE1817, 1817) +y(RRTILE1821, 1821) +y(RRTILE1824, 1824) +y(RRTILE1826, 1826) +y(RRTILE1850, 1850) +y(RRTILE1851, 1851) +y(RRTILE1856, 1856) +y(RRTILE1877, 1877) +y(RRTILE1878, 1878) +y(RRTILE1938, 1938) +y(RRTILE1939, 1939) +y(RRTILE1942, 1942) +y(RRTILE1944, 1944) +y(RRTILE1945, 1945) +y(RRTILE1947, 1947) +y(RRTILE1951, 1951) +y(RRTILE1952, 1952) +y(RRTILE1953, 1953) +y(RRTILE1961, 1961) +y(RRTILE1964, 1964) +y(RRTILE1973, 1973) +y(RRTILE1985, 1985) +y(RRTILE1986, 1986) +y(RRTILE1987, 1987) +y(RRTILE1988, 1988) +y(RRTILE1990, 1990) +y(RRTILE1995, 1995) +y(RRTILE1996, 1996) +y(RRTILE2004, 2004) +y(RRTILE2005, 2005) +x(POPCORN, 2021) +y(RRTILE2022, 2022) +x(LANEPICS, 2023) +y(RRTILE2025, 2025) +y(RRTILE2026, 2026) +y(RRTILE2027, 2027) +y(RRTILE2028, 2028) +y(RRTILE2034, 2034) +y(RRTILE2050, 2050) +y(RRTILE2052, 2052) +y(RRTILE2053, 2053) +y(RRTILE2056, 2056) +y(RRTILE2060, 2060) +y(RRTILE2072, 2072) +y(RRTILE2074, 2074) +y(RRTILE2075, 2075) +y(RRTILE2083, 2083) +x(COOLEXPLOSION1, 2095) +y(RRTILE2097, 2097) +y(RRTILE2121, 2121) +y(RRTILE2122, 2122) +y(RRTILE2123, 2123) +y(RRTILE2124, 2124) +y(RRTILE2125, 2125) +y(RRTILE2126, 2126) +y(RRTILE2137, 2137) +y(RRTILE2132, 2132) +y(RRTILE2136, 2136) +y(RRTILE2139, 2139) +y(RRTILE2150, 2150) +y(RRTILE2151, 2151) +y(RRTILE2152, 2152) +y(RRTILE2156, 2156) +y(RRTILE2157, 2157) +y(RRTILE2158, 2158) +y(RRTILE2159, 2159) +y(RRTILE2160, 2160) +y(RRTILE2161, 2161) +y(RRTILE2175, 2175) +y(RRTILE2176, 2176) +y(RRTILE2178, 2178) +y(RRTILE2186, 2186) +y(RRTILE2214, 2214) +x(WAITTOBESEATED, 2215) +x(OJ, 2217) +x(HURTRAIL, 2221) +x(POWERSWITCH1, 2222) +x(LOCKSWITCH1, 2224) +x(POWERSWITCH2, 2226) +x(ATM, 2229) +x(STATUEFLASH, 2231) +x(ATMBROKE, 2233) +x(FEMPIC5, 2235) +x(FEMPIC6, 2236) +x(FEMPIC7, 2237) +x(REACTOR, 2239) +x(REACTORSPARK, 2243) +x(REACTORBURNT, 2247) +x(HANDSWITCH, 2249) +x(CIRCLEPANNEL, 2251) +x(CIRCLEPANNELBROKE, 2252) +x(PULLSWITCH, 2254) +x(ALIENSWITCH, 2259) +x(DOORTILE21, 2261) +x(DOORTILE17, 2263) +x(MASKWALL7, 2264) +x(JAILBARBREAK, 2265) +x(DOORTILE11, 2267) +x(DOORTILE12, 2268) +x(EXPLOSION2BOT, 2272) +y(RRTILE2319, 2319) +y(RRTILE2321, 2321) +y(RRTILE2326, 2326) +y(RRTILE2329, 2329) +y(RRTILE2357, 2357) +y(RRTILE2382, 2382) +y(RRTILE2430, 2430) +y(RRTILE2431, 2431) +y(RRTILE2432, 2432) +y(RRTILE2437, 2437) +y(RRTILE2443, 2443) +y(RRTILE2445, 2445) +y(RRTILE2446, 2446) +y(RRTILE2450, 2450) +y(RRTILE2451, 2451) +y(RRTILE2455, 2455) +y(RRTILE2460, 2460) +y(RRTILE2465, 2465) +x(BONUSSCREEN, 2510) +x(VIEWBORDER, 2520) +x(VICTORY1, 2530) +x(ORDERING, 2531) +x(TEXTSTORY, 2541) +x(LOADSCREEN, 2542) +y(RRTILE2560, 2560) +y(RRTILE2562, 2562) +y(RRTILE2564, 2564) +y(RRTILE2573, 2573) +y(RRTILE2574, 2574) +y(RRTILE2577, 2577) +y(RRTILE2578, 2578) +y(RRTILE2581, 2581) +y(RRTILE2583, 2583) +y(RRTILE2604, 2604) +y(RRTILE2610, 2610) +y(RRTILE2613, 2613) +y(RRTILE2621, 2621) +y(RRTILE2622, 2622) +y(RRTILE2636, 2636) +y(RRTILE2637, 2637) +y(RRTILE2654, 2654) +y(RRTILE2656, 2656) +y(RRTILE2676, 2676) +y(RRTILE2689, 2689) +y(RRTILE2697, 2697) +y(RRTILE2702, 2702) +y(RRTILE2707, 2707) +y(RRTILE2732, 2732) +x(HATRACK, 2717) +x(DESKLAMP, 2719) +x(COFFEEMACHINE, 2721) +x(CUPS, 2722) +x(GAVALS, 2723) +x(GAVALS2, 2724) +x(POLICELIGHTPOLE, 2726) +x(FLOORBASKET, 2728) +x(PUKE, 2729) +x(DOORTILE23, 2731) +x(TOPSECRET, 2733) +x(SPEAKER, 2734) +x(TEDDYBEAR, 2735) +x(ROBOTDOG, 2737) +x(ROBOTPIRATE, 2739) +x(ROBOTMOUSE, 2740) +x(MAIL, 2741) +x(MAILBAG, 2742) +x(HOTMEAT, 2744) +x(COFFEEMUG, 2745) +x(DONUTS2, 2746) +x(TRIPODCAMERA, 2747) +x(METER, 2748) +x(DESKPHONE, 2749) +x(GUMBALLMACHINE, 2750) +x(GUMBALLMACHINEBROKE, 2751) +x(PAPER, 2752) +x(MACE, 2753) +x(GENERICPOLE2, 2754) +x(XXXSTACY, 2755) +x(WETFLOOR, 2756) +x(BROOM, 2757) +x(MOP, 2758) +x(PIRATE1A, 2759) +x(PIRATE4A, 2760) +x(PIRATE2A, 2761) +x(PIRATE5A, 2762) +x(PIRATE3A, 2763) +x(PIRATE6A, 2764) +x(PIRATEHALF, 2765) +x(CHESTOFGOLD, 2767) +x(SIDEBOLT1, 2768) +x(FOODOBJECT1, 2773) +x(FOODOBJECT2, 2774) +x(FOODOBJECT3, 2775) +x(FOODOBJECT4, 2776) +x(FOODOBJECT5, 2777) +x(FOODOBJECT6, 2778) +x(FOODOBJECT7, 2779) +x(FOODOBJECT8, 2780) +x(FOODOBJECT9, 2781) +x(FOODOBJECT10, 2782) +x(FOODOBJECT11, 2783) +x(FOODOBJECT12, 2784) +x(FOODOBJECT13, 2785) +x(FOODOBJECT14, 2786) +x(FOODOBJECT15, 2787) +x(FOODOBJECT16, 2788) +x(FOODOBJECT17, 2789) +x(FOODOBJECT18, 2790) +x(FOODOBJECT19, 2791) +x(FOODOBJECT20, 2792) +x(HEADLAMP, 2793) +x(SKINNEDCHICKEN, 2794) +x(FEATHEREDCHICKEN, 2795) +x(TAMPON, 2796) +x(ROBOTDOG2, 2797) +x(JOLLYMEAL, 2800) +x(DUKEBURGER, 2801) +x(SHOPPINGCART, 2806) +x(CANWITHSOMETHING2, 2807) +x(CANWITHSOMETHING3, 2808) +x(CANWITHSOMETHING4, 2809) +y(RRTILE2030, 2030) +y(RRTILE2831, 2831) +y(RRTILE2832, 2832) +y(RRTILE2842, 2842) +y(RRTILE2859, 2859) +y(RRTILE2876, 2876) +y(RRTILE2878, 2878) +y(RRTILE2879, 2879) +y(RRTILE2893, 2893) +y(RRTILE2894, 2894) +y(RRTILE2898, 2898) +y(RRTILE2899, 2899) +y(RRTILE2915, 2915) +y(RRTILE2940, 2940) +y(RRTILE2944, 2944) +y(RRTILE2945, 2945) +y(RRTILE2946, 2946) +y(RRTILE2947, 2947) +y(RRTILE2948, 2948) +y(RRTILE2949, 2949) +y(RRTILE2961, 2961) +y(RRTILE2970, 2970) +y(RRTILE2977, 2977) +y(RRTILE2978, 2978) +x(GLASS3, 2983) +x(BORNTOBEWILDSCREEN, 2985) +x(BLIMP, 2989) +y(RRTILE2990, 2990) +x(FEM9, 2991) +x(POOP, 2998) +x(FRAMEEFFECT1, 2999) +x(PANNEL1, 3003) +x(PANNEL2, 3004) +x(PANNEL3, 3005) +x(BPANNEL1, 3006) +x(BPANNEL3, 3007) +x(SCREENBREAK14, 3008) +x(SCREENBREAK15, 3009) +x(SCREENBREAK19, 3011) +x(SCREENBREAK16, 3013) +x(SCREENBREAK17, 3014) +x(SCREENBREAK18, 3015) +x(W_TECHWALL11, 3016) +x(W_TECHWALL12, 3017) +x(W_TECHWALL13, 3018) +x(W_TECHWALL14, 3019) +x(W_TECHWALL5, 3020) +x(W_TECHWALL6, 3022) +x(W_TECHWALL7, 3024) +x(W_TECHWALL8, 3026) +x(W_TECHWALL9, 3028) +x(W_HITTECHWALL16, 3030) +x(W_HITTECHWALL10, 3031) +x(W_HITTECHWALL15, 3033) +x(W_MILKSHELF, 3035) +x(W_MILKSHELFBROKE, 3036) +x(PURPLELAVA, 3038) +x(LAVABUBBLE, 3040) +x(DUKECUTOUT, 3047) +x(TARGET, 3049) +x(GUNPOWDERBARREL, 3050) +x(DUCK, 3051) +x(HYDROPLANT, 3053) +x(OCEANSPRITE1, 3055) +x(OCEANSPRITE2, 3056) +x(OCEANSPRITE3, 3057) +x(OCEANSPRITE4, 3058) +x(OCEANSPRITE5, 3059) +x(GENERICPOLE, 3061) +x(CONE, 3062) +x(HANGLIGHT, 3063) +y(RRTILE3073, 3073) +y(RRTILE3083, 3083) +y(RRTILE3100, 3100) +y(RRTILE3114, 3114) +y(RRTILE3115, 3115) +y(RRTILE3116, 3116) +y(RRTILE3117, 3117) +y(RRTILE3120, 3120) +y(RRTILE3121, 3121) +y(RRTILE3122, 3122) +y(RRTILE3123, 3123) +y(RRTILE3124, 3124) +y(RRTILE3132, 3132) +y(RRTILE3139, 3139) +y(RRTILE3144, 3144) +y(RRTILE3152, 3152) +y(RRTILE3153, 3153) +y(RRTILE3155, 3155) +y(RRTILE3171, 3171) +y(RRTILE3172, 3172) +y(RRTILE3190, 3190) +y(RRTILE3191, 3191) +y(RRTILE3192, 3192) +y(RRTILE3195, 3195) +y(RRTILE3200, 3200) +y(RRTILE3201, 3201) +y(RRTILE3202, 3202) +y(RRTILE3203, 3203) +y(RRTILE3204, 3204) +y(RRTILE3205, 3205) +y(RRTILE3206, 3206) +y(RRTILE3207, 3207) +y(RRTILE3208, 3208) +y(RRTILE3209, 3209) +y(RRTILE3216, 3216) +y(RRTILE3218, 3218) +y(RRTILE3219, 3219) +y(RRTILE3232, 3232) +x(FEMPIC1, 3239) +x(FEMPIC2, 3248) +x(BLANKSCREEN, 3252) +x(PODFEM1, 3253) +x(FEMPIC3, 3257) +x(FEMPIC4, 3265) +x(FEM1, 3271) +x(FEM2, 3276) +x(FEM3, 3280) +x(FEM5, 3282) +x(BLOODYPOLE, 3283) +x(FEM4, 3284) +x(FEM6, 3293) +x(FEM6PAD, 3294) +x(FEM8, 3295) +x(FEM7, 3298) +x(ORGANTIC, 3308) +x(FIRSTGUN, 3328) +x(FIRSTGUNRELOAD, 3336) +x(KNEE, 3340) +x(SHOTGUN, 3350) +x(HANDTHROW, 3360) +x(SHOTGUNSHELLS, 3372) +x(SCUBAMASK, 3374) +x(CHAINGUN, 3380) +x(SHRINKER, 3384) +x(CIRCLESTUCK, 3388) +x(SPIT, 3390) +x(GROWSPARK, 3395) +x(SHRINKSPARK, 3400) +y(RRTILE3410, 3410) +x(LUMBERBLADE, 3411) +x(FREEZE, 3415) +x(FIRELASER, 3420) +x(BOWLINGBALLH, 3428) +x(BOWLINGBALL, 3430) +x(BOWLINGBALLSPRITE, 3437) +x(POWDERH, 3438) +y(RRTILE3440, 3440) +x(DEVISTATOR, 3445) +x(RPGGUN, 3452) +y(RRTILE3462, 3462) +x(OWHIP, 3471) +x(UWHIP, 3475) +x(RPGGUN2, 3482) +y(RRTILE3497, 3497) +y(RRTILE3498, 3498) +y(RRTILE3499, 3499) +y(RRTILE3500, 3500) +x(SLINGBLADE, 3510) +y(RRTILE3584, 3584) +y(RRTILE3586, 3586) +y(RRTILE3587, 3587) +y(RRTILE3600, 3600) +y(RRTILE3631, 3631) +y(RRTILE3635, 3635) +y(RRTILE3637, 3637) +y(RRTILE3643, 3643) +y(RRTILE3647, 3647) +y(RRTILE3652, 3652) +y(RRTILE3653, 3653) +y(RRTILE3668, 3668) +y(RRTILE3671, 3671) +y(RRTILE3673, 3673) +y(RRTILE3684, 3684) +y(RRTILE3708, 3708) +y(RRTILE3714, 3714) +y(RRTILE3716, 3716) +y(RRTILE3720, 3720) +y(RRTILE3723, 3723) +y(RRTILE3725, 3725) +y(RRTILE3737, 3737) +y(RRTILE3754, 3754) +y(RRTILE3762, 3762) +y(RRTILE3763, 3763) +y(RRTILE3764, 3764) +y(RRTILE3765, 3765) +y(RRTILE3767, 3767) +y(RRTILE3773, 3773) +y(RRTILE3774, 3774) +y(RRTILE3793, 3793) +y(RRTILE3795, 3795) +y(RRTILE3804, 3804) +y(RRTILE3814, 3814) +y(RRTILE3815, 3815) +y(RRTILE3819, 3819) +x(BIGHOLE, 3822) +y(RRTILE3827, 3827) +y(RRTILE3837, 3837) +x(APLAYERTOP, 3840) +x(APLAYER, 3845) +x(PLAYERONWATER, 3860) +x(DUKELYINGDEAD, 3998) +x(DUKEGUN, 4041) +x(DUKETORSO, 4046) +x(DUKELEG, 4055) +x(FECES, 4802) +x(DRONE, 4916) +x(RECON, 4989) +y(RRTILE5014, 5014) +y(RRTILE5016, 5016) +y(RRTILE5017, 5017) +y(RRTILE5018, 5018) +y(RRTILE5019, 5019) +y(RRTILE5020, 5020) +y(RRTILE5021, 5021) +y(RRTILE5022, 5022) +y(RRTILE5023, 5023) +y(RRTILE5024, 5024) +y(RRTILE5025, 5025) +y(RRTILE5026, 5026) +y(RRTILE5027, 5027) +y(RRTILE5029, 5029) +y(RRTILE5030, 5030) +y(RRTILE5031, 5031) +y(RRTILE5032, 5032) +y(RRTILE5033, 5033) +y(RRTILE5034, 5034) +y(RRTILE5035, 5035) +y(RRTILE5036, 5036) +y(RRTILE5037, 5037) +y(RRTILE5038, 5038) +y(RRTILE5039, 5039) +y(RRTILE5040, 5040) +y(RRTILE5041, 5041) +y(RRTILE5043, 5043) +y(RRTILE5044, 5044) +y(RRTILE5045, 5045) +y(RRTILE5046, 5046) +y(RRTILE5047, 5047) +y(RRTILE5048, 5048) +y(RRTILE5049, 5049) +y(RRTILE5050, 5050) +y(RRTILE5051, 5051) +y(RRTILE5052, 5052) +y(RRTILE5053, 5053) +y(RRTILE5054, 5054) +y(RRTILE5055, 5055) +y(RRTILE5056, 5056) +y(RRTILE5057, 5057) +y(RRTILE5058, 5058) +y(RRTILE5059, 5059) +y(RRTILE5061, 5061) +y(RRTILE5062, 5062) +y(RRTILE5063, 5063) +y(RRTILE5064, 5064) +y(RRTILE5065, 5065) +y(RRTILE5066, 5066) +y(RRTILE5067, 5067) +y(RRTILE5068, 5068) +y(RRTILE5069, 5069) +y(RRTILE5070, 5070) +y(RRTILE5071, 5071) +y(RRTILE5072, 5072) +y(RRTILE5073, 5073) +y(RRTILE5074, 5074) +y(RRTILE5075, 5075) +y(RRTILE5076, 5076) +y(RRTILE5077, 5077) +y(RRTILE5078, 5078) +y(RRTILE5079, 5079) +y(RRTILE5080, 5080) +y(RRTILE5081, 5081) +y(RRTILE5082, 5082) +y(RRTILE5083, 5083) +y(RRTILE5084, 5084) +y(RRTILE5085, 5085) +y(RRTILE5086, 5086) +y(RRTILE5087, 5087) +y(RRTILE5088, 5088) +y(RRTILE5090, 5090) +x(SHARK, 5501) +x(FEM10, 5581) +x(TOUGHGAL, 5583) +x(MAN, 5588) +x(MAN2, 5589) +x(WOMAN, 5591) +x(ATOMICHEALTH, 5595) +y(RRTILE6144, 6144) +x(MOTOGUN, 7168) +y(RRTILE7169, 7169) +x(MOTOHIT, 7170) +x(BOATHIT, 7175) +y(RRTILE7184, 7184) +y(RRTILE7190, 7190) +y(RRTILE7191, 7191) +y(RRTILE7213, 7213) +y(RRTILE7219, 7219) +x(EMPTYBIKE, 7220) +x(EMPTYBOAT, 7233) +y(RRTILE7424, 7424) +y(RRTILE7430, 7430) +y(RRTILE7433, 7433) +y(RRTILE7441, 7441) +y(RRTILE7547, 7547) +y(RRTILE7467, 7467) +y(RRTILE7469, 7469) +y(RRTILE7470, 7470) +y(RRTILE7475, 7475) +y(RRTILE7478, 7478) +y(RRTILE7505, 7505) +y(RRTILE7506, 7506) +y(RRTILE7534, 7534) +y(RRTILE7540, 7540) +y(RRTILE7533, 7533) +y(RRTILE7545, 7545) +y(RRTILE7552, 7552) +y(RRTILE7553, 7553) +y(RRTILE7554, 7554) +y(RRTILE7555, 7555) +y(RRTILE7557, 7557) +y(RRTILE7558, 7558) +y(RRTILE7559, 7559) +y(RRTILE7561, 7561) +y(RRTILE7566, 7566) +y(RRTILE7568, 7568) +y(RRTILE7574, 7574) +y(RRTILE7575, 7575) +y(RRTILE7576, 7576) +y(RRTILE7578, 7578) +y(RRTILE7579, 7579) +y(RRTILE7580, 7580) +y(RRTILE7595, 7595) +y(RRTILE7629, 7629) +y(RRTILE7636, 7636) +y(RRTILE7638, 7638) +y(RRTILE7640, 7640) +y(RRTILE7644, 7644) +y(RRTILE7646, 7646) +y(RRTILE7648, 7648) +y(RRTILE7650, 7650) +y(RRTILE7653, 7653) +y(RRTILE7655, 7655) +y(RRTILE7657, 7657) +y(RRTILE7659, 7659) +y(RRTILE7691, 7691) +y(RRTILE7694, 7694) +y(RRTILE7696, 7696) +y(RRTILE7697, 7697) +y(RRTILE7700, 7700) +y(RRTILE7702, 7702) +y(RRTILE7704, 7704) +y(RRTILE7705, 7705) +y(RRTILE7711, 7711) +y(RRTILE7716, 7716) +y(RRTILE7756, 7756) +y(RRTILE7768, 7768) +y(RRTILE7806, 7806) +y(RRTILE7820, 7820) +y(RRTILE7859, 7859) +y(RRTILE7870, 7870) +y(RRTILE7873, 7873) +y(RRTILE7875, 7875) +y(RRTILE7876, 7876) +y(RRTILE7879, 7879) +y(RRTILE7881, 7881) +y(RRTILE7883, 7883) +y(RRTILE7885, 7885) +y(RRTILE7886, 7886) +y(RRTILE7887, 7887) +y(RRTILE7888, 7888) +y(RRTILE7889, 7889) +y(RRTILE7890, 7890) +y(RRTILE7900, 7900) +y(RRTILE7901, 7901) +y(RRTILE7906, 7906) +y(RRTILE7912, 7912) +y(RRTILE7913, 7913) +y(RRTILE7936, 7936) +y(RRTILE8047, 8047) +x(MULTISWITCH2, 8048) +y(RRTILE8059, 8059) +y(RRTILE8060, 8060) +y(RRTILE8063, 8063) +y(RRTILE8067, 8067) +y(RRTILE8076, 8076) +y(RRTILE8094, 8094) +y(RRTILE8096, 8096) +y(RRTILE8099, 8099) +y(RRTILE8106, 8106) +y(RRTILE8162, 8162) +y(RRTILE8163, 8163) +y(RRTILE8164, 8164) +y(RRTILE8165, 8165) +y(RRTILE8166, 8166) +y(RRTILE8167, 8167) +y(RRTILE8168, 8168) +y(RRTILE8192, 8192) +y(RRTILE8193, 8193) +y(RRTILE8215, 8215) +y(RRTILE8216, 8216) +y(RRTILE8217, 8217) +y(RRTILE8218, 8218) +y(RRTILE8220, 8220) +y(RRTILE8221, 8221) +y(RRTILE8222, 8222) +y(RRTILE8223, 8223) +y(RRTILE8224, 8224) +y(RRTILE8227, 8227) +y(RRTILE8312, 8312) +y(RRTILE8370, 8370) +y(RRTILE8371, 8371) +y(RRTILE8372, 8372) +y(RRTILE8373, 8373) +y(RRTILE8379, 8379) +y(RRTILE8380, 8380) +y(RRTILE8385, 8385) +y(RRTILE8386, 8386) +y(RRTILE8387, 8387) +y(RRTILE8388, 8388) +y(RRTILE8389, 8389) +y(RRTILE8390, 8390) +y(RRTILE8391, 8391) +y(RRTILE8392, 8392) +y(RRTILE8394, 8394) +y(RRTILE8395, 8395) +y(RRTILE8396, 8396) +y(RRTILE8397, 8397) +y(RRTILE8398, 8398) +y(RRTILE8399, 8399) +y(RRTILE8423, 8423) +y(RRTILE8448, 8448) +y(RRTILE8450, 8450) +x(BOATAMMO, 8460) +y(RRTILE8461, 8461) +y(RRTILE8462, 8462) +y(RRTILE8464, 8464) +y(RRTILE8475, 8475) +y(RRTILE8487, 8487) +y(RRTILE8488, 8488) +y(RRTILE8489, 8489) +y(RRTILE8490, 8490) +y(RRTILE8496, 8496) +y(RRTILE8497, 8497) +y(RRTILE8498, 8498) +y(RRTILE8499, 8499) +y(RRTILE8503, 8503) +y(RRTILE8525, 8525) +y(RRTILE8537, 8537) +y(RRTILE8565, 8565) +y(RRTILE8567, 8567) +y(RRTILE8568, 8568) +y(RRTILE8569, 8569) +y(RRTILE8570, 8570) +y(RRTILE8571, 8571) +y(RRTILE8579, 8579) +y(RRTILE8588, 8588) +y(RRTILE8589, 8589) +y(RRTILE8590, 8590) +y(RRTILE8591, 8591) +y(RRTILE8592, 8592) +y(RRTILE8593, 8593) +y(RRTILE8594, 8594) +y(RRTILE8595, 8595) +y(RRTILE8596, 8596) +y(RRTILE8598, 8598) +y(RRTILE8605, 8605) +y(RRTILE8608, 8608) +y(RRTILE8609, 8609) +y(RRTILE8611, 8611) +y(RRTILE8617, 8617) +y(RRTILE8618, 8618) +y(RRTILE8620, 8620) +y(RRTILE8621, 8621) +y(RRTILE8622, 8622) +y(RRTILE8623, 8623) +y(RRTILE8640, 8640) +y(RRTILE8651, 8651) +y(RRTILE8660, 8660) +x(ENDGAME, 8677) +y(RRTILE8679, 8679) +y(RRTILE8680, 8680) +y(RRTILE8681, 8681) +y(RRTILE8682, 8682) +y(RRTILE8683, 8683) +y(RRTILE8704, 8704) +x(BOSS1, 4477) +x(BOSS2, 4557) +x(BOSS3, 4607) +x(BOSS4, 4221) + +x(BOULDER, 256) +x(BOULDER1, 264) +x(TORNADO, 1930) +x(CHEERBOMB, 3464) +x(CHEERBLADE, 3460) +x(DOGATTACK, 4060) +x(BILLYWALK, 4096) +x(BILLYDIE, 4137) +x(BILLYCOCK, 4147) +x(BILLYRAY, 4162) +x(BILLYRAYSTAYPUT, 4163) +x(BILLYBUT, 4188) +x(BILLYSCRATCH, 4191) +x(BILLYSNIFF, 4195) +x(BILLYWOUND, 4202) +x(BILLYGORE, 4228) +x(BILLYJIBA, 4235) +x(BILLYJIBB, 4244) +x(BRAYSNIPER, 4249) +x(DOGRUN, 4260) +x(DOGDIE, 4295) +x(DOGDEAD, 4303) +x(DOGBARK, 4305) +x(LTH, 4352) +x(LTHSTRAFE, 4395) +x(HULKHANG, 4409) +x(HULKHANGDEAD, 4410) +x(HULKJUMP, 4429) +x(LTHLOAD, 4430) +x(LTHDIE, 4456) +x(BUBBASCRATCH, 4464) +x(BUBBANOSE, 4476) +x(BUBBAPISS, 4487) +x(BUBBASTAND, 4504) +x(BUBBAOUCH, 4506) +x(BUBBADIE, 4513) +x(BUBBADEAD, 4523) +x(HULK, 4649) +x(HULKSTAYPUT, 4650) +x(HULKA, 4651) +x(HULKB, 4652) +x(HULKC, 4653) +x(HULKJIBA, 4748) +x(HULKJIBB, 4753) +x(HULKJIBC, 4758) +x(SBSWIPE, 4770) +x(SBPAIN, 4810) +x(SBDIE, 4820) +x(HEN, 4861) +x(HENSTAYPUT, 4862) +x(HENSTAND, 4897) +x(PIG, 4945) +x(PIGSTAYPUT, 4946) +x(PIGEAT, 4983) +x(SBMOVE, 5015) +x(SBSPIT, 5050) +x(SBDIP, 5085) +x(MINION, 5120) +x(MINIONSTAYPUT, 5121) +x(UFO1_RR, 5260) +x(UFO1_RRRA, 5270) +x(UFO2, 5274) +x(UFO3, 5278) +x(UFO4, 5282) +x(UFO5, 5286) +x(MINJIBA, 5290) +x(MINJIBB, 5295) +x(MINJIBC, 5300) +x(COW, 5317) +x(COOT, 5376) +x(COOTSTAYPUT, 5377) +x(COOTSHOOT, 5411) +x(COOTDIE, 5437) +x(COOTDUCK, 5481) +x(COOTPAIN, 5548) +x(COOTTRANS, 5568) +x(COOTGETUP, 5579) +x(COOTJIBA, 5602) +x(COOTJIBB, 5607) +x(COOTJIBC, 5616) +x(VIXEN, 5635) +x(VIXENPAIN, 5675) +x(VIXENDIE, 5710) +x(VIXENSHOOT, 5720) +x(VIXENWDN, 5740) +x(VIXENWUP, 5775) +x(VIXENKICK, 5805) +x(VIXENTELE, 5845) +x(VIXENTEAT, 5851) +x(BIKEJIBA, 5872) +x(BIKEJIBB, 5877) +x(BIKEJIBC, 5882) +x(BIKERB, 5890) +x(BIKERBV2, 5891) +x(BIKER, 5995) +x(BIKERJIBA, 6112) +x(BIKERJIBB, 6117) +x(BIKERJIBC, 6121) +x(BIKERJIBD, 6127) +x(MAKEOUT, 6225) +x(CHEERB, 6401) +x(CHEER, 6658) +x(CHEERSTAYPUT, 6659) +x(CHEERJIBA, 7000) +x(CHEERJIBB, 7005) +x(CHEERJIBC, 7010) +x(CHEERJIBD, 7015) +x(FBOATJIBA, 7020) +x(FBOATJIBB, 7025) +x(COOTPLAY, 7030) +x(BILLYPLAY, 7035) +x(MINIONBOAT, 7192) +x(HULKBOAT, 7199) +x(CHEERBOAT, 7206) +y(RRTILE7274, 7274) +x(RABBIT, 7280) +x(RABBITJIBA, 7387) +x(RABBITJIBB, 7392) +x(RABBITJIBC, 7397) +x(ROCK, 8035) +x(ROCK2, 8036) +x(LEVELMAP01, 8624) +x(LEVELMAP02, 8625) +x(LEVELMAP03, 8626) +x(LEVELMAP04, 8627) +x(LEVELMAP05, 8628) +x(LEVELMAP06, 8629) +x(LEVELMAP07, 8630) +x(LEVELMAP08, 8631) +x(LEVELMAP09, 8632) +x(LEVELMAP10, 8633) +x(LEVELMAP11, 8634) +x(LEVELMAP12, 8635) +x(LEVELMAP13, 8636) +x(LEVELMAP14, 8637) +x(MAMACLOUD, 8663) +x(MAMA, 8705) +x(MAMAJIBA, 8890) +x(MAMAJIBB, 8895) diff --git a/source/games/duke/src/names.h b/source/games/duke/src/names.h index f41e8f39d..2318c9bd1 100644 --- a/source/games/duke/src/names.h +++ b/source/games/duke/src/names.h @@ -22,7 +22,6 @@ extern int TILE_CAMCORNER; extern int TILE_CAMLIGHT; extern int TILE_STATIC; extern int TILE_BOTTOMSTATUSBAR; -extern int TILE_SPINNINGNUKEICON; extern int TILE_THREEDEE; extern int TILE_INGAMEDUKETHREEDEE; extern int TILE_PLUTOPAKSPRITE; diff --git a/source/games/duke/src/names_d.h b/source/games/duke/src/names_d.h index 793564bbf..69f84fdff 100644 --- a/source/games/duke/src/names_d.h +++ b/source/games/duke/src/names_d.h @@ -27,761 +27,11 @@ Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms BEGIN_DUKE_NS +#define x(a, b) a = b, enum { - ARROW = 20, - FIRSTGUNSPRITE = 21, - CHAINGUNSPRITE = 22, - RPGSPRITE = 23, - FREEZESPRITE = 24, - SHRINKERSPRITE = 25, - HEAVYHBOMB = 26, - TRIPBOMBSPRITE = 27, - SHOTGUNSPRITE = 28, - DEVISTATORSPRITE = 29, - HEALTHBOX = 30, - AMMOBOX = 31, - GROWSPRITEICON = 32, - INVENTORYBOX = 33, - FREEZEAMMO = 37, - AMMO = 40, - BATTERYAMMO = 41, - DEVISTATORAMMO = 42, - RPGAMMO = 44, - GROWAMMO = 45, - CRYSTALAMMO = 46, - HBOMBAMMO = 47, - AMMOLOTS = 48, - SHOTGUNAMMO = 49, - COLA = 51, - SIXPAK = 52, - FIRSTAID = 53, - SHIELD = 54, - STEROIDS = 55, - AIRTANK = 56, - JETPACK = 57, - HEATSENSOR = 59, - ACCESSCARD = 60, - BOOTS = 61, - MIRRORBROKE = 70, - CLOUDYOCEAN = 78, - CLOUDYSKIES = 79, - MOONSKY1 = 80, - MOONSKY2 = 81, - MOONSKY3 = 82, - MOONSKY4 = 83, - BIGORBIT1 = 84, - BIGORBIT2 = 85, - BIGORBIT3 = 86, - BIGORBIT4 = 87, - BIGORBIT5 = 88, - LA = 89, - REDSKY1 = 98, - REDSKY2 = 99, - ATOMICHEALTH = 100, - TECHLIGHT2 = 120, - TECHLIGHTBUST2 = 121, - TECHLIGHT4 = 122, - TECHLIGHTBUST4 = 123, - WALLLIGHT4 = 124, - WALLLIGHTBUST4 = 125, - ACCESSSWITCH = 130, - SLOTDOOR = 132, - LIGHTSWITCH = 134, - SPACEDOORSWITCH = 136, - SPACELIGHTSWITCH = 138, - FRANKENSTINESWITCH = 140, - NUKEBUTTON = 142, - MULTISWITCH = 146, - DOORTILE5 = 150, - DOORTILE6 = 151, - DOORTILE1 = 152, - DOORTILE2 = 153, - DOORTILE3 = 154, - DOORTILE4 = 155, - DOORTILE7 = 156, - DOORTILE8 = 157, - DOORTILE9 = 158, - DOORTILE10 = 159, - DOORSHOCK = 160, - DIPSWITCH = 162, - DIPSWITCH2 = 164, - TECHSWITCH = 166, - DIPSWITCH3 = 168, - ACCESSSWITCH2 = 170, - REFLECTWATERTILE = 180, - FLOORSLIME = 200, - BIGFORCE = 230, - EPISODE = 247, - MASKWALL9 = 255, - W_LIGHT = 260, - SCREENBREAK1 = 263, - SCREENBREAK2 = 264, - SCREENBREAK3 = 265, - SCREENBREAK4 = 266, - SCREENBREAK5 = 267, - SCREENBREAK6 = 268, - SCREENBREAK7 = 269, - SCREENBREAK8 = 270, - SCREENBREAK9 = 271, - SCREENBREAK10 = 272, - SCREENBREAK11 = 273, - SCREENBREAK12 = 274, - SCREENBREAK13 = 275, - MASKWALL1 = 285, - W_TECHWALL1 = 293, - W_TECHWALL2 = 297, - W_TECHWALL15 = 299, - W_TECHWALL3 = 301, - W_TECHWALL4 = 305, - W_TECHWALL10 = 306, - W_TECHWALL16 = 307, - WATERTILE2 = 336, - BPANNEL1 = 341, - PANNEL1 = 342, - PANNEL2 = 343, - WATERTILE = 344, - STATIC = 351, - W_SCREENBREAK = 357, - W_HITTECHWALL3 = 360, - W_HITTECHWALL4 = 361, - W_HITTECHWALL2 = 362, - W_HITTECHWALL1 = 363, - MASKWALL10 = 387, - MASKWALL11 = 391, - DOORTILE22 = 395, - FANSPRITE = 407, - FANSPRITEBROKE = 411, - FANSHADOW = 412, - FANSHADOWBROKE = 416, - DOORTILE18 = 447, - DOORTILE19 = 448, - DOORTILE20 = 449, - SPACESHUTTLE = 487, - SATELLITE = 489, - VIEWSCREEN2 = 499, - VIEWSCREENBROKE = 501, - VIEWSCREEN = 502, - GLASS = 503, - GLASS2 = 504, - STAINGLASS1 = 510, - MASKWALL5 = 514, - SATELITE = 516, - FUELPOD = 517, - SLIMEPIPE = 538, - CRACK1 = 546, - CRACK2 = 547, - CRACK3 = 548, - CRACK4 = 549, - FOOTPRINTS = 550, - DOMELITE = 551, - CAMERAPOLE = 554, - CHAIR1 = 556, - CHAIR2 = 557, - BROKENCHAIR = 559, - MIRROR = 560, - WATERFOUNTAIN = 563, - WATERFOUNTAINBROKE = 567, - FEMMAG1 = 568, - TOILET = 569, - STALL = 571, - STALLBROKE = 573, - FEMMAG2 = 577, - REACTOR2 = 578, - REACTOR2BURNT = 579, - REACTOR2SPARK = 580, - GRATE1 = 595, - BGRATE1 = 596, - SOLARPANNEL = 602, - NAKED1 = 603, - ANTENNA = 607, - MASKWALL12 = 609, - TOILETBROKE = 615, - PIPE2 = 616, - PIPE1B = 617, - PIPE3 = 618, - PIPE1 = 619, - CAMERA1 = 621, - BRICK = 626, - SPLINTERWOOD = 630, - PIPE2B = 633, - BOLT1 = 634, - W_NUMBERS = 640, - WATERDRIP = 660, - WATERBUBBLE = 661, - WATERBUBBLEMAKER = 662, - W_FORCEFIELD = 663, - VACUUM = 669, - FOOTPRINTS2 = 672, - FOOTPRINTS3 = 673, - FOOTPRINTS4 = 674, - EGG = 675, - SCALE = 678, - CHAIR3 = 680, - CAMERALIGHT = 685, - MOVIECAMERA = 686, - IVUNIT = 689, - POT1 = 694, - POT2 = 695, - POT3 = 697, - PIPE3B = 700, - WALLLIGHT3 = 701, - WALLLIGHTBUST3 = 702, - WALLLIGHT1 = 703, - WALLLIGHTBUST1 = 704, - WALLLIGHT2 = 705, - WALLLIGHTBUST2 = 706, - LIGHTSWITCH2 = 712, - WAITTOBESEATED = 716, - DOORTILE14 = 717, - STATUE = 753, - MIKE = 762, - VASE = 765, - SUSHIPLATE1 = 768, - SUSHIPLATE2 = 769, - SUSHIPLATE3 = 774, - SUSHIPLATE4 = 779, - DOORTILE16 = 781, - SUSHIPLATE5 = 792, - OJ = 806, - MASKWALL13 = 830, - HURTRAIL = 859, - POWERSWITCH1 = 860, - LOCKSWITCH1 = 862, - POWERSWITCH2 = 864, - ATM = 867, - STATUEFLASH = 869, - ATMBROKE = 888, - BIGHOLE2 = 893, - STRIPEBALL = 901, - QUEBALL = 902, - POCKET = 903, - WOODENHORSE = 904, - TREE1 = 908, - TREE2 = 910, - CACTUS = 911, - MASKWALL2 = 913, - MASKWALL3 = 914, - MASKWALL4 = 915, - FIREEXT = 916, - TOILETWATER = 921, - NEON1 = 925, - NEON2 = 926, - CACTUSBROKE = 939, - BOUNCEMINE = 940, - BROKEFIREHYDRENT = 950, - BOX = 951, - BULLETHOLE = 952, - BOTTLE1 = 954, - BOTTLE2 = 955, - BOTTLE3 = 956, - BOTTLE4 = 957, - FEMPIC5 = 963, - FEMPIC6 = 964, - FEMPIC7 = 965, - HYDROPLANT = 969, - OCEANSPRITE1 = 971, - OCEANSPRITE2 = 972, - OCEANSPRITE3 = 973, - OCEANSPRITE4 = 974, - OCEANSPRITE5 = 975, - GENERICPOLE = 977, - CONE = 978, - HANGLIGHT = 979, - HYDRENT = 981, - MASKWALL14 = 988, - TIRE = 990, - PIPE5 = 994, - PIPE6 = 995, - PIPE4 = 996, - PIPE4B = 997, - BROKEHYDROPLANT = 1003, - PIPE5B = 1005, - NEON3 = 1007, - NEON4 = 1008, - NEON5 = 1009, - BOTTLE5 = 1012, - BOTTLE6 = 1013, - BOTTLE8 = 1014, - SPOTLITE = 1020, - HANGOOZ = 1022, - MASKWALL15 = 1024, - BOTTLE7 = 1025, - HORSEONSIDE = 1026, - GLASSPIECES = 1031, - HORSELITE = 1034, - DONUTS = 1045, - NEON6 = 1046, - MASKWALL6 = 1059, - CLOCK = 1060, - RUBBERCAN = 1062, - BROKENCLOCK = 1067, - PLUG = 1069, - OOZFILTER = 1079, - FLOORPLASMA = 1082, - REACTOR = 1088, - REACTORSPARK = 1092, - REACTORBURNT = 1096, - DOORTILE15 = 1102, - HANDSWITCH = 1111, - CIRCLEPANNEL = 1113, - CIRCLEPANNELBROKE = 1114, - PULLSWITCH = 1122, - MASKWALL8 = 1124, - BIGHOLE = 1141, - ALIENSWITCH = 1142, - DOORTILE21 = 1144, - HANDPRINTSWITCH = 1155, - BOTTLE10 = 1157, - BOTTLE11 = 1158, - BOTTLE12 = 1159, - BOTTLE13 = 1160, - BOTTLE14 = 1161, - BOTTLE15 = 1162, - BOTTLE16 = 1163, - BOTTLE17 = 1164, - BOTTLE18 = 1165, - BOTTLE19 = 1166, - DOORTILE17 = 1169, - MASKWALL7 = 1174, - JAILBARBREAK = 1175, - DOORTILE11 = 1178, - DOORTILE12 = 1179, - VENDMACHINE = 1212, - VENDMACHINEBROKE = 1214, - COLAMACHINE = 1215, - COLAMACHINEBROKE = 1217, - CRANEPOLE = 1221, - CRANE = 1222, - BARBROKE = 1225, - BLOODPOOL = 1226, - NUKEBARREL = 1227, - NUKEBARRELDENTED = 1228, - NUKEBARRELLEAKED = 1229, - CANWITHSOMETHING = 1232, - MONEY = 1233, - BANNER = 1236, - EXPLODINGBARREL = 1238, - EXPLODINGBARREL2 = 1239, - FIREBARREL = 1240, - SEENINE = 1247, - SEENINEDEAD = 1248, - STEAM = 1250, - CEILINGSTEAM = 1255, - PIPE6B = 1260, - TRANSPORTERBEAM = 1261, - RAT = 1267, - TRASH = 1272, - FEMPIC1 = 1280, - FEMPIC2 = 1289, - BLANKSCREEN = 1293, - PODFEM1 = 1294, - FEMPIC3 = 1298, - FEMPIC4 = 1306, - FEM1 = 1312, - FEM2 = 1317, - FEM3 = 1321, - FEM5 = 1323, - BLOODYPOLE = 1324, - FEM4 = 1325, - FEM6 = 1334, - FEM6PAD = 1335, - FEM8 = 1336, - HELECOPT = 1346, - FETUSJIB = 1347, - HOLODUKE = 1348, - SPACEMARINE = 1353, - INDY = 1355, - FETUS = 1358, - FETUSBROKE = 1359, - MONK = 1352, - LUKE = 1354, - COOLEXPLOSION1 = 1360, - WATERSPLASH2 = 1380, - FIREVASE = 1390, - SCRATCH = 1393, - FEM7 = 1395, - APLAYERTOP = 1400, - APLAYER = 1405, - PLAYERONWATER = 1420, - DUKELYINGDEAD = 1518, - DUKETORSO = 1520, - DUKEGUN = 1528, - DUKELEG = 1536, - SHARK = 1550, - BLOOD = 1620, - FIRELASER = 1625, - TRANSPORTERSTAR = 1630, - SPIT = 1636, - LOOGIE = 1637, - FIST = 1640, - FREEZEBLAST = 1641, - DEVISTATORBLAST = 1642, - SHRINKSPARK = 1646, - TONGUE = 1647, - MORTER = 1650, - SHRINKEREXPLOSION = 1656, - RADIUSEXPLOSION = 1670, - FORCERIPPLE = 1671, - LIZTROOP = 1680, - LIZTROOPRUNNING = 1681, - LIZTROOPSTAYPUT = 1682, - LIZTOP = 1705, - LIZTROOPSHOOT = 1715, - LIZTROOPJETPACK = 1725, - LIZTROOPDSPRITE = 1734, - LIZTROOPONTOILET = 1741, - LIZTROOPJUSTSIT = 1742, - LIZTROOPDUCKING = 1744, - HEADJIB1 = 1768, - ARMJIB1 = 1772, - LEGJIB1 = 1776, - CANNONBALL = 1817, - OCTABRAIN = 1820, - OCTABRAINSTAYPUT = 1821, - OCTATOP = 1845, - OCTADEADSPRITE = 1855, - INNERJAW = 1860, - DRONE = 1880, - EXPLOSION2 = 1890, - COMMANDER = 1920, - COMMANDERSTAYPUT = 1921, - RECON = 1960, - TANK = 1975, - PIGCOP = 2000, - PIGCOPSTAYPUT = 2001, - PIGCOPDIVE = 2045, - PIGCOPDEADSPRITE = 2060, - PIGTOP = 2061, - LIZMAN = 2120, - LIZMANSTAYPUT = 2121, - LIZMANSPITTING = 2150, - LIZMANFEEDING = 2160, - LIZMANJUMP = 2165, - LIZMANDEADSPRITE = 2185, - FECES = 2200, - LIZMANHEAD1 = 2201, - LIZMANARM1 = 2205, - LIZMANLEG1 = 2209, - EXPLOSION2BOT = 2219, - USERWEAPON = 2235, - HEADERBAR = 2242, - JIBS1 = 2245, - JIBS2 = 2250, - JIBS3 = 2255, - JIBS4 = 2260, - JIBS5 = 2265, - BURNING = 2270, - FIRE = 2271, - JIBS6 = 2286, - BLOODSPLAT1 = 2296, - BLOODSPLAT3 = 2297, - BLOODSPLAT2 = 2298, - BLOODSPLAT4 = 2299, - OOZ = 2300, - OOZ2 = 2309, - WALLBLOOD1 = 2301, - WALLBLOOD2 = 2302, - WALLBLOOD3 = 2303, - WALLBLOOD4 = 2304, - WALLBLOOD5 = 2305, - WALLBLOOD6 = 2306, - WALLBLOOD7 = 2307, - WALLBLOOD8 = 2308, - BURNING2 = 2310, - FIRE2 = 2311, - CRACKKNUCKLES = 2324, - SMALLSMOKE = 2329, - SMALLSMOKEMAKER = 2330, - FLOORFLAME = 2333, - ROTATEGUN = 2360, - GREENSLIME = 2370, - WATERDRIPSPLASH = 2380, - SCRAP6 = 2390, - SCRAP1 = 2400, - SCRAP2 = 2404, - SCRAP3 = 2408, - SCRAP4 = 2412, - SCRAP5 = 2416, - ORGANTIC = 2420, - BETAVERSION = 2440, - PLAYERISHERE = 2442, - PLAYERWASHERE = 2443, - SELECTDIR = 2444, - F1HELP = 2445, - NOTCHON = 2446, - NOTCHOFF = 2447, - GROWSPARK = 2448, - DUKEICON = 2452, - BADGUYICON = 2453, - FOODICON = 2454, - GETICON = 2455, - MENUSCREEN = 2456, - MENUBAR = 2457, - KILLSICON = 2458, - FIRSTAID_ICON = 2460, - HEAT_ICON = 2461, - BOTTOMSTATUSBAR = 2462, - BOOT_ICON = 2463, - FRAGBAR = 2465, - JETPACK_ICON = 2467, - AIRTANK_ICON = 2468, - STEROIDS_ICON = 2469, - HOLODUKE_ICON = 2470, - ACCESS_ICON = 2471, - DIGITALNUM = 2472, - DUKECAR = 2491, - CAMCORNER = 2482, - CAMLIGHT = 2484, - LOGO = 2485, - TITLE = 2486, - NUKEWARNINGICON = 2487, - MOUSECURSOR = 2488, - SLIDEBAR = 2489, - DREALMS = 2492, - BETASCREEN = 2493, - WINDOWBORDER1 = 2494, - TEXTBOX = 2495, - WINDOWBORDER2 = 2496, - DUKENUKEM = 2497, - THREEDEE = 2498, - INGAMEDUKETHREEDEE = 2499, - TENSCREEN = 2500, - PLUTOPAKSPRITE = 2501, - DEVISTATOR = 2510, - KNEE = 2521, - CROSSHAIR = 2523, - FIRSTGUN = 2524, - FIRSTGUNRELOAD = 2528, - FALLINGCLIP = 2530, - CLIPINHAND = 2531, - HAND = 2532, - SHELL = 2533, - SHOTGUNSHELL = 2535, - CHAINGUN = 2536, - RPGGUN = 2544, - RPGMUZZLEFLASH = 2545, - FREEZE = 2548, - CATLITE = 2552, - SHRINKER = 2556, - HANDHOLDINGLASER = 2563, - TRIPBOMB = 2566, - LASERLINE = 2567, - HANDHOLDINGACCESS = 2568, - HANDREMOTE = 2570, - HANDTHROW = 2573, - TIP = 2576, - GLAIR = 2578, - SCUBAMASK = 2581, - SPACEMASK = 2584, - FORCESPHERE = 2590, - SHOTSPARK1 = 2595, - RPG = 2605, - LASERSITE = 2612, - SHOTGUN = 2613, - BOSS1 = 2630, - BOSS1STAYPUT = 2631, - BOSS1SHOOT = 2660, - BOSS1LOB = 2670, - BOSSTOP = 2696, - BOSS2 = 2710, - BOSS3 = 2760, - SPINNINGNUKEICON = 2813, - BIGFNTCURSOR = 2820, - SMALLFNTCURSOR = 2821, - STARTALPHANUM = 2822, - ENDALPHANUM = 2915, - BIGALPHANUM = 2940, - BIGPERIOD = 3002, - BIGCOMMA = 3003, - BIGX = 3004, - BIGQ = 3005, - BIGSEMI = 3006, - BIGCOLIN = 3007, - THREEBYFIVE = 3010, - BIGAPPOS = 3022, - BLANK = 3026, - MINIFONT = 3072, - BUTTON1 = 3164, - GLASS3 = 3187, - RESPAWNMARKERRED = 3190, - RESPAWNMARKERYELLOW = 3200, - RESPAWNMARKERGREEN = 3210, - BONUSSCREEN = 3240, - VIEWBORDER = 3250, - VICTORY1 = 3260, - ORDERING = 3270, - TEXTSTORY = 3280, - LOADSCREEN = 3281, - E1ENDSCREEN = 3292, - E2ENDSCREEN = 3293, - BORNTOBEWILDSCREEN = 3370, - BLIMP = 3400, - FEM9 = 3450, - FOOTPRINT = 3701, - FRAMEEFFECT1_13= 3999, - POOP = 4094, - FRAMEEFFECT1 = 4095, - PANNEL3 = 4099, - SCREENBREAK14 = 4120, - SCREENBREAK15 = 4123, - SCREENBREAK19 = 4125, - SCREENBREAK16 = 4127, - SCREENBREAK17 = 4128, - SCREENBREAK18 = 4129, - W_TECHWALL11 = 4130, - W_TECHWALL12 = 4131, - W_TECHWALL13 = 4132, - W_TECHWALL14 = 4133, - W_TECHWALL5 = 4134, - W_TECHWALL6 = 4136, - W_TECHWALL7 = 4138, - W_TECHWALL8 = 4140, - W_TECHWALL9 = 4142, - BPANNEL3 = 4100, - W_HITTECHWALL16 = 4144, - W_HITTECHWALL10 = 4145, - W_HITTECHWALL15 = 4147, - W_MILKSHELF = 4181, - W_MILKSHELFBROKE = 4203, - PURPLELAVA = 4240, - LAVABUBBLE = 4340, - DUKECUTOUT = 4352, - TARGET = 4359, - GUNPOWDERBARREL = 4360, - DUCK = 4361, - HATRACK = 4367, - DESKLAMP = 4370, - COFFEEMACHINE = 4372, - CUPS = 4373, - GAVALS = 4374, - GAVALS2 = 4375, - POLICELIGHTPOLE = 4377, - FLOORBASKET = 4388, - PUKE = 4389, - DOORTILE23 = 4391, - TOPSECRET = 4396, - SPEAKER = 4397, - TEDDYBEAR = 4400, - ROBOTDOG = 4402, - ROBOTPIRATE = 4404, - ROBOTMOUSE = 4407, - MAIL = 4410, - MAILBAG = 4413, - HOTMEAT = 4427, - COFFEEMUG = 4438, - DONUTS2 = 4440, - TRIPODCAMERA = 4444, - METER = 4453, - DESKPHONE = 4454, - GUMBALLMACHINE = 4458, - GUMBALLMACHINEBROKE = 4459, - PAPER = 4460, - MACE = 4464, - GENERICPOLE2 = 4465, - XXXSTACY = 4470, - WETFLOOR = 4495, - BROOM = 4496, - MOP = 4497, - LETTER = 4502, - PIRATE1A = 4510, - PIRATE4A = 4511, - PIRATE2A = 4512, - PIRATE5A = 4513, - PIRATE3A = 4514, - PIRATE6A = 4515, - PIRATEHALF = 4516, - CHESTOFGOLD = 4520, - SIDEBOLT1 = 4525, - FOODOBJECT1 = 4530, - FOODOBJECT2 = 4531, - FOODOBJECT3 = 4532, - FOODOBJECT4 = 4533, - FOODOBJECT5 = 4534, - FOODOBJECT6 = 4535, - FOODOBJECT7 = 4536, - FOODOBJECT8 = 4537, - FOODOBJECT9 = 4538, - FOODOBJECT10 = 4539, - FOODOBJECT11 = 4540, - FOODOBJECT12 = 4541, - FOODOBJECT13 = 4542, - FOODOBJECT14 = 4543, - FOODOBJECT15 = 4544, - FOODOBJECT16 = 4545, - FOODOBJECT17 = 4546, - FOODOBJECT18 = 4547, - FOODOBJECT19 = 4548, - FOODOBJECT20 = 4549, - HEADLAMP = 4550, - TAMPON = 4557, - SKINNEDCHICKEN = 4554, - FEATHEREDCHICKEN = 4555, - ROBOTDOG2 = 4560, - JOLLYMEAL = 4569, - DUKEBURGER = 4570, - SHOPPINGCART = 4576, - CANWITHSOMETHING2 = 4580, - CANWITHSOMETHING3 = 4581, - CANWITHSOMETHING4 = 4582, - SNAKEP = 4590, - DOLPHIN1 = 4591, - DOLPHIN2 = 4592, - NEWBEAST = 4610, - NEWBEASTSTAYPUT = 4611, - NEWBEASTJUMP = 4690, - NEWBEASTHANG = 4670, - NEWBEASTHANGDEAD = 4671, - BOSS4 = 4740, - BOSS4STAYPUT = 4741, - FEM10 = 4864, - TOUGHGAL = 4866, - MAN = 4871, - MAN2 = 4872, - WOMAN = 4874, - PLEASEWAIT = 4887, - NATURALLIGHTNING = 4890, - WEATHERWARN = 4893, - DUKETAG = 4900, - SIGN1 = 4909, - SIGN2 = 4912, - JURYGUY = 4943, - - - // New names from World Tour - WIDESCREENSTATUSBAR = 5120, - RPGGUNWIDE = 5121, - FIRSTGUNRELOADWIDE = 5122, - FREEZEWIDE = 5123, - FREEZEFIREWIDE = 5124, - SHRINKERWIDE = 5127, - CRACKKNUCKLESWIDE = 5129, - ONFIRESMOKE = 5143, - LAVASPLASH = 5371, - BOSS2STAYPUT = 2711, - BOSS3STAYPUT = 2761, - WTGLASS1 = 5736, - WTGLASS2 = 5737, - FLAMETHROWERSPRITE = 5134, - FLAMETHROWERAMMO = 5135, - FLAMETHROWER = 5138, - ONFIRE = 5152, - LAVAPOOL = 5304, - LAVAPOOLBUBBLE = 5207, - WHISPYSMOKE = 5268, - FLAMETHROWERFIRE = 5139, - FLAMETHROWERFLAME = 1891, - FLAMETHROWERPILOT = 5174, - FIREBALL = 5163, - BURNEDCORPSE = 5173, - FIREFLY = 5180, - FIREFLYSHRINKEFFECT = 5360, - FIREFLYGROWEFFECT = 5367, - FIREFLYFLYINGEFFECT = 5296, - DEVELOPERCOMMENTARY = 5294, - BOSS5 = 5310, - BOSS5STAYPUT = 5311, - SERIOUSSAM = 5846 + #include "namelist_d.h" }; +#undef x END_DUKE_NS diff --git a/source/games/duke/src/names_r.h b/source/games/duke/src/names_r.h index 1656a808a..8daae2c06 100644 --- a/source/games/duke/src/names_r.h +++ b/source/games/duke/src/names_r.h @@ -30,1364 +30,14 @@ Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms BEGIN_DUKE_NS +#define x(a, b) a = b, +#define y(a, b) a = b, enum { - RRTILE11 = 11, - PLEASEWAIT = 12, - //WEATHERWARN = 14, - RPG2SPRITE = 14, - DUKETAG = 15, - SIGN1 = 16, - SIGN2 = 17, - RRTILE18 = 18, - RRTILE19 = 19, - ARROW = 20, - FIRSTGUNSPRITE = 21, - CHAINGUNSPRITE = 22, - RPGSPRITE = 23, - FREEZESPRITE = 24, - SHRINKERSPRITE = 25, - HEAVYHBOMB = 26, - TRIPBOMBSPRITE = 27, - SHOTGUNSPRITE = 28, - DEVISTATORSPRITE = 29, - HEALTHBOX = 30, - AMMOBOX = 31, - GROWSPRITEICON = 32, - INVENTORYBOX = 33, - RRTILE34 = 34, - RRTILE35 = 35, - DESTRUCTO = 36, - FREEZEAMMO = 37, - RRTILE38 = 38, - AMMO = 40, - BATTERYAMMO = 41, - DEVISTATORAMMO = 42, - RRTILE43 = 43, - RPGAMMO = 44, - GROWAMMO = 45, - CRYSTALAMMO = 46, - HBOMBAMMO = 47, - AMMOLOTS = 48, - SHOTGUNAMMO = 49, - COLA = 51, - SIXPAK = 52, - FIRSTAID = 53, - SHIELD = 54, - STEROIDS = 55, - AIRTANK = 56, - JETPACK = 57, - HEATSENSOR = 59, - ACCESSCARD = 60, - BOOTS = 61, - GUTMETER = 62, - RRTILE63 = 63, - RRTILE64 = 64, - RRTILE65 = 65, - RRTILE66 = 66, - RRTILE67 = 67, - RRTILE68 = 68, - MIRRORBROKE = 70, - SOUNDFX = 71, - TECHLIGHT2 = 72, - TECHLIGHTBUST2 = 73, - TECHLIGHT4 = 74, - TECHLIGHTBUST4 = 75, - WALLLIGHT4 = 76, - WALLLIGHTBUST4 = 77, - MOTOAMMO = 78, - BUTTON1 = 80, - ACCESSSWITCH = 82, - SLOTDOOR = 84, - LIGHTSWITCH = 86, - SPACEDOORSWITCH = 88, - SPACELIGHTSWITCH = 90, - FRANKENSTINESWITCH = 92, - NUKEBUTTON = 94, - MULTISWITCH = 98, - DOORTILE1 = 102, - DOORTILE2 = 103, - DOORTILE3 = 104, - DOORTILE4 = 105, - DOORTILE5 = 106, - DOORTILE6 = 107, - DOORTILE7 = 108, - DOORTILE8 = 109, - DOORTILE9 = 110, - DOORTILE10 = 111, - DOORTILE14 = 115, - DOORTILE15 = 116, - DOORTILE16 = 117, - DOORTILE18 = 119, - DOORSHOCK = 120, - DIPSWITCH = 121, - DIPSWITCH2 = 123, - TECHSWITCH = 125, - DIPSWITCH3 = 127, - ACCESSSWITCH2 = 129, - REFLECTWATERTILE = 131, - FLOORSLIME = 132, - BIGFORCE = 135, - EPISODE = 137, - MASKWALL1 = 138, - MASKWALL2 = 140, - MASKWALL3 = 141, - MASKWALL4 = 142, - MASKWALL5 = 143, - MASKWALL6 = 144, - MASKWALL8 = 146, - MASKWALL9 = 147, - MASKWALL10 = 148, - MASKWALL11 = 149, - MASKWALL12 = 150, - MASKWALL13 = 151, - MASKWALL14 = 152, - MASKWALL15 = 153, - FIREEXT = 155, - W_LIGHT = 156, - SCREENBREAK1 = 159, - SCREENBREAK2 = 160, - SCREENBREAK3 = 161, - SCREENBREAK4 = 162, - SCREENBREAK5 = 163, - SCREENBREAK6 = 164, - SCREENBREAK7 = 165, - SCREENBREAK8 = 166, - SCREENBREAK9 = 167, - SCREENBREAK10 = 168, - SCREENBREAK11 = 169, - SCREENBREAK12 = 170, - SCREENBREAK13 = 171, - W_TECHWALL1 = 185, - W_TECHWALL2 = 186, - W_TECHWALL3 = 187, - W_TECHWALL4 = 188, - W_TECHWALL10 = 189, - W_TECHWALL15 = 191, - W_TECHWALL16 = 192, - STATIC = 195, - W_SCREENBREAK = 199, - W_HITTECHWALL3 = 205, - W_HITTECHWALL4 = 206, - W_HITTECHWALL2 = 207, - W_HITTECHWALL1 = 208, - FANSPRITE = 210, - FANSPRITEBROKE = 215, - FANSHADOW = 216, - FANSHADOWBROKE = 219, - DOORTILE19 = 229, - DOORTILE20 = 230, - DOORTILE22 = 232, - GRATE1 = 234, - BGRATE1 = 235, - SPLINTERWOOD = 237, - WATERDRIP = 239, - WATERBUBBLE = 240, - WATERBUBBLEMAKER = 241, - W_FORCEFIELD = 242, - WALLLIGHT3 = 244, - WALLLIGHTBUST3 = 245, - WALLLIGHT1 = 246, - WALLLIGHTBUST1 = 247, - WALLLIGHT2 = 248, - WALLLIGHTBUST2 = 249, - LIGHTSWITCH2 = 250, - UFOBEAM = 252, - RRTILE280 = 280, - RRTILE281 = 281, - RRTILE282 = 282, - RRTILE283 = 283, - RRTILE285 = 285, - RRTILE286 = 286, - RRTILE287 = 287, - RRTILE288 = 288, - RRTILE289 = 289, - RRTILE290 = 290, - RRTILE291 = 291, - RRTILE292 = 292, - RRTILE293 = 293, - RRTILE295 = 295, - RRTILE296 = 296, - RRTILE297 = 297, - CDPLAYER = 370, - RRTILE380 = 380, - RRTILE403 = 403, - RRTILE409 = 409, - BIGFNTCURSOR = 512, - SMALLFNTCURSOR = 513, - STARTALPHANUM = 514, - ENDALPHANUM = 607, - BIGALPHANUM = 632, - BIGPERIOD = 694, - BIGCOMMA = 695, - BIGX = 696, - BIGQ = 697, - BIGSEMI = 698, - BIGCOLIN = 699, - THREEBYFIVE = 702, - BIGAPPOS = 714, - MINIFONT = 718, - W_NUMBERS = 810, - BLANK = 820, - RESPAWNMARKERRED = 866, - RESPAWNMARKERYELLOW = 876, - RESPAWNMARKERGREEN = 886, - SPINNINGNUKEICON = 896, - GUTMETER_LIGHT1 = 920, - GUTMETER_LIGHT2 = 921, - GUTMETER_LIGHT3 = 922, - GUTMETER_LIGHT4 = 923, - AMMO_ICON = 930, - CLOUDYSKIES = 1021, - MOONSKY1 = 1022, - MOONSKY2 = 1023, - MOONSKY3 = 1024, - MOONSKY4 = 1025, - BIGORBIT1 = 1026, - BIGORBIT2 = 1027, - BIGORBIT3 = 1028, - BIGORBIT4 = 1029, - BIGORBIT5 = 1030, - LA = 1031, - REDSKY1 = 1040, - REDSKY2 = 1041, - WATERTILE = 1044, - WATERTILE2 = 1045, - SATELLITE = 1049, - VIEWSCREEN2 = 1052, - VIEWSCREENBROKE = 1054, - VIEWSCREEN = 1055, - GLASS = 1056, - GLASS2 = 1057, - STAINGLASS1 = 1063, - SATELITE = 1066, - FUELPOD = 1067, - SLIMEPIPE = 1070, - CRACK1 = 1075, - CRACK2 = 1076, - CRACK3 = 1077, - CRACK4 = 1078, - FOOTPRINTS = 1079, - DOMELITE = 1080, - CAMERAPOLE = 1083, - CHAIR1 = 1085, - CHAIR2 = 1086, - BROKENCHAIR = 1088, - MIRROR = 1089, - WATERFOUNTAIN = 1092, - WATERFOUNTAINBROKE = 1096, - FEMMAG1 = 1097, - TOILET = 1098, - STALL = 1100, - STALLBROKE = 1102, - FEMMAG2 = 1106, - REACTOR2 = 1107, - REACTOR2BURNT = 1108, - REACTOR2SPARK = 1109, - SOLARPANNEL = 1114, - NAKED1 = 1115, - ANTENNA = 1117, - TOILETBROKE = 1120, - PIPE2 = 1121, - PIPE1B = 1122, - PIPE3 = 1123, - PIPE1 = 1124, - PIPE2B = 1126, - BOLT1 = 1127, - PIPE3B = 1132, - CAMERA1 = 1134, - BRICK = 1139, - VACUUM = 1141, - JURYGUY = 1142, - FOOTPRINTS2 = 1144, - FOOTPRINTS3 = 1145, - FOOTPRINTS4 = 1146, - EGG = 1147, - SCALE = 1150, - CHAIR3 = 1152, - CAMERALIGHT = 1157, - MOVIECAMERA = 1158, - FOOTPRINT = 1160, - IVUNIT = 1163, - POT1 = 1164, - POT2 = 1165, - POT3 = 1166, - STATUE = 1168, - MIKE = 1170, - VASE = 1172, - SUSHIPLATE1 = 1174, - SUSHIPLATE2 = 1175, - SUSHIPLATE3 = 1176, - SUSHIPLATE4 = 1178, - SUSHIPLATE5 = 1180, - BIGHOLE2 = 1182, - STRIPEBALL = 1184, - QUEBALL = 1185, - POCKET = 1186, - WOODENHORSE = 1187, - TREE1 = 1191, - TREE2 = 1193, - CACTUS = 1194, - TOILETWATER = 1196, - NEON1 = 1200, - NEON2 = 1201, - CACTUSBROKE = 1203, - BOUNCEMINE = 1204, - BROKEFIREHYDRENT = 1210, - BOX = 1211, - BULLETHOLE = 1212, - BOTTLE1 = 1215, - BOTTLE2 = 1216, - BOTTLE3 = 1217, - BOTTLE4 = 1218, - BOTTLE5 = 1219, - BOTTLE6 = 1220, - BOTTLE7 = 1221, - BOTTLE8 = 1222, - SNAKEP = 1224, - DOLPHIN1 = 1225, - DOLPHIN2 = 1226, - HYDRENT = 1228, - TIRE = 1230, - PIPE5 = 1232, - PIPE6 = 1233, - PIPE4 = 1234, - PIPE4B = 1235, - BROKEHYDROPLANT = 1237, - PIPE5B = 1239, - NEON3 = 1241, - NEON4 = 1242, - NEON5 = 1243, - SPOTLITE = 1247, - HANGOOZ = 1249, - HORSEONSIDE = 1251, - GLASSPIECES = 1256, - HORSELITE = 1259, - DONUTS = 1263, - NEON6 = 1264, - CLOCK = 1266, - RUBBERCAN = 1268, - BROKENCLOCK = 1270, - PLUG = 1272, - OOZFILTER = 1273, - FLOORPLASMA = 1276, - HANDPRINTSWITCH = 1278, - BOTTLE10 = 1280, - BOTTLE11 = 1281, - BOTTLE12 = 1282, - BOTTLE13 = 1283, - BOTTLE14 = 1284, - BOTTLE15 = 1285, - BOTTLE16 = 1286, - BOTTLE17 = 1287, - BOTTLE18 = 1288, - BOTTLE19 = 1289, - VENDMACHINE = 1291, - VENDMACHINEBROKE = 1293, - COLAMACHINE = 1294, - COLAMACHINEBROKE = 1296, - CRANEPOLE = 1298, - CRANE = 1299, - BARBROKE = 1302, - BLOODPOOL = 1303, - NUKEBARREL = 1304, - NUKEBARRELDENTED = 1305, - NUKEBARRELLEAKED = 1306, - CANWITHSOMETHING = 1309, - MONEY = 1310, - BANNER = 1313, - EXPLODINGBARREL = 1315, - EXPLODINGBARREL2 = 1316, - FIREBARREL = 1317, - SEENINE = 1324, - SEENINEDEAD = 1325, - STEAM = 1327, - CEILINGSTEAM = 1332, - PIPE6B = 1337, - TRANSPORTERBEAM = 1338, - RAT = 1344, - TRASH = 1346, - HELECOPT = 1348, - FETUSJIB = 1349, - HOLODUKE = 1350, - MONK = 1354, - SPACEMARINE = 1355, - LUKE = 1356, - INDY = 1357, - FETUS = 1360, - FETUSBROKE = 1361, - WATERSPLASH2 = 1383, - FIREVASE = 1388, - SCRATCH = 1389, - BLOOD = 1391, - TRANSPORTERSTAR = 1398, - LOOGIE = 1405, - FIST = 1408, - FREEZEBLAST = 1409, - DEVISTATORBLAST = 1410, - TONGUE = 1414, - MORTER = 1416, - MUD = 1420, - SHRINKEREXPLOSION = 1421, - RADIUSEXPLOSION = 1426, - FORCERIPPLE = 1427, - CANNONBALL = 1437, - INNERJAW = 1439, - EXPLOSION2 = 1441, - EXPLOSION3 = 1442, - JIBS1 = 1463, - JIBS2 = 1468, - JIBS3 = 1473, - JIBS4 = 1478, - JIBS5 = 1483, - CRACKKNUCKLES = 1489, - HEADERBAR = 1493, - BURNING = 1494, - FIRE = 1495, - USERWEAPON = 1510, - JIBS6 = 1515, - BLOODSPLAT1 = 1525, - BLOODSPLAT3 = 1526, - BLOODSPLAT2 = 1527, - BLOODSPLAT4 = 1528, - OOZ = 1529, - WALLBLOOD1 = 1530, - WALLBLOOD2 = 1531, - WALLBLOOD3 = 1532, - WALLBLOOD4 = 1533, - WALLBLOOD5 = 1534, - WALLBLOOD6 = 1535, - WALLBLOOD7 = 1536, - WALLBLOOD8 = 1537, - OOZ2 = 1538, - BURNING2 = 1539, - FIRE2 = 1540, - SMALLSMOKE = 1554, - SMALLSMOKEMAKER = 1555, - FLOORFLAME = 1558, - GREENSLIME = 1575, - WATERDRIPSPLASH = 1585, - SCRAP6 = 1595, - SCRAP1 = 1605, - SCRAP2 = 1609, - SCRAP3 = 1613, - SCRAP4 = 1617, - SCRAP5 = 1621, - ROTATEGUN = 1624, - BETAVERSION = 1629, - PLAYERISHERE = 1630, - PLAYERWASHERE = 1631, - SELECTDIR = 1632, - F1HELP = 1633, - NOTCHON = 1634, - NOTCHOFF = 1635, - RRTILE1636 = 1636, - DUKEICON = 1637, - BADGUYICON = 1638, - FOODICON = 1639, - GETICON = 1640, - MENUSCREEN = 1641, - MENUBAR = 1642, - KILLSICON = 1643, - FIRSTAID_ICON = 1645, - HEAT_ICON = 1646, - BOTTOMSTATUSBAR = 1647, - BOOT_ICON = 1648, - WEAPONBAR = 1649, - FRAGBAR = 1650, - JETPACK_ICON = 1652, - AIRTANK_ICON = 1653, - STEROIDS_ICON = 1654, - HOLODUKE_ICON = 1655, - ACCESS_ICON = 1656, - DIGITALNUM = 1657, - CAMCORNER = 1667, - CAMLIGHT = 1669, - LOGO = 1670, - TITLE = 1671, - NUKEWARNINGICON = 1672, - MOUSECURSOR = 1673, - SLIDEBAR = 1674, - DUKECAR = 1676, - DREALMS = 1677, - BETASCREEN = 1678, - WINDOWBORDER1 = 1679, - TEXTBOX = 1680, - WINDOWBORDER2 = 1681, - DUKENUKEM = 1682, - THREEDEE = 1683, - INGAMEDUKETHREEDEE = 1684, - TENSCREEN = 1685, - PLUTOPAKSPRITE = 1686, - CROSSHAIR = 1689, - FALLINGCLIP = 1699, - CLIPINHAND = 1700, - HAND = 1701, - SHELL = 1702, - SHOTGUNSHELL = 1704, - RPGMUZZLEFLASH = 1714, - CATLITE = 1721, - HANDHOLDINGLASER = 1732, - TRIPBOMB = 1735, - LASERLINE = 1736, - HANDHOLDINGACCESS = 1737, - HANDREMOTE = 1739, - TIP = 1745, - GLAIR = 1747, - SPACEMASK = 1753, - RRTILE1752 = 1752, - FORCESPHERE = 1759, - SHOTSPARK1 = 1764, - RPG = 1774, - RPG2 = 1781, - // = LASERSITE = 1781, - RRTILE1790 = 1790, - RRTILE1792 = 1792, - RRTILE1801 = 1801, - RRTILE1805 = 1805, - RRTILE1807 = 1807, - RRTILE1808 = 1808, - RRTILE1812 = 1812, - RRTILE1814 = 1814, - RRTILE1817 = 1817, - RRTILE1821 = 1821, - RRTILE1824 = 1824, - RRTILE1826 = 1826, - RRTILE1850 = 1850, - RRTILE1851 = 1851, - RRTILE1856 = 1856, - RRTILE1877 = 1877, - RRTILE1878 = 1878, - RRTILE1938 = 1938, - RRTILE1939 = 1939, - RRTILE1942 = 1942, - RRTILE1944 = 1944, - RRTILE1945 = 1945, - RRTILE1947 = 1947, - RRTILE1951 = 1951, - RRTILE1952 = 1952, - RRTILE1953 = 1953, - RRTILE1961 = 1961, - RRTILE1964 = 1964, - RRTILE1973 = 1973, - RRTILE1985 = 1985, - RRTILE1986 = 1986, - RRTILE1987 = 1987, - RRTILE1988 = 1988, - RRTILE1990 = 1990, - RRTILE1995 = 1995, - RRTILE1996 = 1996, - RRTILE2004 = 2004, - RRTILE2005 = 2005, - POPCORN = 2021, - RRTILE2022 = 2022, - LANEPICS = 2023, - RRTILE2025 = 2025, - RRTILE2026 = 2026, - RRTILE2027 = 2027, - RRTILE2028 = 2028, - RRTILE2034 = 2034, - RRTILE2050 = 2050, - RRTILE2052 = 2052, - RRTILE2053 = 2053, - RRTILE2056 = 2056, - RRTILE2060 = 2060, - RRTILE2072 = 2072, - RRTILE2074 = 2074, - RRTILE2075 = 2075, - RRTILE2083 = 2083, - COOLEXPLOSION1 = 2095, - RRTILE2097 = 2097, - RRTILE2121 = 2121, - RRTILE2122 = 2122, - RRTILE2123 = 2123, - RRTILE2124 = 2124, - RRTILE2125 = 2125, - RRTILE2126 = 2126, - RRTILE2137 = 2137, - RRTILE2132 = 2132, - RRTILE2136 = 2136, - RRTILE2139 = 2139, - RRTILE2150 = 2150, - RRTILE2151 = 2151, - RRTILE2152 = 2152, - RRTILE2156 = 2156, - RRTILE2157 = 2157, - RRTILE2158 = 2158, - RRTILE2159 = 2159, - RRTILE2160 = 2160, - RRTILE2161 = 2161, - RRTILE2175 = 2175, - RRTILE2176 = 2176, - RRTILE2178 = 2178, - RRTILE2186 = 2186, - RRTILE2214 = 2214, - WAITTOBESEATED = 2215, - OJ = 2217, - HURTRAIL = 2221, - POWERSWITCH1 = 2222, - LOCKSWITCH1 = 2224, - POWERSWITCH2 = 2226, - ATM = 2229, - STATUEFLASH = 2231, - ATMBROKE = 2233, - FEMPIC5 = 2235, - FEMPIC6 = 2236, - FEMPIC7 = 2237, - REACTOR = 2239, - REACTORSPARK = 2243, - REACTORBURNT = 2247, - HANDSWITCH = 2249, - CIRCLEPANNEL = 2251, - CIRCLEPANNELBROKE = 2252, - PULLSWITCH = 2254, - ALIENSWITCH = 2259, - DOORTILE21 = 2261, - DOORTILE17 = 2263, - MASKWALL7 = 2264, - JAILBARBREAK = 2265, - DOORTILE11 = 2267, - DOORTILE12 = 2268, - EXPLOSION2BOT = 2272, - RRTILE2319 = 2319, - RRTILE2321 = 2321, - RRTILE2326 = 2326, - RRTILE2329 = 2329, - RRTILE2357 = 2357, - RRTILE2382 = 2382, - RRTILE2430 = 2430, - RRTILE2431 = 2431, - RRTILE2432 = 2432, - RRTILE2437 = 2437, - RRTILE2443 = 2443, - RRTILE2445 = 2445, - RRTILE2446 = 2446, - RRTILE2450 = 2450, - RRTILE2451 = 2451, - RRTILE2455 = 2455, - RRTILE2460 = 2460, - RRTILE2465 = 2465, - BONUSSCREEN = 2510, - VIEWBORDER = 2520, - VICTORY1 = 2530, - ORDERING = 2531, - TEXTSTORY = 2541, - LOADSCREEN = 2542, - RRTILE2560 = 2560, - RRTILE2562 = 2562, - RRTILE2564 = 2564, - RRTILE2573 = 2573, - RRTILE2574 = 2574, - RRTILE2577 = 2577, - RRTILE2578 = 2578, - RRTILE2581 = 2581, - RRTILE2583 = 2583, - RRTILE2604 = 2604, - RRTILE2610 = 2610, - RRTILE2613 = 2613, - RRTILE2621 = 2621, - RRTILE2622 = 2622, - RRTILE2636 = 2636, - RRTILE2637 = 2637, - RRTILE2654 = 2654, - RRTILE2656 = 2656, - RRTILE2676 = 2676, - RRTILE2689 = 2689, - RRTILE2697 = 2697, - RRTILE2702 = 2702, - RRTILE2707 = 2707, - RRTILE2732 = 2732, - HATRACK = 2717, - DESKLAMP = 2719, - COFFEEMACHINE = 2721, - CUPS = 2722, - GAVALS = 2723, - GAVALS2 = 2724, - POLICELIGHTPOLE = 2726, - FLOORBASKET = 2728, - PUKE = 2729, - DOORTILE23 = 2731, - TOPSECRET = 2733, - SPEAKER = 2734, - TEDDYBEAR = 2735, - ROBOTDOG = 2737, - ROBOTPIRATE = 2739, - ROBOTMOUSE = 2740, - MAIL = 2741, - MAILBAG = 2742, - HOTMEAT = 2744, - COFFEEMUG = 2745, - DONUTS2 = 2746, - TRIPODCAMERA = 2747, - METER = 2748, - DESKPHONE = 2749, - GUMBALLMACHINE = 2750, - GUMBALLMACHINEBROKE = 2751, - PAPER = 2752, - MACE = 2753, - GENERICPOLE2 = 2754, - XXXSTACY = 2755, - WETFLOOR = 2756, - BROOM = 2757, - MOP = 2758, - PIRATE1A = 2759, - PIRATE4A = 2760, - PIRATE2A = 2761, - PIRATE5A = 2762, - PIRATE3A = 2763, - PIRATE6A = 2764, - PIRATEHALF = 2765, - CHESTOFGOLD = 2767, - SIDEBOLT1 = 2768, - FOODOBJECT1 = 2773, - FOODOBJECT2 = 2774, - FOODOBJECT3 = 2775, - FOODOBJECT4 = 2776, - FOODOBJECT5 = 2777, - FOODOBJECT6 = 2778, - FOODOBJECT7 = 2779, - FOODOBJECT8 = 2780, - FOODOBJECT9 = 2781, - FOODOBJECT10 = 2782, - FOODOBJECT11 = 2783, - FOODOBJECT12 = 2784, - FOODOBJECT13 = 2785, - FOODOBJECT14 = 2786, - FOODOBJECT15 = 2787, - FOODOBJECT16 = 2788, - FOODOBJECT17 = 2789, - FOODOBJECT18 = 2790, - FOODOBJECT19 = 2791, - FOODOBJECT20 = 2792, - HEADLAMP = 2793, - SKINNEDCHICKEN = 2794, - FEATHEREDCHICKEN = 2795, - TAMPON = 2796, - ROBOTDOG2 = 2797, - JOLLYMEAL = 2800, - DUKEBURGER = 2801, - SHOPPINGCART = 2806, - CANWITHSOMETHING2 = 2807, - CANWITHSOMETHING3 = 2808, - CANWITHSOMETHING4 = 2809, - RRTILE2030 = 2030, - RRTILE2831 = 2831, - RRTILE2832 = 2832, - RRTILE2842 = 2842, - RRTILE2859 = 2859, - RRTILE2876 = 2876, - RRTILE2878 = 2878, - RRTILE2879 = 2879, - RRTILE2893 = 2893, - RRTILE2894 = 2894, - RRTILE2898 = 2898, - RRTILE2899 = 2899, - RRTILE2915 = 2915, - RRTILE2940 = 2940, - RRTILE2944 = 2944, - RRTILE2945 = 2945, - RRTILE2946 = 2946, - RRTILE2947 = 2947, - RRTILE2948 = 2948, - RRTILE2949 = 2949, - RRTILE2961 = 2961, - RRTILE2970 = 2970, - RRTILE2977 = 2977, - RRTILE2978 = 2978, - GLASS3 = 2983, - BORNTOBEWILDSCREEN = 2985, - BLIMP = 2989, - RRTILE2990 = 2990, - FEM9 = 2991, - POOP = 2998, - FRAMEEFFECT1 = 2999, - PANNEL1 = 3003, - PANNEL2 = 3004, - PANNEL3 = 3005, - BPANNEL1 = 3006, - BPANNEL3 = 3007, - SCREENBREAK14 = 3008, - SCREENBREAK15 = 3009, - SCREENBREAK19 = 3011, - SCREENBREAK16 = 3013, - SCREENBREAK17 = 3014, - SCREENBREAK18 = 3015, - W_TECHWALL11 = 3016, - W_TECHWALL12 = 3017, - W_TECHWALL13 = 3018, - W_TECHWALL14 = 3019, - W_TECHWALL5 = 3020, - W_TECHWALL6 = 3022, - W_TECHWALL7 = 3024, - W_TECHWALL8 = 3026, - W_TECHWALL9 = 3028, - W_HITTECHWALL16 = 3030, - W_HITTECHWALL10 = 3031, - W_HITTECHWALL15 = 3033, - W_MILKSHELF = 3035, - W_MILKSHELFBROKE = 3036, - PURPLELAVA = 3038, - LAVABUBBLE = 3040, - DUKECUTOUT = 3047, - TARGET = 3049, - GUNPOWDERBARREL = 3050, - DUCK = 3051, - HYDROPLANT = 3053, - OCEANSPRITE1 = 3055, - OCEANSPRITE2 = 3056, - OCEANSPRITE3 = 3057, - OCEANSPRITE4 = 3058, - OCEANSPRITE5 = 3059, - GENERICPOLE = 3061, - CONE = 3062, - HANGLIGHT = 3063, - RRTILE3073 = 3073, - RRTILE3083 = 3083, - RRTILE3100 = 3100, - RRTILE3114 = 3114, - RRTILE3115 = 3115, - RRTILE3116 = 3116, - RRTILE3117 = 3117, - RRTILE3120 = 3120, - RRTILE3121 = 3121, - RRTILE3122 = 3122, - RRTILE3123 = 3123, - RRTILE3124 = 3124, - RRTILE3132 = 3132, - RRTILE3139 = 3139, - RRTILE3144 = 3144, - RRTILE3152 = 3152, - RRTILE3153 = 3153, - RRTILE3155 = 3155, - RRTILE3171 = 3171, - RRTILE3172 = 3172, - RRTILE3190 = 3190, - RRTILE3191 = 3191, - RRTILE3192 = 3192, - RRTILE3195 = 3195, - RRTILE3200 = 3200, - RRTILE3201 = 3201, - RRTILE3202 = 3202, - RRTILE3203 = 3203, - RRTILE3204 = 3204, - RRTILE3205 = 3205, - RRTILE3206 = 3206, - RRTILE3207 = 3207, - RRTILE3208 = 3208, - RRTILE3209 = 3209, - RRTILE3216 = 3216, - RRTILE3218 = 3218, - RRTILE3219 = 3219, - RRTILE3232 = 3232, - FEMPIC1 = 3239, - FEMPIC2 = 3248, - BLANKSCREEN = 3252, - PODFEM1 = 3253, - FEMPIC3 = 3257, - FEMPIC4 = 3265, - FEM1 = 3271, - FEM2 = 3276, - FEM3 = 3280, - FEM5 = 3282, - BLOODYPOLE = 3283, - FEM4 = 3284, - FEM6 = 3293, - FEM6PAD = 3294, - FEM8 = 3295, - FEM7 = 3298, - ORGANTIC = 3308, - FIRSTGUN = 3328, - FIRSTGUNRELOAD = 3336, - KNEE = 3340, - SHOTGUN = 3350, - HANDTHROW = 3360, - SHOTGUNSHELLS = 3372, - SCUBAMASK = 3374, - CHAINGUN = 3380, - SHRINKER = 3384, - CIRCLESTUCK = 3388, - SPIT = 3390, - GROWSPARK = 3395, - SHRINKSPARK = 3400, - RRTILE3410 = 3410, - LUMBERBLADE = 3411, - FREEZE = 3415, - FIRELASER = 3420, - BOWLINGBALLH = 3428, - BOWLINGBALL = 3430, - BOWLINGBALLSPRITE = 3437, - POWDERH = 3438, - RRTILE3440 = 3440, - DEVISTATOR = 3445, - RPGGUN = 3452, - RRTILE3462 = 3462, - OWHIP = 3471, - UWHIP = 3475, - RPGGUN2 = 3482, - RRTILE3497 = 3497, - RRTILE3498 = 3498, - RRTILE3499 = 3499, - RRTILE3500 = 3500, - SLINGBLADE = 3510, - RRTILE3584 = 3584, - RRTILE3586 = 3586, - RRTILE3587 = 3587, - RRTILE3600 = 3600, - RRTILE3631 = 3631, - RRTILE3635 = 3635, - RRTILE3637 = 3637, - RRTILE3643 = 3643, - RRTILE3647 = 3647, - RRTILE3652 = 3652, - RRTILE3653 = 3653, - RRTILE3668 = 3668, - RRTILE3671 = 3671, - RRTILE3673 = 3673, - RRTILE3684 = 3684, - RRTILE3708 = 3708, - RRTILE3714 = 3714, - RRTILE3716 = 3716, - RRTILE3720 = 3720, - RRTILE3723 = 3723, - RRTILE3725 = 3725, - RRTILE3737 = 3737, - RRTILE3754 = 3754, - RRTILE3762 = 3762, - RRTILE3763 = 3763, - RRTILE3764 = 3764, - RRTILE3765 = 3765, - RRTILE3767 = 3767, - RRTILE3773 = 3773, - RRTILE3774 = 3774, - RRTILE3793 = 3793, - RRTILE3795 = 3795, - RRTILE3804 = 3804, - RRTILE3814 = 3814, - RRTILE3815 = 3815, - RRTILE3819 = 3819, - BIGHOLE = 3822, - RRTILE3827 = 3827, - RRTILE3837 = 3837, - APLAYERTOP = 3840, - APLAYER = 3845, - PLAYERONWATER = 3860, - DUKELYINGDEAD = 3998, - DUKEGUN = 4041, - DUKETORSO = 4046, - DUKELEG = 4055, - FECES = 4802, - DRONE = 4916, - //RRTILE4956 = 4956, - RECON = 4989, - RRTILE5014 = 5014, - RRTILE5016 = 5016, - RRTILE5017 = 5017, - RRTILE5018 = 5018, - RRTILE5019 = 5019, - RRTILE5020 = 5020, - RRTILE5021 = 5021, - RRTILE5022 = 5022, - RRTILE5023 = 5023, - RRTILE5024 = 5024, - RRTILE5025 = 5025, - RRTILE5026 = 5026, - RRTILE5027 = 5027, - RRTILE5029 = 5029, - RRTILE5030 = 5030, - RRTILE5031 = 5031, - RRTILE5032 = 5032, - RRTILE5033 = 5033, - RRTILE5034 = 5034, - RRTILE5035 = 5035, - RRTILE5036 = 5036, - RRTILE5037 = 5037, - RRTILE5038 = 5038, - RRTILE5039 = 5039, - RRTILE5040 = 5040, - RRTILE5041 = 5041, - RRTILE5043 = 5043, - RRTILE5044 = 5044, - RRTILE5045 = 5045, - RRTILE5046 = 5046, - RRTILE5047 = 5047, - RRTILE5048 = 5048, - RRTILE5049 = 5049, - RRTILE5050 = 5050, - RRTILE5051 = 5051, - RRTILE5052 = 5052, - RRTILE5053 = 5053, - RRTILE5054 = 5054, - RRTILE5055 = 5055, - RRTILE5056 = 5056, - RRTILE5057 = 5057, - RRTILE5058 = 5058, - RRTILE5059 = 5059, - RRTILE5061 = 5061, - RRTILE5062 = 5062, - RRTILE5063 = 5063, - RRTILE5064 = 5064, - RRTILE5065 = 5065, - RRTILE5066 = 5066, - RRTILE5067 = 5067, - RRTILE5068 = 5068, - RRTILE5069 = 5069, - RRTILE5070 = 5070, - RRTILE5071 = 5071, - RRTILE5072 = 5072, - RRTILE5073 = 5073, - RRTILE5074 = 5074, - RRTILE5075 = 5075, - RRTILE5076 = 5076, - RRTILE5077 = 5077, - RRTILE5078 = 5078, - RRTILE5079 = 5079, - RRTILE5080 = 5080, - RRTILE5081 = 5081, - RRTILE5082 = 5082, - RRTILE5083 = 5083, - RRTILE5084 = 5084, - RRTILE5085 = 5085, - RRTILE5086 = 5086, - RRTILE5087 = 5087, - RRTILE5088 = 5088, - RRTILE5090 = 5090, - SHARK = 5501, - FEM10 = 5581, - TOUGHGAL = 5583, - MAN = 5588, - MAN2 = 5589, - WOMAN = 5591, - ATOMICHEALTH = 5595, - RRTILE6144 = 6144, - MOTOGUN = 7168, - RRTILE7169 = 7169, - MOTOHIT = 7170, - BOATHIT = 7175, - RRTILE7184 = 7184, - RRTILE7190 = 7190, - RRTILE7191 = 7191, - RRTILE7213 = 7213, - RRTILE7219 = 7219, - EMPTYBIKE = 7220, - EMPTYBOAT = 7233, - RRTILE7424 = 7424, - RRTILE7430 = 7430, - RRTILE7433 = 7433, - RRTILE7441 = 7441, - RRTILE7547 = 7547, - RRTILE7467 = 7467, - RRTILE7469 = 7469, - RRTILE7470 = 7470, - RRTILE7475 = 7475, - RRTILE7478 = 7478, - RRTILE7505 = 7505, - RRTILE7506 = 7506, - RRTILE7534 = 7534, - RRTILE7540 = 7540, - RRTILE7533 = 7533, - RRTILE7545 = 7545, - RRTILE7552 = 7552, - RRTILE7553 = 7553, - RRTILE7554 = 7554, - RRTILE7555 = 7555, - RRTILE7557 = 7557, - RRTILE7558 = 7558, - RRTILE7559 = 7559, - RRTILE7561 = 7561, - RRTILE7566 = 7566, - RRTILE7568 = 7568, - RRTILE7574 = 7574, - RRTILE7575 = 7575, - RRTILE7576 = 7576, - RRTILE7578 = 7578, - RRTILE7579 = 7579, - RRTILE7580 = 7580, - RRTILE7595 = 7595, - RRTILE7629 = 7629, - RRTILE7636 = 7636, - RRTILE7638 = 7638, - RRTILE7640 = 7640, - RRTILE7644 = 7644, - RRTILE7646 = 7646, - RRTILE7648 = 7648, - RRTILE7650 = 7650, - RRTILE7653 = 7653, - RRTILE7655 = 7655, - RRTILE7657 = 7657, - RRTILE7659 = 7659, - RRTILE7691 = 7691, - RRTILE7694 = 7694, - RRTILE7696 = 7696, - RRTILE7697 = 7697, - RRTILE7700 = 7700, - RRTILE7702 = 7702, - RRTILE7704 = 7704, - RRTILE7705 = 7705, - RRTILE7711 = 7711, - RRTILE7716 = 7716, - RRTILE7756 = 7756, - RRTILE7768 = 7768, - RRTILE7806 = 7806, - RRTILE7820 = 7820, - RRTILE7859 = 7859, - RRTILE7870 = 7870, - RRTILE7873 = 7873, - RRTILE7875 = 7875, - RRTILE7876 = 7876, - RRTILE7879 = 7879, - RRTILE7881 = 7881, - RRTILE7883 = 7883, - RRTILE7885 = 7885, - RRTILE7886 = 7886, - RRTILE7887 = 7887, - RRTILE7888 = 7888, - RRTILE7889 = 7889, - RRTILE7890 = 7890, - RRTILE7900 = 7900, - RRTILE7901 = 7901, - RRTILE7906 = 7906, - RRTILE7912 = 7912, - RRTILE7913 = 7913, - RRTILE7936 = 7936, - RRTILE8047 = 8047, - MULTISWITCH2 = 8048, - RRTILE8059 = 8059, - RRTILE8060 = 8060, - RRTILE8063 = 8063, - RRTILE8067 = 8067, - RRTILE8076 = 8076, - RRTILE8094 = 8094, - RRTILE8096 = 8096, - RRTILE8099 = 8099, - RRTILE8106 = 8106, - RRTILE8162 = 8162, - RRTILE8163 = 8163, - RRTILE8164 = 8164, - RRTILE8165 = 8165, - RRTILE8166 = 8166, - RRTILE8167 = 8167, - RRTILE8168 = 8168, - RRTILE8192 = 8192, - RRTILE8193 = 8193, - RRTILE8215 = 8215, - RRTILE8216 = 8216, - RRTILE8217 = 8217, - RRTILE8218 = 8218, - RRTILE8220 = 8220, - RRTILE8221 = 8221, - RRTILE8222 = 8222, - RRTILE8223 = 8223, - RRTILE8224 = 8224, - RRTILE8227 = 8227, - RRTILE8312 = 8312, - RRTILE8370 = 8370, - RRTILE8371 = 8371, - RRTILE8372 = 8372, - RRTILE8373 = 8373, - RRTILE8379 = 8379, - RRTILE8380 = 8380, - RRTILE8385 = 8385, - RRTILE8386 = 8386, - RRTILE8387 = 8387, - RRTILE8388 = 8388, - RRTILE8389 = 8389, - RRTILE8390 = 8390, - RRTILE8391 = 8391, - RRTILE8392 = 8392, - RRTILE8394 = 8394, - RRTILE8395 = 8395, - RRTILE8396 = 8396, - RRTILE8397 = 8397, - RRTILE8398 = 8398, - RRTILE8399 = 8399, - RRTILE8423 = 8423, - RRTILE8448 = 8448, - RRTILE8450 = 8450, - BOATAMMO = 8460, - RRTILE8461 = 8461, - RRTILE8462 = 8462, - RRTILE8464 = 8464, - RRTILE8475 = 8475, - RRTILE8487 = 8487, - RRTILE8488 = 8488, - RRTILE8489 = 8489, - RRTILE8490 = 8490, - RRTILE8496 = 8496, - RRTILE8497 = 8497, - RRTILE8498 = 8498, - RRTILE8499 = 8499, - RRTILE8503 = 8503, - RRTILE8525 = 8525, - RRTILE8537 = 8537, - RRTILE8565 = 8565, - RRTILE8567 = 8567, - RRTILE8568 = 8568, - RRTILE8569 = 8569, - RRTILE8570 = 8570, - RRTILE8571 = 8571, - RRTILE8579 = 8579, - RRTILE8588 = 8588, - RRTILE8589 = 8589, - RRTILE8590 = 8590, - RRTILE8591 = 8591, - RRTILE8592 = 8592, - RRTILE8593 = 8593, - RRTILE8594 = 8594, - RRTILE8595 = 8595, - RRTILE8596 = 8596, - RRTILE8598 = 8598, - RRTILE8605 = 8605, - RRTILE8608 = 8608, - RRTILE8609 = 8609, - RRTILE8611 = 8611, - RRTILE8617 = 8617, - RRTILE8618 = 8618, - RRTILE8620 = 8620, - RRTILE8621 = 8621, - RRTILE8622 = 8622, - RRTILE8623 = 8623, - RRTILE8640 = 8640, - RRTILE8651 = 8651, - RRTILE8660 = 8660, - RRTILE8677 = 8677, - RRTILE8679 = 8679, - RRTILE8680 = 8680, - RRTILE8681 = 8681, - RRTILE8682 = 8682, - RRTILE8683 = 8683, - RRTILE8704 = 8704, - // = RR = bad = guys, - BOSS1 = 4477, - BOSS2 = 4557, - BOSS3 = 4607, - BOSS4 = 4221, - - BOULDER = 256, - BOULDER1 = 264, - TORNADO = 1930, - CHEERBOMB = 3464, - CHEERBLADE = 3460, - DOGATTACK = 4060, - BILLYWALK = 4096, - BILLYDIE = 4137, - BILLYCOCK = 4147, - BILLYRAY = 4162, - BILLYRAYSTAYPUT = 4163, - BILLYBUT = 4188, - BILLYSCRATCH = 4191, - BILLYSNIFF = 4195, - BILLYWOUND = 4202, - BILLYGORE = 4228, - BILLYJIBA = 4235, - BILLYJIBB = 4244, - BRAYSNIPER = 4249, - DOGRUN = 4260, - DOGDIE = 4295, - DOGDEAD = 4303, - DOGBARK = 4305, - LTH = 4352, - LTHSTRAFE = 4395, - HULKHANG = 4409, - HULKHANGDEAD = 4410, - HULKJUMP = 4429, - LTHLOAD = 4430, - LTHDIE = 4456, - BUBBASCRATCH = 4464, - BUBBANOSE = 4476, - BUBBAPISS = 4487, - BUBBASTAND = 4504, - BUBBAOUCH = 4506, - BUBBADIE = 4513, - BUBBADEAD = 4523, - HULK = 4649, - HULKSTAYPUT = 4650, - HULKA = 4651, - HULKB = 4652, - HULKC = 4653, - HULKJIBA = 4748, - HULKJIBB = 4753, - HULKJIBC = 4758, - SBSWIPE = 4770, - SBPAIN = 4810, - SBDIE = 4820, - HEN = 4861, - HENSTAYPUT = 4862, - HENSTAND = 4897, - PIG = 4945, - PIGSTAYPUT = 4946, - PIGEAT = 4983, - SBMOVE = 5015, - SBSPIT = 5050, - SBDIP = 5085, - MINION = 5120, - MINIONSTAYPUT = 5121, - UFO1_RR = 5260, - UFO1_RRRA = 5270, - UFO2 = 5274, - UFO3 = 5278, - UFO4 = 5282, - UFO5 = 5286, - MINJIBA = 5290, - MINJIBB = 5295, - MINJIBC = 5300, - COW = 5317, - COOT = 5376, - COOTSTAYPUT = 5377, - COOTSHOOT = 5411, - COOTDIE = 5437, - COOTDUCK = 5481, - COOTPAIN = 5548, - COOTTRANS = 5568, - COOTGETUP = 5579, - COOTJIBA = 5602, - COOTJIBB = 5607, - COOTJIBC = 5616, - VIXEN = 5635, - VIXENPAIN = 5675, - VIXENDIE = 5710, - VIXENSHOOT = 5720, - VIXENWDN = 5740, - VIXENWUP = 5775, - VIXENKICK = 5805, - VIXENTELE = 5845, - VIXENTEAT = 5851, - BIKEJIBA = 5872, - BIKEJIBB = 5877, - BIKEJIBC = 5882, - BIKERB = 5890, - BIKERBV2 = 5891, - BIKER = 5995, - BIKERJIBA = 6112, - BIKERJIBB = 6117, - BIKERJIBC = 6121, - BIKERJIBD = 6127, - MAKEOUT = 6225, - CHEERB = 6401, - CHEER = 6658, - CHEERSTAYPUT = 6659, - CHEERJIBA = 7000, - CHEERJIBB = 7005, - CHEERJIBC = 7010, - CHEERJIBD = 7015, - FBOATJIBA = 7020, - FBOATJIBB = 7025, - COOTPLAY = 7030, - BILLYPLAY = 7035, - MINIONBOAT = 7192, - HULKBOAT = 7199, - CHEERBOAT = 7206, - RRTILE7274 = 7274, - RABBIT = 7280, - RABBITJIBA = 7387, - RABBITJIBB = 7392, - RABBITJIBC = 7397, - ROCK = 8035, - ROCK2 = 8036, - LEVELMAP = 8624, - MAMACLOUD = 8663, - MAMA = 8705, - MAMAJIBA = 8890, - MAMAJIBB = 8895, + #include "namelist_r.h" }; +#undef x +#undef y + END_DUKE_NS diff --git a/source/games/duke/src/sbar_r.cpp b/source/games/duke/src/sbar_r.cpp index 7c8453d60..945267b52 100644 --- a/source/games/duke/src/sbar_r.cpp +++ b/source/games/duke/src/sbar_r.cpp @@ -57,7 +57,7 @@ public: // optionally draw at the top of the screen. SetSize(tilesiz[BOTTOMSTATUSBAR].y); scale = 0.5; - ammo_sprites = { -1, AMMO, SHOTGUNAMMO, BATTERYAMMO, HBOMBAMMO, HBOMBAMMO, RRTILE43, DEVISTATORAMMO, TRIPBOMBSPRITE, GROWSPRITEICON, HBOMBAMMO, -1, BOWLINGBALLSPRITE, MOTOAMMO, BOATAMMO, -1, RPG2SPRITE }; + ammo_sprites = { -1, AMMO, SHOTGUNAMMO, BATTERYAMMO, HBOMBAMMO, HBOMBAMMO, SAWAMMO, DEVISTATORAMMO, TRIPBOMBSPRITE, GROWSPRITEICON, HBOMBAMMO, -1, BOWLINGBALLSPRITE, MOTOAMMO, BOATAMMO, -1, RPG2SPRITE }; item_icons = { 0, FIRSTAID_ICON, STEROIDS_ICON, HOLODUKE_ICON, JETPACK_ICON, HEAT_ICON, AIRTANK_ICON, BOOT_ICON }; } @@ -102,7 +102,7 @@ public: // // Health // - img = tileGetTexture(SPINNINGNUKEICON+1); + img = tileGetTexture(SPINNINGNUKEICON1); imgScale = baseScale / img->GetDisplayHeight(); DrawGraphic(img, 2, -2, DI_ITEM_LEFT_BOTTOM, 1, 0, 0, imgScale, imgScale); diff --git a/source/games/duke/src/sectors.cpp b/source/games/duke/src/sectors.cpp index 801ceeee7..f4de87abc 100644 --- a/source/games/duke/src/sectors.cpp +++ b/source/games/duke/src/sectors.cpp @@ -75,7 +75,6 @@ int callsound(int sn, int whatsprite) hittype[i].temp_data[0] = 0; } - if (hittype[i].temp_data[0] == 0) { if ((flags & (SF_GLOBAL | SF_DTAG)) != SF_GLOBAL) @@ -92,7 +91,7 @@ int callsound(int sn, int whatsprite) hittype[i].temp_data[0] = 1; } } - else if (hival) + else if (sprite[i].hitag < 1000) { if ((flags & SF_LOOP) || (sprite[i].hitag && sprite[i].hitag != sprite[i].lotag)) S_StopSound(sprite[i].lotag, hittype[i].temp_data[5]); diff --git a/source/games/duke/src/sounds.cpp b/source/games/duke/src/sounds.cpp index 986c7bc2e..c61dc6026 100644 --- a/source/games/duke/src/sounds.cpp +++ b/source/games/duke/src/sounds.cpp @@ -185,10 +185,6 @@ int S_DefineSound(unsigned index, const char *filename, int minpitch, int maxpit if (index >= S_sfx.Size()) { S_sfx.Resize(index + 1); - for (; oldindex <= index; oldindex++) - { - S_sfx[oldindex].Clear(); - } } auto sfx = &S_sfx[index]; bool alreadydefined = !sfx->bTentative; @@ -412,6 +408,10 @@ void GameInterface::UpdateSounds(void) int S_PlaySound3D(int sndnum, int spriteNum, const vec3_t* pos, int channel, EChanFlags flags) { + if (sndnum == GENERIC_AMBIENCE1 || sndnum == DUMPSTER_MOVE) + { + int a = 0; + } auto const pl = &ps[myconnectindex]; if (!soundEngine->isValidSoundId(sndnum+1) || !SoundEnabled() || (unsigned)spriteNum >= MAXSPRITES || !playrunning() || (pl->timebeforeexit > 0 && pl->timebeforeexit <= REALGAMETICSPERSEC * 3)) return -1; diff --git a/source/games/duke/src/spawn_r.cpp b/source/games/duke/src/spawn_r.cpp index a1a4aaf8b..691dc27b9 100644 --- a/source/games/duke/src/spawn_r.cpp +++ b/source/games/duke/src/spawn_r.cpp @@ -1142,7 +1142,7 @@ int spawn_r(int j, int pn) case FIRSTAID: case SIXPAK: - case RRTILE43: + case SAWAMMO: case BOWLINGBALLSPRITE: if (j >= 0) { @@ -1289,7 +1289,7 @@ int spawn_r(int j, int pn) sp->xrepeat = 18; sp->yrepeat = 17; break; - case RRTILE43: + case SAWAMMO: sp->xrepeat = 12; sp->yrepeat = 7; break; diff --git a/source/glbackend/gl_texture.cpp b/source/glbackend/gl_texture.cpp index 399b2d3b4..726ba236e 100644 --- a/source/glbackend/gl_texture.cpp +++ b/source/glbackend/gl_texture.cpp @@ -70,11 +70,6 @@ bool GLInstance::SetTexture(int picnum, FGameTexture* tex, int paletteid, int sa if (!PickTexture(picnum, tex, paletteid, texpick)) return false; int TextureType = (texpick.translation & 0x80000000) ? TT_INDEXED : TT_TRUECOLOR; - if (TextureType == TT_INDEXED) - { - sampler = sampler + CLAMP_NOFILTER - CLAMP_NONE; - } - // This is intentionally the same value for both parameters. The shader does not use the same uniform for modulation and overlay colors. SetTinting(texpick.tintFlags, texpick.tintColor, texpick.tintColor); diff --git a/source/sw/src/d_menu.cpp b/source/sw/src/d_menu.cpp index cacf40f9a..84ec2c6e6 100644 --- a/source/sw/src/d_menu.cpp +++ b/source/sw/src/d_menu.cpp @@ -43,11 +43,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "network.h" #include "misc.h" -#include "menu.h" +#include "razemenu.h" #include "raze_sound.h" #include "sounds.h" #include "gamestate.h" #include "raze_music.h" +#include "v_draw.h" +#include "vm.h" #include "../../glbackend/glbackend.h" @@ -62,90 +64,6 @@ BEGIN_SW_NS // //---------------------------------------------------------------------------- -class SWMainMenu : public DListMenu -{ - void Ticker() override - { - // Dynamically enable and disable the save option - for (unsigned e = 0; e < mDesc->mItems.Size(); ++e) - { - auto entry = mDesc->mItems[e]; - if (entry->GetAction(nullptr) == NAME_Savegamemenu) - { - entry->mEnabled = gi->CanSave(); - } - } - } - - void PreDraw() override - { - DrawTexture(twod, tileGetTexture(pic_shadow_warrior), 160, 15, DTA_FullscreenScale, FSMode_Fit320x200, - DTA_CenterOffsetRel, true, DTA_Color, 0xfff0f0f0, TAG_DONE); - } -}; - -static bool DidOrderSound; -static int zero = 0; -class SWOrderMenu : public DImageScrollerMenu -{ -public: - SWOrderMenu() - { - if (SW_SHAREWARE && !DidOrderSound) - { - DidOrderSound = true; - int choose_snd = STD_RANDOM_RANGE(1000); - if (choose_snd > 500) - PlaySound(DIGI_WANGORDER1, v3df_dontpan, CHAN_BODY, CHANF_UI); - else - PlaySound(DIGI_WANGORDER2, v3df_dontpan, CHAN_BODY, CHANF_UI); - } - } -}; - -//---------------------------------------------------------------------------- -// -// Menu related game interface functions -// -//---------------------------------------------------------------------------- - -void GameInterface::DrawNativeMenuText(int fontnum, int state, double xpos, double ypos, float fontscale, const char* text, int flags) -{ - switch (fontnum) - { - case NIT_BigFont: - if (flags & LMF_Centered) xpos -= BigFont->StringWidth(text) * 0.5; - DrawText(twod, BigFont, CR_UNDEFINED, xpos, ypos, text, DTA_FullscreenScale, FSMode_Fit320x200, DTA_Color, state == NIT_InactiveState? 0xff505050 : 0xffffffff, TAG_DONE); - break; - - case NIT_SmallFont: - default: - MNU_DrawString(short(xpos), short(ypos), text, state == NIT_InactiveState? 20 : 0, 16, (flags & LMF_Centered) ? 0 : -1); - break; - } - if (state == NIT_SelectedState) - { - int x = int(xpos), y = int(ypos); - int scale = 65536; - short w,h; - - if (text) - { - scale /= 2; - x -= mulscale17(tilesiz[pic_yinyang].x,scale) + 2; - y += 4; - } - else - { - scale -= (1<<13); - x -= ((tilesiz[pic_yinyang].x) / 2) - 3; - y += 8; - } - DrawTexture(twod, tileGetTexture(pic_yinyang, true), x, y, DTA_FullscreenScale, FSMode_Fit320x200, - DTA_CenterOffset, true, DTA_Color, 0xfff0f0f0, DTA_ScaleX, scale / 65536., DTA_ScaleY, scale / 65536., TAG_DONE); - } -} - void GameInterface::QuitToTitle() { Mus_Stop(); @@ -153,10 +71,6 @@ void GameInterface::QuitToTitle() } -void GameInterface::MenuOpened() -{ -} - void GameInterface::MenuSound(EMenuSounds snd) { switch (snd) @@ -180,10 +94,6 @@ void GameInterface::MenuSound(EMenuSounds snd) } } -void GameInterface::MenuClosed() -{ -} - bool GameInterface::CanSave() { return (gamestate == GS_LEVEL && !CommEnabled && numplayers ==1 && /*!DemoMode &&*/ !TEST(Player[myconnectindex].Flags, PF_DEAD)); @@ -200,7 +110,7 @@ bool GameInterface::StartGame(FNewGameStartup& gs) { if (g_gameType & GAMEFLAG_SHAREWARE) { - M_StartMessage(GStrings("BUYSW"), 1, -1); + M_StartMessage(GStrings("BUYSW"), 1, NAME_None); return false; } map = FindMapByLevelNum(5); @@ -216,13 +126,13 @@ bool GameInterface::StartGame(FNewGameStartup& gs) if (!netgame) { - if (Skill == 0) + if (gs.Skill == 0) PlaySound(DIGI_TAUNTAI3, v3df_none, CHAN_VOICE, CHANF_UI); - else if (Skill == 1) + else if (gs.Skill == 1) PlaySound(DIGI_NOFEAR, v3df_none, CHAN_VOICE, CHANF_UI); - else if (Skill == 2) + else if (gs.Skill == 2) PlaySound(DIGI_WHOWANTSWANG, v3df_none, CHAN_VOICE, CHANF_UI); - else if (Skill == 3) + else if (gs.Skill == 3) PlaySound(DIGI_NOPAIN, v3df_none, CHAN_VOICE, CHANF_UI); while (soundEngine->IsSourcePlayingSomething(SOURCE_None, nullptr, CHAN_VOICE)) @@ -242,28 +152,7 @@ FSavegameInfo GameInterface::GetSaveSig() return { SAVESIG_SW, MINSAVEVER_SW, SAVEVER_SW }; } -void GameInterface::DrawMenuCaption(const DVector2& origin, const char* text) -{ - DrawTexture(twod, tileGetTexture(2427), 10, 2, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_TopLeft, true, DTA_Color, 0xfff0f0f0, TAG_DONE); - DrawText(twod, BigFont, CR_UNDEFINED, 160 - BigFont->StringWidth(text) * 0.5, 5, text, DTA_FullscreenScale, FSMode_Fit320x200Top, TAG_DONE); -} - END_SW_NS -//---------------------------------------------------------------------------- -// -// Class registration -// -//---------------------------------------------------------------------------- - - -static TMenuClassDescriptor _mm("ShadowWarrior.MainMenu"); -static TMenuClassDescriptor _so("ShadowWarrior.OrderMenu"); - -void RegisterSWMenus() -{ - menuClasses.Push(&_mm); - menuClasses.Push(&_so); -} diff --git a/source/sw/src/draw.cpp b/source/sw/src/draw.cpp index 56c526dff..0693b2444 100644 --- a/source/sw/src/draw.cpp +++ b/source/sw/src/draw.cpp @@ -51,9 +51,10 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms #include "interp.h" #include "interpso.h" #include "sector.h" -#include "menu.h" +#include "razemenu.h" #include "v_2ddrawer.h" #include "v_video.h" +#include "v_draw.h" #include "glbackend/glbackend.h" BEGIN_SW_NS diff --git a/source/sw/src/game.cpp b/source/sw/src/game.cpp index 195912890..e90e16148 100644 --- a/source/sw/src/game.cpp +++ b/source/sw/src/game.cpp @@ -44,6 +44,7 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms #include "pal.h" #include "automap.h" #include "statusbar.h" +#include "texturemanager.h" #include "mytypes.h" @@ -64,7 +65,7 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms #include "printf.h" #include "m_argv.h" #include "debugbreak.h" -#include "menu.h" +#include "razemenu.h" #include "raze_music.h" #include "statistics.h" #include "gstrings.h" @@ -77,6 +78,7 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms #include "inputstate.h" #include "gamestate.h" #include "d_net.h" +#include "v_draw.h" //#include "crc32.h" @@ -156,6 +158,17 @@ int ThemeTrack[6]; void SybexScreen(void); ///////////////////////////////////////////////////////////////////////////////////////////// +#define x(a, b) registerName(#a, b); +static void SetTileNames() +{ + auto registerName = [](const char* name, int index) + { + TexMan.AddAlias(name, tileGetTexture(index)); + }; +#include "namelist.h" +} +#undef x + //--------------------------------------------------------------------------- // // @@ -227,6 +240,7 @@ void GameInterface::app_init() LoadCustomInfoFromScript("swcustom.txt"); // Load user customisation information LoadDefinitions(); + SetTileNames(); TileFiles.SetBackup(); userConfig.AddDefs.reset(); InitFX(); @@ -559,6 +573,25 @@ void TerminateLevel(void) } +using namespace ShadowWarrior; +static bool DidOrderSound; +static int zero = 0; + +static void PlayOrderSound() +{ + if (!DidOrderSound) + { + DidOrderSound = true; + int choose_snd = STD_RANDOM_RANGE(1000); + if (choose_snd > 500) + PlaySound(DIGI_WANGORDER1, v3df_dontpan, CHAN_BODY, CHANF_UI); + else + PlaySound(DIGI_WANGORDER2, v3df_dontpan, CHAN_BODY, CHANF_UI); + } +} + + + void GameInterface::LevelCompleted(MapRecord *map, int skill) { //ResetPalette(mpp); @@ -573,7 +606,11 @@ void GameInterface::LevelCompleted(MapRecord *map, int skill) STAT_Update(true); FinishAnim = false; PlaySong(nullptr, ThemeSongs[0], ThemeTrack[0]); - if (SW_SHAREWARE) gameaction = ga_creditsmenu; + if (SW_SHAREWARE) + { + PlayOrderSound(); + gameaction = ga_creditsmenu; + } else gameaction = ga_mainmenu; } else gameaction = ga_nextlevel; diff --git a/source/sw/src/game.h b/source/sw/src/game.h index 7638daa19..df7ef09df 100644 --- a/source/sw/src/game.h +++ b/source/sw/src/game.h @@ -2186,16 +2186,12 @@ struct GameInterface : ::GameInterface void FreeGameData() override; void FreeLevelData() override; bool GenerateSavePic() override; - void DrawNativeMenuText(int fontnum, int state, double xpos, double ypos, float fontscale, const char* text, int flags) override; - void MenuOpened() override; void MenuSound(EMenuSounds snd) override; - void MenuClosed() override; bool CanSave() override; bool StartGame(FNewGameStartup& gs) override; FSavegameInfo GetSaveSig() override; - void DrawMenuCaption(const DVector2& origin, const char* text) override; - bool LoadGame(FSaveGameNode* sv) override; - bool SaveGame(FSaveGameNode* sv) override; + bool LoadGame() override; + bool SaveGame() override; void SetAmbience(bool on) override { if (on) StartAmbientSound(); else StopAmbientSound(); } FString GetCoordString() override; ReservedSpace GetReservedScreenSpace(int viewsize) override; diff --git a/source/sw/src/input.cpp b/source/sw/src/input.cpp index de3cef46a..fdd8d2e7f 100644 --- a/source/sw/src/input.cpp +++ b/source/sw/src/input.cpp @@ -29,7 +29,7 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms #include "network.h" #include "gamecontrol.h" #include "player.h" -#include "menu.h" +#include "razemenu.h" BEGIN_SW_NS diff --git a/source/sw/src/jsector.cpp b/source/sw/src/jsector.cpp index 5d123b4d6..a9384c6ed 100644 --- a/source/sw/src/jsector.cpp +++ b/source/sw/src/jsector.cpp @@ -30,6 +30,7 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms #include "build.h" +#include "names.h" #include "names2.h" #include "panel.h" #include "game.h" diff --git a/source/sw/src/menus.h b/source/sw/src/menus.h index 0cd4b00d3..7105d669b 100644 --- a/source/sw/src/menus.h +++ b/source/sw/src/menus.h @@ -35,10 +35,6 @@ BEGIN_SW_NS void MNU_DrawString(int x, int y, const char* string, int shade, int pal, int align = -1); void MNU_DrawSmallString(int x, int y, const char* string, int shade, int pal, int align = -1, double alpha = 1); -#define pic_yinyang 2870 -#define pic_shadow_warrior 2366 - - END_SW_NS #endif diff --git a/source/sw/src/namelist.h b/source/sw/src/namelist.h new file mode 100644 index 000000000..30ffa5fc9 --- /dev/null +++ b/source/sw/src/namelist.h @@ -0,0 +1,170 @@ +x(ALPHABET, 85) +x(MENU_MAIN, 295) +x(MENU_OPTION, 296) +x(MENU_WHICH, 297) +x(MENU_CURSOR, 298) +x(DART1, 2000) +x(DART2, 2001) +x(DART3, 2002) +x(DART4, 2003) +x(DART, 2004) +x(FIRE1, 2005) +x(FIRE2, 2006) +x(FIRE3, 2007) +x(FIRE4, 2008) +x(FIRE5, 2009) +x(FIREBALL1, 2010) +x(FIREBALL2, 2011) +x(FIREBALL3, 2012) +x(FIREBALL4, 2013) +x(FLAMES1, 2014) +x(FLAMES2, 2015) +x(FLAMES3, 2016) +x(FLAMES4, 2017) +x(FLAMES5, 2018) +x(GAS1, 2019) +x(GAS2, 2020) +x(GAS3, 2021) +x(GAS4, 2022) +x(GAS5, 2023) +x(GAS6, 2024) +x(GAS7, 2025) +x(GASCLOUD1, 2026) +x(GASCLOUD2, 2027) +x(GASCLOUD3, 2028) +x(GASCLOUD4, 2029) +x(GASCLOUD5, 2030) +x(GASCLOUD6, 2031) +x(GASCLOUD7, 2032) +x(GASCLOUD8, 2033) +x(GASCLOUD9, 2034) +x(LIGHT1, 2035) +x(LIGHT2, 2036) +x(LIGHT3, 2037) +x(LIGHT4, 2038) +x(LIGHT5, 2039) +x(LIGHT6, 2040) +x(ELECTRO1, 2041) +x(ELECTRO2, 2042) +x(ELECTRO3, 2043) +x(RIFLE1, 2044) +x(RIFLE2, 2045) +x(RIFLE3, 2046) +x(DONTUSE_EXTRA, 2047) +x(RIFLE4, 2048) +x(CARTRIGE3, 2053) +x(STATUE1, 2054) +x(STATUE2, 2055) +x(STATUE3, 2056) +x(STATUE4, 2057) +x(SWORD3, 2065) +x(SWORD4, 2066) +x(SWORD1, 2067) +x(SWORD2, 2068) +x(SWORD5, 2069) +x(BLACK___, 2306) +x(FragBarErase, 2375) +x(FragBarErase2, 2376) +x(MENUBAR, 2427) + +x(MIRROR, 340) +x(FLOORMIRROR, 341) +x(CAMSPRITE, 3830) + + +x(ICON_STAR, 1793) + +x(ICON_UZI, 1797) +x(ICON_UZIFLOOR, 1807) +x(ICON_LG_UZI_AMMO, 1799) + +x(ICON_HEART, 1824) +x(ICON_HEART_LG_AMMO, 1820) + +x(ICON_GUARD_HEAD, 1814) +x(ICON_FIREBALL_LG_AMMO, 3035) + +x(NAPALM_MIN_AMMO, 10) +x(RING_MIN_AMMO, 30) + +x(ICON_ROCKET, 1843) +x(ICON_SHOTGUN, 1794) +x(ICON_LG_ROCKET, 1796) +x(ICON_LG_SHOTSHELL, 1823) +x(ICON_AUTORIOT, 1822) + +x(ICON_MICRO_GUN, 1818) +x(ICON_MICRO_BATTERY, 1800) + +x(ICON_GRENADE_LAUNCHER, 1817) +x(ICON_LG_GRENADE, 1831) + +x(ICON_LG_MINE, 1842) + +x(ICON_RAIL_GUN, 1811) +x(ICON_RAIL_AMMO, 1812) + +//, not, used, now) +x(ICON_SPELL, 1880) +x(ICON_ELECTRO, 1822) + +x(ICON_EXPLOSIVE_BOX, 1801) +x(ICON_ENVIRON_SUIT, 1837) +x(ICON_FLY, 1782) +x(ICON_CLOAK, 1804) +x(ICON_NIGHT_VISION, 3031) +x(ICON_NAPALM, 3046) +x(ICON_RING, 3050) +x(ICON_GOROAMMO, 3035) +x(ICON_HEARTAMMO, 1820) +x(ICON_RINGAMMO, 3054) +x(ICON_NAPALMAMMO, 3058) +x(ICON_GRENADE, 3059) +x(ICON_OXYGEN, 1800) +x(ICON_ARMOR, 3030) +x(ICON_SM_MEDKIT, 1802) +x(ICON_BOOSTER, 1810) +x(ICON_HEAT_CARD, 1819) +x(ICON_REPAIR_KIT, 1813) +x(ICON_MEDKIT, 1803) +x(ICON_CHEMBOMB, 1808) +x(ICON_FLASHBOMB, 1805) +x(ICON_NUKE, 1809) +x(ICON_CALTROPS, 1829) +x(ICON_FLAG, 2520) + +x(COINCURSOR, 2440) +x(STARTALPHANUM, 4608) +x(ENDALPHANUM, 4701) + +x(STATUS_BAR, 2434) +x(STATUS_KEYS, 2881) +x(STATUS_NUMBERS, 2887) +x(BORDER_TILE, 2604) + + +x(BLUE_KEY, 1766) +x(RED_KEY, 1770) +x(GREEN_KEY, 1774) +x(YELLOW_KEY, 1778) +x(GOLD_SKELKEY, 1765) +x(SILVER_SKELKEY, 1769) +x(BRONZE_SKELKEY, 1773) +x(RED_SKELKEY, 1777) +x(BLUE_CARD, 1767) +x(RED_CARD, 1771) +x(GREEN_CARD, 1775) +x(YELLOW_CARD, 1779) + +x(YINYANG, 2870) +x(SHADOW_WARRIOR, 2366) + +x(ADSCREEN1, 5262) +x(ADSCREEN2, 5261) +x(SWORDER1, 5110) +x(SWORDER2, 5112) +x(CREDITS1, 5111) +x(CREDITS2, 5118) +x(SUPPORT, 4979) +x(ONLINE, 5113) + diff --git a/source/sw/src/names.h b/source/sw/src/names.h index f638318ce..05421a3e3 100644 --- a/source/sw/src/names.h +++ b/source/sw/src/names.h @@ -25,74 +25,16 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms //------------------------------------------------------------------------- //Be careful when changing this file - it is parsed by Editart and Build. -#define ALPHABET 85 -#define MENU_MAIN 295 -#define MENU_OPTION 296 -#define MENU_WHICH 297 -#define MENU_CURSOR 298 -#define DART1 2000 -#define DART2 2001 -#define DART3 2002 -#define DART4 2003 -#define DART 2004 -#define FIRE1 2005 -#define FIRE2 2006 -#define FIRE3 2007 -#define FIRE4 2008 -#define FIRE5 2009 -#define FIREBALL1 2010 -#define FIREBALL2 2011 -#define FIREBALL3 2012 -#define FIREBALL4 2013 -#define FLAMES1 2014 -#define FLAMES2 2015 -#define FLAMES3 2016 -#define FLAMES4 2017 -#define FLAMES5 2018 -#define GAS1 2019 -#define GAS2 2020 -#define GAS3 2021 -#define GAS4 2022 -#define GAS5 2023 -#define GAS6 2024 -#define GAS7 2025 -#define GASCLOUD1 2026 -#define GASCLOUD2 2027 -#define GASCLOUD3 2028 -#define GASCLOUD4 2029 -#define GASCLOUD5 2030 -#define GASCLOUD6 2031 -#define GASCLOUD7 2032 -#define GASCLOUD8 2033 -#define GASCLOUD9 2034 -#define LIGHT1 2035 -#define LIGHT2 2036 -#define LIGHT3 2037 -#define LIGHT4 2038 -#define LIGHT5 2039 -#define LIGHT6 2040 -#define ELECTRO1 2041 -#define ELECTRO2 2042 -#define ELECTRO3 2043 -#define RIFLE1 2044 -#define RIFLE2 2045 -#define RIFLE3 2046 -#define DONTUSE_EXTRA 2047 -#define RIFLE4 2048 -#define CARTRIGE3 2053 -#define STATUE1 2054 -#define STATUE2 2055 -#define STATUE3 2056 -#define STATUE4 2057 -#define SWORD3 2065 -#define SWORD4 2066 -#define SWORD1 2067 -#define SWORD2 2068 -#define SWORD5 2069 -#define BLACK___ 2306 -#define FragBarErase 2375 -#define FragBarErase2 2376 -#define MIRROR 340 -#define FLOORMIRROR 341 -#define CAMSPRITE 3830 +#pragma once + +BEGIN_SW_NS + +#define x(a, b) a = b, +enum +{ +#include "namelist.h" +}; +#undef x + +END_SW_NS diff --git a/source/sw/src/names2.h b/source/sw/src/names2.h index bb53340d8..0e6485150 100644 --- a/source/sw/src/names2.h +++ b/source/sw/src/names2.h @@ -232,69 +232,6 @@ enum STAT_ENUMS // ////////////////////// -#define ICON_STAR 1793 - -#define ICON_UZI 1797 -#define ICON_UZIFLOOR 1807 -#define ICON_LG_UZI_AMMO 1799 - -#define ICON_HEART 1824 -#define ICON_HEART_LG_AMMO 1820 - -#define ICON_GUARD_HEAD 1814 -#define ICON_FIREBALL_LG_AMMO 3035 - -#define NAPALM_MIN_AMMO 10 -#define RING_MIN_AMMO 30 - -#define ICON_ROCKET 1843 -#define ICON_SHOTGUN 1794 -#define ICON_LG_ROCKET 1796 -#define ICON_LG_SHOTSHELL 1823 -#define ICON_AUTORIOT 1822 - -#define ICON_MICRO_GUN 1818 -#define ICON_MICRO_BATTERY 1800 - -#define ICON_GRENADE_LAUNCHER 1817 -#define ICON_LG_GRENADE 1831 - -#define ICON_LG_MINE 1842 - -#define ICON_RAIL_GUN 1811 -#define ICON_RAIL_AMMO 1812 - -// not used now -#define ICON_SPELL 1880 -#define ICON_ELECTRO 1822 - -#define ICON_EXPLOSIVE_BOX 1801 -#define ICON_ENVIRON_SUIT 1837 -#define ICON_FLY 1782 -#define ICON_CLOAK 1804 -#define ICON_NIGHT_VISION 3031 -#define ICON_NAPALM 3046 -#define ICON_RING 3050 -#define ICON_GOROAMMO 3035 -#define ICON_HEARTAMMO 1820 -#define ICON_RINGAMMO 3054 -#define ICON_NAPALMAMMO 3058 -#define ICON_GRENADE 3059 -#define ICON_OXYGEN 1800 -#define ICON_ARMOR 3030 -#define ICON_SM_MEDKIT 1802 -#define ICON_BOOSTER 1810 -#define ICON_HEAT_CARD 1819 -#define ICON_REPAIR_KIT 1813 -#define ICON_MEDKIT 1803 -#define ICON_CHEMBOMB 1808 -#define ICON_FLASHBOMB 1805 -#define ICON_NUKE 1809 -#define ICON_CALTROPS 1829 -#define ICON_FLAG 2520 - - - #define STAR 2039 #define ELECTRO 2025 @@ -345,29 +282,6 @@ enum STAT_ENUMS // ////////////////////// -#define COINCURSOR 2440 // Jim uses this for a text input cursor -#define STARTALPHANUM 4608 // New SW font for typing in stuff, It's in ASCII order. -#define ENDALPHANUM 4701 - -#define STATUS_BAR 2434 -#define STATUS_KEYS 2881 -#define STATUS_NUMBERS 2887 -#define BORDER_TILE 2604 - - -#define BLUE_KEY 1766 -#define RED_KEY 1770 -#define GREEN_KEY 1774 -#define YELLOW_KEY 1778 -#define GOLD_SKELKEY 1765 -#define SILVER_SKELKEY 1769 -#define BRONZE_SKELKEY 1773 -#define RED_SKELKEY 1777 -#define BLUE_CARD 1767 -#define RED_CARD 1771 -#define GREEN_CARD 1775 -#define YELLOW_CARD 1779 - #define BLUE_KEY_STATUE BLUE_KEY+2 #define RED_KEY_STATUE RED_KEY+2 #define GREEN_KEY_STATUE GREEN_KEY+2 diff --git a/source/sw/src/panel.cpp b/source/sw/src/panel.cpp index aa80a0419..3b7582bcd 100644 --- a/source/sw/src/panel.cpp +++ b/source/sw/src/panel.cpp @@ -39,7 +39,7 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms #include "v_2ddrawer.h" #include "weapon.h" -#include "menu.h" +#include "razemenu.h" #include "raze_sound.h" #include "glbackend/glbackend.h" diff --git a/source/sw/src/player.cpp b/source/sw/src/player.cpp index 6afd13648..41f5c9d93 100644 --- a/source/sw/src/player.cpp +++ b/source/sw/src/player.cpp @@ -50,9 +50,10 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms #include "misc.h" #include "interp.h" #include "interpso.h" -#include "menu.h" +#include "razemenu.h" #include "gstrings.h" #include "raze_music.h" +#include "v_draw.h" #include "gamestate.h" BEGIN_SW_NS diff --git a/source/sw/src/save.cpp b/source/sw/src/save.cpp index b7e15ada6..51b26950e 100644 --- a/source/sw/src/save.cpp +++ b/source/sw/src/save.cpp @@ -204,7 +204,7 @@ int LoadSymCodeInfo(MFILE_READ fil, void **ptr) -bool GameInterface::SaveGame(FSaveGameNode *sv) +bool GameInterface::SaveGame() { MFILE_WRITE fil; int i,j; @@ -643,7 +643,7 @@ bool GameInterface::SaveGame(FSaveGameNode *sv) } -bool GameInterface::LoadGame(FSaveGameNode* sv) +bool GameInterface::LoadGame() { MFILE_READ fil; int i,j,saveisshot=0; diff --git a/source/sw/src/sbar.cpp b/source/sw/src/sbar.cpp index e14ffba33..c2877db16 100644 --- a/source/sw/src/sbar.cpp +++ b/source/sw/src/sbar.cpp @@ -30,6 +30,7 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms #include "build.h" #include "game.h" +#include "names.h" #include "names2.h" #include "panel.h" #include "pal.h" diff --git a/source/sw/src/scrip2.cpp b/source/sw/src/scrip2.cpp index b0eb8533c..d008ea556 100644 --- a/source/sw/src/scrip2.cpp +++ b/source/sw/src/scrip2.cpp @@ -37,7 +37,7 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms #include "jsector.h" #include "parent.h" #include "sc_man.h" -#include "menu.h" +#include "razemenu.h" #include "quotemgr.h" #include "mapinfo.h" diff --git a/source/sw/src/sounds.cpp b/source/sw/src/sounds.cpp index 934bdbf41..cd1340909 100644 --- a/source/sw/src/sounds.cpp +++ b/source/sw/src/sounds.cpp @@ -41,7 +41,7 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms #include "misc.h" #include "rts.h" #include "menus.h" -#include "menu.h" +#include "razemenu.h" #include "raze_music.h" #include "raze_sound.h" #include "filesystem.h" @@ -481,7 +481,6 @@ void InitFX(void) auto &S_sfx = soundEngine->GetSounds(); S_sfx.Resize(countof(voc)); - for (auto& sfx : S_sfx) { sfx.Clear(); sfx.lumpnum = sfx_empty; } for (size_t i = 1; i < countof(voc); i++) { auto& entry = voc[i]; diff --git a/wadsrc/static/language.0 b/wadsrc/static/language.0 new file mode 100644 index 000000000..f1e94ced9 --- /dev/null +++ b/wadsrc/static/language.0 @@ -0,0 +1,774 @@ +default,Identifier,Remarks,Filter,eng enc ena enz eni ens enj enb enl ent enw,cs,de,el,eo,es,esm esn esg esc esa esd esv eso esr ess esf esl esy esz esb ese esh esi esu,fi,fr,hu,it,jp,ko,nl,pl,pt,ptg,ro,ru,sr +,,Miscellaneous,,,,,,,,,,,,,,,,,,,,, +Press Y or N.,PRESSYN,,,,Stiskni Y nebo N.,Drücke Y oder N.,"Πάτα Y ή N +",Premu Y aŭ N.,Presiona Y ó N.,,Paina Y tai N.,Appuyez sur Y ou N.,Nyomj Y-t vagy N-t.,Premi Y oppure N.,YかNで答えろ,Y키 또는 N키를 누르시오.,Druk op Y of N.,Wciśnij Y lub N.,Aperte Y ou N.,Carrega Y ou N.,Apasă Y sau N.,Нажмите Y или N.,Притисните Y или N. +Yes,TXT_YES,,,,Ano,Ja,Ναι,Jes,Sí,,Kyllä,Oui,Igen,Si,はい,네,Ja,Tak,Sim,,Da,Да,Да +No,TXT_NO,,,,Ne,Nein,Όχι,Ne,No,,Ei,Non,Nem,No,いいえ,아니요,Nee,Nie,Não,,Nu,Нет,Не +"You can't save if you aren't playing! + +Press a key.",SAVEDEAD,,,,"Nemůžeš ukládat pokud nehraješ! + +Stiskni libovolnou klávesu.","Du kannst nicht speichern, wenn du nicht spielst. + +Drücke eine Taste",,"Vi ne povas konservi, kiam vi ne ludas! + +Premu klavon.","¡No puedes guardar si no estás jugando! + +Presiona una tecla.",,"Et voi tallentaa, jos et ole pelissä! + +Paina jotain näppäintä.","Vous ne pouvez pas sauvegarder si vous ne jouez pas! + +Appuyez sur une touche.","Nem tudsz menteni ha nem is játszol! + +Nyomj meg egy gombot.","Non puoi salvare se non stai giocando! + +Premi un tasto.","プレイ中でないとセーブできない! + +何かキーを押せ","게임을 플레이 중이지 않을 때는 게임을 저장할 수 없습니다! + +키를 누르시오.","Je kunt niet opslaan als je niet speelt! + +Druk op een toets.","Nie możesz zapisać, jeśli nie grasz! + +Wciśnij dowolny klawisz.","Você não pode salvar se não estiver jogando! + +Aperte qualquer tecla.","Você não pode salvar se não estiver a jogar! + +Carrega numa tecla qualquer.","Nu poți salva jocul dacă nu joci! + +Apasă o tastă.","Невозможно сохранить игру, не начав её! + +Нажмите любую клавишу.","Не можете сачувати игру ако не играте! + +Притисните тастер." +Do you really want to do this?,SAFEMESSAGE,,,,Vážně to chceš udělat?,Möchtest du das wirklich tun?,,Ĉu vi vere volas fari tion?,¿Realmente quieres hacer esto?,¿Realmente quieres hacerlo?,Haluatko varmasti tehdä tämän?,Voulez-vous vraiment faire ça?,Biztos megakarod tenni?,Sei sicuro di volerlo fare?,本当に実行するのか?,정말로 정하시겠습니까?,Wil je dit echt doen?,Naprawdę chcesz to zrobić?,Você deseja mesmo fazer isso?,Desejas mesmo fazer isso?,Ești sigur că vrei să faci asta?,Вы уверены?,Да ли заиста желите то да урадите? +Not set,NOTSET,,,,Není nastavené,Nicht gesetzt,,Ne agordita,No Asignado,,Ei asetettu,Pas paramétré,Nincs beállítva,Non assegnato,セットされてない,정하지 않음,Niet ingesteld,Nie ustawiono,Não definido,,Nesetat,Не задан,Није намештено +"Quicksave over your game named + +'%s'? + +Press Y or N.",QSPROMPT,,,,"Rychle uložit přes tvoji hru s názvem + +'%s'? + +Stiskni Y nebo N.","Überschreibe %s mit einem Schnellspeicherspielstand? + +Drücke Y oder N.",,"Ĉu rapidkonservu super via ludo, ke nomita + +'%s'? + +Premu Y aŭ N.","¿Deseas guardar sobre tu partida llamada + +'%s'? + +Presiona Y ó N.",,"Haluatko tallentaa pelin %s päälle? + +Paina Y tai N.","Sauvegarde rapide sur le fichier + +'%s'? + +Appuyez sur Y ou N.","Gyorsmenteni akarsz az alábbi mentésed alatt + +'%s'? + +Nyomj Y-t vagy N-t.","Sovrascrivere il salvataggio + +'%s'? + +Premi Y oppure N.","この名前で上書きするのか? + +'%s' + +Y か N で答えろ","빠른 저장을 하시겠습니까? + +'%s' + +Y키 또는 N키를 누르시오.","Snel opslaan over je spel genaamd + +'%s'? + +Druk op Y of N.","Szybko nadpisać grę + +„%s”? + +Wciśnij Y lub N.","Salvar sobre seu jogo chamado + +'%s'? + +Aperte Y ou N.","Gravar sobre o seu jogo chamado + +'%s'? + +Carrega Y ou N.","Salvare rapidă peste salvarea + +'%s' ? + +Apasă Y sau N.","Перезаписать быстрое сохранение + +«%s»? + +Нажмите Y или N.","Желите брзо чување за игру под именом + +„%s“? + +Притисните Y или N." +"Do you want to quickload the game named + +'%s'? + +Press Y or N.",QLPROMPT,,,,"Přeješ si rychle načíst hru s názvem + +'%s'? + +Stiskni Y nebo N.","Möchtest du den Spielstand %s schnellladen? + +Drücke Y oder N.",,"Ĉu vi volas rapidŝargi la ludon, ke nomita + +'%s'? + +Premu Y aŭ N.","¿Quieres cargar la partida llamada + +'%s'? + +Presiona Y ó N.",,"Haluatko pikaladata pelin %s? + +Paina Y tai N.","Voulez-vous charger la sauvegarde + +'%s'? + +Appuyez sur Y ou N.","Gyorstölteni akarod ezt a mentést + +'%s'? + +Nyomj Y-t vagy N-t.","Vuoi fare un quickload della partita + +'%s'? + +Premi Y oppure N.","この名前のデータをロードするのか? + +'%s' + +Y か N で答えろ","빠른 불러오기를 하시겠습니까? + +'%s' + +Y키 또는 N키를 누르시오.","Wil je het spel snel laden met de naam + +'%s'? + +Druk op Y of N.","Czy chcesz wczytać szybki zapis + +„%s”? + +Wciśnij Y lub N.","Deseja carregar o jogo chamado + +'%s'? + +Aperte Y ou N.","Deseja carregar o jogo chamado + +'%s'? + +Carrega Y ou N.","Vrei să încarci rapid salvarea + +'%s' ? + +Apasă Y sau N.","Загрузить быстрое сохранение + +«%s»? + +Нажмите Y или N.","Желите брзо учитавање за игру под именом + +„%s“? + +Притисните Y или N." +%s cheats,TXT_X_CHEATS,This is a gender sensitive message where %s represents the player,,,%s cheatuje,%s schummelt,@[art_gr] %s απατάει,%s trompas,%s hace trampa,,%s huijaa,%s triche.,,%s imbroglia,%s はチート使用,%s 이(가) 치트를 사용 함,%s bedriegt,%s oszukuje,%s está trapaceando,%s está a fazer batota,%s trișează,%s использует чит-коды,%s вара +Messages: OFF,MSGOFF,,,,Zprávy ZAP,Meldungen AUS,Μηνύματα ΚΛΕΙΣΤΑ,Mesaĝoj MALAKTIVA,Mensajes DESACTIVADOS,,Viestit POIS PÄÄLTÄ,Messages désactivés.,Üzenetek KI,Messaggi DISATTIVATI,メッセージ: オフ,메시지 끔,Berichten UIT,Wiadomości WYŁĄCZONE,Mensagens DESATIVADAS,,Mesaje OPRITE,Сообщения ОТКЛЮЧЕНЫ,Поруке ИСКЉУЧЕНЕ +Messages: ON,MSGON,,,,Zprávy VYP,Meldungen AN,Μηνύματα ΑΝΟΙΧΤΑ,Mesaĝoj AKTIVA,Mensajes ACTIVADOS,,Viestit PÄÄLLÄ,Messages activés.,Üzenetek BE,Messaggi ATTIVATI,メッセージ: オン,메시지 켬,Berichten AAN,Wiadomości WŁĄCZONE,Mensagens ATIVADAS,,Mesaje PORNITE,Сообщения ВКЛЮЧЁНЫ,Поруке УКЉУЧЕНЕ +Say:,TXT_SAY,,,,Říct:,Sage:,Πές:,Diru:,,,Sano:,Parler:,Üzenet:,Parla:,発言:,,Zeg:,Powiedz:,Fala:,Diz:,Vorbește:,Чат:,Пиши: +,,Savegame,,,,,,,,,,,,,,,,,,,,, +Empty slot,EMPTYSTRING,,,,Prázdný slot,nicht belegt,,Malplena Ingo,Ranura Vacía,,Tyhjä lokero,Emplacement Vide,Üres,Slot libero,空きスロット,빈 슬롯,Lege sleuf,Puste miejsce,Vazio,,Loc disponibil,Пустой слот,Празни слот +,NEWSAVE,,,,,,,,,,,,<Új mentés>,,<新規セーブ>,<새로운 게임 저장>,,,,,,<Новое сохранение>,<Нова сачувана игра> +Game saved.,GGSAVED,,,,Hra uložena.,Spielstand gespeichert.,,Ludo konservita.,Partida guardada.,,Peli tallennettu.,Partie sauvegardée.,Játék mentve.,Gioco salvato.,セーブ完了。,게임이 저장됨.,Spel opgeslagen.,Gra zapisana.,Jogo salvo.,Jogo gravado.,Joc salvat.,Игра сохранена.,Игра сачувана. +Time,SAVECOMMENT_TIME,,,,Čas,Zeit,,Tempo,Tiempo,,Aika,Temps,Idő,Tempo,"時間 +",시간,Tijd,Czas,Tempo,,Timp,Время,Време +Load Game,MNU_LOADGAME,,,,Načíst hru,Spiel laden,,Ŝarĝi Ludon,Cargar Partida,,Lataa peli,Chargement,,Carica gioco,ロード,게임 불러오기,Laden spel,Wczytaj Grę,Carregar,,Încărcare Joc,Загрузка,Учитај игру +Save Game,MNU_SAVEGAME,,,,Uložit hru,Spiel sichern,,Konservi Ludon,Guardar Partida,,Tallenna peli,Sauvegarde,,Salva gioco,セーブ,게임 저장하기,Opslaan spel,Zapisz Grę,Salvar,Gravar,Salvare Joc,Сохранение,Сачувај игру +No Picture,MNU_NOPICTURE,,,,Bez obrázku,Kein Bild,,Neniu Bildo,Sin Imagen,,Ei kuvaa,Pas d'image,,Nessuna immagine,画像無し,사진 없음,Geen beeld,Brak obrazka,Sem imagem,,Lipsă Imagine,"Нет +изображения",Нема слике +Different Version,MNU_DIFFVERSION,,,,Jiná verze,Falsche Version,,Malsama Versio,Versión Diferente,,Eri versio,Version Différente,,Versione differente,"別バージョンの +データ",다른 버젼,Anders Versie,Inna Wersja,Versão Diferente,,Versiune Diferită,Другая версия,Другачија верзија +No files,MNU_NOFILES,,,,Žádné soubory,Keine Dateien,,Neniuj dosieroj,Sin archivos,,Ei tiedostoja,Pas de fichiers,,Nessun file,ファイル無し,파일 없음,Geen bestanden,Brak plików,Vazio,,Niciun fișiier,Нет файлов,Нема фајлова +"Do you really want to delete the savegame? +",MNU_DELETESG,,,,Opravdu chceš smazat tuto uloženou hru?,Willst du diesen Spielstand wirklich löschen?,,Ĉu vi vere volas forviŝi la konservan ludon?,"¿Realmente deseas eliminar la partida? +",,Haluatko varmasti poistaa tallennetun pelin ,"Voulez vous vraiment effacer cette sauvegarde? +",Biztos ki akarod törölni a mentést?,Vuoi veramente rimuovere il salvataggio,本当にこのセーブを消すのか?,저장된 게임을 정말로 삭제하시겠습니까?,Wil je echt de opgeslagen spel verwijderen?,Czy naprawdę chcesz usunąć zapis gry,"Deseja mesmo deletar o jogo salvo? +",Deseja mesmo apagar o jogo,Vrei să ștergi salvarea?,"Вы действительно хотите удалить сохранение +",Да ли стварно желите да избришете сачувану игру +,,General,,,,,,,,,,,,,,,,,,,,, +Off,OPTVAL_OFF,,,,Vyp,Aus,,Malaktiva,Desactivado,,Pois,,,Disattivo,オフ,끔,Uit,Wyłączone,Desligado,,Pornit,Откл.,Искљ. +On,OPTVAL_ON,,,,Zap,An,,Aktiva,Activado,,Päällä,,,Attivo,オン,켬,Aan,Włączone,Ligado,,Oprit,Вкл.,Укљ. +Auto,OPTVAL_AUTO,,,,,,,Aŭtomata,Automático,,Automaattinen,,,Automatico,自動,자동,,Automatycznie,Automático,,,Авто,Аутоматски +Options,OPTMNU_TITLE,,,,Možnosti,Optionen,,Agordoj,Opciones,,Asetukset,Options,Beállítások,Opzioni,オプション,설정,Opties,Opcje,Opções,,Opțiuni,Настройки,Подешавања +Customize Controls,OPTMNU_CONTROLS,,,,Nastavení ovládání,Steuerung einstellen,,Agordi Regilojn,Personalizar Controles,,Ohjausasetukset,Modifier les Contrôles,Irányítás testreszabása,Personalizza i controlli,キー配置変更,조작 사용자 지정,Instellen van de controle,Ustaw Klawisze,Configurar Controles,Configurar Controlos,Personalizare Setări Control,Управление,Контроле +Mouse Options,OPTMNU_MOUSE,,,,Nastavení myši,Mauseinstellungen,,Musagordoj,Opciones de Ratón,,Hiiriasetukset,Options de la Souris,Egér beállítások,Opzioni Mouse,マウス オプション,마우스 설정,Muis opties,Opcje Myszki,Opções de mouse,Opções do rato,Setări Mouse,Мышь,Миш +Controller Options,OPTMNU_JOYSTICK,,,,Nastavení ovladače,Joystickeinstellungen,,Ludregilagordoj,Opciones de Mando,,Peliohjainasetukset,Options de la Manette,Játékvezérlő beállítások,Opzioni Joystick,コントローラーオプション,조이스틱 설정,Controller opties,Opcje Kontrolera,Opções de joystick,,Setări Controller,Контроллер,Контролер +Player Setup,OPTMNU_PLAYER,,,,Nastavení hráče,Spieler einrichten,,Ludanta Agordaĵo,Config. del Jugador,,Pelaaja-asetukset,Options du Joueur,Játékos testreszabása,Settaggio giocatore,プレイヤーの特徴,플레이어 설정,Speler instellen,Ustawienia Gracza,Configurações de Jogador,Configurações do Jogador,Personalizare Jucător,Игрок,Играч +Gameplay Options,OPTMNU_GAMEPLAY,,,,Nastavení herních mechanik,Spieleinstellungen,,Ludadagordoj,Opciones de Jugabilidad,,Pelattavuusasetukset,Options du Gameplay,Játék mechanika,Opzioni Gameplay,ゲームプレイ オプション,게임 설정,Gameplay-opties,Opcje Rozgrywki,Opções de jogabilidade,,Setări pe timp de joc,Геймплей,Гејмплеј +Automap Options,OPTMNU_AUTOMAP,,,,Nastavení automapy,Automapeinstellungen,,Aŭtomapagordoj,Opciones del Automapa,,Automaattikartan asetukset,Options de la Carte,Térkép beállítások,Opzioni Automappa,オートマップ オプション,오토맵 설정,Automap-opties,Opcje Mapy,Opções de automapa,,Hartă computerizată,Автокарта,Аутомапа +HUD Options,OPTMNU_HUD,,,,Nastavení HUD,HUD Einstellungen,,Agordoj de HUD,Opciones del HUD,,Tilanäytön asetukset,Options de l'ATH,HUD beállítások,Opzioni HUD,HUD オプション,HUD 설정,HUD opties,Opcje Paska HUD,Opções de HUD,,Setări HUD,HUD,HUD +Miscellaneous Options,OPTMNU_MISCELLANEOUS,,,,Ostatní nastavení,Verschiedene Einstellungen,,Ekstraĵagordoj,Opciones Misceláneas,,Sekalaiset asetukset,Options Annexes,Általános beállítások,Opzioni miste,その他のオプション,그 외 설정,Diverse opties,Różne Opcje,Outras opções,,Setări diverse,Дополнительно,Разно +Sound Options,OPTMNU_SOUND,,,,Nastavení zvuku,Soundeinstellungen,,Sonagordoj,Opciones de Sonido,,Ääniasetukset,Options du Son,Hang beállítások,Opzioni Suono,サウンド オプション,음향 설정,Geluidsopties,Opcje Dźwięku,Opções de som,,Setări sunet,Звук,Звук +Display Options,OPTMNU_DISPLAY,,,,Nastavení grafiky,Anzeigeeinstellungen,,Ekranagordoj,Opciones de Visualización,,Näyttöasetukset,Options de l'Affichage,Megjelenítés beállítások,Opzioni Display,ディスプレイ オプション,디스플레이 설정,Weergaveopties,Opcje Wyświetlania,Opções de vídeo,,Setări afișare,Экран,Приказ +Set video mode,OPTMNU_VIDEO,,,,Nastavit režim displeje,Videomodus,,Agordi videoreĝimon,Modos de Vídeo,,Aseta videotila,Choisir Mode D'Affichage,Felbontás,Settaggio modalità video,ビデオ 調整,화면 설정,Videomodus instellen,Ustaw tryb wideo,Definir modo de vídeo,,Setare mod video,Видеорежим,Видео мод +Reset to defaults,OPTMNU_DEFAULTS,,,,Obnovit původní,Auf Vorgaben zurücksetzen,,Reŝanĝi al defaŭltoj,Valores por Defecto,,Palauta oletusasetukset,Réinitialiser les paramètres,Alapértelmezett beállítások használata,Reimposta ai valori di default,初期設定に戻す,초기화,Terugzetten naar standaardinstellingen,Resetuj do domyślnych,Redefinir para configurações padrão,,Revenire la setări implicite,Сбросить все настройки,Врати подразумевано +Reset to last saved,OPTMNU_RESETTOSAVED,,,,Obnovit naposledy uložené,Auf gespeicherte Werte zurücksetzen,,Reŝanĝi al lasta konservo,Últimos Valores Guardados,,Palauta viimeksi tallennettu tila,Recharger dernière config.,Legutóbbi mentett beállítások használata,Reimposta ai valori salvati l'ultima volta,最後に保存した設定に戻す,이전 설정으로 초기화,Reset naar laatste opgeslagen,Resetuj do ostatnio zapisanych,Redefinir para última configuração salva,Redefinir para última configuração gravada,Revenire la ultimele setări salvate,Вернуть предыдущие настройки,Врати задње сачувано +Go to console,OPTMNU_CONSOLE,,,,Jít do konzole,Öffne Konsole,,Iri al konzolo,Ir a la consola,,Mene konsoliin,Ouvrir la console,Konzol megnyitása,Vai alla console,コンソールを開く,콘솔로 이동,Ga naar de console,Przejdź do konsoli,Abrir console,Abrir consola,Mergi la consolă,Открыть консоль,Отвори конзолу +Network Options,OPTMNU_NETWORK,,,,Nastavení sítě,Netzwerkeinstellungen,Ρυθμίσεις Δικτύου,Retagordoj,Opciones de Red,,Verkkoasetukset,Options Réseau,Hálózati beállítások,Opzioni Network,ネットワーク オプション,네트워크 설정,Netwerkopties,Opcje Sieciowe,Opções de rede,,Setări de Rețea,Сеть,Мрежа +Reverb environment editor,OPTMNU_REVERB,,,,Editor zvukové ozvěny,Hall-Editor,Επεξεργαστής περιβαλλόντων απόσβεσης,Redaktoro pri resonmedio,Editor de Amb. de Reverb.,,Kaikutilaeditori,Editeur environement de révérb.,Visszhang-környezet szerkesztő,Editor ambiente reverb,リバーブ環境エディタ,울림 환경 편집기,Reverb-omgeving editor,Edytor pogłosu środowiska,Editor de ambiente de reverberação,,Setări Reverb,Редактор реверберации,Уредник одјека у околини +,,Customize controls,,,,,,,,,,,,,,,,,,,,, +Customize Controls,CNTRLMNU_TITLE,,,,Nastavení ovládání,Steuerung einstellen,,Agordi Regilojn,Personalizar Controles ,,Ohjausasetukset,Modifier contrôles,Irányítás testreszabása,Personalizza i controlli,キー配置変更,조작 사용자 지정,Instellen van de controle,Ustaw Klawisze,Configurar Controles,Configurar Controlos,Personalizare schemă control,Настройки управления,Подешавања контрола +"ENTER to change, BACKSPACE to clear",CNTRLMNU_SWITCHTEXT1,,,,"ENTER pro změnu, BACKSPACE pro smazání",ENTER: Editieren BACKSPACE: Löschen,,"ENTER klavo por ŝanĝi, BACKSPACE klavo por viŝi","ENTER para cambiar, BACKSPACE para limpiar",,"Aseta ENTERILLÄ, tyhjennä ASKELPALAUTTIMELLA","ENTREE pour changer, RET. ARRIERE pour effacer.","ENTER a változtatáshoz, BACKSPACE a törléshez","INVIO per modificare, BACKSPACE per ripulire",Enter で決定、BackSpaceで無効化,"바꿀려면 ENTER키, 지울려면 BACKSPACE키를 누르시오","ENTER om te veranderen, BACKSPACE om te wissen.","ENTER by zmienić, BACKSPACE by wyczyścić","ENTER para alterar, BACKSPACE para limpar",,"ENTER pentru a schimba, BACKSPACE pentru ștergere","ENTER — изменить, BACKSPACE — очистить","ENTER за промену, BACKSPACE за чишћење" +"Press new key for control, ESC to cancel",CNTRLMNU_SWITCHTEXT2,,,,"Zmáčkni novou klávesu pro nastavení, ESC pro storno",Drücke eine Taste oder ESC um abzubrechen,,"Premi novan klavon por reakiri regilon, ESC por nuligi","Presiona una tecla para el control, ESC para cancelar",,"Valitse näppäin toiminnolle, ESC peruuttaa","Appuyez sur la nouvelle touche pour l'assigner, +Appuyez sur ECHAP pour annuler.","Nyomj meg egy gombot, ESC a törléshez","Premi un nuovo tasto per il controllo, ESC per cancellare","登録したいキーを押すか, Escでキャンセル","명령을 얽으려면 아무 키를, 취소는 ESC키를 누르시오","Druk op de nieuwe toets voor controle, ESC om te annuleren.","Wciśnij nowy przycisk by zmienić klawisz, ESC by anulować","Aperte a nova tecla para o comando, ESC para cancelar","Carrega a nova tecla para o comando, ESC para cancelar","Apasă tasta nouă, sau ESC pentru anulare","Нажмите клавишу управления, ESC для отмены","Притисните ново тастер за одређивање контроле, ESC за отказивање" +Controls,CNTRLMNU_CONTROLS,,,,Ovládání,Steuerung,,Regiloj,Controles,,Ohjaimet,Contrôles,Irányítás,Controlli,操作系統,조작,Bedieningselementen,Klawisze,Comandos,Controlos,Control,Управление,Контроле +Fire,CNTRLMNU_ATTACK,,,,Střelba,Feuer,,Pafi,Fuego,,Tuli,Tirer,Tűz,Fuoco,撃つ,공격,Vuur,Strzał,Atirar,,Foc,Атака,Нападни +Secondary Fire,CNTRLMNU_ALTATTACK,,,,Sekundární střelba,Alternativfeuer,,Duaranga Pafi,Fuego secundario,,Vaihtoehtoistuli,Tir Secondaire,Másodlagos tüzelés,Fuoco secondario,セカンダリ,보조 공격,Secundaire vuur,Strzał Alternatywny,Tiro Secundário,,Foc Secundar,Вторичная атака,Секундарни напад +Weapon Reload,CNTRLMNU_RELOAD,,,,Přebít zbraň,Waffe nachladen,Επαναφόρτωση Όπλου,Armilreŝarĝo,Recargar,,Aseen lataus,Recharger Arme,Fegyver újratöltése,Ricarica dell'arma,リロード,무기 장전,Wapenherladen,Przeładowanie Broni,Recarregar Arma,,Încărcare Armă,Перезарядка,Напуни +Use / Open,CNTRLMNU_USE,,,,Použít / otevřít,Benutzen / Öffnen,,Uzi / Malfermi,Usar / Abrir,,Käytä / Avaa,Utiliser/Ouvrir,Használ / Ajtónyitás,Usa / Apri,開く / スイッチ等使用,사용/열기,Gebruik / Openen,Użyj / Otwórz,Usar / Abrir,,Folosește / Deschide,Использовать/открыть,Користи / Отвори +Move forward,CNTRLMNU_FORWARD,,,,Pohyb vpřed,Vorwärts bewegen,,Movi anatŭe,Avanzar,,Liiku eteenpäin,Avancer,Előre mozgás,Movimento in Avanti,前進,앞으로 이동,Voorwaarts bewegen,Idź do przodu,Mover para frente,,Deplasare în față,Движение вперёд,Крећи се напред +Move backward,CNTRLMNU_BACK,,,,Pohyb vzad,Rückwarts bewegen,,Movi malantaŭe,Retroceder,,Liiku taaksepäin,Reculer,Hátra mozgás,Movimento in Indietro,後退,뒤로 이동,Achteruit bewegen,Idź do tyłu,Mover para trás,,Deplasare în spate,Движение назад,Крећи се уназад +Strafe left,CNTRLMNU_MOVELEFT,,,,Pohyb doleva,Nach links bewegen,,Flankmovi maldekstre,Moverse a la izquierda,,Astu sivuun vasemmalle,Aller à Gauche,Balra oldalazás,Movimento laterale a sinistra,左移動,왼쪽으로 이동,Verplaats naar links,Unik w lewo,Mover para a esquerda,,Deplasare diagonală stânga,Движение влево,Крећи се лево +Strafe right,CNTRLMNU_MOVERIGHT,,,,Pohyb doprava,Nach rechts bewegen,,Flankmovi dekstre,Moverse a la derecha,,Astu sivuun oikealle,Aller à Droite,Jobbra oldalazás,Movimento laterale a destra,右移動,오른쪽으로 이동,Verplaats naar rechts,Unik w prawo,Mover para a direita,,Deplasare diagonală dreapta,Движение вправо,Крећи се десно +Turn left,CNTRLMNU_TURNLEFT,,,,Otočení vlevo,Nach links drehen,,Turni maldekstre,Girar a la izquierda,,Käänny vasemmalle,Tourner à Gauche,Balra fordul,"Gira a sinistra +",左を向く,왼쪽으로 회전,Draai naar links,Obróć się w lewo,Girar para a esquerda,,Întoarcere stânga,Поворот налево,Окрени се лево +Turn right,CNTRLMNU_TURNRIGHT,,,,Otočení vpravo,Nach rechts drehen,,Turni dekstre,Girar a la derecha,,Käänny oikealle,Tourner à Droite,Jobbra fordul,Gira a destra,右を向く,오른쪽으로 회전,Draai naar rechts,Obróć się w prawo,Girar para a direita,,Întoarcere dreapta,Поворот направо,Окрени се десно +Quick Turn,CNTRLMNU_TURN180,,,,Rychlé otočení,Schnelle Drehung,,Rapida turno,Giro rápido,,Pikakäännös,Faire un 180,Megfordulás,Rotazione rapida,背後を向く,빠른 회전,Snelle draai,Nagły Obrót,Giro rápido,,Întoarcere rapidă,Быстрый разворот,Брзи окрет +Jump,CNTRLMNU_JUMP,,,,Skok,Springen,,Salti,Saltar,,Hyppää,Sauter,Ugrás,Salta,ジャンプ,점프,Springen,Skok,Pular,Saltar,Salt,Прыжок,Скок +Crouch,CNTRLMNU_CROUCH,,,,Kleknutí,Ducken,,Kaŭri,Agacharse,,Kyyristy,S'accroupir (tenir),Guggolás,Abbassati,屈む,숙이기,Hurken,Kucnięcie,Agachar,,Ghemuire,Приседание,Чучни +Crouch Toggle,CNTRLMNU_TOGGLECROUCH,,,,Zap. / Vyp. kleknutí,Ducken an/aus,,Kaŭrbaskulo,Alternar agachado,,Kyyristymisen vaihtokytkin,S'accroupir (alterner),Guggolási kapcsoló,Toggle abbassamento,屈む切替,숙이기 토글,Hurken Toggle,Włącz / Wyłącz kucnięcie,Agachar (Liga/Desliga),,Comutator chemuire,Сесть/встать,Чучни (без држања) +Mouse look,CNTRLMNU_MOUSELOOK,,,,Pohled myší,Maus-Blick,,Musilregardo,Vista con ratón,,Hiirikatselu,Vue à la souris,Egérrel való nézelődés,Modalità vista col mouse,マウス視点上下化,마우스 룩,Muis-look,Rozglądanie się myszką,Vista com o mouse,Vista com o rato,Privire în jur cu mouse,Обзор мышью,Гледај мишем +Look up,CNTRLMNU_LOOKUP,Look doesn't change the aim! It only alters the view pitch,,,Pohled vzhůru,Nach oben schauen,,Rigardi supre,Mirar arriba,,Katso ylös,Regarder en haut,Felfele nézés,Guarda sopra,視点を上げる,위로 보기,Kijk omhoog,Patrz w górę,Olhar para cima,,Privire în sus,Смотреть вверх,Гледај горе +Look down,CNTRLMNU_LOOKDOWN,,,,Pohled dolů,Nach unten schauen,,Rigardi malsupre,Mirar abajo,,Katso alas,Regarder en bas,Lefele nézés,Guarda sotto,視点を下げる,아래로 보기,Kijk naar beneden,Patrz w dół,Olhar para baixo,,Privire în jos,Смотреть вниз,Гледај доле +Center view,CNTRLMNU_CENTERVIEW,,,Centre view,Vystředit pohled,Ansicht zentrieren,,Centra vidon,Centrar vista,,Keskitä katse,Recentrer Vue,Nézet középreigazítása,Sguardo centrato,視点を戻す,중앙 시점으로 보기,Middenaanzicht,Wyśrodkuj widok,Olhar para o centro,,Privire centru,Отцентрировать взгляд,Централизирај поглед +Run,CNTRLMNU_RUN,,,,Běh,Rennen,,Kuri,Correr,,Juokse,Courir (tenir),Futás,Corri,駆け足,달리기,Rennen,Bieg,Correr,,Fugă,Бег,Трчи +Toggle Run,CNTRLMNU_TOGGLERUN,,,,Zap. / Vyp. běh,Rennen an/aus,,Baskulkuri,Alternar Correr,,Juoksun vaihtokytkin,Courir (alterner),Futás kapcsoló,Toggle corsa,常時駆け足切替,달리기 토글,Rennen aan/uit,Włącz / Wyłącz bieg,Correr (Liga/Desliga),,Comutator fugă,Бежать/идти,Трчи (без држања) +Strafe,CNTRLMNU_STRAFE,,,,Pohyb vlevo/vpravo,Seitwärts,,Flankmovi,Desplazamiento,,Astu sivuttain,Pas de côté,,Spostamento laterale,横移動化,양옆으로 이동,Zijdelings bewegen,Uniki,Deslocamento lateral,,Deplasare în diagonală,Движение боком,Кретање у страну +Show Scoreboard,CNTRLMNU_SCOREBOARD,,,,Zobrazit tabulku skóre,Punktetafel anzeigen,,Montri poentartabulon,Mostrar Marcador,,Näytä pistetaulu,Afficher Scores (tenir),Eredményjelző megjelenítése,Mostra la tabella punteggio,スコアボード表示,점수창 표시,Scorebord tonen,Pokaż tablicę wyników,Mostrar pontuação,,Afișare tabelă de marcaj,Таблица очков,Табела +Action,CNTRLMNU_ACTION,,,,Akce,Aktion,,Ago,Acción,,Toiminta,,Akció,Azione,アクション,동작,Actie,Akcja,Ação,,Acțiuni,Основное,Радња +Customize Action Controls,CNTRLMNU_ACTION_TITLE,,,,Nastavit ovládání akcí,Aktions-Steuerung einstellen,,Agordi Agajn Regilojn,Controles de Acción,,Toimintaohjausasetukset,Changer Contrôles Action,Akció beállítások testreszabása,Personalizza i controlli di azione,アクション操作設定,사용자 지정 동작 컨트롤,Aanpassen van de actiecontroles,Ustaw Klawisze Akcji,Configurar Comandos de Ação,Configurar Controlos de Ação,Personalizare schemă acțiuni,Основные клавиши управления,Контроле радње +Chat,CNTRLMNU_CHAT,,,,Chat,Chat,,Babilo,Chat,,Keskustelu,Chat,Chat,Chat,チャット,채팅,Chat,Czat,Chat,Conversar,Conversație,Чат,Ћаскање +Multiplayer,MNU_MULTIPLAYER,,,,,Mehrspieler,,,,,Moninpeli,Multijoueur,,,,,,,Multijogador,,Joc Online,, +Say,CNTRLMNU_SAY,,,,Říct,Reden,,Diro,Hablar,,Sano,Parler,Üzenet ,Parla,発言,채팅하기,Zeg,Powiedz,Fala,Falar,Vorbește,Сообщение,Пиши +Customize Chat Controls,CNTRLMNU_CHAT_TITLE,,,,Nastavit ovládání chatu,Chat-Steuerung einstellen,,Agordi Babiladajn Regilojn,Controles de Chat,,Keskusteluohjausasetukset,Changer Contrôles Chat,Chat beállítások testreszabása,Personalizza i controlli della chat,チャット操作設定,사용자 지정 채팅 컨트롤,Chat-controles aanpassen aan uw wensen,Ustaw Klawisze Czatu,Configurar Comandos de Chat,Configurar Controlos de Chat,Personalizare control scriere,Клавиши управления чатом,Контроле ћаскања +Customize Weapon Controls,CNTRLMNU_WEAPONS_TITLE,,,,Nastavit ovládání zbraní,Waffen-Steuerung einstellen,,Agordi Armilojn Regilojn,Controles de Armas,,Aseohjausasetukset,Changer Contrôles Armes,Fegyver beállítások testreszabása,Personalizza i controlli delle armi,武器操作設定,사용자 지정 무기 컨트롤,Wapencontroles aanpassen aan uw eigen wensen,Ustaw Klawisze Broni,Configurar Comandos de Arma,Configurar Controlos de Armas,Personalizare control arme,Клавиши управления оружием,Контроле оружја +Customize Inventory Controls,CNTRLMNU_INVENTORY_TITLE,,,,Nastavit ovládání inventáře,Inventar-Steuerung einstellen,,Agordi Inventarajn Regilojn,Controles de Inventario,,Varusteohjausasetukset,Changer Contrôles Inventaires,Eszköztár beállítások testreszabása,Personalizza i controlli dell'inventario,インベントリ操作設定,사용자 지정 인벤토리 컨트롤,Inventariscontroles aanpassen aan uw wensen,Ustaw Klawisze Ekwipunku,Configurar Comandos de Inventário,Configurar Controlos de Inventário,Personalizare control inventar,Клавиши управления инвентарём,Контроле складишта +Customize Other Controls,CNTRLMNU_OTHER_TITLE,,,,Nastavit ostatní ovládání,Sonstige Steuerung einstellen,,Agordi Ekstrajn Regilojn,Otros Controles,,Muut ohjausasetukset,Changer Autres Contrôles,Egyéb irányítás testreszabása,Personalizza altri controlli,その他の操作設定,사용자 지정 그 외 컨트롤,Andere bedieningselementen aanpassen,Ustaw Inne Klawisze,Configurar Outros Comandos,Configurar Outros Controlos,Personalizare scheme de control diverse,Прочие клавиши,Друге контроле +Weapons,CNTRLMNU_WEAPONS,,,,Zbraně,Waffen,,Armiloj,Armas,,Aseet,Armes,Fegyverek,Armi,武器,무기,Wapens,Bronie,Armas,,Arme,Оружие,Оружје +Next weapon,CNTRLMNU_NEXTWEAPON,,,,Další zbraň,Nächste Waffe,,Proksima armilo,Arma siguiente,,Seuraava ase,Arme Suivante,Következő fegyver,Arma successiva,次の武器,다음 무기,Volgende wapen,Następna broń,Próxima arma,,Arma următoare,Следующее оружие,Следеће оружје +Previous weapon,CNTRLMNU_PREVIOUSWEAPON,,,,Předchozí zbraň,Vorherige Waffe,,Antaŭa armilo,Arma anterior,,Edellinen ase,Arme Précédente,Előző fegyver,Arma precedente,前の武器,이전 무기,Vorige wapen,Poprzednia broń,Arma anterior,,Arma anterioară,Предыдущее оружие,Претходно оружје +Weapon 1,CNTRLMNU_SLOT1,Todo - make game specific,,,Slot zbraně 1,Waffe 1,,Armingo 1,Ranura de Arma 1,,Aselokero 1,Emplacement D'Arme 1,1. Fegyver,Slot arma 1,武器スロット 1,무기 슬롯 1,Wapenslot 1,Broń 1,Arma 1,,Arma 1,Оружие 1,Оружје 1 +Weapon 2,CNTRLMNU_SLOT2,"only show appropriate slots per game +",,,Slot zbraně 2,Waffe 2,,Armingo 2,Ranura de Arma 2,,Aselokero 2,Emplacement D'Arme 2,2. Fegyver,Slot arma 2,武器スロット 2,무기 슬롯 2,Wapenslot 2,Broń 2,Arma 2,,Arma 2,Оружие 2,Оружје 2 +Weapon 3,CNTRLMNU_SLOT3,,,,Slot zbraně 3,Waffe 3,,Armingo 3,Ranura de Arma 3,,Aselokero 3,Emplacement D'Arme 3,3. Fegyver,Slot arma 3,武器スロット 3,무기 슬롯 3,Wapenslot 3,Broń 3,Arma 3,,Arma 3,Оружие 3,Оружје 3 +Weapon 4,CNTRLMNU_SLOT4,,,,Slot zbraně 4,Waffe 4,,Armingo 4,Ranura de Arma 4,,Aselokero 4,Emplacement D'Arme 4,4. Fegyver,Slot arma 4,武器スロット 4,무기 슬롯 4,Wapenslot 4,Broń 4,Arma 4,,Arma 4,Оружие 4,Оружје 4 +Weapon 5,CNTRLMNU_SLOT5,,,,Slot zbraně 5,Waffe 5,,Armingo 5,Ranura de Arma 5,,Aselokero 5,Emplacement D'Arme 5,5. Fegyver,Slot arma 5,武器スロット 5,무기 슬롯 5,Wapenslot 5,Broń 5,Arma 5,,Arma 5,Оружие 5,Оружје 5 +Weapon 6,CNTRLMNU_SLOT6,,,,Slot zbraně 6,Waffe 6,,Armingo 6,Ranura de Arma 6,,Aselokero 6,Emplacement D'Arme 6,6. Fegyver,Slot arma 6,武器スロット 6,무기 슬롯 6,Wapenslot 6,Broń 6,Arma 6,,Arma 6,Оружие 6,Оружје 6 +Weapon 7,CNTRLMNU_SLOT7,,,,Slot zbraně 7,Waffe 7,,Armingo 7,Ranura de Arma 7,,Aselokero 7,Emplacement D'Arme 7,7. Fegyver,Slot arma 7,武器スロット 7,무기 슬롯 7,Wapenslot 7,Broń 7,Arma 7,,Arma 7,Оружие 7,Оружје 7 +Weapon 8,CNTRLMNU_SLOT8,,,,Slot zbraně 8,Waffe 8,,Armingo 8,Ranura de Arma 8,,Aselokero 8,Emplacement D'Arme 8,8. Fegyver,Slot arma 8,武器スロット 8,무기 슬롯 8,Wapenslot 8,Broń 8,Arma 8,,Arma 8,Оружие 8,Оружје 8 +Weapon 9,CNTRLMNU_SLOT9,,,,Slot zbraně 9,Waffe 9,,Armingo 9,Ranura de Arma 9,,Aselokero 9,Emplacement D'Arme 9,9. Fegyver,Slot arma 9,武器スロット 9,무기 슬롯 9,Wapenslot 9,Broń 9,Arma 9,,Arma 9,Оружие 9,Оружје 9 +Weapon 10,CNTRLMNU_SLOT0,,,,Slot zbraně 10,Waffe 10,,Armingo 0,Ranura de Arma 0,,Aselokero 0,Emplacement D'Arme 0,0. Fegyver,Slot arma 0,武器スロット 0,무기 슬롯 0,Wapenslot 0,Broń 10,Arma 0,,Arma 0,Оружие 0,Оружје 0 +Inventory,CNTRLMNU_INVENTORY,,,,Inventář,Inventar,,Inventaro,Inventario,,Varusteet,Inventaire,Eszköztár beállítások testreszabása,Inventario,所持品,인벤토리,Inventaris,Ekwipunek,Inventário,,Inventar,Инвентарь,Инвентар +Activate item,CNTRLMNU_USEITEM,,,,Aktivovat předmět,Gegenstand aktivieren,,Aktivigi aĵon,Activar objeto,,Aktivoi varuste,Activer objet,Eszköz használata,Attiva oggetto,アイテムを使用,선택한 아이템 사용,Item activeren,Użyj przedmiot,Ativar item,,Activează obiectul,Использовать предмет,Активирај предмет +Activate all items,CNTRLMNU_USEALLITEMS,,,,Aktivovat všechny předměty,Alle Gegenstände aktivieren,,Aktivigi ĉiuj aĵojn,Activar todos los objetos,,Aktivoi kaikki varusteet,Activer tous les objets,Minden eszköz használata,Attiva tutti gli oggetti,全てのアイテムを使用,모든 아이템 사용,Activeer alle items,Użyj wszystkie przedmioty,Ativar todos os itens,,Activează tot inventarul,Использовать все предметы,Активирај све предмете +Next item,CNTRLMNU_NEXTITEM,,,,Další předmět,Nächster Gegenstand,,Proksima aĵo,Objeto siguiente,,Seuraava varuste,Objet suivant,Következő eszköz,Oggetto successivo,次のアイテム,다음 아이템,Volgende item,Następny przedmiot,Próximo item,,Următorul obiect,Следующий предмет,Следећи предмет +Previous item,CNTRLMNU_PREVIOUSITEM,,,,Předchozí předmět,Vorheriger Gegenstand,,Antaŭa aĵo,Objeto anterior,,Edellinen varuste,Objet précédent,Előző eszköz,Oggetto precedente,前のアイテム,이전 아이템,Vorige item,Poprzedni przedmiot,Item anterior,,Obiect anterior,Предыдущий предмет,Претходни предмет +Customize Map Controls,MAPCNTRLMNU_TITLE,most are not used yet but will be,,,Nastavení ovládání mapy,Automapsteuerung einstellen,,Agordi mapregilojn,Controles del mapa,,Kartanohjausasetukset,Contrôles Carte,,Personalizza i controlli mappa,マップコントロール カスタマイズ,미니맵 단축키 설정,Kaartcontroles aanpassen,Ustaw klawisze mapy,Configurar comandos de mapa,,Personalizare schemă de control a hărții,Клавиши управления автокартой,Промени контроле мапе +Map Controls,MAPCNTRLMNU_CONTROLS,,,,Ovládání mapy,Automapsteuerung,,Mapregilojn,Controles del mapa,,Kartanohjaus,Contrôles de la carte,,Controlli mappa,マップコントロール,미니맵 조정,Kaartcontroles,Klawisze mapy,Comandos de mapa,,Schemă de control a hărtii,Автокарта,Контроле мапе +Pan left,MAPCNTRLMNU_PANLEFT,,,,Posun vlevo,Nach links,,Alturni maldekstren,Mover a la izquierda,,Panoroi vasemmalle,Aller à gauche,,Sposta a sinistra,左に振る,왼쪽으로 이동,Pan links,Przesuń w lewo,Mover para a esquerda,,Mutare spre stânga,Сдвиг влево,Лево +Pan right,MAPCNTRLMNU_PANRIGHT,,,,Posun vpravo,Nach rechts,,Alturni dekstren,Mover a la derecha,,Panoroi oikealle,Aller à droite,,Sposta a destra,右に振る,오른쪽으로 이동,Pan rechts,Przesuń w prawo,Mover para a direita,,Mutare spre dreapta,Сдвиг вправо,Десно +Pan up,MAPCNTRLMNU_PANUP,,,,Posun nahoru,Nach oben,,Alturni supren,Mover hacia arriba,,Panoroi ylös,Aller en haut,,Sposta sopra,上に振る,위쪽으로 이동,Pan omhoog,Przesuń w górę,Mover para cima,,Mutare în sus,Сдвиг вверх,Горе +Pan down,MAPCNTRLMNU_PANDOWN,,,,Posun dolů,Nach unten,,Alturni malsupren,Mover hacia abajo,,Panoroi alas,Aller en bas,,Sposta sotto,下に振る,아래쪽으로 이동,Pan neer,Przesuń w dół,Mover para baixo,,Mutare în jos,Сдвиг вниз,Доле +Zoom in,MAPCNTRLMNU_ZOOMIN,,,,Přiblížit,Reinzoomen,,Zomi,Acercar,,Lähennä,Zoom avant,,Ingrandisci,ズームイン,줌 확대,Inzoomen,Przybliż,Ampliar,,Apropriere Cameră,Увеличить масштаб,Увеличати +Zoom out,MAPCNTRLMNU_ZOOMOUT,,,,Oddálit,Rauszoomen,,Malzomi,Alejar,,Loitonna,Zoom arrière,,Rimpicciolisci,ズームアウト,줌 축소,Uitzoomen,Oddal,Diminuir,,Depărtare Cameră,Уменьшить масштаб,Одзумирати +Toggle zoom,MAPCNTRLMNU_TOGGLEZOOM,,,,Zoom vyp./zap.,Zoom an/aus,,Inversigi zomon,Alternar zoom,,Zoomauksen vaihtokytkin,Alterner zoom,,Abilita/disabilita zoom,ズーム切替,표준배율 조정,Omschakelen van de zoom,Przełącz przybliżanie,Ativar zoom,,Comutator Zoom,Переключить зум,Укључи зум +Toggle follow,MAPCNTRLMNU_TOGGLEFOLLOW,,,,Následování hráče vyp./zap.,Folgen an/aus,,Aktivigi sekvon,Alternar seguimiento,,Seuraamistilan vaihtokytkin,Alterner suivi,,Abilita/disabilita scorrimento mappa,追従切替,추적모드 조정,Schakelen volgen,Przełącz śledzenie,Ativar seguimento,,Comutator urmărire jucător,Переключить привязку к игроку,Укључи праћење +Toggle grid,MAPCNTRLMNU_TOGGLEGRID,,,,Mřížka vyp./zap.,Gitter an/aus,,Aktivigi kradon,Alternar cuadrícula,Alternar rejilla,Ruudukon vaihtokytkin,Alterner grille,,Abilita/disabilita la griglia,グリッド切替,그리드 조정,Kiesnet,Przełącz siatkę,Ativar grade,,Comutator grilă,Переключить сетку,Укључи координатну мрежу +Toggle rotate,MAPCNTRLMNU_ROTATE,,,,,Rotation an/aus,,,,,Kääntämisen vaihtokytkin,,,,,,,,,,,, +Toggle texture,MAPCNTRLMNU_TOGGLETEXTURE,,,,Textury vyp./zap.,Texturen an/aus,,Akitvigi teksturon,Alternar textura,,Pintakuvioinnin vaihtokytkin,Alterner texture,,Abilita/disabilita le texture,テクスチャ切替,미니맵 텍스쳐 조정,Toggle textuur,Przełącz tekstury,Ativar texturas,,Comutator mod texturat,Переключить текстуры,Укључи текстуру +Toggle automap,CNTRLMNU_AUTOMAP,,,,Zap. / Vyp. automapu,Automap an/aus,,Baskuligi aŭtomapo,Alternar automapa,,Kytke automaattikartta päälle/pois,Activer Carte,Térkép ki- bekapcsolása,Toggle automappa,オートマップの切替,오토맵 조정,Automap aan/uit,Włącz mapę,Ativar automapa,,Comutator hartă computerizată,Открыть автокарту,Прикажи аутомапу +Chasecam,CNTRLMNU_CHASECAM,,,,Kamera z třetí osoby,Verfolgerkamera,,Ĉaskamerao,Cámara de Seguimiento,,Seurantakamera,Caméra 3ième personne,Külsőnézetű kamera,Telecamera di inseguimento,背後視点,3인칭 카메라,,Kamera Śledzenia,Câmera de terceira-pessoa,Câmera em terceira-pessoa,Cameră urmăritoare,Вид от 3-го лица (Chasecam),Чејс-кем +Screenshot,CNTRLMNU_SCREENSHOT,,,,Pořídit snímek obrazovky,,,Ekranfoto,Captura de pantalla,,Kuvakaappaus,Capture d'écran,Képernyő lefényképezése,Cattura schermo,画面キャプチャ,스크린샷,,Zrzut ekranu,Captura de tela,,Captură ecran,Скриншот,Усликај +Open console,CNTRLMNU_CONSOLE,,,,Otevřít konzoli,Konsole öffnen,,Malfermi konzolon,Abrir consola,,Avaa konsoli,Ouvrir Console,Konzol előhozása,Apri la console,コンソールを開く,콘솔 열기,Open console,Otwórz konsolę,Abrir console,Abrir consola,Deschide consola,Открыть консоль,Отвори консолу +Pause,CNTRLMNU_PAUSE,,,,Pauza,,,Paŭzo,Pausa,,Tauko,,Szünet,Pausa,ポーズ,일시정지,Pauze,Pauza,Pausa,,Pauză,Пауза,Пауза +Increase Display Size,CNTRLMNU_DISPLAY_INC,,,,Zvětšit velikost displeje,Anzeige vergrößern,,Pligrandigi Ekranamplekson,Agrandar Ventana,,Suurenna näytön kokoa,Agrandir l'affichage,Képméret növelése,Incrementa la dimensione del display,画面サイズを拡大,화면 크기 늘리기,Vergroot het display,Powiększ Rozmiar Wyświetlania,Aumentar Tamanho de Tela,Aumentar Tamanho do Ecrã,Mărire ecran,Увеличить размер экрана,Повећајте величину екрана +Decrease Display Size,CNTRLMNU_DISPLAY_DEC,,,,Zmenšit velikost displeje,Anzeige verkleinern,,Plimalgrandigi Ekranamplekson,Reducir Ventana,,Pienennä näytön kokoa,Réduire l'affichage,Képméret csökkentése,Decrementa la dimensione del display,画面サイズを縮小,화면 크기 줄이기,Verlaag het display,Pomniejsz Rozmiar Wyświetlania,Diminuir Tamanho de Tela,Diminuir Tamanho do Ecrã,Micșorare ecran,Уменьшить размер экрана,Смањите величину екрана +Open Help,CNTRLMNU_OPEN_HELP,,,,Otevřít nápovědu,Hilfe öffnen,,Malfermi Helpon,Abrir Ayuda,,Avaa ohje,Ouvrir Aide,Segítség előhozása,Apri l'aiuto,"ヘルプを開く +",도움말 열기,Open hulp,Otwórz Pomoc,Abrir Ajuda,,Deschide Ajutor,Экран помощи,Отвори помоћ +Open Save Menu,CNTRLMNU_OPEN_SAVE,,,,Otevřít menu pro uložení,Speichermenü öffnen,,Malfermi Konservmenuon,Menú de Guardar Partida,,Avaa tallennusvalikko,Ouvrir Menu Sauvegarde,Mentés menü előhozása,Apri il menu di salvataggio,セーブメニューを開く,저장 화면 열기,Menu opslaan openen,Otwórz Menu Zapisu,Abrir Menu de Salvar,Abrir Menu de Gravação,Deschide meniul de salvare,Сохранение игры,Отвори сачуване игре +Open Load Menu,CNTRLMNU_OPEN_LOAD,,,,Otevřít menu pro načtení,Lademenü öffnen,,Malfermi Ŝarĝmenuon,Menú de Cargar Partida,,Avaa latausvalikko,Ouvrir Menu Chargement,Betöltés menü előhozása,Apri il menu di caricamento,ロードメニューを開く,불러오기 화면 열기,Menu laden openen,Otwórz Menu Wczytania,Abrir Menu de Carregar,,Deschide meniul de încărcare,Загрузка игры,Отвори игре за учитати +Open Options Menu,CNTRLMNU_OPEN_OPTIONS,,,,Otevřít nastavení,Optionsmenü öffnen,,Malfermi Agordmenuon,Menú de Opciones,,Avaa asetusvalikko,Ouvrir Menu Options,Beállítások menü előhozása,Apri il menu delle opzioni,オプションメニューを開く,설정 화면 열기,Menu Opties openen,Otwórz Menu Opcji,Abrir Menu de Opções,,Deschide setările,Главное меню настроек,Отвори мени опција +Open Display Menu,CNTRLMNU_OPEN_DISPLAY,,,,Otevřít nastavení grafiky,Anzeigemenü öffnen,,Malfermi Ekranmenuon,Menú de Opciones de Visualización,,Avaa näyttövalikko,Ouvrir Menu Affichage,Megjelenítés menü előhozása,Apri il menu del display,ディスプレイメニューを開く,디스플레이 화면 열기,Displaymenu openen,Otwórz Menu Wyświetlania,Abrir Menu de Vídeo,,Deschide setările de afișare,Меню настроек видео,Отвори мени приказа +Quicksave,CNTRLMNU_QUICKSAVE,,,,Rychlé uložení,Schnellspeichern,,Rapidkonservo,Guardado Rápido,,Pikatallenna,Sauv. Rapide,Gyorsmentés,Salvataggio rapido,クイックセーブ,빠른 저장,Snel opslaan,Szybki Zapis,Salvamento rápido,Gravação rápida,Salvare rapidă,Быстрое сохранение,Брзо-сачувај +Quickload,CNTRLMNU_QUICKLOAD,,,,Rychlé načtení,Schnellladen,,Rapidŝarĝo,Cargado Rápido,,Pikalataa,Charg. Rapide,Gyors betöltés,Caricamento rapido,クイックロード,빠른 불러오기,Snel laden,Szybkie Wczytanie,Carregamento rápido,,Încărcare rapidă,Быстрая загрузка,Брзо-учитај +Exit to Main Menu,CNTRLMNU_EXIT_TO_MAIN,,,,Odejít do hlavního menu,Zurück zum Hauptmenü,,Eliri al Ĉefa Menuo,Salir al Menú Principal,,Poistu päävalikkoon,Sortie Menu Principal,Kilépés a főmenübe,Esci dal menu principale,メインメニューに戻る,메뉴로 나오기,Afsluiten naar het hoofdmenu,Wyjdź do Głównego Menu,Sair para o Menu Principal,,Revenire la meniul principal,Выход в главное меню,Изађи у главни мени +Toggle Messages,CNTRLMNU_TOGGLE_MESSAGES,,,,Zap. / Vyp. zprávy,Nachrichten an/aus,,Baskuligi Mensaĝojn,Alternar Mensajes,,Kytke viestit päälle tai pois,Act./Déasct. Messages,Üzenetek kapcsololása,Toggle messaggi,メッセージ表示の切替,메시지 토글,Berichten aan/uit,Włącz / Wyłącz Wiadomości,Ativar Mensagens,,Comutator mesaje,Переключение сообщений,Таглави поруке +Quit Game,CNTRLMNU_MENU_QUIT,,,,Odejít ze hry,Spiel beenden,,Ĉesigi Ludon,Salir del Juego,,Lopeta peli,Quitter le Jeu,Kilépés a játékból.,Esci dal gioco,ゲームを終了,게임 종료,Stop het spel,Wyjdź z Gry,Sair do Jogo,,Ieși din Joc,Выход,Изађи из игре +Adjust Gamma,CNTRLMNU_ADJUST_GAMMA,,,,Nastavit gamu,Gamma-Anpassung,,Agordi Gamaon,Ajustar Gamma,,Säädä gammaa,Ajuster Gamma,Gamma állítása,Aggiustamento Gamma,ガンマ値を調整,감마 조정,Gamma aanpassen,Dostosuj Gammę,Ajustar Gama,,Ajustare gamma,Настройка гаммы,Подесите осветљење +,,Mouse,,,,,,,,,,,,,,,,,,,,, +Mouse Options,MOUSEMNU_TITLE,,,,Nastavení myši,Mausoptionen,,Musilagordoj,Opciones del Ratón,,Hiiriasetukset,Options Souris,Egér beállítások,Opzioni Mouse,マウス オプション,마우스 설정,Muis opties,Opcje Myszki,Opções de mouse,Opções do rato,Setări mouse,Настройки мыши,Миш +Enable mouse,MOUSEMNU_ENABLEMOUSE,,,,Povolit myš,Maus aktiv,,Aktivigi muson,Habilitar ratón,,Ota hiiri käyttöön,Activer Souris,Egér engedélyezése,Abilita il mouse,マウスの使用,마우스 사용,Muis inschakelen,Włącz myszkę,Habilitar mouse,Permitir uso do rato,Activare mouse,Использовать мышь,Укључи миш +Enable mouse in menus,MOUSEMNU_MOUSEINMENU,,,,Povolit myš v nabídkách,Maus aktiv in Menüs,,Aktivigi muson en menuoj,Usa ratón en los menús,,Ota hiiri käyttöön valikoissa,Activer Souris dans les Menus,Egér engedélyezése a menüben.,Abilita il mouse nei menu,メニューでのマウスの使用,메뉴에서 마우스 사용,Muis in menu's inschakelen,Włącz myszkę w menu,Habilitar mouse nos menus,Permitir rato nos menus,Activare mouse în meniuri,Использовать мышь в меню,Укључи миш у менијима +Show back button,MOUSEMNU_SHOWBACKBUTTON,,,,Zobrazit tlačítko zpět,Zeige Zurück-Knopf,,Montri antaŭklavon,Botón de retroceso,,Näytä taaksenäppäin,Afficher le bouton retour,Vissza gomb mutatása,Mostra il bottone per tornare indietro,戻るボタンを表示,뒤로가기 버튼 보이기,Toon terug knop,Pokaż przycisk powrotu,Mostrar botão de voltar,,Afișare buton de întoarcere,Расположение кнопки «назад»,Прикажи тастер за назад +Cursor,MOUSEMNU_CURSOR,,,,Kurzor,,,Musmontrilo,,,Osoitin,Curseur,Egérmutató,Cursore,カーソル,커서,,Kursor,,,,Курсор,Курсор +Horizontal sensitivity,MOUSEMNU_SENSITIVITY_X,,,,Horizontální citlivost,Horizontale Empfindlichkeit,Οριζόντια ευαισθησία,Horizontala sentemo,Sensibilidad horizontal,,Vaakasuuntainen herkkyys,Sensibilité horizontale,Vízszintes érzékenység,Sensibilità orizzontale,水平感度,수평 감도,Horizontale gevoeligheid,Czułość pozioma,Sensibilidade horizontal,,Sensibilitate orizontală,Горизонтальная чувствительность,Хоризонтална осетљивост +Vertical sensitivity,MOUSEMNU_SENSITIVITY_Y,,,,Vertikální citlivost,Vertikale Empfindlichkeit,Κάθετη ευαισθησία,Vertikala sentemo,Sensibilidad vertical,,Pystysuuntainen herkkyys,Sensibilité verticale,Függőleges érzékenység,Sensibilità verticale,垂直感度,수직 감도,Verticale gevoeligheid,Czułość pionowa,Sensibilidade vertical,,Sensibilitate verticală,Вертикальная чувствительность,Вертикална осетљивост +Smooth mouse movement,MOUSEMNU_SMOOTHMOUSE,,,,Vyhladit pohyb myši,Mausbewegung glätten,,Glata musmovo,Mov. fluido del ratón,,Sulava hiiren liike,Lissage Souris,Egyenletes egérmozdulatok,Movimento del mouse liscio,マウス操作を滑らかにする,부드러운 움직임,Vlotte muisbeweging,Gładki ruch myszki,Movimento fluído do mouse,Movimento fluído do rato,Mișcare mouse fină,Плавное перемещение,Глатки окрет +Turning speed,MOUSEMNU_TURNSPEED,,,,Rychlost otáčení,Umdrehgeschwindigkeit,,Turnorapido,Velocidad de giro,,Kääntymisnopeus,Vitesse pour tourner,Fordulási sebesség,Velocità di rotazione,旋回速度,회전 속도,Draaisnelheid,Szybkość obracania się,Velocidade de giro,,Viteză rotire,Скорость поворота,Брзина окрета +Mouselook speed,MOUSEMNU_MOUSELOOKSPEED,,,,Rychlost pohledu nahoru/dolů,Mausblick-Geschwindigkeit,,Musrigarda rapido.,Veloc. de vista con ratón,,Katselunopeus,Vitesse Vue Souris,Egérrel való nézés sebessége,Velocità di rotazione della vista,上下視点速度,마우스룩 속도,Mouselook snelheid,Szybkość rozglądania się myszką,Velocidade de vista com mouse,Velocidade de vista com rato,Viteză privire în jur cu mouse,Скорость обзора,Брзина гледања мишем +Forward/Backward speed,MOUSEMNU_FORWBACKSPEED,,,,Rychlost pohybu vpřed/vzad,Vor/Rückwärtsgeschwindigkeit,,Antaŭa/Malantaŭa rapido,Veloc. de avance/retroceso,,Eteen-/taaksepäin liikkeen nopeus,Vitesse Avancer/reculer,Előre/Hátra sebesség,Velocità avanti/indietro,"前進/後退速度 +",전진/후진 속도,Voorwaartse/achterwaartse snelheid,Szybkość chodzenia do przodu/do tyłu,Velocidade de deslocamento para frente/trás,,Viteză deplasare față/spate,Скорость передвижения,Брзина окрета напред/уназад +Strafing speed,MOUSEMNU_STRAFESPEED,,,,Rychlost pohybu do stran,Seitwärtsgeschwindigkeit,,Flankmova rapido,Veloc. de mov. lateral,,Sivuttaisastunnan nopeus,Vitesse Gauche/Droite,,Velocità movimento laterale,横移動速度,좌진/우진 속도,Zijdelings snelheid,Szybkość uników,Velocidade de deslocamento lateral,,Viteză deplasare în diagonală,Скорость движения боком,Брзина стрејфа +Always Mouselook,MOUSEMNU_ALWAYSMOUSELOOK,,,,Vždy se rozhlížet myší,Mausblick immer an,,Ĉiam Musrigardo,Siempre mirar con ratón,,Jatkuva hiirikatselu,Toujours vue Souris,Mindig nézelődés az egérrel,Vista col mouse,常に上下視点をオン,마우스룩 사용,Altijd Mouselook,Zawsze zezwalaj na rozglądanie się myszką,Vista com mouse sempre ligado,Vista com rato sempre ligada,Privire în jur cu mouse permanentă,Обзор мышью,Гледање мишем +Invert Mouse Y,MOUSEMNU_INVERTMOUSE,,,,Inverzní myš Y,Maus Y invertieren,,Inversa Muso Y,Invertir ratón Y,,Käännä hiiri Y,Inverser Souris Y,Egérirányok megfordítása Y,Mouse Y invertito,視点操作反転,마우스 방향 전환,Muis-Y-as omkeren,Odwróć Myszkę Y,Inverter mouse Y,Inverter rato,Inversare axe mouse Y,Инвертирование мыши Y,Инвертуј миш Y +Invert Mouse X,MOUSEMNU_INVERTMOUSEX,,,,Inverzní myš X,Maus X invertieren,,Inversa Muso X,Invertir ratón X,,Käännä hiiri X,Inverser Souris X,Egérirányok megfordítása X,Mouse X invertito,視点操作反転,마우스 방향 전환,Muis-X-as omkeren,Odwróć Myszkę X,Inverter mouse X,Inverter rato X,Inversare axe mouse X,Инвертирование мыши X,Инвертуј миш X +Upper left,OPTVAL_UPPERLEFT,,,,Vlevo nahoře,Oben links,,Supra maldekstre,Sup. izquierda,,Ylävasemmalla,Supérieur gauche,,Superiore sinistro,左上,왼쪽 위,Linksboven,Lewy górny róg,Esquerda superior,,Stânga sus,Вверху слева,Горње лево +Upper right,OPTVAL_UPPERRIGHT,,,,Vpravo nahoře,Oben rechts,,Supra dekstre,Sup. derecha,,Yläoikealla,Supérieur droite,,Superiore destro,右上,오른쪽 위,Rechtsboven,Prawy górny róg,Direita superior,,Dreapta sus,Вверху справа,Горње десно +Lower left,OPTVAL_LOWERLEFT,,,,Vlevo dole,Unten links ,,Suba maldekstre,Inf. izquierda,,Alavasemmalla,Inférieur gauche,,Inferiore sinistro,左下,왼쪽 밑,Linksonder,Lewy dolny róg,Esquerda inferior,,Stânga jos,Внизу слева,Доње лево +Lower right,OPTVAL_LOWERRIGHT,,,,Vpravo dole,Unten rechts,,Suba dekstre,Inf. derecha,,Alaoikealla,Inférieur droite,,Inferiore destro,右下,오른쪽 밑,Rechtsonder,Prawy dolny róg,Direita inferior,,Dreapta jos,Внизу справа,Доње десно +Touchscreen-like,OPTVAL_TOUCHSCREENLIKE,,,,Jako dotyková obrazovka,Wie auf einem Touchscreen,,Tuŝekrana,Pant. táctil,,Kosketusnäyttömäinen,Style écran tactile,,Come il Touchscreen,タッチスクリーン式,터치스크린 같게,Touchscreen-achtige,Jak ekrean dotykowy,Estilo touchscreen,,Precum touchscreen,Как сенсорный экран,Као додирни екран +Simple arrow,OPTSTR_SIMPLEARROW,,,,Jednoduchý kurzor,Einfacher Pfeil,,Simpla sago,Flecha simple,,Yksinkertainen nuoli,Flèche simple,,Freccia semplice,シンプル,기본 커서,Eenvoudige pijl,Prosta strzałka,Flecha simples,Cursor simples,Săgeată simplă,Стрелка,Стрелица +System cursor,OPTSTR_SYSTEMCURSOR,,,,Systémový kurzor,Systemcursor,,Sistema kursoro,Cursor del sistema,,Järjestelmän osoitin,Curseur Système,,Cursore di sistema,システム,시스템 커서,Systeemcursor,Kursor systemu,Cursor do sistema,,Cursor simplu,Системный курсор,Системска стрелица +Default,OPTVAL_DEFAULT,,,,Výchozí,Standard,,Defaŭlte,Por defecto,,Oletus,Défaut,,,デフォルト,기본 설정,Standaard,Domyślne,Padrão,,Implicit,По умолчанию,Подраз. +,,Controller,,,,,,,,,,,,,,,,,,,,, +Configure Controller,JOYMNU_TITLE,,,,Konfigurovat ovladač,Controller konfigurieren,,Agordi Ludregilon,Configurar Mando,,Peliohjainasetukset,Configurer Mannette,Kontroller testreszabása,Configura il controller,コントローラー構成:,컨트롤러 구성,Controller configureren,Konfiguruj Kontroler,Configurar Controle,Configurar Comando,Configurare controller,Настроить контроллер,Конфигурација контролера +Controller Options,JOYMNU_OPTIONS,,,,Nastavení ovladače,Controlleroptionen,,Ludregilagordoj,Opciones del mando,,Peliohjainasetukset,Options Mannette,Kontroller beállításai,Opzioni del controller,コントローラー設定,컨트롤러 설정,Controller opties,Opcje Kontrolera,Opções de Controle,Opções do Comando,Setări controller,Настройки контроллера,Подешавања контролера +Block controller input in menu,JOYMNU_NOMENU,,,,Zakázat ovladač v nabídkách,Blockiere Controllereingabe im Menü,,Blokigi ludregilon enigon en menuo,Bloq. entrada de mando en menú,,Estä ohjainsyötteet valikoissa,Bloquer manette dans les menus,Kontroller ne működjön a menüben,Blocca l'input del controller nei menu,メニューではコントローラーを無視,메뉴에서 컨트롤러 끄기,Blokkeer de controller in het menu,Blokuj wejście kontrolera w menu,Bloquear controle no menu,Bloquear comando no menu,Blocare comenzi controller în meniu,Отключить контроллер в меню,Блокирај улаз контролера у менију +Enable controller support,JOYMNU_ENABLE,,,,Povolit podporu pro ovladače,Erlaube Controllerunterstützung,,Aktivigi ludregilsubtenon,Activar soporte de mandos,,Ota käyttöön peliohjaintuki,Activer support contrôleur,,Abilita il supporto del controller,コントローラーサポート許可,컨트롤러 지원 허용,Controllerondersteuning inschakelen,Włącz wsparcie kontrolera,Habilitar suporte de controles,,Activare support controller,Включить поддержку контроллера,Омогући подршку за контролере +Enable DirectInput controllers,JOYMNU_DINPUT,,,,Povolit ovladače DirectInput,Erlaube DirectInput-Controller,,Aktivigi DirectInput ludregilojn,Usa controles DirectInput,,Ota käyttöön DirectInput-ohjaimet,Activer contrôleurs DirectInput,,Abilita i controlli DirectInput,ダイレクトインプットコントローラー許可,다이렉트 인풋 컨트롤러 허용,DirectInput-controllers inschakelen,Włącz kontrolery DirectInput,Habilitar controles DirectInput,,Activare controlere DirectInput,Включить контроллеры DirectInput,Омогући директинпут контролере +Enable XInput controllers,JOYMNU_XINPUT,,,,Povolit ovladače XInput,Erlaube XInput-Controller,,Aktivigi XInput ludregilojn,Usa controles XInput,,Ota käyttöön XInput-ohjaimet,Activer contrôleurs XInput,,Abilita i controlli XInput,Xinput コントローラー許可,X인풋 컨트롤러 허용,XInput-controllers inschakelen,Włącz kontrolery XInput,Habilitar controles XInput,,Activare controlere XInput,Включить контроллеры XInput,Омогући Иксинпут контролере +Enable raw PlayStation 2 adapters,JOYMNU_PS2,,,,Povolit ovladače PlayStation 2,Erlaube Playstation 2-Controller,,Aktivigi krudajn PlayStation 2 adaptilojn,Usa adaptadores de PlayStation 2,,Ota käyttöön raa'at PlayStation 2 -adapterit,Activer adaptateurs PS2 bruts,,Abilita gli adattatori raw PlayStation 2,PlayStation2 アダプター許可,PS2 어뎁터 허용,Raw PlayStation 2-adapters inschakelen,Włącz adaptery PlayStation 2,Habilitar adaptadores de PlayStation 2,,Activare adaptoare PS2,Использовать адаптеры PlayStation 2 напрямую,Омогући сирове Плејстејшн 2 адаптере +No controllers detected,JOYMNU_NOCON,,,,Nenalezeny žádné ovladače,Keine Controller gefunden,,Neniu ludregilojn detektas,No hay mandos detectados,,Ei havaittuja ohjaimia,Aucun Contrôleur détecté.,,Nessun controller trovato,コントローラーが見つかりません,인식된 컨트롤러 없음,Geen controllers gedetecteerd,Nie wykryto kontrolerów,Nenhum controle detectado,Nenhum comando foi detectado,Niciun controller detectat,Контроллеры не обнаружены,Нема детектованих контролера +Configure controllers:,JOYMNU_CONFIG,,,,Nastavit ovladače:,Controller konfigurieren,,Agordi ludregilojn:,Configurar controles:,,Mukauta ohjaimia:,Configurer contrôleurs:,,Configura i controller:,コントローラー構成:,컨트롤러 설정:,Configureer controllers:,Konfiguruj kontrolery:,Configurar controles:,Configurar comandos,Configurare controlere:,Настроить контроллер:,Подешавања контролере: +Controller support must be,JOYMNU_DISABLED1,,,,Podpora ovladačů musí být,Controllerunterstütung muss aktiviert sein,,Ludregilsubteno devas esti,El soporte de mandos debe estar,,Ohjaintuen täytyy olla otettu,Le Support de contrôleur doit être activé,,Il supporto ai controller deve essere,コントローラーサポートは,감지하려면 컨트롤러 지원을,Controller ondersteuning moet ingeschakeld zijn,Wsparcie kontrolera musi być,Suporte à controles deve ser,Suporte a comandos devem ser,Supportul pentru controller trebuie,Включите поддержку контроллера,Омогућите подржавање контролера +enabled to detect any,JOYMNU_DISABLED2,Supposed to be empty in Russian and Serbian.,,,zapnuta pro jejich detekování,um welche zu finden,,ŝaltita detekti ajn,activado para detectar alguno,,käyttöön ohjainten havaitsemiseksi,avant de pouvoir en détecter un.,,abilitato a trovare ogni,検出しました,활성화 해야합니다.,om eventuele regelaars te detecteren.,Włączony by wykryć jakikolwiek,habilitado para poder detectar algum,,activat pentru a le detecta, \n, \n +Invalid controller specified for menu,JOYMNU_INVALID,,,,Vybrán nesprávný ovladač pro nabídky,Ungültiger Controller für Menü ausgewählt,,Malprava ludregilo specifigis por menuo,Mando inválido especificado para el menú,,Epäkelpo ohjain määritetty valikolle,Contrôleur invalide spécifé dans le menu.,,Controller invalido specificato per il menu,メニューではコントローラーを使用しない,메뉴에 특정된 컨트롤러가 아닙니다.,Ongeldige regelaar gespecificeerd voor het menu,Niewłaściwy kontroler określony dla menu,Controle inválido especificado para o menu,Comando inválido,Controller pentru meniu invalid,Недопустимый контроллер выбран для меню,Невалидан контролер специфиран за мени +Overall sensitivity,JOYMNU_OVRSENS,,,,Celková citlivost,Allgemeine Empfindlichkeit,,Tutsentemeco,Sensibilidad general,,Yleisherkkyys,Sensibilité générale,,Sensibilità generale,全体的な感度,전체 민감도,Algemene gevoeligheid,Ogólna Czułość,Sensibilidade geral,,Sensibilitate în ansamblu,Общая чувствительность,Уупна сензитивност +Axis Configuration,JOYMNU_AXIS,,,,Nastavení os,Achsenkonfiguration,,Akso-agordoj,Configuración del eje,,Akseleiden säätäminen,Configuration des axes,,Configurazione assi,軸構成,축 구성,Asconfiguratie,Konfiguruj Oś,Configuração de Eixo,,Configurare axă,Конфигурация осей,Конфигурација осе +Invert,JOYMNU_INVERT,,,,Obrátit,Invertieren,,Inversigi,Invertir,,Käännä,Inverser,,Inverti,反転,순서 바꿈,Omkeren,Odwróć,Inverter,,Inversare,Инвертировать,Инвертовано +Dead zone,JOYMNU_DEADZONE,,,,Mrtvá zóna,Totzone,,Mortzono,Zona muerta,,Kuollut alue,Zone neutre,,Zona cieca,デッドゾーン,불감대,Dode zone,Martwa strefa,Zona morta,,Zonă moartă,Мёртвая зона,Мртва зона +No configurable axes,JOYMNU_NOAXES,,,,Žádné nastavitelné osy,Keine konfigurierbaren Achsen,,Neniu agordeblaj aksoj,No hay ejes configurables,,Ei säädettäviä akseleita,Aucun axe à configurer,,Nessun asse configurabile,軸構成を無効,설정할 방향키가 없습니다.,Geen configureerbare assen,Brak osi do skonfigurowania,Sem eixos configuráveis,,Nicio axă configurabilă,Нет настраиваемых осей,Нема конфигурационих оса +None,OPTVAL_NONE,,,,Žádný,Kein,,Neniu,Ninguno,,Ei mitään,Aucun,,Nessuno,無し,없음,Geen,Żaden,Nenhum,,Niciuna,Откл.,Ништа +Turning,OPTVAL_TURNING,,,,Otáčení,Umdrehen,,Turnanta,Girar,,Kääntyminen,Tourner,,Rotazione,旋回,회전,Draaien,Obracanie się,Girar,,Rotire,Поворот,Скретање +Looking Up/Down,OPTVAL_LOOKINGUPDOWN,,,,Dívání se nahoru/dolů,Hoch/runterblicken,,Rigardanta Supre/Malsupre,Mirar hacia Arriba/Abajo,,Ylös/Alas katsominen,Vue haut/bas,,Sguardo Sopra/Sotto,視点上下,위/아래로 보기,Omhoog/omlaag zoeken,Patrzenie w górę/w dół,Olhar para cima/baixo,,Privire Sus/Jos,Взгляд вверх/вниз,Гледање горе/доле +Moving Forward,OPTVAL_MOVINGFORWARD,,,,Pohyb vpřed,Vorwärtsbewegung,,Movanta Rekte,Avanzar,,Eteenpäin liikkuminen,Avancer,,Movimento in avanti,前進,앞으로 전진,Voorwaarts bewegen,Poruszanie się do przodu,Mover para a frente,,Deplasare în Față,Движение вперёд,Кретање напред +Strafing,OPTVAL_STRAFING,,,,Pohyb do stran,Seitwärtsbewegung,,Flankmovanta,Desplazarse,,Sivuttaisastunta,Pas de côté,,Movimento laterale,横移動,양옆으로 이동,Strafelen,Uniki,Deslocamento lateral,,Deplasare în Diagonală,Движение боком,Кретање у страну +Moving Up/Down,OPTVAL_MOVINGUPDOWN,,,,Pohyb nahoru/dolů,Auf/abwärtsbewegung,,Movanta Supre/Malsupre,Moverse hacia Arriba/Abajo,,Ylös/Alas liikkuminen,Mouvement haut/bas,,Movimento Sopra/Sotto,前進後退,위/아래로 이동,Naar boven/beneden bewegen,Poruszanie się w górę/w dół,Deslocar para cima/baixo,,Mișcare Sus/Jos,Движение вверх/вниз,Кретање горе/доле +Inverted,OPTVAL_INVERTED,,,,Inverzní,Invertiert,,Inversigita,Invertido,,Käännetty,Inversé,,Invertito,反転する,반전,Omgekeerd,Odwrócony,Invertido,,Inversat,Инвертировано,Обрнуто +Not Inverted,OPTVAL_NOTINVERTED,,,,Nikoliv inverzní,nicht invertiert,,Ne Inversigita,No invertido,,Ei käännetty,Non Inversé,,Non invertito,反転しない,반전되지 않음,Niet omgekeerd,Nieodwrócony,Não Invertido,,Neinversat,Прямо,Не обрнуто +,,Player Menu,,,,,,,,,,,,,,,,,,,,, +Player Setup,MNU_PLAYERSETUP,,,,Nastavení hráče,Spielereinstellungen,,Ludanto Agordaĵo,Config. del jugador,,Pelaaja-asetukset,Options Joueur,Játékos testreszabása,Settaggio giocatore,プレイヤーの特徴,플레이어 설정,Speler instellen,Ustawienia Gracza,Definições de Jogador,,Configurare jucător,Настройки игрока,Подешавања играча +Blue,TXT_COLOR_BLUE,,,,Modrá,Blau,,Blua,Azul,,Sininen,Bleu,Kék,Blu,青,청색,Blauw,Niebieski,Azul,,Albastru,Синий,Плава +Red,TXT_COLOR_RED,,,,Červená,Rot,,Ruĝa,Rojo,,Punainen,Rouge,Vörös,Rosso,赤,적색,Rood,Czerwony,Vermelho,,Roșu,Красный,Црвена +Green,TXT_COLOR_GREEN,,,,Zelená,Grün,,Verda,Verde,,Vihreä,Vert,Zöld,Verde,緑,녹색,Groen,Zielony,Verde,,Verde,Зелёный,Зелена +Gray,TXT_COLOR_GRAY,,,Grey,Šedá,Grau,,Griza,Gris,,Harmaa,Gris,Szürke,Grigio,灰,회색,Grijs,Szary,Cinza,,Gri,Серый,Сива +Dark gray,TXT_COLOR_DARKGRAY,,,"Dark grey +",Tmavě šedá,Dunkelgrau,,Grizeta,gris oscuro,,Tummanharmaa,Gris sombre,Sötétszürke,Grigio scuro,鉛,치색,Donkergrijs,Ciemnoszary,Cinza escuro,,Gri închis,Тёмно-серый,Тамно сива +Dark Green,TXT_COLOR_DARKGREEN,,,,Tmavě zelená,Dunkelgrün,,Malhelverda,Verde oscuro,,Tummanvihreä,Vert sombre,Sötétzöld,Verde scuro,深,흑녹색,Donkergroen,Ciemnozielony,Verde escuro,,Verde închis,Тёмно-зелёный,Тамна зелена +Brown,TXT_COLOR_BROWN,,,,Hnědá,Braun,,Bruna,Marrón,,Ruskea,Brun,Barna,Marrone,茶,갈색,Bruin,Brązowy,Marrom,,Maro,Коричневый,Браон +Dark Blue,TXT_COLOR_DARKBLUE,,,,Tmavě modrá,Dunkelblau,,Malhelblua,Azul oscuro,,Tummansininen,Bleu sombre,Sötétkék,Blu scuro,,,Donkerblauw,,Azul escuro,,Albastru închis,Тёмно-Синий,Тамна Плава +Light Red,TXT_COLOR_LIGHTRED,,,,Světle červená,Hellrot,,Ruĝeta,Rojo claro,,Vaaleanpunainen,Rouge clair,,Rosso chiaro,丹,옅은 적색,Licht Rood,Jasnoczerwony,Vermelho claro,,Roșu deschis,Светло-красный,Светло црвена +Yellow,TXT_COLOR_YELLOW,,,,Žlutá,Gelb,,Flava,Amarillo,,Keltainen,Jaune,Sárga,Giallo,黄,노란색,Geel,Żółty,Amarelo,,Galben,Жёлтый,Жута +Purple,TXT_COLOR_PURPLE,,,,Fialová,Violett,,Purpura,Morado,,Purppura,Violet,Lila,Viola,紫,보라색,Paars,Fioletowy,Roxo,,Mov,Фиолетовый,Љубичаста +Olive,TXT_COLOR_DULLGREEN,,,,Bledě zelená,Blassgrün,,Gris-Verda,Verde pálido,,Haaleanvihreä,Vert pâle,,Verde pallido,苔,암녹색,Saaie groen,Matowa Zieleń,Verde pálido,,Măsliniu,Мутно-зелёный,Тупа зелена +Beige,TXT_COLOR_BEIGE,,,,Béžová,,Μπέζ,Flavgriza,Beis,,Beesi,,,,淡,담갈색,Beige,Beżowy,Bege,,Bej,Бежевый,Беж +Light Green,TXT_COLOR_LIGHTGREEN,,,,Světle zelená,Hellgrün,Ανοιχτό Πράσινο,Verdeta,Verde claro,,Vaaleanvihreä,Vert clair,,Verde chiaro,葵,옅은 녹색,Licht groen,Jasonzielony,Verde claro,,Verde Deschis,Светло-зелёный,Светло зелена +Light Blue,TXT_COLOR_LIGHTBLUE,,,,Světle modrá,Hellblau,Γαλάζιο,Blueta,Azul claro,,Vaaleansininen,Bleu clair,Világoskék,Blu chiaro,空,옅은 청색,Licht blauw,Jasnoniebieski,Azul claro,,Albastru Deschis,Светло-синий,Светло плава +Light Gray,TXT_COLOR_LIGHTGRAY,,,Light Grey,Světle šedá,Hellgrau,Ανοιχτό Γκρι,Grizeta,Gris claro,,Vaaleanharmaa,Gris clair,,Grigio chiaro,鉛,옅은 회색,Lichtgrijs,Jasnoszary,Cinza claro,,Gri Deschis,Светло-серый,Светло сива +Light Brown,TXT_COLOR_LIGHTBROWN,,,,Světle hnědá,Hellbraun,Ανοιχτό Καφέ,Bruneta,Marrón claro,,Vaaleanruskea,Brun clair,,Marrone chiaro,褐,옅은 고동색,Lichtbruin,Jasnobrązowy,Marrom claro,,Maro Deschis,Светло-коричневый,Светло браон +Gold,TXT_COLOR_GOLD,,,,Zlatá,,Χρυσό,Orkolora,Dorado,,Kulta,Or,Farany,Oro,金,금색,Goud,Złoty,Dourado,,Auriu,Золотой,Златна +Bright Green,TXT_COLOR_BRIGHTGREEN,,,,Jasně zelená,Hellgrün,Φωτινό Πράσινο,Verdega,Verde claro,,Vaaleanvihreä,Vert clair,,Verde chiaro,鮮,밝은 녹색,Helder groen,Jasnozielony,Verde claro,,Verde Deschis,Ярко-зелёный,Светла зелена +Rust,TXT_COLOR_RUST,,,,Rez,Rostbraun,Σκουριά,Rustokolora,Óxido,,Ruoste,Rouille,,Arrugginito,錆,주황 적갈색,Roest,Rdzawy,Ferrugem,,Ruginiu,Ржавый,Рђа +Name,PLYRMNU_NAME,,,,Jméno,,,Nomo,Nombre,,Nimi,Nom,Név,Nome,名前,이름,Naam,Imię,Nome,,Nume,Имя,Надимак +Team,PLYRMNU_TEAM,,,,Tým,,,Teamo,Equipo,,Joukkue,Equipe,Csapat,Squadra,チーム,팀,Team,Drużyna,Equipe,Equipa,Echipă,Команда,Тим +Color,PLYRMNU_PLAYERCOLOR,,,Colour,Barva,Farbe,,Koloro,,,Väri,Couleur,Szín,Colore,色,색상,Kleur,Kolor,Cor,,Culoare,Цвет,Боја +Gender,PLYRMNU_PLAYERGENDER,,,,Pohlaví,Geschlecht,,Genro,Género,,Sukupuoli,Genre,Nem,Sesso,性別,성별,Geslacht,Płeć,Gênero,,Sex,Пол,Пол +Male,OPTVAL_MALE,,,,Muž,Männlich,,Vira (Li),Masculino,,Miespuolinen,Masculin,,Maschio,男,남성,Man,Mężczyzna,Masculino,,Masculin,Мужской,Мушко +Female,OPTVAL_FEMALE,,,,Žena,Weiblich,,Ina (Ŝi),Femenino,,Naispuolinen,Féminin,,Femmina,女,여성,Vrouw,Kobieta,Feminino,,Feminin,Женский,Женско +Neutral,OPTVAL_NEUTRAL,,,,Neutrální,Neutral,,Neŭtrala (Ri),Neutro,,Sukupuoleton,Neutre,,Neutrale,中間,중성,Neutraal,Neutralne,Neutro,,Neutru,Нейтральный,Неутрално +Object,OPTVAL_OTHER,,,,Objekt,Objekt,,Objekto (Ĝi),Objeto,,Olio,Objet,,Oggetto,物体,기타,Doel,Obiekt,Objeto,,Obiect,Предмет,Предмет +Gameplay Options,GMPLYMNU_TITLE,,,,Nastavení herních mechanik,Gameplay-Optionen,,Ludadagordoj,Opciones de jugabilidad,,Pelattavuusasetukset,Options Gameplay,,Opzioni gameplay,ゲームプレイ オプション,게임플레이 설정,Gameplay-opties,Opcje Rozgrywki,Opções de Jogabilidade,,Setări de Joc,Настройки геймплея,Подешавања гејмплеја +Always,OPTVAL_ALWAYS,,,,Vždy,Immer,,Ĉiam,Siempre,,Aina,Toujours,,Sempre,常に,언제나,Altijd,Zawsze,Sempre,,Mereu,Всегда,Увек +Never,OPTVAL_NEVER,,,,Nikdy,Nie,,Neniam,Nunca,,Ei koskaan,Jamais,,Mai,しない,없음,Nooit,Nigdy,Nunca,,Niciodată,Никогда,Никад +Autoaim,PLYRMNU_AUTOAIM,,,,Automatické míření,Automatisch zielen,,Aŭtomate-celi,Autoapuntar,,Automaattitähtäys,Auto-visée,Auto célzás,Mira automatica,自動照準,자동 조준,Autoaim,Automatyczne Celowanie,Mira Automática,,Autoțintire,Автоприцеливание,Аутоматско циљање +Always Run,PLYRMNU_ALWAYSRUN,,,,Vždy běžet,Immer Rennen,,Ĉiam Kuri,Siempre correr,,Jatkuva juoksu,Toujours courir,Mindig fusson,Corri sempre,常に駆け足,달리기 토글,Altijd lopen,Zawsze Biegaj,Sempre Correr,Correr Sempre,Fugă în permanență,Постоянный бег,Увек трчи +,,Display,,,,,,,,,,,,,,,,,,,,, +Display Options,DSPLYMNU_TITLE,,,,Nastavení grafiky,Anzeigeoptionen,,Ekranagordoj,Opciones de visualización,,Näyttöasetukset,Options Affichage,Megjelenítés beállítások,Opzioni display,ディスプレイ オプション,디스플레이 설정,Weergaveopties,Opcje Wyświetlania,Opções de Vídeo,,Setări afișare,Настройки экрана,Подешавања приказа +Screen size,DSPLYMNU_SCREENSIZE,,,,Velikost obrazovky,Bildschirmgröße,,Ekrano-grandeco,Tamaño de pantalla,,Näytön koko,Taille de l'écran,Képernyő mérete,Dimensione della schermata,画面サイズ,화면 크기,Schermgrootte,Rozmiar Ekranu,Tamanho de tela,Tamanho do ecrã,Mărime ecran,Размер экрана,Величина екрана +Vertical Sync,DSPLYMNU_VSYNC,,,,Vertikální synchronizace,Vertikale Synchronisation,,Vertikala-sinkronigo,Sincr. vertical,,Pystytahdistys,Synchronisation Verticale,Függőleges szinkronizálás,Sync verticale,垂直同期,수직 동기화,Verticale Sync,Synchronizacja Pionowa,Sincronização Vertical,,Sincronizare Verticală,Вертикальная синхронизация,Вертикална синхорнизација +Models,DSPLYMNU_MODELS,,,,Modely,Modelle,,Modeloj,Modelos,,Mallit,Modèles,3D modellek,Modelli,モデル,모델,Modellen,Modele,Modelos,,Modele,Модели,Модели +Scale crosshair,DSPLYMNU_CROSSHAIRSCALE,,,,Velikost zaměřovače,Fadenkreuz skalieren,,Skali translinion,Escalar retícula,,Skaalaa tähtäintä,Mise à l'échelle du viseur,,Scala del mirino,照準サイズ,조준점 크기,Dradenkruis schalen,Skala celownika,Escala da mira,,Scară țintă,Масштабирование прицела,Размера нишана +Brightness,DSPLYMNU_BRIGHTNESS,,,,Jas,Helligkeit,,Brileco,Brillo,,Kirkkaus,Luminosité,Fényerő,Luminosità,明るさ,밝기,Helderheid,Jasność,Brilho,,Luminozitate,Яркость,Осветљење +Gamma correction,DSPLYMNU_GAMMA,,,,Korekce gama,Gammakorrektur,,Gamaa korektado,Corrección gamma,,Gammakorjaus,Correction Gamma,,Correzione gamma,ガンマ値,감마 조정,Gamma correctie,Korekta gammy,Correção gama,,Gamma,Гамма-коррекция,Корекција светлости +Contrast,DSPLYMNU_CONTRAST,,,,Kontrast,Kontrast,,Kontrasto,Contraste,,Sävykkyys,Contraste,,Contrasto,コントラスト,대비,,Kontrast,Contraste,,,Контраст,Контраст +Saturation,DSPLYMNU_SATURATION,,,,Sytost,Sättigung,,Satureco,Saturación,,Värikylläisyys,,,Saturazione,サチュレーション,채도,Verzadiging,Nasycenie,Saturação,,Saturație,Насыщенность,Сатурација +Status Bar Scale,DSPLYMNU_SBSCALE,,,,,Statusleistengröße,,,,,Tilapalkin skaalaus,,,,,,,,Escala da Barra de Status,,Scară bară de stare,, +Messages,DSPLYMNU_MESSAGES,,,,Zprávy,Nachrichten,,Mesaĝoj,Mensajes,,Viestit,Messages,,Messaggi,メッセージ類,메시지,Berichten,Wiadomości,Mensagens,,Mesaje,Сообщения,Поруке +Center messages,MSGMNU_CENTERMESSAGES,,,Centre messages,Vycentrovat zprávy,Nachrichten zentrieren,,Centrigi mesaĝoj,Centrar mensajes,,Keskitä viestit,Messages centrés,,Messaggi centrati,メッセージを中央に,메시지 중간에 위치,Berichten centreren,Wyśrodkuj wiadomości,Centralizar mensagens,Centrar mensagens,Mesaje centrate,Центрирование сообщений,Централне поруке +Pulsating message Display,MSGMNU_PULSEMESSAGES,,,,,Pulsierende Nachrichtenanzeige,,,,,Sykkivät viestit,,,,,,,,Mostar mensagem pulsante,,Afișare Mesaje Pulsante,, +Message Scale,MSGMNU_MESSAGESCALE,,,,,Nachrichtengröße,,,,,Viestien skaalaus,,,,,,,,Escala da mensagem,,Scară Mesaje,, +,,Automap,,,,,,,,,,,,,,,,,,,,, +Select Color,MNU_COLORPICKER,,,Select Colour,Vyber barvu,Farbe auswählen,Επιλογή Χρώματος,Elektu Koloron:,Elige un color,,Valitse väri,Choisir Couleur,Szín Választás,Scegli il colore,色選択,색상을 고르시오,Selecteer Kleur,Wybierz Kolor,Selecione a Cor,,Alege o Culoare,Выбор цвета,Изабери боју +Automap Options,AUTOMAPMNU_TITLE,,,,Nastavení automapy,Automapoptionen,,Aŭtomapagordoj,Opciones del Automapa,,Automaattikartan asetukset,Options Carte,,Opzioni automappa,オートマップ オプション,오토맵 설정,Automap-opties,Opcje Mapy,Opções de Automapa,,Setări Hartă Computerizată,Настройки автокарты,Подешавања аутомапе +Rotate automap,AUTOMAPMNU_ROTATE,,,,Otáčet automapu,Rotiere Automap,,Rotacii aŭtomapon,Rotar automapa,,Kiertyvä automaattikartta,Rotation de la Carte,,Ruota l'automappa,オートマップの回転表示,오토맵 회전,Automatisch roteren,Obracaj mapę,Girar automapa,,Rotire hartă computerizată,Вращающаяся автокарта,Ротирај аутомапу +Follow player,AUTOMAPMNU_FOLLOW,,,,Následovat hráče,Folge dem Spieler,,Sekvi ludanton,Seguir jugador,,Seuraa pelaajaa,Suivre le joueur,,Segui il giocatore,プレイヤー追従,플레이어 추적,Volg de speler,Podążaj za graczem,Seguir jogador,,Urmărire jucător,Привязка к игроку,Прати играча +Customize Map Colors,MAPCOLORMNU_TITLE,,,Customize Map Colours,Nastavení barev mapy,Automapfarben einstellen,,Agordi mapkolorojn,Personalizar colores (mapa),,Värien mukautus,Couleurs Carte Personnalisées,,Personalizza i colori della mappa,カスタム色を決める,미니맵 색상 설정,Kaartkleuren aanpassen,Ustaw kolory mapy,Configurar cores de mapa,,Personalizare culori hartă,Настройки цветов автокарты,Промени боју мапе +Restore default custom colors,MAPCOLORMNU_DEFAULTMAPCOLORS,,,Restore default custom colours,Obnovit původní vlastní barvy,Standardfarben wiederherstellen,,"Restaŭri defaŭltajn, laŭmendajn kolorojn",Restaurar colores personalizados,,Palauta oletusvärit,Couleurs par défaut,,Reimposta i colori personalizzati al default,カスタム色を初期化,기본 색상으로 복구,Standaard aangepaste kleuren herstellen,Przywróć domyślne kolory,Restaurar cores padrão,,Revenire la culorile implicite,Вернуть стандартные цвета,Врати уобичајене разне боје +,,Sound,,,,,,,,,,,,,,,,,,,,, +Sound enabled,SNDMNU_SNDENABLED,,,,,Sound aktiv,,,,,Ääni päällä,,,,,,,,Som ativado,,Sunet activat,, +Music enabled,SNDMNU_MUSENABLED,,,,,Musik aktiv,,,,,Musiikki päällä,,,,,,,,Música ativada,,Muzică activată,, +4000 Hz,OPTVAL_4000HZ,,,,,,,,,,,,,,,,,,,,,4000 Гц, +8000 Hz,OPTVAL_8000HZ,,,,,,,,,,,,,,,,,,,,,8000 Гц, +11025 Hz,OPTVAL_11025HZ,,,,,,,,,,,,,,,,,,,,,11025 Гц, +22050 Hz,OPTVAL_22050HZ,,,,,,,,,,,,,,,,,,,,,22050 Гц, +32000 Hz,OPTVAL_32000HZ,,,,,,,,,,,,,,,,,,,,,32000 Гц, +44100 Hz,OPTVAL_44100HZ,,,,,,,,,,,,,,,,,,,,,44100 Гц, +48000 Hz,OPTVAL_48000HZ,,,,,,,,,,,,,,,,,,,,,48000 Гц, +64 samples,OPTVAL_64SAMPLES,,,,64 vzorků,64 Samples,,64 specimenoj,64 Muestras,,64 näytettä,,,,,64 샘플,,64 sample,64 amostras,,,64 семпла,64 узорка +128 samples,OPTVAL_128SAMPLES,,,,128 vzorků,128 Samples,,128 specimenoj,128 Muestras,,128 näytettä,,,,,128 샘플,,128 sampli,128 amostras,,,128 семплов,128 узорка +256 samples,OPTVAL_256SAMPLES,,,,256 vzorků,256 Samples,,256 specimenoj,256 Muestras,,256 näytettä,,,,,256 샘플,,256 sampli,256 amostras,,,256 семплов,256 узорка +512 samples,OPTVAL_512SAMPLES,,,,512 vzorků,512 Samples,,512 specimenoj,512 Muestras,,512 näytettä,,,,,512 샘플,,512 sampli,512 amostras,,,512 семплов,512 узорка +1024 samples,OPTVAL_1024SAMPLES,,,,1024 vzorků,1024 Samples,,1024 specimenoj,1024 Muestras,,1024 näytettä,,,,,1024 샘플,,1024 sampli,1024 amostras,,,1024 семпла,1024 узорка +2048 samples,OPTVAL_2048SAMPLES,,,,2048 vzorků,2048 Samples,,2048 specimenoj,2048 Muestras,,2048 näytettä,,,,,2048 샘플,,2048 sampli,2048 amostras,,,2048 семплов,2048 узорка +4096 samples,OPTVAL_4096SAMPLES,,,,4096 vzorků,4096 Samples,,4096 specimenoj,4096 Muestras,,4096 näytettä,,,,,4096 샘플,,4096 sampli,4096 amostras,,,4096 семплов,4096 узорка +Auto,OPTSTR_AUTO,,,,,,,Aŭtomata,Automático,,Automaattinen,,,Automatico,自動,오토,,Automatycznie,Automático,,,Авто,Аутоматски +Mono,OPTSTR_MONO,,,,,,,1 Laŭtparolilo,,,,,,,モノラル,모노,,,,,,Моно,Монотоно +Stereo,OPTSTR_STEREO,,,,,,,2 Laŭtparoliloj,Estereo,,,Stéréo,,,ステレオ,스테레오,,,Estéreo,,,Стерео,Стереотоно +Dolby Pro Logic Decoder,OPTSTR_PROLOGIC,,,,,,,Malkodilo de Dolby Pro Logic ,,,,,,,ドルビー プロロジック デコーダー,돌비 프로 로직 디코더,,,,,Decodor Pro Logic Dolby,Декодер Dolby Pro Logic, +Quad,OPTSTR_QUAD,,,,,,,4 Laŭtparolilol,Cuádruple,,Dolby Pro Logic -dekooderi,,,,クァッド,쿼드,,Cztery kanały,,,,Четырёхканальный,Четвородупло +5 speakers,OPTSTR_SURROUND,,,,5 reproduktorů,5 Lautsprecher,,5 Laŭtparoliloj,5 altavoces,5 Bocinas,5 kaiutinta,5 enceintes,,,5 スピーカー,5 스피커,5 luidsprekers,Głośniki 5,5 alto falantes,,5 boxe,5 динамиков,5 спикер +5.1 speakers,OPTSTR_5POINT1,,,,Reproduktory 5.1,5.1 Lautsprecher,,5.1 Laŭtparoliloj,Altavoces 5.1,Bocinas 5.1,5.1 kaiutinta,Enceintes 5.1,,,5.1 スピーカー,5.1 스피커,5.1 luidsprekers,Głośniki 5.1,Auto falantes 5.1,,Boxe 5.1,Динамики 5.1,5.1 спикер +7.1 speakers,OPTSTR_7POINT1,,,,Reproduktory 7.1,7.1 Lautsprecher,,7.1 Laůtparoliloj,Altavoces 7.1,Bocinas 7.1,7.1 kaiutinta,Enceintes 7.1,,,7.1 スピーカー,7.1스피커,7.1 luidsprekers,Głośniki 7.1,Auto falantes 7.1,,Boxe 7.1,Динамики 7.1,7.1 спикер +OpenAL Options,OPENALMNU_TITLE,,,,Nastavení OpenAL,OpenAL Optionen,,OpenAL-agordoj,Opciones de OpenAL,,OpenAL-asetukset,Options OpenAL,,Opzioni OpenAL,OpenAL オプション,오픈에이엘 설정,OpenAL opties,Opcje OpenAL,Opções de OpenAL,,Setări OpenAL,Настройки OpenAL,OpenAL подешавања +Playback device,OPENALMNU_PLAYBACKDEVICE,,,,Přehravací zařízení,Wiedergabegerät,,Ludado-aparato,Dispositivo de reproducción,,Äänitoistolaite,Sortie sonore,,Dispositivo di playback,プレイバック デバイス,재생 장치,Afspeelapparaat,Urządzenie odtwarzania,Dispositivo de reprodução,,Dispozitiv de redare,Устройство воспроизведения,Аудио уређај +Enable EFX,OPENALMNU_ENABLEEFX,,,,Povolit EFX,EFX aktiv,,Aktivigi EFX,Permitir EFX,,Ota käyttöön EFX,Activer EFX,,Abilita EFX,EFXを有効化,EFX 켬,EFX inschakelen,Pozwól na EFX,Habilitar EFX,,Activare EFX,Включить EFX,Укључи EFX +Resampler,OPENALMNU_RESAMPLER,,,,,,,Respecimenilo,,,Näytteenottotaajuusmuunnin,,,,リサンプラー,재배열 기기,,Resampler,,,Resempler,Ресэмплер,Ресемплер +Sound Options,SNDMNU_TITLE,,,,Nastavení zvuku,Soundeinstellungen,,Son-agordoj,Opciones de sonido,,Ääniasetukset,Options Sonores,Hangbeállítások,Opzioni del suono,サウンド オプション,음향 설정,Geluidsopties,Opcje Dźwięku,Opções de Áudio,,Setări Sunet,Настройки звука,Звучна подешавања +Sounds volume,SNDMNU_SFXVOLUME,,,,Hlasitost zvuků,Effektlautstärke,,Son-laŭtec-menuo,Volumen de sonido,,Äänitehosteiden voimakkuus,Volume des Sons,Effektek hangereje,Volume suoni,効果音音量,효과음 음량,Geluidsvolume,Głośność Dźwięku,Volume de sons,,Volum efecte,Громкость звука,Јачина звука +Menu volume,SNDMNU_MENUVOLUME,,,,Hlasitost nabídek,Menülautstärke,,Menu-laŭteco,Volumen del menú,,Valikon äänenvoimakkuus,Volume du Menu,Menü hangereje,Volume menu,メニュー音量,메뉴 음량,Menu volume,Głośność Menu,Volume do menu,,Volum meniu,Громкость меню,Јачина менија +Music volume,SNDMNU_MUSICVOLUME,,,,Hlasitost hudby,Musiklautstärke,,Muzik-laŭteco,Volumen de la Música,,Musiikin äänenvoimakkuus,Volume Musique,Zene hangereje,Volume musica,音楽音量,배경음 음량,Muziekvolume,Głośność Muzyki,Volume da música,,Volum muzică,Громкость музыки,Јачина музике +MIDI device,SNDMNU_MIDIDEVICE,,,,MIDI zařízení,MIDI-Gerät,,MIDI-aparato,Dispositivo MIDI,,MIDI-laite,Sortie MIDI,MIDI eszköz,Dispositivo MIDI,MIDIデバイス,MIDI 장치,MIDI-apparaat,Urządzenie MIDI,Dispositivo MIDI,,Dispozitiv MIDI,MIDI проигрыватель,MIDI уређај +Sound in Background,SNDMNU_BACKGROUND,,,,Zvuk na pozadí,Sound im Hintergrund,,Sono en Fono,Sonido en segundo plano,,Ääni taustalla,Son activé en arrière plan,Háttérhangok,Suono di sottofondo,バックグラウンドでのサウンド,배경화면에서도 소리 재생,Geluid in de achtergrond,Dźwięk w Tle,Som de Fundo,,Sunet pe fundal,Звуки в фоне,Звуци у позадини +Underwater reverb,SNDMNU_UNDERWATERREVERB,,,,Ozvěna pod vodou,Unterwasserhall,,Subakva resono,Reverb. bajo el agua,,Vedenalaiskaiku,Reverbération sous l'eau,Vízalatti viszhang,Reverb sott'acqua,水中反響音,수중 울림효과,Onderwater nagalm,Pogłos pod wodą,Reverberação debaixo d'água,Reverberação debaixo de água,Reverb subacvatic,Эффект под водой,Подводни одјек +Randomize pitches,SNDMNU_RANDOMIZEPITCHES,,,,Náhodné výšky tónu,Zufällige Tonhöhe,,Malcertigi son-peĉojn,Tonos aleatorios,,Satunnaista äänenkorkeuksia,Tons sonores aléatoires,Hangmagasság véletlenszerű,Rendi casuale il tono,ランダマイズ ピッチ,음높이 무작위화,Willekeurige plaatsen,Losuj tonacje,Aleatorizar tons,Tons aleatórios,Ton sunete aleatoriu,Изменять высоту,Рандомизација тонова +Sound channels,SNDMNU_CHANNELS,,,,Počet zvukových kanálů,Soundkanäle,,Son-kanaloj,Canales de sonido,,Äänikanavat,Canaux sonores,Hangcsatorna,Numero canali del suono,サウンド チャンネル,음향 채널,Geluidskanalen,Kanały dźwiękowe,Canais de som,,Canale de sunet,Количество каналов,Звучни канали +Sound backend,SNDMNU_BACKEND,,,,Zvukový systém,Soundsystem,,Son-servilo,Sistema de sonido,,Äänijärjestelmä,Traitement Son,,Backend suono,サウンド バックエンド,음향 말미,Geluidsarme achterkant,System dźwiękowy,Sistema de som,,Sistem de sunet,Звуковая система,Звучни бекенд +OpenAL options,SNDMNU_OPENAL,,,,Nastavení OpenAL,OpenAL Optionen,,OpenAL-agordoj,Opciones de OpenAL,,OpenAL-asetukset,Options OpenAL,OpenAL beállításai,Opzioni OpenAL,OpenAL オプション,오픈에이엘 설정,OpenAL opties,Opcje OpenAL,Opções de OpenAL,,Setări OpenAL,Настройки OpenAL,OpenAL подешавања +Restart sound,SNDMNU_RESTART,,,,Restartovat zvuk,Sound neu starten,,Rekomenci sonon,Reiniciar sonido,,Käynnistä ääni uudelleen,Redémarrer moteur sonore,Hang újraindítása,Resetta il suono,サウンド再起動,음향 재시작,Herstart geluid,Zresetuj dźwięk,Reiniciar som,,Reinițializare sunet,Перезапустить звук,Поново покрени звук +Advanced options,SNDMNU_ADVANCED,,,,Pokročilá nastavení,Erweiterte Optionen,,Altnivelaj agordoj,Opciones avanzadas,,Edistyneet asetukset,Options avancées,Haladó beállítások,Opzioni avanzate,高度なオプション,고급 설정,Geavanceerde opties,Zaawansowane Opcje,Opções avançadas,,Setări avansate,Расширенные настройки,Напредна подешавања +Module replayer options,SNDMNU_MODREPLAYER,,,,Nastavení přehrávače modulů,Modul-Spieler-Optionen,,Agordoj por modulreludilo,Opciones reproductor de módulos,,Moduulisoitinasetukset,Options lecteur de module,,Opzioni Module replayer,モジュールリプレイヤー オプション,모듈 재생 설정,Module replayer opties,Opcje Modułu Odtwarzacza,Opções de reprodutor de módulos,,Setări de redare a modulelor,Параметры воспроизведения модулей,Подешавања модулног риплејера +Midi player options,SNDMNU_MIDIPLAYER,,,,Nastavení MIDI přehrávače,MIDI-Spieler-Optionen,,Agordoj por MIDI-ludilo,Opciones de reproductor MIDI,,MIDI-soitinasetukset,Option lecteur MIDI,,Opzioni Midi player,Midi再生のオプション,MIDI 플레이어 설정,Midi speler opties,Opcje Odtwarzacza Midi,Opções de reprodutor MIDI,,Setări player MIDI,Настройки MIDI-проигрывателя,MIDI плејер подешавања +Sound in Menus,SNDMNU_MENUSOUND,,,,,Sound in Menüs,,,,,Ääni valikoissa,,,,,,,,,,,, +Advanced Sound Options,ADVSNDMNU_TITLE,,,,Pokročilá nastavení zvuku,Erweiterte Soundoptionen,,Altnivelaj Son-agordoj,Opciones avanzadas de sonido,,Edistyneet ääniasetukset,Options Sonores Avancées,,Opzioni avanzate dei suoni,高度なサウンドオプション,고급 음향 설정,Geavanceerde geluidsopties,Zaawansowane Opcje Dźwięku,Opções de Áudio Avançadas,,Setări de sunet avansate,Расширенные настройки,Напредна подешавања звука +Sample rate,ADVSNDMNU_SAMPLERATE,,,,Vzorkovací frekvence,Samplerate,,Specimenrapideco,Frecuencia de muestreo,,Näytteenottotaajuus,Cadence de Sampling,,,サンプルレート,샘플링레이트,Steekproeftarief,Częstotliwość próbkowania,Taxa de amostragem,,Frecvență de eșantionare,Частота дискретизации,Фреквенција узорковања +HRTF,ADVSNDMNU_HRTF,,,,,,,,,,,,,,,머리전달함수,,HRTF,,,HRTF,, +OPL Synthesis,ADVSNDMNU_OPLSYNTHESIS,,,,Emulace OPL,OPL Synthese,,OPL-Sintezo,Síntesis OPL,,OPL-synteesi,Synthèse OPL,,,OPLシンセサイズ,OPL 합성,OPL synthese,Synteza OPL,Síntese OPL,,Sinteză OPL,Синтез OPL,OPL синтеза +Number of emulated OPL chips,ADVSNDMNU_OPLNUMCHIPS,,,,Počet emulovaných OPL čipů,Anzahl OPL Chips,,Nombro da imititaj OPL-blatoj,Número de chips OPL emulados,,Emuloitavien OPL-piirien lukumäärä,Puces OPL émulées,,Numero di chip OPL emulati,OPLチップエミュレートの番号,에뮬레이트된 OPL 칩 수,Aantal geëmuleerde OPL chips,Liczba emulowanych czipów OPL,Número de chips OPL emulados,,Număr de cipuri OPL emulate,Количество эмулируемых OPL чипов,Број емулираних OPL чипа +Full MIDI stereo panning,ADVSNDMNU_OPLFULLPAN,,,,Plné MIDI stereo,Echte MIDI-Stereoeffekte,,Tuta MIDI-sterepanoramado,Balance estéreo MIDI completo,,Täysi MIDI-stereopanorointi,Latéralisation complète MIDI,,,Full MIDIステレオパンニング,완전한 MIDI 스테레오 패닝,Volledige MIDI stereo panning,Pełne efekty stereo dla MIDI,Lateralidade estéreo completa para MIDI,,Panoramă stereo pentru MIDI,Полная стереопанорама для MIDI,Пуно MIDI стерео каналисање +OPL Emulator Core,ADVSNDMNU_OPLCORES,,,,Emulační jádro OPL,OPL Emulatorkern,,OPL Imitilkerno,Núcleo de emulador OPL,,OPL-emulaattoriydin,Cœur émulateur OPL,,,OPL エミュレート コア,OPL 에뮬레이터 코어,OPL Emulator Kern,Rdzeń Emulatora OPL,Núcleo do emulador de OPL,,Nucleu de emulare OPL,Ядро эмуляции OPL,OPL језгро емулације +MIDI voices,ADVSNDMNU_MIDIVOICES,,,,Počet MIDI hlasů,MIDI Stimmen,,MIDI Voĉoj,Voces MIDI,,MIDI-äänet,Voix MIDI,,Voci MIDI,MIDI ボイス,MIDI 최대 음색 양,MIDI-stemmen,Głosy MIDI,Vozes MIDI,,Voci MIDI,MIDI-голоса,MIDI гласови +FluidSynth,ADVSNDMNU_FLUIDSYNTH,,,,,,,,,,,,,,,,,,,,,, +Global,ADVSNDMNU_GLOBAL,,,,Globální,,,Malloka,Global,,Yleinen,,,Globale,グローバル,전반적,Globaal,Globalne,,,,Общие,Глобално +Freeverb,ADVSNDMNU_FREEVERB,,,,,,,,,,,,,,フリーバーブ,프리버브,,,,,,, +Global Freeverb,ADVSNDMNU_GLOBAL_FREEVERB,,,,Globální Freeverb,Globales Freeverb,,Malloka Freeverb,Freeverb Global,,Yleinen Freeverb,Freeverb Global,,Freeverb globale,グローバル フリーバーブ,전반적 프리버브,Globale Freeverb,Globalny Freeverb,Freeverb Global,,,Глобальный Freeverb,Глобални Freeverb +Patch set,ADVSNDMNU_FLUIDPATCHSET,,,,Nástrojová sada,Patch-Set,,Flikaro,Set de parche,,Patch-asetus,Banque de Sons,,,パッチ セット,패치 세트,,Zestaw patchów,Banco de sons,,Set patch,Патч-набор,Печ сет +Gain,ADVSNDMNU_FLUIDGAIN,,,,Zesílení,Relative Lautstärke,,Akiro,Ganancia,,Vahvistus,,,,ゲイン,쌓기,Relatief volume,Wzmocnienie,Ganho,,Amplificare,Усиление,Појачање +Reverb,ADVSNDMNU_REVERB,,,,Ozvěna,Hall,,Resono,Reverberación,,Kaiku,Réverbération,,,リバーブ,리버브,Nagalm,Pogłos,Reverberação,,,Реверберация,Одјек +Reverb Level,ADVSNDMNU_REVERB_LEVEL,,,,Intenzita ozvěny,Hallintensität,,Resono-nivelo,Nivel de Reverberación,,Kaiunvoimakkuus,Niveau Réverb.,,,リバーブ量,리버브 강도,Nagalm niveau,Poziom pogłosu,Nível de reverberação,,Nivel Reverb,Уровень реверберации,Ниво одјека +Chorus,ADVSNDMNU_CHORUS,,,,,,,Koruso,,,,,,,コーラス,코러스,,,,,Cor,Хорус,Корус +Timidity++,ADVSNDMNU_TIMIDITY,,,,,,,,,,,,,,,,,,,,,, +ADLMidi,ADVSNDMNU_ADLMIDI,,,,,,,,,,,,,,,,,,,,,, +OPNMidi,ADVSNDMNU_OPNMIDI,,,,,,,,,,,,,,,,,,,,,, +Timidity config file,ADVSNDMNU_TIMIDITYCONFIG,,,,Konfigurační soubor Timidity,Timidity Konfigurationsdatei,,Agordo-arkivo por Timidity,Ruta al archivo config. Timidity,,Timidity-config-tiedosto,Fichier de config. TiMidity,,File Timidity config,Timidity コンフィグファイル,Timidity 코딩 파일,Timidity++ configuratiebestand,Plik konfiguracyjny Timidity,Arquivo de configuração do Timidity,,Fișier configurație Timidity,Файл конфигурации Timidity,Timidity конфигурациона датотека +Relative volume,ADVSNDMNU_TIMIDITYVOLUME,,,,Relativní hlasitost,Relative Lautstärke,,Relativa volumeno,Volumen relativo,,Suhteellinen äänenvoimakkuus,Volume Relatif,,Volume relativo,相対音量,비교적인 볼륨,Relatief volume,Względna głośność,Volume relativo,,Volum relativ,Относительная громкость,Релативна јачина +WildMidi,ADVSNDMNU_WILDMIDI,,,,,,,,,,,,,,,,,,,,,, +WildMidi config file,ADVSNDMNU_WILDMIDICONFIG,,,,Konfigurační soubor WildMidi,WilfMidi Konfigurationsdatei,,WildMidi agordarkivo,Archivo de config. WildMidi,,WildMidi-config-tiedosto,Fichier config. WildMidi,,File WildMidi config,WildMidi コンフィグファイル,WildMidi 코딩 파일,WildMidi configuratiebestand,Plik konfiguracyjny WildMidi,Arquivo de configuração do WildMidi,,Fișier configurație WildMidi,Файл конфигурации WildMidi,WildMidi конфигурациона датотека +Select configuration,ADVSNDMNU_SELCONFIG,,,,Vybrat konfiguraci,Konfiguration wählen,,Elekti agordojn,Seleccionar configuración,,Valitse kokoonpano,Sélectionner configuration,,Seleziona la configurazione,構成選択,설정을 고르시오,Selecteer configuratie,Wybierz konfigurację,Selecionar configuração,,Selectare configurație,Выбор конфигурации,Изабери конфигурацију +Advanced Resampling,ADVSNDMNU_ADVRESAMPLING,,,,Pokročilé převzorkování,Erweitertes Resampling,,Altnivela respecimenado,Resampleo Avanzado,,Kehittynyt näytteenottotaajuuden muuntaminen,Resampling Avancé,,Resampling avanzato,高度なリサンプリング,향상된 리샘플링,Geavanceerde herbemonstering,Zaawansowane Próbkowanie,Reamostragem Avançada,,Resempling avansat,Продвинутый ресэмплинг,Напредно ресампловање +OPL Bank,ADVSNDMNU_OPLBANK,,,,OPL sada,,,Banko por OPL,Banco OPL,,OPL-pankki,Banque OPL,,,,OPL 뱅크,,Bank OPL,Banco OPL,,,Банк OPL,OPL банка +OPL Emulator Core,ADVSNDMNU_ADLOPLCORES,,,,Emulační jádro OPL,OPL Emulatorkern,,Imitilkerno por OPL,Núcleos de Emulador OPL,,OPL-emulaattoriydin,Cœur Emulateur OPL,,,OPL エミュレートコア,OPL 에뮬레이터 코어,OPL Emulator Kern,Rdzeń Emulatora OPL,Núcleo do Emulador de OPL,,Nucleu de emulare OPL,Ядро эмуляции OPL,OPL емулационо језгро +Run emulator at PCM rate,ADVSNDMNU_RUNPCMRATE,,,,Emulátor používá PCM vzorkovací frekvenci,Emulator benutzt PCM Samplerate,,Kurigi imitilon laŭ rapido de PCM,Ejecutar emulador a velocidad PCM,,Aja emulaattoria PCM-taajuudella,Emulateur utilise cadence PCM,,Esegui l'emulatore con rate PCM,PCMレートでエミュレート実行,PCM 속도로 에뮬레이터 실행,Emulator maakt gebruik van PCM Samplerate,Uruchom emulator w częstotliwości PCM,Rodar emulador em taxa PCM,,Utilizare cu frecvența PCM,Использовать с частотой PCM,Покрени емулацију на PCM стопи +Number of emulated OPL chips,ADVSNDMNU_ADLNUMCHIPS,,,,Počet emulovaných OPL čipů,Anzahl OPL Chips,,Numbro da imitaj OPL-blatoj,Número de chips OPL emulados,,Emuloitavien OPL-piirien lukumäärä,Puces OPL émulées,,Numero di chip OPL emulati,OPLチップエミュレートの番号,에뮬레이트된 OPL 칩 개수,Aantal geëmuleerde OPL chips,Liczba emulowanych czipów OPL,Número de chips OPL emulados,,Număr de cipuri GUS emulate,Количество эмулируемых чипов OPL,Број емулираних OPL чипова +Volume model,ADVSNDMNU_VLMODEL,,,,Model hlasitosti,Lautstärkemodell,,Volumen-modelo,Modelo de Volumen,,Äänenvoimakkuusmalli,Modèle de Volume,,Modello di volume,音量モデル,모델 볼륨,Volume model,Model głośności,Modelo de volume,,Model volum,Модель громкости,Волумски модел +OPN2 Emulator Core,ADVSNDMNU_OPNCORES,,,,Emulační jádro OPN2,OPN2 Emulatorkern,,OPN2 Imitilkerno,Núcleo de emulador OPN2,,OPN2-emulaattoriydin,Cœur émulateur OPN2,,,OPN2 エミュレート コア,OPN2 에뮬레이터 코어,OPN2 Emulatorkern van de OPN2-emulator,Rdzeń Emulatora OPN2,Núcleo do emulador de OPN2,,Nucleu de emulare OPN2,Ядро эмуляции OPN2,OPN2 језгро емулације +GUS Emulation,ADVSNDMNU_GUSEMULATION,,,,Emulace GUS,GUS Emulation,,GUS Imitado,Emulación GUS,,GUS-emulaatio,Emulation GUS,,,GUS エミュレーション,GUS 에뮬레이션,GUS-emulatie,Emulacja GUS,Emulação de GUS,,Emulare GUS,Эмуляция GUS,GUS емулација +GUS config file,ADVSNDMNU_GUSCONFIG,,,,Konfigurační soubor GUS,GUS Konfigurationsdatei,,GUS Agordarkivo,Archivo de config. GUS,,GUS-config-tiedosto,Fichier Config. GUS,,File GUS config,GUS コンフィグファイル,GUS 코딩 파일,GUS-configuratiebestand,Plik konfiguracyjny GUS,Arquivo de configuração do GUS,,Fișier configurație GUS,Файл конфигурации для GUS,GUS конфигурациона датотека +Read DMXGUS lumps,ADVSNDMNU_DMXGUS,,,,Načíst DMXGUS soubory,Lese DMXGUS,,Legi DMXGUS Masojn,Leer archivos DMXGUS,,Lue DMXGUS-tietoja,Lire fichiers DMXGUS,,Leggi i lump DMXGUS,DMXGUS ランプを読む,DMXGUS 럼프 읽기,DMXGUS-klonten lezen,Czytaj pliki DMXGUS,Ler lumps DMXGUS,,Citire fișiere DMXGUS,Читать файлы DMXGUS,Читај DMXGUS фајлове +GUS memory size,ADVSNDMNU_GUSMEMSIZE,,,,Velikost paměti GUS,GUS Speichergröße,,GUS Memorampleksoj,Tamaño de memoria de GUS,,GUS-muistikoko,Taille mémoire GUS,,Dimensione della memoria per GUS,GUS メモリーサイズ,GUS 메모리 크기,GUS-geheugengrootte,Rozmiar pamięci GUS,Tamanho de memória do GUS,,Memorie alocată pentru GUS,Размер памяти GUS,GUS величина памћења +Number of emulated OPN chips,ADVSNDMNU_OPNNUMCHIPS,,,,Počet emulovaných OPN čipů,Anzahl OPN Chips,,Nombro da imititaj OPL-blatoj,Número de chip OPN emulados,,Emuloitavien OPN-piirien lukumäärä,Puces OPN émulées,,Numero di chip OPN emulati,OPNチップエミュレートの番号,에뮬레이트된 OPN 칩 개수,Aantal geëmuleerde OPL chips,Liczba emulowanych czipów OPN,Número de chips OPN emulados,,Număr de cipuri OPN emulate,Количество эмулируемых чипов OPN,Број емулираних OPN чипова +Use custom WOPL bank,ADVSNDMNU_ADLCUSTOMBANK,,,,Použít vlastní WOPL sadu,Benutzerdefinierte WOPL Bank,,Uzi laŭmendan WOPL-bankon,Utilizar banco WOPL personalizado,,Käytä mukautettua WOPL-pankkia,Utiliser Banque WOPL perso,,Usa WOPL bank personalizzato,カスタムWOPL bankを使用,사용자 지정 WOPL 뱅크 사용,Gebruik de aangepaste WOPL bank,Użyj niestandardowego banku WOPL,Usar banco WOPL personalizado,,Utilizați propriul bank WOPN,Использовать собственный банк WOPL,Користи прилагођенуу WOPL банку +WOPL Bank file,ADVSNDMNU_OPLBANKFILE,,,,Soubor WOPL sady,WOPL Bank-Datei,,WOPL-Banko-arkivo,Archivo de banco WOPL,,WOPL-pankkitiedosto,Banque WOPL,,File WOPL Bank,WOPL bankファイル,WOPL 뱅크 파일,WOPL Bank-bestand,Plik banku WOPL,Banco WOPL,,Fișier WOPN bank,Файл с банком WOPL,WOPL фајл банка +Use custom WOPN bank,ADVSNDMNU_OPNCUSTOMBANK,,,,Použít vlastní WOPN sadu,Benutzerdefinierte WOPN Bank,,Uzi laŭmendan WOPN bankon,Utilizar banco WOPN personalizado,,Käytä mukautettua WOPN-pankkia,Utiliser Banque WOPL perso,,Usa WOPN bank personalizzato,カスタムWOPN bankを使用,사용자 지정 WOPN 뱅크 사용,Gebruik aangepaste WOPN-bank op maat,Użyj niestandardowego banku WOPN,Usar banco WOPN personalizado,,Utilizați propriul bank WOPN,Использовать собственный банк WOPN,Користи прилагођену WOPN банку +WOPN Bank file,ADVSNDMNU_OPNBANKFILE,,,,Soubor WOPN sady,WOPN Bank-Datei,,WOPN Bankarkivo,Archivo de banco WOPN,,WOPN-pankkitiedosto,Banque WOPL,,File WOPN Bank,WOPN bankファイル,WOPN 뱅크 파일,WOPN Bank-bestand,Plik banku WOPN,Banco WOPN,,Fișier WOPN bank,Файл с банком WOPN,WOPN фајл банка +Aliasing,OPTVAL_ALIASING,,,,,,,Kromnomado,,,,,,,エイリアシング,에일리어싱,,,,,,Алиасинг,Преклапање +Linear,OPTVAL_LINEAR_1,This setting is duplicated threefold in order to allow for different grammatical gender endings,,,Lineární,,,Lineara,Lineal,,Lineaarinen,Linéaire,,Lineare,リニア,선형,Lineair,Liniowy,,,Liniar,Линейное,Линеаран +Linear,OPTVAL_LINEAR_2,,,,Lineární,,,Lineara,Lineal,,Lineaarinen,Linéaire,,Lineare,リニア,선형,Lineair,Liniowa,,,Liniar,Линейная,Линеаран +Linear,OPTVAL_LINEAR_3,,,,Lineární,,,Lineara,Lineal,,Lineaarinen,Linéaire,,Lineare,リニア,선형,Lineair,Liniowe,,,Liniar,Линейный,Линеаран +Nearest,OPTVAL_NEAREST,,,,Nejbližší,Nächster Nachbar,,Plej proksima,Cercano,,Lähin,Nearest,,Il più vicino,最寄り,가까이,Naast,Najbiższe,Vizinho mais próximo,,Cel mai apropriat,Ближайший,Најближе +PCF (Low),OPTVAL_PCF_LOW,,,,PCF (nízké),PCF (niedrig),,PCF (Malata),PCF (Bajo),,PCF (matala),PCF (Low),,PCF (basso),PCF (低),PCF (하급),PCF (Laag),PCF (Niski),PCF (Baixo),,PCF (Scăzut),PCF (низкий),PCF (ниско) +PCF (Medium),OPTVAL_PCF_MEDIUM,,,,PCF (střední),PCF (mittel),,PCF (Meza),PCF (Medio),,PCF (keskitaso),PCF (Medium),,PCF (medio),PCF (中),PCF (중급),PCF (Medium),PCF (Średni),PCF (Médio),,PCF (Mediu),PCF (средний),PCF (средње) +PCF (High),OPTVAL_PCF_HIGH,,,,PCF (vysoké),PCF (hoch),,PCF (Alta),PCF (Alto),,PCF (korkea),PCF (High),,PCF (alto),PCF (高),PCF (상급),PCF (Hoog),PCF (Wysoki),PCF (Alto),,PCF (Ridicat),PCF (высокий),PCF (високо) +Cubic,OPTVAL_CUBIC,,,,Kubická,Kubisch,,Kuba,Cúbico,,Kuutio,Cubique,,Cubico,キュービック,큐빅,Kubieke,Sześcienny,Cúbico,,Cub,Кубическое,Кубан +Band-limited step,OPTVAL_BLEP,,,,Omezené krokování,Bandbegrenzte Schritte,,Bendo-limigita paŝo,Paso limitado por banda,,Kaistarajoitettu askel,Step limité par bande,,Passo limitato dalla banda,帯域制限ステップ,제한된 단계별 밴드,Bandbeperkte stap,Krok ograniczony pasmem,Passo limitado por banda,,Limitare frecvență pas-cu-pas,Пошаговое ограничение частоты,Постепено ограничење фреквенције +Linear (Slower),OPTVAL_LINEARSLOW,,,,Lineární (pomalejší),Linear (langsamer),,Lineara (Pli malrapida),Lineal (más lento),,Lineaarinen (hitaampi),Linéaire (Lent),,Lineare (più lento),リニア(遅め),선형 (느리게),Lineair (langzamer),Liniowy (wolniejszy),Linear (Mais lento),,Liniar (Mai lent),Линейное (медленнее),Линеаран (спорије) +Band-limited linear,OPTVAL_BLAM,,,,Omezená lineární,Bandbegrenzt linear,,Bendo-limigita lineara,Lineal limitado por banda,,Kaistarajoitettu lineaarinen,Linéaire limité par bande,,Lineare limitato dalla banda,帯域制限リニア,밴드 제한 식 선형,Band-beperkt lineair,Liniowy ograniczony pasmem,Linear limitado por banda,,Limitare frecvență liniară,Линейное ограничение частоты,Линеарно ограничење фреквенције +Cubic (Slower),OPTVAL_CUBICSLOW,,,,Kubická (pomalejší),Kubisch (langsamer),,Kuba (Pli malrapida),Cúbico (más lento),,Kuutio (hitaampi),Cubique (Lent),,Cubico (più lento),キュービック (遅め),큐빅 (느리게),Kubieke (langzamer),Sześcienny (wolniejszy),Cúbico (Mais lento),,Cub (Mai lent),Кубическое (медленнее),Кубан (спорије) +Sinc,OPTVAL_SINC,,,,,,,,Seno cardinal,,,,,,シンク,싱크,,,,,Sinus cardinal,Кардинальный синус,Синк +Note on/off only,OPTVAL_NOTEONOFFONLY,,,,Pouze začátek/konec noty,Nur für Note an/aus ,,Nur noton aktivigi/malatkivigi,Sólo notas de Activ./Desact.,,Vain nuotti päällä/pois,Note on/off seulement,,Note solamente ON/OFF,ノート オン/オフ のみ,노트를 끄거나 켰을 때,Alleen toon aan/uit,Tylko dla włączonych/wyłączonych notatek,Somente notas lig./deslig.,,Numai la activarea/oprirea notelor,Только при включении/отключении нот,Само током укључења/искључења ноте +Full ramping,OPTVAL_FULLRAMPING,,,,Plný náběh,,,Plena rampante,Aumento completo,,Täysi kerrytys,Rampe complète,,Ramping completo,フルランピング,최대 램핑,Volledige helling,Pełne zwiększenie,Rampa completa,,Creștere completă,Полное наращивание,Пуно појачање +Module Replayer Options,MODMNU_TITLE,,,,Nastavení přehrávače modulů,Modul-Spieler-Optionen,,Agordoj por Modulo-reludilo,Opciones de reproductor de módulos,,Moduulisoitinasetukset,Options Lecteur de Module,,Opzioni Module replayer,モジュールリプレイヤー オプション,모듈 재생 설정,Module Speler Opties,Opcje Odtwarzacza Modułów,Opções de Reprodutor de Módulos,,Setări de redare module,Параметры воспроизведения модулей,Подешавања модуларног реплејера +Master volume,MODMNU_MASTERVOLUME,,,,Celková hlasitost,Grundlautstärke,,Ĉefvolumeno,Volumen maestro,,Yleisäänenvoimakkuus,Volume maître,,Volume master,全体音量,마스터 볼륨,Hoofdvolume,Całkowita głośność,Volume master,,Volum general,Общая громкость,Глацни звук +Quality,MODMNU_QUALITY,,,,Kvalita,Qualität,,Kvaliteco,Calidad,,Laatu,Qualité,,Qualità,クオリティ,품질,Kwaliteit,Jakość,Qualidade,,Calitate,Качество,Квалитет +Volume ramping,MODMNU_VOLUMERAMPING,,,,Křivka hlasitosti,Lautstärkeverhalten,,Volumeno-pligrandigado,Aumento gradual de Volumen,,Äänenvoimakkuuden kertyminen,Rampe du volume,,Ramping volume,音量ランピング,볼륨 램핑,Volume-aanvulling,Zwiększenie głośności,Rampa de volume,,Creștere volum,Наращивание громкости,Појачавање звука +Chip-o-matic,MODMNU_CHIPOMATIC,,,,,,,,,,,,,,チップ オー マチック,칩-오-매틱,,,,,,, +MAME OPL2,OPTVAL_MAMEOPL2,,,,,,,,,,,,,,,마메 OPL2,,,,,,, +DOSBox OPL3,OPTVAL_DOSBOXOPL3,,,,,,,,,,,,,,,도스박스 OPL3,,,,,,, +Java OPL3,OPTVAL_JAVAOPL3,,,,,,,,,,,,,,,자바 OPL3,,,,,,, +Nuked OPL3,OPTVAL_NUKEDOPL3,,,,,,,,,,,,,,,,,,,,,, +MAME YM2612,OPTVAL_MAMEOPN2,,,,,,,,,,,,,,,마메 YM2612,,,,,,, +Neko Project II Kai OPNA,OPTVAL_NP2OPNA,,,,,,,,,,,,,,,,,,,,,, +MAME YM2608,OPTVAL_MAMEOPNA,,,,,,,,,,,,,,,마메 YM2608,,,,,,, +PMDWin OPNA,OPTVAL_PMDWINOPNA,,,,,,,,,,,,,,,,,,,,,, +Opal OPL3,OPTVAL_OPALOPL3,,,,,,,,,,,,,,,,,,,,,, +Nuked OPL3 v1.7.4,OPTVAL_NUKEDOPL3174,,,,,,,,,,,,,,,,,,,,,, +Nuked OPN2,OPTVAL_NUKEDOPN2,,,,,,,,,,,,,,,,,,,,,, +GENS YM2612,OPTVAL_GENSOPN2,,,,,,,,,,,,,,,,,,,,,, +Auto (Use setup of bank),ADLVLMODEL_AUTO,,,,Auto (použít nastavení sady),Auto (Benutze Einstelliung der Bank),,Aŭto (Uzi bankagordaĵon),Auto (Usar config. del banco),,Automaattinen (käytä pankin asetuksia),Auto (Utiliser paramètre banque),,Automatico (Usa le impostazioni del bank),自動(bankのセットアップ使用),자동(뱅크 셋업 사용),Auto (gebruik instelling van de bank),Automatycznie (Użyj ustawień banku),Automático (Usar definições do banco),,Auto (configurare din bank),Авто (настройка из банка),Аутоматски (користи намештену банку) +Generic,ADLVLMODEL_GENERIC,,,,Standardní,Allgemein,,Komuna,Genérico,,Yleinen,Générique,,Generico,一般的,전형적,Algemeen,Ogólne,Genérico,,,Общий,Генерично +OPL Native,ADLVLMODEL_NATIVE,,,,Nativní OPL,OPL Nativ,,Nativa OPL,Nativo OPL,,Luontainen OPL,OPL Natif,,,OPLネイティブ,고유 OPL,OPL Inheems,Natywne OPL,Nativo OPL,,OPL propriu,Встроенная OPL,OPL домаћи +"DMX (Accurate, with AM bug)",ADLVLMODEL_DMX,,,,,,,,,,,,,,,데이터 마이닝 확장,,,"DMX (Preciso, com bug de AM)",,,"DMX (Точная, с багом АМ)", +"Apogee (Accurate, with AM bug)",ADLVLMODEL_APOGEE,,,,,,,,,,,,,,,어포지,,,"Apogee (Preciso, com bug de AM)",,,"Apogee (Точная, с багом АМ)", +Win9X-like (SB16),ADLVLMODEL_WIN9X,,,,Jako Windows 9X (SB16),Wie Windows 9X (SB16),,Kiel Win9X (SB16),Como Win9X (SB16),,Win9x-kaltainen (SB16),,,,Win9X式 (SB16),Win9X 같게 (SB16),Win9X-achtige (SB16),Jak w Win9X (SB16),Estilo Win9X (SB16),,Similar cu Win9X (SB16),Похожая на Win9X (Вариант SB16),Као у Win9X-у (SB16) +Win9X-like (Generic FM),ADLVLMODEL_WIN9XGENERIC,,,,Jako Windows 9X (Generic FM),Wie Windows 9X (Generic FM),,Kiel Win9X (Generic FM),Como Win9X (Generic FM),,Win9x-kaltainen (Generic FM),,,,Win9X式 (Generic FM),Win9X 같게 (Generic FM),Win9X-achtige (Generic FM),Jak w Win9X (Generic FM),Estilo Win9X (FM genérico),,Similar cu Win9X (Generic FM),Похожая на Win9X (Вариант Generic FM),Као у Win9X-у (Generic FM) +DMX (Without AM voice bug),ADLVLMODEL_DMX_FIXED,,,,,DMX (Ohne AM-Stimmenfehler),,,,,,DMX (Sans bug canaux AM),,,,,,,DMX (Sem bug de voz AM),,,DMX (Без бага АМ), +Apogee (Without AM voice bug),ADLVLMODEL_APOGEE_FIXED,,,,,Apogee (Ohne AM-Stimmenfehler),,,,,,Apogee (avec bug canaux AM),,,,,,,Apogee (Sem bug de voz AM),,,Apogee (Без бага АМ), +IBM Audio Library Interface,ADLVLMODEL_AIL,,,,,,,,,,,,,,,,,,Interface de Biblioteca de Áudio IBM,,,, +HMI Sound Operating System,ADLVLMODEL_HMI,,,,,,,,,,,,,,,,,,Sistema Operacional de Som HMI,,,, +"HMI SOS (Old, with bugs)",ADLVLMODEL_HMIOLD,,,,,"HMI SOS (alt, mit Fehlern)",,,,,,HMI SOS (vieux et buggé),,,,,,,"SOS HMI (Antigo, com bugs)",,,HMI SOS (Старый вариант с багами), +Unlimited,OPTVAL_UNLIMITED,,,,Neomezený,Unlimitiert,,Senlima,Ilimitado,,Rajoittamaton,Illimité,,Illimitato,無制限,무제한,Onbeperkt,Nieskończone,Sem limite,,Nelimitat,Без ограничений,Бескрајно +256K,OPTVAL_256K,,,,,,,,,,,,,,,,,,,,,256К, +512K,OPTVAL_512K,,,,,,,,,,,,,,,,,,,,,512К, +768K,OPTVAL_768K,,,,,,,,,,,,,,,,,,,,,768К, +1024K,OPTVAL_1024K,,,,,,,,,,,,,,,,,,,,,1024К, +,,Postprocessing,,,,,,,,,,,,,,,,,,,,, +Uncharted 2,OPTVAL_UNCHARTED2,,,,,,,,,,,,,,,,,,,,,, +Hejl Dawson,OPTVAL_HEJLDAWSON,,,,,,,,,,,,,,,,,,,,,, +Reinhard,OPTVAL_REINHARD,,,,,,,,,,,,,,,,,,,,,, +Palette,OPTVAL_PALETTE,,,,Paleta,,,Paletro,Paleta,,Paletti,,,Palette,パレット,팔레트,Palet,Paleta,Paleta,Palete,Paletă,Палитра игры,Палет +Low,OPTVAL_LOW,,,,Nízká,Niedrig,Χαμηλό,Malalta,Bajo,,Matala,Bas,,Basso,低,낮음,Laag,Niskie,Baixo,,Scăzut,Низкое,Ниско +Medium,OPTVAL_MEDIUM,,,,Střední,Mittel,Μεσαίο,Meza,Medio,,Keskitaso,Moyen,,Medio,中,중간,Middel,Średnie,Médio,,Mediu,Среднее,Средње +High,OPTVAL_HIGH,,,,Vysoká,Hoch,Υψηλό,Alta,Alto,,Korkea,Haut,,Alto,高,높음,Hoog,Wysokie,Alto,,Ridicat,Высокое,Високо +Extreme,OPTVAL_EXTREME,,,,Extrémní,Extrem,Ακράιο,Ekstrema,Extremo,,Äärimmäinen,Extrême,,Estremo,最高,매우 높음,Extreem,Ekstremalne,Extremo,,Extrem,Максимальное,Екстремно +Obverse,OPTVAL_OBVERSEFIRST,,,,Vpřed (obvers),Obvers,Παρατήρησε,Aversa,Anverso,,Etupuoli,,,Dritto,正面,앞면,Gezicht,Awers,Obverso,,Avers,Прямой,Супротно +Reverse,OPTVAL_REVERSEFIRST,,,,Vzad (revers),Revers,Αντίστροφο,Inversa,Inverso,,Käänteinen,Inverse,,Contrario,反転,반전,Omgekeerd,Rewers,Reverso,,Invers,Обратный,Обрнуто +Postprocessing,GLMNU_POSTPROCESS,,,,,,Μετα-επεξεργασία,Postprocezado,Postprocesado,,Jälkikäsittely,,,,ポストプロセッシング,포스트프로세싱 적용,Nabewerking,Przetwarzanie końcowe,Pós processamento,,Postprocesare,Постобработка,Пост обрада +Tonemap Mode,GLPREFMNU_TONEMAP,,,,Režim tónovací mapy,Tonemap Modus,,Reĝimo de tonmapo,Modo de mapa de tonos,,Sävykarttatila,Mode Tonemap,,Modalità Tonemap,トーンマップ モード,톤맵 모드,Tonemap modus,Tryb Mapowania Tonów,Tipo de tonemap,,Mod Tonemap,Режим тоун-мэппинга,Тонирано-мапни мод +Lens distortion effect,GLPREFMNU_LENS,,,,Efekt distorze čočky,Optischer Verzerrungseffekt,,Lensdistorto-efiko,Efecto de distorsión de lente,,Linssinvääristystehoste,Effet distorsion de lentille,,Effetto distorsione della lente,レンズの歪みエフェクト,렌즈 왜곡 효과,Effect van de lensvervorming,Efekt zniekształcenia obiektywu,Efeito de distorção de lente,Efeito de distorção da lente,Efect de distorsionare,Искажение линзы,Дисторзија објектива ефект +FXAA Quality,GLPREFMNU_FXAA,,,,Kvalita FXAA,FXAA Qualität,,Kvaliteco de FXAA,Calidad FXAA,,FXAA-laatu,Qualité FXAA,,Qualità FXAA,FXAA品質,FXAA 품질,FXAA-kwaliteit,Jakość FXAA,Qualidade de FXAA,,Calitate FXAA,Качество FXAA,FXAA квалитет +Dither output,GLPREFMNU_DITHER,,,,Dithering,Dithering,,Diteri eligon,Dither de salida,,Sekoitussävytyksen (dithering) ulostulo,Dithering,,Dithering,ディザー出力,떨림 효과 출력,Dither output,Dygotanie,Dithering,,Putere Dithering,Дизеринг,Учестаност трептања +Tonemap Palette Order,GLPREFMNU_PALTONEMAPORDER,,,,Pořadí palety tónovací mapy,Palettensortierung für Tonemap,,Ordo de kolormapo-paletro,Orden de la paleta en mapa de tonos,,Sävykartan paletin järjestys,Ordre des palettes tonemap,,Ordine della Palette Tonemap,トーンマップパレット順序,톤맵 팔레트 순서,Tonemap Palet Orde van het Tonemap-palet,Kolejność Palet Mapowania Tonów,Ordem da paleta do tonemap,,Ordine paletă Tonemap,Порядок палитры тоун-мэпа,Тонирано-мапни палетни ред +Tonemap Palette Exponent,GLPREFMNU_PALTONEMAPPOWER,,,,Exponent palety tónovací mapy,Palettenexponent für Tonemap,,Exponeto de kolormapo-paletro,Exponente paleta en mapa de tonos,,Sävykartan paletin eksponentti,Exponent des palettes tonemap,,Esponente della Palette Tonemap,トーンマップパレット指数,톤맵 팔레트 지수,Tonemap Palet Exponent,Wykładnik Palet Mapowania Tonów,Expoente da paleta do tonemap,,Exponent paletă Tonemap,Экспонента палитры тоун-мэпа,Тонирано-мапни палетни експонент +Multisample,GLPREFMNU_MULTISAMPLE,,,,Multisampling,Multisampling,,Plurspecimeno,Multisampling,,Moninäytteistys,,,,マルチサンプル,멀티샘플,,Multipróbkowanie,Multiamostragem,,Multisampling,Мультисэмплинг,Мулти-узорак +Bloom effect,GLPREFMNU_BLOOM,,,,Efekt bloom,Bloom Effekt,,Lumŝmir-efiko,Efecto Bloom,,Hehkutehoste (bloom),Effet surbrillance,,Effetto Bloom,ブルーム エフェクト,블룸 효과,Bloei effect,Effekt Bloom,Efeito Bloom,,Efect Bloom,Режим блум,Мутан вид ефект +Ambient occlusion quality,GLPREFMNU_SSAO,,,,Kvalita ambient occlusion,Ambient Occlusion Qualität,,Kvaliteco de media okluso,Calidad de oclusión ambiental,,Yleisvarjostuksen (ambient occlusion) laatu,Qualité Occlusion Ambiente,,Qualità occlusione ambientale,アンビエント オクルージョンの品質,주변 환경 가림 효과 품질,Ambient occlusion kwaliteit,Jakość okluzji otoczenia,Qualidade de oclusão de ambiente,,Calitate ocluzie ambientală,Качество ambient occlusion,Оклузија амбијента ефект +Portals with AO,GLPREFMNU_SSAO_PORTALS,,,,Portály s AO,Portale mit AO,,Portaloj kun media okluso,Portales con OA,,Yleisvarjostuksen portaalit,OA pour les portails,,Portali con l'OA,AOを伴うポータル,주변 환경 가려진 포탈,Portalen met AO,Portale z okluzją otoczenia,Portais com oclusão de ambiente,,Portaluri cu ocluzie ambientală,"Порталы с ambient occlusion +",Портали са AO +Menu Blur,GLPREFMNU_MENUBLUR,,,,Rozostření pozadí v menu,Menüunschärfe,,Menumalpurigo,Difuminación de Menú,,Valikon sumennus,Flou menu,,Blur del menu,メニューブラー,메뉴 흐림 효과,Menu vervagen,Rozmycie w Menu,Desfoque do Menu,Desfocagem do Menu,Neclaritate Meniu,Размытие фона меню,Блур мениа +,,Textures,,,,,,,,,,,,,,,,,,,,, +Texture Filter mode,GLTEXMNU_TEXFILTER,,,,Režim filtrování textur,Texturfiltermodus,,Reĝimo por Teksturfiltrado,Modo de filtro de texturas,,Pintakuviointien suodatustapa,Mode de Filtrage Texture,,Modalità filtro texture,テクスチャーフィルター モード,텍스쳐 필터 모드,Textuur Filter mode,Tryb Filtrowania Tekstur,Modo de filtragem de textura,,Mod Filtrare Texturi,Фильтрация текстур,Текстурни филтер мод +Anisotropic filter,GLTEXMNU_ANISOTROPIC,,,,Anisotropické filtrování,Anisotropische Filterung,,Anizotropa Filtro,Filtro anisotrópico,,Anisotrooppinen suodatus,Filtre Anisotropique,,Filtro anisotropico,異方性フィルター,이방성 필터,Anisotroop filter,Filtr anizotropowy,Filtragem anisotrópica,,Filtrare Anizotropică,Анизотропная фильтрация,Анизотропни фолтер +None (nearest mipmap),OPTVAL_NONENEARESTMIPMAP,,,,Žádné (nejbližší mipmapa),Aus (nächste Mipmap),,Nenio (plej proksima mipmapo),Ninguno (mipmap cercano),,Ei mitään (lähin mipkartta),Aucun (mipmap proche voisin),,Nessuno (mipmap più vicina),なし(最寄りミップマップ),없음 (밉멥에 가까움),Geen (dichtstbijzijnde mipmap),Brak (najbliższa mipmapa),Nenhum (mipmap vizinho mais próximo),,Niciuna (mipmap de apropriere),Нет (ближайший мипмап),Ништа (најближи мипмап) +None (linear mipmap),OPTVAL_NONELINEARMIPMAP,,,,Žádné (lineární mipmapa),Aus (lineare Mipmap),,Nenio (linia mipmapo),Ninguno (mipmap lineal),,Ei mitään (lin. mipkartta),Aucun (mipmap linéaire),,Nessuno (mipmap lineare),なし(リニアミップマップ),없음 (선형 밉맵),Geen (lineaire mipmap),Brak (liniowa mipmapa),Nenhum (mipmap linear),,Niciuna (mipmap liniar),Нет (линейный мипмап),Ништа (линеаран мипмап) +None (trilinear),OPTVAL_NONETRILINEAR,,,,Žádné (trilineární),Aus (trilinear),,Nenio (trilinia),Ninguno (trilineal),,Ei mitään (trilineaarinen),Aucun (mipmap trilinéaire),,Nessuno (mipmap trilineare),なし(トライリニア),없음 (삼선형),Geen (trilineair),Brak (trzyliniowe),Nenhum (trilinear),,Niciuna (trilinar),Нет (трилинейная),Ништа (трилинеарно) +Bilinear,OPTVAL_BILINEAR,,,,Bilineární,,,Dulinia,Bilineal,,Bilineaarinen,Bilinéaire,,Bilineare,バイリニア,쌍선형,Bilineair,Dwuliniowe,,,Biliniar,Билинейная,Билинеарно +Trilinear,OPTVAL_TRILINEAR,,,,Trilineární,,,Trilinia,Trilineal,,Trilineaarinen,Trilinéaire,,Trilineare,トライリニア,삼선형,Trilineair,Trzyliniowe,,,Triliniar,Трилинейная,Трилинеарно +2x,OPTVAL_2X,,,,,,,2-oble,,,,,,,,,,,,,,, +4x,OPTVAL_4X,,,,,,,4-oble,,,,,,,,,,,,,,, +8x,OPTVAL_8X,,,,,,,8-oble,,,,,,,,,,,,,,, +16x,OPTVAL_16X,,,,,,,16-oble,,,,,,,,,,,,,,, +32x,OPTVAL_32X,,,,,,,32-oble,,,,,,,,,,,,,,, +,,Video Mode,,,,,,,,,,,,,,,,,,,,, +Video Mode,VIDMNU_TITLE,,,,Režim displeje,Videomodus,,Video-reĝimo,Modos de video,,Videotila,Mode Vidéo,,Modalità video,ビデオ 調整,화면 설정,Videomodus,Tryb Wideo,Modo de Vídeo,,,Настройки видеорежима,Видео мод +Notebook Switchable GPU,DSPLYMNU_GPUSWITCH,,,,Přepínatelné GPU pro notebooky,GPU Umschaltung für Notebooks,,Kajero Ŝanĝa GPU,GPU Altern. de Portátil,,Kannettavan kytkettävä grafiikkapiiri,GPU alternatif sur PC Portable,Váltható GPU laptopon,Scheda GPU Switchable per notebook,ノートブックGPU切替,노트북 성능 조정,Notitieboekje schakelbare GPU,Zmiana GPU Notebooka,Placa de vídeo alternativa de notebook,,,Использование GPU ноутбука,Користи GPU ноутбук +Scaled (Nearest),OPTVAL_SCALENEAREST,,,,Škálován (nejbližší),Skaliert (nächster Nachbar),,Skalita (Plej proksime),Escalado (Cercano),,Skaalattu (läheisin),Mis à l'échelle (Proche Voisin),,Scalato (più vicino),スケーリング (最寄り),확대 (가깝게),Geschaald (Dichtstbijzijnde),Przeskalowany (Najbliższy),Redimensionado (Vizinho mais próximo),Redimensionado (Apróximado),,Масштабировать (ближайшее),Скалиран (најближи) +Scaled (Linear),OPTVAL_SCALELINEAR,,,,Škálován (lineární),Skaliert(linear),,Skalita (Linia),Escalado (Lineal),,Skaalattu (lineaarinen),Mis à l'échelle (Linéaire),,Scalato (lineare),スケーリング (リニア),확대 (선형 식),Geschaald (Lineair),Przeskalowany (Liniowy),Redimensionado (Linear),,,Масштабировать (линейное),Скалиран (линеарно) +Letterbox,OPTVAL_LETTERBOX,,,,,,,Leterkesto,,,,,,Bande nere,レターボックス,레터박스,Brievenbus,,,,,Экранное каше,Поштанско сандуче +Stretch,OPTVAL_STRETCH,,,,Roztažený,Strecken,,Streĉi,Estrechado,Estrecho,Venytetty,Etirer,,Disteso,伸縮,늘림,Rek,Rozciągnięty,Esticado,,,Растянутый,Растегнуто +Render Mode,VIDMNU_RENDERMODE,,,,Režim renderování,Rendermodus,,Bildigo-reĝimo,Modo de Renderizado,,Hahmonnustila,Mode de Rendu,,Modalità motore grafico,レンダラー,렌더링 설정,Render Mode,Tryb Renderowania,Modo de Renderização,,,Режим рендеринга,Рендер мод +Fullscreen,VIDMNU_FULLSCREEN,,,,Přes celou obrazovku,Vollbild,,Plena ekrano,Pantalla completa,,Koko näyttö,Plein écran,,Schermata piena,全画面,전체화면,Volledig scherm,Pełen Ekran,Tela cheia,Ecrã cheio,,Полный экран,Цео екран +Retina/HiDPI support,VIDMNU_HIDPI,,,,Podpora Retiny/HiDPI,Retina/HDPI-Unterstützung,,Retino/HiDPI subteno,Soporte para Retina/HiDPI,,Retina/HiDPI-tuki,Support Retina/HiDPI ,Retina/HiDPI támogatás,Supporto Retina/HiDPi,Retina/HiDPI サポート,망막/하이DPI 활성화,Retina / HiDPI-ondersteuning,Wsparcie Retina/HiDPI,Suporte para Retina/HiDPI,,,Поддержка Retina/HiDPI,Retina/HiDPI подршка +Aspect ratio,VIDMNU_ASPECTRATIO,,,,Poměr stran,Seitenverhältnis,,Ekran-proporcio,Relación de aspecto,,Kuvasuhde,Rapport D'Aspect,Képarány,Proporzioni,アスペクト比,종횡비,Beeldverhouding,Wpółczynnik proporcji,Proporção de tela,Proporção de ecrã,,Соотношение сторон,Однос гледишта +Force aspect ratio,VIDMNU_FORCEASPECT,,,,Vynutit poměr stran,Erzwinge Seitenverhältnis,,Devigi ekran-proporcion,Forzar relación de aspecto,,Pakota kuvasuhde,Forcer Rapport,,Forza le proporzioni,アスペクト比に従う,강제 종횡비,Geforceerde beeldverhouding,Wymuś współczynnik proporcji,Forçar proporção de tela,Forçar proporcção de ecrã,,Принудительное соотношение сторон,Присили однос гледишта +Forced ratio style,VIDMNU_CROPASPECT,,,,Vynucený poměr stran,Modus für erzwungenes Seitenverhältnis,,Maniero por devigi proporcion,Relación de aspecto forzada,,Kuvasuhteen pakotustapa,Style de Ratio forcé,,Forza lo stile delle proporzioni,比率の形式,강제 비율 스타일,Gedwongen verhouding stijl,Wymuszony styl współczynnika,Forçar tipo de proporção,,,Тип принудительного соотношения сторон,Присиљен стил односа +Enable 5:4 aspect ratio,VIDMNU_5X4ASPECTRATIO,,,,Povolit poměr stran 5:4,Erlaube 5:4 Seitenverhältnis,,Aktivigi 5:4 ekran-proporcion,Activar relación de aspecto 5:4,,Ota käyttöön 5:4-kuvasuhde,Activer Rapport 5:4,5:4 képarány engedélyezése,Abilita le proporzioni 5:4,5:4アスペクト比を可能にする,5:4 비율 사용,Inschakelen 5:4 beeldverhouding,Włącz współczynnik proporcji 5:4,Habilitar proporção 5:4,,,Включить соотношение сторон 5:4,Омогући 5:4 однос гледишта +Resolution scale,VIDMNU_SCALEMODE,,,,Škálování rozlišení,Skalierung,,Distingivo-skalo,Escala de Resolución,,Resoluution skaalaus,Echelle de Résolution,,Scala di risoluzione,画面スケール,해상도 크기,Resolutie schaal,Skala rozdzielczości,Escala de resolução,,,Масштабирование,Резолуцијска скала +Scale Factor,VIDMNU_SCALEFACTOR,,,,Faktor rozlišení,Skalierungsfaktor,,Skalfaktoro,Factor de Escala,,Skaalauskerroin,Facteur d'échelle,,Fattore di scala,スケール倍率,축척 펙터,Schaalfactor,Współczynnik Skali,Fator de escala,,,Значение масштаба,Фактор скалирања +Use Linear Scaling (Fullscreen),VIDMNU_USELINEAR,,,,Použít lineární škálování (přes celou obrazovku),Lineare Skalierung (Vollbild),,Uzi Linian Skaladon (Plena ekrano),Usar Escalado Linear (Pant. Completa),,Lineaarinen skaalaus (koko näyttö),Mise à l'échelle Linéaire (Plein écran),,Usa lo scaling lineare (a schermo pieno),リニアスケールを使う(全画面),선형 스케일링 사용 (전체화면),Lineaire schaalverdeling gebruiken (volledig scherm),Użyj Liniowego Skalowania (Pełen Ekran),Usar escala linear (tela cheia),Usar escala linear (ecrã cheio),,Линейное масштабирование (полный экран),Користи линеарно скалирање (цео екран) +Custom Pixel Scaling,VIDMNU_CUSTOMRES,,,,Vlastní škálování pixelů,Benutzerdefinierte Skalierung,,Agorda bildero-skalo,Escalado de Pixel Personalizado,,Mukautettu skaalaus,Résolution Personalisée,,Scaling dei pixel personalizzato,カスタム ピクセルスケール,사용자 지정 픽셀 크기 조정,Aangepaste Pixel Schaalvergroting,Niestandardowe Skalowanie Pikseli,Escala de Pixel Personalizada,,,Масштабирование пикселов,Пиксел скалирање +Custom Width,VIDMNU_CUSTOMX,,,,Vlastní šířka,Benutzerdefinierte Breite,,Agorda larĝo,Ancho Personalizado,,Mukautettu leveys,Largeur Personalisée,Egyéni szélesség,Lunghezza,カスタム 幅,사용자 지정 너비,Aangepaste breedte,Niestandardowa Szerokość,Largura Personalizada,,,Длина,Ширина +Custom Height,VIDMNU_CUSTOMY,,,,Vlastní výška,Benutzerdefinierte Höhe,,Agorda alto,Alto Personalizado,,Mukautettu korkeus,Hauteur Personalisée,Egyéni magasság,Altezza,カスタム 高さ,사용자 지정 높이,Aangepaste hoogte,Niestandardowa Wysokość,Altura Personalizada,,,Высота,Висина +Apply Changes (Windowed),VIDMNU_APPLYW,,,,Použít změny (v okně),Änderungen anwenden (Fenster),,Apliki ŝanĝojn (Fenestrito),Aplicar Cambios (ventana),,Ota käyttöön muutokset (ikkuna),Appliquer Changements (Fenêtre),,Applica le modifiche (a finestra),変更を適用(ウィンドウ化),변경 적용 (윈도우),Wijzigingen toepassen (opgewonden),Zatwierdź Zmiany (Okno),Aplicar alterações (janela),,,Сохранить изменения (оконный режим),Примени промене (прозор) +Apply Changes (Fullscreen),VIDMNU_APPLYFS,,,,Použít změny (přes celou obrazovku),Änderungen anwenden (Vollbild),,Apliki ŝanĝojn (Plena ekrano),Aplicar Cambios (Pant. Completa),,Ota käyttöön muutokset (koko näyttö),Appliquer Changements (Plein écran),,Applica le modifiche (a schermo pieno),変更を適用(全画面化),변경 적용 (전체화면),Wijzigingen toepassen (Volledig scherm),Zatwierdź Zmiany (Pełen Ekran),Aplicar alterações (tela cheia),Aplicar alterações (ecrã cheio),,Сохранить изменения (полный экран),Примени промене (цели екран) +Choose Resolution Preset,VIDMNU_RESPRESET,,,,Vybrat přednastavené rozlišení,Auflösungsvoreinstellung,,Elekti Agordaĵon por Distingivo,Seleccionar Preset de Resolución,,Valitse ennalta määritetty resoluutio,Choisir paramètre personalisé,,Scegli preset di risoluzione,解像度プリセットを選ぶ,해상도 사전 설정 선택,Kies een vooraf ingestelde resolutie,Wybierz Zestaw Rozdzielczości,Escolher Resolução Predefinida,,,Выбор пресета разрешения,Резолуцијска подешавања +Custom Resolution Presets,VIDMNU_RESPRESETTTL,,,,Vlastní přednastavení rozlišení,Benutzerdefinierte Auflösungsvoreinstellungen,,Laŭmendaj agordaĵoj por Distingivo,Seleccionar Preset de Resoluciones,,Ennalta määritetyt mukautetut resoluutiot,Résolutions Personalisée,,Preset di risoluzione personalizzati,カスタム解像度プリセット,사용자 지정 해상도 미리 조정,Vooraf ingestelde aangepaste resolutie,Niestandardowe Zestawy Rozdzielczości,Predefinições Personalizadas,,,Пользовательские пресеты,Резолуцијска подешавања +Preset Resolution Modes,VIDMNU_RESPRESETHEAD,,,,Přednastavená rozlišení,Vordefinierte Auflösungsmodi,,Agordaĵaj Distingivreĝimoj,Modos de Preset de Resolución,,Ennalta määritetyt resoluutiotilat,Choisir mode de Résolution,,Modalità preset di risoluzione,解像度モードの調整,해상도 미리 조정 모드,Vooraf ingestelde resolutie modi,Tryby Zestawów Rozdzielczości,Modos de Resolução Predefinidas,,,Доступные разрешения,Постављени резолуцијски модови +4:3 Aspect,VIDMNU_ASPECT43,,,,Poměr stran 4:3,4:3 Seitenverhältnis,,4:3 Proporcio,Aspecto 4:3,,4:3-tilat,Rapport 4:3,,Aspetto 4:3,4:3アスペクト比,4:3 비율,,Proporcje 4:3,Proporção 4:3,,,Соотношение сторон 4:3,4:3 гледиште +5:4 Aspect,VIDMNU_ASPECT54,,,,Poměr stran 5:4,5:4 Seitenverhältnis,,5:4 Proporcio,Aspecto 5:4,,5:4-tilat,Rapport 5:4,,Aspetto 5:4,5:4アスペクト比,5:4 비율,,Proporcje 5:4,Proporção 5:4,,,Соотношение сторон 5:4,5:4 гледиште +16:9 Aspect,VIDMNU_ASPECT169,,,,Poměr stran 16:9,16:9 Seitenverhältnis,,16:9 Proporcio,Aspecto 16:9,,16:9-tilat,Rapport 16:9,,Aspetto 16:9,16:9アスペクト比,16:9 비율,,Proporcje 16:9,Proporção 16:9,,,Соотношение сторон 16:9,16:9 гледиште +16:10 Aspect,VIDMNU_ASPECT1610,,,,Poměr stran 16:10,16.10 Seitenverhältnis,,16:10 Proporcio,Aspecto 16:10,,16:10-tilat,Rapport 16:10,,Aspetto 16:10,16:10アスペクト比,16:10 비율,,Proporcje 16:10,Proporção 16:10,,,Соотношение сторон 16:10,16:10 гледиште +Normal,OPTVAL_NORMAL,,,,Normální,,,Normala,,,Normaali,,,Normale,通常,기본형,Normaal,Normalny,Normal,,,Обычный,Нормално +Lowest Possible Scale,OPTVAL_LOWEST,"This describes vid_scalemode 6, which represents the lowest possible scaling to fill the allocated screen area",,,Nejmenší možná velikost,Kleinstmögliche Auflösung,,Plej Malpli Ebla Skalo,Menor Escala Posible,,Pienin mahdollinen skaalaus,Echelle la plus faible,,,可能な限り最小,,,,Menor Escala Possível,,Cea mai mică scară posibilă,, +Custom,OPTVAL_CUSTOM,,,,Vlastní,Benutzerdefiniert,,Laŭmenda,Personalizado,,Mukautettu,Modifié,,Personalizzato,カスタム,사용자 지정,Gebruiker gedefinieerd,Niestandardowe,Personalizado,,Personalizat,Польз.,Прилагођ. +Max FPS,VIDMNU_MAXFPS,,,,,,,,,,Kuvataajuuden rajoitin,,,,,,,,Taxa máxima de FPS,,Cadre pe secundă,, +60 fps,OPTVAL_60FPS,,,,,,,,,,60 kuvaa/s,,,,,,,,,,,, +75 fps,OPTVAL_75FPS,,,,,,,,,,75 kuvaa/s,,,,,,,,,,,, +90 fps,OPTVAL_90FPS,,,,,,,,,,90 kuvaa/s,,,,,,,,,,,, +120 fps,OPTVAL_120FPS,,,,,,,,,,120 kuvaa/s,,,,,,,,,,,, +144 fps,OPTVAL_144FPS,,,,,,,,,,144 kuvaa/s,,,,,,,,,,,, +200 fps,OPTVAL_200FPS,,,,,,,,,,200 kuvaa/s,,,,,,,,,,,, +Preferred Rendering API,VIDMNU_PREFERBACKEND,,,,Upřednostňované renderovací API,Bevorzugtes Render API,Προτιμούμενο Rendering API,Preferita Bildigado de API,API de Renderizado Preferida,,Ensisijainen hahmonnuksen ohjelmointirajapinta,API de rendu préférée,,API di rendering preferita,優先レンダリングAPI,기본적인 API 랜더링,Voorkeur rendering API,Preferowany interfejs API renderowania,API de Renderização Preferida,,API Video Preferat,Предпочтительный интерфейс рендеринга,Преферред АПИ приказивања +OpenGL,OPTVAL_OPENGL,,,,,,,,,,,,,,,,,,,,,, +Vulkan,OPTVAL_VULKAN,,,,,,,,,,,,,,,,,,,,,, +SoftPoly,OPTVAL_SOFTPOLY,,,,,,,,,,,,,,,,,,,,,, +,,Miscellaneous Options,,,,,,,,,,,,,,,,,,,,, +Miscellaneous Options,MISCMNU_TITLE,,,,Ostatní nastavení,Verschiedene Optionen,,Ekstraĵa agordoj,Opciones Misceláneas,,Sekalaiset asetukset,Options Annexes,,Opzioni miste,その他のオプション,그 외 설정,Diverse opties,Różne Opcje,Outras Opções,,,Дополнительные настройки,Разна подешавања +Merge left+right Alt/Ctrl/Shift,MISCMNU_MERGEKEYS,,,,Zkombinovat pravý a levý Alt/Ctrl/Shift,Linke und rechte Umschalt/Strg/Alt zusammenfassen,,Kunigi maldekstro+dekstro Alt/Ctrl/Shift,Combinar izq.+der. Alt/Ctrl/Mayús,,Yhdistä vasen ja oikea Alt/Ctrl/Vaihto,Combiner Alt/Ctrl/maj gauche & droite,,Unisci sinistra+destra Alt/Control/Maiusc,左と右のALT/CTRL/SHIFTキーを統合,양쪽 ALT/CTRL/SHIFT키 합병,Samenvoegen links+rechts Alt/Ctrl/Shift,Połącz przyciski lewo+prawo Alt/Ctrl/Shift,Unir teclas Alt/Ctrl/Shift esquerdas e direitas,Juntar Alt/Ctrl/Shift esquerdo+direito,,Не разделять левый/правый ALT/CTRL/SHIFT,Споји лево+десно Аlt/Ctrl/Shift +Alt-Enter toggles fullscreen,MISCMNU_WINFULLSCREENTOGGLE,,,,Alt-Enter přepíná celou obrazovku,Alt-Enter schaltet Vollbild an/aus,,Alt klavo-Enter klavo baskuligi tutekranon,Alt+Enter alterna pantalla completa,,Alt-Enter kytkee täyden ruudun päälle/pois,Alt-Entrée alterne plein écran,,Alt-Invio attiva/disattiva lo schermo pieno,ALTとENTERで全画面に切り替え,ALT+ENTER키로 전체화면 조정,Alt-Enter schakelt het volledige scherm aan/uit,Alt-Enter przełącza na pełen ekran,Alt-Enter ativa tela cheia,Alt-Enter ativa ecrã cheio,,Переключение полного экрана по ALT+ENTER,Alt-Enter пребацује на цео екран +Command-F toggles fullscreen,MISCMNU_MACFULLSCREENTOGGLE,,,,Command-F přepíná celou obrazovku,Cmd-F schaltet Vollbild an/aus,,Komando-F baskuligi tutekranon,Cmd-F alterna pantalla completa,,Komento-F kytkee täyden ruudun päälle/pois,Command-F alterne plein écran,,Command-F attiva/disattiva lo schermo pieno,Ctrl + Fキーで全画面表示,COMMAND+F키로 전체화면 조정,Command-F schakelt het volledige scherm aan/uit,Command-F przełącza pełny ekran,Command-F ativa tela cheia,Command-F ativa ecrã cheio,,Переключение полного экрана по Command+F,Command-F пребацује на цео екран +Enable autosaves,MISCMNU_ENABLEAUTOSAVES,,,,Povolit automatické ukládání,Automatisches Speichern,,Aktivigi aŭtokonservojn,Activar autoguardado,,Ota käyttöön automaattiset tallennukset,Activer Sauvegardes auto,,Abilita i salvataggi automatici,オートセーブを有効化,빠른 저장 허용,Automatisch opslaan inschakelen,Włącz autozapis,Habilitar salvamento automático,Permitir gravação automática,,Автосохранения,Омогући аутосејвове +Number of autosaves,MISCMNU_AUTOSAVECOUNT,,,,Počet automatických uložených her,Anzahl von automatischen Speicherständen,,Kvanto da aŭtokonservojn,Número de autoguardados,,Automaattisten tallennusten lukumäärä,Total de sauvegardes auto,,Numero di salvataggi automatici,オートセーブの最大数,빠른 저장 수,Aantal autosafes,Liczba autozapisów,Número de salvamentos automáticos,Número de gravações automáticos,,Количество автосохранений,Број аутоматских чувања +Save/Load confirmation,MISCMNU_SAVELOADCONFIRMATION,,,,Potvrzení o uložení/načtení,Laden/Speichern bestätigen,,Konservi/Ŝarĝi jesigo,Confirmación al guardar/cargar,,Tallennuksen/Latauksen vahvistus,Confirmation C/S,,Conferma Salvataggio/Caricamento,セーブ/ロード時に確認,스크립트로 스크린샷 생성 허용,Opslaan/Laad bevestiging,Potwierdzenie zapisu/wczytania,Confirmação ao salvar/carregar,Confirmação ao gravar/carregar,,Подтверждение при сохранении/загрузке,Потврђивање током чувања/учитавања +Disable keyboard cheats,MISCMNU_NOCHEATS,,,,,Tastatur-Cheats deaktivieren,,Malaktivigi klavaran trumpon,Desactivar trucos por teclado,,Poista näppäinhuijaukset,,,,キーボードからのチート無効,,Schakel cheats uit,,Desabilitar trapaças de teclado,,,, +Quicksave rotation,MISCMNU_QUICKSAVEROTATION,,,,Rotace rychle uložených her,Schnellspeicherrotation,,Rapidkonservado-rotacio,Rotación de Salvado Rápido,,Pikatallennuskierto,Rotation Sauvegardes Rapides,,Rotazione rapide della quicksave,クイックセーブ間隔,빠른 저장 간격,Roteer quicksaves,Rotacja szybkich zapisów,Rotação de quicksave,,,Чередовать слоты для быстрых сохранений,Окретање брзих чувања +Number of quicksaves in rotation,MISCMNU_QUICKSAVECOUNT,,,,Počet rychle uložených her v rotaci,Anzahl Schnellspeicherplätze,,Nombro da rapidkonservitaj ludoj en rotaciado,Número de Salvados Rápidos en Rotación,,Pikatallennusten määrä kierrossa,Nombre de sauvegardes en rotation,,Numero di quicksaves in rotazione,間隔クイックセーブの数,빠른 저장 간격의 수,Aantal roterende quicksaves,Ilość szybkich zapisów w rotacji,Número de quicksaves em rotação,,,Кол-во слотов для быстрых сохранений,Број брзих чувања у окретању +Default Crosshair,HUDMNU_CROSSHAIR,,,,Výchozí zaměřovač,Standard-Fadenkreuz,,Defaŭlta Translinio,Retícula por defecto,,Oletustähtäin,Viseur par défaut,Alapcélkereszt,Mirino di default,デフォルトの照準,기본 조준점,Standaard dradenkruis,Domyślny celownik,Mira padrão,,Țintă implicită,Тип прицела,Уобичајени нишан +Crosshair color,HUDMNU_CROSSHAIRCOLOR,,,Crosshair colour,Barva zaměřovače,Fadenkreuzfarbe,,Translinikoloro,Color de la retícula,,Tähtäimen väri,Couleur Viseur,Célkereszt színe,Colore mirino,照準色,조준점 색깔,Dradenkruis kleur,Kolor celownika,Cor da mira,,Culoare țintă,Цвет прицела,Боја нишана +Crosshair shows health,HUDMNU_CROSSHAIRHEALTH,,,,Zaměřovač zobrazuje zdraví,Fadenkreuz zeigt Gesundheit,,Translinio montri sanon,Mostrar salud en retícula,,Tähtäin näyttää terveyden,Couleur Viseur selon santé,Életerő jelzése a célkereszten,Il mirino mostra la salute,照準のヘルス表示,조준점과 체력 연동,Draadenkruis toont gezondheid,Celownik pokazuje zdrowie,Mostrar saúde na mira,Mostra vida na mira,Ținta afișează starea sănătății,Цвет прицела по состоянию здоровья,Нишан приказује здравље +Scale crosshair,HUDMNU_CROSSHAIRSCALE,,,,Velikost zaměřovače,Fadenkreuz skalieren,,Skali translinion,Escalar retícula,,Skaalaa tähtäintä,Mise à l'échelle du viseur,,Scala del mirino,照準サイズ,조준점 크기,Dradenkruis schalen,Skala celownika,Escala da mira,,Dimensiune țintă,Масштабирование прицела,Размера нишана +Standard,OPTVAL_YES_STANDARD,copied from elsewhere,,,Standardní,,Πρότυπο,Norma,Estándar,,Normaali,,,,標準,기본,Standaard,Standard,Padrão,,,Стандартный,Стандардни +Enhanced,OPTVAL_YES_ENHANCED,,,,Vylepšené,Verbessert,Ενισχυομένο,Bonigita,Mejorado,,Paranneltu,Amélioré,,Migliorata,強調,고급,Verbeterd,Ulepszone,Melhorado,,Îmbunătățit,Улучшенный,Побољшани +Language,OPTMNU_LANGUAGE,,,,Jazyk,Sprache,Γλώσσα,Lingvo,Idioma,,Kieli,Langage,Nyelv,Lingua,言語設定,언어,Taal,Język,Idioma,,Limbă,Язык,Језик +,,Reverb editor,,,,,,,,,,,,,,,,,,,,, +Undo Changes,TXT_UNDOCHANGES,,,,Zrušit změny,Rückgängig machen,Αναίρεση Αλλαγών,Malfari Ŝanĝojn,Anular cambios,,Peruuttaa muutokset,Révoquer les changements,,Revocare le modifiche,変更を戻す,변경 사항 취소,Wijzigingen ongedaan maken,Cofnij Zmiany,Desfazer alterações,,Anulează Modificările,Отменить изменения,Поништи промене +Select Environment,REVMNU_SELECT,,,,Vybrat prostředí,Umgebung wählen,Επιλογή Περιβάλλοντος,Elekti Medion,Seleccionar Ambiente,,Valitse tila,Sélectionner un environnement,,Seleziona ambiente,反響選択,환경 선택,Selecteer omgeving,Wybierz Środowisko,Selecione o Ambiente,,Alegere Mediu,Выбрать окружение,Изабери окружење +Test Environment,REVMNU_TEST,,,,Testovat prostředí,Umgebung testen,Δοκιμαστκό Περιβάλλον,Provi Medion,Probar Ambiente,,Testaa tilaa,Tester un environnement,,Testare ambiente,反響テスト,환경 테스트,Test omgeving,Testuj Środowisko,Testar Ambiente,,Testare Mediu,Тестировать окружение,Тестирај окружење +Edit Environment,REVMNU_EDIT,,,,Upravit prostředí,Umgebung editieren,Επεξεργασία Περιβάλλοντος,Modifi Medion,Editar Ambiente,,Muokkaa tilaa,Modifier un environnement,,Modifica ambiente,反響編集,환경 편집,Omgeving bewerken,Edytuj Środowisko,Editar Ambiente,,Editare Mediu,Редактировать окружение,Уреди окружење +New Environment,REVMNU_NEW,,,,Nové prostředí,Neue Umgebung,Νέο Περιβάλλον,Nova Medion,Nuevo Ambiente,,Uusi tila,Nouveau environnement,,Nuovo ambiente,新規反響設定,새로운 환경 생성,Nieuwe omgeving,Nowe Środowisko,Novo Ambiente,,Mediu Nou,Новое окружение,Ново окружење +Revert settings,REVMNU_REVERT,,,,Obnovit nastavení,Zurücksetzen,Επαναφορά Ρυθμίσεων,Defaŭltigi agordojn,Revertir Configuración,,Palauta asetukset,Réinitialiser les paramètres,,Ripristina impostazioni,設定を戻す,설정 되돌리기,Instellingen terugzetten,Przywróć ustawienia,Reverter definições,,Revenire la setările precedente,Настройки по умолчанию,Врати подешавања +Environment Size,REVMNU_ENVIRONMENT_SIZE,Please translate only if you know how to properly name this technical jargon!,,,,,Μέγεθος Περιβάλλοντος,Mediamplekso,Tamaño de Ambiente,,Tilan koko,Taille Environnement,,,反響サイズ,공간 크기,,,Tamanho do Ambiente,,,, +Environment Diffusion,REVMNU_ENVIRONMENT_DIFFUSION,,,,,,Διάχυση Περιβάλλοντος,Medidifuzo,Difusión de Ambiente,,Tilan äänen hajautuminen,Diffusion Environnement,,,反響伝播,공간 잔향 확산,,,Difusão do Ambiente,,,, +Room,REVMNU_ROOM,,,,,,Δωμάτιο,Ĉambro,Sala,,Tilan keskitaajuudet,Salle,,,,룸 효과,,,Sala,,,, +Room HF,REVMNU_ROOM_HF,,,,,,Δωμάτιο HF,Ĉambro (AF),Sala (Frecuencia Alta),,Tilan korkeat taajuudet,HF Salle,,,,룸 효과 HF,,,Sala (Alta Frequência),,,, +Room LF,REVMNU_ROOM_LF,,,,,,Δωμάτιο LF,Ĉambro (MaF),Sala (Frecuencia Baja),,Tilan matalat taajuudet,LF Salle,,,,룸 효과 LF,,,Sala (Baixa Frequência),,,, +Decay Time,REVMNU_DECAY_TIME,,,,,,,Putriĝo-tempo,Tiempo de Decadencia,,Häipymäaika,Temps Decay,,,,잔향 감쇠 시간,,,Tempo de Decaimento,,,, +Decay HF Ratio,REVMNU_DECAY_HF_RATIO,,,,,,,Putriĝo-proporcio (AF),Ratio de Decadencia (Frecuencia Alta),,Korkeiden taajuuksien (HF) häipymissuhdeluku,,,,Decay HF比率,잔향 감쇠 HF 비율,,,Taxa de Decaimento (Alta Freq.),,,, +Decay LF Ratio,REVMNU_DECAY_LF_RATIO,,,,,,,Putriĝo-proporcio (MaF),Ratio de Decadencia (Frecuencia Baja),,Matalien taajuuksien (LF) häipymissuhdeluku,,,,Decay LF比率,잔향 감쇠 LF 비율,,,Taxa de Decaimento (Baixa Freq.),,,, +Reflections,REVMNU_REFLECTIONS,,,,,,Αντανακλάσεις,Reflektoj,Reflejos,,Ensiheijastukset,,,,,룸 반사,,,Reflexos,,,, +Reflections Delay,REVMNU_REFLECTIONS_DELAY,,,,,,Καθυστέρηση Αντανακλάσεων,Prokrasto de Reflektoj,Retraso de Reflejos,,Ensiheijastusten viive,Délai Reflections,,,,룸 반사 딜레이 시간,,,Atraso de Reflexos,,,, +Reflections Pan X,REVMNU_REFLECTIONS_PAN_X,,,,,,,Reflektoj Alturnas tra X,Desplazamiento en X de Reflejos,,Ensiheijastusten X-panorointi,Orientation Reflections X,,,Reflections X定位,X축 룸 반사,,,Deslocamento X de Reflexos,,,, +Reflections Pan Y,REVMNU_REFLECTIONS_PAN_Y,,,,,,,Reflektoj Alturnas tra Y,Desplazamiento en Y de Reflejos,,Ensiheijastusten Y-panorointi,Orientation Reflections Y,,,Reflections Y定位,Y축 룸 반사,,,Deslocamento Y de Reflexos,,,, +Reflections Pan Z,REVMNU_REFLECTIONS_PAN_Z,,,,,,,Reflektoj Alturnas tra Z,Desplazamiento en Z de Reflejos,,Ensiheijastusten Z-panorointi,Orientation Reflections Z,,,Reflections Z定位,Z축 룸 반사,,,Deslocamento Z de Reflexos,,,, +Reverb,REVMNU_REVERB,,,,,,,Resono,Reverberación,,Jälkikaiunta,,,,,리버브,,,Reverberação,,,, +Reverb Delay,REVMNU_REVERB_DELAY,,,,,,,Prokrasto de Resono,Retraso de Reverberación,,Jälkikaiunnan viive,Délai Reverb,,,,리버브 지연,,,Atraso de Reverberação,,,, +Reverb Pan X,REVMNU_REVERB_PAN_X,,,,,,,Resono Alturnas tra X,Desplazamiento en X de Reverberación,,Jälkikaiunnan X-panorointi,Orientation Reverb X,,,Reverb X定位,X축 리버브,,,Deslocamento X de Reverberação,,,, +Reverb Pan Y,REVMNU_REVERB_PAN_Y,,,,,,,Resono Alturnas tra Y,Desplazamiento en Y de Reverberación,,Jälkikaiunnan Y-panorointi,Orientation Reverb Y,,,Reverb Y定位,Y축 리버브,,,Deslocamento Y de Reverberação,,,, +Reverb Pan Z,REVMNU_REVERB_PAN_Z,,,,,,,Resono Alturnas tra Z,Desplazamiento en Z de Reverberación,,Jälkikaiunnan Z-panorointi,Orientation Reverb Z,,,Reverb Z定位,Z축 리버브,,,Deslocamento Z de Reverberação,,,, +Echo Time,REVMNU_ECHO_TIME,,,,,,,Tempo de Eko,Tiempo de Eco,,Kaikuaika,Longueur écho,,,,에코 시간,,,Tempo de Eco,,,, +Echo Depth,REVMNU_ECHO_DEPTH,,,,,,,Produndo de Eko,Profundidad de Eco,,Kaiun syvyys,Profondeur écho,,,,에코 깊이,,,Profundidade de Eco,,,, +Modulation Time,REVMNU_MODULATION_TIME,,,,,,,Tempo de Modulado,Tiempo de Modulación,,Modulaatioaika,Longueur Modulation,,,,전조 시간,,,Tempo de Modulação,,,, +Modulation Depth,REVMNU_MODULATION_DEPTH,,,,,,,Produndo de Modulado,Profundidad de Modulación,,Modulaation syvyys,Profondeur Modulation,,,,전조 깊이,,,Profundidade de Modulação,,,, +Air Absorption HF,REVMNU_AIR_ABSORPTION_HF,,,,,,,Aerabsorbo AF,Absorción en Aire de Frecuencia Alta,,Korkeiden taajuuksien (HF) ilma-absorptio,,,,,대기 흡수 HF,,,Absorção de Ar de Alta Freq.,,,, +HF Reference,REVMNU_HF_REFERENCE,,,,,,,AF Refrenco,Referencia de Frecuencia Alta,,Korkeiden taajuuksien vertausarvo,,,,HF参照値,HF 참조치,,,Referência de Alta Freq.,,,, +LF Reference,REVMNU_LF_REFERENCE,,,,,,,MaF Refrenco,Referencia de Frecuencia Baja,,Matalien taajuuksien vertausarvo,,,,LF参照値,LF 참조치,,,Referência de Baixa Freq.,,,, +Room Rolloff Factor,REVMNU_ROOM_ROLLOFF_FACTOR,,,,,,,Ĉambro-Rolloff-Faktoro,Factor de Roll-off de Sala,,Tilan vaimenemiskerroin,Facteur de rolloff Salle,,,,룸 감쇠 양,,,Fator de Roll-off da Sala,,,, +Diffusion,REVMNU_DIFFUSION,,,,,,,Difuzo,Difusión,,Diffuusio,,,,,잔향 확산,,,Difusão,,,, +Density,REVMNU_DENSITY,,,,,,,Denseco,Densidad,,Tiheys,Densité,,,密度,잔향 밀도,,,Densidade,,,, +Reflections Scale,REVMNU_Reflections_Scale,,,,,,,Skalo de Reflektoj,Escala de Reflejos,,Ensiheijastusten skaala,Echelle Reflections,,,Reflections音階,룸 반사 음계,,,Escala de Reflexos,,,, +Reflections Delay Scale,REVMNU_Reflections_Delay_Scale,,,,,,,Prokrastskalo de Reflektoj,Escala de Retraso de Reflejos,,Ensiheijastusten viiveen skaala,Délai d'échelle reflections,,,Reflections Delay音階,룸 반사 딜레이 음계,,,Escala de Atraso de Reflexos,,,, +Decay Time Scale,REVMNU_Decay_Time_Scale,,,,,,,Tempskalo de Purtiĝo,Escala de Tiempo de Decadencia,,Häipymäajan skaala,Echelle temporelle Decay,,,Decay Time音階,잔향 감쇠시간 음계,,,Escala de Tempo de Decaimento,,,, +Decay HF Limit,REVMNU_Decay_HF_Limit,,,,,,,AF-Limito de Purtiĝo,Limite de Decadencia de Alta Frecuencia,,Häipymän korkeiden taajuuksien raja-arvo,,,,Decay HF限度,잔향 감쇠 HF 한도,,,Limite de Decaimento em Alta Freq.,,,, +Reverb Scale,REVMNU_Reverb_Scale,,,,,,,Skalo de Resono,Escala de Reverberación,,Jälkikaiunnan skaala,Echelle Reverb,,,Reverb音階,리버브 음계,,,Escala de Reverberação,,,, +Reverb Delay Scale,REVMNU_Reverb_Delay_Scale,,,,,,,Prokrastskalo de Resono,Escala de Retraso de Reverberación,,Jälkikaiunnan viiveen skaala,Délai d'échelle Reverb,,,Reverb Delay音階,리버브 딜레이 음계,,,Escala de Atraso de Reverberação,,,, +Echo Time Scale,REVMNU_Echo_Time_Scale,,,,,,,Tempskalo de Eko,Escala de Tiempo de Eco,,Kaikuajan skaala,Echelle temporelle Echo,,,Echo Time音階,에코 시간 음계,,,Escala de Tempo de Eco,,,, +Modulation Time Scale,REVMNU_Modulation_Time_Scale,,,,,,,Tempskalo de Modulado,Escala de Tiempo de Modulación,,Modulaatioajan skaala,Echelle temporelle Modulation,,,Modulation Time音階,전조 시간 음계,,,Escala de Tempo de Modulação,,,, +Based on,REVMNU_Based_on,,,,Založeno na,Basierend auf,Βασισμένο σε,Bazita de,Basado En,,Perustana,Basé sur,,Basato su,音響の元,음향 원본,Gebaseerd op,Bazowane na,Baseado em,,Bazat pe,Основано на,Засновано на +Name,REVMNU_Name,,,,Název,,Όνομα,Nomo,Nombre,,Nimi,Nom,,Name,名前,이름,Naam,Nazwa,Nome,,Nume,Название,Назив +ID #1,REVMNU_ID_1,,,,,,ID #1,ID #1,ID Nº1,,,,,,,아이디 #1,,ID #1,,,,, +ID #2,REVMNU_ID_2,,,,,,ID #2,ID #2,ID Nº2,,,,,,,아이디 #2,,ID #2,,,,, +Create,REVMNU_Create,,,,Vytvořit,Erstellen,Δημιουργία,Krei,Crear,,Luo,Créer,,Creare,作成,생성,Creëren,Stwórz,Criar,,Creare,Создать,Направи +Save...,REVMNU_Save,,,,Uložit...,Speichern...,Αποθήκευση,Konservi...,Guardar...,,Tallenna...,Sauvegarder...,,Salvare...,セーブする...,저장 하기...,Opslaan ...,Zapisz...,Salvar...,,Salvare...,Сохранить...,Сачувај... +File name,REVMNU_File_name,,,,Název souboru,Dateiname,Όνομα αρχείου,Dosiernomo,Nombre de Archivo,,Tiedostonimi,Nom de fichier,,Nome del file,ファイル名,파일 이름,Bestandsnaam,Nazwa pliku,Nome do arquivo,,Nume fișier,Название файла,Назив фајла +Environments to save,REVMNU_Environments_to_save,,,,Prostředí k uložení,Zu speichernde Umgebungen,Περιβάλλοντα για αποθήκευση,Medioj konserviĝendaj,Ambientes para Guardar,,Tallennettavat tilat,Environnements à sauvegarder,,Ambienti da salvare,音響を保存,저장할 공간,Omgevingen om op te slaan,Środowiska do zapisu,Ambientes para salvar,,Medii de salvat,Сохранить окружения…,Окружења за чување +,,Vulkan,,,,,,,,,,,,,,,,,,,,, +Vulkan Options (Experimental),DSPLYMNU_VKOPT,,,,Nastavení Vulkanu (Experimentální),Vulkan Optionen (Experimentell),Vulka Ρυθμίσεις (Πειραματικές),Vulkan Agordoj (Eksperimenta),Opciones de Vulkan (Experimental),,Vulkan-asetukset (kokeellinen),Options Vulkan (Expérimental),,Opzioni Vulkan (Sperimentale),Vulkan機能オプション(実験的),벌칸 설정(실험적),Vulkan Opties (Experimenteel),Opcje Vulkan (Eksperymentalne),Opções de Vulkan (Experimental),,Setări Mod Vulkan (În curs de testare),Настройки Vulkan (экспериментальные),Vulkan подешавања (експериментална) +Vulkan Options,VK_TITLE,,,,Nastavení Vulkanu,Vulkan Optionen,Vulkan Ρυθμίσεις,Vulkan Agordoj,Opciones de Vulkan,,Vulkan-asetukset,Options Vulkan (Expérimental),,Opzioni Vulkan,Vulkan機能オプション,벌칸 설정,Vulkan Opties,Opcje Vulkan,Opções de Vulkan,,Setări Mod Vulkan,Настройки Vulkan,Vulkan подешавања +Enable Vulkan,VKMNU_ENABLE,,,,Povolit Vulkan,Aktiviere Vulkan,Ενεργοποιηση του Vulkan,Aktivigi Vulkan,Activar Vulkan,,Ota käyttöön Vulkan,Activer Vulkan,,Abilita Vulkan,Vulkanを有効化,벌칸 렌더러 사용,Vulkan inschakelen,Włącz Vulkan,Habilitar Vulkan,,Activează modul video Vulkan,Включить Vulkan,Омогући Vulkan +Vulkan Device ID,VKMNU_DEVICE,,,,ID zařízení Vulkanu,Vulkan Geräte ID,Vulkan ID Συσκευής,Vulkan Aparato ID,ID de Dispositivo Vulkan,,Vulkan-laitetunniste,ID du périphérique Vulkan,,Dispositivo ID Vulkan,Vulkanデバイス ID,벌칸 장치 아이디,Vulkan apparaat-ID,ID urządzenia Vulkan,ID do dispositivo Vulkan,,ID Dispozitiv Vulkan,ID устройства Vulkan,Vulkan ID уређаја +High Dynamic Range,VKMNU_HDR,,,,Vysoký dynamický rozsah (HDR),,Υψηλό Δυναμική Εμβέλεια,Alta Dinamika Amplekso,Alto Rango Dinámico,,Korkea dynamiikka-alue (HDR),,,,ハイダイナミックレンジ,하이 다이나믹 레인지,Hoog dynamisch bereik,Obraz HDR,Alto Alcance Dinâmico (HDR),,HDR,HDR,HDR +Warning: The Vulkan renderer is highly experimental!,VK_WARNING,,,,Varování: Vulkan renderer je velmi experimentální!,Achtung: Der Vulkan Renderer ist noch sehr experimentell!,Προειδοποίηση: Ο Vulkan renderer είναι υψηλά πειραματικός!,Averto: La Vulkan bildigilo estas alte eksperimenta!,Advertencia: ¡El renderizado por Vulkan es altamente experimental!,,Varoitus: Vulkan-hahmonnin on hyvin kokeellinen!,Attention: Le moteur de rendu Vulkan est très expérimental!,,Attenzione: il motore grafico Vulkan è altamente sperimentale!,警告:Vulkanレンダラーは実験段階です!,경고: 벌칸 렌더러는 매우 실험적입니다!,Waarschuwing: De Vulkan renderer is zeer experimenteel!,Uwaga: Renderer Vulkan jest bardzo eksperymentalny!,Atenção: O renderizador Vulkan é altamente experimental!,,Atenție: Modul Vulkan este încă în curs de testare!,Внимание: рендерер Vulkan в стадии тестирования!,УПОЗОРЕЊЕ: Vulkan рендерер је врло експерименталан! +These options will require a restart to take effect.,VK_RESTART,,,,Tato nastavení vyžadují restart hry.,Diese Option erfordert einen Neustart!,Αυτές η ρυθμίσεις θα χρειαστούνε επανεκκίνηση για να ισχύσουν,Ĉi tiuj agordoj bezonos rekomencon por efikiĝi.,Estas opciones requieren reiniciar para tener efecto.,,Nämä asetukset vaativat uudelleenkäynnistyksen astuakseen voimaan.,Ces options nécessitent un redémarrage.,,Queste opzioni richiedono il riavvio per avere effetto.,これらのオプションを有効にするには再起動が必要です。,이 설정을 적용하려면 게임을 재시작해야 합니다.,Deze opties vereisen een herstart om van kracht te worden.,"Te opcje będą wymagały ponownego włączenia, aby miały efekt.",É necessário reiniciar para essas configurações fazerem efeito.,É necessário reiniciar para estas configurações fazerem efeito.,Aceste setări necesită o repornire pentru a putea fi aplicate,Для применения изменений требуется рестарт.,Морате поново покренути GZDoom да би промене ступиле на снагу. +Select Vulkan Device,VKMNU_DEVICESELECT,This is not yet implemented - but it is planned,,,Vyber zařízení Vulkanu,Vulkan Gerät auswählen,Επιλογή Vulkan Συσκευής,Elekti Vulkan Aparaton,Seleccionar Dispositivo Vulkan,,Valitse Vulkan-laite,Sélectionner périphérique Vulkan,,Seleziona il Dispositivo Vulkan,Vulkanデバイスの選択,벌칸 장치를 고르시오,Selecteer Vulkan Apparaat,Wybierz Urządzenie Vulkan,Selecione o dispositivo Vulkan,,Selectare Dispozitiv Vulkan,Выберите устройство Vulkan,Изаберите Vulkan уређај +,,Texture scaling,,,,,,,,,,,,,,,,,,,,, +ScaleNx,OPTVAL_SCALENX,,,,,,,,,,,,,,,,,,,,,, +NormalNx,OPTVAL_NORMALNX,,,,,,,,,,,,,,,,,,,,,, +hqNx,OPTVAL_HQNX,,,,,,,,,,,,,,,,,,,,,, +hqNx MMX,OPTVAL_HQNXMMX,,,,,,,,,,,,,,,,,,,,,, +xBRZ,OPTVAL_NXBRZ,,,,,,,,,,,,,,,,,,,,,, +Old xBRZ,OPTVAL_OLD_NXBRZ,,,,xBRZ (starší),xBRZ alt,Παλίο xBRZ,Malnova xBRZ,Antíguo xBRZ,,Vanha xBRZ,Ancien xBRZ,,Vecchio xBRZ,旧xBRZ,구형 xBRZ,Oud xBRZ,Stare xBRZ,Antigo xBRZ,,Vechiul xBRZ,Старый xBRZ,Стари xBRZ +,,Option Search,,,,,,,,,,,,,,,,,,,,, +Option Search,OS_TITLE,,,,Vyhledávání možností,Optionssuche,Αναζήτηση Ρυθμίσεων,Serĉi Agordojn,Buscar Opciones,,Asetushaku,Recherche Option,,Opzioni di ricerca,オプション検索,옵션 검색,Optie zoeken,Szukanie Opcji,Buscar opção,Procurar opção,Căutare Setări,Поиск настройки,Претрага +Search for any term,OS_ANY,,,,Hledat jakékoli klíčové slovo,Suche nach beliebigem Begriff,Αναζήτηση για όποιαδηποτε λέξη,Serĉi por termino,Buscar cualquier término,,Etsi mitä tahansa sanaa,N'importe quel mot,,Cerca per ciascun termine,いずれかの用語を探す,용어 검색,Zoek naar eender welke term,Szukaj jakiegokolwiek wyrażenia,Buscar por qualquer termo,Procurar por um termo qualquer,Căutare după orice termen,Искать любое из слов,Тражи било који термин +Search for all terms,OS_ALL,,,,Hledat všechna klíčová slova,Suche nach allen Begriffen,Αναζήτηση για όλες της λέξεις,Serĉi por ĉiuj terminoj,Buscar todos los términos,,Etsi kaikki sanat,Tous les mots,,Cerca per tutti i termini,全ての用語を探す,모든 조건 검색,Zoek naar alle termen,Szukaj wszystkich wyrażeń,Buscar por todos os termos,Procurar por todos os termos,Căutare după toți termenii,Искать все слова,Тражи сваки термин +No results found.,OS_NO_RESULTS,,,,Nic nenalezeno.,Keine Resultate,Δέν βρέθηκαν αποτελέσματα,Neniuj rezultoj trovitaj.,Ningun resultado.,,Ei tuloksia.,Pas de résultat trouvé,,Nessun risultato trovato.,見つかりませんでした。,검색 결과 없음.,Geen resultaten gevonden.,Brak wyników,Nenhum resultado encontrado.,,Niciun rezultat găsit.,Результатов не найдено.,Нема резултата. +Search:,OS_LABEL,,,,Hledat:,Suche:,Αναζήτηση:,Serĉi:,Buscar:,,Etsi:,Recherche:,,Trova:,検索:,검색:,Zoeken:,Szukaj:,Busca:,Procura:,Căutare:,Поиск:,Претрага: +,,Blood Bath Announcer,,,,,,,,,,,,,,,,,,,,, +%k boned %o like a fish,TXT_OBITUARY1,,,,%o byl@[ao_cs] vykoštěn@[ao_cs] jako ryba hráčem %k,%k hat %o zerlegt wie einen Fisch,Ο/Η %k ξεκοκάλοσε @[pro2_gr] %o σα ψάρι,%k senostigis %o kiel fiŝon,%k deshuesó a %o como a un pescado,,%k perkasi %o paran kuin kalan,%k a désossé %o comme un poisson,%k kifilézte %o -t mint a halat,%k ha dissossato %o come un pesce,%k は %o の骨を魚のように引っこ抜いた。,%k 은(는) %o 의 뼈를 발랐다.,%k mergelde %o als een vis,%k odfiletował@[ao_pl] %o jak rybę,%k desossou %o como um peixe,,%k l-a dezosat pe %o ca pe un pește,Игрок %k пересчитал косточки игрока %o,%k је очистио %o као рибу +%k castrated %o,TXT_OBITUARY2,,,,%o byl@[ao_cs] vykastrován@[ao_cs] hráčem %k,%k hat %o kastriert,Ο/Η %k ευνούχισε %o,%k kastris %o,%k castró a %o,,%k kastroi %o paran,%k a castré %o,%k kasztrálta %o -t,%k ha castrato %o,%k は %o を去勢した。,%k 은(는) %o 을(를) 거세시켰다.,%k castreerde %o,%k wykastrował@[ao_pl] %o,%k castrou %o,,%k l-a castrat pe %o,Игрок %k кастрировал игрока %o,%k је кастрирао %o +%k creamed %o,TXT_OBITUARY3,,,,%o byl@[ao_cs] rozšlehán@[ao_cs] hráčem %k,%k hat %o eingeseift,Ο/Η %k κρέμασε @[pro2_gr] %o,%k kremigis %o,%k cremó a %o,,%k kermasi %o paran,%k a battu %o à plate couture ,%k elkente %o -t,%k ha cremato %o,%k は %o に反吐ブチ撒けさせた。,%k 은(는) %o 을(를) 양념시켰다.,%k pureerde %o,%k spienił@[ao_pl] %o,%k fez creme de %o,,%k l-a transformat în cremă pe %o,Игрок %k взбил игрока %o,%k је истукао %o +%k decimated %o,TXT_OBITUARY4,,,,%o byl@[ao_cs] zdecimován@[ao_cs] hráčem %k,%k hat %o dezimiert,Ο/Η %k αποδεκάτισε @[pro2_gr] %o,%k detruegis %o,%k diezmó a %o,,%k hävitti %o paran,%k a décimé %o,%k megtizedelte %o -t,%k ha decimato %o,%k は %o の居場所を間引いた。,%k 은(는) %o 을(를) 망가뜨렸다.,%k decimeerde %o,%k przetrzebił@[ao_pl] %o,%k decimou %o,,%k l-a decimat pe %o,Игрок %k скосил игрока %o,%k је десетковао %o +%k destroyed %o,TXT_OBITUARY5,,,,%o byl@[ao_cs] zničen@[ao_cs] hráčem %k,%k hat %o zerstört,Ο/Η %k κατέστεψε @[pro2_gr] %o,%k detruis %o,%k destruyó a %o,,%k tuhosi %o paran,%k a détruit %o,%k elpusztította %o -t,%k ha distrutto %o,%k は %o を完全に破壊した。,%k 은(는) %o 을(를) 파괴했다.,%k vernietigde %o,%k zniszczył@[ao_pl] %o,%k destruiu %o,,%k l-a distrus pe %o,Игрок %k уничтожил игрока %o,%k је уништио %o +%k diced %o,TXT_OBITUARY6,,,,%o byl@[ao_cs] nakrájen@[ao_cs] na kostičky hráčem %k,%k hat %o in Würfel zerteilt,Ο/Η %k τεμάχησε @[pro2_gr] %o,%k diskubigis %o,%k picó en cubitos a %o,,%k pilkkosi %o paran,%k a coupé en dés %o,%k felkockázta %o -t,%k ha tagliato a cubetti %o,%k は %o を賽の目に切った。,%k 은(는) %o 을(를) 잘게 잘게 썰었다.,%k sneed %o in stukjes,%k pokroił@[ao_pl] w kostkę %o,%k fez picadinho de %o,%k cortou %o,%k l-a feliat pe %o,Игрок %k разрезал игрока %o,%k је исецкао %o +%k disembowled %o,TXT_OBITUARY7,,,,%o byl@[ao_cs] vykuchán@[ao_cs] hráčem %k,%k hat %o ausgeweidet,Ο/Η %k ισοπέδοσε @[pro2_gr] %o,%k sentripigis %o,%k destripó a %o,,%k suolisti %o paran,%k a étripé %o,%k kibelezve,%k ha smembrato %o,%k は %o の臓物を引きずり出した。,%k 은(는) %o 의 내장을 도려냈다.,%k ontleedde %o,%k wypatroszył@[ao_pl] %o,%k estripou %o,,%k l-a eviscerat pe %o,Игрок %k выпотрошил игрока %o,%k је ампутирао %o +%k flattened %o,TXT_OBITUARY8,,,,%o byl@[ao_cs] zplacatěn@[ao_cs] hráčem %k,%k hat %o dem Erdboden gleichgemacht,Ο/Η %k ησοπέδοσε @[pro2_gr] %o,%k platigis %o,%k aplanó a %o,,%k lyttäsi %o paran,%k a aplati %o,%k kilapítva,%k ha schiacciato %o,%k は %o をぶっ潰した。,%k 은(는) %o 의 코를 납작하게 만들었다.,%k plette %o,%k rozpłaszczył@[ao_pl] %o,%k achatou %o,%k espalmou %o,%k l-a făcut plat pe %o,Игрок %k сплюснул игрока %o,%k је изравнао %o +%k gave %o Anal Justice,TXT_OBITUARY9,,,,%o utržil@[ao_cs] anální spravedlnost od hráče %k,%k hat %o anale Gerechtigkeit gegeben,Ο/Η %k γάμησε @[pro2_gr] %o @[pro3_gr] κόλο,%k donis %o puga ĵustico,%k le dió Justicia Anal a %o,,%k jakoi %o paralle anaalioikeutta,%k a rendu une justice anale a %o,%k %o -nak Anális Igazságot adott,%k ha dato a %o Giustizia Anale,%k は %o のケツにぶち込んだ。,%k 은(는) %o 에게 홍콩행을 보냈다.,%k gaf %o anale rechtvaardigheid,%k dał@[ao_pl] %o Analną Sprawiedliwość,%k deu Justiça Anal para %o,,%k i-a făcut jucătorului %o o Justiție Anală,Игрок %k устроил Анальное Правосудие игроку %o,%k је дао %o аналну правду +%k gave AnAl MaDnEsS to %o,TXT_OBITUARY10,,,,%o utrpěl@[ao_cs] AnÁlNí ŠíLeNsTvÍ od hráče %k,%k gab %o AnAlEn WaHnSiNn,Ο/Η %k έσκισε τον κόλο του/της] %o,%k donis pUgAn frEnEzOn al %o,%k le dió LoCuRa AnAl a %o,,%k teki %o paran AnAaLiHuLlUkSi,%k a donné la FOLIE ANALE a %o,%k %o -nak Seggbe Durrantott,%k ha dato FoLlIa AnAle a %o,%k は %o のケツをガバガバにした。,%o 은(는) %k 의 찰진 맛을 보았다.,%k gaf aNaLe DoLhEiD aan %o,%k dał@[ao_pl] %o AnAlNe SzAlEńStWo ,%k deu LoUcUrA aNaL para %o,,%k i-a dat NeBuNiE AnAlĂ jucătorului %o,Игрок %k устроил АнАЛ КаРнаВаЛ игроку %o,%k је дао АнАлНо ЛуДиЛо %o +%k killed %o,TXT_OBITUARY11,,,,%o byl@[ao_cs] zabit@[ao_cs] hráčem %k,%k hat %o getötet,Ο/Η %k σκότωσε @[pro2_gr] %o,%k mortigis %o,%k mató a %o,,%k tappoi %o paran,%k a tué %o,%k kicsinálta %o -t,%k ha ucciso %o,%k は %o をブッ殺した。,%k 은(는) %o 을(를) 죽였다.,%k doodde %o,%k zabił@[ao_pl] %o,%k matou %o,,%k l-a omorât pe %o,Игрок %k убил игрока %o,%k је убио %o +%k made mincemeat out of %o,TXT_OBITUARY12,,,,%o byl@[ao_cs] namelen@[ao_cs] hráčem %k,%k hat %o zu Hackfleisch verarbeitet,Ο/Η %k έφτιαξε κυμά με @[pro2_gr] %o,%k faris mincemeat el %o,%k hizo picadillo de %o,,%k teki jauhelihaa %o parasta,%k a fait de la viande hachée de %o,%k darálthúst csinált %o -ból,%k ha triturato %o,%k は %o をミンチにした。,%o 은(는) %k 에 의해 분쇄됐다.,%k maakte gehakt van %o,%k zrobił@[ao_pl] mięso mielone z %o,%k fez carne moída de %o,%k fez carne picada do %o,%k a facut tocătură din %o,Игрок %k сделал отбивную из игрока %o,%k је направио млевено месо од %o +%k massacred %o,TXT_OBITUARY13,,,,%o byl@[ao_cs] zmasakrován@[ao_cs] hráčem %k,%k hat %o niedergemetzelt,Ο/Η %k δολοφώνησε @[pro2_gr] %o,%k masakris %o,%k masacró a %o,,%k verilöylytti %o parkaa,%k a massacré %o,%k lemészárolta %o -t,%k ha fatto di %o carne tritata,%k は %o を虐殺した。,%k 은(는) %o 을(를) 참살했다.,%k slachtte %o af,%k zmasakrował@[ao_pl] %o,%k massacrou %o,,%k a fost masacrat de către %o,Игрок %k устроил бойню игроку %o,%k је масакрирао %o +%k mutilated %o,TXT_OBITUARY14,,,,%o byl@[ao_cs] zmrzačen@[ao_cs] hráčem %k,%k hat %o verstümmelt,Ο/Η %k ακρωτηριάσε @[pro2_gr] %o,%k mutilis %o,%k mutiló a %o,,%k silpoi %o paran,%k a mutilé %o,%k megcsonkította %o -t,%k ha massacrato %o,%k は %o をバラバラ死体にした。,%k 은(는) %o 의 팔다리를 절단했다.,%k verminkte %o,%k rozszarpał@[ao_pl] %o,%k mutilou %o,,%k l-a mutilat pe %o,Игрок %k изуродовал игрока %o,%k је мутилирао %o +%k reamed %o,TXT_OBITUARY15,,,,%o byl@[ao_cs] proděravěn@[ao_cs] hráčem %k,%k hat %o aufgerieben,Ο/Η %k δέσμισε @[pro2_gr] %o,%k reeldonis %o,%k escarió a %o,,%k porasi %o paran,%k a découpé en fines lamelles %o,%k seggbe rakta %o -t,%k ha squartato %o,%k は %o の穴を大きく広げた。,%k 은(는) %o 을(를) 크게 혼냈다.,%k holde %o uit,%k rozwiercił@[ao_pl] %o,%k esquartejou %o,,%k l-a transformat într-un top de hârtie pe %o,Игрок %k просверлил игрока %o,%k је наоружао %o +%k ripped %o a new orifice,TXT_OBITUARY16,,,,%o má novou díru od hráče %k,%k hat %o eine neue Körperöffnung verpasst,Ο/Η άνοιξε μια νέα τρύπα @[pro3_gr] %o,%k ŝiris %o novan orificion,%k le hizo a %o un nuevo orificio,,%k repi %o paralle uuden aukon,%k a ouvert un nouvel orifice a %o,,%k ha aperto a %o un altro orifizio,%k は %o を切り裂いて新しい穴を作ってあげた。,%k 은(는) %o 을(를) 죽여 뜯어서 작품을 만들었다.,%k scheurde een opening uit %o,%k rozerwał@[ao_pl] %o nowy otwór,%k abriu um novo orifício em %o,,%k i-a făcut jucătorului %o un nou orificiu,Игрок %k проделал новое отверстие в игроке %o,%k је исцепао %o нови отвор +%k slaughtered %o,TXT_OBITUARY17,,,,%o byl@[ao_cs] zavražděn@[ao_cs] hráčem %k,%k hat %o geschlachtet,Ο/Η %k έσφαξε @[pro2_gr] %o,%k buĉis %o,%k sacrificó a %o,,%k teurasti %o paran,%k a meurtri %o,%k lemészárolta %o -t,%k ha macellato %o,%k は %o を屠殺した。,%o 은(는) %k 에 의해 도살당했다.,%k slachtte %o,%k zarżn@[irreg_2_pl] %o,%k abateu %o,,%k l-a măcelărit pe %o,Игрок %k устроил резню игроку %o,%k је заклао %o +%k smashed %o,TXT_OBITUARY18,,,,%o byl@[ao_cs] zmlácen@[ao_cs] hráčem %k,%k hat %o zerklatscht,Ο/Η %k τσάκισε @[pro2_gr] %o,%k frakasis %o,%k destrozó a %o,,%k murskasi %o paran,%k a enfoncé %o,%k földbe döngölte %o -t,%k ha distrutto %o,%k は %o をぶっ飛ばした。,%k 은(는) %o 을(를) 내팽개쳤다.,%k vermorzelde %o,%k stłukł@[ao_pl] %o,%k esmagou %o,,%k l-a spart pe %o,Игрок %k размазал игрока %o,%k је поломио %o +%k sodomized %o,TXT_OBITUARY19,,,,Hráč %k se dopustil sodomie na hráči %o,%k hat %o sodomisiert,Ο/Η %k γάμησε @[pro2_gr] %o,%k sodomizata %o,%k sodomizó a %o,,%k anaaliraiskasi %o paran,%k y a sodomisé n %o,%k szodomizálta %o -t,%k ha sodomizzato %o,%o は %k にカマを掘られた。 ,%o 은(는) %k 을(를) 위해 등을 보였다.,%k sodomiseerde %o,%k spenetrował@[ao_pl] %o,%k sodomizou %o,,%k l-a sodomizat pe %o,Игрок %k содомировал игрока %o,%k је изјебао %o +%k splattered %o,TXT_OBITUARY20,,,,%o byl@[ao_cs] rozplesknut@[ao_cs] hráčem %k,%k hat %o zerspritzt,Ο/Η %k έσκασε @[pro2_gr] %o,%k disĵetis %o,%k roció a %o,,%k roiski %o paran yltympäri,%k a explosé de %o,%k szétloccsantotta %o -t,%k ha spiaccicato %o,%k は %o にばら撒かれた。,%k 은(는) %o 을(를) 박살냈다.,%k splette %o,%k rozbryzgał@[ao_pl] %o,%k explodiu %o,,%k l-a împrăștiat pe %o,Игрок %k разбрызгал игрока %o,%k је спљоштио %o +%k squashed %o,TXT_OBITUARY21,,,,%o byl@[ao_cs] rozmáčknut@[ao_cs] hráčem %k,%k hat %o zerquetscht,Ο/Η %k πάτησε @[pro2_gr] %o,%k premplatigis %o,%k aplastó a %o,,%k litisti %o paran,%k a écrabouillé %o,%k szétnyomta %o -t mint a csótányt,%k ha schiacciato %o,%k は %o に潰された。,%k 은(는) %o 을(를) 짓이겼다.,%k plette %o,%k zmiażdżył@[ao_pl] %o,%k espatifou %o,,%k l-a strivit pe %o,Игрок %k расплющил игрока %o,%k је згњечио %o +%k throttled %o,TXT_OBITUARY22,,,,%o byl@[ao_cs] zaškrcen@[ao_cs] hráčem %k,%k hat %o erdrosselt,Ο/Η %k κομμάτιασε @[pro2_gr] %o,%k ekbruligis %o,%k aceleró a %o,,%k polki %o paran,%k a étouffé %o,%k elnyomta %o -t,%k ha strozzato %o,%k は %o に絞られた。,%k 은(는) %o 을(를) 목 졸라 죽였다.,%k wurgde %o,"%k udusił@[ao_pl] %o +",%k estrangulou %o,,%k l-a strâns de gât pe %o,Игрок %k задушил игрока %o,%k је угушио %o +%k wasted %o,TXT_OBITUARY23,,,,%o byl@[ao_cs] zničen@[ao_cs] hráčem %k,%k hat %o verbraucht,Ο/Η %k σκότωσε @[pro2_gr] %o,%k malŝparis %o,%k desechó a %o,,%k kulutti %o paran,%k a décharné %o,%k elpusztította %o -t,%k ha distrutto %o,%k は %o に消された。,%k 은(는) %o 을(를) 쓰레기처럼 내다 버렸다.,%k maakte %o koud,%k roztrwonił@[ao_pl] %o,%k detonou %o,,%k l-a risipit pe %o,Игрок %k замочил игрока %o,%k је убио %o +%k body bagged %o,TXT_OBITUARY24,,,,Hráč %k narval %o@[psn1_cs] tělo do pytle,%k hat %o eingesackt,Ο/Η %k έχωσε @[pro2_gr] %o στη κάσα του/της,%k korpo malplenigis %o,%k embolsó a %o,,%k kääri %o paran ruumispussiin,%k a placé %o dans son linceul,%k becsomagolta %o -t,%k ha mandato %o all'obitorio,%k は %o を死体袋にした。,%k 은(는) %o 의 장례식을 치렀다.,%k stopte %o in een lijkzak,%k spakował@[ao_pl] %o do torby na zwłoki,%k mandou %o para o necrotério,,%k l-a băgat în sac pe %o,Игрок %k упаковал игрока %o в мешок для трупов,%k је умртвио %o +%k sent %o to Hell,TXT_OBITUARY25,,,,%o byl@[ao_cs] poslán@[ao_cs] do pekla hráčem %k,%k hat %o zur Hölle fahren lassen,Ο/Η %k έστειλε @[pro2_gr] %o στο δίαολο,%k sendis %o al Infero,%k envió a %o al infierno,,%k lähetti %o paran helvettiin,%k a envoyé %o en enfer,%k elküldte %o -t a Pokolba,%k ha spedito %o all'Inferno,%k は %o を地獄に送った。,%o 은(는) %k 덕에 지옥으로 돌아갔다.,%k zond %o naar de hel,%k wysłał@[ao_pl] %o do Piekła,%k mandou %o para o Inferno,,%k l-a trimis pe %o în Infern,Игрок %k отправил в Ад игрока %o,%k је послао %o до Врага +%k toasted %o,TXT_OBITUARY26,,,,%o byl@[ao_cs] upečen@[ao_cs] hráčem %k,%k hat %o geröstet,Ο/Η %k έψησε @[pro2_gr] %o,%k tostita %o,%k tostó a %o,,%k käristi %o paran,%k a grillé %o,%k megpirította %o -t,%k ha arrostito %o,%k は %o を焼却した。,%o 은(는) %k 덕에 맛있게 구워졌다.,%k roosterde %o,%k stostował@[ao_pl] %o,%k tostou %o,,%k l-a prăjit pe %o,Игрок %k поджарил игрока %o,%k је тостирао %o +%k snuffed %o,TXT_OBITUARY27,,,,%o byl@[ao_cs] rozsápán@[ao_cs] hráčem %k,%k hat %o vernichtet,Ο/Η %k έσβησε @[pro2_gr] %o,%k snufis %o,%k aspiró a %o,,%k sammutti %o paran,%k a crevé %o,%k kikapcsolta %o -t,%k ha spento %o,%k は %o を処刑した。,%o 은(는) %k 에 의해 짓눌려졌다.,%k legde %o om,%k powąchał@[ao_pl] %o,%k apagou %o,,%k l-a mirosit pe %o,Игрок %k прикончил игрока %o,%k је угасио %o +%k hosed %o,TXT_OBITUARY28,,,,%o byl@[ao_cs] odstříknut@[ao_cs] hráčem %k,%k hat %o eingetütet,Ο/Η %k έονιξε @[pro2_gr] %o σε σφαίρες,%k bagigis %o,%k se cargó a %o,,%k pesi %o paran,%k a arrosé %o,%k felhúzta %o gatyáját,%k l'ha fatta sopra %o,%k は %o にぶっかけた。,%k 은(는) %o 을(를) 패배로 씻겼다.,%k bespoot %o,%k załatwił@[ao_pl] %o,%k metralhou %o,,%k a pus furtunul pe %o,Игрок %k расстрелял игрока %o,%k је упскао %o +%k sprayed %o,TXT_OBITUARY29,,,,%o byl@[ao_cs] postříkán@[ao_cs] hráčem %k,%k hat %o pulverisiert,Ο/Η %k ψέκασε @[pro2_gr] %o,%k ŝprucigis %o,%k pulverizó a %o,,%k ruiskutti %o paran,%k a pulvérise %o,%k szétporlasztotta %o -t,%k ha vaporizzato %o,%k は %o を撒き散らした。,%o 의 피는 %k 의 물감으로 쓰였다.,%k besproeide %o,%k rozpryskał@[ao_pl] %o,%k pulverizou %o,,%k l-a pulverizat pe %o,Игрок %k распылил игрока %o,%k је испрскао %o +%k made dog meat out of %o,TXT_OBITUARY30,,,,%o byl@[ao_cs] hozen@[ao_cs] psům hráčem %k,%k hat Hundefutter aus %o gemacht,Ο/Η %k γύρισε @[pro2_gr] %o σε κιμά,%k faris hundan viandon el %o,%k hizo comida para perro de %o,,%k teki %o parasta koiranruokaa,%k a fait de la pâtée pour chien de %o,%k döghúst csinált %o -ból,%k ha fatto di %o polpette,%k は %o を犬の餌にした。,%k 은(는) %o 로 개밥을 만들었다.,%k maakte hondenvlees van %o,%k zrobił@[ao_pl] mięso dla psów z %o,%k fez almôndegas de %o,,%k l-a transformat în mâncare de câini pe %o,Игрок %k скормил псам игрока %o,%k је направио псеће месо од %o +%k beat %o like a cur,TXT_OBITUARY31,,,,%o byl@[ao_cs] zmlácen@[ao_cs] jako pes hráčem %k,%k hat %o wie einen Hund geschlagen,Ο/Η %k πλάκοσε @[pro2_gr] %o σαν κοπρίτης,%k batis %o kiel kur,%k pateó a %o como a un perro callejero,,%k huitoi %o parkaa kuin rakkia,%k a battu %o,%k szétverte %o -t mint egy korcsot,%k ha battuto %o come un cane,%k は %o を狂犬の様に扱った。,%o 은(는) %k 에게 똥개처럼 맞았다.,%k sloeg %o als een hond,%k pobił@[ao_pl] %o jak kundla,%k espancou %o como um cachorro,%k espancou %o como um cão,%k îl bate pe %o ca pe o jigodie,Игрок %k сделал игрока %o как худую свинью,%k је превио %o ко мачку +%o is excrement,TXT_SELFOBIT1,,,,%o je exkrement,%o wurde zu Exkrement verarbeitet,@[art_gr] %o είναι κόπρανα,%o estas ekskremento,%o es excremento,,%o on ulostetta,%o est une merde,%o ürülék lett,%o è un escremento,%o はもはや排泄物のようだ。,%o 은(는) 배설물이 되었다.,%o is uitschot,%o został@[ao_pl] odpadkami,%o virou escremento,,%o e excrement,%o теперь экскремент,%o је сада измет +%o is hamburger,TXT_SELFOBIT2,,,,%o je hamburger,%o ist Hamburger,@[art_gr] %o είναι χάμπουργκερ,%o estas hamburgero,%o es una hamburguesa,,%o on hakkelusta,%o est un hamburger,%o hamburger lett,%o è un hamburger,%o はハンバーガーになった。,%o 은(는) 고기 반죽이 되었다.,%o is hamburger,%o został@[ao_pl] hamburgerem,%o virou hamburguer,,%o e hamburger,%o теперь гамбургер,%o је сада пљескавица +%o suffered scrotum separation,TXT_SELFOBIT3,,,,%o prodělal@[ao_cs] separaci šourku,%os Eier wurden gebraten,,%o suferis skrotan disigon,%o sufrió separación de escroto,,%o kärsii kivespussin erotuksesta,%o a souffert d'une séparation du scrotum,%o heréi szétlettek választva,%o ha subito la separazione dello scroto,%o の陰嚢は剥離していた。,%o 은(는) 고자가 되었다.,%o onderging scrotumscheiding...,%o doznał@[ao_pl] oddzielenia moszny,%o sofreu separação escrotal,,%o a suferit o separație de șcrot,%o страдает от потери тестикул,%o му је исечена патка +%o volunteered for population control,TXT_SELFOBIT4,,,,%o se zůčastnil@[ao_cs] čistky obyvatelstva,%o hat sich freiwillig zur Bevölkerungskontrolle gemeldet,@[art_gr] %o εθελώντησε για έλεγχο του πληθυσμού,%o volontulis por loĝantarkontrolo,%o fue voluntario para control de población,,%o ilmoittautui vapaaehtoiseksi väestönhallintaan,%o s'est proposé pour un contrôle de la population,%o önként jelentkezett népességszabályozáshoz,%o si è offerto per il controllo della popolazione,%o は人口削減政策の実験台に志願した。,%o 은(는) 자연에 의해 낙태 당했다.,%o was vrijwilliger voor bevolkingsbeperking,%o zgłosił@[ao_pl] się na kontrolę ludności,%o se voluntariou para o controle populacional,%o se voluntariou para o controlo populacional,%o a voluntariat pentru controlul populației,%o борется с перенаселением,%o је волунтирао за контролу популације +%o has suicided,TXT_SELFOBIT5,,,,%o spáchal@[ao_cs] sebevraždu,%o hat Selbstmord begangen,@[art_gr] %o έχει αυτοκτονήση,%o sin mortigis,%o se ha suicidado,,%o on tehnyt itsemurhan,%o s'est suicidé,%o öngyilkos lett,%o si è suicidato,%o は勝手にくたばった。,%o 은(는) 한심하게 자살했다.,%o heeft zelfmoord gepleegd.,%o popełnił@[ao_pl] samobójstwo,%o se suicidou,%o suicidou-se,%o s-a sinucis,Игрок %o самоубился,%o је убио самог себе +%o received the Darwin Award,TXT_SELFOBIT6,,,,%o dostal@[ao_cs] darwinovu cenu,%o hat den Darwinpreis erhalten,@[art_gr] %o κέρδισε το Darwin βραβείο,%o ricevis la Darwin-Premion,%o recibió el premio Darwin,,%o sai Darwin-palkinnon,%o a recu la médaille Darwin,És a Darwin Díj nyertese : %o,%o ha ricevuto il Darwin Award,%o にはダーウィン賞が授与された。,%o 은(는) 다윈상을 받을 자격이 있다.,%o ontving de Darwin Award....,%o otrzymał@[ao_pl] Nagrodę Darwina,%o ganhou o Prêmio Darwin,,%o a primit Premiul Darwin,Игрок %o получил премию Дарвина,%o је добио Дарвиново признање +,USE_GENERIC_FONT,This is not a text to be translated but an engine switch for complex languages.,,,,,,,,,,,,,1,1,,,,,,, +,REQUIRED_CHARACTERS,This should list all uppercase characters that are REQUIRED for proper language display. If it is acceptable that accents get omitted a character should NOT be listed here!,,,ÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ,ÄÖÜẞ,ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩς,ĈĜĤĴŜŬ,ÁÉÍÓÚÑÜ,,ÄÖ,ÀÂÇÉÈÊËÎÏÔŒÙÛŸ,ÁÉÍÓÖÚÜŐŰ,ÀÈÉÌÒÙ,,,"ÉËÖ +",ĄĆĘŁŃÓŚŹŻ,ÁÉÍÓÚÀÃÕÂÊÔÇ,,ĂÎȚÂȘ,АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ,АБВГДЂЕЖЗИЈКЛЉМНЊОПРСТЋУФХЦЧЏШ \ No newline at end of file diff --git a/wadsrc/static/language.csv b/wadsrc/static/language.csv index 3ff68fad2..60effbe7a 100644 --- a/wadsrc/static/language.csv +++ b/wadsrc/static/language.csv @@ -1,831 +1,5 @@ default,Identifier,Remarks,Filter,eng enc ena enz eni ens enj enb enl ent enw,cs,de,el,eo,es,esm esn esg esc esa esd esv eso esr ess esf esl esy esz esb ese esh esi esu,fi,fr,hu,it,jp,ko,nl,pl,pt,ptg,ro,ru,sr -,,,,,,,,,,,,,,,,,,,,,,, -New Game,MNU_NEWGAME,,,,Nová hra,Neues Spiel,,Nova Ludo,Nueva Partida,,Uusi peli,Nouvelle Partie,,Nuovo gioco,新規ゲーム,새로운 게임,Nieuw spel,Nowa Gra,Novo Jogo,,Joc Nou,Новая игра,Нова игра -Options,MNU_OPTIONS,,,,Možnosti,Optionen,,Agordoj,Opciones,,Asetukset,Options,,Opzioni,オプション,설정,Opties,Opcje,Opções,,Opțiuni,Настройки,Подешавања -Quit,MNU_QUITGAME,,,,Ukončit hru,Spiel verlassen,,Ĉesigi Ludon,Salir del juego,,Lopeta peli,Quitter le jeu,,Esci dal gioco,終了,게임 종료,Verlaat spel,Wyjdź z Gry,Sair,,Ieșire,Выход,Заврши игру -Load Game,MNU_LOADGAME,,,,Načíst hru,Spiel laden,,Ŝarĝi Ludon,Cargar Partida,,Lataa peli,Chargement,,Carica gioco,ロード,게임 불러오기,Laden spel,Wczytaj Grę,Carregar,,Salvare Joc,Загрузка,Учитај игру -Save Game,MNU_SAVEGAME,,,,Uložit hru,Spiel sichern,,Konservi Ludon,Guardar Partida,,Tallenna peli,Sauvegarde,,Salva gioco,セーブ,게임 저장하기,Opslaan spel,Zapisz Grę,Salvar,Gravar,Încărcare Joc,Сохранение,Сачувај игру -Help,MNU_HELP,,,,,Hilfe,,,,,Ohje,Aide,,,,,,,,,Ajutor,, -Credits,MNU_CREDITS,,,,,,,,,,Tekijät,,,,,,,,,,Autori,, -How to Order,MNU_HOWTOORDER,,,,,Bestellen,,,,,Tilausohje,,,,,,,,,,Cum Comanzi,, -Multiplayer,MNU_MULTIPLAYER,,,,,Mehrspieler,,,,,Moninpeli,,,,,,,,,,Joc Online,, -End Game,MNU_ENDGAME,,,,,Spiel beenden,,,,,Lopeta peli,,,,,,,,,,Încheie Joc,, -User Map,MNU_USERMAP,not used yet,,,,Benutzerlevel,,,,,Omat tasot,,,,,,,,,,Hărți de utilizatori,, -Select a user map to play,MNU_SELECTUSERMAP,not used yet,,,,"Wähle ein Level zum Spielen -",,,,,Valitse oma taso pelattavaksi,,,,,,,,,,Alege o hartă de utilizatori,, -Select an Episode,MNU_SELECTEPISODE,DN3D et.al.,,,,"Welche Episode? -",,,,,Valitse episodi,,,,,,,,,,Alege un episod,, -Episodes,MNU_EPISODES,Blood,,,,Episoden,,,,,Episodit,,,,,,,,,,Episoade,, -Select Skill,MNU_SELECTSKILL,DN3D et.al.,,,,Schwierigkeitsgrad,,,,,Valitse vaikeustaso,,,,,,,,,,Alege dificultatea,, -Difficulty,MNU_DIFFICULTY,Blood,,,,Schwierigkeitsgrad,,,,,Vaikeustaso,,,,,,,,,,Dificultate,, -Engine Credits,MNU_ENGINECREDITS,,,,,,,,,,Moottorin tekijäluettelo,,,,,,,,,,Autori motor,, -Press Y or N.,PRESSYN,,,,Stiskni Y nebo N.,Drücke Y oder N.,"Πάτα Y ή N -",Premu Y aŭ N.,Presiona Y ó N.,,Paina Y tai N.,Appuyez sur Y ou N.,Nyomj Y-t vagy N-t.,Premi Y oppure N.,YかNで答えろ,Y키 또는 N키를 누르시오.,Druk op Y of N.,Wciśnij Y lub N.,Aperte Y ou N.,Carrega Y ou N.,Apasă Y sau N.,Нажмите Y или N.,Притисните Y или N. -"You can't save if you aren't playing! - -Press a key.",SAVEDEAD,,,,"Nemůžeš ukládat pokud nehraješ! - -Stiskni libovolnou klávesu.","Du kannst nicht speichern, wenn du nicht spielst. - -Drücke eine Taste",,"Vi ne povas konservi, kiam vi ne ludas! - -Premu klavon.","¡No puedes guardar si no estás jugando! - -Presiona una tecla.",,"Et voi tallentaa, jos et ole pelissä! - -Paina jotain näppäintä.","Vous ne pouvez pas sauvegarder si vous ne jouez pas! - -Appuyez sur une touche.","Nem tudsz menteni ha nem is játszol! - -Nyomj meg egy gombot.","Non puoi salvare se non stai giocando! - -Premi un tasto.","プレイ中でないとセーブできない! - -何かキーを押せ","게임을 플레이 중이지 않을 때는 게임을 저장할 수 없습니다! - -키를 누르시오.","Je kunt niet opslaan als je niet speelt! - -Druk op een toets.","Nie możesz zapisać, jeśli nie grasz! - -Wciśnij dowolny klawisz.","Você não pode salvar se não estiver jogando! - -Aperte qualquer tecla.","Você não pode salvar se não estiver a jogar! - -Carrega numa tecla qualquer.","Nu poți salva jocul dacă nu joci! - -Apasă o tastă.","Невозможно сохранить игру, не начав её! - -Нажмите любую клавишу.","Не можете сачувати игру ако не играте! - -Притисните тастер." -Do you really want to do this?,SAFEMESSAGE,,,,Vážně to chceš udělat?,Möchtest du das wirklich tun?,,Ĉu vi vere volas fari tion?,¿Realmente quieres hacer esto?,¿Realmente quieres hacerlo?,Haluatko varmasti tehdä tämän?,Voulez-vous vraiment faire ça?,Biztos megakarod tenni?,Sei sicuro di volerlo fare?,本当に実行するのか?,정말로 정하시겠습니까?,Wil je dit echt doen?,Naprawdę chcesz to zrobić?,Você deseja mesmo fazer isso?,Desejas mesmo fazer isso?,Ești sigur că vrei să faci asta?,Вы уверены?,Да ли заиста желите то да урадите? -Not set,NOTSET,,,,Není nastavené,Nicht gesetzt,,Ne agordita,No Asignado,,Ei asetettu,Pas paramétré,Nincs beállítva,Non assegnato,セットされてない,정하지 않음,Niet ingesteld,Nie ustawiono,Não definido,,Nesetat,Не задан,Није намештено -"Quicksave over your game named - -'%s'? - -Press Y or N.",QSPROMPT,,,,"Rychle uložit přes tvoji hru s názvem - -'%s'? - -Stiskni Y nebo N.","Überschreibe %s mit einem Schnellspeicherspielstand? - -Drücke Y oder N.",,"Ĉu rapidkonservu super via ludo, ke nomita - -'%s'? - -Premu Y aŭ N.","¿Deseas guardar sobre tu partida llamada - -'%s'? - -Presiona Y ó N.",,"Haluatko tallentaa pelin %s päälle? - -Paina Y tai N.","Sauvegarde rapide sur le fichier - -'%s'? - -Appuyez sur Y ou N.","Gyorsmenteni akarsz az alábbi mentésed alatt - -'%s'? - -Nyomj Y-t vagy N-t.","Sovrascrivere il salvataggio - -'%s'? - -Premi Y oppure N.","この名前で上書きするのか? - -'%s' - -Y か N で答えろ","빠른 저장을 하시겠습니까? - -'%s' - -Y키 또는 N키를 누르시오.","Snel opslaan over je spel genaamd - -'%s'? - -Druk op Y of N.","Szybko nadpisać grę - -„%s”? - -Wciśnij Y lub N.","Salvar sobre seu jogo chamado - -'%s'? - -Aperte Y ou N.","Gravar sobre o seu jogo chamado - -'%s'? - -Carrega Y ou N.","Salvare rapidă peste salvarea - -'%s' ? - -Apasă Y sau N.","Перезаписать быстрое сохранение - -«%s»? - -Нажмите Y или N.","Желите брзо чување за игру под именом - -„%s“? - -Притисните Y или N." -"Do you want to quickload the game named - -'%s'? - -Press Y or N.",QLPROMPT,,,,"Přeješ si rychle načíst hru s názvem - -'%s'? - -Stiskni Y nebo N.","Möchtest du den Spielstand %s schnellladen? - -Drücke Y oder N.",,"Ĉu vi volas rapidŝargi la ludon, ke nomita - -'%s'? - -Premu Y aŭ N.","¿Quieres cargar la partida llamada - -'%s'? - -Presiona Y ó N.",,"Haluatko pikaladata pelin %s? - -Paina Y tai N.","Voulez-vous charger la sauvegarde - -'%s'? - -Appuyez sur Y ou N.","Gyorstölteni akarod ezt a mentést - -'%s'? - -Nyomj Y-t vagy N-t.","Vuoi fare un quickload della partita - -'%s'? - -Premi Y oppure N.","この名前のデータをロードするのか? - -'%s' - -Y か N で答えろ","빠른 불러오기를 하시겠습니까? - -'%s' - -Y키 또는 N키를 누르시오.","Wil je het spel snel laden met de naam - -'%s'? - -Druk op Y of N.","Czy chcesz wczytać szybki zapis - -„%s”? - -Wciśnij Y lub N.","Deseja carregar o jogo chamado - -'%s'? - -Aperte Y ou N.","Deseja carregar o jogo chamado - -'%s'? - -Carrega Y ou N.","Vrei să încarci rapid salvarea - -'%s' ? - -Apasă Y sau N.","Загрузить быстрое сохранение - -«%s»? - -Нажмите Y или N.","Желите брзо учитавање за игру под именом - -„%s“? - -Притисните Y или N." -Yes,TXT_YES,,,,Ano,Ja,Ναι,Jes,Sí,,Kyllä,Oui,Igen,Si,はい,네,Ja,Tak,Sim,,Da,Да,Да -No,TXT_NO,,,,Ne,Nein,Όχι,Ne,No,,Ei,Non,Nem,No,いいえ,아니요,Nee,Nie,Não,,Nu,Нет,Не -%s cheats,TXT_X_CHEATS,This is a gender sensitive message where %s represents the player,,,%s cheatuje,%s schummelt,@[art_gr] %s απατάει,%s trompas,%s hace trampa,,%s huijaa,%s triche.,,%s imbroglia,%s はチート使用,%s 이(가) 치트를 사용 함,%s bedriegt,%s oszukuje,%s está trapaceando,%s está a fazer batota,%s trișează,%s использует чит-коды,%s вара -Rotate mode on,TXT_ROTATE_ON,,,,,Rotiermodus an,,,,,Kääntötila päällä,,,,,,,,,,,, -Rotate mode off,TXT_ROTATE_OFF,,,,,Rotiermodus aus,,,,,Kääntötila pois päältä,,,,,,,,,,,, -,,Savegame,,,,,,,,,,,,,,,,,,,,, -Empty slot,EMPTYSTRING,,,,Prázdný slot,nicht belegt,,Malplena Ingo,Ranura Vacía,,Tyhjä lokero,Emplacement Vide,Üres,Slot libero,空きスロット,빈 슬롯,Lege sleuf,Puste miejsce,Vazio,,Loc disponibil,Пустой слот,Празни слот -,NEWSAVE,,,,,,,,,,,,<Új mentés>,,<新規セーブ>,<새로운 게임 저장>,,,,,,<Новое сохранение>,<Нова сачувана игра> -Game saved.,GGSAVED,,,,Hra uložena.,Spielstand gespeichert.,,Ludo konservita.,Partida guardada.,,Peli tallennettu.,Partie sauvegardée.,Játék mentve.,Gioco salvato.,セーブ完了。,게임이 저장됨.,Spel opgeslagen.,Gra zapisana.,Jogo salvo.,Jogo gravado.,Joc salvat.,Игра сохранена.,Игра сачувана. -Time,SAVECOMMENT_TIME,,,,Čas,Zeit,,Tempo,Tiempo,,Aika,Temps,Idő,Tempo,"時間 -",시간,Tijd,Czas,Tempo,,Timp,Время,Време -Load Game,MNU_LOADGAME,,,,Načíst hru,Spiel laden,,Ŝarĝi Ludon,Cargar Partida,,Lataa peli,Chargement,,Carica gioco,ロード,게임 불러오기,Laden spel,Wczytaj Grę,Carregar,,Încărcare Joc,Загрузка,Учитај игру -Save Game,MNU_SAVEGAME,,,,Uložit hru,Spiel sichern,,Konservi Ludon,Guardar Partida,,Tallenna peli,Sauvegarde,,Salva gioco,セーブ,게임 저장하기,Opslaan spel,Zapisz Grę,Salvar,Gravar,Salvare Joc,Сохранение,Сачувај игру -No Picture,MNU_NOPICTURE,,,,Bez obrázku,Kein Bild,,Neniu Bildo,Sin Imagen,,Ei kuvaa,Pas d'image,,Nessuna immagine,画像無し,사진 없음,Geen beeld,Brak obrazka,Sem imagem,,Lipsă Imagine,"Нет -изображения",Нема слике -"Different -Version",MNU_DIFFVERSION,,,,Jiná verze,Falsche Version,,Malsama Versio,Versión Diferente,,Eri versio,"Version -Différente",,Versione differente,"別バージョンの -データ",다른 버젼,Anders Versie,"Inna -Wersja","Versão -Diferente",,Versiune Diferită,"Другая -версия",Другачија верзија -No files,MNU_NOFILES,,,,Žádné soubory,Keine Dateien,,Neniuj dosieroj,Sin archivos,,Ei tiedostoja,Pas de fichiers,,Nessun file,ファイル無し,파일 없음,Geen bestanden,Brak plików,Vazio,,Niciun fișiier,Нет файлов,Нема фајлова -"Do you really want to delete the savegame? -",MNU_DELETESG,,,,Opravdu chceš smazat tuto uloženou hru?,Willst du diesen Spielstand wirklich löschen?,,Ĉu vi vere volas forviŝi la konservan ludon?,"¿Realmente deseas eliminar la partida? -",,Haluatko varmasti poistaa tallennetun pelin ,"Voulez vous vraiment effacer cette sauvegarde? -",Biztos ki akarod törölni a mentést?,Vuoi veramente rimuovere il salvataggio,本当にこのセーブを消すのか?,저장된 게임을 정말로 삭제하시겠습니까?,Wil je echt de opgeslagen spel verwijderen?,Czy naprawdę chcesz usunąć zapis gry,"Deseja mesmo deletar o jogo salvo -",Deseja mesmo apagar o jogo,Vrei să ștergi salvarea?,"Вы действительно хотите удалить сохранение -",Да ли стварно желите да избришете сачувану игру -,,,,,,,,,,,,,,,,,,,,,,, -Off,OPTVAL_OFF,,,,Vyp,Aus,,Malaktiva,Desactivado,,Pois,,,Disattivo,オフ,끔,Uit,Wyłączone,Desligado,,Pornit,Откл.,Искљ. -On,OPTVAL_ON,,,,Zap,An,,Aktiva,Activado,,Päällä,,,Attivo,オン,켬,Aan,Włączone,Ligado,,Oprit,Вкл.,Укљ. -Auto,OPTVAL_AUTO,,,,,,,Aŭtomata,Automático,,Automaattinen,,,Automatico,自動,자동,,Automatycznie,Automático,,,Авто,Аутоматски -Options,OPTMNU_TITLE,,,,Možnosti,Optionen,,Agordoj,Opciones,,Asetukset,Options,Beállítások,Opzioni,オプション,설정,Opties,Opcje,Opções,,Opțiuni,Настройки,Подешавања -Customize Controls,OPTMNU_CONTROLS,,,,Nastavení ovládání,Steuerung einstellen,,Agordi Regilojn,Personalizar Controles,,Ohjausasetukset,Modifier les Contrôles,Irányítás testreszabása,Personalizza i controlli,キー配置変更,조작 사용자 지정,Instellen van de controle,Ustaw Klawisze,Configurar Controles,Configurar Controlos,Personalizare Setări Control,Управление,Контроле -Mouse Options,OPTMNU_MOUSE,,,,Nastavení myši,Mauseinstellungen,,Musagordoj,Opciones de Ratón,,Hiiriasetukset,Options de la Souris,Egér beállítások,Opzioni Mouse,マウス オプション,마우스 설정,Muis opties,Opcje Myszki,Opções de mouse,Opções do rato,Setări Mouse,Мышь,Миш -Controller Options,OPTMNU_JOYSTICK,,,,Nastavení ovladače,Joystickeinstellungen,,Ludregilagordoj,Opciones de Mando,,Peliohjainasetukset,Options de la Manette,Játékvezérlő beállítások,Opzioni Joystick,コントローラーオプション,조이스틱 설정,Controller opties,Opcje Kontrolera,Opções de joystick,,Setări Controller,Контроллер,Контролер -Player Setup,OPTMNU_PLAYER,,,,Nastavení hráče,Spieler einrichten,,Ludanta Agordaĵo,Config. del Jugador,,Pelaaja-asetukset,Options du Joueur,Játékos testreszabása,Settaggio giocatore,プレイヤーの特徴,플레이어 설정,Speler instellen,Ustawienia Gracza,Configurações de Jogador,Configurações do Jogador,Personalizare Jucător,Игрок,Играч -Gameplay Options,OPTMNU_GAMEPLAY,,,,Nastavení herních mechanik,Spieleinstellungen,,Ludadagordoj,Opciones de Jugabilidad,,Pelattavuusasetukset,Options du Gameplay,Játék mechanika,Opzioni Gameplay,ゲームプレイ オプション,게임 설정,Gameplay-opties,Opcje Rozgrywki,Opções de jogabilidade,,Setări pe timp de joc,Геймплей,Гејмплеј -Automap Options,OPTMNU_AUTOMAP,,,,Nastavení automapy,Automapeinstellungen,,Aŭtomapagordoj,Opciones del Automapa,,Automaattikartan asetukset,Options de la Carte,Térkép beállítások,Opzioni Automappa,オートマップ オプション,오토맵 설정,Automap-opties,Opcje Mapy,Opções de automapa,,Hartă computerizată,Автокарта,Аутомапа -HUD Options,OPTMNU_HUD,,,,Nastavení HUD,HUD Einstellungen,,Agordoj de HUD,Opciones del HUD,,Tilanäytön asetukset,Options de l'ATH,HUD beállítások,Opzioni HUD,HUD オプション,HUD 설정,HUD opties,Opcje Paska HUD,Opções de HUD,,Setări HUD,HUD,HUD -Miscellaneous Options,OPTMNU_MISCELLANEOUS,,,,Ostatní nastavení,Verschiedene Einstellungen,,Ekstraĵagordoj,Opciones Misceláneas,,Sekalaiset asetukset,Options Annexes,Általános beállítások,Opzioni miste,その他のオプション,그 외 설정,Diverse opties,Różne Opcje,Outras opções,,Setări diverse,Дополнительно,Разно -Sound Options,OPTMNU_SOUND,,,,Nastavení zvuku,Soundeinstellungen,,Sonagordoj,Opciones de Sonido,,Ääniasetukset,Options du Son,Hang beállítások,Opzioni Suono,サウンド オプション,음향 설정,Geluidsopties,Opcje Dźwięku,Opções de som,,Setări sunet,Звук,Звук -Display Options,OPTMNU_DISPLAY,,,,Nastavení grafiky,Anzeigeeinstellungen,,Ekranagordoj,Opciones de Visualización,,Näyttöasetukset,Options de l'Affichage,Megjelenítés beállítások,Opzioni Display,ディスプレイ オプション,디스플레이 설정,Weergaveopties,Opcje Wyświetlania,Opções de vídeo,,Setări afișare,Экран,Приказ -Set video mode,OPTMNU_VIDEO,,,,Nastavit režim displeje,Videomodus,,Agordi videoreĝimon,Modos de Vídeo,,Aseta videotila,Choisir Mode D'Affichage,Felbontás,Settaggio modalità video,ビデオ 調整,화면 설정,Videomodus instellen,Ustaw tryb wideo,Definir modo de vídeo,,Setare mod video,Видеорежим,Видео мод -Reset to defaults,OPTMNU_DEFAULTS,,,,Obnovit původní,Auf Vorgaben zurücksetzen,,Reŝanĝi al defaŭltoj,Valores por Defecto,,Palauta oletusasetukset,Réinitialiser les paramètres,Alapértelmezett beállítások használata,Reimposta ai valori di default,初期設定に戻す,초기화,Terugzetten naar standaardinstellingen,Resetuj do domyślnych,Redefinir para configurações padrão,,Revenire la setări implicite,Сбросить все настройки,Врати подразумевано -Reset to last saved,OPTMNU_RESETTOSAVED,,,,Obnovit naposledy uložené,Auf gespeicherte Werte zurücksetzen,,Reŝanĝi al lasta konservo,Últimos Valores Guardados,,Palauta viimeksi tallennettu tila,Recharger dernière config.,Legutóbbi mentett beállítások használata,Reimposta ai valori salvati l'ultima volta,最後に保存した設定に戻す,이전 설정으로 초기화,Reset naar laatste opgeslagen,Resetuj do ostatnio zapisanych,Redefinir para última configuração salva,Redefinir para última configuração gravada,Revenire la ultimele setări salvate,Вернуть предыдущие настройки,Врати задње сачувано -Go to console,OPTMNU_CONSOLE,,,,Jít do konzole,Öffne Konsole,,Iri al konzolo,Ir a la consola,,Mene konsoliin,Ouvrir la console,Konzol megnyitása,Vai alla console,コンソールを開く,콘솔로 이동,Ga naar de console,Przejdź do konsoli,Abrir console,Abrir consola,Mergi la consolă,Открыть консоль,Отвори конзолу -,Controls submenu,,,,,,,,,,,,,,,,,,,,,, -Default,CTRL_DEFAULT,,,,,Standard,,,,,Oletus,,,,,,,,,,Implicit,, -Classic,CTRL_CLASSIC,,,,,"Klassisch -",,,,,Alkuperäinen,,,,,,,,,,Clasic,, -Left-handed,CTRL_LEFTHANDED,,,,,Linkshändig,,,,,Vasenkätinen,,,,,,,,,,Stângaci,, -Control presets,CTRL_PRESET,,,,,Voreinstellungen,,,,,Ohjausesivalinnat,,,,,,,,,,Configurații prestabilite,, -Customize Controls,CNTRLMNU_TITLE,,,,Nastavení ovládání,Steuerung einstellen,,Agordi Regilojn,Personalizar Controles ,,Ohjausasetukset,Modifier contrôles,Irányítás testreszabása,Personalizza i controlli,キー配置変更,조작 사용자 지정,Instellen van de controle,Ustaw Klawisze,Configurar Controles,Configurar Controlos,Personalizare schemă control,Настройки управления,Подешавања контрола -"ENTER to change, BACKSPACE to clear",CNTRLMNU_SWITCHTEXT1,,,,"ENTER pro změnu, BACKSPACE pro smazání",ENTER: Editieren BACKSPACE: Löschen,,"ENTER klavo por ŝanĝi, BACKSPACE klavo por viŝi","ENTER para cambiar, BACKSPACE para limpiar",,"Aseta ENTERILLÄ, tyhjennä ASKELPALAUTTIMELLA","ENTREE pour changer, RET. ARRIERE pour effacer.","ENTER a változtatáshoz, BACKSPACE a törléshez","INVIO per modificare, BACKSPACE per ripulire",Enter で決定、BackSpaceで無効化,"바꿀려면 ENTER키, 지울려면 BACKSPACE키를 누르시오","ENTER om te veranderen, BACKSPACE om te wissen.","ENTER by zmienić, BACKSPACE by wyczyścić","ENTER para alterar, BACKSPACE para limpar",,"ENTER pentru a schimba, BACKSPACE pentru ștergere","ENTER — изменить, BACKSPACE — очистить","ENTER за промену, BACKSPACE за чишћење" -"Press new key for control, ESC to cancel",CNTRLMNU_SWITCHTEXT2,,,,"Zmáčkni novou klávesu pro nastavení, ESC pro storno",Drücke eine Taste oder ESC um abzubrechen,,"Premi novan klavon por reakiri regilon, ESC por nuligi","Presiona una tecla para el control, ESC para cancelar",,"Valitse näppäin toiminnolle, ESC peruuttaa","Appuyez sur la nouvelle touche pour l'assigner, -Appuyez sur ECHAP pour annuler.","Nyomj meg egy gombot, ESC a törléshez","Premi un nuovo tasto per il controllo, ESC per cancellare","登録したいキーを押すか, Escでキャンセル","명령을 얽으려면 아무 키를, 취소는 ESC키를 누르시오","Druk op de nieuwe toets voor controle, ESC om te annuleren.","Wciśnij nowy przycisk by zmienić klawisz, ESC by anulować","Aperte a nova tecla para o comando, ESC para cancelar","Carrega a nova tecla para o comando, ESC para cancelar","Apasă tasta nouă, sau ESC pentru anulare","Нажмите клавишу управления, ESC для отмены","Притисните ново тастер за одређивање контроле, ESC за отказивање" -Controls,CNTRLMNU_CONTROLS,,,,Ovládání,Steuerung,,Regiloj,Controles,,Ohjaimet,Contrôles,Irányítás,Controlli,操作系統,조작,Bedieningselementen,Klawisze,Comandos,Controlos,Control,Управление,Контроле -Fire,CNTRLMNU_ATTACK,,,,Střelba,Feuer,,Pafi,Fuego,,Tuli,Tirer,Tűz,Fuoco,撃つ,공격,Vuur,Strzał,Atirar,,Foc,Атака,Нападни -Secondary Fire,CNTRLMNU_ALTATTACK,,,,Sekundární střelba,Alternativfeuer,,Duaranga Pafi,Fuego secundario,,Vaihtoehtoistuli,Tir Secondaire,Másodlagos tüzelés,Fuoco secondario,セカンダリ,보조 공격,Secundaire vuur,Strzał Alternatywny,Tiro Secundário,,Foc Secundar,Вторичная атака,Секундарни напад -Alternative Weapon,CNTRLMNU_ALTWEAPON,,,,,Alternative Waffe,,,,,Vaihtoehtoinen ase,,,,,,,,,,Armă Alternativă,, -Use / Open,CNTRLMNU_USE,,,,Použít / otevřít,Benutzen / Öffnen,,Uzi / Malfermi,Usar / Abrir,,Käytä / Avaa,Utiliser/Ouvrir,Használ / Ajtónyitás,Usa / Apri,開く / スイッチ等使用,사용/열기,Gebruik / Openen,Użyj / Otwórz,Usar / Abrir,,Folosește / Deschide,Использовать/открыть,Користи / Отвори -Move forward,CNTRLMNU_FORWARD,,,,Pohyb vpřed,Vorwärts bewegen,,Movi anatŭe,Avanzar,,Liiku eteenpäin,Avancer,Előre mozgás,Movimento in Avanti,前進,앞으로 이동,Voorwaarts bewegen,Idź do przodu,Mover para frente,,Deplasare în față,Движение вперёд,Крећи се напред -Move backward,CNTRLMNU_BACK,,,,Pohyb vzad,Rückwarts bewegen,,Movi malantaŭe,Retroceder,,Liiku taaksepäin,Reculer,Hátra mozgás,Movimento in Indietro,後退,뒤로 이동,Achteruit bewegen,Idź do tyłu,Mover para trás,,Deplasare în spate,Движение назад,Крећи се уназад -Strafe left,CNTRLMNU_MOVELEFT,,,,Pohyb doleva,Nach links bewegen,,Flankmovi maldekstre,Moverse a la izquierda,,Astu sivuun vasemmalle,Aller à Gauche,Balra oldalazás,Movimento laterale a sinistra,左移動,왼쪽으로 이동,Verplaats naar links,Unik w lewo,Mover para a esquerda,,Deplasare diagonală stânga,Движение влево,Крећи се лево -Strafe right,CNTRLMNU_MOVERIGHT,,,,Pohyb doprava,Nach rechts bewegen,,Flankmovi dekstre,Moverse a la derecha,,Astu sivuun oikealle,Aller à Droite,Jobbra oldalazás,Movimento laterale a destra,右移動,오른쪽으로 이동,Verplaats naar rechts,Unik w prawo,Mover para a direita,,Deplasare diagonală dreapta,Движение вправо,Крећи се десно -Turn left,CNTRLMNU_TURNLEFT,,,,Otočení vlevo,Nach links drehen,,Turni maldekstre,Girar a la izquierda,,Käänny vasemmalle,Tourner à Gauche,Balra fordul,"Gira a sinistra -",左を向く,왼쪽으로 회전,Draai naar links,Obróć się w lewo,Girar para a esquerda,,Întoarcere stânga,Поворот налево,Окрени се лево -Turn right,CNTRLMNU_TURNRIGHT,,,,Otočení vpravo,Nach rechts drehen,,Turni dekstre,Girar a la derecha,,Käänny oikealle,Tourner à Droite,Jobbra fordul,Gira a destra,右を向く,오른쪽으로 회전,Draai naar rechts,Obróć się w prawo,Girar para a direita,,Întoarcere dreapta,Поворот направо,Окрени се десно -Quick Turn,CNTRLMNU_TURN180,,,,Rychlé otočení,Schnelle Drehung,,Rapida turno,Giro rápido,,Pikakäännös,Faire un 180,Megfordulás,Rotazione rapida,背後を向く,빠른 회전,Snelle draai,Nagły Obrót,Giro rápido,,Întoarcere rapidă,Быстрый разворот,Брзи окрет -Jump,CNTRLMNU_JUMP,,,,Skok,Springen,,Salti,Saltar,,Hyppää,Sauter,Ugrás,Salta,ジャンプ,점프,Springen,Skok,Pular,Saltar,Salt,Прыжок,Скок -Crouch,CNTRLMNU_CROUCH,,,,Kleknutí,Ducken,,Kaŭri,Agacharse,,Kyyristy,S'accroupir (tenir),Guggolás,Abbassati,屈む,숙이기,Hurken,Kucnięcie,Agachar,,Ghemuire,Приседание,Чучни -Crouch Toggle,CNTRLMNU_TOGGLECROUCH,,,,Zap. / Vyp. kleknutí,Ducken an/aus,,Kaŭrbaskulo,Alternar agachado,,Kyyristymisen vaihtokytkin,S'accroupir (alterner),Guggolási kapcsoló,Toggle abbassamento,屈む切替,숙이기 토글,Hurken Toggle,Włącz / Wyłącz kucnięcie,Agachar (Liga/Desliga),,Comutator chemuire,Сесть/встать,Чучни (без држања) -Mouse look,CNTRLMNU_MOUSELOOK,,,,Pohled myší,Maus-Blick,,Musilregardo,Vista con ratón,,Hiirikatselu,Vue à la souris,Egérrel való nézelődés,Modalità vista col mouse,マウス視点上下化,마우스 룩,Muis-look,Rozglądanie się myszką,Vista com o mouse,Vista com o rato,Privire în jur cu mouse,Обзор мышью,Гледај мишем -Mouse look toggle,CNTRLMNU_MLOOKTOGGLE,,,,,Maus-Blick umschalten,,,,,Hiirikatselun vaihtokytkin,,,,,,,,,,Comutator privire în jur cu mouse,, -Look up,CNTRLMNU_LOOKUP,Look doesn't change the aim! It only alters the view pitch,,,Pohled vzhůru,Nach oben schauen,,Rigardi supre,Mirar arriba,,Katso ylös,Regarder en haut,Felfele nézés,Guarda sopra,視点を上げる,위로 보기,Kijk omhoog,Patrz w górę,Olhar para cima,,Privire în sus,Смотреть вверх,Гледај горе -Look down,CNTRLMNU_LOOKDOWN,,,,Pohled dolů,Nach unten schauen,,Rigardi malsupre,Mirar abajo,,Katso alas,Regarder en bas,Lefele nézés,Guarda sotto,視点を下げる,아래로 보기,Kijk naar beneden,Patrz w dół,Olhar para baixo,,Privire în jos,Смотреть вниз,Гледај доле -Aim up,CNTRLMNU_AIMUP,,,,,Nach oben zielen,,,Apuntar arriba,,Tähtää ylös,Visée haut,,Mira su,上を狙う,,,,Mirar para cima,,Țintire sus,наведение вверх, -Aim down,CNTRLMNU_AIMDOWN,,,,,Nach unten zielen,,,Apuntar AAbajo,,Tähtää alas,Visée bas,,Mira giù,下を狙う,,,,Mirar para baixo,,Țintire jos,наведение вниз, -Look left,CNTRLMNU_LOOKLEFT,,,,,Nach links schauen,,,Mirar izquierda,,Katso vasemmalle,Regarder à gauche,,Guarda a sinistra,左を見る,,,,Olhar para a esquerda,,Privire stânga,Смотреть влево, -Look right,CNTRLMNU_LOOKRIGHT,,,,,Nach rechts schauen,,,Mirar derecha,,Katso oikealle,Regarder à droite,,Guarda a destra,右を見る,,,,Olhar para a direita,,Privire dreapta,Смотреть вправо, -Center view,CNTRLMNU_CENTERVIEW,,,Centre view,Vystředit pohled,Ansicht zentrieren,,Centra vidon,Centrar vista,,Keskitä katse,Recentrer Vue,Nézet középreigazítása,Sguardo centrato,視点を戻す,중앙 시점으로 보기,Middenaanzicht,Wyśrodkuj widok,Olhar para o centro,,Privire centru,Отцентрировать взгляд,Централизирај поглед -Run,CNTRLMNU_RUN,,,,Běh,Rennen,,Kuri,Correr,,Juokse,Courir (tenir),Futás,Corri,駆け足,달리기,Rennen,Bieg,Correr,,Fugă,Бег,Трчи -Toggle Run,CNTRLMNU_TOGGLERUN,,,,Zap. / Vyp. běh,Rennen an/aus,,Baskulkuri,Alternar Correr,,Juoksun vaihtokytkin,Courir (alterner),Futás kapcsoló,Toggle corsa,常時駆け足切替,달리기 토글,Rennen aan/uit,Włącz / Wyłącz bieg,Correr (Liga/Desliga),,Comutator fugă,Бежать/идти,Трчи (без држања) -Strafe,CNTRLMNU_STRAFE,,,,Pohyb vlevo/vpravo,Seitwärts,,Flankmovi,Desplazamiento,,Astu sivuttain,Pas de côté,,Spostamento laterale,横移動化,양옆으로 이동,Zijdelings bewegen,Uniki,Deslocamento lateral,,Deplasare în diagonală,Движение боком,Кретање у страну -Show Scoreboard,CNTRLMNU_SCOREBOARD,,,,Zobrazit tabulku skóre,Punktetafel anzeigen,,Montri poentartabulon,Mostrar Marcador,,Näytä pistetaulu,Afficher Scores (tenir),Eredményjelző megjelenítése,Mostra la tabella punteggio,スコアボード表示,점수창 표시,Scorebord tonen,Pokaż tablicę wyników,Mostrar pontuação,,Afișare tabelă de marcaj,Таблица очков,Табела -Action,CNTRLMNU_ACTION,,,,Akce,Aktion,,Ago,Acción,,Toiminta,,Akció,Azione,アクション,동작,Actie,Akcja,Ação,,Acțiuni,Основное,Радња -Customize Action Controls,CNTRLMNU_ACTION_TITLE,,,,Nastavit ovládání akcí,Aktions-Steuerung einstellen,,Agordi Agajn Regilojn,Controles de Acción,,Toimintaohjausasetukset,Changer Contrôles Action,Akció beállítások testreszabása,Personalizza i controlli di azione,アクション操作設定,사용자 지정 동작 컨트롤,Aanpassen van de actiecontroles,Ustaw Klawisze Akcji,Configurar Comandos de Ação,Configurar Controlos de Ação,Personalizare schemă acțiuni,Основные клавиши управления,Контроле радње -Chat,CNTRLMNU_CHAT,,,,Chat,Chat,,Babilo,Chat,,Keskustelu,Chat,Chat,Chat,チャット,채팅,Chat,Czat,Chat,Conversar,Conversație,Чат,Ћаскање -Say,CNTRLMNU_SAY,,,,Říct,Reden,,Diro,Hablar,,Sano,Parler,Üzenet ,Parla,発言,채팅하기,Zeg,Powiedz,Fala,Falar,Vorbește,Сообщение,Пиши -Customize Chat Controls,CNTRLMNU_CHAT_TITLE,,,,Nastavit ovládání chatu,Chat-Steuerung einstellen,,Agordi Babiladajn Regilojn,Controles de Chat,,Keskusteluohjausasetukset,Changer Contrôles Chat,Chat beállítások testreszabása,Personalizza i controlli della chat,チャット操作設定,사용자 지정 채팅 컨트롤,Chat-controles aanpassen aan uw wensen,Ustaw Klawisze Czatu,Configurar Comandos de Chat,Configurar Controlos de Chat,Personalizare control scriere,Клавиши управления чатом,Контроле ћаскања -Customize Weapon Controls,CNTRLMNU_WEAPONS_TITLE,,,,Nastavit ovládání zbraní,Waffen-Steuerung einstellen,,Agordi Armilojn Regilojn,Controles de Armas,,Aseohjausasetukset,Changer Contrôles Armes,Fegyver beállítások testreszabása,Personalizza i controlli delle armi,武器操作設定,사용자 지정 무기 컨트롤,Wapencontroles aanpassen aan uw eigen wensen,Ustaw Klawisze Broni,Configurar Comandos de Arma,Configurar Controlos de Armas,Personalizare control arme,Клавиши управления оружием,Контроле оружја -Customize Inventory Controls,CNTRLMNU_INVENTORY_TITLE,,,,Nastavit ovládání inventáře,Inventar-Steuerung einstellen,,Agordi Inventarajn Regilojn,Controles de Inventario,,Varusteohjausasetukset,Changer Contrôles Inventaires,Eszköztár beállítások testreszabása,Personalizza i controlli dell'inventario,インベントリ操作設定,사용자 지정 인벤토리 컨트롤,Inventariscontroles aanpassen aan uw wensen,Ustaw Klawisze Ekwipunku,Configurar Comandos de Inventário,Configurar Controlos de Inventário,Personalizare control inventar,Клавиши управления инвентарём,Контроле складишта -Customize Other Controls,CNTRLMNU_OTHER_TITLE,,,,Nastavit ostatní ovládání,Sonstige Steuerung einstellen,,Agordi Ekstrajn Regilojn,Otros Controles,,Muut ohjausasetukset,Changer Autres Contrôles,Egyéb irányítás testreszabása,Personalizza altri controlli,その他の操作設定,사용자 지정 그 외 컨트롤,Andere bedieningselementen aanpassen,Ustaw Inne Klawisze,Configurar Outros Comandos,Configurar Outros Controlos,Personalizare scheme de control diverse,Прочие клавиши,Друге контроле -Weapons,CNTRLMNU_WEAPONS,,,,Zbraně,Waffen,,Armiloj,Armas,,Aseet,Armes,Fegyverek,Armi,武器,무기,Wapens,Bronie,Armas,,Arme,Оружие,Оружје -Next weapon,CNTRLMNU_NEXTWEAPON,,,,Další zbraň,Nächste Waffe,,Proksima armilo,Arma siguiente,,Seuraava ase,Arme Suivante,Következő fegyver,Arma successiva,次の武器,다음 무기,Volgende wapen,Następna broń,Próxima arma,,Arma următoare,Следующее оружие,Следеће оружје -Previous weapon,CNTRLMNU_PREVIOUSWEAPON,,,,Předchozí zbraň,Vorherige Waffe,,Antaŭa armilo,Arma anterior,,Edellinen ase,Arme Précédente,Előző fegyver,Arma precedente,前の武器,이전 무기,Vorige wapen,Poprzednia broń,Arma anterior,,Arma anterioară,Предыдущее оружие,Претходно оружје -Weapon 1,CNTRLMNU_SLOT1,Todo - make game specific,,,Slot zbraně 1,Waffe 1,,Armingo 1,Ranura de Arma 1,,Aselokero 1,Emplacement D'Arme 1,1. Fegyver,Slot arma 1,武器スロット 1,무기 슬롯 1,Wapenslot 1,Broń 1,Arma 1,,Arma 1,Оружие 1,Оружје 1 -Weapon 2,CNTRLMNU_SLOT2,"only show appropriate slots per game -",,,Slot zbraně 2,Waffe 2,,Armingo 2,Ranura de Arma 2,,Aselokero 2,Emplacement D'Arme 2,2. Fegyver,Slot arma 2,武器スロット 2,무기 슬롯 2,Wapenslot 2,Broń 2,Arma 2,,Arma 2,Оружие 2,Оружје 2 -Weapon 3,CNTRLMNU_SLOT3,,,,Slot zbraně 3,Waffe 3,,Armingo 3,Ranura de Arma 3,,Aselokero 3,Emplacement D'Arme 3,3. Fegyver,Slot arma 3,武器スロット 3,무기 슬롯 3,Wapenslot 3,Broń 3,Arma 3,,Arma 3,Оружие 3,Оружје 3 -Weapon 4,CNTRLMNU_SLOT4,,,,Slot zbraně 4,Waffe 4,,Armingo 4,Ranura de Arma 4,,Aselokero 4,Emplacement D'Arme 4,4. Fegyver,Slot arma 4,武器スロット 4,무기 슬롯 4,Wapenslot 4,Broń 4,Arma 4,,Arma 4,Оружие 4,Оружје 4 -Weapon 5,CNTRLMNU_SLOT5,,,,Slot zbraně 5,Waffe 5,,Armingo 5,Ranura de Arma 5,,Aselokero 5,Emplacement D'Arme 5,5. Fegyver,Slot arma 5,武器スロット 5,무기 슬롯 5,Wapenslot 5,Broń 5,Arma 5,,Arma 5,Оружие 5,Оружје 5 -Weapon 6,CNTRLMNU_SLOT6,,,,Slot zbraně 6,Waffe 6,,Armingo 6,Ranura de Arma 6,,Aselokero 6,Emplacement D'Arme 6,6. Fegyver,Slot arma 6,武器スロット 6,무기 슬롯 6,Wapenslot 6,Broń 6,Arma 6,,Arma 6,Оружие 6,Оружје 6 -Weapon 7,CNTRLMNU_SLOT7,,,,Slot zbraně 7,Waffe 7,,Armingo 7,Ranura de Arma 7,,Aselokero 7,Emplacement D'Arme 7,7. Fegyver,Slot arma 7,武器スロット 7,무기 슬롯 7,Wapenslot 7,Broń 7,Arma 7,,Arma 7,Оружие 7,Оружје 7 -Weapon 8,CNTRLMNU_SLOT8,,,,Slot zbraně 8,Waffe 8,,Armingo 8,Ranura de Arma 8,,Aselokero 8,Emplacement D'Arme 8,8. Fegyver,Slot arma 8,武器スロット 8,무기 슬롯 8,Wapenslot 8,Broń 8,Arma 8,,Arma 8,Оружие 8,Оружје 8 -Weapon 9,CNTRLMNU_SLOT9,,,,Slot zbraně 9,Waffe 9,,Armingo 9,Ranura de Arma 9,,Aselokero 9,Emplacement D'Arme 9,9. Fegyver,Slot arma 9,武器スロット 9,무기 슬롯 9,Wapenslot 9,Broń 9,Arma 9,,Arma 9,Оружие 9,Оружје 9 -Weapon 10,CNTRLMNU_SLOT0,,,,Slot zbraně 10,Waffe 10,,Armingo 0,Ranura de Arma 0,,Aselokero 0,Emplacement D'Arme 0,0. Fegyver,Slot arma 0,武器スロット 0,무기 슬롯 0,Wapenslot 0,Broń 10,Arma 0,,Arma 0,Оружие 0,Оружје 0 -Inventory,CNTRLMNU_INVENTORY,,,,Inventář,Inventar,,Inventaro,Inventario,,Varusteet,Inventaire,Eszköztár beállítások testreszabása,Inventario,所持品,인벤토리,Inventaris,Ekwipunek,Inventário,,Inventar,Инвентарь,Инвентар -Activate item,CNTRLMNU_USEITEM,,,,Aktivovat předmět,Gegenstand aktivieren,,Aktivigi aĵon,Activar objeto,,Aktivoi varuste,Activer objet,Eszköz használata,Attiva oggetto,アイテムを使用,선택한 아이템 사용,Item activeren,Użyj przedmiot,Ativar item,,Activează obiectul,Использовать предмет,Активирај предмет -Activate all items,CNTRLMNU_USEALLITEMS,,,,Aktivovat všechny předměty,Alle Gegenstände aktivieren,,Aktivigi ĉiuj aĵojn,Activar todos los objetos,,Aktivoi kaikki varusteet,Activer tous les objets,Minden eszköz használata,Attiva tutti gli oggetti,全てのアイテムを使用,모든 아이템 사용,Activeer alle items,Użyj wszystkie przedmioty,Ativar todos os itens,,Activează tot inventarul,Использовать все предметы,Активирај све предмете -Next item,CNTRLMNU_NEXTITEM,,,,Další předmět,Nächster Gegenstand,,Proksima aĵo,Objeto siguiente,,Seuraava varuste,Objet suivant,Következő eszköz,Oggetto successivo,次のアイテム,다음 아이템,Volgende item,Następny przedmiot,Próximo item,,Următorul obiect,Следующий предмет,Следећи предмет -Previous item,CNTRLMNU_PREVIOUSITEM,,,,Předchozí předmět,Vorheriger Gegenstand,,Antaŭa aĵo,Objeto anterior,,Edellinen varuste,Objet précédent,Előző eszköz,Oggetto precedente,前のアイテム,이전 아이템,Vorige item,Poprzedni przedmiot,Item anterior,,Obiect anterior,Предыдущий предмет,Претходни предмет -Holster Weapon,CNTRLMNU_HOLSTER,,,,,Waffe wegstecken,,,Arma de pistolera,,Laske ase,Arme de poing,,Fondina,武器をホルスターに収める,,,,Guardar arma,,Coboară arma,Убрать оружие, -Quick Kick,CNTRLMNU_QUICKKICK,,,,,Schneller Tritt,,,Patada rápida,,Pikapotkaisu,Kick rapide,,Calcio rapido,クイックキック,,,,Chute rápido,,Șut rapid,Быстрый пинок, -Pee,CNTRLMNU_PEE,,,,,Pinkeln,,,,,Pissaa,,,,,,,,,,Urinează,, -Proximity Bomb,CNTRLMNU_PROXIMITYBOMBS,,,,,,,,,,Miinapommi,,,,,,,,,,Bombă de proximitate,, -Remote Bomb,CNTRLMNU_REMOTEBOMBS,,,,,Funkbombe,,,,,Kauko-ohjauspommi,,,,,,,,,,Bombă cu detonator,, -Smoke Bomb,CNTRLMNU_SMOKEBOMB,,,,,Rauchbombe,,,,,Savupommi,,,,,,,,,,Bombă fumigenă,, -Gas Bomb,CNTRLMNU_GASBOMB,,,,,Gasgranate,,,,,Kaasupommi,,,,,,,,,,Bombă cu gaz,, -Flash Bomb,CNTRLMNU_FLASHBOMB,,,,,Blendgranate,,,,,Sokaisupommi,,,,,,,,,,Bombă orbitoare,, -Caltrops,CNTRLMNU_CALTROPS,,,,,Krähenfüße,,,,,Jalkapiikit,,,,,,,,,,Ciulini de fier,, -Holoduke,CNTRLMNU_HOLODUKE,,,,,,,,,,Holo-Duke,,,,ホロDUKE,,,,,,Duke Holografic,Голо-Duke, -Jetpack,CNTRLMNU_JETPACK,,,,,,,,Propulsor,,Rakettireppu,,,,ジェットパック,,,,Jato,,,Джетпак, -Night Vision,CNTRLMNU_NIGHTVISION,,,,,Nachtsichtgerät,,,Visión nocturna,,Yönäkö,Vision de nuit,,,暗視,,,,Visão noturna,,Vedere infraroșie,Ночное видение, -Medkit,CNTRLMNU_MEDKIT,,,,,,,,Botiquín,,Lääkintälaukku,Médikit,,,,,,,Kit médico,,Kit medical,Аптечка, -Steroids,CNTRLMNU_STEROIDS,,,,,Steroide,,,Esteroides,,Steroidit,Stéroïdes,,Steroidi,ステロイド,,,,Esteroides,,Steroizi,Стероиды, -Holo Soldier,CNTRLMNU_HOLOSOLDIER,,,,,Holosoldat,,,,,Holosotilas,,,,,,,,,,Soldat Holografic,, -Huey,CNTRLMNU_HUEY,,,,,,,,,,Huey,,,,,,,,,,,, -Beer,CNTRLMNU_BEER,,,,,Bier,,,Cerveza,,Olut,Bière,,Bara,ビール,,,,Cerveja,,Bere,Пиво, -Cow Pie,CNTRLMNU_COWPIE,not translatable,,,,,,,,,Nautapiirakka,,,,,,,,,,Plăcintă de vacă,, -Yeehaa,CNTRLMNU_YEEHAA,not translatable,,,,,,,,,Jiihaa,,,,,,,,,,,, -Whiskey,CNTRLMNU_WHISKEY,,,,,Whisky,,,Whisky,,Viski,,,,,,,,,,,, -Moonshine,CNTRLMNU_MOONSHINE,,,,,Schwarzgebrannter,,,,,Pontikka,,,,,,,,,,Whiskey ilegal,, -Crystal Ball,CNTRLMNU_CRYSTALBALL,,,,,Kristallkugel,,,,,Kristallipallo,,,,,,,,,,Bilă de cristal,, -Jump Boots,CNTRLMNU_JUMPBOOTS,,,,,Sprungstiefel,,,,,Hyppysaappaat,,,,,,,,,,Cizme pentru sărituri,, -Beast Vision,CNTRLMNU_BEASTVISION,,,,,MonsterVision,,,,,Petonäkö,,,,,,,,,,Vedere de bestie,, -Tank Mode,CNTRLMNU_TANKMODE,,,,,Panzermodus,,,,,Panssaritila,,,,,,,,,,Mod Tanc,, -Smokes,CNTRLMNU_SMOKES,What precisely is this?,,,,Zigaretten,,,,,Röökit,,,,,,,,,,,, -Fire Mission,CNTRLMNU_FIRE_MISSION,,,,,,,,,,Tulitehtävä,,,,,,,,,,,, -Reload,CNTRLMNU_RELOAD,,,,,"Waffe laden -",,,,,Lataa ase,,,,,,,,,,,, -Radar,CNTRLMNU_RADAR,,,,,,,,,,Tutka,,,,,,,,,,Încarcă,, -Other,CNTRLMNU_OTHER,,,,Ostatní,Andere,,Alia,Otros,,Muu,Autres,Más,Altro,その他,그 외 조작,Andere,Inne,Outro,,,Прочее,Остало -Messages: OFF,MSGOFF,,,,Zprávy ZAP,Meldungen AUS,Μηνύματα ΚΛΕΙΣΤΑ,Mesaĝoj MALAKTIVA,Mensajes DESACTIVADOS,,Viestit POIS PÄÄLTÄ,Messages désactivés.,Üzenetek KI,Messaggi DISATTIVATI,メッセージ: オフ,메시지 끔,Berichten UIT,Wiadomości WYŁĄCZONE,Mensagens DESATIVADAS,,Mesaje OPRITE,Сообщения ОТКЛЮЧЕНЫ,Поруке ИСКЉУЧЕНЕ -Messages: ON,MSGON,,,,Zprávy VYP,Meldungen AN,Μηνύματα ΑΝΟΙΧΤΑ,Mesaĝoj AKTIVA,Mensajes ACTIVADOS,,Viestit PÄÄLLÄ,Messages activés.,Üzenetek BE,Messaggi ATTIVATI,メッセージ: オン,메시지 켬,Berichten AAN,Wiadomości WŁĄCZONE,Mensagens ATIVADAS,,Mesaje PORNITE,Сообщения ВКЛЮЧЁНЫ,Поруке УКЉУЧЕНЕ -Writin': OFF,MSGOFF,,Redneck RedneckRides,,Zprávy ZAP,Geschreibsel: AUS,Μηνύματα ΚΛΕΙΣΤΑ,Mesaĝoj MALAKTIVA,Mensajes DESACTIVADOS,,Sepustukset POIES PIÄLTÄ,Messages désactivés.,Üzenetek KI,Messaggi DISATTIVATI,メッセージ: オフ,메시지 끔,Berichten UIT,Wiadomości WYŁĄCZONE,Mensagens DESATIVADAS,,Scriere oprită,Сообщения ОТКЛЮЧЕНЫ,Поруке ИСКЉУЧЕНЕ -Writin': ON,MSGON,,Redneck RedneckRides,,Zprávy VYP,Geschreibsel: AN,Μηνύματα ΑΝΟΙΧΤΑ,Mesaĝoj AKTIVA,Mensajes ACTIVADOS,,Sepustukset PIÄLLÄ,Messages activés.,Üzenetek BE,Messaggi ATTIVATI,メッセージ: オン,메시지 켬,Berichten AAN,Wiadomości WŁĄCZONE,Mensagens ATIVADAS,,Scriere pornită,Сообщения ВКЛЮЧЁНЫ,Поруке УКЉУЧЕНЕ -Mouse aiming ON,TXT_MOUSEAIMON,,,,,Mit Maus zielen: An,,,Apuntar con ratón ACTIVADO,,Hiiritähtäys PÄÄLLÄ,Visée souris activée,,Puntamento col mouse: sì,マウスエイム オン,,,,Mira de mouse lig.,,Țintire cu mouse OPRITĂ,Наведение мышью вкл, -Mouse aiming OFF,TXT_MOUSEAIMOFF,,,,,Mit Maus zielen: Aus,,,Apuntar con ratón DESACTIVADO,,Hiiritähtäys POIS PÄÄLTÄ,Visée souris desactivée,,Puntamento col mouse: no,マウスエイム オフ,,,,Mira de mouse desl.,,Țintire cu mouse PORNITĂ,Наведение мышью откл, -Rat aimin' ON,TXT_MOUSEAIMON,I don't think this translates well...,Redneck RedneckRides,,,Mit Maus zielen: An,,,Apuntar con ratón ACTIVADO,,Rottasihtaus PIÄLLÄ,Visée souris activée,,Puntamento col mouse: sì,マウスエイム オン,,,,Mira de mouse lig.,,Țintire de șobolan PORNITĂ,Наведение мышью вкл, -Rat aimin' OFF,TXT_MOUSEAIMOFF,,Redneck RedneckRides,,,Mit Maus zielen: Aus,,,Apuntar con ratón DESACTIVADO,,Rottasihtaus POIES PIÄLTÄ,Visée souris desactivée,,Puntamento col mouse: no,マウスエイム オフ,,,,Mira de mouse desl.,,Țintire de șobolan OPRITĂ,Наведение мышью откл, -Customize Map Controls,MAPCNTRLMNU_TITLE,most are not used yet but will be,,,Nastavení ovládání mapy,Automapsteuerung einstellen,,Agordi mapregilojn,Controles del mapa,,Kartanohjausasetukset,Contrôles Carte,,Personalizza i controlli mappa,マップコントロール カスタマイズ,미니맵 단축키 설정,Kaartcontroles aanpassen,Ustaw klawisze mapy,Configurar comandos de mapa,,Personalizare schemă de control a hărții,Клавиши управления автокартой,Промени контроле мапе -Map Controls,MAPCNTRLMNU_CONTROLS,,,,Ovládání mapy,Automapsteuerung,,Mapregilojn,Controles del mapa,,Kartanohjaus,Contrôles de la carte,,Controlli mappa,マップコントロール,미니맵 조정,Kaartcontroles,Klawisze mapy,Comandos de mapa,,Schemă de control a hărtii,Автокарта,Контроле мапе -Pan left,MAPCNTRLMNU_PANLEFT,,,,Posun vlevo,Nach links,,Alturni maldekstren,Mover a la izquierda,,Panoroi vasemmalle,Aller à gauche,,Sposta a sinistra,左に振る,왼쪽으로 이동,Pan links,Przesuń w lewo,Mover para a esquerda,,Mutare spre stânga,Сдвиг влево,Лево -Pan right,MAPCNTRLMNU_PANRIGHT,,,,Posun vpravo,Nach rechts,,Alturni dekstren,Mover a la derecha,,Panoroi oikealle,Aller à droite,,Sposta a destra,右に振る,오른쪽으로 이동,Pan rechts,Przesuń w prawo,Mover para a direita,,Mutare spre dreapta,Сдвиг вправо,Десно -Pan up,MAPCNTRLMNU_PANUP,,,,Posun nahoru,Nach oben,,Alturni supren,Mover hacia arriba,,Panoroi ylös,Aller en haut,,Sposta sopra,上に振る,위쪽으로 이동,Pan omhoog,Przesuń w górę,Mover para cima,,Mutare în sus,Сдвиг вверх,Горе -Pan down,MAPCNTRLMNU_PANDOWN,,,,Posun dolů,Nach unten,,Alturni malsupren,Mover hacia abajo,,Panoroi alas,Aller en bas,,Sposta sotto,下に振る,아래쪽으로 이동,Pan neer,Przesuń w dół,Mover para baixo,,Mutare în jos,Сдвиг вниз,Доле -Zoom in,MAPCNTRLMNU_ZOOMIN,,,,Přiblížit,Reinzoomen,,Zomi,Acercar,,Lähennä,Zoom avant,,Ingrandisci,ズームイン,줌 확대,Inzoomen,Przybliż,Ampliar,,Apropriere Cameră,Увеличить масштаб,Увеличати -Zoom out,MAPCNTRLMNU_ZOOMOUT,,,,Oddálit,Rauszoomen,,Malzomi,Alejar,,Loitonna,Zoom arrière,,Rimpicciolisci,ズームアウト,줌 축소,Uitzoomen,Oddal,Diminuir,,Depărtare Cameră,Уменьшить масштаб,Одзумирати -Toggle zoom,MAPCNTRLMNU_TOGGLEZOOM,,,,Zoom vyp./zap.,Zoom an/aus,,Inversigi zomon,Alternar zoom,,Zoomauksen vaihtokytkin,Alterner zoom,,Abilita/disabilita zoom,ズーム切替,표준배율 조정,Omschakelen van de zoom,Przełącz przybliżanie,Ativar zoom,,Comutator Zoom,Переключить зум,Укључи зум -Toggle follow,MAPCNTRLMNU_TOGGLEFOLLOW,,,,Následování hráče vyp./zap.,Folgen an/aus,,Aktivigi sekvon,Alternar seguimiento,,Seuraamistilan vaihtokytkin,Alterner suivi,,Abilita/disabilita scorrimento mappa,追従切替,추적모드 조정,Schakelen volgen,Przełącz śledzenie,Ativar seguimento,,Comutator urmărire jucător,Переключить привязку к игроку,Укључи праћење -Toggle grid,MAPCNTRLMNU_TOGGLEGRID,,,,Mřížka vyp./zap.,Gitter an/aus,,Aktivigi kradon,Alternar cuadrícula,Alternar rejilla,Ruudukon vaihtokytkin,Alterner grille,,Abilita/disabilita la griglia,グリッド切替,그리드 조정,Kiesnet,Przełącz siatkę,Ativar grade,,Comutator grilă,Переключить сетку,Укључи координатну мрежу -Toggle rotate,MAPCNTRLMNU_ROTATE,,,,,Rotation an/aus,,,,,Kääntämisen vaihtokytkin,,,,,,,,,,,, -Toggle texture,MAPCNTRLMNU_TOGGLETEXTURE,,,,Textury vyp./zap.,Texturen an/aus,,Akitvigi teksturon,Alternar textura,,Pintakuvioinnin vaihtokytkin,Alterner texture,,Abilita/disabilita le texture,テクスチャ切替,미니맵 텍스쳐 조정,Toggle textuur,Przełącz tekstury,Ativar texturas,,Comutator mod texturat,Переключить текстуры,Укључи текстуру -Toggle automap,CNTRLMNU_AUTOMAP,,,,Zap. / Vyp. automapu,Automap an/aus,,Baskuligi aŭtomapo,Alternar automapa,,Kytke automaattikartta päälle/pois,Activer Carte,Térkép ki- bekapcsolása,Toggle automappa,オートマップの切替,오토맵 조정,Automap aan/uit,Włącz mapę,Ativar automapa,,Comutator hartă computerizată,Открыть автокарту,Прикажи аутомапу -Chasecam,CNTRLMNU_CHASECAM,,,,Kamera z třetí osoby,Verfolgerkamera,,Ĉaskamerao,Cámara de Seguimiento,,Seurantakamera,Caméra 3ième personne,Külsőnézetű kamera,Telecamera di inseguimento,背後視点,3인칭 카메라,,Kamera Śledzenia,Câmera de terceira-pessoa,Câmera em terceira-pessoa,Cameră urmăritoare,Вид от 3-го лица (Chasecam),Чејс-кем -Screenshot,CNTRLMNU_SCREENSHOT,,,,Pořídit snímek obrazovky,,,Ekranfoto,Captura de pantalla,,Kuvakaappaus,Capture d'écran,Képernyő lefényképezése,Cattura schermo,画面キャプチャ,스크린샷,,Zrzut ekranu,Captura de tela,,Captură ecran,Скриншот,Усликај -Open console,CNTRLMNU_CONSOLE,,,,Otevřít konzoli,Konsole öffnen,,Malfermi konzolon,Abrir consola,,Avaa konsoli,Ouvrir Console,Konzol előhozása,Apri la console,コンソールを開く,콘솔 열기,Open console,Otwórz konsolę,Abrir console,Abrir consola,Deschide consola,Открыть консоль,Отвори консолу -Pause,CNTRLMNU_PAUSE,,,,Pauza,,,Paŭzo,Pausa,,Tauko,,Szünet,Pausa,ポーズ,일시정지,Pauze,Pauza,Pausa,,Pauză,Пауза,Пауза -Increase Display Size,CNTRLMNU_DISPLAY_INC,,,,Zvětšit velikost displeje,Anzeige vergrößern,,Pligrandigi Ekranamplekson,Agrandar Ventana,,Suurenna näytön kokoa,Agrandir l'affichage,Képméret növelése,Incrementa la dimensione del display,画面サイズを拡大,화면 크기 늘리기,Vergroot het display,Powiększ Rozmiar Wyświetlania,Aumentar Tamanho de Tela,Aumentar Tamanho do Ecrã,Mărire ecran,Увеличить размер экрана,Повећајте величину екрана -Decrease Display Size,CNTRLMNU_DISPLAY_DEC,,,,Zmenšit velikost displeje,Anzeige verkleinern,,Plimalgrandigi Ekranamplekson,Reducir Ventana,,Pienennä näytön kokoa,Réduire l'affichage,Képméret csökkentése,Decrementa la dimensione del display,画面サイズを縮小,화면 크기 줄이기,Verlaag het display,Pomniejsz Rozmiar Wyświetlania,Diminuir Tamanho de Tela,Diminuir Tamanho do Ecrã,Micșorare ecran,Уменьшить размер экрана,Смањите величину екрана -Open Help,CNTRLMNU_OPEN_HELP,,,,Otevřít nápovědu,Hilfe öffnen,,Malfermi Helpon,Abrir Ayuda,,Avaa ohje,Ouvrir Aide,Segítség előhozása,Apri l'aiuto,"ヘルプを開く -",도움말 열기,Open hulp,Otwórz Pomoc,Abrir Ajuda,,Deschide Ajutor,Экран помощи,Отвори помоћ -Open Save Menu,CNTRLMNU_OPEN_SAVE,,,,Otevřít menu pro uložení,Speichermenü öffnen,,Malfermi Konservmenuon,Menú de Guardar Partida,,Avaa tallennusvalikko,Ouvrir Menu Sauvegarde,Mentés menü előhozása,Apri il menu di salvataggio,セーブメニューを開く,저장 화면 열기,Menu opslaan openen,Otwórz Menu Zapisu,Abrir Menu de Salvar,Abrir Menu de Gravação,Deschide meniul de salvare,Сохранение игры,Отвори сачуване игре -Open Load Menu,CNTRLMNU_OPEN_LOAD,,,,Otevřít menu pro načtení,Lademenü öffnen,,Malfermi Ŝarĝmenuon,Menú de Cargar Partida,,Avaa latausvalikko,Ouvrir Menu Chargement,Betöltés menü előhozása,Apri il menu di caricamento,ロードメニューを開く,불러오기 화면 열기,Menu laden openen,Otwórz Menu Wczytania,Abrir Menu de Carregar,,Deschide meniul de încărcare,Загрузка игры,Отвори игре за учитати -Open Options Menu,CNTRLMNU_OPEN_OPTIONS,,,,Otevřít nastavení,Optionsmenü öffnen,,Malfermi Agordmenuon,Menú de Opciones,,Avaa asetusvalikko,Ouvrir Menu Options,Beállítások menü előhozása,Apri il menu delle opzioni,オプションメニューを開く,설정 화면 열기,Menu Opties openen,Otwórz Menu Opcji,Abrir Menu de Opções,,Deschide setările,Главное меню настроек,Отвори мени опција -Open Display Menu,CNTRLMNU_OPEN_DISPLAY,,,,Otevřít nastavení grafiky,Anzeigemenü öffnen,,Malfermi Ekranmenuon,Menú de Opciones de Visualización,,Avaa näyttövalikko,Ouvrir Menu Affichage,Megjelenítés menü előhozása,Apri il menu del display,ディスプレイメニューを開く,디스플레이 화면 열기,Displaymenu openen,Otwórz Menu Wyświetlania,Abrir Menu de Vídeo,,Deschide setările de afișare,Меню настроек видео,Отвори мени приказа -Quicksave,CNTRLMNU_QUICKSAVE,,,,Rychlé uložení,Schnellspeichern,,Rapidkonservo,Guardado Rápido,,Pikatallenna,Sauv. Rapide,Gyorsmentés,Salvataggio rapido,クイックセーブ,빠른 저장,Snel opslaan,Szybki Zapis,Salvamento rápido,Gravação rápida,Salvare rapidă,Быстрое сохранение,Брзо-сачувај -Quickload,CNTRLMNU_QUICKLOAD,,,,Rychlé načtení,Schnellladen,,Rapidŝarĝo,Cargado Rápido,,Pikalataa,Charg. Rapide,Gyors betöltés,Caricamento rapido,クイックロード,빠른 불러오기,Snel laden,Szybkie Wczytanie,Carregamento rápido,,Încărcare rapidă,Быстрая загрузка,Брзо-учитај -Exit to Main Menu,CNTRLMNU_EXIT_TO_MAIN,,,,Odejít do hlavního menu,Zurück zum Hauptmenü,,Eliri al Ĉefa Menuo,Salir al Menú Principal,,Poistu päävalikkoon,Sortie Menu Principal,Kilépés a főmenübe,Esci dal menu principale,メインメニューに戻る,메뉴로 나오기,Afsluiten naar het hoofdmenu,Wyjdź do Głównego Menu,Sair para o Menu Principal,,Revenire la meniul principal,Выход в главное меню,Изађи у главни мени -Toggle Messages,CNTRLMNU_TOGGLE_MESSAGES,,,,Zap. / Vyp. zprávy,Nachrichten an/aus,,Baskuligi Mensaĝojn,Alternar Mensajes,,Kytke viestit päälle tai pois,Act./Déasct. Messages,Üzenetek kapcsololása,Toggle messaggi,メッセージ表示の切替,메시지 토글,Berichten aan/uit,Włącz / Wyłącz Wiadomości,Ativar Mensagens,,Comutator mesaje,Переключение сообщений,Таглави поруке -Quit Game,CNTRLMNU_MENU_QUIT,,,,Odejít ze hry,Spiel beenden,,Ĉesigi Ludon,Salir del Juego,,Lopeta peli,Quitter le Jeu,Kilépés a játékból.,Esci dal gioco,ゲームを終了,게임 종료,Stop het spel,Wyjdź z Gry,Sair do Jogo,,Ieși din Joc,Выход,Изађи из игре -Adjust Gamma,CNTRLMNU_ADJUST_GAMMA,,,,Nastavit gamu,Gamma-Anpassung,,Agordi Gamaon,Ajustar Gamma,,Säädä gammaa,Ajuster Gamma,Gamma állítása,Aggiustamento Gamma,ガンマ値を調整,감마 조정,Gamma aanpassen,Dostosuj Gammę,Ajustar Gama,,Ajustare gamma,Настройка гаммы,Подесите осветљење -Mouse Options,MOUSEMNU_TITLE,,,,Nastavení myši,Mausoptionen,,Musilagordoj,Opciones del Ratón,,Hiiriasetukset,Options Souris,Egér beállítások,Opzioni Mouse,マウス オプション,마우스 설정,Muis opties,Opcje Myszki,Opções de mouse,Opções do rato,Setări mouse,Настройки мыши,Миш -Enable mouse,MOUSEMNU_ENABLEMOUSE,,,,Povolit myš,Maus aktiv,,Aktivigi muson,Habilitar ratón,,Ota hiiri käyttöön,Activer Souris,Egér engedélyezése,Abilita il mouse,マウスの使用,마우스 사용,Muis inschakelen,Włącz myszkę,Habilitar mouse,Permitir uso do rato,Activare mouse,Использовать мышь,Укључи миш -Enable mouse in menus,MOUSEMNU_MOUSEINMENU,,,,Povolit myš v nabídkách,Maus aktiv in Menüs,,Aktivigi muson en menuoj,Usa ratón en los menús,,Ota hiiri käyttöön valikoissa,Activer Souris dans les Menus,Egér engedélyezése a menüben.,Abilita il mouse nei menu,メニューでのマウスの使用,메뉴에서 마우스 사용,Muis in menu's inschakelen,Włącz myszkę w menu,Habilitar mouse nos menus,Permitir rato nos menus,Activare mouse în meniuri,Использовать мышь в меню,Укључи миш у менијима -Show back button,MOUSEMNU_SHOWBACKBUTTON,,,,Zobrazit tlačítko zpět,Zeige Zurück-Knopf,,Montri antaŭklavon,Botón de retroceso,,Näytä taaksenäppäin,Afficher le bouton retour,Vissza gomb mutatása,Mostra il bottone per tornare indietro,戻るボタンを表示,뒤로가기 버튼 보이기,Toon terug knop,Pokaż przycisk powrotu,Mostrar botão de voltar,,Afișare buton de întoarcere,Расположение кнопки «назад»,Прикажи тастер за назад -Cursor,MOUSEMNU_CURSOR,,,,Kurzor,,,Musmontrilo,,,Osoitin,Curseur,Egérmutató,Cursore,カーソル,커서,,Kursor,,,,Курсор,Курсор -Horizontal sensitivity,MOUSEMNU_SENSITIVITY_X,,,,Horizontální citlivost,Horizontale Empfindlichkeit,Οριζόντια ευαισθησία,Horizontala sentemo,Sensibilidad horizontal,,Vaakasuuntainen herkkyys,Sensibilité horizontale,Vízszintes érzékenység,Sensibilità orizzontale,水平感度,수평 감도,Horizontale gevoeligheid,Czułość pozioma,Sensibilidade horizontal,,Sensibilitate orizontală,Горизонтальная чувствительность,Хоризонтална осетљивост -Vertical sensitivity,MOUSEMNU_SENSITIVITY_Y,,,,Vertikální citlivost,Vertikale Empfindlichkeit,Κάθετη ευαισθησία,Vertikala sentemo,Sensibilidad vertical,,Pystysuuntainen herkkyys,Sensibilité verticale,Függőleges érzékenység,Sensibilità verticale,垂直感度,수직 감도,Verticale gevoeligheid,Czułość pionowa,Sensibilidade vertical,,Sensibilitate verticală,Вертикальная чувствительность,Вертикална осетљивост -Smooth mouse movement,MOUSEMNU_SMOOTHMOUSE,,,,Vyhladit pohyb myši,Mausbewegung glätten,,Glata musmovo,Mov. fluido del ratón,,Sulava hiiren liike,Lissage Souris,Egyenletes egérmozdulatok,Movimento del mouse liscio,マウス操作を滑らかにする,부드러운 움직임,Vlotte muisbeweging,Gładki ruch myszki,Movimento fluído do mouse,Movimento fluído do rato,Mișcare mouse fină,Плавное перемещение,Глатки окрет -Turning speed,MOUSEMNU_TURNSPEED,,,,Rychlost otáčení,Umdrehgeschwindigkeit,,Turnorapido,Velocidad de giro,,Kääntymisnopeus,Vitesse pour tourner,Fordulási sebesség,Velocità di rotazione,旋回速度,회전 속도,Draaisnelheid,Szybkość obracania się,Velocidade de giro,,Viteză rotire,Скорость поворота,Брзина окрета -Mouselook speed,MOUSEMNU_MOUSELOOKSPEED,,,,Rychlost pohledu nahoru/dolů,Mausblick-Geschwindigkeit,,Musrigarda rapido.,Veloc. de vista con ratón,,Katselunopeus,Vitesse Vue Souris,Egérrel való nézés sebessége,Velocità di rotazione della vista,上下視点速度,마우스룩 속도,Mouselook snelheid,Szybkość rozglądania się myszką,Velocidade de vista com mouse,Velocidade de vista com rato,Viteză privire în jur cu mouse,Скорость обзора,Брзина гледања мишем -Forward/Backward speed,MOUSEMNU_FORWBACKSPEED,,,,Rychlost pohybu vpřed/vzad,Vor/Rückwärtsgeschwindigkeit,,Antaŭa/Malantaŭa rapido,Veloc. de avance/retroceso,,Eteen-/taaksepäin liikkeen nopeus,Vitesse Avancer/reculer,Előre/Hátra sebesség,Velocità avanti/indietro,"前進/後退速度 -",전진/후진 속도,Voorwaartse/achterwaartse snelheid,Szybkość chodzenia do przodu/do tyłu,Velocidade de deslocamento para frente/trás,,Viteză deplasare față/spate,Скорость передвижения,Брзина окрета напред/уназад -Strafing speed,MOUSEMNU_STRAFESPEED,,,,Rychlost pohybu do stran,Seitwärtsgeschwindigkeit,,Flankmova rapido,Veloc. de mov. lateral,,Sivuttaisastunnan nopeus,Vitesse Gauche/Droite,,Velocità movimento laterale,横移動速度,좌진/우진 속도,Zijdelings snelheid,Szybkość uników,Velocidade de deslocamento lateral,,Viteză deplasare în diagonală,Скорость движения боком,Брзина стрејфа -Always Mouselook,MOUSEMNU_ALWAYSMOUSELOOK,,,,Vždy se rozhlížet myší,Mausblick immer an,,Ĉiam Musrigardo,Siempre mirar con ratón,,Jatkuva hiirikatselu,Toujours vue Souris,Mindig nézelődés az egérrel,Vista col mouse,常に上下視点をオン,마우스룩 사용,Altijd Mouselook,Zawsze zezwalaj na rozglądanie się myszką,Vista com mouse sempre ligado,Vista com rato sempre ligada,Privire în jur cu mouse permanentă,Обзор мышью,Гледање мишем -Invert Mouse Y,MOUSEMNU_INVERTMOUSE,,,,Inverzní myš Y,Maus Y invertieren,,Inversa Muso Y,Invertir ratón Y,,Käännä hiiri Y,Inverser Souris Y,Egérirányok megfordítása Y,Mouse Y invertito,視点操作反転,마우스 방향 전환,Muis-Y-as omkeren,Odwróć Myszkę Y,Inverter mouse Y,Inverter rato,Inversare axe mouse Y,Инвертирование мыши Y,Инвертуј миш Y -Invert Mouse X,MOUSEMNU_INVERTMOUSEX,,,,Inverzní myš X,Maus X invertieren,,Inversa Muso X,Invertir ratón X,,Käännä hiiri X,Inverser Souris X,Egérirányok megfordítása X,Mouse X invertito,視点操作反転,마우스 방향 전환,Muis-X-as omkeren,Odwróć Myszkę X,Inverter mouse X,Inverter rato X,Inversare axe mouse X,Инвертирование мыши X,Инвертуј миш X -Mouselook Toggle,MOUSEMNU_LOOKSPRING,,,,Automatické vystředění pohledu,Automatisch zentrieren,,Rigardsalto,Mirar con ratón,,Katseenpalautin,Recentrer après Vue Souris,,,視点水平化,마우스룩 시점 초기화,Lente,Automatyczne Wyśrodkowanie,Centralizar automáticamente,Centrar automáticamente,Comutator privire în jur cu mouse,Передвижение мышью,Покрет мишем -Mouse Strafe,MOUSEMNU_LOOKSTRAFE,,,,Použít myš k pohybu do stran,Seitwärts bewegen mit der Maus,,Rigardturnmovo,Mirar con movimiento,,Sivuttaisastuntapalautin,Mouvement Latéral par Souris,,,視点横移動化,마우스룩 좌우 이동,Lookstrafe,Unikanie przy użyciu myszki,Deslocamento lateral com o mouse,Deslocamento lateral com o rato,Deplasare în diagonală cu mouse,Движение боком мышью,Стрејф мишем -Upper left,OPTVAL_UPPERLEFT,,,,Vlevo nahoře,Oben links,,Supra maldekstre,Sup. izquierda,,Ylävasemmalla,Supérieur gauche,,Superiore sinistro,左上,왼쪽 위,Linksboven,Lewy górny róg,Esquerda superior,,Stânga sus,Вверху слева,Горње лево -Upper right,OPTVAL_UPPERRIGHT,,,,Vpravo nahoře,Oben rechts,,Supra dekstre,Sup. derecha,,Yläoikealla,Supérieur droite,,Superiore destro,右上,오른쪽 위,Rechtsboven,Prawy górny róg,Direita superior,,Dreapta sus,Вверху справа,Горње десно -Lower left,OPTVAL_LOWERLEFT,,,,Vlevo dole,Unten links ,,Suba maldekstre,Inf. izquierda,,Alavasemmalla,Inférieur gauche,,Inferiore sinistro,左下,왼쪽 밑,Linksonder,Lewy dolny róg,Esquerda inferior,,Stânga jos,Внизу слева,Доње лево -Lower right,OPTVAL_LOWERRIGHT,,,,Vpravo dole,Unten rechts,,Suba dekstre,Inf. derecha,,Alaoikealla,Inférieur droite,,Inferiore destro,右下,오른쪽 밑,Rechtsonder,Prawy dolny róg,Direita inferior,,Dreapta jos,Внизу справа,Доње десно -Touchscreen-like,OPTVAL_TOUCHSCREENLIKE,,,,Jako dotyková obrazovka,Wie auf einem Touchscreen,,Tuŝekrana,Pant. táctil,,Kosketusnäyttömäinen,Style écran tactile,,Come il Touchscreen,タッチスクリーン式,터치스크린 같게,Touchscreen-achtige,Jak ekrean dotykowy,Estilo touchscreen,,Precum touchscreen,Как сенсорный экран,Као додирни екран -Simple arrow,OPTSTR_SIMPLEARROW,,,,Jednoduchý kurzor,Einfacher Pfeil,,Simpla sago,Flecha simple,,Yksinkertainen nuoli,Flèche simple,,Freccia semplice,シンプル,기본 커서,Eenvoudige pijl,Prosta strzałka,Flecha simples,Cursor simples,Săgeată simplă,Стрелка,Стрелица -System cursor,OPTSTR_SYSTEMCURSOR,,,,Systémový kurzor,Systemcursor,,Sistema kursoro,Cursor del sistema,,Järjestelmän osoitin,Curseur Système,,Cursore di sistema,システム,시스템 커서,Systeemcursor,Kursor systemu,Cursor do sistema,,Cursor simplu,Системный курсор,Системска стрелица -Default,OPTVAL_DEFAULT,,,,Výchozí,Standard,,Defaŭlte,Por defecto,,Oletus,Défaut,,,デフォルト,기본 설정,Standaard,Domyślne,Padrão,,Implicit,По умолчанию,Подраз. -Configure Controller,JOYMNU_TITLE,,,,Konfigurovat ovladač,Controller konfigurieren,,Agordi Ludregilon,Configurar Mando,,Peliohjainasetukset,Configurer Mannette,Kontroller testreszabása,Configura il controller,コントローラー構成:,컨트롤러 구성,Controller configureren,Konfiguruj Kontroler,Configurar Controle,Configurar Comando,Configurare controller,Настроить контроллер,Конфигурација контролера -Controller Options,JOYMNU_OPTIONS,,,,Nastavení ovladače,Controlleroptionen,,Ludregilagordoj,Opciones del mando,,Peliohjainasetukset,Options Mannette,Kontroller beállításai,Opzioni del controller,コントローラー設定,컨트롤러 설정,Controller opties,Opcje Kontrolera,Opções de Controle,Opções do Comando,Setări controller,Настройки контроллера,Подешавања контролера -Block controller input in menu,JOYMNU_NOMENU,,,,Zakázat ovladač v nabídkách,Blockiere Controllereingabe im Menü,,Blokigi ludregilon enigon en menuo,Bloq. entrada de mando en menú,,Estä ohjainsyötteet valikoissa,Bloquer manette dans les menus,Kontroller ne működjön a menüben,Blocca l'input del controller nei menu,メニューではコントローラーを無視,메뉴에서 컨트롤러 끄기,Blokkeer de controller in het menu,Blokuj wejście kontrolera w menu,Bloquear controle no menu,Bloquear comando no menu,Blocare comenzi controller în meniu,Отключить контроллер в меню,Блокирај улаз контролера у менију -Enable controller support,JOYMNU_ENABLE,,,,Povolit podporu pro ovladače,Erlaube Controllerunterstützung,,Aktivigi ludregilsubtenon,Activar soporte de mandos,,Ota käyttöön peliohjaintuki,Activer support contrôleur,,Abilita il supporto del controller,コントローラーサポート許可,컨트롤러 지원 허용,Controllerondersteuning inschakelen,Włącz wsparcie kontrolera,Habilitar suporte de controles,,Activare support controller,Включить поддержку контроллера,Омогући подршку за контролере -Enable DirectInput controllers,JOYMNU_DINPUT,,,,Povolit ovladače DirectInput,Erlaube DirectInput-Controller,,Aktivigi DirectInput ludregilojn,Usa controles DirectInput,,Ota käyttöön DirectInput-ohjaimet,Activer contrôleurs DirectInput,,Abilita i controlli DirectInput,ダイレクトインプットコントローラー許可,다이렉트 인풋 컨트롤러 허용,DirectInput-controllers inschakelen,Włącz kontrolery DirectInput,Habilitar controles DirectInput,,Activare controlere DirectInput,Включить контроллеры DirectInput,Омогући директинпут контролере -Enable XInput controllers,JOYMNU_XINPUT,,,,Povolit ovladače XInput,Erlaube XInput-Controller,,Aktivigi XInput ludregilojn,Usa controles XInput,,Ota käyttöön XInput-ohjaimet,Activer contrôleurs XInput,,Abilita i controlli XInput,Xinput コントローラー許可,X인풋 컨트롤러 허용,XInput-controllers inschakelen,Włącz kontrolery XInput,Habilitar controles XInput,,Activare controlere XInput,Включить контроллеры XInput,Омогући Иксинпут контролере -Enable raw PlayStation 2 adapters,JOYMNU_PS2,,,,Povolit ovladače PlayStation 2,Erlaube Playstation 2-Controller,,Aktivigi krudajn PlayStation 2 adaptilojn,Usa adaptadores de PlayStation 2,,Ota käyttöön raa'at PlayStation 2 -adapterit,Activer adaptateurs PS2 bruts,,Abilita gli adattatori raw PlayStation 2,PlayStation2 アダプター許可,PS2 어뎁터 허용,Raw PlayStation 2-adapters inschakelen,Włącz adaptery PlayStation 2,Habilitar adaptadores de PlayStation 2,,Activare adaptoare PS2,Использовать адаптеры PlayStation 2 напрямую,Омогући сирове Плејстејшн 2 адаптере -No controllers detected,JOYMNU_NOCON,,,,Nenalezeny žádné ovladače,Keine Controller gefunden,,Neniu ludregilojn detektas,No hay mandos detectados,,Ei havaittuja ohjaimia,Aucun Contrôleur détecté.,,Nessun controller trovato,コントローラーが見つかりません,인식된 컨트롤러 없음,Geen controllers gedetecteerd,Nie wykryto kontrolerów,Nenhum controle detectado,Nenhum comando foi detectado,Niciun controller detectat,Контроллеры не обнаружены,Нема детектованих контролера -Configure controllers:,JOYMNU_CONFIG,,,,Nastavit ovladače:,Controller konfigurieren,,Agordi ludregilojn:,Configurar controles:,,Mukauta ohjaimia:,Configurer contrôleurs:,,Configura i controller:,コントローラー構成:,컨트롤러 설정:,Configureer controllers:,Konfiguruj kontrolery:,Configurar controles:,Configurar comandos,Configurare controlere:,Настроить контроллер:,Подешавања контролере: -Controller support must be,JOYMNU_DISABLED1,,,,Podpora ovladačů musí být,Controllerunterstütung muss aktiviert sein,,Ludregilsubteno devas esti,El soporte de mandos debe estar,,Ohjaintuen täytyy olla otettu,Le Support de contrôleur doit être activé,,Il supporto ai controller deve essere,コントローラーサポートは,감지하려면 컨트롤러 지원을,Controller ondersteuning moet ingeschakeld zijn,Wsparcie kontrolera musi być,Suporte à controles deve ser,Suporte a comandos devem ser,Supportul pentru controller trebuie,Включите поддержку контроллера,Омогућите подржавање контролера -enabled to detect any,JOYMNU_DISABLED2,Supposed to be empty in Russian and Serbian.,,,zapnuta pro jejich detekování,um welche zu finden,,ŝaltita detekti ajn,activado para detectar alguno,,käyttöön ohjainten havaitsemiseksi,avant de pouvoir en détecter un.,,abilitato a trovare ogni,検出しました,활성화 해야합니다.,om eventuele regelaars te detecteren.,Włączony by wykryć jakikolwiek,habilitado para poder detectar algum,,activat pentru a le detecta, \n, \n -Invalid controller specified for menu,JOYMNU_INVALID,,,,Vybrán nesprávný ovladač pro nabídky,Ungültiger Controller für Menü ausgewählt,,Malprava ludregilo specifigis por menuo,Mando inválido especificado para el menú,,Epäkelpo ohjain määritetty valikolle,Contrôleur invalide spécifé dans le menu.,,Controller invalido specificato per il menu,メニューではコントローラーを使用しない,메뉴에 특정된 컨트롤러가 아닙니다.,Ongeldige regelaar gespecificeerd voor het menu,Niewłaściwy kontroler określony dla menu,Controle inválido especificado para o menu,Comando inválido,Controller pentru meniu invalid,Недопустимый контроллер выбран для меню,Невалидан контролер специфиран за мени -Overall sensitivity,JOYMNU_OVRSENS,,,,Celková citlivost,Allgemeine Empfindlichkeit,,Tutsentemeco,Sensibilidad general,,Yleisherkkyys,Sensibilité générale,,Sensibilità generale,全体的な感度,전체 민감도,Algemene gevoeligheid,Ogólna Czułość,Sensibilidade geral,,Sensibilitate în ansamblu,Общая чувствительность,Уупна сензитивност -Axis Configuration,JOYMNU_AXIS,,,,Nastavení os,Achsenkonfiguration,,Akso-agordoj,Configuración del eje,,Akseleiden säätäminen,Configuration des axes,,Configurazione assi,軸構成,축 구성,Asconfiguratie,Konfiguruj Oś,Configuração de Eixo,,Configurare axă,Конфигурация осей,Конфигурација осе -Invert,JOYMNU_INVERT,,,,Obrátit,Invertieren,,Inversigi,Invertir,,Käännä,Inverser,,Inverti,反転,순서 바꿈,Omkeren,Odwróć,Inverter,,Inversare,Инвертировать,Инвертовано -Dead zone,JOYMNU_DEADZONE,,,,Mrtvá zóna,Totzone,,Mortzono,Zona muerta,,Kuollut alue,Zone neutre,,Zona cieca,デッドゾーン,불감대,Dode zone,Martwa strefa,Zona morta,,Zonă moartă,Мёртвая зона,Мртва зона -No configurable axes,JOYMNU_NOAXES,,,,Žádné nastavitelné osy,Keine konfigurierbaren Achsen,,Neniu agordeblaj aksoj,No hay ejes configurables,,Ei säädettäviä akseleita,Aucun axe à configurer,,Nessun asse configurabile,軸構成を無効,설정할 방향키가 없습니다.,Geen configureerbare assen,Brak osi do skonfigurowania,Sem eixos configuráveis,,Nicio axă configurabilă,Нет настраиваемых осей,Нема конфигурационих оса -None,OPTVAL_NONE,,,,Žádný,Kein,,Neniu,Ninguno,,Ei mitään,Aucun,,Nessuno,無し,없음,Geen,Żaden,Nenhum,,Niciuna,Откл.,Ништа -Turning,OPTVAL_TURNING,,,,Otáčení,Umdrehen,,Turnanta,Girar,,Kääntyminen,Tourner,,Rotazione,旋回,회전,Draaien,Obracanie się,Girar,,Rotire,Поворот,Скретање -Looking Up/Down,OPTVAL_LOOKINGUPDOWN,,,,Dívání se nahoru/dolů,Hoch/runterblicken,,Rigardanta Supre/Malsupre,Mirar hacia Arriba/Abajo,,Ylös/Alas katsominen,Vue haut/bas,,Sguardo Sopra/Sotto,視点上下,위/아래로 보기,Omhoog/omlaag zoeken,Patrzenie w górę/w dół,Olhar para cima/baixo,,Privire Sus/Jos,Взгляд вверх/вниз,Гледање горе/доле -Moving Forward,OPTVAL_MOVINGFORWARD,,,,Pohyb vpřed,Vorwärtsbewegung,,Movanta Rekte,Avanzar,,Eteenpäin liikkuminen,Avancer,,Movimento in avanti,前進,앞으로 전진,Voorwaarts bewegen,Poruszanie się do przodu,Mover para a frente,,Deplasare în Față,Движение вперёд,Кретање напред -Strafing,OPTVAL_STRAFING,,,,Pohyb do stran,Seitwärtsbewegung,,Flankmovanta,Desplazarse,,Sivuttaisastunta,Pas de côté,,Movimento laterale,横移動,양옆으로 이동,Strafelen,Uniki,Deslocamento lateral,,Deplasare în Diagonală,Движение боком,Кретање у страну -Moving Up/Down,OPTVAL_MOVINGUPDOWN,,,,Pohyb nahoru/dolů,Auf/abwärtsbewegung,,Movanta Supre/Malsupre,Moverse hacia Arriba/Abajo,,Ylös/Alas liikkuminen,Mouvement haut/bas,,Movimento Sopra/Sotto,前進後退,위/아래로 이동,Naar boven/beneden bewegen,Poruszanie się w górę/w dół,Deslocar para cima/baixo,,Mișcare Sus/Jos,Движение вверх/вниз,Кретање горе/доле -Inverted,OPTVAL_INVERTED,,,,Inverzní,Invertiert,,Inversigita,Invertido,,Käännetty,Inversé,,Invertito,反転する,반전,Omgekeerd,Odwrócony,Invertido,,Inversat,Инвертировано,Обрнуто -Not Inverted,OPTVAL_NOTINVERTED,,,,Nikoliv inverzní,nicht invertiert,,Ne Inversigita,No invertido,,Ei käännetty,Non Inversé,,Non invertito,反転しない,반전되지 않음,Niet omgekeerd,Nieodwrócony,Não Invertido,,Neinversat,Прямо,Не обрнуто -,PLayer Menu,,,,,,,,,,,,,,,,,,,,,, -Player Setup,MNU_PLAYERSETUP,,,,Nastavení hráče,Spielereinstellungen,,Ludanto Agordaĵo,Config. del jugador,,Pelaaja-asetukset,Options Joueur,Játékos testreszabása,Settaggio giocatore,プレイヤーの特徴,플레이어 설정,Speler instellen,Ustawienia Gracza,Definições de Jogador,,Configurare jucător,Настройки игрока,Подешавања играча -Blue,TXT_COLOR_BLUE,,,,Modrá,Blau,,Blua,Azul,,Sininen,Bleu,Kék,Blu,青,청색,Blauw,Niebieski,Azul,,Albastru,Синий,Плава -Red,TXT_COLOR_RED,,,,Červená,Rot,,Ruĝa,Rojo,,Punainen,Rouge,Vörös,Rosso,赤,적색,Rood,Czerwony,Vermelho,,Roșu,Красный,Црвена -Green,TXT_COLOR_GREEN,,,,Zelená,Grün,,Verda,Verde,,Vihreä,Vert,Zöld,Verde,緑,녹색,Groen,Zielony,Verde,,Verde,Зелёный,Зелена -Gray,TXT_COLOR_GRAY,,,Grey,Šedá,Grau,,Griza,Gris,,Harmaa,Gris,Szürke,Grigio,灰,회색,Grijs,Szary,Cinza,,Gri,Серый,Сива -Dark gray,TXT_COLOR_DARKGRAY,,,"Dark grey -",Tmavě šedá,Dunkelgrau,,Grizeta,gris oscuro,,Tummanharmaa,Gris sombre,Sötétszürke,Grigio scuro,鉛,치색,Donkergrijs,Ciemnoszary,Cinza escuro,,Gri închis,Тёмно-серый,Тамно сива -Dark Green,TXT_COLOR_DARKGREEN,,,,Tmavě zelená,Dunkelgrün,,Malhelverda,Verde oscuro,,Tummanvihreä,Vert sombre,Sötétzöld,Verde scuro,深,흑녹색,Donkergroen,Ciemnozielony,Verde escuro,,Verde închis,Тёмно-зелёный,Тамна зелена -Brown,TXT_COLOR_BROWN,,,,Hnědá,Braun,,Bruna,Marrón,,Ruskea,Brun,Barna,Marrone,茶,갈색,Bruin,Brązowy,Marrom,,Maro,Коричневый,Браон -Dark Blue,TXT_COLOR_DARKBLUE,,,,Tmavě modrá,Dunkelblau,,Malhelblua,Azul oscuro,,Tummansininen,Bleu sombre,Sötétkék,Blu scuro,,,Donkerblauw,,Azul escuro,,Albastru închis,Тёмно-Синий,Тамна Плава -Light Red,TXT_COLOR_LIGHTRED,,,,Světle červená,Hellrot,,Ruĝeta,Rojo claro,,Vaaleanpunainen,Rouge clair,,Rosso chiaro,丹,옅은 적색,Licht Rood,Jasnoczerwony,Vermelho claro,,Roșu deschis,Светло-красный,Светло црвена -Yellow,TXT_COLOR_YELLOW,,,,Žlutá,Gelb,,Flava,Amarillo,,Keltainen,Jaune,Sárga,Giallo,黄,노란색,Geel,Żółty,Amarelo,,Galben,Жёлтый,Жута -Purple,TXT_COLOR_PURPLE,,,,Fialová,Violett,,Purpura,Morado,,Purppura,Violet,Lila,Viola,紫,보라색,Paars,Fioletowy,Roxo,,Mov,Фиолетовый,Љубичаста -Olive,TXT_COLOR_DULLGREEN,,,,Bledě zelená,Blassgrün,,Gris-Verda,Verde pálido,,Haaleanvihreä,Vert pâle,,Verde pallido,苔,암녹색,Saaie groen,Matowa Zieleń,Verde pálido,,Măsliniu,Мутно-зелёный,Тупа зелена -Auto,OPTVAL_AUTO,,,,,,,Aŭtomata,Automático,,Automaattinen,,,Automatico,自動,자동,,Automatycznie,Automático,,,Авто,Аутоматски -Name,PLYRMNU_NAME,,,,Jméno,,,Nomo,Nombre,,Nimi,Nom,Név,Nome,名前,이름,Naam,Imię,Nome,,Nume,Имя,Надимак -Team,PLYRMNU_TEAM,,,,Tým,,,Teamo,Equipo,,Joukkue,Equipe,Csapat,Squadra,チーム,팀,Team,Drużyna,Equipe,Equipa,Echipă,Команда,Тим -Color,PLYRMNU_PLAYERCOLOR,,,Colour,Barva,Farbe,,Koloro,,,Väri,Couleur,Szín,Colore,色,색상,Kleur,Kolor,Cor,,Culoare,Цвет,Боја -Multiplayer taunts,PLRMNU_TAUNTS,,,,,Mehrspieler-Spott,,,,,,,,,,,,,,,Tachinări online,, -Gender,PLYRMNU_PLAYERGENDER,,,,Pohlaví,Geschlecht,,Genro,Género,,Sukupuoli,Genre,Nem,Sesso,性別,성별,Geslacht,Płeć,Gênero,,Sex,Пол,Пол -Male,OPTVAL_MALE,,,,Muž,Männlich,,Vira (Li),Masculino,,Miespuolinen,Masculin,,Maschio,男,남성,Man,Mężczyzna,Masculino,,Masculin,Мужской,Мушко -Female,OPTVAL_FEMALE,,,,Žena,Weiblich,,Ina (Ŝi),Femenino,,Naispuolinen,Féminin,,Femmina,女,여성,Vrouw,Kobieta,Feminino,,Feminin,Женский,Женско -Neutral,OPTVAL_NEUTRAL,,,,Neutrální,Neutral,,Neŭtrala (Ri),Neutro,,Sukupuoleton,Neutre,,Neutrale,中間,중성,Neutraal,Neutralne,Neutro,,Neutru,Нейтральный,Неутрално -Object,OPTVAL_OTHER,,,,Objekt,Objekt,,Objekto (Ĝi),Objeto,,Olio,Objet,,Oggetto,物体,기타,Doel,Obiekt,Objeto,,Obiect,Предмет,Предмет -,Multiplayer,,,,,,,,,,,,,,,,,,,,,, -Game Options,NETMNU_OPTIONS,,,,,Spieleinstellungen,,,,,Pelin asetukset,,,,,,,,,,Setări joc,, -Launch Game,NETMNU_LAUNCH,,,,,Spiel starten,,,,,Käynnistä peli,,,,,,,,,,Pornire joc,, -Game Type,NETMNU_GAMETYPE,,,,,Spieltyp,,,,,Pelityyppi,,,,,,,,,,Tip joc,, -Deathmatch (Spawn),NETMNU_GAMETYPE1,currently not used,,,,Deathmatch mit Monstern,,,,,Kuolonmatsi (esineet palautuvat),,,,,,,,,,Deathmatch (doar spawn),, -DukeMatch (Spawn),NETMNU_GAMETYPE1,Duke,,,,DukeMatch mit Monstern,,,,,Dukematsi (esineet palautuvat),,,,,,,,,,DukeMatch (doar spawn),, -GI Match (Spawn),NETMNU_GAMETYPE1,Nam,,,,GI Match mit Feinden,,,,,Solttumatsi (esineet palautuvat),,,,,,,,,,Meci GI (doar spawn),, -GruntMatch (Spawn),NETMNU_GAMETYPE1,WW2GI,,,,Infanteriematch mit Feinden,,,,,Solttumatsi (esineet palautuvat),,,,,,,,,,GruntMatch (doar spawn),, -Cooperative Play,NETMNU_GAMETYPE2,,,,,Kooperatives Spiel,,,,,Yhteispeli,,,,,,,,,,Joc Cooperativ,, -Deathmatch (No Spawn),NETMNU_GAMETYPE3,,,,,Deathmatch ohne Monster,,,,,Kuolonmatsi (esineet eivät palaudu),,,,,,,,,,Deathmatch (fără spawn),, -DukeMatch (No Spawn),NETMNU_GAMETYPE3,Duke,,,,DukeMatch ohne Monster,,,,,Dukematsi (esineet eivät palaudu),,,,,,,,,,DukeMatch (fără spawn),, -GI Match (No Spawn),NETMNU_GAMETYPE3,Nam,,,,GI Match ohne Feinde,,,,,Solttumatsi (esineet eivät palaudu),,,,,,,,,,Meci GI (fără spawn),, -GruntMatch (No Spawn),NETMNU_GAMETYPE3,WW2GI,,,,Infanteriematch ohne Feinde,,,,,Solttumatsi (esineet eivät palaudu),,,,,,,,,,GruntMatch (fără spawn),, -Team DM (Spawn),NETMNU_GAMETYPE4,,,,,Team DM mit Monstern,,,,,Joukkuematsi (esineet palautuvat),,,,,,,,,,DM în echipă (doar spawn),, -Team DM (No Spawn),NETMNU_GAMETYPE5,,,,,Team DM ohne Monster,,,,,Joukkuematsi (esineet eivät palaudu),,,,,,,,,,DM în echipă (fără spawn),, -Episode,NETMNU_EPISODE,,,,,,,,,,Episodi,,,,,,,,,,Episod,, -Level,NETMNU_LEVEL,,,,,,,,,,Taso,,,,,,,,,,Nivel,, -Monsters,NETMNU_MONSTERS,,,,,Monster,,,,,Hirviöt,,,,,,,,,,Monștri,, -Markers,NETMNU_MARKERS,,,,,Markierungen,,,,,Merkit,,,,,,,,,,Markere,, -Map Exits,NETMNU_MAPEXITS,,,,,Levelausgänge,,,,,Tasopoistumiset,,,,,,,,,,Ieșiri Hartă,, -Friendly Fire,NETMNU_FFIRE,,,,,Teambeschuss,,,,,Ristituli,,,,,,,,,,Accidente,, -Accept,NETMNU_ACCEPT,,,,,Ok,,,,,Hyväksy,,,,,,,,,,,, -Server,NETMNU_SERVER,,,,,,,,,,Palvelin,,,,,,,,,,,, -Port,NETMNU_PORT,Network port!,,,,,,,,,Portti,,,,,,,,,,,, -Connect,NETMNU_CONNECT,,,,,Vebinden,,,,,Yhdistä,,,,,,,,,,Conectare,, -,Gameplay options,,,,,,,,,,,,,,,,,,,,,, -Gameplay Options,GMPLYMNU_TITLE,,,,Nastavení herních mechanik,Gameplay-Optionen,,Ludadagordoj,Opciones de jugabilidad,,Pelattavuusasetukset,Options Gameplay,,Opzioni gameplay,ゲームプレイ オプション,게임플레이 설정,Gameplay-opties,Opcje Rozgrywki,Opções de Jogabilidade,,Setări pe timp de joc,Настройки геймплея,Подешавања гејмплеја -Always,OPTVAL_ALWAYS,,,,Vždy,Immer,,Ĉiam,Siempre,,Aina,Toujours,,Sempre,常に,언제나,Altijd,Zawsze,Sempre,,Mereu,Всегда,Увек -Never,OPTVAL_NEVER,,,,Nikdy,Nie,,Neniam,Nunca,,Ei koskaan,Jamais,,Mai,しない,없음,Nooit,Nigdy,Nunca,,Niciodată,Никогда,Никад -Hitscan only,OPTVAL_HITSCAN,,,,,Nur Hitscan,,,,,Vain osumatarkistus,,,,,,,,,,Doar hitscan,, -Autoaim,PLYRMNU_AUTOAIM,,,,Automatické míření,Automatisch zielen,,Aŭtomate-celi,Autoapuntar,,Automaattitähtäys,Auto-visée,Auto célzás,Mira automatica,自動照準,자동 조준,Autoaim,Automatyczne Celowanie,Mira Automática,,Autoțintire,Автоприцеливание,Аутоматско циљање -Always Run,PLYRMNU_ALWAYSRUN,,,,Vždy běžet,Immer Rennen,,Ĉiam Kuri,Siempre correr,,Jatkuva juoksu,Toujours courir,Mindig fusson,Corri sempre,常に駆け足,달리기 토글,Altijd lopen,Zawsze Biegaj,Sempre Correr,Correr Sempre,Fugă în permanență,Постоянный бег,Увек трчи -Run Mode,PLRMNU_RUNMODE,,,,,Rennmodus,,,,,Juoksutila,,,,,,,,,,Mod fugă,, -Allow Toggle,PLRMNU_TOGGLE,,,,,Umschalten erlauben,,,,,Salli vaihtokytkeminen,,,,,,,,,,Permite comutare,, -Override Toggle,PLRMNU_OVERRIDE,,,,,Umschalten blockieren,,,,,Kumoa vaihtokytkeminen,,,,,,,,,,Suprascriere comutare,, -If New,PLRMNU_IFNEW,,,,,Wenn neu,,,,,Jos uusi,,,,,,,,,,Dacă e nouă,, -Equip Weapon Pickups,PLRMNU_EQUIP,,,,,Waffen sofort aktivieren,,,,,Vaihda poimittuun aseeseen,,,,,,,,,,Echipează armele ridicate,, -Parental Lock,PLRMNU_PLOCK,,,,,Kindersicherung,,,,,Lapsilukko,,,,,,,,,,Control Parental,, -Only preferred,PLRMNU_PREFERRED,,,,,Nur bevorzugte,,,,,Vain parempaan,,,,,,,,,,Doar preferate,, -,Display/HUD,,,,,,,,,,,,,,,,,,,,,, -Display Options,DSPLYMNU_TITLE,,,,Nastavení grafiky,Anzeigeoptionen,,Ekranagordoj,Opciones de visualización,,Näyttöasetukset,Options Affichage,Megjelenítés beállítások,Opzioni display,ディスプレイ オプション,디스플레이 설정,Weergaveopties,Opcje Wyświetlania,Opções de Vídeo,,Setări afișare,Настройки экрана,Подешавања приказа -Screen size,DSPLYMNU_SCREENSIZE,,,,Velikost obrazovky,Bildschirmgröße,,Ekrano-grandeco,Tamaño de pantalla,,Näytön koko,Taille de l'écran,Képernyő mérete,Dimensione della schermata,画面サイズ,화면 크기,Schermgrootte,Rozmiar Ekranu,Tamanho de tela,Tamanho do ecrã,Mărime ecran,Размер экрана,Величина екрана -Vertical Sync,DSPLYMNU_VSYNC,,,,Vertikální synchronizace,Vertikale Synchronisation,,Vertikala-sinkronigo,Sincr. vertical,,Pystytahdistys,Synchronisation Verticale,Függőleges szinkronizálás,Sync verticale,垂直同期,수직 동기화,Verticale Sync,Synchronizacja Pionowa,Sincronização Vertical,,Sincronizare Verticală,Вертикальная синхронизация,Вертикална синхорнизација -Models,DSPLYMNU_MODELS,,,,Modely,Modelle,,Modeloj,Modelos,,Mallit,Modèles,3D modellek,Modelli,モデル,모델,Modellen,Modele,Modelos,,Modele,Модели,Модели -Voxels,DSPLYMNU_VOXELS,,,,,Voxel,,,,,Vokselit,,,,,,,,,,Voxele,, -Shadows,DSPLYMNU_SHADOWS,,,,,Schatten,,,,,Varjot,,,,,,,,,,Umbre,, -Slope Tilting,DSPLYMNU_SLOPETILT,,,,,Steigungsneigung,,,,,Viettokallistus,,,,,,,,,,Înclinare pe pante,, -View Bobbing,DSPLYMNU_VIEWBOB,,,,,,,,,,Katseen heilunta,,,,,,,,,,Mișcare vedere sus-jos,, -View Sway,DSPLYMNU_VIEWSWAY,,,,,,,,,,Katseen huojunta,,,,,,,,,,Mișcare ritmică vedere,, -Scale crosshair,DSPLYMNU_CROSSHAIRSCALE,,,,Velikost zaměřovače,Fadenkreuz skalieren,,Skali translinion,Escalar retícula,,Skaalaa tähtäintä,Mise à l'échelle du viseur,,Scala del mirino,照準サイズ,조준점 크기,Dradenkruis schalen,Skala celownika,Escala da mira,,Scară țintă,Масштабирование прицела,Размера нишана -Brightness,DSPLYMNU_BRIGHTNESS,,,,Jas,Helligkeit,,Brileco,Brillo,,Kirkkaus,Luminosité,Fényerő,Luminosità,明るさ,밝기,Helderheid,Jasność,Brilho,,Luminozitate,Яркость,Осветљење -Gamma correction,DSPLYMNU_GAMMA,,,,Korekce gama,Gammakorrektur,,Gamaa korektado,Corrección gamma,,Gammakorjaus,Correction Gamma,,Correzione gamma,ガンマ値,감마 조정,Gamma correctie,Korekta gammy,Correção gama,,Gamma,Гамма-коррекция,Корекција светлости -Contrast,DSPLYMNU_CONTRAST,,,,Kontrast,Kontrast,,Kontrasto,Contraste,,Sävykkyys,Contraste,,Contrasto,コントラスト,대비,,Kontrast,Contraste,,,Контраст,Контраст -Saturation,DSPLYMNU_SATURATION,,,,Sytost,Sättigung,,Satureco,Saturación,,Värikylläisyys,,,Saturazione,サチュレーション,채도,Verzadiging,Nasycenie,Saturação,,Saturație,Насыщенность,Сатурација -Status Bar Scale,DSPLYMNU_SBSCALE,,,,,Statusleistengröße,,,,,Tilapalkin skaalaus,,,,,,,,,,Scară bară de stare,, -Show clip amount in fullscreen HUD,DSPLYMNU_CLIPAMT,,,,,Zeige Magazin im Vollbild-HUD,,,,,Näytä lipasmäärä täyden ruudun tilanäytössä,,,,,,,,,,Afișare muniție cartuș,, -Level Statistics,DSPLYMNU_LEVELSTATS,,,,,Levelstatistik,,,Mostrar estadísticas de nivel,,Tason tilastot,Aff. stats niveau,,Mostra statistiche livello,レベルステータスを表示する,,,,Mostrar estatísticas da fase,,Statistici Nivel,Показать характеристики уровня, -Level Statistics Scale,DSPLYMNU_STATSCALE,,,,,Textgröße für Levelstatistik,,,,,Tason tilastojen skaalaus,,,,,,,,,,Scară Statistici Nivel,, -Text Scale,DSPLYMNU_TEXTSCALE,,,,,Textgröße,,,,,Tekstin skaalaus,,,,,,,,,,Scară Text,, -Messages,DSPLYMNU_MESSAGES,,,,Zprávy,Nachrichten,,Mesaĝoj,Mensajes,,Viestit,Messages,,Messaggi,メッセージ類,메시지,Berichten,Wiadomości,Mensagens,,Mesaje,Сообщения,Поруке -Generic,DSPLYMNU_GENERIC,,,,,Generisch,,,,,Yleinen,,,,,,,,,,,, -Show Map Name,DSPLYMNU_SHOWMAPNAME,,,,,"Levelnamen anzeigen -",,,,,Näytä tason nimi,,,,,,,,,,Afișare nume hartă,, -FOV,DSPLYMNU_FOV,,,,,Gesichtsfeld,,,,,Näkökenttä,,,,,,,,,,Câmp vizual,, -Crosshair,DSPLYMNU_CROSSHAIR,,,,Křížek,Fadenkreuz,,Reteto,Retícula,,Tähtäin,Viseur,,Mirino,クロスヘア,조준점,Draadkruis,Celownik,Mira,,Țintă,Прицел,Нишан -Default Crosshair,HUDMNU_CROSSHAIR,,,,Výchozí zaměřovač,Standard-Fadenkreuz,,Defaŭlta Translinio,Retícula por defecto,,Oletustähtäin,Viseur par défaut,Alapcélkereszt,Mirino di default,デフォルトの照準,기본 조준점,Standaard dradenkruis,Domyślny celownik,Mira padrão,,Țintă implicită,Тип прицела,Уобичајени нишан -Crosshair color,HUDMNU_CROSSHAIRCOLOR,,,Crosshair colour,Barva zaměřovače,Fadenkreuzfarbe,,Translinikoloro,Color de la retícula,,Tähtäimen väri,Couleur Viseur,Célkereszt színe,Colore mirino,照準色,조준점 색깔,Dradenkruis kleur,Kolor celownika,Cor da mira,,Culoare țintă,Цвет прицела,Боја нишана -Crosshair shows health,HUDMNU_CROSSHAIRHEALTH,,,,Zaměřovač zobrazuje zdraví,Fadenkreuz zeigt Gesundheit,,Translinio montri sanon,Mostrar salud en retícula,,Tähtäin näyttää terveyden,Couleur Viseur selon santé,Életerő jelzése a célkereszten,Il mirino mostra la salute,照準のヘルス表示,조준점과 체력 연동,Draadenkruis toont gezondheid,Celownik pokazuje zdrowie,Mostrar saúde na mira,Mostra vida na mira,Ținta afișează starea sănătății,Цвет прицела по состоянию здоровья,Нишан приказује здравље -Standard,OPTVAL_YES_STANDARD,copied from elsewhere,,,Standardní,,Πρότυπο,Norma,Estándar,,Normaali,,,,標準,기본,Standaard,Standard,Padrão,,,Стандартный,Стандардни -Enhanced,OPTVAL_YES_ENHANCED,,,,Vylepšené,Verbessert,Ενισχυομένο,Bonigita,Mejorado,,Paranneltu,Amélioré,,Migliorata,強調,고급,Verbeterd,Ulepszone,Melhorado,,Îmbunătățit,Улучшенный,Побољшани -HUD Options,OPTMNU_HUD,,,,Nastavení HUD,HUD Einstellungen,,Agordoj de HUD,Opciones del HUD,,Tilanäytön asetukset,Options de l'ATH,HUD beállítások,Opzioni HUD,HUD オプション,HUD 설정,HUD opties,Opcje Paska HUD,Opções de HUD,,Setări HUD,HUD,HUD -Polymost Options,OPTMNU_POLYMOST,,,,,Polymost Einstellungen,,,,,Polymost-asetukset,,,,,,,,,,Setări Polymost,, -Texture Filter mode,GLTEXMNU_TEXFILTER,,,,Režim filtrování textur,Texturfiltermodus,,Reĝimo por Teksturfiltrado,Modo de filtro de texturas,,Pintakuviointien suodatustapa,Mode de Filtrage Texture,,Modalità filtro texture,テクスチャーフィルター モード,텍스쳐 필터 모드,Textuur Filter mode,Tryb Filtrowania Tekstur,Modo de filtragem de textura,,Mod Filtrare Texturi,Фильтрация текстур,Текстурни филтер мод -Anisotropic filter,GLTEXMNU_ANISOTROPIC,,,,Anisotropické filtrování,Anisotropische Filterung,,Anizotropa Filtro,Filtro anisotrópico,,Anisotrooppinen suodatus,Filtre Anisotropique,,Filtro anisotropico,異方性フィルター,이방성 필터,Anisotroop filter,Filtr anizotropowy,Filtragem anisotrópica,,Filtrare Anizotropică,Анизотропная фильтрация,Анизотропни фолтер -None (nearest mipmap),OPTVAL_NONENEARESTMIPMAP,,,,Žádné (nejbližší mipmapa),Aus (nächste Mipmap),,Nenio (plej proksima mipmapo),Ninguno (mipmap cercano),,Ei mitään (lähin mipkartta),Aucun (mipmap proche voisin),,Nessuno (mipmap più vicina),なし(最寄りミップマップ),없음 (밉멥에 가까움),Geen (dichtstbijzijnde mipmap),Brak (najbliższa mipmapa),Nenhum (mipmap vizinho mais próximo),,Niciuna (mipmap de apropriere),Нет (ближайший мипмап),Ништа (најближи мипмап) -None (linear mipmap),OPTVAL_NONELINEARMIPMAP,,,,Žádné (lineární mipmapa),Aus (lineare Mipmap),,Nenio (linia mipmapo),Ninguno (mipmap lineal),,Ei mitään (lin. mipkartta),Aucun (mipmap linéaire),,Nessuno (mipmap lineare),なし(リニアミップマップ),없음 (선형 밉맵),Geen (lineaire mipmap),Brak (liniowa mipmapa),Nenhum (mipmap linear),,Niciuna (mipmap liniar),Нет (линейный мипмап),Ништа (линеаран мипмап) -None (trilinear),OPTVAL_NONETRILINEAR,,,,Žádné (trilineární),Aus (trilinear),,Nenio (trilinia),Ninguno (trilineal),,Ei mitään (trilineaarinen),Aucun (mipmap trilinéaire),,Nessuno (mipmap trilineare),なし(トライリニア),없음 (삼선형),Geen (trilineair),Brak (trzyliniowe),Nenhum (trilinear),,Niciuna (trilinar),Нет (трилинейная),Ништа (трилинеарно) -Bilinear,OPTVAL_BILINEAR,,,,Bilineární,,,Dulinia,Bilineal,,Bilineaarinen,Bilinéaire,,Bilineare,バイリニア,쌍선형,Bilineair,Dwuliniowe,,,Biliniar,Билинейная,Билинеарно -Trilinear,OPTVAL_TRILINEAR,,,,Trilineární,,,Trilinia,Trilineal,,Trilineaarinen,Trilinéaire,,Trilineare,トライリニア,삼선형,Trilineair,Trzyliniowe,,,Triliniar,Трилинейная,Трилинеарно -Message Display Style,DSPLYMNU_MESSAGEDISP,,,,,Nachrichtenstil,,,,,,,,,,,,,,,Mod Afișare Mesaje,, -Classic,OPTVAL_CLASSIC,,,,,Klassisch,,,,,,,,,,,,,,,Clasic,, -Advanced,OPTVAL_ADVANCED,,,,,Erweitert,,,,,,,,,,,,,,,Avansat,, -Center messages,MSGMNU_CENTERMESSAGES,,,Centre messages,Vycentrovat zprávy,Nachrichten zentrieren,,Centrigi mesaĝoj,Centrar mensajes,,Keskitä viestit,Messages centrés,,Messaggi centrati,メッセージを中央に,메시지 중간에 위치,Berichten centreren,Wyśrodkuj wiadomości,Centralizar mensagens,Centrar mensagens,Mesaje centrate,Центрирование сообщений,Централне поруке -Pulsating message Display,MSGMNU_PULSEMESSAGES,,,,,Pulsierende Nachrichtenanzeige,,,,,Sykkivät viestit,,,,,,,,,,Afișare Mesaje Pulsante,, -Message Scale,MSGMNU_MESSAGESCALE,,,,,Nachrichtengröße,,,,,Viestien skaalaus,,,,,,,,,,Scară Mesaje,, -Automap Options,AUTOMAPMNU_TITLE,,,,Nastavení automapy,Automapoptionen,,Aŭtomapagordoj,Opciones del Automapa,,Automaattikartan asetukset,Options Carte,,Opzioni automappa,オートマップ オプション,오토맵 설정,Automap-opties,Opcje Mapy,Opções de Automapa,,Setări Hartă Computerizată,Настройки автокарты,Подешавања аутомапе -Rotate automap,AUTOMAPMNU_ROTATE,,,,Otáčet automapu,Rotiere Automap,,Rotacii aŭtomapon,Rotar automapa,,Kiertyvä automaattikartta,Rotation de la Carte,,Ruota l'automappa,オートマップの回転表示,오토맵 회전,Automatisch roteren,Obracaj mapę,Girar automapa,,Rotire hartă computerizată,Вращающаяся автокарта,Ротирај аутомапу -Follow player,AUTOMAPMNU_FOLLOW,,,,Následovat hráče,Folge dem Spieler,,Sekvi ludanton,Seguir jugador,,Seuraa pelaajaa,Suivre le joueur,,Segui il giocatore,プレイヤー追従,플레이어 추적,Volg de speler,Podążaj za graczem,Seguir jogador,,Urmărire jucător,Привязка к игроку,Прати играча -,,,,,,,,,,,,,,,,,,,,,,, -2x,OPTVAL_2X,,,,,,,2-oble,,,,,,,,,,,,,,, -4x,OPTVAL_4X,,,,,,,4-oble,,,,,,,,,,,,,,, -8x,OPTVAL_8X,,,,,,,8-oble,,,,,,,,,,,,,,, -16x,OPTVAL_16X,,,,,,,16-oble,,,,,,,,,,,,,,, -32x,OPTVAL_32X,,,,,,,32-oble,,,,,,,,,,,,,,, -,Postprocessing,,,,,,,,,,,,,,,,,,,,,, -Uncharted 2,OPTVAL_UNCHARTED2,,,,,,,,,,,,,,,,,,,,,, -Hejl Dawson,OPTVAL_HEJLDAWSON,,,,,,,,,,,,,,,,,,,,,, -Reinhard,OPTVAL_REINHARD,,,,,,,,,,,,,,,,,,,,,, -Palette,OPTVAL_PALETTE,,,,Paleta,,,Paletro,Paleta,,Paletti,,,Palette,パレット,팔레트,Palet,Paleta,Paleta,Palete,Paletă,Палитра игры,Палет -Low,OPTVAL_LOW,,,,Nízká,Niedrig,Χαμηλό,Malalta,Bajo,,Matala,Bas,,Basso,低,낮음,Laag,Niskie,Baixo,,Scăzut,Низкое,Ниско -Medium,OPTVAL_MEDIUM,,,,Střední,Mittel,Μεσαίο,Meza,Medio,,Keskitaso,Moyen,,Medio,中,중간,Middel,Średnie,Médio,,Mediu,Среднее,Средње -High,OPTVAL_HIGH,,,,Vysoká,Hoch,Υψηλό,Alta,Alto,,Korkea,Haut,,Alto,高,높음,Hoog,Wysokie,Alto,,Ridicat,Высокое,Високо -Extreme,OPTVAL_EXTREME,,,,Extrémní,Extrem,Ακράιο,Ekstrema,Extremo,,Äärimmäinen,Extrême,,Estremo,最高,매우 높음,Extreem,Ekstremalne,Extremo,,Extrem,Максимальное,Екстремно -Obverse,OPTVAL_OBVERSEFIRST,,,,Vpřed (obvers),Obvers,Παρατήρησε,Aversa,Anverso,,Etupuoli,,,Dritto,正面,앞면,Gezicht,Awers,Obverso,,Avers,Прямой,Супротно -Reverse,OPTVAL_REVERSEFIRST,,,,Vzad (revers),Revers,Αντίστροφο,Inversa,Inverso,,Käänteinen,Inverse,,Contrario,反転,반전,Omgekeerd,Rewers,Reverso,,Invers,Обратный,Обрнуто -Postprocessing,GLMNU_POSTPROCESS,,,,,,Μετα-επεξεργασία,Postprocezado,Postprocesado,,Jälkikäsittely,,,,ポストプロセッシング,포스트프로세싱 적용,Nabewerking,Przetwarzanie końcowe,Pós processamento,,Postprocesare,Постобработка,Пост обрада -Tonemap Mode,GLPREFMNU_TONEMAP,,,,Režim tónovací mapy,Tonemap Modus,,Reĝimo de tonmapo,Modo de mapa de tonos,,Sävykarttatila,Mode Tonemap,,Modalità Tonemap,トーンマップ モード,톤맵 모드,Tonemap modus,Tryb Mapowania Tonów,Tipo de tonemap,,Mod Tonemap,Режим тоун-мэппинга,Тонирано-мапни мод -Lens distortion effect,GLPREFMNU_LENS,,,,Efekt distorze čočky,Optischer Verzerrungseffekt,,Lensdistorto-efiko,Efecto de distorsión de lente,,Linssinvääristystehoste,Effet distorsion de lentille,,Effetto distorsione della lente,レンズの歪みエフェクト,렌즈 왜곡 효과,Effect van de lensvervorming,Efekt zniekształcenia obiektywu,Efeito de distorção de lente,Efeito de distorção da lente,Efect de distorsionare,Искажение линзы,Дисторзија објектива ефект -FXAA Quality,GLPREFMNU_FXAA,,,,Kvalita FXAA,FXAA Qualität,,Kvaliteco de FXAA,Calidad FXAA,,FXAA-laatu,Qualité FXAA,,Qualità FXAA,FXAA品質,FXAA 품질,FXAA-kwaliteit,Jakość FXAA,Qualidade de FXAA,,Calitate FXAA,Качество FXAA,FXAA квалитет -Dither output,GLPREFMNU_DITHER,,,,Dithering,Dithering,,Diteri eligon,Dither de salida,,Sekoitussävytyksen (dithering) ulostulo,Dithering,,Dithering,ディザー出力,떨림 효과 출력,Dither output,Dygotanie,Dithering,,Putere Dithering,Дизеринг,Учестаност трептања -Tonemap Palette Order,GLPREFMNU_PALTONEMAPORDER,,,,Pořadí palety tónovací mapy,Palettensortierung für Tonemap,,Ordo de kolormapo-paletro,Orden de la paleta en mapa de tonos,,Sävykartan paletin järjestys,Ordre des palettes tonemap,,Ordine della Palette Tonemap,トーンマップパレット順序,톤맵 팔레트 순서,Tonemap Palet Orde van het Tonemap-palet,Kolejność Palet Mapowania Tonów,Ordem da paleta do tonemap,,Ordine paletă Tonemap,Порядок палитры тоун-мэпа,Тонирано-мапни палетни ред -Tonemap Palette Exponent,GLPREFMNU_PALTONEMAPPOWER,,,,Exponent palety tónovací mapy,Palettenexponent für Tonemap,,Exponeto de kolormapo-paletro,Exponente paleta en mapa de tonos,,Sävykartan paletin eksponentti,Exponent des palettes tonemap,,Esponente della Palette Tonemap,トーンマップパレット指数,톤맵 팔레트 지수,Tonemap Palet Exponent,Wykładnik Palet Mapowania Tonów,Expoente da paleta do tonemap,,Exponent paletă Tonemap,Экспонента палитры тоун-мэпа,Тонирано-мапни палетни експонент -Multisample,GLPREFMNU_MULTISAMPLE,,,,Multisampling,Multisampling,,Plurspecimeno,Multisampling,,Moninäytteistys,,,,マルチサンプル,멀티샘플,,Multipróbkowanie,Multiamostragem,,Multisampling,Мультисэмплинг,Мулти-узорак -,Polymost,,,,,,,,,,,,,,,,,,,,,, -True Color Textures,POLYMOST_TC,,,True Colour Textures,,True Color Texturen,,,,,True Color -asetukset,,,,,,,,,,Texturi Naturale,, -Pre-load map textures,POLYMOST_CACHE,,,,,Texturen cachen,,,,,Esilataa tason pintakuvioinnit,,,,,,,,,,Preîncărcare Texturi Hartă,, -Detail Textures,POLYMOST_DETAIL,,,,,Detailtexturen,,,,,Yksityiskohtaiset pintakuvioinnit,,,,,,,,,,Detaliu Texturi,, -Glow Textures,POLYMOST_GLOW,,,,,Leucht-Texturen,,,,,Hehkuvat pintakuvioinnit,,,,,,,,,,Strălucire Texturi,, -3D-Models,POLYMOST_MODELS,,,,,3D Modelle,,,,,3D-mallit,,,,,,,,,,Modele 3D,, -"Polymost Options -",POLYMOST_OPTIONS,,,,,Polymost-Optionen,,,,,Polymost-asetukset,,,,,,,,,,Setări Polymost,, -Palette Emulation,POLYMOST_PALETTEEMU,,,,,Palettenemulation,,,,,Paletin emulaatio,,,,,,,,,,Emulare Paletă,, -Palette Interpolation,POLYMOST_PALINTER,,,,,Paletteninterpolation,,,,,Paletin interpolaatio,,,,,,,,,,Interpolare Paletă,, -,Sound,,,,,,,,,,,,,,,,,,,,,, -4000 Hz,OPTVAL_4000HZ,,,,,,,,,,,,,,,,,,,,,4000 Гц, -8000 Hz,OPTVAL_8000HZ,,,,,,,,,,,,,,,,,,,,,8000 Гц, -11025 Hz,OPTVAL_11025HZ,,,,,,,,,,,,,,,,,,,,,11025 Гц, -22050 Hz,OPTVAL_22050HZ,,,,,,,,,,,,,,,,,,,,,22050 Гц, -32000 Hz,OPTVAL_32000HZ,,,,,,,,,,,,,,,,,,,,,32000 Гц, -44100 Hz,OPTVAL_44100HZ,,,,,,,,,,,,,,,,,,,,,44100 Гц, -48000 Hz,OPTVAL_48000HZ,,,,,,,,,,,,,,,,,,,,,48000 Гц, -64 samples,OPTVAL_64SAMPLES,,,,64 vzorků,64 Samples,,64 specimenoj,64 Muestras,,64 näytettä,,,,,64 샘플,,64 sample,64 amostras,,,64 семпла,64 узорка -128 samples,OPTVAL_128SAMPLES,,,,128 vzorků,128 Samples,,128 specimenoj,128 Muestras,,128 näytettä,,,,,128 샘플,,128 sampli,128 amostras,,,128 семплов,128 узорка -256 samples,OPTVAL_256SAMPLES,,,,256 vzorků,256 Samples,,256 specimenoj,256 Muestras,,256 näytettä,,,,,256 샘플,,256 sampli,256 amostras,,,256 семплов,256 узорка -512 samples,OPTVAL_512SAMPLES,,,,512 vzorků,512 Samples,,512 specimenoj,512 Muestras,,512 näytettä,,,,,512 샘플,,512 sampli,512 amostras,,,512 семплов,512 узорка -1024 samples,OPTVAL_1024SAMPLES,,,,1024 vzorků,1024 Samples,,1024 specimenoj,1024 Muestras,,1024 näytettä,,,,,1024 샘플,,1024 sampli,1024 amostras,,,1024 семпла,1024 узорка -2048 samples,OPTVAL_2048SAMPLES,,,,2048 vzorků,2048 Samples,,2048 specimenoj,2048 Muestras,,2048 näytettä,,,,,2048 샘플,,2048 sampli,2048 amostras,,,2048 семплов,2048 узорка -4096 samples,OPTVAL_4096SAMPLES,,,,4096 vzorků,4096 Samples,,4096 specimenoj,4096 Muestras,,4096 näytettä,,,,,4096 샘플,,4096 sampli,4096 amostras,,,4096 семплов,4096 узорка -Auto,OPTSTR_AUTO,,,,,,,Aŭtomata,Automático,,Automaattinen,,,Automatico,自動,오토,,Automatycznie,Automático,,,Авто,Аутоматски -Mono,OPTSTR_MONO,,,,,,,1 Laŭtparolilo,,,,,,,モノラル,모노,,,,,,Моно,Монотоно -Stereo,OPTSTR_STEREO,,,,,,,2 Laŭtparoliloj,Estereo,,,Stéréo,,,ステレオ,스테레오,,,Estéreo,,,Стерео,Стереотоно -Dolby Pro Logic Decoder,OPTSTR_PROLOGIC,,,,,,,Malkodilo de Dolby Pro Logic ,,,,,,,ドルビー プロロジック デコーダー,돌비 프로 로직 디코더,,,,,,Декодер Dolby Pro Logic, -Quad,OPTSTR_QUAD,,,,,,,4 Laŭtparolilol,Cuádruple,,Dolby Pro Logic -dekooderi,,,,クァッド,쿼드,,Cztery kanały,,,,Четырёхканальный,Четвородупло -5 speakers,OPTSTR_SURROUND,,,,5 reproduktorů,5 Lautsprecher,,5 Laŭtparoliloj,5 altavoces,5 Bocinas,5 kaiutinta,5 enceintes,,,5 スピーカー,5 스피커,5 luidsprekers,Głośniki 5,5 alto falantes,,,5 динамиков,5 спикер -5.1 speakers,OPTSTR_5POINT1,,,,Reproduktory 5.1,5.1 Lautsprecher,,5.1 Laŭtparoliloj,Altavoces 5.1,Bocinas 5.1,5.1 kaiutinta,Enceintes 5.1,,,5.1 スピーカー,5.1 스피커,5.1 luidsprekers,Głośniki 5.1,Auto falantes 5.1,,,Динамики 5.1,5.1 спикер -7.1 speakers,OPTSTR_7POINT1,,,,Reproduktory 7.1,7.1 Lautsprecher,,7.1 Laůtparoliloj,Altavoces 7.1,Bocinas 7.1,7.1 kaiutinta,Enceintes 7.1,,,7.1 スピーカー,7.1스피커,7.1 luidsprekers,Głośniki 7.1,Auto falantes 7.1,,,Динамики 7.1,7.1 спикер -OpenAL Options,OPENALMNU_TITLE,,,,Nastavení OpenAL,OpenAL Optionen,,OpenAL-agordoj,Opciones de OpenAL,,OpenAL-asetukset,Options OpenAL,,Opzioni OpenAL,OpenAL オプション,오픈에이엘 설정,OpenAL opties,Opcje OpenAL,Opções de OpenAL,,,Настройки OpenAL,OpenAL подешавања -Playback device,OPENALMNU_PLAYBACKDEVICE,,,,Přehravací zařízení,Wiedergabegerät,,Ludado-aparato,Dispositivo de reproducción,,Äänitoistolaite,Sortie sonore,,Dispositivo di playback,プレイバック デバイス,재생 장치,Afspeelapparaat,Urządzenie odtwarzania,Dispositivo de reprodução,,,Устройство воспроизведения,Аудио уређај -Enable EFX,OPENALMNU_ENABLEEFX,,,,Povolit EFX,EFX aktiv,,Aktivigi EFX,Permitir EFX,,Ota käyttöön EFX,Activer EFX,,Abilita EFX,EFXを有効化,EFX 켬,EFX inschakelen,Pozwól na EFX,Habilitar EFX,,,Включить EFX,Укључи EFX -Resampler,OPENALMNU_RESAMPLER,,,,,,,Respecimenilo,,,Näytteenottotaajuusmuunnin,,,,リサンプラー,재배열 기기,,Resampler,,,,Ресэмплер,Ресемплер -Sound Options,SNDMNU_TITLE,,,,Nastavení zvuku,Soundeinstellungen,,Son-agordoj,Opciones de sonido,,Ääniasetukset,Options Sonores,Hangbeállítások,Opzioni del suono,サウンド オプション,음향 설정,Geluidsopties,Opcje Dźwięku,Opções de Áudio,,,Настройки звука,Звучна подешавања -Sounds volume,SNDMNU_SFXVOLUME,,,,Hlasitost zvuků,Effektlautstärke,,Son-laŭtec-menuo,Volumen de sonido,,Äänitehosteiden voimakkuus,Volume des Sons,Effektek hangereje,Volume suoni,効果音音量,효과음 음량,Geluidsvolume,Głośność Dźwięku,Volume de sons,,,Громкость звука,Јачина звука -Menu volume,SNDMNU_MENUVOLUME,,,,Hlasitost nabídek,Menülautstärke,,Menu-laŭteco,Volumen del menú,,Valikon äänenvoimakkuus,Volume du Menu,Menü hangereje,Volume menu,メニュー音量,메뉴 음량,Menu volume,Głośność Menu,Volume do menu,,,Громкость меню,Јачина менија -Music volume,SNDMNU_MUSICVOLUME,,,,Hlasitost hudby,Musiklautstärke,,Muzik-laŭteco,Volumen de la Música,,Musiikin äänenvoimakkuus,Volume Musique,Zene hangereje,Volume musica,音楽音量,배경음 음량,Muziekvolume,Głośność Muzyki,Volume da música,,,Громкость музыки,Јачина музике -MIDI device,SNDMNU_MIDIDEVICE,,,,MIDI zařízení,MIDI-Gerät,,MIDI-aparato,Dispositivo MIDI,,MIDI-laite,Sortie MIDI,MIDI eszköz,Dispositivo MIDI,MIDIデバイス,MIDI 장치,MIDI-apparaat,Urządzenie MIDI,Dispositivo MIDI,,,MIDI проигрыватель,MIDI уређај -Sound in Background,SNDMNU_BACKGROUND,,,,Zvuk na pozadí,Sound im Hintergrund,,Sono en Fono,Sonido en segundo plano,,Ääni taustalla,Son activé en arrière plan,Háttérhangok,Suono di sottofondo,バックグラウンドでのサウンド,배경화면에서도 소리 재생,Geluid in de achtergrond,Dźwięk w Tle,Som de Fundo,,,Звуки в фоне,Звуци у позадини -Underwater reverb,SNDMNU_UNDERWATERREVERB,,,,Ozvěna pod vodou,Unterwasserhall,,Subakva resono,Reverb. bajo el agua,,Vedenalaiskaiku,Reverbération sous l'eau,Vízalatti viszhang,Reverb sott'acqua,水中反響音,수중 울림효과,Onderwater nagalm,Pogłos pod wodą,Reverberação debaixo d'água,Reverberação debaixo de água,,Эффект под водой,Подводни одјек -Randomize pitches,SNDMNU_RANDOMIZEPITCHES,,,,Náhodné výšky tónu,Zufällige Tonhöhe,,Malcertigi son-peĉojn,Tonos aleatorios,,Satunnaista äänenkorkeuksia,Tons sonores aléatoires,Hangmagasság véletlenszerű,Rendi casuale il tono,ランダマイズ ピッチ,음높이 무작위화,Willekeurige plaatsen,Losuj tonacje,Aleatorizar tons,Tons aleatórios,,Изменять высоту,Рандомизација тонова -Sound channels,SNDMNU_CHANNELS,,,,Počet zvukových kanálů,Soundkanäle,,Son-kanaloj,Canales de sonido,,Äänikanavat,Canaux sonores,Hangcsatorna,Numero canali del suono,サウンド チャンネル,음향 채널,Geluidskanalen,Kanały dźwiękowe,Canais de som,,,Количество каналов,Звучни канали -Sound backend,SNDMNU_BACKEND,,,,Zvukový systém,Soundsystem,,Son-servilo,Sistema de sonido,,Äänijärjestelmä,Traitement Son,,Backend suono,サウンド バックエンド,음향 말미,Geluidsarme achterkant,System dźwiękowy,Sistema de som,,,Звуковая система,Звучни бекенд -OpenAL options,SNDMNU_OPENAL,,,,Nastavení OpenAL,OpenAL Optionen,,OpenAL-agordoj,Opciones de OpenAL,,OpenAL-asetukset,Options OpenAL,OpenAL beállításai,Opzioni OpenAL,OpenAL オプション,오픈에이엘 설정,OpenAL opties,Opcje OpenAL,Opções de OpenAL,,,Настройки OpenAL,OpenAL подешавања -Restart sound,SNDMNU_RESTART,,,,Restartovat zvuk,Sound neu starten,,Rekomenci sonon,Reiniciar sonido,,Käynnistä ääni uudelleen,Redémarrer moteur sonore,Hang újraindítása,Resetta il suono,サウンド再起動,음향 재시작,Herstart geluid,Zresetuj dźwięk,Reiniciar som,,,Перезапустить звук,Поново покрени звук -Advanced options,SNDMNU_ADVANCED,,,,Pokročilá nastavení,Erweiterte Optionen,,Altnivelaj agordoj,Opciones avanzadas,,Edistyneet asetukset,Options avancées,Haladó beállítások,Opzioni avanzate,高度なオプション,고급 설정,Geavanceerde opties,Zaawansowane Opcje,Opções avançadas,,,Расширенные настройки,Напредна подешавања -Module replayer options,SNDMNU_MODREPLAYER,,,,Nastavení přehrávače modulů,Modul-Spieler-Optionen,,Agordoj por modulreludilo,Opciones reproductor de módulos,,Moduulisoitinasetukset,Options lecteur de module,,Opzioni Module replayer,モジュールリプレイヤー オプション,모듈 재생 설정,Module replayer opties,Opcje Modułu Odtwarzacza,Opções de reprodutor de módulos,,,Параметры воспроизведения модулей,Подешавања модулног риплејера -Midi player options,SNDMNU_MIDIPLAYER,,,,Nastavení MIDI přehrávače,MIDI-Spieler-Optionen,,Agordoj por MIDI-ludilo,Opciones de reproductor MIDI,,MIDI-soitinasetukset,Option lecteur MIDI,,Opzioni Midi player,Midi再生のオプション,MIDI 플레이어 설정,Midi speler opties,Opcje Odtwarzacza Midi,Opções de reprodutor MIDI,,,Настройки MIDI-проигрывателя,MIDI плејер подешавања -Sound in Menus,SNDMNU_MENUSOUND,,,,,Sound in Menüs,,,,,Ääni valikoissa,,,,,,,,,,,, -Advanced Sound Options,ADVSNDMNU_TITLE,,,,Pokročilá nastavení zvuku,Erweiterte Soundoptionen,,Altnivelaj Son-agordoj,Opciones avanzadas de sonido,,Edistyneet ääniasetukset,Options Sonores Avancées,,Opzioni avanzate dei suoni,高度なサウンドオプション,고급 음향 설정,Geavanceerde geluidsopties,Zaawansowane Opcje Dźwięku,Opções de Áudio Avançadas,,,Расширенные настройки,Напредна подешавања звука -"Ignore file type for music lookup -",ADVSNDMNU_LOOKUPMUS,,,,,Dateityp bei Musicsuche ignorieren,,,,,Jätä tiedostotyyppi huomioimatta musiikkihaussa,,,,,,,,,,,, -Ignore file type for sound lookup,ADVSNDMNU_LOOKUPSND,,,,,Dateityp bei Soundsuche ignorieren,,,,,Jätä tiedostotyyppi huomioimatta äänihaussa,,,,,,,,,,,, -Sample rate,ADVSNDMNU_SAMPLERATE,,,,Vzorkovací frekvence,Samplerate,,Specimenrapideco,Frecuencia de muestreo,,Näytteenottotaajuus,Cadence de Sampling,,,サンプルレート,샘플링레이트,Steekproeftarief,Częstotliwość próbkowania,Taxa de amostragem,,,Частота дискретизации,Фреквенција узорковања -HRTF,ADVSNDMNU_HRTF,,,,,,,,,,,,,,,머리전달함수,,HRTF,,,,, -OPL Synthesis,ADVSNDMNU_OPLSYNTHESIS,,,,Emulace OPL,OPL Synthese,,OPL-Sintezo,Síntesis OPL,,OPL-synteesi,Synthèse OPL,,,OPLシンセサイズ,OPL 합성,OPL synthese,Synteza OPL,Síntese OPL,,,Синтез OPL,OPL синтеза -Number of emulated OPL chips,ADVSNDMNU_OPLNUMCHIPS,,,,Počet emulovaných OPL čipů,Anzahl OPL Chips,,Nombro da imititaj OPL-blatoj,Número de chips OPL emulados,,Emuloitavien OPL-piirien lukumäärä,Puces OPL émulées,,Numero di chip OPL emulati,OPLチップエミュレートの番号,에뮬레이트된 OPL 칩 수,Aantal geëmuleerde OPL chips,Liczba emulowanych czipów OPL,Número de chips OPL emulados,,,Количество эмулируемых OPL чипов,Број емулираних OPL чипа -Full MIDI stereo panning,ADVSNDMNU_OPLFULLPAN,,,,Plné MIDI stereo,Echte MIDI-Stereoeffekte,,Tuta MIDI-sterepanoramado,Balance estéreo MIDI completo,,Täysi MIDI-stereopanorointi,Latéralisation complète MIDI,,,Full MIDIステレオパンニング,완전한 MIDI 스테레오 패닝,Volledige MIDI stereo panning,Pełne efekty stereo dla MIDI,Lateralidade estéreo completa para MIDI,,,Полная стереопанорама для MIDI,Пуно MIDI стерео каналисање -OPL Emulator Core,ADVSNDMNU_OPLCORES,,,,Emulační jádro OPL,OPL Emulatorkern,,OPL Imitilkerno,Núcleo de emulador OPL,,OPL-emulaattoriydin,Cœur émulateur OPL,,,OPL エミュレート コア,OPL 에뮬레이터 코어,OPL Emulator Kern,Rdzeń Emulatora OPL,Núcleo do emulador de OPL,,,Ядро эмуляции OPL,OPL језгро емулације -MIDI voices,ADVSNDMNU_MIDIVOICES,,,,Počet MIDI hlasů,MIDI Stimmen,,MIDI Voĉoj,Voces MIDI,,MIDI-äänet,Voix MIDI,,Voci MIDI,MIDI ボイス,MIDI 최대 음색 양,MIDI-stemmen,Głosy MIDI,Vozes MIDI,,,MIDI-голоса,MIDI гласови -FluidSynth,ADVSNDMNU_FLUIDSYNTH,,,,,,,,,,,,,,,,,,,,,, -Patch set,ADVSNDMNU_FLUIDPATCHSET,,,,Nástrojová sada,Patch-Set,,Flikaro,Set de parche,,Patch-asetus,Banque de Sons,,,パッチ セット,패치 세트,,Zestaw patchów,Banco de sons,,,Патч-набор,Печ сет -Gain,ADVSNDMNU_FLUIDGAIN,,,,Zesílení,Relative Lautstärke,,Akiro,Ganancia,,Vahvistus,,,,ゲイン,쌓기,Relatief volume,Wzmocnienie,Ganho,,,Усиление,Појачање -Reverb,ADVSNDMNU_REVERB,,,,Ozvěna,Hall,,Resono,Reverberación,,Kaiku,Réverbération,,,リバーブ,리버브,Nagalm,Pogłos,Reverberação,,,Реверберация,Одјек -Reverb Level,ADVSNDMNU_REVERB_LEVEL,,,,Intenzita ozvěny,Hallintensität,,Resono-nivelo,Nivel de Reverberación,,Kaiunvoimakkuus,Niveau Réverb.,,,リバーブ量,리버브 강도,Nagalm niveau,Poziom pogłosu,Nível de reverberação,,,Уровень реверберации,Ниво одјека -Chorus,ADVSNDMNU_CHORUS,,,,,,,Koruso,,,,,,,コーラス,코러스,,,,,,Хорус,Корус -Timidity++,ADVSNDMNU_TIMIDITY,,,,,,,,,,,,,,,,,,,,,, -ADLMidi,ADVSNDMNU_ADLMIDI,,,,,,,,,,,,,,,,,,,,,, -OPNMidi,ADVSNDMNU_OPNMIDI,,,,,,,,,,,,,,,,,,,,,, -Timidity config file,ADVSNDMNU_TIMIDITYCONFIG,,,,Konfigurační soubor Timidity,Timidity Konfigurationsdatei,,Agordo-arkivo por Timidity,Ruta al archivo config. Timidity,,Timidity-config-tiedosto,Fichier de config. TiMidity,,File Timidity config,Timidity コンフィグファイル,Timidity 코딩 파일,Timidity++ configuratiebestand,Plik konfiguracyjny Timidity,Arquivo de configuração do Timidity,,,Файл конфигурации Timidity,Timidity конфигурациона датотека -Relative volume,ADVSNDMNU_TIMIDITYVOLUME,,,,Relativní hlasitost,Relative Lautstärke,,Relativa volumeno,Volumen relativo,,Suhteellinen äänenvoimakkuus,Volume Relatif,,Volume relativo,相対音量,비교적인 볼륨,Relatief volume,Względna głośność,Volume relativo,,,Относительная громкость,Релативна јачина -WildMidi,ADVSNDMNU_WILDMIDI,,,,,,,,,,,,,,,,,,,,,, -WildMidi config file,ADVSNDMNU_WILDMIDICONFIG,,,,Konfigurační soubor WildMidi,WilfMidi Konfigurationsdatei,,WildMidi agordarkivo,Archivo de config. WildMidi,,WildMidi-config-tiedosto,Fichier config. WildMidi,,File WildMidi config,WildMidi コンフィグファイル,WildMidi 코딩 파일,WildMidi configuratiebestand,Plik konfiguracyjny WildMidi,Arquivo de configuração do WildMidi,,,Файл конфигурации WildMidi,WildMidi конфигурациона датотека -Select configuration,ADVSNDMNU_SELCONFIG,,,,Vybrat konfiguraci,Konfiguration wählen,,Elekti agordojn,Seleccionar configuración,,Valitse kokoonpano,Sélectionner configuration,,Seleziona la configurazione,構成選択,설정을 고르시오,Selecteer configuratie,Wybierz konfigurację,Selecionar configuração,,,Выбор конфигурации,Изабери конфигурацију -Global,ADVSNDMNU_GLOBAL,,,,Globální,,,Malloka,Global,,Yleinen,,,Globale,グローバル,전반적,Globaal,Globalne,,,,Общие,Глобално -Freeverb,ADVSNDMNU_FREEVERB,,,,,,,,,,,,,,フリーバーブ,프리버브,,,,,,, -Global Freeverb,ADVSNDMNU_GLOBAL_FREEVERB,,,,Globální Freeverb,Globales Freeverb,,Malloka Freeverb,Freeverb Global,,Yleinen Freeverb,Freeverb Global,,Freeverb globale,グローバル フリーバーブ,전반적 프리버브,Globale Freeverb,Globalny Freeverb,Freeverb Global,,,Глобальный Freeverb,Глобални Freeverb -Advanced Resampling,ADVSNDMNU_ADVRESAMPLING,,,,Pokročilé převzorkování,Erweitertes Resampling,,Altnivela respecimenado,Resampleo Avanzado,,Kehittynyt näytteenottotaajuuden muuntaminen,Resampling Avancé,,Resampling avanzato,高度なリサンプリング,향상된 리샘플링,Geavanceerde herbemonstering,Zaawansowane Próbkowanie,Reamostragem Avançada,,,Продвинутый ресэмплинг,Напредно ресампловање -OPL Bank,ADVSNDMNU_OPLBANK,,,,OPL sada,,,Banko por OPL,Banco OPL,,OPL-pankki,Banque OPL,,,,OPL 뱅크,,Bank OPL,Banco OPL,,,Банк OPL,OPL банка -OPL Emulator Core,ADVSNDMNU_ADLOPLCORES,,,,Emulační jádro OPL,OPL Emulatorkern,,Imitilkerno por OPL,Núcleos de Emulador OPL,,OPL-emulaattoriydin,Cœur Emulateur OPL,,,OPL エミュレートコア,OPL 에뮬레이터 코어,OPL Emulator Kern,Rdzeń Emulatora OPL,Núcleo do Emulador de OPL,,,Ядро эмуляции OPL,OPL емулационо језгро -Run emulator at PCM rate,ADVSNDMNU_RUNPCMRATE,,,,Emulátor používá PCM vzorkovací frekvenci,Emulator benutzt PCM Samplerate,,Kurigi imitilon laŭ rapido de PCM,Ejecutar emulador a velocidad PCM,,Aja emulaattoria PCM-taajuudella,Emulateur utilise cadence PCM,,Esegui l'emulatore con rate PCM,PCMレートでエミュレート実行,PCM 속도로 에뮬레이터 실행,Emulator maakt gebruik van PCM Samplerate,Uruchom emulator w częstotliwości PCM,Rodar emulador em taxa PCM,,,Использовать с частотой PCM,Покрени емулацију на PCM стопи -Number of emulated OPL chips,ADVSNDMNU_ADLNUMCHIPS,,,,Počet emulovaných OPL čipů,Anzahl OPL Chips,,Numbro da imitaj OPL-blatoj,Número de chips OPL emulados,,Emuloitavien OPL-piirien lukumäärä,Puces OPL émulées,,Numero di chip OPL emulati,OPLチップエミュレートの番号,에뮬레이트된 OPL 칩 개수,Aantal geëmuleerde OPL chips,Liczba emulowanych czipów OPL,Número de chips OPL emulados,,,Количество эмулируемых чипов OPL,Број емулираних OPL чипова -Volume model,ADVSNDMNU_VLMODEL,,,,Model hlasitosti,Lautstärkemodell,,Volumen-modelo,Modelo de Volumen,,Äänenvoimakkuusmalli,Modèle de Volume,,Modello di volume,音量モデル,모델 볼륨,Volume model,Model głośności,Modelo de volume,,,Модель громкости,Волумски модел -Aliasing,OPTVAL_ALIASING,,,,,,,Kromnomado,,,,,,,エイリアシング,에일리어싱,,,,,,Алиасинг,Преклапање -Linear,OPTVAL_LINEAR_1,This setting is duplicated threefold in order to allow for different grammatical gender endings,,,Lineární,,,Lineara,Lineal,,Lineaarinen,Linéaire,,Lineare,リニア,선형,Lineair,Liniowy,,,,Линейное,Линеаран -Linear,OPTVAL_LINEAR_2,,,,Lineární,,,Lineara,Lineal,,Lineaarinen,Linéaire,,Lineare,リニア,선형,Lineair,Liniowa,,,,Линейная,Линеаран -Linear,OPTVAL_LINEAR_3,,,,Lineární,,,Lineara,Lineal,,Lineaarinen,Linéaire,,Lineare,リニア,선형,Lineair,Liniowe,,,,Линейный,Линеаран -Nearest,OPTVAL_NEAREST,,,,Nejbližší,Nächster Nachbar,,Plej proksima,Cercano,,Lähin,Nearest,,Il più vicino,最寄り,가까이,Naast,Najbiższe,Vizinho mais próximo,,,Ближайший,Најближе -PCF (Low),OPTVAL_PCF_LOW,,,,PCF (nízké),PCF (niedrig),,PCF (Malata),PCF (Bajo),,PCF (matala),PCF (Low),,PCF (basso),PCF (低),PCF (하급),PCF (Laag),PCF (Niski),PCF (Baixo),,,PCF (низкий),PCF (ниско) -PCF (Medium),OPTVAL_PCF_MEDIUM,,,,PCF (střední),PCF (mittel),,PCF (Meza),PCF (Medio),,PCF (keskitaso),PCF (Medium),,PCF (medio),PCF (中),PCF (중급),PCF (Medium),PCF (Średni),PCF (Médio),,,PCF (средний),PCF (средње) -PCF (High),OPTVAL_PCF_HIGH,,,,PCF (vysoké),PCF (hoch),,PCF (Alta),PCF (Alto),,PCF (korkea),PCF (High),,PCF (alto),PCF (高),PCF (상급),PCF (Hoog),PCF (Wysoki),PCF (Alto),,,PCF (высокий),PCF (високо) -Cubic,OPTVAL_CUBIC,,,,Kubická,Kubisch,,Kuba,Cúbico,,Kuutio,Cubique,,Cubico,キュービック,큐빅,Kubieke,Sześcienny,Cúbico,,,Кубическое,Кубан -Band-limited step,OPTVAL_BLEP,,,,Omezené krokování,Bandbegrenzte Schritte,,Bendo-limigita paŝo,Paso limitado por banda,,Kaistarajoitettu askel,Step limité par bande,,Passo limitato dalla banda,帯域制限ステップ,제한된 단계별 밴드,Bandbeperkte stap,Krok ograniczony pasmem,Passo limitado por banda,,,Пошаговое ограничение частоты,Постепено ограничење фреквенције -Linear (Slower),OPTVAL_LINEARSLOW,,,,Lineární (pomalejší),Linear (langsamer),,Lineara (Pli malrapida),Lineal (más lento),,Lineaarinen (hitaampi),Linéaire (Lent),,Lineare (più lento),リニア(遅め),선형 (느리게),Lineair (langzamer),Liniowy (wolniejszy),Linear (Mais lento),,,Линейное (медленнее),Линеаран (спорије) -Band-limited linear,OPTVAL_BLAM,,,,Omezená lineární,Bandbegrenzt linear,,Bendo-limigita lineara,Lineal limitado por banda,,Kaistarajoitettu lineaarinen,Linéaire limité par bande,,Lineare limitato dalla banda,帯域制限リニア,밴드 제한 식 선형,Band-beperkt lineair,Liniowy ograniczony pasmem,Linear limitado por banda,,,Линейное ограничение частоты,Линеарно ограничење фреквенције -Cubic (Slower),OPTVAL_CUBICSLOW,,,,Kubická (pomalejší),Kubisch (langsamer),,Kuba (Pli malrapida),Cúbico (más lento),,Kuutio (hitaampi),Cubique (Lent),,Cubico (più lento),キュービック (遅め),큐빅 (느리게),Kubieke (langzamer),Sześcienny (wolniejszy),Cúbico (Mais lento),,,Кубическое (медленнее),Кубан (спорије) -Sinc,OPTVAL_SINC,,,,,,,,Seno cardinal,,,,,,シンク,싱크,,,,,,Кардинальный синус,Синк -Note on/off only,OPTVAL_NOTEONOFFONLY,,,,Pouze začátek/konec noty,Nur für Note an/aus ,,Nur noton aktivigi/malatkivigi,Sólo notas de Activ./Desact.,,Vain nuotti päällä/pois,Note on/off seulement,,Note solamente ON/OFF,ノート オン/オフ のみ,노트를 끄거나 켰을 때,Alleen toon aan/uit,Tylko dla włączonych/wyłączonych notatek,Somente notas lig./deslig.,,,Только при включении/отключении нот,Само током укључења/искључења ноте -Full ramping,OPTVAL_FULLRAMPING,,,,Plný náběh,,,Plena rampante,Aumento completo,,Täysi kerrytys,Rampe complète,,Ramping completo,フルランピング,최대 램핑,Volledige helling,Pełne zwiększenie,Rampa completa,,,Полное наращивание,Пуно појачање -Module Replayer Options,MODMNU_TITLE,,,,Nastavení přehrávače modulů,Modul-Spieler-Optionen,,Agordoj por Modulo-reludilo,Opciones de reproductor de módulos,,Moduulisoitinasetukset,Options Lecteur de Module,,Opzioni Module replayer,モジュールリプレイヤー オプション,모듈 재생 설정,Module Speler Opties,Opcje Odtwarzacza Modułów,Opções de Reprodutor de Módulos,,,Параметры воспроизведения модулей,Подешавања модуларног реплејера -Master volume,MODMNU_MASTERVOLUME,,,,Celková hlasitost,Grundlautstärke,,Ĉefvolumeno,Volumen maestro,,Yleisäänenvoimakkuus,Volume maître,,Volume master,全体音量,마스터 볼륨,Hoofdvolume,Całkowita głośność,Volume master,,,Общая громкость,Глацни звук -Quality,MODMNU_QUALITY,,,,Kvalita,Qualität,,Kvaliteco,Calidad,,Laatu,Qualité,,Qualità,クオリティ,품질,Kwaliteit,Jakość,Qualidade,,,Качество,Квалитет -Volume ramping,MODMNU_VOLUMERAMPING,,,,Křivka hlasitosti,Lautstärkeverhalten,,Volumeno-pligrandigado,Aumento gradual de Volumen,,Äänenvoimakkuuden kertyminen,Rampe du volume,,Ramping volume,音量ランピング,볼륨 램핑,Volume-aanvulling,Zwiększenie głośności,Rampa de volume,,,Наращивание громкости,Појачавање звука -Chip-o-matic,MODMNU_CHIPOMATIC,,,,,,,,,,,,,,チップ オー マチック,칩-오-매틱,,,,,,, -Global,ADVSNDMNU_GLOBAL,,,,Globální,,,Malloka,Global,,Yleinen,,,Globale,グローバル,전반적,Globaal,Globalne,,,,Общие,Глобално -Freeverb,ADVSNDMNU_FREEVERB,,,,,,,,,,,,,,フリーバーブ,프리버브,,,,,,, -Global Freeverb,ADVSNDMNU_GLOBAL_FREEVERB,,,,Globální Freeverb,Globales Freeverb,,Malloka Freeverb,Freeverb Global,,Yleinen Freeverb,Freeverb Global,,Freeverb globale,グローバル フリーバーブ,전반적 프리버브,Globale Freeverb,Globalny Freeverb,Freeverb Global,,,Глобальный Freeverb,Глобални Freeverb -FluidSynth,ADVSNDMNU_FLUIDSYNTH,,,,,,,,,,,,,,,,,,,,,, -Patch set,ADVSNDMNU_FLUIDPATCHSET,,,,Nástrojová sada,Patch-Set,,Flikaro,Set de parche,,Patch-asetus,Banque de Sons,,,パッチ セット,패치 세트,,Zestaw patchów,Banco de sons,,,Патч-набор,Печ сет -Gain,ADVSNDMNU_FLUIDGAIN,,,,Zesílení,Relative Lautstärke,,Akiro,Ganancia,,Vahvistus,,,,ゲイン,쌓기,Relatief volume,Wzmocnienie,Ganho,,,Усиление,Појачање -Reverb,ADVSNDMNU_REVERB,,,,Ozvěna,Hall,,Resono,Reverberación,,Kaiku,Réverbération,,,リバーブ,리버브,Nagalm,Pogłos,Reverberação,,,Реверберация,Одјек -Reverb Level,ADVSNDMNU_REVERB_LEVEL,,,,Intenzita ozvěny,Hallintensität,,Resono-nivelo,Nivel de Reverberación,,Kaiunvoimakkuus,Niveau Réverb.,,,リバーブ量,리버브 강도,Nagalm niveau,Poziom pogłosu,Nível de reverberação,,,Уровень реверберации,Ниво одјека -Chorus,ADVSNDMNU_CHORUS,,,,,,,Koruso,,,,,,,コーラス,코러스,,,,,,Хорус,Корус -Timidity++,ADVSNDMNU_TIMIDITY,,,,,,,,,,,,,,,,,,,,,, -Sound enabled,SNDMNU_SNDENABLED,,,,,Sound aktiv,,,,,Ääni päällä,,,,,,,,,,Sunet activat,, -Music enabled,SNDMNU_MUSENABLED,,,,,Musik aktiv,,,,,Musiikki päällä,,,,,,,,,,Muzică activată,, -CD Music Emulation,SNDMNU_CDEMU,,,,,CD-Musik-Emulation,,,,,CD-musiikin emulaatio,,,,,,,,,,Emulare CD muzică,, -Play original Sounds,SNDMNU_WTSOUND,,,,,Original-Soundeffekte spielen,,,,,Toista alkuperäiset äänet,,,,,,,,,,Utilizare sunete originale,, -Developer commentary,SNDMNU_WTCOMMENT,,,,,Entwicklerkommentar,,,Comentarios del desarrollador,,,Commentaire développeur,,Commentario sviluppatore,デベロッパーのコメンタリー,,,,Comentário de desenvolvedor,,Comentariu dezvoltatori,Комментарии разработчиков, -Play original MIDI music,SNDMNU_WTMUSIC,,,,,Original-MIDI-Musik spielen,,,,,Toista alkuperäinen MIDI-musiikki,,,,,,,,,,Utilizare muzică MIDI originală,, -Sound Ambience,SNDMNU_AMBIENCE,,,,,Umgebungsgeräusche,,,,,Taustaäänet,,,,,,,,,,Ambianță,, -"Player Speech -",SNDMNU_SPEECH,,,,,Spielerkommentare,,,,,Pelaajan puhe,,,,,,,,,,Vorbire caracter,, -Flip Stereo Channels,ADVSNDMNU_FLIPSTEREO,,,,,Stereo Kanäle vertauschen,,,,,Käännä stereokanavat,,,,,,,,,,Schimbă canalele stereo,, -MAME OPL2,OPTVAL_MAMEOPL2,,,,,,,,,,,,,,,마메 OPL2,,,,,,, -DOSBox OPL3,OPTVAL_DOSBOXOPL3,,,,,,,,,,,,,,,도스박스 OPL3,,,,,,, -Java OPL3,OPTVAL_JAVAOPL3,,,,,,,,,,,,,,,자바 OPL3,,,,,,, -Nuked OPL3,OPTVAL_NUKEDOPL3,,,,,,,,,,,,,,,,,,,,,, -,Video Mode,,,,,,,,,,,,,,,,,,,,,, -Video Mode,VIDMNU_TITLE,,,,Režim displeje,Videomodus,,Video-reĝimo,Modos de video,,Videotila,Mode Vidéo,,Modalità video,ビデオ 調整,화면 설정,Videomodus,Tryb Wideo,Modo de Vídeo,,,Настройки видеорежима,Видео мод -Notebook Switchable GPU,DSPLYMNU_GPUSWITCH,,,,Přepínatelné GPU pro notebooky,GPU Umschaltung für Notebooks,,Kajero Ŝanĝa GPU,GPU Altern. de Portátil,,Kannettavan kytkettävä grafiikkapiiri,GPU alternatif sur PC Portable,Váltható GPU laptopon,Scheda GPU Switchable per notebook,ノートブックGPU切替,노트북 성능 조정,Notitieboekje schakelbare GPU,Zmiana GPU Notebooka,Placa de vídeo alternativa de notebook,,,Использование GPU ноутбука,Користи GPU ноутбук -Scaled (Nearest),OPTVAL_SCALENEAREST,,,,Škálován (nejbližší),Skaliert (nächster Nachbar),,Skalita (Plej proksime),Escalado (Cercano),,Skaalattu (läheisin),Mis à l'échelle (Proche Voisin),,Scalato (più vicino),スケーリング (最寄り),확대 (가깝게),Geschaald (Dichtstbijzijnde),Przeskalowany (Najbliższy),Redimensionado (Vizinho mais próximo),Redimensionado (Apróximado),,Масштабировать (ближайшее),Скалиран (најближи) -Scaled (Linear),OPTVAL_SCALELINEAR,,,,Škálován (lineární),Skaliert(linear),,Skalita (Linia),Escalado (Lineal),,Skaalattu (lineaarinen),Mis à l'échelle (Linéaire),,Scalato (lineare),スケーリング (リニア),확대 (선형 식),Geschaald (Lineair),Przeskalowany (Liniowy),Redimensionado (Linear),,,Масштабировать (линейное),Скалиран (линеарно) -Letterbox,OPTVAL_LETTERBOX,,,,,,,Leterkesto,,,,,,Bande nere,レターボックス,레터박스,Brievenbus,,,,,Экранное каше,Поштанско сандуче -Stretch,OPTVAL_STRETCH,,,,Roztažený,Strecken,,Streĉi,Estrechado,Estrecho,Venytetty,Etirer,,Disteso,伸縮,늘림,Rek,Rozciągnięty,Esticado,,,Растянутый,Растегнуто -Render Mode,VIDMNU_RENDERMODE,,,,Režim renderování,Rendermodus,,Bildigo-reĝimo,Modo de Renderizado,,Hahmonnustila,Mode de Rendu,,Modalità motore grafico,レンダラー,렌더링 설정,Render Mode,Tryb Renderowania,Modo de Renderização,,,Режим рендеринга,Рендер мод -Fullscreen,VIDMNU_FULLSCREEN,,,,Přes celou obrazovku,Vollbild,,Plena ekrano,Pantalla completa,,Koko näyttö,Plein écran,,Schermata piena,全画面,전체화면,Volledig scherm,Pełen Ekran,Tela cheia,Ecrã cheio,,Полный экран,Цео екран -Retina/HiDPI support,VIDMNU_HIDPI,,,,Podpora Retiny/HiDPI,Retina/HDPI-Unterstützung,,Retino/HiDPI subteno,Soporte para Retina/HiDPI,,Retina/HiDPI-tuki,Support Retina/HiDPI ,Retina/HiDPI támogatás,Supporto Retina/HiDPi,Retina/HiDPI サポート,망막/하이DPI 활성화,Retina / HiDPI-ondersteuning,Wsparcie Retina/HiDPI,Suporte para Retina/HiDPI,,,Поддержка Retina/HiDPI,Retina/HiDPI подршка -Aspect ratio,VIDMNU_ASPECTRATIO,,,,Poměr stran,Seitenverhältnis,,Ekran-proporcio,Relación de aspecto,,Kuvasuhde,Rapport D'Aspect,Képarány,Proporzioni,アスペクト比,종횡비,Beeldverhouding,Wpółczynnik proporcji,Proporção de tela,Proporção de ecrã,,Соотношение сторон,Однос гледишта -Force aspect ratio,VIDMNU_FORCEASPECT,,,,Vynutit poměr stran,Erzwinge Seitenverhältnis,,Devigi ekran-proporcion,Forzar relación de aspecto,,Pakota kuvasuhde,Forcer Rapport,,Forza le proporzioni,アスペクト比に従う,강제 종횡비,Geforceerde beeldverhouding,Wymuś współczynnik proporcji,Forçar proporção de tela,Forçar proporcção de ecrã,,Принудительное соотношение сторон,Присили однос гледишта -Forced ratio style,VIDMNU_CROPASPECT,,,,Vynucený poměr stran,Modus für erzwungenes Seitenverhältnis,,Maniero por devigi proporcion,Relación de aspecto forzada,,Kuvasuhteen pakotustapa,Style de Ratio forcé,,Forza lo stile delle proporzioni,比率の形式,강제 비율 스타일,Gedwongen verhouding stijl,Wymuszony styl współczynnika,Forçar tipo de proporção,,,Тип принудительного соотношения сторон,Присиљен стил односа -Enable 5:4 aspect ratio,VIDMNU_5X4ASPECTRATIO,,,,Povolit poměr stran 5:4,Erlaube 5:4 Seitenverhältnis,,Aktivigi 5:4 ekran-proporcion,Activar relación de aspecto 5:4,,Ota käyttöön 5:4-kuvasuhde,Activer Rapport 5:4,5:4 képarány engedélyezése,Abilita le proporzioni 5:4,5:4アスペクト比を可能にする,5:4 비율 사용,Inschakelen 5:4 beeldverhouding,Włącz współczynnik proporcji 5:4,Habilitar proporção 5:4,,,Включить соотношение сторон 5:4,Омогући 5:4 однос гледишта -Resolution scale,VIDMNU_SCALEMODE,,,,Škálování rozlišení,Skalierung,,Distingivo-skalo,Escala de Resolución,,Resoluution skaalaus,Echelle de Résolution,,Scala di risoluzione,画面スケール,해상도 크기,Resolutie schaal,Skala rozdzielczości,Escala de resolução,,,Масштабирование,Резолуцијска скала -Scale Factor,VIDMNU_SCALEFACTOR,,,,Faktor rozlišení,Skalierungsfaktor,,Skalfaktoro,Factor de Escala,,Skaalauskerroin,Facteur d'échelle,,Fattore di scala,スケール倍率,축척 펙터,Schaalfactor,Współczynnik Skali,Fator de escala,,,Значение масштаба,Фактор скалирања -Use Linear Scaling (Fullscreen),VIDMNU_USELINEAR,,,,Použít lineární škálování (přes celou obrazovku),Lineare Skalierung (Vollbild),,Uzi Linian Skaladon (Plena ekrano),Usar Escalado Linear (Pant. Completa),,Lineaarinen skaalaus (koko näyttö),Mise à l'échelle Linéaire (Plein écran),,Usa lo scaling lineare (a schermo pieno),リニアスケールを使う(全画面),선형 스케일링 사용 (전체화면),Lineaire schaalverdeling gebruiken (volledig scherm),Użyj Liniowego Skalowania (Pełen Ekran),Usar escala linear (tela cheia),Usar escala linear (ecrã cheio),,Линейное масштабирование (полный экран),Користи линеарно скалирање (цео екран) -Custom Pixel Scaling,VIDMNU_CUSTOMRES,,,,Vlastní škálování pixelů,Benutzerdefinierte Skalierung,,Agorda bildero-skalo,Escalado de Pixel Personalizado,,Mukautettu skaalaus,Résolution Personalisée,,Scaling dei pixel personalizzato,カスタム ピクセルスケール,사용자 지정 픽셀 크기 조정,Aangepaste Pixel Schaalvergroting,Niestandardowe Skalowanie Pikseli,Escala de Pixel Personalizada,,,Масштабирование пикселов,Пиксел скалирање -Custom Width,VIDMNU_CUSTOMX,,,,Vlastní šířka,Benutzerdefinierte Breite,,Agorda larĝo,Ancho Personalizado,,Mukautettu leveys,Largeur Personalisée,Egyéni szélesség,Lunghezza,カスタム 幅,사용자 지정 너비,Aangepaste breedte,Niestandardowa Szerokość,Largura Personalizada,,,Длина,Ширина -Custom Height,VIDMNU_CUSTOMY,,,,Vlastní výška,Benutzerdefinierte Höhe,,Agorda alto,Alto Personalizado,,Mukautettu korkeus,Hauteur Personalisée,Egyéni magasság,Altezza,カスタム 高さ,사용자 지정 높이,Aangepaste hoogte,Niestandardowa Wysokość,Altura Personalizada,,,Высота,Висина -Apply Changes (Windowed),VIDMNU_APPLYW,,,,Použít změny (v okně),Änderungen anwenden (Fenster),,Apliki ŝanĝojn (Fenestrito),Aplicar Cambios (ventana),,Ota käyttöön muutokset (ikkuna),Appliquer Changements (Fenêtre),,Applica le modifiche (a finestra),変更を適用(ウィンドウ化),변경 적용 (윈도우),Wijzigingen toepassen (opgewonden),Zatwierdź Zmiany (Okno),Aplicar alterações (janela),,,Сохранить изменения (оконный режим),Примени промене (прозор) -Apply Changes (Fullscreen),VIDMNU_APPLYFS,,,,Použít změny (přes celou obrazovku),Änderungen anwenden (Vollbild),,Apliki ŝanĝojn (Plena ekrano),Aplicar Cambios (Pant. Completa),,Ota käyttöön muutokset (koko näyttö),Appliquer Changements (Plein écran),,Applica le modifiche (a schermo pieno),変更を適用(全画面化),변경 적용 (전체화면),Wijzigingen toepassen (Volledig scherm),Zatwierdź Zmiany (Pełen Ekran),Aplicar alterações (tela cheia),Aplicar alterações (ecrã cheio),,Сохранить изменения (полный экран),Примени промене (цели екран) -Choose Resolution Preset,VIDMNU_RESPRESET,,,,Vybrat přednastavené rozlišení,Auflösungsvoreinstellung,,Elekti Agordaĵon por Distingivo,Seleccionar Preset de Resolución,,Valitse ennalta määritetty resoluutio,Choisir paramètre personalisé,,Scegli preset di risoluzione,解像度プリセットを選ぶ,해상도 사전 설정 선택,Kies een vooraf ingestelde resolutie,Wybierz Zestaw Rozdzielczości,Escolher Resolução Predefinida,,,Выбор пресета разрешения,Резолуцијска подешавања -Custom Resolution Presets,VIDMNU_RESPRESETTTL,,,,Vlastní přednastavení rozlišení,Benutzerdefinierte Auflösungsvoreinstellungen,,Laŭmendaj agordaĵoj por Distingivo,Seleccionar Preset de Resoluciones,,Ennalta määritetyt mukautetut resoluutiot,Résolutions Personalisée,,Preset di risoluzione personalizzati,カスタム解像度プリセット,사용자 지정 해상도 미리 조정,Vooraf ingestelde aangepaste resolutie,Niestandardowe Zestawy Rozdzielczości,Predefinições Personalizadas,,,Пользовательские пресеты,Резолуцијска подешавања -Preset Resolution Modes,VIDMNU_RESPRESETHEAD,,,,Přednastavená rozlišení,Vordefinierte Auflösungsmodi,,Agordaĵaj Distingivreĝimoj,Modos de Preset de Resolución,,Ennalta määritetyt resoluutiotilat,Choisir mode de Résolution,,Modalità preset di risoluzione,解像度モードの調整,해상도 미리 조정 모드,Vooraf ingestelde resolutie modi,Tryby Zestawów Rozdzielczości,Modos de Resolução Predefinidas,,,Доступные разрешения,Постављени резолуцијски модови -4:3 Aspect,VIDMNU_ASPECT43,,,,Poměr stran 4:3,4:3 Seitenverhältnis,,4:3 Proporcio,Aspecto 4:3,,4:3-tilat,Rapport 4:3,,Aspetto 4:3,4:3アスペクト比,4:3 비율,,Proporcje 4:3,Proporção 4:3,,,Соотношение сторон 4:3,4:3 гледиште -5:4 Aspect,VIDMNU_ASPECT54,,,,Poměr stran 5:4,5:4 Seitenverhältnis,,5:4 Proporcio,Aspecto 5:4,,5:4-tilat,Rapport 5:4,,Aspetto 5:4,5:4アスペクト比,5:4 비율,,Proporcje 5:4,Proporção 5:4,,,Соотношение сторон 5:4,5:4 гледиште -16:9 Aspect,VIDMNU_ASPECT169,,,,Poměr stran 16:9,16:9 Seitenverhältnis,,16:9 Proporcio,Aspecto 16:9,,16:9-tilat,Rapport 16:9,,Aspetto 16:9,16:9アスペクト比,16:9 비율,,Proporcje 16:9,Proporção 16:9,,,Соотношение сторон 16:9,16:9 гледиште -16:10 Aspect,VIDMNU_ASPECT1610,,,,Poměr stran 16:10,16.10 Seitenverhältnis,,16:10 Proporcio,Aspecto 16:10,,16:10-tilat,Rapport 16:10,,Aspetto 16:10,16:10アスペクト比,16:10 비율,,Proporcje 16:10,Proporção 16:10,,,Соотношение сторон 16:10,16:10 гледиште -Normal,OPTVAL_NORMAL,,,,Normální,,,Normala,,,Normaali,,,Normale,通常,기본형,Normaal,Normalny,Normal,,,Обычный,Нормално -Lowest Possible Scale,OPTVAL_LOWEST,"This describes vid_scalemode 6, which represents the lowest possible scaling to fill the allocated screen area",,,Nejmenší možná velikost,Kleinstmögliche Auflösung,,Plej Malpli Ebla Skalo,Menor Escala Posible,,Pienin mahdollinen skaalaus,Echelle la plus faible,,,可能な限り最小,,,,Menor Escala Possível,,Cea mai mică scară posibilă,, -Custom,OPTVAL_CUSTOM,,,,Vlastní,Benutzerdefiniert,,Laŭmenda,Personalizado,,Mukautettu,Modifié,,Personalizzato,カスタム,사용자 지정,Gebruiker gedefinieerd,Niestandardowe,Personalizado,,Personalizat,Польз.,Прилагођ. -Max FPS,VIDMNU_MAXFPS,,,,,,,,,,Kuvataajuuden rajoitin,,,,,,,,,,Cadre pe secundă,, -Unlimited,OPTVAL_UNLIMITED,,,,,Unlimitiert,,,,,Ei rajoitusta,,,,,,,,,,Nelimitate,, -60 fps,OPTVAL_60FPS,,,,,,,,,,60 kuvaa/s,,,,,,,,,,,, -75 fps,OPTVAL_75FPS,,,,,,,,,,75 kuvaa/s,,,,,,,,,,,, -90 fps,OPTVAL_90FPS,,,,,,,,,,90 kuvaa/s,,,,,,,,,,,, -120 fps,OPTVAL_120FPS,,,,,,,,,,120 kuvaa/s,,,,,,,,,,,, -144 fps,OPTVAL_144FPS,,,,,,,,,,144 kuvaa/s,,,,,,,,,,,, -200 fps,OPTVAL_200FPS,,,,,,,,,,200 kuvaa/s,,,,,,,,,,,, -,Miscellaneous Options,,,,,,,,,,,,,,,,,,,,,, -Miscellaneous Options,MISCMNU_TITLE,,,,Ostatní nastavení,Verschiedene Optionen,,Ekstraĵa agordoj,Opciones Misceláneas,,Sekalaiset asetukset,Options Annexes,,Opzioni miste,その他のオプション,그 외 설정,Diverse opties,Różne Opcje,Outras Opções,,,Дополнительные настройки,Разна подешавања -Merge left+right Alt/Ctrl/Shift,MISCMNU_MERGEKEYS,,,,Zkombinovat pravý a levý Alt/Ctrl/Shift,Linke und rechte Umschalt/Strg/Alt zusammenfassen,,Kunigi maldekstro+dekstro Alt/Ctrl/Shift,Combinar izq.+der. Alt/Ctrl/Mayús,,Yhdistä vasen ja oikea Alt/Ctrl/Vaihto,Combiner Alt/Ctrl/maj gauche & droite,,Unisci sinistra+destra Alt/Control/Maiusc,左と右のALT/CTRL/SHIFTキーを統合,양쪽 ALT/CTRL/SHIFT키 합병,Samenvoegen links+rechts Alt/Ctrl/Shift,Połącz przyciski lewo+prawo Alt/Ctrl/Shift,Unir teclas Alt/Ctrl/Shift esquerdas e direitas,Juntar Alt/Ctrl/Shift esquerdo+direito,,Не разделять левый/правый ALT/CTRL/SHIFT,Споји лево+десно Аlt/Ctrl/Shift -Alt-Enter toggles fullscreen,MISCMNU_WINFULLSCREENTOGGLE,,,,Alt-Enter přepíná celou obrazovku,Alt-Enter schaltet Vollbild an/aus,,Alt klavo-Enter klavo baskuligi tutekranon,Alt+Enter alterna pantalla completa,,Alt-Enter kytkee täyden ruudun päälle/pois,Alt-Entrée alterne plein écran,,Alt-Invio attiva/disattiva lo schermo pieno,ALTとENTERで全画面に切り替え,ALT+ENTER키로 전체화면 조정,Alt-Enter schakelt het volledige scherm aan/uit,Alt-Enter przełącza na pełen ekran,Alt-Enter ativa tela cheia,Alt-Enter ativa ecrã cheio,,Переключение полного экрана по ALT+ENTER,Alt-Enter пребацује на цео екран -Command-F toggles fullscreen,MISCMNU_MACFULLSCREENTOGGLE,,,,Command-F přepíná celou obrazovku,Cmd-F schaltet Vollbild an/aus,,Komando-F baskuligi tutekranon,Cmd-F alterna pantalla completa,,Komento-F kytkee täyden ruudun päälle/pois,Command-F alterne plein écran,,Command-F attiva/disattiva lo schermo pieno,Ctrl + Fキーで全画面表示,COMMAND+F키로 전체화면 조정,Command-F schakelt het volledige scherm aan/uit,Command-F przełącza pełny ekran,Command-F ativa tela cheia,Command-F ativa ecrã cheio,,Переключение полного экрана по Command+F,Command-F пребацује на цео екран -Show game selection dialog,MISCMNU_QUERYIWAD,,,,Zobrazit dialog pro výběr GRPu,Zeige Spielauswahl,,Montri GRP elekta dialogo,Mostrar diálogo de selección de GRP,,Näytä GRP-valintaikkuna,Afficher la séléction de jeu,,Mostra la schermata della selezione GRP,GRPの選択画面を表示,GRP 게임 선택창 표시,GRP-selectiedialoogvenster weergeven,Pokaż ekran wyboru gry,Mostrar janela de seleção de jogo.,,,Выбор GRP-файла при запуске,Покажи GRP дијалог за избор -Enable cheats from all games,MISCMNU_ALLCHEATS,,,,Povolit cheaty ze všech her,Ermögliche Cheats aus allen Spielen,,Aktivigi trompojn el tutaj ludoj,Activar trucos de todos los juegos,,Ota käyttöön huijauskoodit kaikista peleistä,Activer cheats de tous les jeux,,Abilita tutti i cheat da tutti i giochi,全ゲームでチート使用可にする,모든 게임에 치트 허용,Laat bedriegers van alle spellen toe,Włącz oszustwa ze wszystkich gier,Habilitar trapaças de todos os jogos,Permitir batotas de todos os jogos,,Читы из всех игр,Омогући читове од свих игара -Enable autosaves,MISCMNU_ENABLEAUTOSAVES,,,,Povolit automatické ukládání,Automatisches Speichern,,Aktivigi aŭtokonservojn,Activar autoguardado,,Ota käyttöön automaattiset tallennukset,Activer Sauvegardes auto,,Abilita i salvataggi automatici,オートセーブを有効化,빠른 저장 허용,Automatisch opslaan inschakelen,Włącz autozapis,Habilitar salvamento automático,Permitir gravação automática,,Автосохранения,Омогући аутосејвове -Number of autosaves,MISCMNU_AUTOSAVECOUNT,,,,Počet automatických uložených her,Anzahl von automatischen Speicherständen,,Kvanto da aŭtokonservojn,Número de autoguardados,,Automaattisten tallennusten lukumäärä,Total de sauvegardes auto,,Numero di salvataggi automatici,オートセーブの最大数,빠른 저장 수,Aantal autosafes,Liczba autozapisów,Número de salvamentos automáticos,Número de gravações automáticos,,Количество автосохранений,Број аутоматских чувања -Save/Load confirmation,MISCMNU_SAVELOADCONFIRMATION,,,,Potvrzení o uložení/načtení,Laden/Speichern bestätigen,,Konservi/Ŝarĝi jesigo,Confirmación al guardar/cargar,,Tallennuksen/Latauksen vahvistus,Confirmation C/S,,Conferma Salvataggio/Caricamento,セーブ/ロード時に確認,스크립트로 스크린샷 생성 허용,Opslaan/Laad bevestiging,Potwierdzenie zapisu/wczytania,Confirmação ao salvar/carregar,Confirmação ao gravar/carregar,,Подтверждение при сохранении/загрузке,Потврђивање током чувања/учитавања -Enable making screenshots by scripts,MISCMNU_ENABLESCRIPTSCREENSHOTS,,,,Povolit skriptům pořizovat snímky obrazovky,"Erlaube Skripts, Screenshots zu machen",,Aktivigi faranto ekrankopiojn per skriptoj,Habilitar captura de pantalla por scripts,,Salli komentosarjoin otetut kuvakaappaukset,Autoriser les Scripts à prendre des captures,,Abilita la cattura dello schermo tramite scripts,スクリプトからのスクショ作成を有効化,저장/불러오기 확인,Screenshots maken met behulp van scripts,Pozwól na robienie zrzutów ekranu przez skrypty,Habilitar capturas de tela por scripts,Permitir capturas de ecrã por scripts,,Возможность делать скриншоты через скрипты,Омогући прављење скриншотова по скрипти -Scripts Only,OPTVAL_SCRIPTSONLY,,,,Pouze skripty,Nur Skripte,,Skriptoj Sole,Sólo scripts,,Vain komentosarjat,Scripts seulement,,Solo script,スクリプトのみ,스크립트에만,Alleen scripts,Tylko skrypty,Scripts apenas,,,Только скрипты,Само скрипте -Disable keyboard cheats,MISCMNU_NOCHEATS,,,,,Tastatur-Cheats deaktivieren,,Malaktivigi klavaran trumpon,Desactivar trucos por teclado,,Poista näppäinhuijaukset,,,,キーボードからのチート無効,,Schakel cheats uit,,Desabilitar trapaças de teclado,,,, -Quicksave rotation,MISCMNU_QUICKSAVEROTATION,,,,Rotace rychle uložených her,Schnellspeicherrotation,,Rapidkonservado-rotacio,Rotación de Salvado Rápido,,Pikatallennuskierto,Rotation Sauvegardes Rapides,,Rotazione rapide della quicksave,クイックセーブ間隔,빠른 저장 간격,Roteer quicksaves,Rotacja szybkich zapisów,Rotação de quicksave,,,Чередовать слоты для быстрых сохранений,Окретање брзих чувања -Number of quicksaves in rotation,MISCMNU_QUICKSAVECOUNT,,,,Počet rychle uložených her v rotaci,Anzahl Schnellspeicherplätze,,Nombro da rapidkonservitaj ludoj en rotaciado,Número de Salvados Rápidos en Rotación,,Pikatallennusten määrä kierrossa,Nombre de sauvegardes en rotation,,Numero di quicksaves in rotazione,間隔クイックセーブの数,빠른 저장 간격의 수,Aantal roterende quicksaves,Ilość szybkich zapisów w rotacji,Número de quicksaves em rotação,,,Кол-во слотов для быстрых сохранений,Број брзих чувања у окретању -Ninja Slice Animation,MISCMNU_NINJA,,,,,Ninja-Zerteilanimation,,,,,Ninjan pilkkoutumisanimaatio,,,,,,,,,,Animație feliere Ninja,, -Use Darts instead of Shurikens,MISCMNU_DARTS,,,,,Darts statt Wurfsterne,,,,,Käytä tikkoja heittotähtien sijaan,,,,,,,,,,Săgeți în loc de shurikeni,, -,Miscellaneous,,,,,,,,,,,,,,,,,,,,,, -"You are playing the shareware -version of Duke Nukem 3D. While -this version is really cool, you -are missing over 75% of the total -game, along with other great extras -which you'll get when you order -the complete version and get -the final three episodes.",BUYDUKE,not used,,,,"Du spielst die Shareware-Version -von Duke Nukem 3D. Auch wenn -diese Version richtig cool ist, -verpasst du 75% des gesamten -Spiels und einer Reihe weiterer -toller Sachen, die du sehen -kannst, wenn du dir die Voll- -version holst.",,,,,"Pelaat Duke Nukem 3D:n -shareware-versiota. Vaikka -tämäkin versio on tosi siisti, -jäät yli 75 % paitsi täydestä -pelistä sekä lisäksi muista -mahtavista kylkiäisistä, jotka -saat, kun tilaat koko version -ja saat loput kolme episodia.",,,,,,,,,,"Joci versiunea gratuită a jocului -Duke Nukem 3D. Deși versiunea -aceasta e grozavă, pierzi aproximativ -75% din versiunea completă, -împreună cu alte suplimente pe -care le primești când comanzi -versiunea completă și primești -ultimele trei episoade.",, -"Buy the complete version of -Blood for three new episodes -plus eight BloodBath-only levels!",BUYBLOOD,not used,,,,"Kaufe die Komplettversion -von Blood mit 3 weiteren -Episoden.",,,,,"Osta Bloodin koko versio ja -saat kolme uutta episodia ja -kahdeksan pelkästään -verilöylyä varten -suunniteltua tasoa!",,,,,,,,,,Cumpără versiunea completă a jocului Blood pentru încă trei episoade și încă opt hărți pentru modul BloodBath!,, -"Be sure to call 800-3DREALMS today -and order the game. -You are only playing the first -four levels, and are missing most -of the game, weapons and monsters. -See the ordering information. -",BUYSW,,,,,"Du spielst nur die ersten 4 -Level und verpasst das Meiste -des Spiels, der Waffen und -Monster. -Rufe noch heute 800-3DREALMS -an und bestelle das Spiel. -",,,,,"Soita vielä tänään numeroon -800-3DREALMS ja tilaa peli. -Pelaat ainoastaan neljää -ensimmäistä tasoa ja jäät -paitsi suurimmasta osasta -peliä, sen aseista ja hirviöistä. -Katso tilausohjeet.",,,,,,,,,,"Sună la 800-3DREALMS astăzi pentru a comanda jocul. Joci doar primele patru nivele și îți lipsesc majoritatea hărților, armelor, și monștrilor. Verifică informațiile pentru a comanda.",, -"Loading and saving games -not supported -in this demo version of Blood.","BLOOD_SW_BLOCK -",not used,,,,"Laden und Speichern ist in -dieser Demoversion von -Blood nicht gestattet.",,,,,"Pelien lataaminen ja tallentaminen -ei ole tuettu Bloodin demoversiossa.",,,,,,,,,,Salvarea și încărcarea jocului nu este suportată de această versiune demo a jocului Blood.,, +,,Miscellaneous,,,,,,,,,,,,,,,,,,,,, "Are you sure you want to end the game? ",ENDGAME,,,,"Opravdu si přeješ ukončit hru? ","Willst du das Spiel wirklich beenden? @@ -844,53 +18,244 @@ ei ole tuettu Bloodin demoversiossa.",,,,,,,,,,Salvarea și încărcarea jocului ",Ești sigur că vrei să închei jocul?,"Вы действительно хотите закончить игру? ","Јесте ли сигурни да желите завршити игру? " +,,Menus,,,,,,,,,,,,,,,,,,,,, +New Game,MNU_NEWGAME,,,,Nová hra,Neues Spiel,,Nova Ludo,Nueva Partida,,Uusi peli,Nouvelle Partie,,Nuovo gioco,新規ゲーム,새로운 게임,Nieuw spel,Nowa Gra,Novo Jogo,,Joc Nou,Новая игра,Нова игра +Options,MNU_OPTIONS,,,,Možnosti,Optionen,,Agordoj,Opciones,,Asetukset,Options,,Opzioni,オプション,설정,Opties,Opcje,Opções,,Opțiuni,Настройки,Подешавања +Quit,MNU_QUITGAME,,,,Ukončit hru,Spiel verlassen,,Ĉesigi Ludon,Salir del juego,,Lopeta peli,Quitter le jeu,,Esci dal gioco,終了,게임 종료,Verlaat spel,Wyjdź z Gry,Sair,,Ieșire,Выход,Заврши игру +Help,MNU_HELP,,,,,Hilfe,,,,,Ohje,Aide,,,,,,,Ajuda,,Ajutor,, +Credits,MNU_CREDITS,,,,,,,,,,Tekijät,,,,,,,,Créditos,,Autori,, +How to Order,MNU_HOWTOORDER,,,,,Bestellen,,,,,Tilausohje,,,,,,,,Como Comprar,,Cum Comanzi,, +End Game,MNU_ENDGAME,,,,,Spiel beenden,,,,,Lopeta peli,,,,,,,,Encerrar Partida,,Încheie Joc,, +User Map,MNU_USERMAP,not used yet,,,,Benutzerlevel,,,,,Omat tasot,,,,,,,,Mapa de Usuário,,Hărți de utilizatori,, +Select a user map to play,MNU_SELECTUSERMAP,not used yet,,,,"Wähle ein Level zum Spielen +",,,,,Valitse oma taso pelattavaksi,,,,,,,,Selecione um mapa de usuário para jogar,,Alege o hartă de utilizatori,, +Select an Episode,MNU_SELECTEPISODE,DN3D et.al.,,,,"Welche Episode? +",,,,,Valitse episodi,,,,,,,,Selecione um Episódio,,Alege un episod,, +Episodes,MNU_EPISODES,Blood,,,,Episoden,,,,,Episodit,,,,,,,,Episódios,,Episoade,, +Select Skill,MNU_SELECTSKILL,DN3D et.al.,,,,Schwierigkeitsgrad,,,,,Valitse vaikeustaso,,,,,,,,Escolha a dificuldade,,Alege dificultatea,, +Difficulty,MNU_DIFFICULTY,Blood,,,,Schwierigkeitsgrad,,,,,Vaikeustaso,,,,,,,,Dificuldade,,Dificultate,, +Engine Credits,MNU_ENGINECREDITS,,,,,,,,,,Moottorin tekijäluettelo,,,,,,,,Créditos da Engine,,Autori motor,, +,,,,,,,,,,,,,,,,,,,,,,, +Rotate mode on,TXT_ROTATE_ON,,,,,Rotiermodus an,,,,,Kääntötila päällä,,,,,,,,Modo de rotação ativado,,,, +Rotate mode off,TXT_ROTATE_OFF,,,,,Rotiermodus aus,,,,,Kääntötila pois päältä,,,,,,,,Modo de rotação desativado,,,, +,,Controls submenu,,,,,,,,,,,,,,,,,,,,, +Default,CTRL_DEFAULT,,,,,Standard,,,,,Oletus,,,,,,,,Padrão,,Implicit,, +Classic,CTRL_CLASSIC,,,,,"Klassisch +",,,,,Alkuperäinen,,,,,,,,Clássico,,Clasic,, +Left-handed,CTRL_LEFTHANDED,,,,,Linkshändig,,,,,Vasenkätinen,,,,,,,,Canhoto,,Stângaci,, +Control presets,CTRL_PRESET,,,,,Voreinstellungen,,,,,Ohjausesivalinnat,,,,,,,,Predefinições de controle,,Configurații prestabilite,, +Mouse look toggle,CNTRLMNU_MLOOKTOGGLE,,,,,Maus-Blick umschalten,,,,,Hiirikatselun vaihtokytkin,,,,,,,,,,Comutator privire în jur cu mouse,, +Aim up,CNTRLMNU_AIMUP,,,,,Nach oben zielen,,,Apuntar arriba,,Tähtää ylös,Visée haut,,Mira su,上を狙う,,,,Mirar para cima,,Țintire sus,наведение вверх, +Aim down,CNTRLMNU_AIMDOWN,,,,,Nach unten zielen,,,Apuntar AAbajo,,Tähtää alas,Visée bas,,Mira giù,下を狙う,,,,Mirar para baixo,,Țintire jos,наведение вниз, +Look left,CNTRLMNU_LOOKLEFT,,,,,Nach links schauen,,,Mirar izquierda,,Katso vasemmalle,Regarder à gauche,,Guarda a sinistra,左を見る,,,,Olhar para a esquerda,,Privire stânga,Смотреть влево, +Look right,CNTRLMNU_LOOKRIGHT,,,,,Nach rechts schauen,,,Mirar derecha,,Katso oikealle,Regarder à droite,,Guarda a destra,右を見る,,,,Olhar para a direita,,Privire dreapta,Смотреть вправо, +Alternative Weapon,CNTRLMNU_ALTWEAPON,,,,,Alternative Waffe,,,,,Vaihtoehtoinen ase,,,,,,,,,,Armă Alternativă,, +Holster Weapon,CNTRLMNU_HOLSTER,,,,,Waffe wegstecken,,,Arma de pistolera,,Laske ase,Arme de poing,,Fondina,武器をホルスターに収める,,,,Guardar arma,,Coboară arma,Убрать оружие, +Quick Kick,CNTRLMNU_QUICKKICK,,,,,Schneller Tritt,,,Patada rápida,,Pikapotkaisu,Kick rapide,,Calcio rapido,クイックキック,,,,Chute rápido,,Șut rapid,Быстрый пинок, +Pee,CNTRLMNU_PEE,,,,,Pinkeln,,,,,Pissaa,,,,,,,,Mijo,,Urinează,, +Proximity Bomb,CNTRLMNU_PROXIMITYBOMBS,,,,,Kontaktbombe,,,,,Miinapommi,,,,,,,,Bomba de proximidade,,Bombă de proximitate,, +Remote Bomb,CNTRLMNU_REMOTEBOMBS,,,,,Funkbombe,,,,,Kauko-ohjauspommi,,,,,,,,Bomba de controle remoto,,Bombă cu detonator,, +Smoke Bomb,CNTRLMNU_SMOKEBOMB,,,,,Rauchbombe,,,,,Savupommi,,,,,,,,Bomba de fumaça,,Bombă fumigenă,, +Gas Bomb,CNTRLMNU_GASBOMB,,,,,Gasgranate,,,,,Kaasupommi,,,,,,,,Bomba de gás,,Bombă cu gaz,, +Flash Bomb,CNTRLMNU_FLASHBOMB,,,,,Blendgranate,,,,,Sokaisupommi,,,,,,,,Bomba de atordoamento,,Bombă orbitoare,, +Caltrops,CNTRLMNU_CALTROPS,,,,,Krähenfüße,,,,,Jalkapiikit,,,,,,,,Estrepes,,Ciulini de fier,, +Holoduke,CNTRLMNU_HOLODUKE,,,,,,,,,,Holo-Duke,,,,ホロDUKE,,,,,,Duke Holografic,Голо-Duke, +Jetpack,CNTRLMNU_JETPACK,,,,,,,,Propulsor,,Rakettireppu,,,,ジェットパック,,,,Jato,,,Джетпак, +Night Vision,CNTRLMNU_NIGHTVISION,,,,,Nachtsichtgerät,,,Visión nocturna,,Yönäkö,Vision de nuit,,,暗視,,,,Visão noturna,,Vedere infraroșie,Ночное видение, +Medkit,CNTRLMNU_MEDKIT,,,,,,,,Botiquín,,Lääkintälaukku,Médikit,,,,,,,Kit médico,,Kit medical,Аптечка, +Steroids,CNTRLMNU_STEROIDS,,,,,Steroide,,,Esteroides,,Steroidit,Stéroïdes,,Steroidi,ステロイド,,,,Esteroides,,Steroizi,Стероиды, +Holo Soldier,CNTRLMNU_HOLOSOLDIER,,,,,Holosoldat,,,,,Holosotilas,,,,,,,,Soldado Holográfico,,Soldat Holografic,, +Huey,CNTRLMNU_HUEY,,,,,,,,,,Huey,,,,,,,,,,,, +Beer,CNTRLMNU_BEER,,,,,Bier,,,Cerveza,,Olut,Bière,,Bara,ビール,,,,Cerveja,,Bere,Пиво, +Cow Pie,CNTRLMNU_COWPIE,not translatable,,,,,,,,,Nautapiirakka,,,,,,,,,,Plăcintă de vacă,, +Yeehaa,CNTRLMNU_YEEHAA,not translatable,,,,,,,,,Jiihaa,,,,,,,,,,,, +Whiskey,CNTRLMNU_WHISKEY,,,,,Whisky,,,Whisky,,Viski,,,,,,,,Uísque,,,, +Moonshine,CNTRLMNU_MOONSHINE,,,,,Schwarzgebrannter,,,,,Pontikka,,,,,,,,Pinga,,Whiskey ilegal,, +Crystal Ball,CNTRLMNU_CRYSTALBALL,,,,,Kristallkugel,,,,,Kristallipallo,,,,,,,,Bola de Cristal,,Bilă de cristal,, +Jump Boots,CNTRLMNU_JUMPBOOTS,,,,,Sprungstiefel,,,,,Hyppysaappaat,,,,,,,,Botas de Salto,,Cizme pentru sărituri,, +Beast Vision,CNTRLMNU_BEASTVISION,,,,,MonsterVision,,,,,Petonäkö,,,,,,,,Visão da Besta,,Vedere de bestie,, +Tank Mode,CNTRLMNU_TANKMODE,,,,,Panzermodus,,,,,Panssaritila,,,,,,,,Modo Tanque,,Mod Tanc,, +Smokes,CNTRLMNU_SMOKES,Cigarettes,,,,Zigaretten,,,,,Röökit,,,,,,,,Cigarros,,,, +Fire Mission,CNTRLMNU_FIRE_MISSION,,,,,,,,,,Tulitehtävä,,,,,,,,Artilharia,,,, +Radar,CNTRLMNU_RADAR,,,,,,,,,,Tutka,,,,,,,,Radar,,Încarcă,, +Other,CNTRLMNU_OTHER,,,,Ostatní,Andere,,Alia,Otros,,Muu,Autres,Más,Altro,その他,그 외 조작,Andere,Inne,Outro,,,Прочее,Остало +Writin': OFF,MSGOFF,,Redneck RedneckRides,,Zprávy ZAP,Geschreibsel: AUS,Μηνύματα ΚΛΕΙΣΤΑ,Mesaĝoj MALAKTIVA,Mensajes DESACTIVADOS,,Sepustukset POIES PIÄLTÄ,Messages désactivés.,Üzenetek KI,Messaggi DISATTIVATI,メッセージ: オフ,메시지 끔,Berichten UIT,Wiadomości WYŁĄCZONE,Mensagens DESATIVADAS,,Scriere oprită,Сообщения ОТКЛЮЧЕНЫ,Поруке ИСКЉУЧЕНЕ +Writin': ON,MSGON,,Redneck RedneckRides,,Zprávy VYP,Geschreibsel: AN,Μηνύματα ΑΝΟΙΧΤΑ,Mesaĝoj AKTIVA,Mensajes ACTIVADOS,,Sepustukset PIÄLLÄ,Messages activés.,Üzenetek BE,Messaggi ATTIVATI,メッセージ: オン,메시지 켬,Berichten AAN,Wiadomości WŁĄCZONE,Mensagens ATIVADAS,,Scriere pornită,Сообщения ВКЛЮЧЁНЫ,Поруке УКЉУЧЕНЕ +Mouse aiming ON,TXT_MOUSEAIMON,,,,,Mit Maus zielen: An,,,Apuntar con ratón ACTIVADO,,Hiiritähtäys PÄÄLLÄ,Visée souris activée,,Puntamento col mouse: sì,マウスエイム オン,,,,Mira de mouse ATIVADA,,Țintire cu mouse OPRITĂ,Наведение мышью вкл, +Mouse aiming OFF,TXT_MOUSEAIMOFF,,,,,Mit Maus zielen: Aus,,,Apuntar con ratón DESACTIVADO,,Hiiritähtäys POIS PÄÄLTÄ,Visée souris desactivée,,Puntamento col mouse: no,マウスエイム オフ,,,,Mira de mouse DESATIVADA,,Țintire cu mouse PORNITĂ,Наведение мышью откл, +Rat aimin' ON,TXT_MOUSEAIMON,I don't think this translates well...,Redneck RedneckRides,,,Mit Maus zielen: An,,,Apuntar con ratón ACTIVADO,,Rottasihtaus PIÄLLÄ,Visée souris activée,,Puntamento col mouse: sì,マウスエイム オン,,,,Mira de mouse ATIVADA,,Țintire de șobolan PORNITĂ,Наведение мышью вкл, +Rat aimin' OFF,TXT_MOUSEAIMOFF,,Redneck RedneckRides,,,Mit Maus zielen: Aus,,,Apuntar con ratón DESACTIVADO,,Rottasihtaus POIES PIÄLTÄ,Visée souris desactivée,,Puntamento col mouse: no,マウスエイム オフ,,,,Mira de mouse DESATIVADA,,Țintire de șobolan OPRITĂ,Наведение мышью откл, +Mouselook Toggle,MOUSEMNU_LOOKSPRING,,,,Automatické vystředění pohledu,Automatisch zentrieren,,Rigardsalto,Mirar con ratón,,Katseenpalautin,Recentrer après Vue Souris,,,視点水平化,마우스룩 시점 초기화,Lente,Automatyczne Wyśrodkowanie,Centralizar automáticamente,Centrar automáticamente,Comutator privire în jur cu mouse,Передвижение мышью,Покрет мишем +Mouse Strafe,MOUSEMNU_LOOKSTRAFE,,,,Použít myš k pohybu do stran,Seitwärts bewegen mit der Maus,,Rigardturnmovo,Mirar con movimiento,,Sivuttaisastuntapalautin,Mouvement Latéral par Souris,,,視点横移動化,마우스룩 좌우 이동,Lookstrafe,Unikanie przy użyciu myszki,Deslocamento lateral com o mouse,Deslocamento lateral com o rato,Deplasare în diagonală cu mouse,Движение боком мышью,Стрејф мишем +,,Multiplayer,,,,,,,,,,,,,,,,,,,,, +Game Options,NETMNU_OPTIONS,,,,,Spieleinstellungen,,,,,Pelin asetukset,,,,,,,,Opções de Jogo,,Setări joc,, +Launch Game,NETMNU_LAUNCH,,,,,Spiel starten,,,,,Käynnistä peli,,,,,,,,Iniciar Jogo,,Pornire joc,, +Multiplayer taunts,PLRMNU_TAUNTS,,,,,Mehrspieler-Spott,,,,,,,,,,,,,,,Tachinări online,, +Game Type,NETMNU_GAMETYPE,,,,,Spieltyp,,,,,Pelityyppi,,,,,,,,Tipo de Jogo,,Tip joc,, +Deathmatch (Spawn),NETMNU_GAMETYPE1,currently not used,,,,Deathmatch mit Monstern,,,,,Kuolonmatsi (esineet palautuvat),,,,,,,,Deathmatch (com spawn),,Deathmatch (doar spawn),, +DukeMatch (Spawn),NETMNU_GAMETYPE1,Duke,,,,DukeMatch mit Monstern,,,,,Dukematsi (esineet palautuvat),,,,,,,,DukeMatch (com spawn),,DukeMatch (doar spawn),, +GI Match (Spawn),NETMNU_GAMETYPE1,Nam,,,,GI Match mit Feinden,,,,,Solttumatsi (esineet palautuvat),,,,,,,,GI Match (com spawn),,Meci GI (doar spawn),, +GruntMatch (Spawn),NETMNU_GAMETYPE1,WW2GI,,,,Infanteriematch mit Feinden,,,,,Solttumatsi (esineet palautuvat),,,,,,,,GruntMatch (com spawn),,GruntMatch (doar spawn),, +Cooperative Play,NETMNU_GAMETYPE2,,,,,Kooperatives Spiel,,,,,Yhteispeli,,,,,,,,Jogo Cooperativo,,Joc Cooperativ,, +Deathmatch (No Spawn),NETMNU_GAMETYPE3,,,,,Deathmatch ohne Monster,,,,,Kuolonmatsi (esineet eivät palaudu),,,,,,,,Deathmatch (sem spawn),,Deathmatch (fără spawn),, +DukeMatch (No Spawn),NETMNU_GAMETYPE3,Duke,,,,DukeMatch ohne Monster,,,,,Dukematsi (esineet eivät palaudu),,,,,,,,DukeMatch (sem spawn),,DukeMatch (fără spawn),, +GI Match (No Spawn),NETMNU_GAMETYPE3,Nam,,,,GI Match ohne Feinde,,,,,Solttumatsi (esineet eivät palaudu),,,,,,,,GI Match (sem spawn),,Meci GI (fără spawn),, +GruntMatch (No Spawn),NETMNU_GAMETYPE3,WW2GI,,,,Infanteriematch ohne Feinde,,,,,Solttumatsi (esineet eivät palaudu),,,,,,,,GruntMatch (sem spawn),,GruntMatch (fără spawn),, +Team DM (Spawn),NETMNU_GAMETYPE4,,,,,Team DM mit Monstern,,,,,Joukkuematsi (esineet palautuvat),,,,,,,,Deathmatch de equipe (com spawn),,DM în echipă (doar spawn),, +Team DM (No Spawn),NETMNU_GAMETYPE5,,,,,Team DM ohne Monster,,,,,Joukkuematsi (esineet eivät palaudu),,,,,,,,Deathmatch de equipe (sem spawn),,DM în echipă (fără spawn),, +Episode,NETMNU_EPISODE,,,,,,,,,,Episodi,,,,,,,,Episódio,,Episod,, +Level,NETMNU_LEVEL,,,,,,,,,,Taso,,,,,,,,Fase,,Nivel,, +Monsters,NETMNU_MONSTERS,,,,,Monster,,,,,Hirviöt,,,,,,,,Monstros,,Monștri,, +Markers,NETMNU_MARKERS,,,,,Markierungen,,,,,Merkit,,,,,,,,Marcadores,,Markere,, +Map Exits,NETMNU_MAPEXITS,,,,,Levelausgänge,,,,,Tasopoistumiset,,,,,,,,Saídas da Fase,,Ieșiri Hartă,, +Friendly Fire,NETMNU_FFIRE,,,,,Teambeschuss,,,,,Ristituli,,,,,,,,Fogo Amigo,,Accidente,, +Accept,NETMNU_ACCEPT,,,,,Ok,,,,,Hyväksy,,,,,,,,Aceitar,,,, +Server,NETMNU_SERVER,,,,,,,,,,Palvelin,,,,,,,,Servidor,,,, +Port,NETMNU_PORT,Network port!,,,,,,,,,Portti,,,,,,,,Porta,,,, +Connect,NETMNU_CONNECT,,,,,Vebinden,,,,,Yhdistä,,,,,,,,Conectar,,Conectare,, +,,Gameplay options,,,,,,,,,,,,,,,,,,,,, +Hitscan only,OPTVAL_HITSCAN,,,,,Nur Hitscan,,,,,Vain osumatarkistus,,,,,,,,Somente hitscan,,Doar hitscan,, +Run Mode,PLRMNU_RUNMODE,,,,,Rennmodus,,,,,Juoksutila,,,,,,,,Modo Correr,,Mod fugă,, +Allow Toggle,PLRMNU_TOGGLE,,,,,Umschalten erlauben,,,,,Salli vaihtokytkeminen,,,,,,,,Permitir Ativar/Desativar,,Permite comutare,, +Override Toggle,PLRMNU_OVERRIDE,,,,,Umschalten blockieren,,,,,Kumoa vaihtokytkeminen,,,,,,,,Ignorar Ativar/Desativar,,Suprascriere comutare,, +If New,PLRMNU_IFNEW,,,,,Wenn neu,,,,,Jos uusi,,,,,,,,Quando Novo,,Dacă e nouă,, +Equip Weapon Pickups,PLRMNU_EQUIP,,,,,Waffen sofort aktivieren,,,,,Vaihda poimittuun aseeseen,,,,,,,,Equipar Armas,,Echipează armele ridicate,, +Parental Lock,PLRMNU_PLOCK,,,,,Kindersicherung,,,,,Lapsilukko,,,,,,,,Bloqueio Parental,,Control Parental,, +Only preferred,PLRMNU_PREFERRED,,,,,Nur bevorzugte,,,,,Vain parempaan,,,,,,,,Somente preferido,,Doar preferate,, +,,Polymost,,,,,,,,,,,,,,,,,,,,, +True Color Textures,POLYMOST_TC,,,True Colour Textures,,True Color Texturen,,,,,True Color -asetukset,,,,,,,,Texturas true color,,Texturi Naturale,, +Pre-load map textures,POLYMOST_CACHE,,,,,Texturen cachen,,,,,Esilataa tason pintakuvioinnit,,,,,,,,Pré-carregar texturas da fase,,Preîncărcare Texturi Hartă,, +Detail Textures,POLYMOST_DETAIL,,,,,Detailtexturen,,,,,Yksityiskohtaiset pintakuvioinnit,,,,,,,,Texturas de detalhe,,Detaliu Texturi,, +Glow Textures,POLYMOST_GLOW,,,,,Leucht-Texturen,,,,,Hehkuvat pintakuvioinnit,,,,,,,,Texturas de brilho,,Strălucire Texturi,, +3D-Models,POLYMOST_MODELS,,,,,3D Modelle,,,,,3D-mallit,,,,,,,,Modelos 3D,,Modele 3D,, +"Polymost Options +",POLYMOST_OPTIONS,,,,,Polymost-Optionen,,,,,Polymost-asetukset,,,,,,,,Opções Polymost,,Setări Polymost,, +Palette Emulation,POLYMOST_PALETTEEMU,,,,,Palettenemulation,,,,,Paletin emulaatio,,,,,,,,Emulação de paleta,,Emulare Paletă,, +Palette Interpolation,POLYMOST_PALINTER,,,,,Paletteninterpolation,,,,,Paletin interpolaatio,,,,,,,,Interpolação de paleta,,Interpolare Paletă,, +,,,,,,,,,,,,,,,,,,,,,,, +"Ignore file type for music lookup +",ADVSNDMNU_LOOKUPMUS,,,,,Dateityp bei Musiksuche ignorieren,,,,,Jätä tiedostotyyppi huomioimatta musiikkihaussa,,,,,,,,Ignorar tipo de arquivo na busca de músicas,,,, +Ignore file type for sound lookup,ADVSNDMNU_LOOKUPSND,,,,,Dateityp bei Soundsuche ignorieren,,,,,Jätä tiedostotyyppi huomioimatta äänihaussa,,,,,,,,Ignorar tipo de arquivo na busca de sons,,,, +,,,,,,,,,,,,,,,,,,,,,,, +Show game selection dialog,MISCMNU_QUERYIWAD,,,,Zobrazit dialog pro výběr GRPu,Zeige Spielauswahl,,Montri GRP elekta dialogo,Mostrar diálogo de selección de GRP,,Näytä GRP-valintaikkuna,Afficher la séléction de jeu,,Mostra la schermata della selezione GRP,GRPの選択画面を表示,GRP 게임 선택창 표시,GRP-selectiedialoogvenster weergeven,Pokaż ekran wyboru gry,Mostrar janela de seleção de jogo.,,,Выбор GRP-файла при запуске,Покажи GRP дијалог за избор +,,Display/HUD,,,,,,,,,,,,,,,,,,,,, +Voxels,DSPLYMNU_VOXELS,,,,,Voxel,,,,,Vokselit,,,,,,,,,,Voxele,, +Shadows,DSPLYMNU_SHADOWS,,,,,Schatten,,,,,Varjot,,,,,,,,Sombras,,Umbre,, +Slope Tilting,DSPLYMNU_SLOPETILT,,,,,Steigungsneigung,,,,,Viettokallistus,,,,,,,,Inclinação em Declive,,Înclinare pe pante,, +View Bobbing,DSPLYMNU_VIEWBOB,,,,,,,,,,Katseen heilunta,,,,,,,,Balanço Vertical de Visão,,Mișcare vedere sus-jos,, +View Sway,DSPLYMNU_VIEWSWAY,,,,,,,,,,Katseen huojunta,,,,,,,,Balanço Horizontal de Visão,,Mișcare ritmică vedere,, +Show clip amount in fullscreen HUD,DSPLYMNU_CLIPAMT,,,,,Zeige Magazin im Vollbild-HUD,,,,,Näytä lipasmäärä täyden ruudun tilanäytössä,,,,,,,,Mostrar quantidade de munição em tela cheia,,Afișare muniție cartuș,, +Level Statistics,DSPLYMNU_LEVELSTATS,,,,,Levelstatistik,,,Mostrar estadísticas de nivel,,Tason tilastot,Aff. stats niveau,,Mostra statistiche livello,レベルステータスを表示する,,,,Mostrar estatísticas da fase,,Statistici Nivel,Показать характеристики уровня, +Level Statistics Scale,DSPLYMNU_STATSCALE,,,,,Textgröße für Levelstatistik,,,,,Tason tilastojen skaalaus,,,,,,,,Escala das estatísticas da fase,,Scară Statistici Nivel,, +Text Scale,DSPLYMNU_TEXTSCALE,,,,,Textgröße,,,,,Tekstin skaalaus,,,,,,,,Escala de texto,,Scară Text,, +Generic,DSPLYMNU_GENERIC,,,,,Generisch,,,,,Yleinen,,,,,,,,Genérico,,,, +Show Map Name,DSPLYMNU_SHOWMAPNAME,,,,,"Levelnamen anzeigen +",,,,,Näytä tason nimi,,,,,,,,Mostrar nome da fase,,Afișare nume hartă,, +FOV,DSPLYMNU_FOV,,,,,Gesichtsfeld,,,,,Näkökenttä,,,,,,,,Campo de visão,,Câmp vizual,, +Crosshair,DSPLYMNU_CROSSHAIR,,,,Křížek,Fadenkreuz,,Reteto,Retícula,,Tähtäin,Viseur,,Mirino,クロスヘア,조준점,Draadkruis,Celownik,Mira,,Țintă,Прицел,Нишан +Polymost Options,OPTMNU_POLYMOST,,,,,Polymost Einstellungen,,,,,Polymost-asetukset,,,,,,,,,,Setări Polymost,, +Message Display Style,DSPLYMNU_MESSAGEDISP,,,,,Nachrichtenstil,,,,,,,,,,,,,Estilo visual de mensagem,,Mod Afișare Mesaje,, +Classic,OPTVAL_CLASSIC,,,,,Klassisch,,,,,,,,,,,,,Clássico,,Clasic,, +Advanced,OPTVAL_ADVANCED,,,,,Erweitert,,,,,,,,,,,,,Avançado,,Avansat,, +CD Music Emulation,SNDMNU_CDEMU,,,,,CD-Musik-Emulation,,,,,CD-musiikin emulaatio,,,,,,,,Emulação de música de CD,,Emulare CD muzică,, +Play original Sounds,SNDMNU_WTSOUND,,,,,Original-Soundeffekte spielen,,,,,Toista alkuperäiset äänet,,,,,,,,Reproduzir sons originais,,Utilizare sunete originale,, +Developer commentary,SNDMNU_WTCOMMENT,,,,,Entwicklerkommentar,,,Comentarios del desarrollador,,,Commentaire développeur,,Commentario sviluppatore,デベロッパーのコメンタリー,,,,Comentário de desenvolvedor,,Comentariu dezvoltatori,Комментарии разработчиков, +Play original MIDI music,SNDMNU_WTMUSIC,,,,,Original-MIDI-Musik spielen,,,,,Toista alkuperäinen MIDI-musiikki,,,,,,,,Reproduzir música MIDI original,,Utilizare muzică MIDI originală,, +Sound Ambience,SNDMNU_AMBIENCE,,,,,Umgebungsgeräusche,,,,,Taustaäänet,,,,,,,,Ambiência de som,,Ambianță,, +"Player Speech +",SNDMNU_SPEECH,,,,,Spielerkommentare,,,,,Pelaajan puhe,,,,,,,,Fala do jogador,,Vorbire caracter,, +Flip Stereo Channels,ADVSNDMNU_FLIPSTEREO,,,,,Stereo Kanäle vertauschen,,,,,Käännä stereokanavat,,,,,,,,Inverter canais estéreo,,Schimbă canalele stereo,, +Ninja Slice Animation,MISCMNU_NINJA,,,,,Ninja-Zerteilanimation,,,,,Ninjan pilkkoutumisanimaatio,,,,,,,,Animação de Corte Ninja,,Animație feliere Ninja,, +Alternative Nuke Initialization,MISCMNU_ALTNUKE,"Restores an alternative nuke +readying animation",,,,Alternative Atomsprengkopfanimation,,,,,,,,,,,,,,,Pregătire bombă nucleară alternativă,, +Use Darts instead of Shurikens,MISCMNU_DARTS,,,,,Darts statt Wurfsterne,,,,,Käytä tikkoja heittotähtien sijaan,,,,,,,,Usar Dardos ao invés de Shurikens,,Săgeți în loc de shurikeni,, +,,Miscellaneous,,,,,,,,,,,,,,,,,,,,, +"You are playing the shareware +version of Duke Nukem 3D. While +this version is really cool, you +are missing over 75% of the total +game, along with other great extras +which you'll get when you order +the complete version and get +the final three episodes.",BUYDUKE,,,,,"Du spielst die Shareware-Version +von Duke Nukem 3D. Auch wenn +diese Version richtig cool ist, +verpasst du 75% des gesamten +Spiels und einer Reihe weiterer +toller Sachen, die du sehen +kannst, wenn du dir die Voll- +version holst.",,,,,"Pelaat Duke Nukem 3D:n +shareware-versiota. Vaikka +tämäkin versio on tosi siisti, +jäät yli 75 % paitsi täydestä +pelistä sekä lisäksi muista +mahtavista kylkiäisistä, jotka +saat, kun tilaat koko version +ja saat loput kolme episodia.",,,,,,,,"Você está jogando a versão shareware +de Duke Nukem 3D. Mesmo que esta +versão seja bem bacana, você está +perdendo mais de 75% do total do jogo, +além de outros bônus incríveis que +você recebe quando compra a versão +completa e recebe os três episódios finais.",,"Joci versiunea gratuită a jocului +Duke Nukem 3D. Deși versiunea +aceasta e grozavă, pierzi aproximativ +75% din versiunea completă, +împreună cu alte suplimente pe +care le primești când comanzi +versiunea completă și primești +ultimele trei episoade.",, +"Buy the complete version of +Blood for three new episodes +plus eight BloodBath-only levels!",BUYBLOOD,,,,,"Kaufe die Komplettversion +von Blood mit 3 weiteren +Episoden.",,,,,"Osta Bloodin koko versio ja +saat kolme uutta episodia ja +kahdeksan pelkästään +verilöylyä varten +suunniteltua tasoa!",,,,,,,,"Compre a versão completa de Blood +para receber três novos episódios e +mais oito fases do modo BloodBath!",,Cumpără versiunea completă a jocului Blood pentru încă trei episoade și încă opt hărți pentru modul BloodBath!,, +"Be sure to call 800-3DREALMS today +and order the game. +You are only playing the first +four levels, and are missing most +of the game, weapons and monsters. +See the ordering information. +",BUYSW,,,,,"Du spielst nur die ersten 4 +Level und verpasst das Meiste +des Spiels, der Waffen und +Monster. +Rufe noch heute 800-3DREALMS +an und bestelle das Spiel. +",,,,,"Soita vielä tänään numeroon +800-3DREALMS ja tilaa peli. +Pelaat ainoastaan neljää +ensimmäistä tasoa ja jäät +paitsi suurimmasta osasta +peliä, sen aseista ja hirviöistä. +Katso tilausohjeet.",,,,,,,,"Não esqueça de ligar para 800-3DREALMS +hoje mesmo para adquirir o jogo. +Você está jogando somente as primeiras +quatro fases e perdendo a maior parte +do jogo, com mais armas e monstros. +Confira as informações de encomenda.",,"Sună la 800-3DREALMS astăzi pentru a comanda jocul. Joci doar primele patru nivele și îți lipsesc majoritatea hărților, armelor, și monștrilor. Verifică informațiile pentru a comanda.",, +"Loading and saving games +not supported +in this demo version of Blood.","BLOOD_SW_BLOCK +",not used,,,,"Laden und Speichern ist in +dieser Demoversion von +Blood nicht gestattet.",,,,,"Pelien lataaminen ja tallentaminen +ei ole tuettu Bloodin demoversiossa.",,,,,,,,"Não é possível carregar +e salvar partidas nesta +versão demo de Blood.",,Salvarea și încărcarea jocului nu este suportată de această versiune demo a jocului Blood.,, Are you sure you want to quit this game?,CONFIRM_QUITMSG,,,,Přeješ si odejít?,"Bist du dir sicher, dass du gehen willst?",,"Ĉu vi certas, ke vi volas ĉesi?",¿Estás segur@[ao_esp] que quieres salir?,,Haluatko varmasti lopettaa?,Êtes vous sûr de vouloir quitter ?,Biztos vagy benne hogy ki akarsz lépni?,Sei sicuro di voler abbandonare?,本当に終了するのか?,정말 종료하시겠습니까?,Weet je zeker dat je wilt stoppen?,Czy jesteś pewien że chcesz wyjść?,Tem certeza que quer sair?,Tens a certeza que queres sair?,Ești sigur că vrei să ieși din joc?,Вы действительно желаете выйти?,Да ли сте сигурни да желите да одустанеш? -Reset controls to defaults?,CONFIRM_CTRL1,,,,,Steuerung auf Standard zurücksetzen?,,,,,Haluatko palauttaa oletusohjaukset?,,,,,,,,,,Revenire la schema de control implicită?,, -Reset controls to classic defaults?,CONFIRM_CTRL2,,,,,Steuerung auf klassischen Standard zurücksetzen?,,,,,Haluatko palauttaa alkuperäiset oletusohjaukset?,,,,,,,,,,Revenire la schema de control clasică?,, -Reset controls to left-handed defaults?,CONFIRM_CTRL3,,,,,Steuerung auf linkshändigen Standard zurücksetzen?,,,,,Haluatko palauttaa vasenkätisen oletusohjaukset?,,,,,,,,,,Revenire la schema de control pentru stângaci?,, -Say:,TXT_SAY,,,,Říct:,Sage:,Πές:,Diru:,,,Sano:,Parler:,Üzenet:,Parla:,発言:,,Zeg:,Powiedz:,Fala:,Diz:,Vorbește:,Чат:,Пиши: -,Obituaries,,,,,,,,,,,,,,,,,,,,,, -%k boned %o like a fish,TXT_OBITUARY1,"Currently not used, still exist in raw form.",,,%o byl@[ao_cs] vykoštěn@[ao_cs] jako ryba hráčem %k,%k hat %o zerlegt wie einen Fisch,,%k senostigis %o kiel fiŝon,%k deshuesó a %o como a un pescado,,%k perkasi %o paran kuin kalan,%k désossa %o comme un poisson,%k kifilézte %o -t mint a halat,%k ha dissossato %o come un pesce,%k は %o の骨を魚のように引っこ抜いた。,%k 은(는) %o 의 뼈를 발랐다.,%k uitgebeend %o zoals een vis,%k odfiletował@[ao_pl] %o jak rybę,%k desossou %o como um peixe,,,Игрок %k пересчитал косточки игрока %o,%k је очистио %o као рибу -%k castrated %o,TXT_OBITUARY2,,,,%o byl@[ao_cs] vykastrován@[ao_cs] hráčem %k,%k hat %o kastriert,,%k kastris %o,%k castró a %o,,%k kastroi %o paran,%k castra %o,%k kasztrálta %o -t,%k ha castrato %o,%k は %o を去勢した。,%k 은(는) %o 을(를) 거세시켰다.,%k gecastreerd %o,%k wykastrował@[ao_pl] %o,%k castrou %o,,,Игрок %k кастрировал игрока %o,%k је кастрирао %o -%k creamed %o,TXT_OBITUARY3,,,,%o byl@[ao_cs] rozšlehán@[ao_cs] hráčem %k,%k hat %o eingeseift,,%k kremigis %o,%k cremó a %o,,%k kermasi %o paran,%k a battu %o à plate couture ,%k elkente %o -t,%k ha cremato %o,%k は %o に反吐ブチ撒けさせた。,%k 은(는) %o 을(를) 양념시켰다.,%k romed %o,%k spienił@[ao_pl] %o,%k fez creme de %o,,,Игрок %k взбил игрока %o,%k је истукао %o -%k decimated %o,TXT_OBITUARY4,,,,%o byl@[ao_cs] zdecimován@[ao_cs] hráčem %k,%k hat %o dezimiert,,%k detruegis %o,%k diezmó a %o,,%k hävitti %o paran,%k a décimé %o,%k megtizedelte %o -t,%k ha decimato %o,%k は %o の居場所を間引いた。,%k 은(는) %o 을(를) 망가뜨렸다.,%k gedecimeerd %o,%k przetrzebił@[ao_pl] %o,%k decimou %o,,,Игрок %k скосил игрока %o,%k је десетковао %o -%k destroyed %o,TXT_OBITUARY5,,,,%o byl@[ao_cs] zničen@[ao_cs] hráčem %k,%k hat %o zerstört,,%k detruis %o,%k destruyó a %o,,%k tuhosi %o paran,%k a détruit %o,%k elpusztította %o -t,%k ha distrutto %o,%k は %o を完全に破壊した。,%k 은(는) %o 을(를) 파괴했다.,%k vernietigd %o,%k zniszczył@[ao_pl] %o,%k destruiu %o,,,Игрок %k уничтожил игрока %o,%k је уништио %o -%k diced %o,TXT_OBITUARY6,,,,%o byl@[ao_cs] nakrájen@[ao_cs] na kostičky hráčem %k,%k hat %o in Würfel zerteilt,,%k diskubigis %o,%k picó en cubitos a %o,,%k pilkkosi %o paran,%k a coupé en dés %o,%k felkockázta %o -t,%k ha tagliato a cubetti %o,%k は %o を賽の目に切った。,%k 은(는) %o 을(를) 잘게 잘게 썰었다.,%k in blokjes gesneden %o,%k pokroił@[ao_pl] w kostkę %o,%k fez picadinho de %o,%k cortou %o,,Игрок %k разрезал игрока %o,%k је исецкао %o -%k disembowled %o,TXT_OBITUARY7,,,,%o byl@[ao_cs] vykuchán@[ao_cs] hráčem %k,%k hat %o ausgeweidet,,%k sentripigis %o,%k destripó a %o,,%k suolisti %o paran,%k a étripé %o,%k kibelezve,%k ha smembrato %o,%k は %o の臓物を引きずり出した。,%k 은(는) %o 의 내장을 도려냈다.,%k van de ingewanden gehaald %o,%k wypatroszył@[ao_pl] %o,%k estripou %o,,,Игрок %k выпотрошил игрока %o,%k је ампутирао %o -%k flattened %o,TXT_OBITUARY8,,,,%o byl@[ao_cs] zplacatěn@[ao_cs] hráčem %k,%k hat %o dem Erdboden gleichgemacht,,%k platigis %o,%k aplanó a %o,,%k lyttäsi %o paran,%k a aplati %o,%k kilapítva,%k ha schiacciato %o,%k は %o をぶっ潰した。,%k 은(는) %o 의 코를 납작하게 만들었다.,afgevlakt %k afgevlakt %o,%k rozpłaszczył@[ao_pl] %o,%k achatou %o,%k espalmou %o,,Игрок %k сплюснул игрока %o,%k је изравнао %o -%k gave %o Anal Justice,TXT_OBITUARY9,,,,%o utržil@[ao_cs] anální spravedlnost od hráče %k,%k hat %o anale Gerechtigkeit gegeben,,%k donis %o puga ĵustico,%k le dió Justicia Anal a %o,,%k jakoi %o paralle anaalioikeutta,%k a rendu une justice anale a %o,%k %o -nak Anális Igazságot adott,%k ha dato a %o Giustizia Anale,%k は %o のケツにぶち込んだ。,%k 은(는) %o 에게 홍콩행을 보냈다.,%k gaf %o Anaalrechtvaardigheid,%k dał@[ao_pl] %o Analną Sprawiedliwość,%k deu Justiça Anal para %o,,,Игрок %k устроил Анальное Правосудие игроку %o,%k је дао %o аналну правду -%k gave AnAl MaDnEsS to %o,TXT_OBITUARY10,,,,%o utrpěl@[ao_cs] AnÁlNí ŠíLeNsTvÍ od hráče %,%k gab %o AnAlEn WaHnSiNn,,%k donis pUgAn frEnEzOn al %o,%k le dió LoCuRa AnAl a %o,,%k teki %o paran AnAaLiHuLlUkSi,%k a donné la FOLIE ANALE a %o,%k %o -nak Seggbe Durrantott,%k ha dato FoLlIa AnAle a %o,%k は %o のケツをガバガバにした。,%o 은(는) %k 의 찰진 맛을 보았다.,%k gaf AnAl MaDnEs aan %o,%k dał@[ao_pl] %o AnAlNe SzAlEńStWo ,%k deu LoUcUrA aNaL para %o,,,Игрок %k устроил АнАЛ КаРнаВаЛ игроку %o,%k је дао АнАлНо ЛуДиЛо %o -%k killed %o,TXT_OBITUARY11,,,,%o byl@[ao_cs] zabit@[ao_cs] hráčem %k,%k hat %o getötet,,%k mortigis %o,%k mató a %o,,%k tappoi %o paran,%k a tué %o,%k kicsinálta %o -t,%k ha ucciso %o,%k は %o をブッ殺した。,%k 은(는) %o 을(를) 죽였다.,%k gedood %o,%k zabił@[ao_pl] %o,%k matou %o,,,Игрок %k убил игрока %o,%k је убио %o -%k made mincemeat out of %o,TXT_OBITUARY12,,,,%o byl@[ao_cs] namelen@[ao_cs] hráčem %k,%k hat %o zu Hackfleisch verarbeitet,,%k faris mincemeat el %o,%k hizo picadillo de %o,,%k teki jauhelihaa %o parasta,%k a fait de la viande hachée de %o,%k darálthúst csinált %o -ból,%k ha triturato %o,%k は %o をミンチにした。,%o 은(는) %k 에 의해 분쇄됐다.,%k gemaakt gehakt vlees van %o,%k zrobił@[ao_pl] mięso mielone z %o,%k fez carne moída de %o,%k fez carne picada do %o,,Игрок %k сделал отбивную из игрока %o,%k је направио млевено месо од %o -%k massacred %o,TXT_OBITUARY13,,,,%o byl@[ao_cs] zmasakrován@[ao_cs] hráčem %k,%k hat %o niedergemetzelt,,%k masakris %o,%k masacró a %o,,%k verilöylytti %o parkaa,%k a massacré %o,%k lemészárolta %o -t,%k ha fatto di %o carne tritata,%k は %o を虐殺した。,%k 은(는) %o 을(를) 참살했다.,%k afgeslacht %o,%k zmasakrował@[ao_pl] %o,%k massacrou %o,,,Игрок %k устроил бойню игроку %o,%k је масакрирао %o -%k mutilated %o,TXT_OBITUARY14,,,,%o byl@[ao_cs] zmrzačen@[ao_cs] hráčem %k,%k hat %o verstümmelt,,%k mutilis %o,%k mutiló a %o,,%k silpoi %o paran,%k a mutilé %o,%k megcsonkította %o -t,%k ha massacrato %o,%k は %o をバラバラ死体にした。,%k 은(는) %o 의 팔다리를 절단했다.,%k verminkt %o,%k rozszarpał@[ao_pl] %o,%k mutilou %o,,,Игрок %k изуродовал игрока %o,%k је мутилирао %o -%k reamed %o,TXT_OBITUARY15,,,,%o byl@[ao_cs] proděravěn@[ao_cs] hráčem %k,%k hat %o aufgerieben,,%k reeldonis %o,%k escarió a %o,,%k porasi %o paran,%k a découpé en fines lamelles %o,%k seggbe rakta %o -t,%k ha squartato %o,%k は %o の穴を大きく広げた。,%k 은(는) %o 을(를) 크게 혼냈다.,%k geruimd %o,%k rozwiercił@[ao_pl] %o,%k esquartejou %o,,,Игрок %k просверлил игрока %o,%k је наоружао %o -%k ripped %o a new orifice,TXT_OBITUARY16,,,,%o má novou díru od hráče %k,%k hat %o eine neue Körperöffnung verpasst,,%k ŝiris %o novan orificion,%k le hizo a %o un nuevo orificio,,%k repi %o paralle uuden aukon,%k a ouvert un nouvel orifice a %o,,%k ha aperto a %o un altro orifizio,%k は %o を切り裂いて新しい穴を作ってあげた。,%k 은(는) %o 을(를) 죽여 뜯어서 작품을 만들었다.,%k gescheurd %o een nieuwe doorlaatopening,%k rozerwał@[ao_pl] %o nowy otwór,%k abriu um novo orifício em %o,,,Игрок %k проделал новое отверстие в игроке %o,%k је исцепао %o нови отвор -%k slaughtered %o,TXT_OBITUARY17,,,,%o byl@[ao_cs] zavražděn@[ao_cs] hráčem %k,%k hat %o geschlachtet,,%k buĉis %o,%k sacrificó a %o,,%k teurasti %o paran,%k a meurtri %o,%k lemészárolta %o -t,%k ha macellato %o,%k は %o を屠殺した。,%o 은(는) %k 에 의해 도살당했다.,%k geslacht %o,%k zarżn@[irreg_2_pl] %o,%k abateu %o,,,Игрок %k устроил резню игроку %o,%k је заклао %o -%k smashed %o,TXT_OBITUARY18,,,,%o byl@[ao_cs] zmlácen@[ao_cs] hráčem %k,%k hat %o zerklatscht,,%k frakasis %o,%k destrozó a %o,,%k murskasi %o paran,%k a enfoncé %o,%k földbe döngölte %o -t,%k ha distrutto %o,%k は %o をぶっ飛ばした。,%k 은(는) %o 을(를) 내팽개쳤다.,%k gebroken %o,%k stłukł@[ao_pl] %o,%k esmagou %o,,,Игрок %k размазал игрока %o,%k је поломио %o -%k sodomized %o,TXT_OBITUARY19,,,,Hráč %k se dopustil sodomie na hráči %o,%k hat %o sodomisiert,,%k sodomizata %o,%k sodomizó a %o,,%k anaaliraiskasi %o paran,%k y a sodomisé n %o,%k szodomizálta %o -t,%k ha sodomizzato %o,%o は %k にカマを掘られた。 ,%o 은(는) %k 을(를) 위해 등을 보였다.,%k gesodomiseerd %o,%k spenetrował@[ao_pl] %o,%k sodomizou %o,,,Игрок %k содомировал игрока %o,%k је изјебао %o -%k splattered %o,TXT_OBITUARY20,,,,%o byl@[ao_cs] rozplesknut@[ao_cs] hráčem %k,%k hat %o zerspritzt,,%k disĵetis %o,%k roció a %o,,%k roiski %o paran yltympäri,%k a explosé de %o,%k szétloccsantotta %o -t,%k ha spiaccicato %o,%k は %o にばら撒かれた。,%k 은(는) %o 을(를) 박살냈다.,%k gespat %k gespetterd %o,%k rozbryzgał@[ao_pl] %o,%k explodiu %o,,,Игрок %k разбрызгал игрока %o,%k је спљоштио %o -%k squashed %o,TXT_OBITUARY21,,,,%o byl@[ao_cs] rozmáčknut@[ao_cs] hráčem %k,%k hat %o zerquetscht,,%k premplatigis %o,%k aplastó a %o,,%k litisti %o paran,%k a écrabouillé %o,%k szétnyomta %o -t mint a csótányt,%k ha schiacciato %o,%k は %o に潰された。,%k 은(는) %o 을(를) 짓이겼다.,%k geplet %k geplet %o,%k zmiażdżył@[ao_pl] %o,%k espatifou %o,,,Игрок %k расплющил игрока %o,%k је згњечио %o -%k throttled %o,TXT_OBITUARY22,,,,%o byl@[ao_cs] zaškrcen@[ao_cs] hráčem %k,%k hat %o erdrosselt,,%k ekbruligis %o,%k aceleró a %o,,%k polki %o paran,%k a étouffé %o,,%k ha strozzato %o,%k は %o に絞られた。,%k 은(는) %o 을(를) 목 졸라 죽였다.,%k gewurgt %o,"%k udusił@[ao_pl] %o -",%k estrangulou %o,,,Игрок %k задушил игрока %o,%k је угушио %o -%k wasted %o,TXT_OBITUARY23,,,,%o byl@[ao_cs] zničen@[ao_cs] hráčem %k,%k hat %o verbraucht,,%k malŝparis %o,%k desechó a %o,,%k kulutti %o paran,%k a décharné %o,,%k ha distrutto %o,%k は %o に消された。,%k 은(는) %o 을(를) 쓰레기처럼 내다 버렸다.,%k verspild %o,%k roztrwonił@[ao_pl] %o,%k detonou %o,,,Игрок %k замочил игрока %o,%k је убио %o -%k body bagged %o,TXT_OBITUARY24,,,,Hráč %k narval %o@[psn1_cs] tělo do pytle,%k hat %o eingesackt,,%k korpo malplenigis %o,%k embolsó a %o,,%k kääri %o paran ruumispussiin,%k a placé %o dans son linceul,,%k ha mandato %o all'obitorio,%k は %o を死体袋にした。,%k 은(는) %o 의 장례식을 치렀다.,%k lichaam met zakje %o,%k spakował@[ao_pl] %o do torby na zwłoki,%k mandou %o para o necrotério,,,Игрок %k упаковал игрока %o в мешок для трупов,%k је умртвио %o -%k sent %o to Hell,TXT_OBITUARY25,,,,%o byl@[ao_cs] poslán@[ao_cs] do pekla hráčem %k,%k hat %o zur Hölle fahren lassen,,%k sendis %o al Infero,%k envió a %o al infierno,,%k lähetti %o paran helvettiin,%k a envoyé %o en enfer,,%k ha spedito %o all'Inferno,%k は %o を地獄に送った。,%o 은(는) %k 덕에 지옥으로 돌아갔다.,%k verzonden %o naar de hel,%k wysłał@[ao_pl] %o do Piekła,%k mandou %o para o Inferno,,,Игрок %k отправил в Ад игрока %o,%k је послао %o до Врага -%k toasted %o,TXT_OBITUARY26,,,,%o byl@[ao_cs] upečen@[ao_cs] hráčem %k,%k hat %o geröstet,,%k tostita %o,%k tostó a %o,,%k käristi %o paran,%k a grillé %o,%k megpirította %o -t,%k ha arrostito %o,%k は %o を焼却した。,%o 은(는) %k 덕에 맛있게 구워졌다.,%k geroosterd %o,%k stostował@[ao_pl] %o,%k tostou %o,,,Игрок %k поджарил игрока %o,%k је тостирао %o -%k snuffed %o,TXT_OBITUARY27,,,,%o byl@[ao_cs] rozsápán@[ao_cs] hráčem %k,%k hat %o vernichtet,,%k snufis %o,%k aspiró a %o,,%k sammutti %o paran,%k a crevé %o,,%k ha spento %o,%k は %o を処刑した。,%o 은(는) %k 에 의해 짓눌려졌다.,%k gesnuffeld %o,%k powąchał@[ao_pl] %o,%k apagou %o,,,Игрок %k прикончил игрока %o,%k је угасио %o -%k hosed %o,TXT_OBITUARY28,,,,%o byl@[ao_cs] odstříknut@[ao_cs] hráčem %k,%k hat %o eingetütet,,%k bagigis %o,%k se cargó a %o,,%k pesi %o paran,%k a arrosé %o,,%k l'ha fatta sopra %o,%k は %o にぶっかけた。,%k 은(는) %o 을(를) 패배로 씻겼다.,%k slang %o,%k załatwił@[ao_pl] %o,%k metralhou %o,,,Игрок %k расстрелял игрока %o,%k је упскао %o -%k sprayed %o,TXT_OBITUARY29,,,,%o byl@[ao_cs] postříkán@[ao_cs] hráčem %k,%k hat %o pulverisiert,,%k ŝprucigis %o,%k pulverizó a %o,,%k ruiskutti %o paran,%k a pulvérise %o,,%k ha vaporizzato %o,%k は %o を撒き散らした。,%o 의 피는 %k 의 물감으로 쓰였다.,%k gespoten %o,%k rozpryskał@[ao_pl] %o,%k pulverizou %o,,,Игрок %k распылил игрока %o,%k је испрскао %o -%k made dog meat out of %o,TXT_OBITUARY30,,,,%o byl@[ao_cs] hozen@[ao_cs] psům hráčem %k,%k hat Hundefutter aus %o gemacht,,%k faris hundan viandon el %o,%k hizo comida para perro de %o,,%k teki %o parasta koiranruokaa,%k a fait de la pâtée pour chien de %o,,%k ha fatto di %o polpette,%k は %o を犬の餌にした。,%k 은(는) %o 로 개밥을 만들었다.,%k gemaakt hondenvlees van %o,%k zrobił@[ao_pl] mięso dla psów z %o,%k fez almôndegas de %o,,,Игрок %k скормил псам игрока %o,%k је направио псеће месо од %o -%k beat %o like a cur,TXT_OBITUARY31,,,,%o byl@[ao_cs] zmlácen@[ao_cs] jako pes hráčem %k,%k hat %o wie einen Hund geschlagen,,%k batis %o kiel kur,%k pateó a %o como a un perro callejero,,%k huitoi %o parkaa kuin rakkia,%k a battu %o,,%k ha battuto %o come un cane,%k は %o を狂犬の様に扱った。,%o 은(는) %k 에게 똥개처럼 맞았다.,%k beat %o als een hond,%k pobił@[ao_pl] %o jak kundla,%k espancou %o como um cachorro,%k espancou %o como um cão,,Игрок %k сделал игрока %o как худую свинью,%k је превио %o ко мачку -%o is excrement,TXT_SELFOBIT1,,,,%o je exkrement,%o wurde zu Exkrement verarbeitet,,%o estas ekskremento,%o es excremento,,%o on ulostetta,%o est une merde,,%o è un escremento,%o はもはや排泄物のようだ。,%o 은(는) 배설물이 되었다.,%o is uitwerpselen,%o został@[ao_pl] odpadkami,%o virou escremento,,,%o теперь экскремент,%o је сада измет -%o is hamburger,TXT_SELFOBIT2,,,,%o je hamburger,%o ist Hamburger,,%o estas hamburgero,%o es una hamburguesa,,%o on hakkelusta,%o est un hamburger,,%o è un hamburger,%o はハンバーガーになった。,%o 은(는) 고기 반죽이 되었다.,%o is hamburger,%o został@[ao_pl] hamburgerem,%o virou hamburguer,,,%o теперь гамбургер,%o је сада пљескавица -%o suffered scrotum separation,TXT_SELFOBIT3,,,,%o prodělal@[ao_cs] separaci šourku,%os Eier wurden gebraten,,%o suferis skrotan disigon,%o sufrió separación de escroto,,%o kärsii kivespussin erotuksesta,%o a souffert d'une séparation du scrotum,,%o ha subito la separazione dello scroto,%o の陰嚢は剥離していた。,%o 은(는) 고자가 되었다.,%o leed aan scrotumscheiding...,%o doznał@[ao_pl] oddzielenia moszny,%o sofreu separação escrotal,,,%o страдает от потери тестикул,%o му је исечена патка -%o volunteered for population control,TXT_SELFOBIT4,,,,%o se zůčastnil@[ao_cs] čistky obyvatelstva,%o hat sich freiwillig zur Bevölkerungskontrolle gemeldet,,%o volontulis por loĝantarkontrolo,%o fue voluntario para control de población,,%o ilmoittautui vapaaehtoiseksi väestönhallintaan,%o s'est proposé pour un contrôle de la population,,%o si è offerto per il controllo della popolazione,%o は人口削減政策の実験台に志願した。,%o 은(는) 자연에 의해 낙태 당했다.,%o vrijwilliger voor bevolkingscontrole,%o zgłosił@[ao_pl] się na kontrolę ludności,%o se voluntariou para o controle populacional,%o se voluntariou para o controlo populacional,,%o борется с перенаселением,%o је волунтирао за контролу популације -%o has suicided,TXT_SELFOBIT5,,,,%o spáchal@[ao_cs] sebevraždu,%o hat Selbstmord begangen,,%o sin mortigis,%o se ha suicidado,,%o on tehnyt itsemurhan,%o s'est suicidé,%o öngyilkos lett,%o si è suicidato,%o は勝手にくたばった。,%o 은(는) 한심하게 자살했다.,%o heeft zelfmoord gepleegd.,%o popełnił@[ao_pl] samobójstwo,%o se suicidou,%o suicidou-se,,Игрок %o самоубился,%o је убио самог себе -%o received the Darwin Award,TXT_SELFOBIT6,,,,%o dostal@[ao_cs] darwinovu cenu,%o hat den Darwinpreis erhalten,,%o ricevis la Darwin-Premion,%o recibió el premio Darwin,,%o sai Darwin-palkinnon,%o a recu la médaille Darwin,És a Darwin Díj nyertese : %o,%o ha ricevuto il Darwin Award,%o にはダーウィン賞が授与された。,%o 은(는) 다윈상을 받을 자격이 있다.,%o ontving de Darwin Award....,%o otrzymał@[ao_pl] Nagrodę Darwina,%o ganhou o Prêmio Darwin,,,Игрок %o получил премию Дарвина,%o је добио Дарвиново признање -,Duke Nukem Script quotes,,,,,,,,,,,,,,,,,,,,,, -Auto Aiming,AUTO AIMING,,,,,Autom. Zielen,,,Puntería autom.,,Automaattitähtäys,Visée auto,,Mira automatica,自動照準,,,,Automira,,Țintire automată,Автонаведение, -Show Map: OFF,SHOW MAP: OFF,,,,,Karte Zeigen: Aus,,,Ver Mapa DESACTIVADO,,Kartta: POIS PÄÄLTÄ,Affich. carte : non,,Mostra mappa: no,マップの表示: オフ,,,,Mapa: desl.,,Afișare harta: OPRIT,Показать карту: откл, +Reset controls to defaults?,CONFIRM_CTRL1,,,,,Steuerung auf Standard zurücksetzen?,,,,,Haluatko palauttaa oletusohjaukset?,,,,,,,,Redefinir controles para o modo padrão?,,Revenire la schema de control implicită?,, +Reset controls to classic defaults?,CONFIRM_CTRL2,,,,,Steuerung auf klassischen Standard zurücksetzen?,,,,,Haluatko palauttaa alkuperäiset oletusohjaukset?,,,,,,,,Redefinir controles para o modo padrão clássico?,,Revenire la schema de control clasică?,, +Reset controls to left-handed defaults?,CONFIRM_CTRL3,,,,,Steuerung auf linkshändigen Standard zurücksetzen?,,,,,Haluatko palauttaa vasenkätisen oletusohjaukset?,,,,,,,,Redefinir controles para o modo padrão canhoto?,,Revenire la schema de control pentru stângaci?,, +,,Duke Nukem Script quotes,,,,,,,,,,,,,,,,,,,,, +Auto Aiming,AUTO AIMING,,,,,Autom. Zielen,,,Puntería autom.,,Automaattitähtäys,Visée auto,,Mira automatica,自動照準,,,,Mira Automática,,Țintire automată,Автонаведение, +Show Map: OFF,SHOW MAP: OFF,,,,,Karte Zeigen: Aus,,,Ver Mapa DESACTIVADO,,Kartta: POIS PÄÄLTÄ,Affich. carte : non,,Mostra mappa: no,マップの表示: オフ,,,,Mostrar Mapa: Desativado,,Afișare harta: OPRIT,Показать карту: откл, Activated,ACTIVATED,,,,,Aktiviert,,,Activado,,Käytössä,Activé,,Attivo,有効にした,,,,Ativou,,Activat,Активировано, Portable Medkit,PORTABLE MEDKIT,,,,,Tragbarer Verbandskasten,,,Botiquín portátil,,Lääkintälaukku,Médikit portable,,Medkit portatile,携帯医療キット,,,,Kit médico,,Kit Prim-Ajutor Portabil,Аптечка, Locked,LOCKED,,,,,Verriegelt,,,Bloqueada,,Lukittu,Verrouillée,,Bloccato,ロックされている,,,,Trancada,,Încuiat,Закрыто, @@ -902,12 +267,12 @@ A Secret Place!,A SECRET PLACE!,,,,,Ein Geheimversteck!,,,¡Un lugar secreto!,,S Squish!,SQUISH!,,,,,Zerquetscht!,,,¡Chof!,,Liiskattu!,Splurt !,,Squish!,グシャッ!,,,,Esmagado!,,Strivit!,Хыщь!, All Doors Unlocked,ALL DOORS UNLOCKED,,,,,Alle Türen Aufgeschlossen,,,Todas las puertas desbloqueadas,,Kaikki ovet avattu,Toutes portes déverrouillées,,Tutte le porte sbloccate,すべてのドアがアンロックされた,,,,Todas as portas destrancadas,,Toate Ușile Deschise!,Все двери открыты, Used Steroids,USED STEROIDS,,,,,Steroide Verwendet,,,Has usado esteroides,,Steroidit otettu,Stéroïdes pris,,Hai usato steroidi,ステロイドを使用した,,,,Usou esteroides,,Utilizat Steroizi,Приняты стероиды, -Press Space To Restart Level,PRESS SPACE TO RESTART LEVEL,,,,,"Drücke ""Verwenden"", um das Level neu zu starten",,,Pulsa usar para reiniciar el nivel,,Paina välilyöntiä aloittaaksesi tason alusta,Appuie sur utiliser pour recommencer le niveau,,Premi usa per riavviare il livello,「使用する」を押してレベルを最初からやり直す,,,,Aperte usar para reiniciar fase,,Apasă Space pentru a Reîncepe,Для перезапуска уровня нажмите «использовать», +Press Space To Restart Level,PRESS SPACE TO RESTART LEVEL,,,,,"Drücke ""Verwenden"", um das Level neu zu starten",,,Pulsa usar para reiniciar el nivel,,Paina välilyöntiä aloittaaksesi tason alusta,Appuie sur utiliser pour recommencer le niveau,,Premi usa per riavviare il livello,「使用する」を押してレベルを最初からやり直す,,,,"Aperte ""usar"" para reiniciar fase",,Apasă Space pentru a Reîncepe,Для перезапуска уровня нажмите «использовать», Ammo For Devastator,AMMO FOR DEVASTATOR,,,,,Munition für Devastator,,,¡Munición de devastadora!,,Hävitysaseen ammuksia,Munitions ravageur !,,Munizioni per devastatore!,デバステーター用弾薬,,,,Munição para devastadora,,Muniție pentru Devastator,Боеприпасы для уничтожителя!, Deactivated,DEACTIVATED,,,,,Deaktiviert,,,Desactivado,,Pois käytöstä,Désactivé,,Disattivo,無効になった,,,,Desativado,,Dezactivat,Деактивировано, Switch Operated Only!,SWITCH OPERATED ONLY!,,,,,Nur mit Hebel zu bedienen!,,,Solo funciona con interruptor,,Vain kytkimen välityksellä!,Uniquement activé par interrupteur !,,È necessario l'interruttore!,起動中のものだけを切り替える!,,,,Ativado por acionador!,,Operat doar de la buton!,Только с помощью переключателя!, -God Mode: ON,GOD MODE: ON,,,,,Gottmodus: An,,,Modo Dios ACTIVADO,,Kuolemattomuus: PÄÄLLÄ,God mode : oui,,Modalità dio : sì,ゴッドモード: オン,,,,Modo deus: lig.,,Modul Invincibil: Pornit,Режим бога: вкл, -God Mode: OFF,GOD MODE: OFF,,,,,Gottmodus: Aus,,,Modo Dios DESACTIVADO,,Kuolemattomuus: POIS PÄÄLTÄ,God mode : non,,Modalità dio : no,ゴッドモード: オフ,,,,Modo deus: desl.,,Modul Invincibil: Oprit,Режим бога: откл, +God Mode: ON,GOD MODE: ON,,,,,Gottmodus: An,,,Modo Dios ACTIVADO,,Kuolemattomuus: PÄÄLLÄ,God mode : oui,,Modalità dio : sì,ゴッドモード: オン,,,,Modo deus: lig.,,Modul Invincibil: PORNIT,Режим бога: вкл, +God Mode: OFF,GOD MODE: OFF,,,,,Gottmodus: Aus,,,Modo Dios DESACTIVADO,,Kuolemattomuus: POIS PÄÄLTÄ,God mode : non,,Modalità dio : no,ゴッドモード: オフ,,,,Modo deus: desl.,,Modul Invincibil: OPRIT,Режим бога: откл, Atomic Health!,ATOMIC HEALTH!,,,,,Atomare Gesundheit!,,,¡Salud atómica!,,Atomiterveys!,Santé atomique !,,Salute atomica!,アトミック回復薬!,,,,Vida atômica!,,Sănătate Atomică!,Атомное здоровье!, Crosshair: ON,CROSSHAIR: ON,,,,,Fadenkreuz: An,,,Mira ACTIVADO,,Tähtäin: PÄÄLLÄ,Réticule : oui,,Mirino: sì,十字線: オン,,,,Mira: lig.,,Țintă: Activată,Прицел: вкл, Crosshair: OFF,CROSSHAIR: OFF,,,,,Fadenkreuz: Aus,,,Mira DESACTIVADO,,Tähtäin: POIS PÄÄLTÄ,Réticule : non,,Mirino: no,十字線: オフ,,,,Mira: desl.,,Țintă: Dezactivată,Прицел: откл, @@ -933,16 +298,16 @@ Press F1 For Help,Press F1 for Help,,,,,Drücke F1 für Hilfe,,,Presione F1 para Jetpack,JETPACK,,,,,Jetpack,,,Propulsor,,Rakettireppu,Jetpack,,Jetpack,ジェットパック,,,,Jato,,Jetpack,Джетпак, Body Suit,BODY SUIT,,,,,Raumanzug,,,Traje espacial,,Turvapuku,Combi. spatiale,,Tuta,ボディースーツ,,,,Traje espacial,,Costum,Костюм, Access Card,ACCESS CARD,,,,,Zugangskarte,,,Tarjeta de acceso,,Avainkortti,Carte d'accès,,Carta d'accesso,アクセスカード,,,,Cartão de acesso,,Card de Acces,Карта доступа, -Mouse Aiming Off,MOUSE AIMING OFF,,,,,Mit Maus zielen: Aus,,,Apuntar con ratón DESACTIVADO,,Hiiritähtäys pois päältä,Visée souris : non,,Puntamento col mouse: no,マウスエイム オフ,,,,Mira de mouse desl.,,Țintire cu Mouse: Pornită,Наведение мышью вкл, -Mouse Aiming On,MOUSE AIMING ON,,,,,Mit Maus zielen: An,,,Apuntar con ratón ACTIVADO,,Hiiritähtäys päällä,Visée souris : oui,,Puntamento col mouse: sì,マウスエイム オン,,,,Mira de mouse lig.,,Țintire cu Mouse: Oprită,Наведение мышью откл, +Mouse Aiming OFF,MOUSE AIMING OFF,,,,,Mit Maus zielen: Aus,,,Apuntar con ratón DESACTIVADO,,Hiiritähtäys pois päältä,Visée souris : non,,Puntamento col mouse: no,マウスエイム オフ,,,,Mira de mouse desl.,,Țintire cu Mouse: PORNITĂ,Наведение мышью вкл, +Mouse Aiming ON,MOUSE AIMING ON,,,,,Mit Maus zielen: An,,,Apuntar con ratón ACTIVADO,,Hiiritähtäys päällä,Visée souris : oui,,Puntamento col mouse: sì,マウスエイム オン,,,,Mira de mouse lig.,,Țintire cu Mouse: OPRITĂ,Наведение мышью откл, Cheat Code: Unrecognized,CHEAT CODE: UNRECOGNIZED,,,,,Cheatcode: nicht erkannt,,,Código de truco no reconocido,,Huijauskomento: tunnistamaton,Code triche : inconnu,,Cheat code: non riconosciuto,チートコード:・・認識不能,,,,Código de trapaça: inválido,,Cod: Nerecunoscut,Чит-код: не распознан, -Holoduke On,HOLODUKE ON,,,,,Holoduke: An,,,Holoduke ACTIVADO,,Holo-Duke päällä,Holoduke : oui,,Holoduke sì,ホロDUKE オン,,,,Holoduke lig.,,Holoduke Pornit,Голо-duke вкл, -Holoduke Off,HOLODUKE OFF,,,,,Holoduke: Aus,,,Holoduke DESACTIVADO,,Holo-Duke pois päältä,Holoduke : non,,Holoduke no,ホロDUKE オフ,,,,Holoduke desl.,,Holoduke Oprit,Голо-duke откл, +Holoduke ON,HOLODUKE ON,,,,,Holoduke: An,,,Holoduke ACTIVADO,,Holo-Duke päällä,Holoduke : oui,,Holoduke sì,ホロDUKE オン,,,,Holoduke lig.,,Holoduke PORNIT,Голо-duke вкл, +Holoduke OFF,HOLODUKE OFF,,,,,Holoduke: Aus,,,Holoduke DESACTIVADO,,Holo-Duke pois päältä,Holoduke : non,,Holoduke no,ホロDUKE オフ,,,,Holoduke desl.,,Holoduke OPRIT,Голо-duke откл, Holoduke Not Found Yet!,HOLODUKE NOT FOUND YET!,,,,,Holoduke noch nicht gefunden!,,,Holoduke no descubierto,,Holo-Duke vielä löytämättä!,Holoduke non trouvé !,,Holoduke non ancora trovato!,ホロDUKEはまだ持っていない!,,,,Holoduke não encontrado!,,Holoduke Negăsit!,Голо-duke еще не найден!, Jetpack Not Found Yet!,JETPACK NOT FOUND YET!,,,,,Jetpack noch nicht gefunden!,,,Propulsor no descubierto,,Rakettireppu vielä löytämättä!,Jetpack non trouvé !,,Jetpack non ancora trovato!,ジェットパックはまだ持っていない!,,,,Jato não encontrado!,,Jetpack Negăsit!,Джетпак еще не найден!, Holoduke,HOLODUKE,,,,,Holoduke,,,Holoduke,,Holo-Duke,Holoduke,,Holoduke,ホロDUKE,,,,,,Holoduke,Голо-duke, -Jetpack On,JETPACK ON,,,,,Jetpack: An,,,Propulsor ACTIVADO,,Rakettireppu päällä,Jetpack : oui,,Jetpack sì,ジェットパック オン,,,,Jato lig.,,Jetpack Pornit,Джетпак вкл, -Jetpack Off,JETPACK OFF,,,,,Jetpack: Aus,,,Propulsor DESACTIVADO,,Rakettireppu pois päältä,Jetpack : non,,Jetpack no,ジェットパック オフ,,,,Jato desl.,,Jetpack Oprit,Джетпак откл, +Jetpack ON,JETPACK ON,,,,,Jetpack: An,,,Propulsor ACTIVADO,,Rakettireppu päällä,Jetpack : oui,,Jetpack sì,ジェットパック オン,,,,Jato lig.,,Jetpack PORNIT,Джетпак вкл, +Jetpack OFF,JETPACK OFF,,,,,Jetpack: Aus,,,Propulsor DESACTIVADO,,Rakettireppu pois päältä,Jetpack : non,,Jetpack no,ジェットパック オフ,,,,Jato desl.,,Jetpack OPRIT,Джетпак откл, Chaingun Cannon!,CHAINGUN CANNON!,,,,,Minigun!,,,¡Cañón de cadena!,,Sarjatykki!,Canon mitrailleur !,,Cannone a rotaia!,チェーンガン キャノン!,,,,Canhão-metralhadora!,,Mitralieră!,Скорострельная пушка!, Pipebomb!,PIPEBOMB!,,,,,Rohrbombe!,,,¡Bomba de tubo!,,Putkipommi!,Bombe tuyau !,,Bomba tubo!,パイプ爆弾!,,,,Bomba tubo!,,Bombă Artizanală,Сву!, RPG!,RPG!,,,,,Panzerfaust!,,,¡Misil!,,Sinko!,,,,RPG!,,,,Rpg!,,RPG!,Рпг!, @@ -952,681 +317,671 @@ Freezethrower!,FREEZETHROWER!,,,,,Gefrierstrahler!,,,¡Congelador!,,Pakkasheitin Got Shrinker/Expander!,GOT SHRINKER/EXPANDER!,,,,,Schrumpf-/Wachskanone erhalten!,,,Tienes reductora/expansora,,Kutistin/Laajennin saatu!,"Minimiseur/maximiseur, ok !",,Hai il riduttore/espansore!,シュリンカー/エクスパンダーを入手した!,,,,Pegou encolhedor/aumentador!,,Ridicat Micșorător/Expansor,Есть уменьшитель/увеличитель!, Small Medkit: +10,SMALL MEDKIT: +10,,,,,Kleiner Verbandskasten: +10,,,Botiquín pequeño: +10,,Pieni lääkintäpakkaus: +10,Petit médikit : +10,,Medkit piccolo: +10,小型医療キット: +10,,,,Kit médico pequeno: +10,,Kit medical mic: 10%,Маленькая аптечка: +10, Large Medkit: +30,LARGE MEDKIT: +30,,,,,Grosser Verbandskasten: +30,,,Botiquín grande: +30,,Suuri lääkintäpakkaus: +30,Grand médikit : +30,,Medkit grande: +30,大型医療キット: +30,,,,Kit médico grande: +30,,Kit medical mare: 30%,Большая аптечка: +30, -Ammo For Chaingun Cannon!,AMMO FOR CHAINGUN CANNON!,,,,,Munition für Minigun!,,,¡Munición de cañón de cadena!,,Sarjatykin ammuksia!,Munitions canon mitrailleur !,,Munizioni per cannone a rotaia!,チェーンガン・キャノン用弾薬!,,,,Munição de canhão-metralhadora!,,,Боеприпасы для скорострельной пушки!, -Ammo For Rpg!,AMMO FOR RPG!,,,,,Munition für Panzerfaust!,,,¡Munición de misil!,,Singon ammuksia!,Munitions RPG !,,Munizioni per RPG!,RPG用弾薬!,,,,Munição de RPG!,,,Боеприпасы для рпг!, -Ammo For Pistol!,AMMO FOR PISTOL!,,,,,Munition für Pistole!,,,¡Munición de pistola!,,Pistoolin ammuksia!,Munitions pistolet !,,Munizioni per pistola!,ピストル用弾薬!,,,,Munição de pistola!,,,Боеприпасы для пистолета!, -Ammo For Freezethrower!,AMMO FOR FREEZETHROWER!,,,,,Munition für Gefrierstrahler!,,,¡Munición de congelador!,,Pakkasheittimen ammuksia!,Munitions lance-glace !,,Munizioni per congelatore!,冷気放射器用燃料!,,,,Munição de lança-gelo!,,,Боеприпасы для замораживателя!, -Boots Off,BOOTS OFF,,,,,Stiefel: Aus,,,Botas DESACTIVADOS,,Saappaat pois käytöstä,Bottes : non,,Stivali no,ブーツ オフ,,,,Botas deslig.,,,Сапоги откл, -Boots On,BOOTS ON,,,,,Stiefel: An,,,Botas ACTIVADOS,,Saappaat käytössä,Bottes : oui,,Stivali sì,ブーツ オン,,,,Botas lig.,,,Сапоги вкл, -Ammo For Shotgun,AMMO FOR SHOTGUN,,,,,Munition für Schrotflinte,,,¡Munición de escopeta!,,Haulikon ammuksia,Munitions fusil !,,Munizioni per fucile a pompa!,ショットガン用弾薬,,,,Munição de escopeta,,,Боеприпасы для дробовика!, -Blue Access Card Required,BLUE ACCESS CARD REQUIRED,,,,,Blaue Zugangskarte erforderlich,,,Necesitas tarjeta acceso azul,,Sininen avainkortti vaaditaan,Carte d'accès bleue requise,,Necessaria carta d'accesso blu,青いアクセスカードが必要,,,,Requer cartão azul,,,Нужна синяя карта доступа, -Red Access Card Required,RED ACCESS CARD REQUIRED,,,,,Rote Zugangskarte erforderlich,,,Necesitas tarjeta acceso roja,,Punainen avainkortti vaaditaan,Carte d'accès rouge requise,,Necessaria carta d'accesso rossa,赤いアクセスカードが必要,,,,Requer cartão vermelho,,,Нужна красная карта доступа, -Yellow Access Card Required,YELLOW ACCESS CARD REQUIRED,,,,,Gelbe Zugangskarte erforderlich,,,Necesitas tarjeta acceso amarilla,,Keltainen avainkortti vaaditaan,Carte d'accès jaune requise,,Necessaria carta d'accesso gialla,黄色いアクセスカードが必要,,,,Requer cartão amarelo,,,Нужна желтая карта доступа, -Weapon Lowered,WEAPON LOWERED,,,,,Waffe gesenkt,,,Arma bajada,,Ase laskettu,Arme baissée,,Arma abbassata,武器を下ろした,,,,Arma baixada,,,Оружие опущено, -Weapon Raised,WEAPON RAISED,,,,,Waffe gehoben,,,Arma levantada,,Ase nostettu,Arme levée,,Arma alzata,武器を構えた,,,,Arma erguida,,,Оружие поднято, -Protective Boots On,PROTECTIVE BOOTS ON,,,,,Schutzstiefel: An,,,Botas protectoras ACTIVADOS,,Turvasaappaat käytössä,Bottes de sécu : oui,,Stivali protettivi sì,保護ブーツ オン,,,,Botas protetoras lig.,,,Защитные сапоги вкл, -Scuba Gear On,SCUBA GEAR ON,,,,,Tauchausrüstung: An,,,Eq. submarinismo ACTIVADO,,Sukelluslaite käytössä,Combi. plongée : oui,,Attrezzatura da sub sì,スキューバギア オン,,,,Eq. de mergulho lig.,,,Акваланг вкл, -Space Suit On,SPACE SUIT ON,,,,,Raumanzug: An,,,Traje espacial ACTIVADO,,Avaruuspuku käytössä,Combi. spatiale : oui,,Tuta spaziale sì,宇宙服 オン,,,,Traje espacial lig.,,,Скафандр вкл, -Ammo For Shrinker,AMMO FOR SHRINKER,,,,,Munition für Schrumpfkanone!,,,¡Munición de reductora!,,Kutistimen ammuksia,Munitions minimiseur !,,Munizioni per riduttore!,シュリンカー用弾薬!,,,,Munição de encolhedor!,,,Боеприпасы для уменьшителя!, -Buy Major Stryker,BUY MAJOR STRYKER,,,,,Kauf Major Stryker,,,Compra Major Stryker,,Osta Major Stryker,Achat major stryker,,Compra major stryker,メジャーストライカーを購入する,,,,Compre major stryker,,,Купить большой бтр, -Mighty Foot Engaged,MIGHTY FOOT ENGAGED,,,,,Fusstritt aktiviert,,,Patadón activado,,Mahtava jalka otettu käyttöön,Puissant coup de pied activé,,Piede potente in uso,マイティーフットを起動,,,,Chute do poder ativado,,,Могучая нога активирована, -Weapon Mode On,WEAPON MODE ON,,,,,Waffenmodus: An,,,Modo arma ACTIVADO,,Asetila päällä,Mode arme : oui,,Modalità arma sì,武器モード オン,,,,Modo arma lig.,,,Режим оружия вкл, -Weapon Mode Off,WEAPON MODE OFF,,,,,Waffenmodus: Aus,,,Modo arma DESACTIVADO,,Asetila pois päältä,Mode arme : non,,Modalità arma no,武器モード オフ,,,,Modo arma desl.,,,Режим оружия откл, -Follow Mode Off,FOLLOW MODE OFF,,,,,Kartenverfolgungsmodus Aus,,,Modo de seguimiento de mapa DESACTIVADO,,Seurantatila pois päältä,Mode suivi carte : non,,Modalità mappa a scorrimento no,マップフォローモード オフ,,,,Modo seguir mapa desl.,,,Режим слежения на карте откл, -Follow Mode On,FOLLOW MODE ON,,,,,Kartenverfolgungsmodus An,,,Modo seguimiento de mapa ACTIVADO,,Seurantatila päällä,Mode suivi carte : oui,,Modalità mappa a scorrimento sì,マップフォローモード オン,,,,Modo seguir mapa lig.,,,Режим слежения на карте вкл, -Run Mode Off,RUN MODE OFF,,,,,Laufmodus: Aus,,,Modo Carrera DESACTIVADO,,Juoksutila pois päältä,Mode course : non,,Modalità corsa no,走行モード オフ,,,,Modo correr desl.,,,Режим бега откл, -Run Mode On,RUN MODE ON,,,,,Laufmodus: An,,,Modo Carrera ACTIVADO,,Juoksutila päällä,Mode course : oui,,Modalità corsa sì,走行モード オン,,,,Modo correr lig.,,,Режим бега вкл, -Devastator Weapon,DEVASTATOR WEAPON,,,,,Devastator,,,Arma devastadora,,Hävitysase,Arme ravageur,,Arma devastatore,デバステーターウェポン,,,,Arma devastadora,,,Уничтожитель, -Jet Pack,JET PACK,,,,,Jetpack,,,Propulsor,,Rakettireppu,,,,トパック,,,,Jato,,,Джетпак, -Airtank,AIRTANK,,,,,Atemluftflasche,,,Bombona,,Ilmasäiliö,Bonbonne d'air,,Serbatoio aria,エアタンク,,,,Tanque de ar,,,Аэротанк, -Music: ON,MUSIC: ON,,,,,Musik: An,,,Música ACTIVADO,,Musiikki: PÄÄLLÄ,Musique : oui,,Musica: sì,音楽: オン,,,,Música: lig.,,,Музыка: вкл, -Music: OFF,MUSIC: OFF,,,,,Musik: Aus,,,Música DESACTIVADO,,Musiikki: POIS PÄÄLTÄ,Musique : non,,Musica: no,音楽: オフ,,,,Música: desl.,,,Музыка: откл, -Scroll Mode: ON,SCROLL MODE: ON,,,,,Scrollmodus: An,,,Modo desplazamiento ACTIVADO,,Vieritystila: PÄÄLLÄ,Défilement : oui,,Modalità scorrimento: sì,スクロールモード: オン,,,,Modo rolagem: lig.,,,Режим прокрутки: вкл, -Scroll Mode: OFF,SCROLL MODE: OFF,,,,,Scrollmodus: Aus,,,Modo desplazamiento DESACTIVADO,,Vieritystila: POIS PÄÄLTÄ,Défilement : non,,Modalità scorrimento: no,スクロールモード: オフ,,,,Modo rolagem: desl.,,,Режим прокрутки: откл, -Brightness Level: Six,BRIGHTNESS LEVEL: SIX,,,,,Helligkeitsstufe: Sechs,,,Nivel de brillo: Seis,,Kirkkaustaso: kuusi,Niv. luminosité : six,,Livello luminosità: 6,輝度レベル: 6,,,,Claridade: seis,,,Уровень яркости: шесть, -Brightness Level: Seven,BRIGHTNESS LEVEL: SEVEN,,,,,Helligkeitsstufe: Sieben,,,Nivel de brillo: Siete,,Kirkkaustaso: seitsemän,Niv. luminosité : sept,,Livello luminosità: 7,輝度レベル: 7,,,,Claridade: sete,,,Уровень яркости: семь, -Brightness Level: Eight,BRIGHTNESS LEVEL: EIGHT,,,,,Helligkeitsstufe: Acht,,,Nivel de brillo: Ocho,,Kirkkaustaso: kahdeksan,Niv. luminosité : huit,,Livello luminosità: 8,輝度レベル: 8,,,,Claridade: oito,,,Уровень яркости: восемь, -Register Cosmo Today!,REGISTER COSMO TODAY!,,,,,Registriere Cosmo Jetzt!,,,¡Suscríbete a cosmo hoy mismo!,,Rekisteröi Cosmo tänään!,Abonne-toi à cosmo !,,Registra cosmo oggi!,コスモを今すぐ登録しよう!,,,,Assine cosmo hoje mesmo!,,,Зарегистрируйте cosmo сегодня!, -All Locks Toggled,ALL LOCKS TOGGLED,,,,,Alle Schlösser Betätigt,,,Desbloquea/bloquea todo,,Kaikki lukot kytketty toiseen asentoon,Tous verrous activés,,Tutte le serrature azionate,すべてのロックを解放した,,,,Todas as trancas ativadas,,,Все замки переключены, -Night Vision Goggles,NIGHT VISION GOGGLES,,,,,Nachtsichtgerät,,,Gafas visión nocturna,,Pimeänäkölasit,Lunettes vison de nuit,,Visore notturno,暗視ゴーグル,,,,Óculos de visão noturna,,,Очки ночного видения, -"We're Gonna Fry Your Ass, Nukem!","WE'RE GONNA FRY YOUR ASS, NUKEM!",,,,,"Wir machen dich fertig, Nukem!",,,"¡Te vamos a freír el culo, Duke!",,"Käristämme perseesi, Nukem!","On va te rôtir le croupion, nukem !",,"Ti friggeremo il culo, Nukem!",てめえのケツを燃やしてやるぜ、NUKEM!,,,,"Vamos fritar seu traseiro, nukem!",,,"Мы поджарим твою задницу, Nukem!", -Screen Saved,SCREEN SAVED,,,,,Screenshot gespeichert,,,Imagen guardada,,Näyttö tallennettu,Écran sauvegardé,,Schermata salvata,スクリーンをセーブ,,,,Tela capturada,,,Снимок сохранен, -Got Used Armor,GOT USED ARMOR,,,,,Gebrauchte Rüstung erhalten,,,Tienes blindaje usado,,Kulunut panssari otettu,Tu as l'armure usée,,Hai armatura usata,中古アーマーを入手した,,,,Pegou armadura usada,,,Получена подержанная броня, -Pirates Suck!,PIRATES SUCK!,,,,,Piraten sind doof!,,,Los piratas dan pena,,Piraatit ovat syvältä!,"Les pirates, ça craint !",,I pirati fanno schifo!,海賊は最低だ!,,,,Piratas não são de nada!,,,Пираты – дерьмо!, -Night Vision On,NIGHT VISION ON,,,,,Nachtsichtgerät: An,,,Visión nocturna ACTIVADO,,Pimeänäkö käytössä,Vision de nuit : oui,,Visione notturna sì,暗視 オン,,,,Visão noturna lig.,,,Ночное видение вкл, -Night Vision Off,NIGHT VISION OFF,,,,,Nachtsichtgerät: Aus,,,Visión nocturna DESACTIVADO,,Pimeänäkö pois käytöstä,Vision de nuit : non,,Visione notturna no,暗視 オフ,,,,Visão noturna desl.,,,Ночное видение откл, -You're Burning!,YOU'RE BURNING!,,,,,Du brennst!,,,¡Estás ardiendo!,,Palat!,Tu crames !,,Stai bruciando!,プレイヤーが燃えている!,,,,Você está queimando!,,,Ты горишь!, -View Mode Off,VIEW MODE OFF,,,,,Ansichtsmodus: Aus,,,3.ª persona DESACTIVADO,,Katselutila pois päältä,Vue objective : non,,Modalità visione: no,ビューモード オフ,,,,Modo visão desl.,,,Режим наблюдения откл, -View Mode On,VIEW MODE ON,,,,,Ansichtsmodus: An,,,3.ª persona ACTIVADO,,Katselutila päällä,Vue objective : oui,,Modalità visione: sì,ビューモード オン,,,,Modo visão lig.,,,Режим наблюдения вкл, -Show Map: ON,SHOW MAP: ON,,,,,Karte Zeigen: An,,,Ver mapa ACTIVADO,,Kartta: PÄÄLLÄ,Affich. carte : oui,,Mostra mappa: sì,マップの表示: オン,,,,Mapa: lig.,,,Показать карту: вкл, -Clipping: ON,CLIPPING: ON,,,,,Clipping: An,,,Fantasma DESACTIVADO,,Seinänläpikulku: PÄÄLLÄ,Passe-muraille : non,,Clipping: sì,クリッピング: オン,,,,Clipping: lig.,,,Сквозь стены: откл, -Clipping: OFF,CLIPPING: OFF,,,,,Clipping: Aus,,,Fantasma ACTIVADO,,Seinänläpikulku: POIS PÄÄLLÄ,Passe-muraille : oui,,Clipping: no,クリッピング: オフ,,,,Clipping: desl.,,,Сквозь стены: вкл, -!!! Incorrect Version !!!,!!! INCORRECT VERSION !!!,,,,,!!! Falsche Version !!!,,,¡Versión incorrecta!,,!!! Väärä versio !!!,!!! mauvaise version !!!,,!!! versione sbagliata !!!,!!! バージョンが間違っています !!!,,,,!!! versão incorreta !!!,,,!!! неправильная версия !!!, -"You Cannot ""Quick Save"" When Dead","YOU CANNOT ""QUICK SAVE"" WHEN DEAD",,,,,"Du kannst nicht ""Schnellspeichern"", wenn du tot bist.",,,No puedes guardar cuando estás Muerto,,Et voi pikatallentaa kuolleena,Pas de \sauvegarde rapide\ une fois mort.,,"Non puoi fare un ""salvataggio veloce"" mentre sei morto.",「死んでいる」時にクイックセーブはできません,,,,"Impossível ""salvar"" quando morto.",,,"Нельзя использовать быстрое сохранение, когда вы мертвы", -Got All Weapons/Ammo,GOT ALL WEAPONS/AMMO,,,,,Alle Waffen/Munition erhalten,,,Todas las armas/municiones,,Kaikki aseet/ammukset saatu,Tu as toutes les armes/munitions,,Hai tutte le armi/munizioni,すべての武器/弾薬を入手しました,,,,Obteve todas as armas/munições,,,Получено все оружие/боеприпасы, -Got All Inventory,GOT ALL INVENTORY,,,,,Alle Inventarobjekte erhalten,,,Todos los objetos,,Kaikki varusteet saatu,Tu as tout l'inventaire,,Hai tutto l'inventario,すべてのインベントリーを入手,,,,Obteve todo o inventário,,,Получены все предметы, -Got All Keys,GOT ALL KEYS,,,,,Alle Zugangskarten erhalten,,,Todas las tarjetas,,Kaikki avaimet saatu,Tu as toutes les cartes,,Hai tutte le chiavi,すべてのカギを入手しました,,,,Obteve todas as chaves,,,Получены все ключи, -Ammo For Expander,AMMO FOR EXPANDER,,,,,Munition Für Wachskanone!,,,¡Munición de expansora!,,Laajentimen ammuksia,Munitions maximiseur !,,Munizioni per espansore!,エクスパンダー用弾薬!,,,,Munição de aumentador!,,,Боеприпасы для увеличителя!, -Map Has A Different Number Of Players,MAP HAS A DIFFERENT NUMBER OF PLAYERS,,,,,Level hat Abweichende Spieleranzahl,,,El mapa tiene un número distinto de jugadores,,Tasolla on eri määrä pelaajia,La carte a un nb de joueurs différent,,La mappa ha un diverso numero di giocatori,マップのプレイヤー人数が異なります,,,,O mapa possui um nº diferente de jogadores,,,На карте другое количество игроков, -Ammo for Incinerator!,#FlamethrowerAmmo,,,,,Munition für Einäscherer!,,,¡Munición para incinerador!,,Kärventimen ammuksia!,Munitions incinérateur !,,Munizioni per inceneritore!,焼却装置用燃料!,,,,Munição de incinerador!,,,Боеприпасы для испепелителя!, -Incinerator!,#Flamethrower,,,,,Einäscherer!,,,¡Incinerador!,,Kärvennin!,Incinérateur !,,Inceneritore!,焼却装置!,,,,Incinerador!,,,Испепелитель!, -,Alterations from Duke Caribbean: Life's a Beach,,,,,,,,,,,,,,,,,,,,,, -Crate Of Bananas,CRATE OF BANANAS,,,,,Kiste Bananen,,,,,Banaanikori,,,,,,,,,,,, -Denied,DENIED,,,,,Verweigert,,,,,Hylätty,,,,,,,,,,,, -Sandles,SANDLES,,,,,Sandalen,,,,,Sandaalit,,,,,,,,,,,, -Approved,APPROVED,,,,,Genehmigt,,,,,Hyväksytty,,,,,,,,,,,, -Used Hot Sauce,USED HOT SAUCE,,,,,Scharfe Soße gebraucht,,,,,Chilikastike juotu,,,,,,,,,,,, -Ammo For Conchanator,AMMO FOR CONCHANATOR,,,,,Munition für Conchanator,,,,,Näkinkangen panoksia,,,,,,,,,,,, -Pearl Health!,PEARL HEALTH!,,,,,Perlengesundheit,,,,,Helmiterveys!,,,,,,,,,,,, -Hot Sauce,HOT SAUCE,,,,,Scharfe Soße,,,,,Chilikastike,,,,,,,,,,,, -Suntan Lotion,SUNTAN LOTION,,,,,Sonnenmilch,,,,,Aurinkovoide,,,,,,,,,,,, -Snorkle,SNORKLE,,,,,Schnorchel,,,,,Snorkkeli,,,,,,,,,,,, -Credit Card,CREDIT CARD,,,,,Kreditkarte,,,,,Luottokortti,,,,,,,,,,,, -Triple Poison Shooter!,TRIPLE POISON SHOOTER!,,,,,Giftschleuder,,,,,Triplamyrkkyputki!,,,,,,,,,,,, -Pineapple!,PINEAPPLE!,,,,,Ananas,,,,,Ananas!,,,,,,,,,,,, -Coconut Launcher!,COCONUT LAUNCHER!,,,,,Kokosnusswerfer,,,,,Kookoslaukaisin!,,,,,,,,,,,, -Super Soak'em!,SUPER SOAK'EM!,,,,,,,,,,,,,,,,,,,,,, -Voodoo Trip Bomb!,VOODOO TRIP BOMB!,,,,,Voodoomine,,,,,Voodooansapommi!,,,,,,,,,,,, -Ice Crusher!,ICE CRUSHER!,,,,,Eiszerkleinerer,,,,,Jäänmurskain!,,,,,,,,,,,, -Voodoo Ring!,VOODOO RING!,,,,,Voodooring,,,,,Voodoosormus!,,,,,,,,,,,, -Single Banana: +10,SINGLE BANANA: +10,,,,,Eine Banane: +10,,,,,Banaani: +10,,,,,,,,,,,, -Bunch Of Bananas: +30,BUNCH OF BANANAS: +30,,,,,Ein Bündel Bananen: +30,,,,,Banaanikimppu: +30,,,,,,,,,,,, -Ammo For Triple Poison Shooter!,AMMO FOR TRIPLE POISON SHOOTER!,,,,,Munition für Giftschleuder,,,,,Triplamyrkkyputken panoksia!,,,,,,,,,,,, -Ammo For Coconut Launcher!,AMMO FOR COCONUT LAUNCHER!,,,,,Munition für Kokonusswerfer,,,,,Kookoslaukaisimen panoksia!,,,,,,,,,,,, -Ammo For Water Pistol!,AMMO FOR WATER PISTOL!,,,,,Munition für Wasserpistole,,,,,Vettä vesipistoolille!,,,,,,,,,,,, -Ammo For Ice Crusher!,AMMO FOR ICE CRUSHER!,,,,,Munition für Eiszerkleinerer,,,,,Jäätä jäänmurskaimelle!,,,,,,,,,,,, -Sandles Off,SANDLES OFF,,,,,Sandalen an,,,,,Sandaalit pois käytöstä,,,,,,,,,,,, -Sandles On,SANDLES ON,,,,,Sansalen aus,,,,,Sandaalit käytössä,,,,,,,,,,,, -Ammo For Super Soak'em!,AMMO FOR SUPER SOAK'EM!,,,,,Munition für Super Soak'em!,,,,,Vettä Super Soak'emille!,,,,,,,,,,,, -Blue Credit Card Required,BLUE CREDIT CARD REQUIRED,,,,,Blaue Kreditkarte benötigt!,,,,,Sininen luottokortti vaaditaan,,,,,,,,,,,, -Red Credit Card Required,RED CREDIT CARD REQUIRED,,,,,Rote Kreditkarte benötigt!,,,,,Punainen luottokortti vaaditaan,,,,,,,,,,,, -Yellow Credit Card Required,YELLOW CREDIT CARD REQUIRED,,,,,Gelbe Kreditkarte benötigt,,,,,Keltainen luottokortti vaaditaan,,,,,,,,,,,, -Protective Sandles On,PROTECTIVE SANDLES ON,,,,,Sandalen an,,,,,Suojaavat sandaalit käytössä,,,,,,,,,,,, -Snorkle On,SNORKLE ON,,,,,Schnorchel an,,,,,Snorkkeli käytössä,,,,,,,,,,,, -Ammo For Voodoo Ring!,AMMO FOR VOODOO RING!,,,,,Munition für Voodooring,,,,,Voimaa voodoosormukselle!,,,,,,,,,,,, -Conchanator Weapon,CONCHANATOR WEAPON,,,,,Conchanatorwaffe,,,,,Näkinkankiase,,,,,,,,,,,, -Hot Sauce,HOT SAUCE,,,,,Scharfe Soße,,,,,Chilikastike,,,,,,,,,,,, -Sunglasses,SUNGLASSES,,,,,Sonnenbrille,,,,,Aurinkolasit,,,,,,,,,,,, -This Party Is Over Nukem,THIS PARTY IS OVER NUKEM,,,,,"Die Party ist vorbei, Nukem",,,,,"Bileet ohi, Nukem",,,,,,,,,,,, -Got Used Suntan Lotion,GOT USED SUNTAN LOTION,,,,,Gebrauchte Sonnenmilch,,,,,Avattu aurinkovoide otettu,,,,,,,,,,,, -Sunglasses On,SUNGLASSES ON,,,,,Sonnenbrille aufgesetzt,,,,,Aurinkolasit käytössä,,,,,,,,,,,, -Sunglasses Off,SUNGLASSES OFF,,,,,Sonnenbrille abfesetzt,,,,,Aurinkolasit pois käytöstä,,,,,,,,,,,, -,"Episodes, Skills, Maps",,,,,,,,,,,,,,,,,,,,,, -L.A. Meltdown,L.A. MELTDOWN,,,,,Chaos in L.A.,,,Colapso en L. A.,,Losin romahdus,Fusion à L.A.,,Distruzione Di L.A.,ロサンゼルス・メルトダウン,,,,Confronto em L.A.,,,Разборка В Лос-Анджелесе, -Lunar Apocalypse,LUNAR APOCALYPSE,,,,,Mond-Apokalypse,,,Apocalipsis Lunar,,Kuunloppu,Apocalypse Lunaire,,Apocalisse Lunare,ルナ・アポカリプス,,,,Apocalipse Lunar,,,Лунный Апокалипсис, -Shrapnel City,SHRAPNEL CITY,,,,,Schrapnell-City,,,Ciudad Metralla,,Sirpalekaupunki,Shrapnel City,,Città Di Piombo,シュラプネル・シティ,,,,Cidade do Estilhaço,,,Шрапнель-Сити, -The Birth,THE BIRTH,,,,,Die Geburt,,,El Nacimiento,,Synty,Naissance,,La Nascita,誕生,,,,O Nascimento,,,Рождение, -Alien World Order,#Episode5Name,,,,,Außerirdische Weltordnung,,,Orden Mundial Alienígena,,Muukalaisten maailmanjärjestys,Domination Extra-Terrestre,,Ordine Del Mondo Alieno,宇宙人の世界秩序,,,,Ordem Mundial Alienígena,,,Инопланетный Строй, +Ammo For Chaingun Cannon!,AMMO FOR CHAINGUN CANNON!,,,,,Munition für Minigun!,,,¡Munición de cañón de cadena!,,Sarjatykin ammuksia!,Munitions canon mitrailleur !,,Munizioni per cannone a rotaia!,チェーンガン・キャノン用弾薬!,,,,Munição de canhão-metralhadora!,,Muniție pentru Miltralieră!,Боеприпасы для скорострельной пушки!, +Ammo For RPG!,AMMO FOR RPG!,,,,,Munition für Panzerfaust!,,,¡Munición de misil!,,Singon ammuksia!,Munitions RPG !,,Munizioni per RPG!,RPG用弾薬!,,,,Munição de RPG!,,Muniție pentru RPG!,Боеприпасы для рпг!, +Ammo For Pistol!,AMMO FOR PISTOL!,,,,,Munition für Pistole!,,,¡Munición de pistola!,,Pistoolin ammuksia!,Munitions pistolet !,,Munizioni per pistola!,ピストル用弾薬!,,,,Munição de pistola!,,Muniție pentru Pistol!,Боеприпасы для пистолета!, +Ammo For Freezethrower!,AMMO FOR FREEZETHROWER!,,,,,Munition für Gefrierstrahler!,,,¡Munición de congelador!,,Pakkasheittimen ammuksia!,Munitions lance-glace !,,Munizioni per congelatore!,冷気放射器用燃料!,,,,Munição de lança-gelo!,,Muniție pentru Aruncătorul de Gheată!,Боеприпасы для замораживателя!, +Boots OFF,BOOTS OFF,,,,,Stiefel: Aus,,,Botas DESACTIVADOS,,Saappaat pois käytöstä,Bottes : non,,Stivali no,ブーツ オフ,,,,Botas deslig.,,Cizme ACTIVATE,Сапоги откл, +Boots ON,BOOTS ON,,,,,Stiefel: An,,,,,Saappaat käytössä,Bottes : oui,,Stivali sì,ブーツ オン,,,,Botas lig.,,Cizme DEZACTIVATE,Сапоги вкл, +Ammo For Shotgun,AMMO FOR SHOTGUN,,,,,Munition für Schrotflinte,,,¡Munición de escopeta!,,Haulikon ammuksia,Munitions fusil !,,Munizioni per fucile a pompa!,ショットガン用弾薬,,,,Munição de escopeta,,Muniție pentru Pușcă,Боеприпасы для дробовика!, +Blue Access Card Required,BLUE ACCESS CARD REQUIRED,,,,,Blaue Zugangskarte erforderlich,,,Necesitas tarjeta acceso azul,,Sininen avainkortti vaaditaan,Carte d'accès bleue requise,,Necessaria carta d'accesso blu,青いアクセスカードが必要,,,,Requer cartão azul,,Card de Acces Albastru Necesar,Нужна синяя карта доступа, +Red Access Card Required,RED ACCESS CARD REQUIRED,,,,,Rote Zugangskarte erforderlich,,,Necesitas tarjeta acceso roja,,Punainen avainkortti vaaditaan,Carte d'accès rouge requise,,Necessaria carta d'accesso rossa,赤いアクセスカードが必要,,,,Requer cartão vermelho,,Card de Acces Roșu Necesar,Нужна красная карта доступа, +Yellow Access Card Required,YELLOW ACCESS CARD REQUIRED,,,,,Gelbe Zugangskarte erforderlich,,,Necesitas tarjeta acceso amarilla,,Keltainen avainkortti vaaditaan,Carte d'accès jaune requise,,Necessaria carta d'accesso gialla,黄色いアクセスカードが必要,,,,Requer cartão amarelo,,Card de Access Galben Necesar,Нужна желтая карта доступа, +Weapon Lowered,WEAPON LOWERED,,,,,Waffe gesenkt,,,Arma bajada,,Ase laskettu,Arme baissée,,Arma abbassata,武器を下ろした,,,,Arma baixada,,Armă lăsată jos,Оружие опущено, +Weapon Raised,WEAPON RAISED,,,,,Waffe gehoben,,,Arma levantada,,Ase nostettu,Arme levée,,Arma alzata,武器を構えた,,,,Arma erguida,,Armă ridicată,Оружие поднято, +Protective Boots ON,PROTECTIVE BOOTS ON,,,,,Schutzstiefel: An,,,Botas protectoras ACTIVADOS,,Turvasaappaat käytössä,Bottes de sécu : oui,,Stivali protettivi sì,保護ブーツ オン,,,,Botas protetoras lig.,,Cizme Protectoare ACTIVATE,Защитные сапоги вкл, +Scuba Gear ON,SCUBA GEAR ON,,,,,Tauchausrüstung: An,,,Eq. submarinismo ACTIVADO,,Sukelluslaite käytössä,Combi. plongée : oui,,Attrezzatura da sub sì,スキューバギア オン,,,,Eq. de mergulho lig.,,Cizme Protectoare DEZACTIVATE,Акваланг вкл, +Space Suit ON,SPACE SUIT ON,,,,,Raumanzug: An,,,Traje espacial ACTIVADO,,Avaruuspuku käytössä,Combi. spatiale : oui,,Tuta spaziale sì,宇宙服 オン,,,,Traje espacial lig.,,Costum de Cosmonaut ACTIVAT,Скафандр вкл, +Ammo For Shrinker,AMMO FOR SHRINKER,,,,,Munition für Schrumpfkanone!,,,¡Munición de reductora!,,Kutistimen ammuksia,Munitions minimiseur !,,Munizioni per riduttore!,シュリンカー用弾薬!,,,,Munição de encolhedor!,,Muniție pentru Micșorător,Боеприпасы для уменьшителя!, +Buy Major Stryker,BUY MAJOR STRYKER,,,,,Kauf Major Stryker,,,Compra Major Stryker,,Osta Major Stryker,Achat major stryker,,Compra major stryker,メジャーストライカーを購入する,,,,Compre major stryker,,Cumpără Maior Stryker,Купить большой бтр, +Mighty Foot Engaged,MIGHTY FOOT ENGAGED,,,,,Fusstritt aktiviert,,,Patadón activado,,Mahtava jalka otettu käyttöön,Puissant coup de pied activé,,Piede potente in uso,マイティーフットを起動,,,,Chute do poder ativado,,Puternicul Șut Activat,Могучая нога активирована, +Weapon Mode ON,WEAPON MODE ON,,,,,Waffenmodus: An,,,Modo arma ACTIVADO,,Asetila päällä,Mode arme : oui,,Modalità arma sì,武器モード オン,,,,Modo arma lig.,,Modul Arme ACTIVAT,Режим оружия вкл, +Weapon Mode OFF,WEAPON MODE OFF,,,,,Waffenmodus: Aus,,,Modo arma DESACTIVADO,,Asetila pois päältä,Mode arme : non,,Modalità arma no,武器モード オフ,,,,Modo arma desl.,,Modul Arme DEZACTIVAT,Режим оружия откл, +Follow Mode OFF,FOLLOW MODE OFF,,,,Režim sledování VYP,Folgen-Modus AUS,,Sekvigreĝimo MALAKTIVA,Modo de seguimiento de mapa DESACTIVADO,,Seurantatila pois päältä,Mode suivi carte : non,Követés Mód KI,Modalità mappa a scorrimento no,マップフォローモード オフ,추적 모드 끔,추적 모드 끔,Volgmodus UIT,Modo seguir mapa desl.,,Modul Urmăritor OPRIT,Режим слежения на карте откл,Праћење ИСКЉУЧЕНО +Follow Mode ON,FOLLOW MODE ON,,,,Režim sledování ZAP,Folgen-Modus AN,,Sekvigreĝimo AKTIVA,Modo seguimiento de mapa ACTIVADO,,Seurantatila päällä,Mode suivi carte : oui,Követés Mód BE,Modalità mappa a scorrimento sì,マップフォローモード オン,추적 모드 켬,추적 모드 켬,Volgmodus AAN,Modo seguir mapa lig.,,Modul Urmăritor Pornit,Режим слежения на карте вкл,Праћење УКЉУЧЕНО +Run Mode OFF,RUN MODE OFF,,,,,Laufmodus: Aus,,,Modo Carrera DESACTIVADO,,Juoksutila pois päältä,Mode course : non,,Modalità corsa no,走行モード オフ,,,,Modo correr desl.,,Modul Alergare ORIT,Режим бега откл, +Run Mode ON,RUN MODE ON,,,,,Laufmodus: An,,,Modo Carrera ACTIVADO,,Juoksutila päällä,Mode course : oui,,Modalità corsa sì,走行モード オン,,,,Modo correr lig.,,Modul Alergare PORNIT!,Режим бега вкл, +Devastator Weapon,DEVASTATOR WEAPON,,,,,Devastator,,,Arma devastadora,,Hävitysase,Arme ravageur,,Arma devastatore,デバステーターウェポン,,,,Arma devastadora,,Devastator,Уничтожитель, +Jet Pack,JET PACK,,,,,Jetpack,,,Propulsor,,Rakettireppu,,,,トパック,,,,Jato,,Jet,Джетпак, +Airtank,AIRTANK,,,,,Atemluftflasche,,,Bombona,,Ilmasäiliö,Bonbonne d'air,,Serbatoio aria,エアタンク,,,,Tanque de ar,,Rezervor de Oxigen,Аэротанк, +Music: ON,MUSIC: ON,,,,,Musik: An,,,Música ACTIVADO,,Musiikki: PÄÄLLÄ,Musique : oui,,Musica: sì,音楽: オン,,,,Música: lig.,,Muzică: PORNITĂ,Музыка: вкл, +Music: OFF,MUSIC: OFF,,,,,Musik: Aus,,,Música DESACTIVADO,,Musiikki: POIS PÄÄLTÄ,Musique : non,,Musica: no,音楽: オフ,,,,Música: desl.,,Muzică: OPRITĂ,Музыка: откл, +Scroll Mode: ON,SCROLL MODE: ON,,,,,Scrollmodus: An,,,Modo desplazamiento ACTIVADO,,Vieritystila: PÄÄLLÄ,Défilement : oui,,Modalità scorrimento: sì,スクロールモード: オン,,,,Modo rolagem: lig.,,Modul Derulare: PORNIT,Режим прокрутки: вкл, +Scroll Mode: OFF,SCROLL MODE: OFF,,,,,Scrollmodus: Aus,,,Modo desplazamiento DESACTIVADO,,Vieritystila: POIS PÄÄLTÄ,Défilement : non,,Modalità scorrimento: no,スクロールモード: オフ,,,,Modo rolagem: desl.,,Modul Derulare: OPRIT,Режим прокрутки: откл, +Brightness Level: Six,BRIGHTNESS LEVEL: SIX,,,,,Helligkeitsstufe: Sechs,,,Nivel de brillo: Seis,,Kirkkaustaso: kuusi,Niv. luminosité : six,,Livello luminosità: 6,輝度レベル: 6,,,,Claridade: seis,,Nivel Luminozitate: Șase,Уровень яркости: шесть, +Brightness Level: Seven,BRIGHTNESS LEVEL: SEVEN,,,,,Helligkeitsstufe: Sieben,,,Nivel de brillo: Siete,,Kirkkaustaso: seitsemän,Niv. luminosité : sept,,Livello luminosità: 7,輝度レベル: 7,,,,Claridade: sete,,Nivel Luminozitate: Șapte,Уровень яркости: семь, +Brightness Level: Eight,BRIGHTNESS LEVEL: EIGHT,,,,,Helligkeitsstufe: Acht,,,Nivel de brillo: Ocho,,Kirkkaustaso: kahdeksan,Niv. luminosité : huit,,Livello luminosità: 8,輝度レベル: 8,,,,Claridade: oito,,Nivel Luminozitate: Opt,Уровень яркости: восемь, +Register Cosmo Today!,REGISTER COSMO TODAY!,,,,,Registriere Cosmo Jetzt!,,,¡Suscríbete a cosmo hoy mismo!,,Rekisteröi Cosmo tänään!,Abonne-toi à cosmo !,,Registra cosmo oggi!,コスモを今すぐ登録しよう!,,,,Registre Cosmo hoje mesmo!,,Înregistrează pe Cosmo Azi!,Зарегистрируйте cosmo сегодня!, +All Locks Toggled,ALL LOCKS TOGGLED,,,,,Alle Schlösser geöffnet,,,Desbloquea/bloquea todo,,Kaikki lukot kytketty toiseen asentoon,Tous verrous activés,,Tutte le serrature azionate,すべてのロックを解放した,,,,Todas as trancas ativadas,,Toate Încuietorile Comutate,Все замки переключены, +Night Vision Goggles,NIGHT VISION GOGGLES,,,,,Nachtsichtgerät,,,Gafas visión nocturna,,Pimeänäkölasit,Lunettes vison de nuit,,Visore notturno,暗視ゴーグル,,,,Óculos de visão noturna,,Ochelari Infraroși,Очки ночного видения, +"We're Gonna Fry Your Ass, Nukem!","WE'RE GONNA FRY YOUR ASS, NUKEM!",,,,,"Wir machen dich fertig, Nukem!",,,"¡Te vamos a freír el culo, Duke!",,"Käristämme perseesi, Nukem!","On va te rôtir le croupion, nukem !",,"Ti friggeremo il culo, Nukem!",てめえのケツを燃やしてやるぜ、NUKEM!,,,,"Vamos fritar seu traseiro, Nukem!",,"O să te prăjim, Nukem!","Мы поджарим твою задницу, Nukem!", +Screen Saved,SCREEN SAVED,,,,,Screenshot gespeichert,,,Imagen guardada,,Näyttö tallennettu,Écran sauvegardé,,Schermata salvata,スクリーンをセーブ,,,,Tela capturada,,Captură Salvată,Снимок сохранен, +Got Used Armor,GOT USED ARMOR,,,,,Gebrauchte Rüstung erhalten,,,Tienes blindaje usado,,Kulunut panssari otettu,Tu as l'armure usée,,Hai armatura usata,中古アーマーを入手した,,,,Pegou armadura usada,,Ridicat Armură Folosită,Получена подержанная броня, +Pirates Suck!,PIRATES SUCK!,,,,,Piraten sind doof!,,,Los piratas dan pena,,Piraatit ovat syvältä!,"Les pirates, ça craint !",,I pirati fanno schifo!,海賊は最低だ!,,,,Piratas não são de nada!,,Pirații sunt Jalnici!,Пираты – дерьмо!, +Night Vision ON,NIGHT VISION ON,,,,,Nachtsichtgerät: An,,,Visión nocturna ACTIVADO,,Pimeänäkö käytössä,Vision de nuit : oui,,Visione notturna sì,暗視 オン,,,,Visão noturna lig.,,Ochelari Infraroșii PORNIȚI,Ночное видение вкл, +Night Vision OFF,NIGHT VISION OFF,,,,,Nachtsichtgerät: Aus,,,Visión nocturna DESACTIVADO,,Pimeänäkö pois käytöstä,Vision de nuit : non,,Visione notturna no,暗視 オフ,,,,Visão noturna desl.,,Ochelari Infraroșii OPRIȚI,Ночное видение откл, +You're Burning!,YOU'RE BURNING!,,,,,Du brennst!,,,¡Estás ardiendo!,,Palat!,Tu crames !,,Stai bruciando!,プレイヤーが燃えている!,,,,Você está queimando!,,Arzi!,Ты горишь!, +View Mode OFF,VIEW MODE OFF,,,,,Ansichtsmodus: Aus,,,3.ª persona DESACTIVADO,,Katselutila pois päältä,Vue objective : non,,Modalità visione: no,ビューモード オフ,,,,Modo visão desl.,,Modul Vizualizare OPRIT,Режим наблюдения откл, +View Mode ON,VIEW MODE ON,,,,,Ansichtsmodus: An,,,3.ª persona ACTIVADO,,Katselutila päällä,Vue objective : oui,,Modalità visione: sì,ビューモード オン,,,,Modo visão lig.,,Modul Vizualizare PORNIT,Режим наблюдения вкл, +Show Map: ON,SHOW MAP: ON,,,,,Karte Zeigen: An,,,Ver mapa ACTIVADO,,Kartta: PÄÄLLÄ,Affich. carte : oui,,Mostra mappa: sì,マップの表示: オン,,,,Mapa: lig.,,Afișare hartă: PORNIT,Показать карту: вкл, +Clipping: ON,CLIPPING: ON,,,,,Clipping: An,,,Fantasma DESACTIVADO,,Seinänläpikulku: PÄÄLLÄ,Passe-muraille : non,,Clipping: sì,クリッピング: オン,,,,Clipping: lig.,,Coliziune: ACTIVĂ,Сквозь стены: откл, +Clipping: OFF,CLIPPING: OFF,,,,,Clipping: Aus,,,Fantasma ACTIVADO,,Seinänläpikulku: POIS PÄÄLLÄ,Passe-muraille : oui,,Clipping: no,クリッピング: オフ,,,,Clipping: desl.,,Coliziune: OPRITĂ,Сквозь стены: вкл, +!!! Incorrect Version !!!,!!! INCORRECT VERSION !!!,,,,,!!! Falsche Version !!!,,,¡Versión incorrecta!,,!!! Väärä versio !!!,!!! mauvaise version !!!,,!!! versione sbagliata !!!,!!! バージョンが間違っています !!!,,,,!!! Versão Incorreta !!!,,!!! Versiune Incorectă !!!,!!! неправильная версия !!!, +"You Cannot ""Quick Save"" When Dead","YOU CANNOT ""QUICK SAVE"" WHEN DEAD",,,,,"Du kannst nicht ""Schnellspeichern"", wenn du tot bist.",,,No puedes guardar cuando estás Muerto,,Et voi pikatallentaa kuolleena,Pas de \sauvegarde rapide\ une fois mort.,,"Non puoi fare un ""salvataggio veloce"" mentre sei morto.",「死んでいる」時にクイックセーブはできません,,,,"Impossível ""salvar"" quando morto.",,Nu poți salva rapid când ești mort,"Нельзя использовать быстрое сохранение, когда вы мертвы", +Got All Weapons/Ammo,GOT ALL WEAPONS/AMMO,,,,,Alle Waffen/Munition erhalten,,,Todas las armas/municiones,,Kaikki aseet/ammukset saatu,Tu as toutes les armes/munitions,,Hai tutte le armi/munizioni,すべての武器/弾薬を入手しました,,,,Obteve todas as armas/munições,,Ai toate Armele/Munițiile,Получено все оружие/боеприпасы, +Got All Inventory,GOT ALL INVENTORY,,,,,Alle Inventarobjekte erhalten,,,Todos los objetos,,Kaikki varusteet saatu,Tu as tout l'inventaire,,Hai tutto l'inventario,すべてのインベントリーを入手,,,,Obteve todo o inventário,,Ai tot Inventarul,Получены все предметы, +Got All Keys,GOT ALL KEYS,,,,,Alle Zugangskarten erhalten,,,Todas las tarjetas,,Kaikki avaimet saatu,Tu as toutes les cartes,,Hai tutte le chiavi,すべてのカギを入手しました,,,,Obteve todas as chaves,,Ai toate Cheile,Получены все ключи, +Ammo For Expander,AMMO FOR EXPANDER,,,,,Munition Für Wachskanone!,,,¡Munición de expansora!,,Laajentimen ammuksia,Munitions maximiseur !,,Munizioni per espansore!,エクスパンダー用弾薬!,,,,Munição de aumentador!,,Muniție pentru Expansor,Боеприпасы для увеличителя!, +Map Has A Different Number Of Players,MAP HAS A DIFFERENT NUMBER OF PLAYERS,,,,,Level hat Abweichende Spieleranzahl,,,El mapa tiene un número distinto de jugadores,,Tasolla on eri määrä pelaajia,La carte a un nb de joueurs différent,,La mappa ha un diverso numero di giocatori,マップのプレイヤー人数が異なります,,,,O mapa possui um nº diferente de jogadores,,Harta are un număr diferit de jucători,На карте другое количество игроков, +Ammo for Incinerator!,#FlamethrowerAmmo,,,,,Munition für Einäscherer!,,,¡Munición para incinerador!,,Kärventimen ammuksia!,Munitions incinérateur !,,Munizioni per inceneritore!,焼却装置用燃料!,,,,Munição de incinerador!,,Muniție pentru Arzător!,Боеприпасы для испепелителя!, +Incinerator!,#Flamethrower,,,,,Einäscherer!,,,¡Incinerador!,,Kärvennin!,Incinérateur !,,Inceneritore!,焼却装置!,,,,Incinerador!,,Arzător!,Испепелитель!, +,,Alterations from Duke Caribbean: Life's a Beach,,,,,,,,,,,,,,,,,,,,, +Crate Of Bananas,CRATE OF BANANAS,,,,,Kiste Bananen,,,,,Banaanikori,,,,,,,,Caixa de Bananas,,Cutie de Banane,, +Denied,DENIED,,,,,Verweigert,,,,,Hylätty,,,,,,,,Negado,,Respins,, +Sandles,SANDLES,,,,,Sandalen,,,,,Sandaalit,,,,,,,,Chinelos,,Sandale,, +Approved,APPROVED,,,,,Genehmigt,,,,,Hyväksytty,,,,,,,,Aprovado,,Aprobat,, +Used Hot Sauce,USED HOT SAUCE,,,,,Scharfe Soße gebraucht,,,,,Chilikastike juotu,,,,,,,,Usou Molho de Pimenta,,Utilizat Sos Iute,, +Ammo For Conchanator,AMMO FOR CONCHANATOR,,,,,Munition für Conchanator,,,,,Näkinkangen panoksia,,,,,,,,Munição para o Conchanator,,Muniție pentru Conchanator,, +Pearl Health!,PEARL HEALTH!,,,,,Perlengesundheit,,,,,Helmiterveys!,,,,,,,,Pérola da Saúde!,,Sănătate de Perlă!,, +Hot Sauce,HOT SAUCE,,,,,Scharfe Soße,,,,,Chilikastike,,,,,,,,Molho de Pimenta,,Sos Iute,, +Suntan Lotion,SUNTAN LOTION,,,,,Sonnenmilch,,,,,Aurinkovoide,,,,,,,,Bronzeador,,Cremă de Soare,, +Snorkle,SNORKLE,,,,,Schnorchel,,,,,Snorkkeli,,,,,,,,Esnórquel,,Mască de scufundări,, +Credit Card,CREDIT CARD,,,,,Kreditkarte,,,,,Luottokortti,,,,,,,,Cartão de Crédito,,Card de Credit,, +Triple Poison Shooter!,TRIPLE POISON SHOOTER!,,,,,Giftschleuder,,,,,Triplamyrkkyputki!,,,,,,,,Zarabatana Venenosa Tripla!,,Triplu Aruncător de Otravă!,, +Pineapple!,PINEAPPLE!,,,,,Ananas,,,,,Ananas!,,,,,,,,Abacaxi!,,Ananas!,, +Coconut Launcher!,COCONUT LAUNCHER!,,,,,Kokosnusswerfer,,,,,Kookoslaukaisin!,,,,,,,,Lança-Côcos!,,Aruncător de Nuci de Cocos!,, +Super Soak'em!,SUPER SOAK'EM!,,,,,,,,,,,,,,,,,,Super Jato d'Água!,,Super Udător!,, +Voodoo Trip Bomb!,VOODOO TRIP BOMB!,,,,,Voodoomine,,,,,Voodooansapommi!,,,,,,,,Armadilha Vudu!,,Mină Laser Voodoo!,, +Ice Crusher!,ICE CRUSHER!,,,,,Eiszerkleinerer,,,,,Jäänmurskain!,,,,,,,,Triturador de Gelo!,,Spărgător de Gheață!,, +Voodoo Ring!,VOODOO RING!,,,,,Voodooring,,,,,Voodoosormus!,,,,,,,,Anel Vudu!,,Inel Voodoo!,, +Single Banana: +10,SINGLE BANANA: +10,,,,,Eine Banane: +10,,,,,Banaani: +10,,,,,,,,Uma Banana: +10,,Banană: +10,, +Bunch Of Bananas: +30,BUNCH OF BANANAS: +30,,,,,Ein Bündel Bananen: +30,,,,,Banaanikimppu: +30,,,,,,,,Cacho de Bananas: +30,,Banane: +30,, +Ammo For Triple Poison Shooter!,AMMO FOR TRIPLE POISON SHOOTER!,,,,,Munition für Giftschleuder,,,,,Triplamyrkkyputken panoksia!,,,,,,,,Munição para Zarabatana Venenosa Tripla!,,Muniție pentru Triplul Aruncător de Otravă!,, +Ammo For Coconut Launcher!,AMMO FOR COCONUT LAUNCHER!,,,,,Munition für Kokonusswerfer,,,,,Kookoslaukaisimen panoksia!,,,,,,,,Munição para Lança-Côcos!,,Muniție pentru Aruncătorul de Nuci de Cocos!,, +Ammo For Water Pistol!,AMMO FOR WATER PISTOL!,,,,,Munition für Wasserpistole,,,,,Vettä vesipistoolille!,,,,,,,,Munição para Pistola d'Água!,,Muniție pentru Pistolul cu Apă!,, +Ammo For Ice Crusher!,AMMO FOR ICE CRUSHER!,,,,,Munition für Eiszerkleinerer,,,,,Jäätä jäänmurskaimelle!,,,,,,,,Munição para Triturador de Gelo!,,Muniție pentru Spărgătorul de Gheață!,, +Sandles OFF,SANDLES OFF,,,,,Sandalen an,,,,,Sandaalit pois käytöstä,,,,,,,,Chinelos Desativados,,Sandale ACTIVATE,, +Sandles ON,SANDLES ON,,,,,Sansalen aus,,,,,Sandaalit käytössä,,,,,,,,Chinelos Ativados,,Sandale DEZACTIVATE,, +Ammo For Super Soak'em!,AMMO FOR SUPER SOAK'EM!,,,,,Munition für Super Soak'em!,,,,,Vettä Super Soak'emille!,,,,,,,,Munição para Super Jato d'Água!,,Muniție pentru Udător!,, +Blue Credit Card Required,BLUE CREDIT CARD REQUIRED,,,,,Blaue Kreditkarte benötigt!,,,,,Sininen luottokortti vaaditaan,,,,,,,,Requer Cartão de Crédito Azul,,Card de Credit Albastru Necesar,, +Red Credit Card Required,RED CREDIT CARD REQUIRED,,,,,Rote Kreditkarte benötigt!,,,,,Punainen luottokortti vaaditaan,,,,,,,,Requer Cartão de Crédito Vermelho,,Card de Credit Roșu Necesar,, +Yellow Credit Card Required,YELLOW CREDIT CARD REQUIRED,,,,,Gelbe Kreditkarte benötigt,,,,,Keltainen luottokortti vaaditaan,,,,,,,,Requer Cartão de Crédito Amarelo,,Card de Credit Galben Necesar,, +Protective Sandles ON,PROTECTIVE SANDLES ON,,,,,Sandalen an,,,,,Suojaavat sandaalit käytössä,,,,,,,,Chinelos de Proteção Ativados,,Sandale Protectoare ACTIVATE,, +Snorkle ON,SNORKLE ON,,,,,Schnorchel an,,,,,Snorkkeli käytössä,,,,,,,,Esnórquel Ativado,,Mască de scufundări ACTIVATĂ,, +Ammo For Voodoo Ring!,AMMO FOR VOODOO RING!,,,,,Munition für Voodooring,,,,,Voimaa voodoosormukselle!,,,,,,,,Munição para Anel Vudu!,,Muniție pentru Inelul Voodoo!,, +Conchanator Weapon,CONCHANATOR WEAPON,,,,,Conchanatorwaffe,,,,,Näkinkankiase,,,,,,,,Arma Conchanadora,,Conchanator,, +Hot Sauce,HOT SAUCE,,,,,Scharfe Soße,,,,,Chilikastike,,,,,,,,Molho de Pimenta,,Sos Iute,, +Sunglasses,SUNGLASSES,,,,,Sonnenbrille,,,,,Aurinkolasit,,,,,,,,Óculos de Sol,,Ochelari de Soare,, +This Party Is Over Nukem,THIS PARTY IS OVER NUKEM,,,,,"Die Party ist vorbei, Nukem",,,,,"Bileet ohi, Nukem",,,,,,,,"Esta festa acabou, Nukem",,Petrecerea s-a Terminat Nukem,, +Got Used Suntan Lotion,GOT USED SUNTAN LOTION,,,,,Gebrauchte Sonnenmilch,,,,,Avattu aurinkovoide otettu,,,,,,,,Pegou Bronzeador Usado,,Ridicat Cremă de Soare Folosită,, +Sunglasses ON,SUNGLASSES ON,,,,,Sonnenbrille aufgesetzt,,,,,Aurinkolasit käytössä,,,,,,,,Óculos de Sol Ativado,,Ochelari de Soare ACTIVAȚI,, +Sunglasses OFF,SUNGLASSES OFF,,,,,Sonnenbrille abfesetzt,,,,,Aurinkolasit pois käytöstä,,,,,,,,Óculos de Sol Desativado,,Ochelari de Soare DEZACTIVAȚI,, +,,"Episodes, Skills, Maps",,,,,,,,,,,,,,,,,,,,, +L.A. Meltdown,L.A. MELTDOWN,,,,,Chaos in L.A.,,,Colapso en L. A.,,Losin romahdus,Fusion à L.A.,,Distruzione Di L.A.,ロサンゼルス・メルトダウン,,,,Confronto em L.A.,,Topirea L.A.,Разборка В Лос-Анджелесе, +Lunar Apocalypse,LUNAR APOCALYPSE,,,,,Mond-Apokalypse,,,Apocalipsis Lunar,,Kuunloppu,Apocalypse Lunaire,,Apocalisse Lunare,ルナ・アポカリプス,,,,Apocalipse Lunar,,Apocalipsa Selenară,Лунный Апокалипсис, +Shrapnel City,SHRAPNEL CITY,,,,,Schrapnell-City,,,Ciudad Metralla,,Sirpalekaupunki,Shrapnel City,,Città Di Piombo,シュラプネル・シティ,,,,Cidade do Estilhaço,,Orașul Schijelor,Шрапнель-Сити, +The Birth,THE BIRTH,,,,,Die Geburt,,,El Nacimiento,,Synty,Naissance,,La Nascita,誕生,,,,O Nascimento,,Nașterea,Рождение, +Alien World Order,#Episode5Name,,,,,Außerirdische Weltordnung,,,Orden Mundial Alienígena,,Muukalaisten maailmanjärjestys,Domination Extra-Terrestre,,Ordine Del Mondo Alieno,宇宙人の世界秩序,,,,Ordem Mundial Alienígena,,Noul Ordin Extraterestru,Инопланетный Строй, ,,,,,,,,,,,,,,,,,,,,,,, -Piece Of Cake,PIECE OF CAKE,,,,,Kinderspiel,,,Pan Comido,,Helppo nakki,À l'aise,,Gioco Da Ragazzi,どうってことねえ,,,,Moleza,,,Раз Плюнуть, -Let's Rock,LET'S ROCK,,,,,Zeit für Action,,,Dale Caña,,Antaa palaa,Ça va chauffer,,Diamoci Dentro,いくぜ,,,,Detonando,,,Зажигаем, -Come Get Some,COME GET SOME,,,,,Jetzt setzt es was,,,Toma Un Poco,,Täältä pesee,Viens prendre ta raclée,,Venite a Prenderle,かかってきやがれ,,,,Pode Vir,,,Выкуси, -Damn I'm Good,DAMN I'M GOOD,,,,,Bin verdammt gut,,,Pero Qué Bueno Soy,,Hitto oon hyvä,Je suis trop fort,,Sono Troppo Forte,さすが俺様だぜ,,,,Sou Demais,,,Я Чертовски Хорош, +Piece Of Cake,PIECE OF CAKE,,,,,Kinderspiel,,,Pan Comido,,Helppo nakki,À l'aise,,Gioco Da Ragazzi,どうってことねえ,,,,Moleza,,Floare la Ureche,Раз Плюнуть, +Let's Rock,LET'S ROCK,,,,,Zeit für Action,,,Dale Caña,,Antaa palaa,Ça va chauffer,,Diamoci Dentro,いくぜ,,,,Detonando,,Să-i dăm Drumul,Зажигаем, +Come Get Some,COME GET SOME,,,,,Jetzt setzt es was,,,Toma Un Poco,,Täältä pesee,Viens prendre ta raclée,,Venite a Prenderle,かかってきやがれ,,,,Pode Vir,,Ia De-Aici,Выкуси, +Damn I'm Good,DAMN I'M GOOD,,,,,Bin verdammt gut,,,Pero Qué Bueno Soy,,Hitto oon hyvä,Je suis trop fort,,Sono Troppo Forte,さすが俺様だぜ,,,,Sou Demais,,Mamă ce Bun Sunt,Я Чертовски Хорош, ,,,,,,,,,,,,,,,,,,,,,,, -Hollywood Holocaust,HOLLYWOOD HOLOCAUST,,,,,Hollywood-Massenvernichtung,,,Holocausto Hollywoodiense,,Hollywood-holokausti,Holocauste À Hollywood,,Olocausto a Hollywood,ハリウッド・ホロコースト,,,,Holocausto em Hollywood,,,Голливудский Холокост, -Red Light District,RED LIGHT DISTRICT,,,,,Rotlichtbezirk,,,Distrito Rojo,,Punaisten lyhtyjen alue,Quartier Chaud,,Distretto a Luci Rosse,赤線地区,,,,Distrito da Luz Vermelha,,,Район Красных Фонарей, -Death Row,DEATH ROW,,,,,Todestrakt,,,Corredor de ea Muerte,,Teloitushuone,Couloir de la Mort,,Via Della Morte,死刑囚監房,,,,Corredor da Morte,,,Камеры Смертников, -Toxic Dump,TOXIC DUMP,,,,,Giftmüllhalde,,,Vertedero Tóxico,,Ongelmajätelaitos,Décharge Toxique,,Discarica Tossica,有害ごみ置き場,,,,Lixo Tóxico,,,Токсичные Отходы, -The Abyss,THE ABYSS,,,,,Der Abgrund,,,El Abismo,,Syvyys,L'abysse,,L'Abisso,奈落の底,,,,O Abismo,,,Бездна, -Launch Facility,LAUNCH FACILITY,,,,,Raketenanlage,,,Instalación de Lanzamiento,,Laukaisulaitos,Le Pas de Tir,,Impianto di Lancio,打ち上げ施設,,,,Base de Lançamento,,,Пусковая Установка, -Faces Of Death,FACES OF DEATH,,,,,Gesichter des Todes,,,Rostros de Muerte,,Kuoleman kasvot,Visages de Mort,,I Volti della Morte,死者達の顔,,,,Faces da Morte,,,Лики Смерти, -User Map,USER MAP,,,,,Benutzerkarte,,,Mapa de Usuario,,Oma taso,Carte Joueur,,Mappa Utente,ユーザーマップ,,,,Mapa de Usuário,,,Карта Пользователя, -Void Zone,VOID ZONE,,,,,Zone der Leere,,,Zona de Vacío,,Tyhjiöalue,Zone Néant,,Il Vuoto,ボイドゾーン,,,,Zona Morta,,,Вакуум, -Roach Condo,ROACH CONDO,,,,,Kakerlakenbude,,,Piso de Cucarachas,,Torakka-asuntola,Hôtel à Cafards,,Condominio per Blatte,ゴキブリ・マンション,,,,Apê Pulguento,,,Квартира с Тараканами, +Hollywood Holocaust,HOLLYWOOD HOLOCAUST,,,,,Hollywood-Massenvernichtung,,,Holocausto Hollywoodiense,,Hollywood-holokausti,Holocauste À Hollywood,,Olocausto a Hollywood,ハリウッド・ホロコースト,,,,Holocausto em Hollywood,,Dezastru la Hollywood,Голливудский Холокост, +Red Light District,RED LIGHT DISTRICT,,,,,Rotlichtbezirk,,,Distrito Rojo,,Punaisten lyhtyjen alue,Quartier Chaud,,Distretto a Luci Rosse,赤線地区,,,,Distrito da Luz Vermelha,,Districtul Luminilor Roșii,Район Красных Фонарей, +Death Row,DEATH ROW,,,,,Todestrakt,,,Corredor de ea Muerte,,Teloitushuone,Couloir de la Mort,,Via Della Morte,死刑囚監房,,,,Corredor da Morte,,Culoarul Morții,Камеры Смертников, +Toxic Dump,TOXIC DUMP,,,,,Giftmüllhalde,,,Vertedero Tóxico,,Ongelmajätelaitos,Décharge Toxique,,Discarica Tossica,有害ごみ置き場,,,,Lixo Tóxico,,Groapa de Deșeuri,Токсичные Отходы, +The Abyss,THE ABYSS,,,,,Der Abgrund,,,El Abismo,,Syvyys,L'abysse,,L'Abisso,奈落の底,,,,O Abismo,,Abisul,Бездна, +Launch Facility,LAUNCH FACILITY,,,,,Raketenanlage,,,Instalación de Lanzamiento,,Laukaisulaitos,Le Pas de Tir,,Impianto di Lancio,打ち上げ施設,,,,Base de Lançamento,,Stația de Lansare,Пусковая Установка, +Faces Of Death,FACES OF DEATH,,,,,Gesichter des Todes,,,Rostros de Muerte,,Kuoleman kasvot,Visages de Mort,,I Volti della Morte,死者達の顔,,,,Faces da Morte,,Fețele Morții,Лики Смерти, +User Map,USER MAP,,,,,Benutzerkarte,,,Mapa de Usuario,,Oma taso,Carte Joueur,,Mappa Utente,ユーザーマップ,,,,Mapa de Usuário,,Hartă Utilizatori,Карта Пользователя, +Void Zone,VOID ZONE,,,,,Zone der Leere,,,Zona de Vacío,,Tyhjiöalue,Zone Néant,,Il Vuoto,ボイドゾーン,,,,Zona Morta,,Zona Vidului,Вакуум, +Roach Condo,ROACH CONDO,,,,,Kakerlakenbude,,,Piso de Cucarachas,,Torakka-asuntola,Hôtel à Cafards,,Condominio per Blatte,ゴキブリ・マンション,,,,Apê Pulguento,,Complexul Gândacilor,Квартира с Тараканами, Antiprofit,ANTIPROFIT,,,,,Antiprofit,,,Antibeneficio,,Antituotto,Anti-Profit,,Antiprofitto,反営利,,,,Antilucro,,,Невыгодное Положение, ,,,,,,,,,,,,,,,,,,,,,,, -Spaceport,SPACEPORT,,,,,Raumhafen,,,Cosmódromo,,Avaruustelakka,Spatioport,,Porto Spaziale,スペースポート,,,,Espaçoporto,,,Космопорт, +Spaceport,SPACEPORT,,,,,Raumhafen,,,Cosmódromo,,Avaruustelakka,Spatioport,,Porto Spaziale,スペースポート,,,,Espaçoporto,,Portul Spațial,Космопорт, Incubator,INCUBATOR,,,,,Brutapparat,,,Incubadora,,Hautomo,Incubateur,,Incubatrice,インキュベーター,,,,Incubador,,,Инкубатор, -Warp Factor,WARP FACTOR,,,,,Warp-Faktor,,,Factor de Curvatura,,Poimutekijä,Facteur Warp,,Fattore Warp,ワープファクター,,,,Fator de Dobra,,,Фактор Деформации, -Fusion Station,FUSION STATION,,,,,Fusionsstation,,,Central de Fusión,,Fuusiolaitos,Poste de Fusion,,Stazione Fusion,フュージョン・ステーション,,,,Estação de Fusão,,,Термоядерная Станция, -Occupied Territory,OCCUPIED TERRITORY,,,,,Besatzungsgebiet,,,Territorio Ocupado,,Vallattu alue,Territoire Occupé,,Territorio Occupato,占領地,,,,Território Ocupado,,,Захваченная Территория, -Tiberius Station,TIBERIUS STATION,,,,,Tiberius-Station,,,Estación de Tiberio,,Tiberius-asema,Station Tiberius,,Stazione Tiberius,チベリウス・ステーション,,,,Estação Tiberius,,,Станция Тиберия, -Lunar Reactor,LUNAR REACTOR,,,,,Mondreaktor,,,Reactor Lunar,,Kuureaktori,Réacteur Lunaire,,Reattore Lunare,ルナ・リアクター,,,,Reator Lunar,,,Лунный Реактор, -Dark Side,DARK SIDE,,,,,Die Dunkle Seite,,,Lado Oscuro,,Pimeä puoli,Face Cachée,,Lato Oscuro,ダークサイド,,,,Lado Escuro,,,Темная Сторона, -Overlord,OVERLORD,,,,,Überfürst,,,Cacique,,Yliherra,Seigneur Suprême,,Leader,オーバーロード,,,,Soberano,,,Владыка, -Spin Cycle,SPIN CYCLE,,,,,Schleudergang,,,Ciclo de Centrifugado,,Kiertojakso,Cycle Giratoire,,Ciclo Rotante,スピンサイクル,,,,Ciclo de Centrifugação,,,Цикл Вращения, -Lunatic Fringe,LUNATIC FRINGE,,,,,Am Rande Des Wahnsinns,,,Fleco Lunático,,Kuuhulluuden partaalla,Mal Luné,,Frangia Estremista,ルナティック・フリンジ,,,,Fronteira Lunática,,,Лунная Грань, +Warp Factor,WARP FACTOR,,,,,Warp-Faktor,,,Factor de Curvatura,,Poimutekijä,Facteur Warp,,Fattore Warp,ワープファクター,,,,Fator de Dobra,,Factorul Deviere,Фактор Деформации, +Fusion Station,FUSION STATION,,,,,Fusionsstation,,,Central de Fusión,,Fuusiolaitos,Poste de Fusion,,Stazione Fusion,フュージョン・ステーション,,,,Estação de Fusão,,Reactorul de Fuziune,Термоядерная Станция, +Occupied Territory,OCCUPIED TERRITORY,,,,,Besatzungsgebiet,,,Territorio Ocupado,,Vallattu alue,Territoire Occupé,,Territorio Occupato,占領地,,,,Território Ocupado,,Teritoriu Ocupat,Захваченная Территория, +Tiberius Station,TIBERIUS STATION,,,,,Tiberius-Station,,,Estación de Tiberio,,Tiberius-asema,Station Tiberius,,Stazione Tiberius,チベリウス・ステーション,,,,Estação Tiberius,,Stația Tiberius,Станция Тиберия, +Lunar Reactor,LUNAR REACTOR,,,,,Mondreaktor,,,Reactor Lunar,,Kuureaktori,Réacteur Lunaire,,Reattore Lunare,ルナ・リアクター,,,,Reator Lunar,,Reactorul Selenar,Лунный Реактор, +Dark Side,DARK SIDE,,,,,Die Dunkle Seite,,,Lado Oscuro,,Pimeä puoli,Face Cachée,,Lato Oscuro,ダークサイド,,,,Lado Escuro,,Zona Întunecată,Темная Сторона, +Overlord,OVERLORD,,,,,Überfürst,,,Cacique,,Yliherra,Seigneur Suprême,,Leader,オーバーロード,,,,Soberano,,Supralordul,Владыка, +Spin Cycle,SPIN CYCLE,,,,,Schleudergang,,,Ciclo de Centrifugado,,Kiertojakso,Cycle Giratoire,,Ciclo Rotante,スピンサイクル,,,,Ciclo de Centrifugação,,Ciclu de Rotație,Цикл Вращения, +Lunatic Fringe,LUNATIC FRINGE,,,,,Am Rande Des Wahnsinns,,,Fleco Lunático,,Kuuhulluuden partaalla,Mal Luné,,Frangia Estremista,ルナティック・フリンジ,,,,Fronteira Lunática,,Marginea Lunii,Лунная Грань, ,,,,,,,,,,,,,,,,,,,,,,, -Raw Meat,RAW MEAT,,,,,Rohes Fleisch,,,Carne Cruda,,Raakaa lihaa,Viande Crue,,Carne Cruda,生肉,,,,Carne Crua,,,Сырое Мясо, -Bank Roll,BANK ROLL,,,,,Geldbündel,,,Fajo de Billetes,,Tukku rahaa,Cagnotte,,Conto in Banca,バンク・ロール,,,,Grana Alta,,,Банк, -Flood Zone,FLOOD ZONE,,,,,Überflutungsgebiet,,,Zona de Inundación,,Tulva-alue,Zone Inondable,,Alluvione,洪水ゾーン,,,,Zona de Inundação,,,Затопленная Местность, -L.A. Rumble,L.A. RUMBLE,,,,,Zoff In L.A.,,,Pelea en L. A.,,Losin ryminä,Rififi à L.A.,,Rissa a L.A.,ロサンゼルス・ランブル,,,,Revolta em L.A.,,,Переполох В Лос-Анджелесе, -Movie Set,MOVIE SET,,,,,Filmset,,,Escenario de Peli,,Kuvauspaikalla,Plateau De Cinéma,,Set Cinematografico,映画のセット,,,,Estúdio de Cinema,,,Съемочная Площадка, -Rabid Transit,RABID TRANSIT,,,,,Wilder Ritt,,,Transporte Rabioso,,Joukkohulluliikenne,Transit Enragé,,Transito Furioso,過激なトランジット,,,,Condução Precária,,,Безумная Поездочка, +Raw Meat,RAW MEAT,,,,,Rohes Fleisch,,,Carne Cruda,,Raakaa lihaa,Viande Crue,,Carne Cruda,生肉,,,,Carne Crua,,Carne Crudă,Сырое Мясо, +Bank Roll,BANK ROLL,,,,,Geldbündel,,,Fajo de Billetes,,Tukku rahaa,Cagnotte,,Conto in Banca,バンク・ロール,,,,Grana Alta,,Banca,Банк, +Flood Zone,FLOOD ZONE,,,,,Überflutungsgebiet,,,Zona de Inundación,,Tulva-alue,Zone Inondable,,Alluvione,洪水ゾーン,,,,Zona de Inundação,,Zona Inundată,Затопленная Местность, +L.A. Rumble,L.A. RUMBLE,,,,,Zoff In L.A.,,,Pelea en L. A.,,Losin ryminä,Rififi à L.A.,,Rissa a L.A.,ロサンゼルス・ランブル,,,,Revolta em L.A.,,Vuiet în L.A.,Переполох В Лос-Анджелесе, +Movie Set,MOVIE SET,,,,,Filmset,,,Escenario de Peli,,Kuvauspaikalla,Plateau De Cinéma,,Set Cinematografico,映画のセット,,,,Estúdio de Cinema,,Platoul de Filmare,Съемочная Площадка, +Rabid Transit,RABID TRANSIT,,,,,Wilder Ritt,,,Transporte Rabioso,,Joukkohulluliikenne,Transit Enragé,,Transito Furioso,過激なトランジット,,,,Condução Precária,,Transport cu Rabie,Безумная Поездочка, Fahrenheit,FAHRENHEIT,,,,,,,,,,,,,,ファーレンハイト,,,,,,,Фаренгейт, -Hotel Hell,HOTEL HELL,,,,,Höllenhotel,,,Hotel Infierno,,Hiiden tähden hotelli,Hotel d'enfer,,Hotel Inferno,地獄ホテル,,,,Hotel Inferno,,,Адский Отель, -Stadium,STADIUM,,,,,Stadion,,,Estadio,,Stadion,Stade,,Stadio,スタジアム,,,,Estádio,,,Стадион, -Tier Drops,TIER DROPS,,,,,Etagenflennen,,,Tuberías,,Tasonpudotukset,Butins annexes,,Livelli al Contrario,ティアドロップ,,,,Lágrimas,,,Дело Труба, -Freeway,FREEWAY,,,,,Autobahn,,,Pasadizo,,Moottoritie,Libre,,Via Libera,フリーウェイ,,,,Avenida,,,Автострада, +Hotel Hell,HOTEL HELL,,,,,Höllenhotel,,,Hotel Infierno,,Hiiden tähden hotelli,Hotel d'enfer,,Hotel Inferno,地獄ホテル,,,,Hotel Inferno,,Hotelul Infernal,Адский Отель, +Stadium,STADIUM,,,,,Stadion,,,Estadio,,Stadion,Stade,,Stadio,スタジアム,,,,Estádio,,Stadionul,Стадион, +Tier Drops,TIER DROPS,,,,,Etagenflennen,,,Tuberías,,Tasonpudotukset,Butins annexes,,Livelli al Contrario,ティアドロップ,,,,Lágrimas,,Scădere de Nivel,Дело Труба, +Freeway,FREEWAY,,,,,Autobahn,,,Pasadizo,,Moottoritie,Libre,,Via Libera,フリーウェイ,,,,Avenida,,Autostrada,Автострада, ,,,,,,,,,,,,,,,,,,,,,,, -It's Impossible,IT'S IMPOSSIBLE,,,,,Es ist unmöglich,,,Es Imposible,,Mahdotonta,Impossible,,Impossibile,不可能だ,,,,Impossível,,,Невыполнимая Миссия, +It's Impossible,IT'S IMPOSSIBLE,,,,,Es ist unmöglich,,,Es Imposible,,Mahdotonta,Impossible,,Impossibile,不可能だ,,,,Impossível,,E Imposibil,Невыполнимая Миссия, Duke-Burger,DUKE-BURGER,,,,,Duke-Burger,,,Burger Duke,,,,,,DUKEバーガー,,,,Duke-Burguer,,,Duke-Бургер, -Shop-N-Bag,SHOP-N-BAG,,,,,Einkaufen Und Eintüten,,,Bolsa de La Compra,,Osta ja kosta,Shopping,,Compra e Vai,ショップNバッグ,,,,Pague E Leve,,,Супермаркет, -Babe Land,BABE LAND,,,,,,,,Nenaslandia,,Beibimaa,Babe Land,,Terra Delle Pupe,ベイブ・ランド,,,,Gatalândia,,,Парк Развлечений, -Pigsty,PIGSTY,,,,,Saustall,,,Porqueriza,,Sikolätti,Porcherie,,Porcile,豚小屋,,,,Tiras,,,Свинарник, -Going Postal,GOING POSTAL,,,,,Völlig durchgedreht,,,Oficina de Correos,,Tikittävä kirjeaikapommi,Complètement Timbré,,Via Posta,無差別殺人,,,,Pelo Correio,,,Вам Письмо, +Shop-N-Bag,SHOP-N-BAG,,,,,Einkaufen Und Eintüten,,,Bolsa de La Compra,,Osta ja kosta,Shopping,,Compra e Vai,ショップNバッグ,,,,Pague E Leve,,Supermarket,Супермаркет, +Babe Land,BABE LAND,,,,,,,,Nenaslandia,,Beibimaa,Babe Land,,Terra Delle Pupe,ベイブ・ランド,,,,Gatalândia,,Tărâmul Gagicilor,Парк Развлечений, +Pigsty,PIGSTY,,,,,Saustall,,,Porqueriza,,Sikolätti,Porcherie,,Porcile,豚小屋,,,,Tiras,,Cocina de Porci,Свинарник, +Going Postal,GOING POSTAL,,,,,Völlig durchgedreht,,,Oficina de Correos,,Tikittävä kirjeaikapommi,Complètement Timbré,,Via Posta,無差別殺人,,,,Pelo Correio,,Scrisoare pentru Tine,Вам Письмо, XXX-Stacy,XXX-STACY,,,,,,,,,,,,,,XXXステイシー,,,,,,,XXX-Стейси, -Critical Mass,CRITICAL MASS,,,,,Kritische Masse,,,Masa Crítica,,Kriittinen massa,Masse Critique,,Massa Critica,臨界質量,,,,Massa Crítica,,,Критическая Масса, -Derelict,DERELICT,,,,,Wrack,,,Barco Abandonado,,Hylky,En Ruines,,Derelitto,遺棄物,,,,Desabrigado,,,Покинутое Судно, -The Queen,THE QUEEN,,,,,Die Königin,,,La Reina,,Kuningatar,La Reine,,La Regina,ザ・クィーン,,,,A Rainha,,,Королева, -Area 51,AREA 51,,,,,Area 51,,,Área 51,,Alue 51,Zone 51,,,エリア51,,,,Área 51,,,Зона 51, +Critical Mass,CRITICAL MASS,,,,,Kritische Masse,,,Masa Crítica,,Kriittinen massa,Masse Critique,,Massa Critica,臨界質量,,,,Massa Crítica,,Masa Critică,Критическая Масса, +Derelict,DERELICT,,,,,Wrack,,,Barco Abandonado,,Hylky,En Ruines,,Derelitto,遺棄物,,,,Desabrigado,,Epava,Покинутое Судно, +The Queen,THE QUEEN,,,,,Die Königin,,,La Reina,,Kuningatar,La Reine,,La Regina,ザ・クィーン,,,,A Rainha,,Regina,Королева, +Area 51,AREA 51,,,,,Area 51,,,Área 51,,Alue 51,Zone 51,,,エリア51,,,,Área 51,,Zona 51,Зона 51, ,,,,,,,,,,,,,,,,,,,,,,, -High Times,#E5L1,,,,,Hochgefühl,,,Un Bong Momento,,Korkeat ajat,Le Bong Moment,,Un Po' di Sballo,ハイ・タイムズ,,,,Altas Horas,,,Кайфовое Время, -Red Ruckus,#E5L2,,,,,Roter Krawall,,,Jaleo Rojo,,Punainen hälinä,Boucan,,Rissa Rossa,赤い騒動,,,,Ação Vermelha,,,Кровавый Кавардак, -Bloody Hell,#E5L3,,,,,Zur Hölle,,,Infierno Sangriento,,Hurmehorna,Bon Sang,,Inferno di Sangue,なんてこった,,,,Inferno Sangrento,,,В Сердце Преисподней, -Mirage Barrage,#E5L4,,,,,Trügerischer Prügelhagel,,,Descarga Milagrosa,,Kangastuskangistus,Barrage Mirage,,Sbarramento Miraggio,ミラージュ・バラージ,,,,Barragem de Miragem,,,Опасный Мираж, -Tour De Nukem,#E5L5,,,,,Tour De Nukem,,,Tour de Nukem,,,Tour de Nukem,,Tour de Nukem,ツール・ド・NUKEM,,,,Tour de Nukem,,,Nukem-Турне, -Golden Carnage,#E5L6,,,,,Goldene Verwüstung,,,Matanza en el Puente,,Kultainen verilöyly,Carnage Doré,,Carneficina d'oro,黄金の大虐殺,,,,Massacre Dourado,,,Золотая Бойня, -Hollywood Inferno,#E5L7,,,,,Hollywood-Inferno,,,Infierno Hollywoodiense,,Hollywood-inferno,Enfer à Hollywood,,Inferno a Hollywood,ハリウッド・インフェルノ,,,,Inferno em Hollywood,,,Голливудские Ужасы, -Prima Arena,#E5L8,,,,,Superarena,,,Primera Arena,,Priima-areena,,,,プリマ・アリーナ,,,,,,,Прима Арена, -,Duke Caribbean,,,,,,,,,,,,,,,,,,,,,, -Vacation Dukematch,VACATION DUKEMATCH,,,,,Urlaubs-Deathmatch,,,,,Lomadukematsi,,,,,,,,,,,, -Life's A Beach,LIFE'S A BEACH,,,,,Das Leben ist ein Strand,,,,,Elämä on rantaa,,,,,,,,,,,, -Low Tide,LOW TIDE,,,,,Ebbe,,,,,Matala vuorovesi,,,,,,,,,,,, -Makin' Waves,MAKIN' WAVES,,,,,Leichte Wellen,,,,,Aaltoa pukkaa,,,,,,,,,,,, -Big Kahuna,BIG KAHUNA,,,,,Springflut,,,,,Surffimestareille,,,,,,,,,,,, +High Times,#E5L1,,,,,Hochgefühl,,,Un Bong Momento,,Korkeat ajat,Le Bong Moment,,Un Po' di Sballo,ハイ・タイムズ,,,,Altas Horas,,E Timpul,Кайфовое Время, +Red Ruckus,#E5L2,,,,,Roter Krawall,,,Jaleo Rojo,,Punainen hälinä,Boucan,,Rissa Rossa,赤い騒動,,,,Ação Vermelha,,Confuzie Sângeroasă,Кровавый Кавардак, +Bloody Hell,#E5L3,,,,,Zur Hölle,,,Infierno Sangriento,,Hurmehorna,Bon Sang,,Inferno di Sangue,なんてこった,,,,Inferno Sangrento,,Lumea Interlopă,В Сердце Преисподней, +Mirage Barrage,#E5L4,,,,,Trügerischer Prügelhagel,,,Descarga Milagrosa,,Kangastuskangistus,Barrage Mirage,,Sbarramento Miraggio,ミラージュ・バラージ,,,,Barragem de Miragem,,Barajul Miraj,Опасный Мираж, +Tour De Nukem,#E5L5,,,,,Tour De Nukem,,,Tour de Nukem,,,Tour de Nukem,,Tour de Nukem,ツール・ド・NUKEM,,,,Tour de Nukem,,Tur de Nukem,Nukem-Турне, +Golden Carnage,#E5L6,,,,,Goldene Verwüstung,,,Matanza en el Puente,,Kultainen verilöyly,Carnage Doré,,Carneficina d'oro,黄金の大虐殺,,,,Massacre Dourado,,Masacrul de Aur,Золотая Бойня, +Hollywood Inferno,#E5L7,,,,,Hollywood-Inferno,,,Infierno Hollywoodiense,,Hollywood-inferno,Enfer à Hollywood,,Inferno a Hollywood,ハリウッド・インフェルノ,,,,Inferno em Hollywood,,Infern la Hollywood,Голливудские Ужасы, +Prima Arena,#E5L8,,,,,Superarena,,,Primera Arena,,Priima-areena,,,,プリマ・アリーナ,,,,,,Arena Prima,Прима Арена, +,,Duke Caribbean,,,,,,,,,,,,,,,,,,,,, +Vacation Dukematch,VACATION DUKEMATCH,,,,,Urlaubs-Deathmatch,,,,,Lomadukematsi,,,,,,,,Dukematch de Férias,,Dukematch în Vacanță,, +Life's A Beach,LIFE'S A BEACH,,,,,Das Leben ist ein Strand,,,,,Elämä on rantaa,,,,,,,,A Vida é uma Praia,,Viața e o Plajă,, +Low Tide,LOW TIDE,,,,,Ebbe,,,,,Matala vuorovesi,,,,,,,,Marolinha,,Reflux Slab,, +Makin' Waves,MAKIN' WAVES,,,,,Leichte Wellen,,,,,Aaltoa pukkaa,,,,,,,,Fazendo Onda,,Facem Valuri,, +Big Kahuna,BIG KAHUNA,,,,,Springflut,,,,,Surffimestareille,,,,,,,,Rei do Surf,,Marele Kahuna,, Tsunami,TSUNAMI,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Island Hopping,ISLAND HOPPING,,,,,Inselsprünge,,,,,Saarihyppely,,,,,,,,,,,, -Hidden Grotto,HIDDEN GROTTO,,,,,Versteckte Grotte,,,,,Salainen luola,,,,,,,,,,,, -Cruise Ship,CRUISE SHIP,,,,,Kreuzfahrtschiff,,,,,Risteilyalus,,,,,,,,,,,, +Island Hopping,ISLAND HOPPING,,,,,Inselsprünge,,,,,Saarihyppely,,,,,,,,De Ilha em Ilha,,Țopăit pe Insule,, +Hidden Grotto,HIDDEN GROTTO,,,,,Versteckte Grotte,,,,,Salainen luola,,,,,,,,Gruta Escondida,,Grota Ascunsă,, +Cruise Ship,CRUISE SHIP,,,,,Kreuzfahrtschiff,,,,,Risteilyalus,,,,,,,,Navio Cruzeiro,,Vaporul de Croazieră,, The Docks,THE DOCKS,,,,Přístav,Die Docks,,La Havenoj,Los Muelles,,Satamat,Les Docks,A Kikötő,Il Molo,埠頭,항구,De dokken,Doki,As Docas,,Docul,Доки,Лука ,,,,,,,,,,,,,,,,,,,,,,, -Caribbean Catastrophe,CARIBBEAN CATASTROPHE,,,,,Karibische Katastrophe,,,,,Katastrofi Karibialla,,,,,,,,,,,, -Market Melee,MARKET MELEE,,,,,Marktgeprügel,,,,,Torilla tapellaan,,,,,,,,,,,, -Mr. Splashy's,MR. SPLASHY'S,,,,,,,,,,,,,,,,,,,,,, -The Wavemistress,THE WAVEMISTRESS,,,,,Die Wellenmeisterin,,,,,Aaltojen Valtiatar,,,,,,,,,,,, -Lost Lagoon,LOST LAGOON,,,,,Vergessene Lagune,,,,,Kadonnut laguuni,,,,,,,,,,,, -Voodoo Caves,VOODOO CAVES,,,,,Voodoohöhlen,,,,,Voodooluolat,,,,,,,,,,,, -The Alien Remains,THE ALIEN REMAINS,,,,,Die Überreste der Fremden,,,,,Muukalaisrauniot,,,,,,,,,,,, -A Full House,A FULL HOUSE,,,,,Ein volles Haus,,,,,Täyskäsi,,,,,,,,,,,, -,DukeDC,,,,,,,,,,,,,,,,,,,,,, -Duke It Out In D.C.,DUKE IT OUT IN D.C.,,,,,Kampf um D.C.,,,,,Duketetaan D.C:ssä,,,,,,,,,,,, -Hell To The Chief,HELL TO THE CHIEF,,,,,Hölle für den Boss,,,,,Helvetti päällikölle,,,,,,,,,,,, -Memorial Service,MEMORIAL SERVICE,,,,,Gedenkstätte,,,,,Muistopalvelus,,,,,,,,,,,, -Nuked Files,NUKED FILES,,,,,Atomdaten,,,,,Silvotut kansiot,,,,,,,,,,,, -Smithsonian Terror,SMITHSONIAN TERROR,,,,,Terror im Smithsonian,,,,,Smithsoniaanista kauhua,,,,,,,,,,,, -Capitol Punishment,CAPITOL PUNISHMENT,,,,,Kapitole Bestrafung,,,,,Capitolin kuritus,,,,,,,,,,,, -Metro Mayhem,METRO MAYHEM,,,,,U-Bahn Chaos,,,,,Metrometakka,,,,,,,,,,,, -Brown Water,BROWN WATER,,,,,Braunes Wasser,,,,,Ruskeaa vettä,,,,,,,,,,,, -Dread October,DREAD OCTOBER,,,,,Ekliger Oktober,,,,,Kauhistuksen kanapurkki,,,,,,,,,,,, -Nuke Proof,NUKE PROOF,,,,,Atombombensicher,,,,,Atomipomminvarma,,,,,,,,,,,, -Top Secret,TOP SECRET,,,,,Staatsgeheimnis,,,,,Huippusalainen,,,,,,,,,,,, -,Nuclear Winter,,,,,,,,,,,,,,,,,,,,,, -Nuclear Winter,NUCLEAR WINTER,,,,,Nuklearer Winter,,,,,Ydintalvi,,,,,,,,,,,, +Caribbean Catastrophe,CARIBBEAN CATASTROPHE,,,,,Karibische Katastrophe,,,,,Katastrofi Karibialla,,,,,,,,Catástrofe Caribenha,,Catastrofă în Caraibe,, +Market Melee,MARKET MELEE,,,,,Marktgeprügel,,,,,Torilla tapellaan,,,,,,,,Barraco no Mercado,,Luptă la Piață,, +Mr. Splashy's,MR. SPLASHY'S,,,,,,,,,,,,,,,,,,Molhadinho Park,,Dl. Splashy,, +The Wavemistress,THE WAVEMISTRESS,,,,,Die Wellenmeisterin,,,,,Aaltojen Valtiatar,,,,,,,,A Dama das Ondas,,Doamna Valurilor,, +Lost Lagoon,LOST LAGOON,,,,,Vergessene Lagune,,,,,Kadonnut laguuni,,,,,,,,Lagoa Perdida,,Laguna Pierdută,, +Voodoo Caves,VOODOO CAVES,,,,,Voodoohöhlen,,,,,Voodooluolat,,,,,,,,Cavernas Vudu,,Peșterile Voodoo,, +The Alien Remains,THE ALIEN REMAINS,,,,,Die Überreste der Fremden,,,,,Muukalaisrauniot,,,,,,,,Os Restos Alienígenas,,Rămășițele Extraterestre,, +A Full House,A FULL HOUSE,,,,,Ein volles Haus,,,,,Täyskäsi,,,,,,,,Casa Lotada,,O Casă Plină,, +,,DukeDC,,,,,,,,,,,,,,,,,,,,, +Duke It Out In D.C.,DUKE IT OUT IN D.C.,,,,,Kampf um D.C.,,,,,Duketetaan D.C:ssä,,,,,,,,Treta na Capital,,Duke la Treabă în D.C.,, +Hell To The Chief,HELL TO THE CHIEF,,,,,Hölle für den Boss,,,,,Helvetti päällikölle,,,,,,,,,,Infern pentru Șef,, +Memorial Service,MEMORIAL SERVICE,,,,,Gedenkstätte,,,,,Muistopalvelus,,,,,,,,Serviço Memorial,,Serviciu Memorial,, +Nuked Files,NUKED FILES,,,,,Atomdaten,,,,,Silvotut kansiot,,,,,,,,Arquivos Nucleares,,Fișiere Nucleare,, +Smithsonian Terror,SMITHSONIAN TERROR,,,,,Terror im Smithsonian,,,,,Smithsoniaanista kauhua,,,,,,,,Terror no Smithsonian,,Teroare la Institut,, +Capitol Punishment,CAPITOL PUNISHMENT,,,,,Kapitole Bestrafung,,,,,Capitolin kuritus,,,,,,,,Punição Federal,,Pedeapsă la Capitoliu,, +Metro Mayhem,METRO MAYHEM,,,,,U-Bahn Chaos,,,,,Metrometakka,,,,,,,,Briga no Metrô,,Agitație la Metrou,, +Brown Water,BROWN WATER,,,,,Braunes Wasser,,,,,Ruskeaa vettä,,,,,,,,Água Imunda,,Papură,, +Dread October,DREAD OCTOBER,,,,,Ekliger Oktober,,,,,Kauhistuksen kanapurkki,,,,,,,,Outubro Terrível,,Înfiorătorul Octombrie,, +Nuke Proof,NUKE PROOF,,,,,Atombombensicher,,,,,Atomipomminvarma,,,,,,,,Prova Atômica,,Rezistent la Bombe Atomice,, +Top Secret,TOP SECRET,,,,,Staatsgeheimnis,,,,,Huippusalainen,,,,,,,,Ultrassecreto,,,, +,,Nuclear Winter,,,,,,,,,,,,,,,,,,,,, +Nuclear Winter,NUCLEAR WINTER,,,,,Nuklearer Winter,,,,,Ydintalvi,,,,,,,,Inverno Nuclear,,Iarna Nucleară,, Deja Vu,DEJA VU,,,,,,,,,,Entiselämys,,,,,,,,,,,, -Where It All Began,WHERE IT ALL BEGAN,,,,,Wo es alles anfing,,,,,Missä kaikki alkoi,,,,,,,,,,,, -Land Of Forgotten Toys,LAND OF FORGOTTEN TOYS,,,,,Land der vergessenen Spielzeuge,,,,,Unohdettujen lelujen maa,,,,,,,,,,,, -Santa's Corporate Hq,SANTA'S CORPORATE HQ,,,,,Santas Hauptquartier,,,,,Pukin firman päämaja,,,,,,,,,,,, -The Backdoor,THE BACKDOOR,,,,,Die Hintertür,,,,,Takaovi,,,,,,,,,,,, -Christmas Village,CHRISTMAS VILLAGE,,,,,Weihnchtsdorf,,,,,Joulukylä,,,,,,,,,,,, -Here Comes Santa Claws,HERE COMES SANTA CLAWS,,,,,Hier kommt Santas Klaue,,,,,Joulupukki puskuun jo käy,,,,,,,,,,,, -Santamatch,SANTAMATCH,,,,,,,,,,Pukkimatsi,,,,,,,,,,,, -,NAM,,,,,,,,,,,,,,,,,,,,,, -Inventory Item,INVENTORY ITEM,Looks like a placeholder,,,,Inventar,,,,,Varuste,,,,,,,,,,,, -All Ammo Crates Found...Get Back To The M113,ALL AMMO CRATES FOUND...GET BACK TO THE M113,,,,,Alle Munitionskisten gefunden. Geh zurück zum M113.,,,,,Kaikki ammuslaatikot löydetty. Palaa M113:lle.,,,,,,,,,,,, -Tank Mode On,TANK MODE ON,,,,,Panzermodus an,,,,,Panssaritila päällä,,,,,,,,,,,, -Killed In Action...Press Space To Restart Level,KILLED IN ACTION...PRESS SPACE TO RESTART LEVEL,,,,,Im Dienst gefallen -.Drücke eine Taste,,,,,Kaatunut taistelussa. Paina välilyöntiä aloittaaksesi tason alusta.,,,,,,,,,,,, -You Need Ammo To Use This Weapon,YOU NEED AMMO TO USE THIS WEAPON,,,,,"Du brauchst Munition, um diese Waffe zu benutzen.",,,,,Tarvitset ammuksia käyttääksesi tätä asetta.,,,,,,,,,,,, -M-16 Rifle!,M-16 RIFLE!,,,,,M-16 Gewehr!,,,,,M16-kivääri!,,,,,,,,,,,, -Tank,TANK,,,,,Panzer,,,,,Panssarivaunu,,,,,,,,,,,, -Armor Vest,ARMOR VEST,,,,,Panzerweste,,,,,Suojaliivi,,,,,,,,,,,, -Chemical Mine!,CHEMICAL MINE!,,,,,Chemiemine,,,,,Kemiallinen miina!,,,,,,,,,,,, +Where It All Began,WHERE IT ALL BEGAN,,,,,Wo es alles anfing,,,,,Missä kaikki alkoi,,,,,,,,Onde Tudo Começou,,Unde A Început Totul,, +Land Of Forgotten Toys,LAND OF FORGOTTEN TOYS,,,,,Land der vergessenen Spielzeuge,,,,,Unohdettujen lelujen maa,,,,,,,,Terra dos Brinquedos Esquecidos,,Tărâmul Jucăriilor Uitate,, +Santa's Corporate HQ,SANTA'S CORPORATE HQ,,,,,Santas Hauptquartier,,,,,Pukin firman päämaja,,,,,,,,QG Corporativo do Papai Noel,,Sediul Moșului,, +The Backdoor,THE BACKDOOR,,,,,Die Hintertür,,,,,Takaovi,,,,,,,,A Porta dos Fundos,,Ușa din Spate,, +Christmas Village,CHRISTMAS VILLAGE,,,,,Weihnchtsdorf,,,,,Joulukylä,,,,,,,,Vilarejo Natalino,,Sat de Crăciun,, +Here Comes Santa Claws,HERE COMES SANTA CLAWS,,,,,Hier kommt Santas Klaue,,,,,Joulupukki puskuun jo käy,,,,,,,,Lá Vem o Mau Velhinho,,Vine Moș Gheare,, +Santamatch,SANTAMATCH,,,,,,,,,,Pukkimatsi,,,,,,,,Natalmatch,,,, +,,NAM,,,,,,,,,,,,,,,,,,,,, +Inventory Item,INVENTORY ITEM,Looks like a placeholder,,,,Inventar,,,,,Varuste,,,,,,,,Item de inventário,,Obiect de Inventar,, +All Ammo Crates Found...Get Back To The M113,ALL AMMO CRATES FOUND...GET BACK TO THE M113,,,,,Alle Munitionskisten gefunden. Geh zurück zum M113.,,,,,Kaikki ammuslaatikot löydetty. Palaa M113:lle.,,,,,,,,Todas as Caixas de Munição Foram Encontradas...Volte Para o M113,,Toate Lăzile cu Muniție Găsite... Întoarce-te la M113,, +Tank Mode On,TANK MODE ON,,,,,Panzermodus an,,,,,Panssaritila päällä,,,,,,,,Modo Tanque Ativado,,Modul Tanc Activat,, +Killed In Action...Press Space To Restart Level,KILLED IN ACTION...PRESS SPACE TO RESTART LEVEL,,,,,Im Dienst gefallen -.Drücke eine Taste,,,,,Kaatunut taistelussa. Paina välilyöntiä aloittaaksesi tason alusta.,,,,,,,,Morto em Combate...Aperte Espaço para Reiniciar a Fase,,Ucis în Acțiune... Apasă Space pentru Restart,, +You Need Ammo To Use This Weapon,YOU NEED AMMO TO USE THIS WEAPON,,,,,"Du brauchst Munition, um diese Waffe zu benutzen.",,,,,Tarvitset ammuksia käyttääksesi tätä asetta.,,,,,,,,Você Precisa de Munição Para Usar Esta Arma,,Ai Nevoie de Muniție pentru A Folosi Arma,, +M-16 Rifle!,M-16 RIFLE!,,,,,M-16 Gewehr!,,,,,M16-kivääri!,,,,,,,,Fuzil M-16!,,Pușcă de Asalt M-16,, +Tank,TANK,,,,,Panzer,,,,,Panssarivaunu,,,,,,,,Tanque,,Tanc,, +Armor Vest,ARMOR VEST,,,,,Panzerweste,,,,,Suojaliivi,,,,,,,,Colete Balístico,,Vestă Antiglonț,, +Chemical Mine!,CHEMICAL MINE!,,,,,Chemiemine,,,,,Kemiallinen miina!,,,,,,,,Mina Química!,,Mină Chimică!,, Huey,HUEY,,,,,Hubschrauber,,,,,Huey,,,,,,,,,,,, -Mine Placed,MINE PLACED,,,,,Mine platziert,,,,,Miina asennettu,,,,,,,,,,,, -Holosoldier On,HOLOSOLDIER ON,,,,,Holosoldat an,,,,,Holosotilas päällä,,,,,,,,,,,, -Holosoldier Off,HOLOSOLDIER OFF,,,,,Holosoldat aus,,,,,Holosotilas pois päältä,,,,,,,,,,,, -Holosoldier Not Found Yet!,HOLOSOLDIER NOT FOUND YET!,,,,,Holosoldat noch nicht gefunden,,,,,Holosotilas vielä löytämättä!,,,,,,,,,,,, -Huey Not Found Yet!,HUEY NOT FOUND YET!,,,,,Hubschrauber noch nicht gefunden!,,,,,Huey vielä löytämättä!,,,,,,,,,,,, -Holosoldier,HOLOSOLDIER,,,,,Holosoldat,,,,,Holosotilas,,,,,,,,,,,, -Huey Mode On,HUEY MODE ON,,,,,Hubschraubermodus an,,,,,Hueytila päällä,,,,,,,,,,,, -Huey Mode Off,HUEY MODE OFF,,,,,Hubschraubermodus aus,,,,,Hueytila pois päältä,,,,,,,,,,,, -M-60 Machine Gun!,M-60 MACHINE GUN!,,,,,M-60 Maschinengewehr!,,,,,M60-konekivääri!,,,,,,,,,,,, -Grenade!,GRENADE!,,,,,Granate!,,,,,Kranaatti!,,,,,,,,,,,, -M-72 Law!,M-72 LAW!,,,,,M-72!,,,,,M72 LAW!,,,,,,,,,,,, -Claymore Mine!,CLAYMORE MINE!,,,,,,,,,,Claymore-miina!,,,,,,,,,,,, -Flamethrower !,FLAMETHROWER !,,,,,Flammenwerfer!,,,,,Liekinheitin!,,,,,,,,,,,, -M-79 Grenade Launcher!,M-79 GRENADE LAUNCHER!,,,,,M-79 Granatwerfer!,,,,,M79-kranaattikivääri!,,,,,,,,,,,, -Reloading Rocket Launcher,RELOADING ROCKET LAUNCHER,,,,,Lade Raketenwerfer,,,,,Ladataan sinkoa,,,,,,,,,,,, -Medikit: +30,MEDIKIT: +30,,,,,,,,,,Lääkintälaukku: +30,,,,,,,,,,,, -Ammo For M-60!,AMMO FOR M-60!,,,,,Munition für M-60!,,,,,M60:n ammuksia!,,,,,,,,,,,, -Radioman - Calling In Fire Mission (High Explosive),RADIOMAN - CALLING IN FIRE MISSION (HIGH EXPLOSIVE),,,,,Radiomann - Erbittet Bombardierung,,,,,Radisti - Pyydetään tulitehtävää (räjähdeammukset),,,,,,,,,,,, -Ammo For M-16!,AMMO FOR M-16!,,,,,Munition für M-16!,,,,,M16:n ammuksia!,,,,,,,,,,,, -Rocket Launcher,ROCKET LAUNCHER,,,,,Raketenwerfer,,,,,Sinko,,,,,,,,,,,, -Ammo For Shotgun!,AMMO FOR SHOTGUN!,,,,,Munition für Schrotflinte,,,,,Haulikon ammuksia!,,,,,,,,,,,, -Defense System Malfunction,DEFENSE SYSTEM MALFUNCTION,,,,,Fehlfunktion des Abwehrsystems,,,,,Puolustusjärjestelmän toimintahäiriö,,,,,,,,,,,, -Empty,EMPTY,,,,,Leer,,,,,Tyhjä,,,,,,,,,,,, -You Can't Use Tank And Huey At The Same Time !!!,YOU CAN'T USE TANK AND HUEY AT THE SAME TIME !!!,,,,,Du kannst Panzer und Hubschrauber nicht gleichzeitig benutzen!!,,,,,Et voi käyttää panssarivaunua ja Huey:ä samaan aikaan!,,,,,,,,,,,, -Flare Ready,FLARE READY,,,,,Fackel bereit,,,,,Merkkivalo valmis,,,,,,,,,,,, -Knife,KNIFE,,,,,Messer,,,,,Veitsi,,,,,,,,,,,, -CTF,CTF,,,,,CTF,,,,,CTF,,,,,,,,,,,, -Radioman - Following,RADIOMAN - FOLLOWING,,,,,Radiomann - folgt,,,,,Radisti - Seurataan,,,,,,,,,,,, -Mine Disarmed,MINE DISARMED,,,,,Mine entschärft,,,,,Miina purettu,,,,,,,,,,,, -Mine Ready,MINE READY,,,,,Mine scharf,,,,,Miina valmis,,,,,,,,,,,, -Trip Flare Placed,TRIP FLARE PLACED,,,,,Fackel platziert,,,,,,,,,,,,,,,,, -Radioman - Can't Call In Fire Mission,RADIOMAN - CAN'T CALL IN FIRE MISSION,,,,,Radiomann - kann Bombardierung nicht errbitten,,,,,,,,,,,,,,,,, -Medic - Following,MEDIC - FOLLOWING,,,,,Sanitäter - folgt,,,,,,,,,,,,,,,,, -Medic - Awaiting Further Orders,MEDIC - AWAITING FURTHER ORDERS,,,,,Sanitäter - wartet auf Anweisungen,,,,,,,,,,,,,,,,, -Demoman - Following,DEMOMAN - FOLLOWING,,,,,Demomann - folgt,,,,,,,,,,,,,,,,, -Demoman - Awaiting Further Orders,DEMOMAN - AWAITING FURTHER ORDERS,,,,,Demomann - wartet auf Anweisungen,,,,,,,,,,,,,,,,, -Demoman - Placing Apers Mine,DEMOMAN - PLACING APERS MINE,,,,,Demomann - platziert Mine,,,,,,,,,,,,,,,,, -Demoman - Placing C-4 Explosive,DEMOMAN - PLACING C-4 EXPLOSIVE,,,,,Demomann - platziert C-4 Sprengstoff,,,,,,,,,,,,,,,,, -Grunt - Following,GRUNT - FOLLOWING,,,,,Infanterist - folgt,,,,,,,,,,,,,,,,, -Grunt - Awaiting Further Orders,GRUNT - AWAITING FURTHER ORDERS,,,,,Infanterist - wartet auf Anweisungen,,,,,,,,,,,,,,,,, -Grunt - M-16 Ambush Mode,GRUNT - M-16 AMBUSH MODE,,,,,Infanterist - M-16 Hinterhaltsmodus,,,,,,,,,,,,,,,,, -Radioman - Awaiting Further Orders,RADIOMAN - AWAITING FURTHER ORDERS,,,,,Radiomann - wartet auf Anweisungen,,,,,,,,,,,,,,,,, -Grunt - M 72 Ambush Mode,GRUNT - M 72 AMBUSH MODE,,,,,Infanterist - M-72 Hinterhaltsmodus,,,,,,,,,,,,,,,,, -Laser Loading,LASER LOADING,,,,,Laser lädt,,,,,,,,,,,,,,,,, -Laser Ready,LASER READY,,,,,Laser bereit,,,,,,,,,,,,,,,,, -You are on the blue team,YOU ARE ON THE BLUE TEAM,,,,,Du bist im blauen Team,,,,,,,,,,,,,,,,, -You are on the red team,YOU ARE ON THE RED TEAM,,,,,Du bist im roten Team,,,,,,,,,,,,,,,,, -You got the enemy flag...take it back to your banner,YOU GOT THE ENEMY FLAG...TAKE IT BACK TO YOUR BANNER,,,,,Du hast die Feindflagge - bring sie heim,,,,,,,,,,,,,,,,, -You got the beast flag,YOU GOT THE BEAST FLAG,,,,,Du hast die Bestienflagge,,,,,,,,,,,,,,,,, -Crawl and press space to activate beast mode,CRAWL AND PRESS SPACE TO ACTIVATE BEAST MODE,,,,,Duck dich und drücke 'Benutzen' um den Bestienmodus zu beenden,,,,,,,,,,,,,,,,, -Blue team wins,BLUE TEAM WINS,,,,,Das blaue Team gewinnt,,,,,,,,,,,,,,,,, -Red team wins,RED TEAM WINS,,,,,Das rote Team gewinnt,,,,,,,,,,,,,,,,, -Apers mine ( 5),APERS MINE ( 5),,,,,Mine (5),,,,,,,,,,,,,,,,, -Trip flare ( 5),TRIP FLARE ( 5),,,,,Fackel (5),,,,,,,,,,,,,,,,, -C-4 explosive,C-4 EXPLOSIVE,,,,,C.4 Sprengstoff,,,,,,,,,,,,,,,,, -C-4 placed,C-4 PLACED,,,,,C-4 platziert,,,,,,,,,,,,,,,,, -Press Space To View Map,PRESS SPACE TO VIEW MAP,,,,,Drücke 'Benutzen' um die Karte anszusehen,,,,,,,,,,,,,,,,, -Booby Trap !!!,BOOBY TRAP !!!,,,,,"Vorsicht, Falle!",,,,,,,,,,,,,,,,, -Mine Detector,MINE DETECTOR,,,,,Minendetektor,,,,,,,,,,,,,,,,, -Radioman - Calling In Fire Mission (Smoke),RADIOMAN - CALLING IN FIRE MISSION (SMOKE),,,,,Radiomann - Erbittet Bombardierung (Rauch),,,,,,,,,,,,,,,,, -Ammo For M2machine Gun!,AMMO FOR M2MACHINE GUN!,,,,,Munition für M2 Maschinengewehr,,,,,,,,,,,,,,,,, -M2machine Gun [Press Space To Fire],M2MACHINE GUN [PRESS SPACE TO FIRE],,,,,M2 Maschinengewehr ('Benutzen' um zu feuern),,,,,,,,,,,,,,,,, -You're Bleeding,YOU'RE BLEEDING,,,,,Du blutest,,,,,,,,,,,,,,,,, -A-Gunner,A-GUNNER,,,,,A-Schütze,,,,,,,,,,,,,,,,, -Machine Gunner,MACHINE GUNNER,,,,,MG-Schütze,,,,,,,,,,,,,,,,, -Sniper,SNIPER,,,,,Scharfschütze,,,,,,,,,,,,,,,,, -Grenadier,GRENADIER,,,,,,,,,,,,,,,,,,,,,, -Point Man,POINT MAN,,,,,,,,,,,,,,,,,,,,,, -Medic,MEDIC,,,,,Sanitäter,,,,,,,,,,,,,,,,, -Squad Leader,SQUAD LEADER,,,,,Gruppenleiter,,,,,,,,,,,,,,,,, -Killed In Action,KILLED IN ACTION,,,,,Im Dienst gefallen,,,,,,,,,,,,,,,,, -Booby Trap Disarmed,BOOBY TRAP DISARMED,,,,,Sprengfalle entschärft,,,,,,,,,,,,,,,,, -M-60 Machine Gun [Press Space To Fire],M-60 MACHINE GUN [PRESS SPACE TO FIRE],,,,,M-60 Maschinengewehr ('Benutzen' um zu feuern),,,,,,,,,,,,,,,,, -[Drop Ammo],[DROP AMMO],,,,,[Munition abwerfen],,,,,,,,,,,,,,,,, -[C-4],[C-4],,,,,,,,,,,,,,,,,,,,,, -[Flare],[FLARE],,,,,[Fackel],,,,,,,,,,,,,,,,, -[Heal],[HEAL],,,,,[Heilen],,,,,,,,,,,,,,,,, -[Fire Mission],[FIRE MISSION],,,,,[Bombardierung],,,,,,,,,,,,,,,,, -[More Ammo],[MORE AMMO],,,,,[Mehr Munition],,,,,,,,,,,,,,,,, -Medical Supplies,MEDICAL SUPPLIES,,,,,Medizinische Versorgung,,,,,,,,,,,,,,,,, -Viet Cong Ammunition,VIET CONG AMMUNITION,,,,,Vietcong Munition,,,,,,,,,,,,,,,,, -Rotten Food,ROTTEN FOOD,,,,,Gammliges Essen,,,,,,,,,,,,,,,,, -Sniper Rifle!,SNIPER RIFLE!,,,,,Scharfschützengewehr,,,,,,,,,,,,,,,,, -60mm Mortar,60MM MORTAR,,,,,60mm Mörser,,,,,,,,,,,,,,,,, -Ammo For 60mm Mortar!,AMMO FOR 60MM MORTAR!,,,,,Munition für 60mm Mörser,,,,,,,,,,,,,,,,, -Shortest [ 1] 2 3 4 5 6 7 Longest,SHORTEST [ 1] 2 3 4 5 6 7 LONGEST,,,,,,,,,,,,,,,,,,,,,, -Shortest 1 [ 2] 3 4 5 6 7 Longest,SHORTEST 1 [ 2] 3 4 5 6 7 LONGEST,,,,,,,,,,,,,,,,,,,,,, -Shortest 1 2 [ 3] 4 5 6 7 Longest,SHORTEST 1 2 [ 3] 4 5 6 7 LONGEST,,,,,,,,,,,,,,,,,,,,,, -Shortest 1 2 3 [ 4] 5 6 7 Longest,SHORTEST 1 2 3 [ 4] 5 6 7 LONGEST,,,,,,,,,,,,,,,,,,,,,, -Shortest 1 2 3 4 [ 5] 6 7 Longest,SHORTEST 1 2 3 4 [ 5] 6 7 LONGEST,,,,,,,,,,,,,,,,,,,,,, -Shortest 1 2 3 4 5 [ 6] 7 Longest,SHORTEST 1 2 3 4 5 [ 6] 7 LONGEST,,,,,,,,,,,,,,,,,,,,,, -Shortest 1 2 3 4 5 6 [ 7] Longest,SHORTEST 1 2 3 4 5 6 [ 7] LONGEST,,,,,,,,,,,,,,,,,,,,,, -Rifleman,RIFLEMAN,,,,,Schütze,,,,,,,,,,,,,,,,, +Mine Placed,MINE PLACED,,,,,Mine platziert,,,,,Miina asennettu,,,,,,,,Mina Colocada,,Mină Plantată,, +Holosoldier On,HOLOSOLDIER ON,,,,,Holosoldat an,,,,,Holosotilas päällä,,,,,,,,Soldado Holográfico Ativado,,Soldat Holografic Activ,, +Holosoldier Off,HOLOSOLDIER OFF,,,,,Holosoldat aus,,,,,Holosotilas pois päältä,,,,,,,,Soldado Holográfico Desativado,,Soldat Holografic Oprit,, +Holosoldier Not Found Yet!,HOLOSOLDIER NOT FOUND YET!,,,,,Holosoldat noch nicht gefunden,,,,,Holosotilas vielä löytämättä!,,,,,,,,Soldado Holográfico Ainda Não Encontrado!,,Soldat Holografic Negăsit!,, +Huey Not Found Yet!,HUEY NOT FOUND YET!,,,,,Hubschrauber noch nicht gefunden!,,,,,Huey vielä löytämättä!,,,,,,,,Huey Ainda Não Encontrado!,,Huey Negăsit!,, +Holosoldier,HOLOSOLDIER,,,,,Holosoldat,,,,,Holosotilas,,,,,,,,Soldado Holográfico,,Soldat Holografic,, +Huey Mode On,HUEY MODE ON,,,,,Hubschraubermodus an,,,,,Hueytila päällä,,,,,,,,Modo Huey Ativado,,Modul Huey Pornit,, +Huey Mode Off,HUEY MODE OFF,,,,,Hubschraubermodus aus,,,,,Hueytila pois päältä,,,,,,,,Modo Huey Desativado,,Modul Huey Oprit,, +M-60 Machine Gun!,M-60 MACHINE GUN!,,,,,M-60 Maschinengewehr!,,,,,M60-konekivääri!,,,,,,,,Metralhadora M-60!,,Mitralieră M-60!,, +Grenade!,GRENADE!,,,,,Granate!,,,,,Kranaatti!,,,,,,,,Granada!,,Grenadă!,, +M-72 Law!,M-72 LAW!,,,,,M-72!,,,,,M72 LAW!,,,,,,,,Antitanque M-72!,,Lansator antitanc M-72!,, +Claymore Mine!,CLAYMORE MINE!,,,,,,,,,,Claymore-miina!,,,,,,,,Mina Claymore!,,Mină Claymore!,, +Flamethrower !,FLAMETHROWER !,,,,,Flammenwerfer!,,,,,Liekinheitin!,,,,,,,,Lança-chamas!,,Aruncător de Flăcări!,, +M-79 Grenade Launcher!,M-79 GRENADE LAUNCHER!,,,,,M-79 Granatwerfer!,,,,,M79-kranaattikivääri!,,,,,,,,Lança-granadas M-79!,,Lansator de Grenade M-79!,, +Reloading Rocket Launcher,RELOADING ROCKET LAUNCHER,,,,,Lade Raketenwerfer,,,,,Ladataan sinkoa,,,,,,,,Recarregando Lança-Foguetes,,Reîncarcare Lansator de Rachete,, +Medikit: +30,MEDIKIT: +30,,,,,,,,,,Lääkintälaukku: +30,,,,,,,,Kit médico: +30,,Kit medical: +30%,, +Ammo For M-60!,AMMO FOR M-60!,,,,,Munition für M-60!,,,,,M60:n ammuksia!,,,,,,,,Munição para M-60!,,Muniție pentru M-60!,, +Radioman - Calling In Fire Mission (High Explosive),RADIOMAN - CALLING IN FIRE MISSION (HIGH EXPLOSIVE),,,,,Radiomann - Erbittet Bombardierung,,,,,Radisti - Pyydetään tulitehtävää (räjähdeammukset),,,,,,,,Rádio Operador - Chamando Artilharia (Alto Explosivo),,Operator Radio - Chem Artileria,, +Ammo For M-16!,AMMO FOR M-16!,,,,,Munition für M-16!,,,,,M16:n ammuksia!,,,,,,,,Munição para M-16!,,Muniție pentru M-16!,, +Rocket Launcher,ROCKET LAUNCHER,,,,,Raketenwerfer,,,,,Sinko,,,,,,,,Lança-foguetes!,,Lansator de Rachete!,, +Ammo For Shotgun!,AMMO FOR SHOTGUN!,,,,,Munition für Schrotflinte,,,,,Haulikon ammuksia!,,,,,,,,Munição para Espingarda!,,Muniție pentru Pușcă!,, +Defense System Malfunction,DEFENSE SYSTEM MALFUNCTION,,,,,Fehlfunktion des Abwehrsystems,,,,,Puolustusjärjestelmän toimintahäiriö,,,,,,,,Erro no Sistema de Defesa,,Defectare la Sistemul de Apărare,, +Empty,EMPTY,,,,,Leer,,,,,Tyhjä,,,,,,,,Vazio,,Gol,, +You Can't Use Tank And Huey At The Same Time !!!,YOU CAN'T USE TANK AND HUEY AT THE SAME TIME !!!,,,,,Du kannst Panzer und Hubschrauber nicht gleichzeitig benutzen!!,,,,,Et voi käyttää panssarivaunua ja Huey:ä samaan aikaan!,,,,,,,,Você Não Pode Usar o Tanque e o Huey ao Mesmo Tempo !!!,,Nu poți Folosi Tancul si Avionul Huey în Același Timp!,, +Flare Ready,FLARE READY,,,,,Fackel bereit,,,,,Merkkivalo valmis,,,,,,,,Sinalizador Pronto,,Semnalizare Pregătită,, +Knife,KNIFE,,,,,Messer,,,,,Veitsi,,,,,,,,Faca,,Cuțit,, +CTF,CTF,,,,,CTF,,,,,CTF,,,,,,,,Força-Tarefa,,,, +Radioman - Following,RADIOMAN - FOLLOWING,,,,,Radiomann - folgt,,,,,Radisti - Seurataan,,,,,,,,Rádio Operador - Seguindo,,Operator Radio - Urmărind,, +Mine Disarmed,MINE DISARMED,,,,,Mine entschärft,,,,,Miina purettu,,,,,,,,Mina Desarmada,,Mină Dezamorsată,, +Mine Ready,MINE READY,,,,,Mine scharf,,,,,Miina valmis,,,,,,,,Mina Pronta,,Mină Pregătită,, +Trip Flare Placed,TRIP FLARE PLACED,,,,,Fackel platziert,,,,,,,,,,,,,Armadilha Sinalizadora Colocada,,Mină de Semnalizare Plasată,, +Radioman - Can't Call In Fire Mission,RADIOMAN - CAN'T CALL IN FIRE MISSION,,,,,Radiomann - kann Bombardierung nicht errbitten,,,,,,,,,,,,,Rádio Operador - Impossível Chamar Artilharia,,Operator Radio - Nu pot Chema Artileria,, +Medic - Following,MEDIC - FOLLOWING,,,,,Sanitäter - folgt,,,,,,,,,,,,,Médico - Seguindo,,Medic - Urmărind,, +Medic - Awaiting Further Orders,MEDIC - AWAITING FURTHER ORDERS,,,,,Sanitäter - wartet auf Anweisungen,,,,,,,,,,,,,Médico - Aguardando Ordens,,Medic - În Așteptarea Ordinelor,, +Demoman - Following,DEMOMAN - FOLLOWING,,,,,Demomann - folgt,,,,,,,,,,,,,Esp. em Demolições - Seguindo,,Demoman - Urmărind,, +Demoman - Awaiting Further Orders,DEMOMAN - AWAITING FURTHER ORDERS,,,,,Demomann - wartet auf Anweisungen,,,,,,,,,,,,,Esp. em Demolições - Aguardando Ordens,,Demoman - În Așteptarea Ordinelor,, +Demoman - Placing Apers Mine,DEMOMAN - PLACING APERS MINE,,,,,Demomann - platziert Mine,,,,,,,,,,,,,Esp. em Demolições - Colocando Mina Antipessoal,,Demoman - Plasez Mine Apers,, +Demoman - Placing C-4 Explosive,DEMOMAN - PLACING C-4 EXPLOSIVE,,,,,Demomann - platziert C-4 Sprengstoff,,,,,,,,,,,,,Esp. em Demolições - Colocando Explosivo C-4,,Demoman - Plasez Explozibil C-4,, +Grunt - Following,GRUNT - FOLLOWING,,,,,Infanterist - folgt,,,,,,,,,,,,,Combatente - Seguindo,,Infanterist - Urmărind,, +Grunt - Awaiting Further Orders,GRUNT - AWAITING FURTHER ORDERS,,,,,Infanterist - wartet auf Anweisungen,,,,,,,,,,,,,Combatente - Aguardando Ordens,,Infanterist - În Așteptare de Ordine,, +Grunt - M-16 Ambush Mode,GRUNT - M-16 AMBUSH MODE,,,,,Infanterist - M-16 Hinterhaltsmodus,,,,,,,,,,,,,Combatente - Modo Emboscada com M-16,,Infanterist - Modul Ambuscadă M-16,, +Radioman - Awaiting Further Orders,RADIOMAN - AWAITING FURTHER ORDERS,,,,,Radiomann - wartet auf Anweisungen,,,,,,,,,,,,,Rádio Operador - Aguardando Ordens,,Operator Radio - În Așteptare de Ordine,, +Grunt - M-72 Ambush Mode,GRUNT - M 72 AMBUSH MODE,,,,,Infanterist - M-72 Hinterhaltsmodus,,,,,,,,,,,,,Combatente - Modo Emboscada com M-72,,Infanterist - Modul Ambuscadă M-72,, +Laser Loading,LASER LOADING,,,,,Laser lädt,,,,,,,,,,,,,Carregando Laser,,Laserul se Încarcă,, +Laser Ready,LASER READY,,,,,Laser bereit,,,,,,,,,,,,,Laser Pronto,,Laserul e Pregătit,, +You are on the blue team,YOU ARE ON THE BLUE TEAM,,,,,Du bist im blauen Team,,,,,,,,,,,,,Você está na equipe azul,,,, +You are on the red team,YOU ARE ON THE RED TEAM,,,,,Du bist im roten Team,,,,,,,,,,,,,Você está na equipe vermelha,,,, +You got the enemy flag...take it back to your banner,YOU GOT THE ENEMY FLAG...TAKE IT BACK TO YOUR BANNER,,,,,Du hast die Feindflagge - bring sie heim,,,,,,,,,,,,,Você pegou a bandeira inimiga...leve-a para a sua bandeira,,,, +You got the beast flag,YOU GOT THE BEAST FLAG,,,,,Du hast die Bestienflagge,,,,,,,,,,,,,Você pegou a bandeira da besta,,,, +Crawl and press space to activate beast mode,CRAWL AND PRESS SPACE TO ACTIVATE BEAST MODE,,,,,Duck dich und drücke 'Benutzen' um den Bestienmodus zu beenden,,,,,,,,,,,,,Agache e aperte espaço para ativar o modo besta,,,, +Blue team wins,BLUE TEAM WINS,,,,,Das blaue Team gewinnt,,,,,,,,,,,,,Equipe azul venceu,,,, +Red team wins,RED TEAM WINS,,,,,Das rote Team gewinnt,,,,,,,,,,,,,Equipe vermelha venceu,,,, +Apers mine ( 5),APERS MINE ( 5),,,,,Mine (5),,,,,,,,,,,,,Mina antipessoal ( 5),,,, +Trip flare ( 5),TRIP FLARE ( 5),,,,,Fackel (5),,,,,,,,,,,,,Armadilha sinalizadora ( 5),,,, +C-4 explosive,C-4 EXPLOSIVE,,,,,C.4 Sprengstoff,,,,,,,,,,,,,Explosivo C-4,,,, +C-4 placed,C-4 PLACED,,,,,C-4 platziert,,,,,,,,,,,,,C-4 colocado,,,, +Press Space To View Map,PRESS SPACE TO VIEW MAP,,,,,Drücke 'Benutzen' um die Karte anszusehen,,,,,,,,,,,,,Aperte Espaço para Ver o Mapa,,,, +Booby Trap !!!,BOOBY TRAP !!!,,,,,"Vorsicht, Falle!",,,,,,,,,,,,,Armadilha !!!,,,, +Mine Detector,MINE DETECTOR,,,,,Minendetektor,,,,,,,,,,,,,Detector de Minas,,,, +Radioman - Calling In Fire Mission (Smoke),RADIOMAN - CALLING IN FIRE MISSION (SMOKE),,,,,Radiomann - Erbittet Bombardierung (Rauch),,,,,,,,,,,,,Rádio Operador - Chamando Artilharia (Fumaça),,,, +Ammo For M2machine Gun!,AMMO FOR M2MACHINE GUN!,,,,,Munition für M2 Maschinengewehr,,,,,,,,,,,,,Munição para Metralhadora M2,,,, +M2Machine Gun [Press Space To Fire],M2MACHINE GUN [PRESS SPACE TO FIRE],,,,,M2 Maschinengewehr ('Benutzen' um zu feuern),,,,,,,,,,,,,Metralhadora M2 [Aperte Espaço para Atirar],,,, +You're Bleeding,YOU'RE BLEEDING,,,,,Du blutest,,,,,,,,,,,,,Você Está Sangrando,,,, +A-Gunner,A-GUNNER,,,,,A-Schütze,,,,,,,,,,,,,Atirador,,,, +Machine Gunner,MACHINE GUNNER,,,,,MG-Schütze,,,,,,,,,,,,,Atirador de Metralhadora,,,, +Sniper,SNIPER,,,,,Scharfschütze,,,,,,,,,,,,,Franco-atirador,,,, +Grenadier,GRENADIER,,,,,,,,,,,,,,,,,,Granadeiro,,,, +Point Man,POINT MAN,,,,,,,,,,,,,,,,,,Homem-ponto,,,, +Medic,MEDIC,,,,,Sanitäter,,,,,,,,,,,,,Médico,,,, +Squad Leader,SQUAD LEADER,,,,,Gruppenleiter,,,,,,,,,,,,,Líder do Grupo de Combate,,,, +Killed In Action,KILLED IN ACTION,,,,,Im Dienst gefallen,,,,,,,,,,,,,Morto em Combate,,,, +Booby Trap Disarmed,BOOBY TRAP DISARMED,,,,,Sprengfalle entschärft,,,,,,,,,,,,,Armadilha Desarmada,,,, +M-60 Machine Gun [Press Space To Fire],M-60 MACHINE GUN [PRESS SPACE TO FIRE],,,,,M-60 Maschinengewehr ('Benutzen' um zu feuern),,,,,,,,,,,,,Metralhadora M-60 [Aperte Espaço para Atirar],,,, +[Drop Ammo],[DROP AMMO],,,,,[Munition abwerfen],,,,,,,,,,,,,[Largar Munição],,,, +[C-4],[C-4],,,,,,,,,,,,,,,,,,[C-4],,,, +[Flare],[FLARE],,,,,[Fackel],,,,,,,,,,,,,[Sinalizador],,,, +[Heal],[HEAL],,,,,[Heilen],,,,,,,,,,,,,[Curar],,,, +[Fire Mission],[FIRE MISSION],,,,,[Bombardierung],,,,,,,,,,,,,[Artilharia],,,, +[More Ammo],[MORE AMMO],,,,,[Mehr Munition],,,,,,,,,,,,,[Mais Munição],,,, +Medical Supplies,MEDICAL SUPPLIES,,,,,Medizinische Versorgung,,,,,,,,,,,,,Suprimentos Médicos,,,, +Viet Cong Ammunition,VIET CONG AMMUNITION,,,,,Vietcong Munition,,,,,,,,,,,,,Munição Vietcongue,,,, +Rotten Food,ROTTEN FOOD,,,,,Gammliges Essen,,,,,,,,,,,,,Comida Estragada,,,, +Sniper Rifle!,SNIPER RIFLE!,,,,,Scharfschützengewehr,,,,,,,,,,,,,Fuzil de Precisão!,,,, +60mm Mortar,60MM MORTAR,,,,,60mm Mörser,,,,,,,,,,,,,Morteiro 60mm,,,, +Ammo For 60mm Mortar!,AMMO FOR 60MM MORTAR!,,,,,Munition für 60mm Mörser,,,,,,,,,,,,,Munição para Morteiro 60mm!,,,, +Shortest [ 1] 2 3 4 5 6 7 Longest,SHORTEST [ 1] 2 3 4 5 6 7 LONGEST,,,,,,,,,,,,,,,,,,Mais curto [ 1] 2 3 4 5 6 7 Mais Longo,,,, +Shortest 1 [ 2] 3 4 5 6 7 Longest,SHORTEST 1 [ 2] 3 4 5 6 7 LONGEST,,,,,,,,,,,,,,,,,,Mais curto 1 [ 2] 3 4 5 6 7 Mais Longo,,,, +Shortest 1 2 [ 3] 4 5 6 7 Longest,SHORTEST 1 2 [ 3] 4 5 6 7 LONGEST,,,,,,,,,,,,,,,,,,Mais curto 1 2 [ 3] 4 5 6 7 Mais Longo,,,, +Shortest 1 2 3 [ 4] 5 6 7 Longest,SHORTEST 1 2 3 [ 4] 5 6 7 LONGEST,,,,,,,,,,,,,,,,,,Mais curto 1 2 3 [ 4] 5 6 7 Mais Longo,,,, +Shortest 1 2 3 4 [ 5] 6 7 Longest,SHORTEST 1 2 3 4 [ 5] 6 7 LONGEST,,,,,,,,,,,,,,,,,,Mais curto 1 2 3 4 [ 5] 6 7 Mais Longo,,,, +Shortest 1 2 3 4 5 [ 6] 7 Longest,SHORTEST 1 2 3 4 5 [ 6] 7 LONGEST,,,,,,,,,,,,,,,,,,Mais curto 1 2 3 4 5 [ 6] 7 Mais Longo,,,, +Shortest 1 2 3 4 5 6 [ 7] Longest,SHORTEST 1 2 3 4 5 6 [ 7] LONGEST,,,,,,,,,,,,,,,,,,Mais curto 1 2 3 4 5 6 [ 7] Mais Longo,,,, +Rifleman,RIFLEMAN,,,,,Schütze,,,,,,,,,,,,,Fuzileiro,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Tour Of Duty I,TOUR OF DUTY I,,,,,Einsatz I,,,,,,,,,,,,,,,,, -Tour Of Duty Ii,TOUR OF DUTY II,,,,,Einsatz II,,,,,,,,,,,,,,,,, -Multiplayer I,MULTIPLAYER I,,,,,Multispieler I,,,,,,,,,,,,,,,,, -Multiplayer Ii,MULTIPLAYER II,,,,,Multispieler II,,,,,,,,,,,,,,,,, +Tour Of Duty I,TOUR OF DUTY I,,,,,Einsatz I,,,,,,,,,,,,,Operação Militar I,,,, +Tour Of Duty Ii,TOUR OF DUTY II,,,,,Einsatz II,,,,,,,,,,,,,Operação Militar II,,,, +Multiplayer I,MULTIPLAYER I,,,,,Multispieler I,,,,,,,,,,,,,Multijogador I,,,, +Multiplayer Ii,MULTIPLAYER II,,,,,Multispieler II,,,,,,,,,,,,,Multijogador II,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Boot,BOOT,,,,,Ausbildung,,,,,,,,,,,,,,,,, -Grunt,GRUNT,,,,,Infanterie,,,,,,,,,,,,,,,,, -Salty,SALTY,,,,,Ernstfall,,,,,,,,,,,,,,,,, -Locked On,LOCKED ON,,,,,Tödlich,,,,,,,,,,,,,,,,, +Boot,BOOT,,,,,Ausbildung,,,,,,,,,,,,,Recruta,,,, +Grunt,GRUNT,,,,,Infanterie,,,,,,,,,,,,,Combatente,,,, +Salty,SALTY,,,,,Ernstfall,,,,,,,,,,,,,Veterano,,,, +Locked On,LOCKED ON,,,,,Tödlich,,,,,,,,,,,,,Nascido para Matar,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Base Camp,BASE CAMP,,,,,Basiscamp,,,,,,,,,,,,,,,,, -Assault,ASSAULT,,,,,Angriff,,,,,,,,,,,,,,,,, -Hill 104,HILL 104,,,,,Hügel 104,,,,,,,,,,,,,,,,, -Contact Lost,CONTACT LOST,,,,,Kontaktverlust,,,,,,,,,,,,,,,,, -Huey Down,HUEY DOWN,,,,,Hubschrauberabsturz,,,,,,,,,,,,,,,,, -Search And Destroy,SEARCH AND DESTROY,,,,,Suchen und zerstören,,,,,,,,,,,,,,,,, -Pow Camp,POW CAMP,,,,,Kriegsgefangenenlager,,,,,,,,,,,,,,,,, +Base Camp,BASE CAMP,,,,,Basiscamp,,,,,,,,,,,,,Acampamento Base,,,, +Assault,ASSAULT,,,,,Angriff,,,,,,,,,,,,,Assalto,,,, +Hill 104,HILL 104,,,,,Hügel 104,,,,,,,,,,,,,Morro 104,,,, +Contact Lost,CONTACT LOST,,,,,Kontaktverlust,,,,,,,,,,,,,Contato Perdido,,,, +Huey Down,HUEY DOWN,,,,,Hubschrauberabsturz,,,,,,,,,,,,,Huey em Perigo,,,, +Search And Destroy,SEARCH AND DESTROY,,,,,Suchen und zerstören,,,,,,,,,,,,,Procurar e Destruir,,,, +Pow Camp,POW CAMP,,,,,Kriegsgefangenenlager,,,,,,,,,,,,,Campo de Prisioneiros,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Good Morning,GOOD MORNING,,,,,Guten Morgen,,,,,,,,,,,,,,,,, -Village Sweep,VILLAGE SWEEP,,,,,Dorfsäuberung,,,,,,,,,,,,,,,,, -Night Hunters,NIGHT HUNTERS,,,,,Jäger der Nacht,,,,,,,,,,,,,,,,, -Payback Time,PAYBACK TIME,,,,,Zeit der Vergeltung,,,,,,,,,,,,,,,,, -Casual Ties,CASUAL TIES,,,,,Verluste,,,,,,,,,,,,,,,,, -Bloody River,BLOODY RIVER,,,,,Blutiger Fluss,,,,,,,,,,,,,,,,, +Good Morning,GOOD MORNING,,,,,Guten Morgen,,,,,,,,,,,,,Bom Dia,,,, +Village Sweep,VILLAGE SWEEP,,,,,Dorfsäuberung,,,,,,,,,,,,,Varredura no Vilarejo,,,, +Night Hunters,NIGHT HUNTERS,,,,,Jäger der Nacht,,,,,,,,,,,,,Caçadores Noturnos,,,, +Payback Time,PAYBACK TIME,,,,,Zeit der Vergeltung,,,,,,,,,,,,,Hora da Vingança,,,, +Casual Ties,CASUAL TIES,,,,,Verluste,,,,,,,,,,,,,Baixas,,,, +Bloody River,BLOODY RIVER,,,,,Blutiger Fluss,,,,,,,,,,,,,Rio Sangrento,,,, Platoonium,PLATOONIUM,,,,,,,,,,,,,,,,,,,,,, -Showdown In Saigon,SHOWDOWN IN SAIGON,,,,,,,,,,,,,,,,,,,,,, +Showdown In Saigon,SHOWDOWN IN SAIGON,,,,,,,,,,,,,,,,,,Confronto em Saigon,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Beirut [Ctf],BEIRUT [CTF],,,,,Beirut [CTF],,,,,,,,,,,,,,,,, -Defend [Ctf],DEFEND [CTF],,,,,Verteidigung [CTF],,,,,,,,,,,,,,,,, -Jungle [Ctf],JUNGLE [CTF],,,,,Dschungel [CTF],,,,,,,,,,,,,,,,, -Mortar Combat [Ctf],MORTAR COMBAT [CTF],,,,,Mörserkampf [CTF],,,,,,,,,,,,,,,,, -Shack [Ctf],SHACK [CTF],,,,,Schuppen [CTF],,,,,,,,,,,,,,,,, -Town [Ctf],TOWN [CTF],,,,,Stadt [CTF],,,,,,,,,,,,,,,,, -Casual Ties [Fireteam],CASUAL TIES [FIRETEAM],,,,,Verluste [Feuerteam],,,,,,,,,,,,,,,,, -Night Hunters [Fireteam],NIGHT HUNTERS [FIRETEAM],,,,,Jäger der Nacht [Feuerteam],,,,,,,,,,,,,,,,, -Assault [Fireteam],ASSAULT [FIRETEAM],,,,,Angriff [Feuerteam],,,,,,,,,,,,,,,,, -Contact Lost [Fireteam],CONTACT LOST [FIRETEAM],,,,,Kontaktverlust [Feuerteam],,,,,,,,,,,,,,,,, -Search And Destroy [Fireteam],SEARCH AND DESTROY [FIRETEAM],,,,,Suchen und Zerstören [Feuerteam],,,,,,,,,,,,,,,,, +Beirut [Ctf],BEIRUT [CTF],,,,,Beirut [CTF],,,,,,,,,,,,,Beirute [Ctf],,,, +Defend [Ctf],DEFEND [CTF],,,,,Verteidigung [CTF],,,,,,,,,,,,,Defesa [Ctf],,,, +Jungle [Ctf],JUNGLE [CTF],,,,,Dschungel [CTF],,,,,,,,,,,,,Selva [Ctf],,,, +Mortar Combat [Ctf],MORTAR COMBAT [CTF],,,,,Mörserkampf [CTF],,,,,,,,,,,,,Morteiro Combat [Ctf],,,, +Shack [Ctf],SHACK [CTF],,,,,Schuppen [CTF],,,,,,,,,,,,,Barraca [Ctf],,,, +Town [Ctf],TOWN [CTF],,,,,Stadt [CTF],,,,,,,,,,,,,Cidade [Ctf],,,, +Casual Ties [Fireteam],CASUAL TIES [FIRETEAM],,,,,Verluste [Feuerteam],,,,,,,,,,,,,Baixas [Esquadra],,,, +Night Hunters [Fireteam],NIGHT HUNTERS [FIRETEAM],,,,,Jäger der Nacht [Feuerteam],,,,,,,,,,,,,Caçadores Noturnos [Esquadra],,,, +Assault [Fireteam],ASSAULT [FIRETEAM],,,,,Angriff [Feuerteam],,,,,,,,,,,,,Assalto [Esquadra],,,, +Contact Lost [Fireteam],CONTACT LOST [FIRETEAM],,,,,Kontaktverlust [Feuerteam],,,,,,,,,,,,,Contato Perdido [Esquadra],,,, +Search And Destroy [Fireteam],SEARCH AND DESTROY [FIRETEAM],,,,,Suchen und Zerstören [Feuerteam],,,,,,,,,,,,,Procurar e Destruir [Esquadra],,,, ,,,,,,,,,,,,,,,,,,,,,,, -Beirut [Gm],BEIRUT [GM],,,,,Beirut [GM],,,,,,,,,,,,,,,,, -Chemical Factory [Gm],CHEMICAL FACTORY [GM],,,,,Chemiefabrik [GM],,,,,,,,,,,,,,,,, -Command Post [Gm],COMMAND POST [GM],,,,,Kommandoposten [GM],,,,,,,,,,,,,,,,, -Dang Street [Gm],DANG STREET [GM],,,,,Dang Straße [GM],,,,,,,,,,,,,,,,, -Desert Storm [Gm],DESERT STORM [GM],,,,,Wüstensturm [GM],,,,,,,,,,,,,,,,, -Guerrilla Warfare [Gm],GUERRILLA WARFARE [GM],,,,,Guerillakampf [GM],,,,,,,,,,,,,,,,, -Mall-Ice [Gm],MALL-ICE [GM],,,,,Supermarkt [GM],,,,,,,,,,,,,,,,, -Middle East [Gm],MIDDLE EAST [GM],,,,,Mittlerer Osten [GM],,,,,,,,,,,,,,,,, -,WW2GI,,,,,,,,,,,,,,,,,,,,,, -Medikit,MEDIKIT,,,,,,,,,,,,,,,,,,,,,, -Explosives,EXPLOSIVES,,,,,Sprengstoff,,,,,,,,,,,,,,,,, -Locked,LOCKED,,,,,Verschlossen,,,,,,,,,,,,,,,,, -Killed In Action...Press Open To Restart Level,KILLED IN ACTION...PRESS OPEN TO RESTART LEVEL,,,,,Im Dienst gefallen -.Drücke 'Benutzen',,,,,,,,,,,,,,,,, -You Need 60mm Shells To Use Mortar,YOU NEED 60mm SHELLS TO USE MORTAR,,,,,Du benötigst 60mm Munition um den Mörser zu benutzen,,,,,,,,,,,,,,,,, +Beirut [Gm],BEIRUT [GM],,,,,Beirut [GM],,,,,,,,,,,,,Beirute [Gm],,,, +Chemical Factory [Gm],CHEMICAL FACTORY [GM],,,,,Chemiefabrik [GM],,,,,,,,,,,,,Fábrica de Químicos [Gm],,,, +Command Post [Gm],COMMAND POST [GM],,,,,Kommandoposten [GM],,,,,,,,,,,,,Posto de Comando [Gm],,,, +Dang Street [Gm],DANG STREET [GM],,,,,Dang Straße [GM],,,,,,,,,,,,,Rua Dang [Gm],,,, +Desert Storm [Gm],DESERT STORM [GM],,,,,Wüstensturm [GM],,,,,,,,,,,,,Tempestade no Deserto [Gm],,,, +Guerrilla Warfare [Gm],GUERRILLA WARFARE [GM],,,,,Guerillakampf [GM],,,,,,,,,,,,,Guerrilha [Gm],,,, +Mall-Ice [Gm],MALL-ICE [GM],,,,,Supermarkt [GM],,,,,,,,,,,,,Supermercado [Gm],,,, +Middle East [Gm],MIDDLE EAST [GM],,,,,Mittlerer Osten [GM],,,,,,,,,,,,,Oriente Médio [Gm],,,, +,,WW2GI,,,,,,,,,,,,,,,,,,,,, +Medikit,MEDIKIT,,,,,,,,,,,,,,,,,,Kit médico,,,, +Explosives,EXPLOSIVES,,,,,Sprengstoff,,,,,,,,,,,,,Explosivos,,,, +Killed In Action...Press Open To Restart Level,KILLED IN ACTION...PRESS OPEN TO RESTART LEVEL,,,,,Im Dienst gefallen -.Drücke 'Benutzen',,,,,,,,,,,,,"Morto em Combate...Aperte ""Abrir"" para Reiniciar a Fase",,,, +You Need 60mm Shells To Use Mortar,YOU NEED 60mm SHELLS TO USE MORTAR,,,,,Du benötigst 60mm Munition um den Mörser zu benutzen,,,,,,,,,,,,,Você Precisa de Munição 60mm para Usar o Morteiro,,,, M1 Thompson!,M1 THOMPSON!,,,,,,,,,,,,,,,,,,,,,, -Small Medikit,SMALL MEDIKIT,,,,,Kleines Medikit,,,,,,,,,,,,,,,,, -Chemical Mine!,CHEMICAL MINE!,,,,,Giftgasmine,,,,,,,,,,,,,,,,, -Mine Placed,MINE PLACED,,,,,Mine platziert,,,,,,,,,,,,,,,,, -Disarming...,DISARMING...,,,,,Entschärfe...,,,,,,,,,,,,,,,,, -Ordering Fire Mission,ORDERING FIRE MISSION,,,,,Befehle Bombardierung,,,,,,,,,,,,,,,,, -Fire Mission Cancelled,FIRE MISSION CANCELLED,,,,,Bombardierung abgebrochen,,,,,,,,,,,,,,,,, -All 88'S Aren't Destroyed Yet !!!,ALL 88'S AREN'T DESTROYED YET !!!,,,,,Die 88er sind noch nicht zerstört,,,,,,,,,,,,,,,,, -Browning Automatic Rifle!,BROWNING AUTOMATIC RIFLE!,,,,,Browning automatisches Gewehr,,,,,,,,,,,,,,,,, -Grenade!,GRENADE!,,,,,Granate!,,,,,,,,,,,,,,,,, -Bazooka!,BAZOOKA!,,,,,Panzerfaust!,,,,,,,,,,,,,,,,, -Mp40!,MP40!,,,,,,,,,,,,,,,,,,,,,, +Small Medikit,SMALL MEDIKIT,,,,,Kleines Medikit,,,,,,,,,,,,,Kit Médico Pequeno,,,, +Chemical Mine!,CHEMICAL MINE!,,,,,Giftgasmine,,,,,,,,,,,,,Mina Química!,,,, +Disarming...,DISARMING...,,,,,Entschärfe...,,,,,,,,,,,,,Desarmando...,,,, +Ordering Fire Mission,ORDERING FIRE MISSION,,,,,Befehle Bombardierung,,,,,,,,,,,,,Chamando Artilharia,,,, +Fire Mission Cancelled,FIRE MISSION CANCELLED,,,,,Bombardierung abgebrochen,,,,,,,,,,,,,Artilharia Cancelada,,,, +All 88'S Aren't Destroyed Yet !!!,ALL 88'S AREN'T DESTROYED YET !!!,,,,,Die 88er sind noch nicht zerstört,,,,,,,,,,,,,Não Foram Destruídos Todos os 88s ainda !!!,,,, +Browning Automatic Rifle!,BROWNING AUTOMATIC RIFLE!,,,,,Browning automatisches Gewehr,,,,,,,,,,,,,Fuzil Automático Browning!,,,, +Grenade!,GRENADE!,,,,,Granate!,,,,,,,,,,,,,Granada!,,,, +Bazooka!,BAZOOKA!,,,,,Panzerfaust!,,,,,,,,,,,,,Bazuca!,,,, +MP40!,MP40!,,,,,,,,,,,,,,,,,,,,,, TNT!,TNT!,,,,,,,,,,,,,,,,,,,,,, -Flamethrower!,FLAMETHROWER!,,,,,Flammenwerfer,,,,,,,,,,,,,,,,, -Grenade Garand!,GRENADE GARAND!,,,,,Garand Granate,,,,,,,,,,,,,,,,, -Reloading Rocket Launcher,RELOADING ROCKET LAUNCHER,,,,,Lade Raketenwerfer,,,,,,,,,,,,,,,,, -Ammo For Browning Automatic Rifle!,AMMO FOR BROWNING AUTOMATIC RIFLE!,,,,,Munition für Browning,,,,,,,,,,,,,,,,, -Radioman - Calling In Fire Mission (High Explosive),RADIOMAN - CALLING IN FIRE MISSION (HIGH EXPLOSIVE),,,,,Radiomann - Erbittet Bombardierung (Sprengstoff),,,,,,,,,,,,,,,,, -Ammo For M1 Thompson!,AMMO FOR M1 THOMPSON!,,,,,Munition für M1 Thompson,,,,,,,,,,,,,,,,, -Ammo For Colt 1911!,AMMO FOR COLT 1911!,,,,,Munition für Colt 1911!,,,,,,,,,,,,,,,,, -Ammo For Sniper Rifle!,AMMO FOR SNIPER RIFLE!,,,,,Munition für Scharfschützengewehr!,,,,,,,,,,,,,,,,, -Ammo For Mp40!,AMMO FOR MP40!,,,,,Munition für MP40!,,,,,,,,,,,,,,,,, +Flamethrower!,FLAMETHROWER!,,,,,Flammenwerfer,,,,,,,,,,,,,Lança-Chamas!,,,, +Grenade Garand!,GRENADE GARAND!,,,,,Garand Granate,,,,,,,,,,,,,Garand com Lança-Granadas!,,,, +Reloading Rocket Launcher,RELOADING ROCKET LAUNCHER,,,,,Lade Raketenwerfer,,,,,,,,,,,,,Recarregando Lança-Foguetes,,,, +Ammo For Browning Automatic Rifle!,AMMO FOR BROWNING AUTOMATIC RIFLE!,,,,,Munition für Browning,,,,,,,,,,,,,Munição para Fuzil Automático Browning!,,,, +Radioman - Calling In Fire Mission (High Explosive),RADIOMAN - CALLING IN FIRE MISSION (HIGH EXPLOSIVE),,,,,Radiomann - Erbittet Bombardierung (Sprengstoff),,,,,,,,,,,,,Rádio Operador - Chamando Artilharia (Alto Explosivos),,,, +Ammo For M1 Thompson!,AMMO FOR M1 THOMPSON!,,,,,Munition für M1 Thompson,,,,,,,,,,,,,Munição para M1 Thompson!,,,, +Ammo For Colt 1911!,AMMO FOR COLT 1911!,,,,,Munition für Colt 1911!,,,,,,,,,,,,,Munição para Colt 1911!,,,, +Ammo For Sniper Rifle!,AMMO FOR SNIPER RIFLE!,,,,,Munition für Scharfschützengewehr!,,,,,,,,,,,,,Munição para Fuzil de Precisão!,,,, +Ammo For Mp40!,AMMO FOR MP40!,,,,,Munition für MP40!,,,,,,,,,,,,,Munição para Mp40!,,,, Colt 1911!,COLT 1911!,,,,,,,,,,,,,,,,,,,,,, -Private McCurkee Dead,PRIVATE MCCURKEE DEAD,,,,,Gefreiter McCurkee ist tot,,,,,,,,,,,,,,,,, -Defense System Malfunction,DEFENSE SYSTEM MALFUNCTION,,,,,Fehlfunktion des Verteidigungssystems,,,,,,,,,,,,,,,,, -Bazooka Shells,BAZOOKA SHELLS,,,,,Panzerfaustmunition,,,,,,,,,,,,,,,,, -Out Of Mortar Shells,OUT OF MORTAR SHELLS,,,,,Keine Mörsermunition mehr,,,,,,,,,,,,,,,,, -Knife,KNIFE,,,,,Messer,,,,,,,,,,,,,,,,, -60mm Shells For Mortar,60MM SHELLS FOR MORTAR,,,,,60mm Munition für Mörser,,,,,,,,,,,,,,,,, -Mines,MINES,,,,,Minen,,,,,,,,,,,,,,,,, -Smokes!,SMOKES!,,,,,Zigaretten!,,,,,,,,,,,,,,,,, -Mine Detector,MINE DETECTOR,,,,,Minendetektor,,,,,,,,,,,,,,,,, -Mad Cow Mode Activated,MAD COW MODE ACTIVATED,,,,,Rinderwahnsinnsmodus aktiviert,,,,,,,,,,,,,,,,, -All Locks Toggled,ALL LOCKS TOGGLED,,,,,Alle Schlösser geöffnet,,,,,,,,,,,,,,,,, -Cigarettes,CIGARETTES,,,,,Zigaretten!,,,,,,,,,,,,,,,,, -Mine Disarmed,MINE DISARMED,,,,,Mine entschärft,,,,,,,,,,,,,,,,, -Screen Saved,SCREEN SAVED,,,,,Screenshot gespeichert,,,,,,,,,,,,,,,,, -Activate 60mm Shells To Use Mortar,ACTIVATE 60mm SHELLS TO USE MORTAR,,,,,Aktiviere 60mm Munition um den Mörser zu benutzen,,,,,,,,,,,,,,,,, -Mine Ready,MINE READY,,,,,Mine bereit,,,,,,,,,,,,,,,,, -You Smoke Some Cigarettes,YOU SMOKE SOME CIGARETTES,,,,,Du rauchst eine Zigarette,,,,,,,,,,,,,,,,, -Proceed Into Village,PROCEED INTO VILLAGE,,,,,Begib dich ins Dorf,,,,,,,,,,,,,,,,, -Private Mccurkee - Following,PRIVATE McCURKEE - FOLLOWING,,,,,Gefreiter Mccurkee - folgt,,,,,,,,,,,,,,,,, -Private Mccurkee Dead,PRIVATE McCURKEE DEAD,,,,,Gefreiter McCurkee - tot,,,,,,,,,,,,,,,,, -Private Mccurkee - Awaiting Further Orders,PRIVATE McCURKEE - AWAITING FURTHER ORDERS,,,,,Gefreiter McCurkee -erwartet Anweisungent,,,,,,,,,,,,,,,,, -Cannot Load Multiplayer Game,CANNOT LOAD MULTIPLAYER GAME,,,,,Kann Mehrspielerspiel nichtladen,,,,,,,,,,,,,,,,, -Demoman - Placing A Mine,DEMOMAN - PLACING A MINE,,,,,Demomann - platziert eine Mine,,,,,,,,,,,,,,,,, -Demoman - Placing Explosives,DEMOMAN - PLACING EXPLOSIVES,,,,,Demomann - platziert Sprengstoff,,,,,,,,,,,,,,,,, -Can't Go Further Or You'll Drown,CAN'T GO FURTHER OR YOU'LL DROWN,,,,,Wenn du weitergehst ertrinkst du,,,,,,,,,,,,,,,,, -Booze!,BOOZE!,,,,,Schnaps!,,,,,,,,,,,,,,,,, -You Have Become A Beast,YOU HAVE BECOME A BEAST,,,,,Du bist mutiert,,,,,,,,,,,,,,,,, -Mines ( 5),MINES ( 5),,,,,Minen ( 5),,,,,,,,,,,,,,,,, -Medikit Used,MEDIKIT USED,,,,,Medikit benutzt,,,,,,,,,,,,,,,,, -Explosives,EXPLOSIVES,,,,,Sprengstoff,,,,,,,,,,,,,,,,, -Explosives Placed,EXPLOSIVES PLACED,,,,,Sprengstoff platziert,,,,,,,,,,,,,,,,, -Can't Pick Up Artillery Ammo,CAN'T PICK UP ARTILLERY AMMO,,,,,Kann Artilleriemunition nicht nehmen,,,,,,,,,,,,,,,,, -Defend This Position Until Further Orders,DEFEND THIS POSITION UNTIL FURTHER ORDERS,,,,,Verteidige diese Position bis du neue Befehle erhältst,,,,,,,,,,,,,,,,, -Shortest }{{{{{{ Longest,SHORTEST }{{{{{{ LONGEST,,,,,,,,,,,,,,,,,,,,,, -Shortest }}{{{{{ Longest,SHORTEST }}{{{{{ LONGEST,,,,,,,,,,,,,,,,,,,,,, -Shortest }}}{{{{ Longest,SHORTEST }}}{{{{ LONGEST,,,,,,,,,,,,,,,,,,,,,, -Shortest }}}}{{{ Longest,SHORTEST }}}}{{{ LONGEST,,,,,,,,,,,,,,,,,,,,,, -Shortest }}}}}{{ Longest,SHORTEST }}}}}{{ LONGEST,,,,,,,,,,,,,,,,,,,,,, -Shortest }}}}}}{ Longest,SHORTEST }}}}}}{ LONGEST,,,,,,,,,,,,,,,,,,,,,, -Shortest }}}}}}} Longest,SHORTEST }}}}}}} LONGEST,,,,,,,,,,,,,,,,,,,,,, -Engineer,ENGINEER,,,,,Maschinist,,,,,,,,,,,,,,,,, -Can't Proceed Without Private Mccurkee!,CAN'T PROCEED WITHOUT PRIVATE McCURKEE!,,,,,Du kannst ohne McCurkee nicht weiter.,,,,,,,,,,,,,,,,, -Using A Special Skill...,USING A SPECIAL SKILL...,,,,,Benutze spezielle Fähigkeit,,,,,,,,,,,,,,,,, -Defend This Position Until Reinforcements Arrive,DEFEND THIS POSITION UNTIL REINFORCEMENTS ARRIVE,,,,,Verteidige diese Position bis Verstärkung kommt,,,,,,,,,,,,,,,,, -Reinforcements Have Arrived,REINFORCEMENTS HAVE ARRIVED,,,,,Verstärkung ist angekommen,,,,,,,,,,,,,,,,, -< EMPTY >,< EMPTY >,,,,,< LEER>,,,,,,,,,,,,,,,,, -Your Morale Is Weakening,YOUR MORALE IS WEAKENING,,,,,Deine Moral sinkt,,,,,,,,,,,,,,,,, -You Are Panicking,YOU ARE PANICKING,,,,,Du verfällst in Panik,,,,,,,,,,,,,,,,, -You Are Becoming Insane,YOU ARE BECOMING INSANE,,,,,Du verlierst den Verstand,,,,,,,,,,,,,,,,, -Giving Firstaid...,GIVING FIRSTAID...,,,,,Leiste Erste Hilfe...,,,,,,,,,,,,,,,,, -Mine Detector On,MINE DETECTOR ON,,,,,Minendetektor an.,,,,,,,,,,,,,,,,, -Giving Firstaid Fast...,GIVING FIRSTAID FAST...,,,,,Leiste schnell Erste Hilfe,,,,,,,,,,,,,,,,, -Mine Detector Off,MINE DETECTOR OFF,,,,,Minendetektor aus,,,,,,,,,,,,,,,,, -You Are In Red Team,YOU ARE IN RED TEAM,,,,,Du bist im roten Team,,,,,,,,,,,,,,,,, -You Are In Blue Team,YOU ARE IN BLUE TEAM,,,,,Du bist im blauen Team,,,,,,,,,,,,,,,,, -Choose Team,CHOOSE TEAM,,,,,Wähle dein Team,,,,,,,,,,,,,,,,, +Private McCurkee Dead,PRIVATE MCCURKEE DEAD,,,,,Gefreiter McCurkee ist tot,,,,,,,,,,,,,Soldado McCurkee Morto,,,, +Bazooka Shells,BAZOOKA SHELLS,,,,,Panzerfaustmunition,,,,,,,,,,,,,Munição para Bazuca,,,, +Out Of Mortar Shells,OUT OF MORTAR SHELLS,,,,,Keine Mörsermunition mehr,,,,,,,,,,,,,Sem Munição para Morteiro,,,, +60mm Shells For Mortar,60MM SHELLS FOR MORTAR,,,,,60mm Munition für Mörser,,,,,,,,,,,,,Munição 60mm para Morteiro,,,, +Mines,MINES,,,,,Minen,,,,,,,,,,,,,Minas,,,, +Smokes!,SMOKES!,,,,,Zigaretten!,,,,,,,,,,,,,Cigarros!,,,, +Mad Cow Mode Activated,MAD COW MODE ACTIVATED,,,,,Rinderwahnsinnsmodus aktiviert,,,,,,,,,,,,,Modo Vaca Louca Ativado,,,, +Cigarettes,CIGARETTES,,,,,Zigaretten!,,,,,,,,,,,,,Cigarros,,,, +Screen Saved,SCREEN SAVED,,,,,Screenshot gespeichert,,,,,,,,,,,,,Tela Capturada,,,, +Activate 60mm Shells To Use Mortar,ACTIVATE 60mm SHELLS TO USE MORTAR,,,,,Aktiviere 60mm Munition um den Mörser zu benutzen,,,,,,,,,,,,,Ative a Munição 60mm Para Usar o Morteiro,,,, +You Smoke Some Cigarettes,YOU SMOKE SOME CIGARETTES,,,,,Du rauchst eine Zigarette,,,,,,,,,,,,,Você Fumou Alguns Cigarros,,,, +Proceed Into Village,PROCEED INTO VILLAGE,,,,,Begib dich ins Dorf,,,,,,,,,,,,,Prossiga no Vilarejo,,,, +Private Mccurkee - Following,PRIVATE McCURKEE - FOLLOWING,,,,,Gefreiter Mccurkee - folgt,,,,,,,,,,,,,Soldado Mccurkee - Seguindo,,,, +Private Mccurkee Dead,PRIVATE McCURKEE DEAD,,,,,Gefreiter McCurkee - tot,,,,,,,,,,,,,Soldado McCurkee Morto,,,, +Private Mccurkee - Awaiting Further Orders,PRIVATE McCURKEE - AWAITING FURTHER ORDERS,,,,,Gefreiter McCurkee -erwartet Anweisungent,,,,,,,,,,,,,Soldado McCurkee - Aguardando Ordens,,,, +Cannot Load Multiplayer Game,CANNOT LOAD MULTIPLAYER GAME,,,,,Kann Mehrspielerspiel nichtladen,,,,,,,,,,,,,Impossível Carregar Partida Multijogador,,,, +Demoman - Placing A Mine,DEMOMAN - PLACING A MINE,,,,,Demomann - platziert eine Mine,,,,,,,,,,,,,Esp. em Demolições - Colocando uma Mina,,,, +Demoman - Placing Explosives,DEMOMAN - PLACING EXPLOSIVES,,,,,Demomann - platziert Sprengstoff,,,,,,,,,,,,,Esp. em Demolições - Colocando Explosivos,,,, +Can't Go Further Or You'll Drown,CAN'T GO FURTHER OR YOU'LL DROWN,,,,,Wenn du weitergehst ertrinkst du,,,,,,,,,,,,,Impossível Avançar Sem Se Afogar,,,, +Booze!,BOOZE!,,,,,Schnaps!,,,,,,,,,,,,,Birita!,,,, +You Have Become A Beast,YOU HAVE BECOME A BEAST,,,,,Du bist mutiert,,,,,,,,,,,,,Você se Tornou Uma Besta!,,,, +Mines ( 5),MINES ( 5),,,,,Minen ( 5),,,,,,,,,,,,,Minas ( 5),,,, +Medikit Used,MEDIKIT USED,,,,,Medikit benutzt,,,,,,,,,,,,,Kit Médico Usado,,,, +Explosives,EXPLOSIVES,,,,,Sprengstoff,,,,,,,,,,,,,Explosivos,,,, +Explosives Placed,EXPLOSIVES PLACED,,,,,Sprengstoff platziert,,,,,,,,,,,,,Explosivos Colocados,,,, +Can't Pick Up Artillery Ammo,CAN'T PICK UP ARTILLERY AMMO,,,,,Kann Artilleriemunition nicht nehmen,,,,,,,,,,,,,Impossível Pegar Munição de Artilharia,,,, +Defend This Position Until Further Orders,DEFEND THIS POSITION UNTIL FURTHER ORDERS,,,,,Verteidige diese Position bis du neue Befehle erhältst,,,,,,,,,,,,,Defenda Esta Posição Até Novas Ordens,,,, +Shortest }{{{{{{ Longest,SHORTEST }{{{{{{ LONGEST,,,,,,,,,,,,,,,,,,Mais Curto }{{{{{{ Mais Longo,,,, +Shortest }}{{{{{ Longest,SHORTEST }}{{{{{ LONGEST,,,,,,,,,,,,,,,,,,Mais Curto }}{{{{{ Mais Longo,,,, +Shortest }}}{{{{ Longest,SHORTEST }}}{{{{ LONGEST,,,,,,,,,,,,,,,,,,Mais Curto }}}{{{{ Mais Longo,,,, +Shortest }}}}{{{ Longest,SHORTEST }}}}{{{ LONGEST,,,,,,,,,,,,,,,,,,Mais Curto }}}}{{{ Mais Longo,,,, +Shortest }}}}}{{ Longest,SHORTEST }}}}}{{ LONGEST,,,,,,,,,,,,,,,,,,Mais Curto }}}}}{{ Mais Longo,,,, +Shortest }}}}}}{ Longest,SHORTEST }}}}}}{ LONGEST,,,,,,,,,,,,,,,,,,Mais Curto }}}}}}{ Mais Longo,,,, +Shortest }}}}}}} Longest,SHORTEST }}}}}}} LONGEST,,,,,,,,,,,,,,,,,,Mais Curto }}}}}}} Mais Longo,,,, +Engineer,ENGINEER,,,,,Maschinist,,,,,,,,,,,,,Engenheiro,,,, +Can't Proceed Without Private Mccurkee!,CAN'T PROCEED WITHOUT PRIVATE McCURKEE!,,,,,Du kannst ohne McCurkee nicht weiter.,,,,,,,,,,,,,Não Pode Prosseguir Sem o Soldado Mccurkee!,,,, +Using A Special Skill...,USING A SPECIAL SKILL...,,,,,Benutze spezielle Fähigkeit,,,,,,,,,,,,,Usando Uma Habilidade Especial...,,,, +Defend This Position Until Reinforcements Arrive,DEFEND THIS POSITION UNTIL REINFORCEMENTS ARRIVE,,,,,Verteidige diese Position bis Verstärkung kommt,,,,,,,,,,,,,Defenda Esta Posição Até os Reforços Chegarem,,,, +Reinforcements Have Arrived,REINFORCEMENTS HAVE ARRIVED,,,,,Verstärkung ist angekommen,,,,,,,,,,,,,Reforços Chegaram,,,, +< EMPTY >,< EMPTY >,,,,,< LEER>,,,,,,,,,,,,,< VAZIO >,,,, +Your Morale Is Weakening,YOUR MORALE IS WEAKENING,,,,,Deine Moral sinkt,,,,,,,,,,,,,Sua Moral Está Caindo,,,, +You Are Panicking,YOU ARE PANICKING,,,,,Du verfällst in Panik,,,,,,,,,,,,,Você Está Entrando em Pânico,,,, +You Are Becoming Insane,YOU ARE BECOMING INSANE,,,,,Du verlierst den Verstand,,,,,,,,,,,,,Você Está Enlouquecendo,,,, +Giving Firstaid...,GIVING FIRSTAID...,,,,,Leiste Erste Hilfe...,,,,,,,,,,,,,Prestando os Primeiros Socorros...,,,, +Mine Detector On,MINE DETECTOR ON,,,,,Minendetektor an.,,,,,,,,,,,,,Detector de Minas Ligado,,,, +Giving Firstaid Fast...,GIVING FIRSTAID FAST...,,,,,Leiste schnell Erste Hilfe,,,,,,,,,,,,,Prestando os Primeiros Socorros Rapidamente...,,,, +Mine Detector Off,MINE DETECTOR OFF,,,,,Minendetektor aus,,,,,,,,,,,,,Detector de Minas Desligado,,,, +You Are In Red Team,YOU ARE IN RED TEAM,,,,,Du bist im roten Team,,,,,,,,,,,,,Você Está na Equipe Vermelha,,,, +You Are In Blue Team,YOU ARE IN BLUE TEAM,,,,,Du bist im blauen Team,,,,,,,,,,,,,Você Está na Equipe Azul,,,, +Choose Team,CHOOSE TEAM,,,,,Wähle dein Team,,,,,,,,,,,,,Escolha a Equipe,,,, ,,,,,,,,,,,,,,,,,,,,,,, -D Day,D DAY,,,,,,,,,,,,,,,,,,,,,, -France,FRANCE,,,,,,,,,,,,,,,,,,,,,, +D Day,D DAY,,,,,,,,,,,,,,,,,,Dia D,,,, +France,FRANCE,,,,,,,,,,,,,,,,,,França,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Draftee,DRAFTEE,,,,,Wehrpflichtiger,,,,,,,,,,,,,,,,, -GI,GI,,,,,,,,,,,,,,,,,,,,,, -Paratrooper,PARATROOPER,,,,,Fallschirmjäger,,,,,,,,,,,,,,,,, -Veteran,VETERAN,,,,,,,,,,,,,,,,,,,,,, +Draftee,DRAFTEE,,,,,Wehrpflichtiger,,,,,,,,,,,,,Recruta,,,, +GI,GI,,,,,,,,,,,,,,,,,,Soldado,,,, +Paratrooper,PARATROOPER,,,,,Fallschirmjäger,,,,,,,,,,,,,Paraquedista,,,, +Veteran,VETERAN,,,,,,,,,,,,,,,,,,Veterano,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Atlantic Wall,ATLANTIC WALL,,,,,Atlantischer Wall,,,,,,,,,,,,,,,,, -Defend,DEFEND,,,,,Verteidigung,,,,,,,,,,,,,,,,, -Hunt For The 88'S,HUNT FOR THE 88'S,,,,,Suche nach den 88ern,,,,,,,,,,,,,,,,, -Finding Private McCurkee,FINDING PRIVATE McCURKEE,,,,,Suche den Gefreiten McCurkee,,,,,,,,,,,,,,,,, -Saving Private McCurkee,SAVING PRIVATE McCURKEE,,,,,Rette den Gefreiten McCurkee,,,,,,,,,,,,,,,,, -Mop Up,MOP UP,,,,,Aufwischen,,,,,,,,,,,,,,,,, +Atlantic Wall,ATLANTIC WALL,,,,,Atlantischer Wall,,,,,,,,,,,,,Muralha do Atlântico,,,, +Defend,DEFEND,,,,,Verteidigung,,,,,,,,,,,,,Defesa,,,, +Hunt For The 88'S,HUNT FOR THE 88'S,,,,,Suche nach den 88ern,,,,,,,,,,,,,Caçando os 88s,,,, +Finding Private McCurkee,FINDING PRIVATE McCURKEE,,,,,Suche den Gefreiten McCurkee,,,,,,,,,,,,,Em Busca do Soldado McCurkee,,,, +Saving Private McCurkee,SAVING PRIVATE McCURKEE,,,,,Rette den Gefreiten McCurkee,,,,,,,,,,,,,O Resgate do Soldado McCurkee,,,, +Mop Up,MOP UP,,,,,Aufwischen,,,,,,,,,,,,,Operação de Limpeza,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Hell From Above,HELL FROM ABOVE,,,,,Hölle von oben,,,,,,,,,,,,,,,,, -Seaside Sweep,SEASIDE SWEEP,,,,,Küstenfeger,,,,,,,,,,,,,,,,, -Under Fire,UNDER FIRE,,,,,Unter Feuer,,,,,,,,,,,,,,,,, -Paperwork,PAPERWORK,,,,,Papierkram,,,,,,,,,,,,,,,,, -Railroad Typhoon,RAILROAD TYPHOON,,,,,Eisenbahnbaron,,,,,,,,,,,,,,,,, -A Game Of Bridge,A GAME OF BRIDGE,,,,,Ein Spiel Bridge,,,,,,,,,,,,,,,,, -Urban Rush,URBAN RUSH,,,,,Städtischer Ansturm,,,,,,,,,,,,,,,,, +Hell From Above,HELL FROM ABOVE,,,,,Hölle von oben,,,,,,,,,,,,,Inferno Vindo de Cima,,,, +Seaside Sweep,SEASIDE SWEEP,,,,,Küstenfeger,,,,,,,,,,,,,Varredura Costeira,,,, +Under Fire,UNDER FIRE,,,,,Unter Feuer,,,,,,,,,,,,,Sob Fogo,,,, +Paperwork,PAPERWORK,,,,,Papierkram,,,,,,,,,,,,,Papelada,,,, +Railroad Typhoon,RAILROAD TYPHOON,,,,,Eisenbahnbaron,,,,,,,,,,,,,Vendaval na Ferrovia,,,, +A Game Of Bridge,A GAME OF BRIDGE,,,,,Ein Spiel Bridge,,,,,,,,,,,,,Uma Partida de Bridge,,,, +Urban Rush,URBAN RUSH,,,,,Städtischer Ansturm,,,,,,,,,,,,,Correria Urbana,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Mole Hill [Gimatch],MOLE HILL [GIMATCH],,,,,Maulwurfshügel [GMatch],,,,,,,,,,,,,,,,, -Monastery [Gimatch],MONASTERY [GIMATCH],,,,,Kloster [GMatch],,,,,,,,,,,,,,,,, -Cavefear2 [Gimatch],CAVEFEAR2 [GIMATCH],,,,,Höhlenangst [GMatch],,,,,,,,,,,,,,,,, -Bastogne Boyz [Gimatch],BASTOGNE BOYZ [GIMATCH],,,,,Kerle der Bastogne [GMatch],,,,,,,,,,,,,,,,, -Small Town [Gimatch],SMALL TOWN [GIMATCH],,,,,Kleinstadt [GMatch],,,,,,,,,,,,,,,,, -Town Ruins [Gimatch],TOWN RUINS [GIMATCH],,,,,Ruinen [GMatch],,,,,,,,,,,,,,,,, -Fuhrer's Bunker [Gimatch],FUHRER'S BUNKER [GIMATCH],,,,,Führerbunker [GMatch],,,,,,,,,,,,,,,,, -Good Night [Gimatch],GOOD NIGHT [GIMATCH],,,,,Gute Nacht [GMatch],,,,,,,,,,,,,,,,, +Mole Hill [Gimatch],MOLE HILL [GIMATCH],,,,,Maulwurfshügel [GMatch],,,,,,,,,,,,,Toca de Toupeira [Gimatch],,,, +Monastery [Gimatch],MONASTERY [GIMATCH],,,,,Kloster [GMatch],,,,,,,,,,,,,Mosteiro [Gimatch],,,, +Cavefear2 [Gimatch],CAVEFEAR2 [GIMATCH],,,,,Höhlenangst [GMatch],,,,,,,,,,,,,Caverna do Terror [Gimatch],,,, +Bastogne Boyz [Gimatch],BASTOGNE BOYZ [GIMATCH],,,,,Kerle der Bastogne [GMatch],,,,,,,,,,,,,Garotos de Bastogne [Gimatch],,,, +Small Town [Gimatch],SMALL TOWN [GIMATCH],,,,,Kleinstadt [GMatch],,,,,,,,,,,,,Pequena Cidade [Gimatch],,,, +Town Ruins [Gimatch],TOWN RUINS [GIMATCH],,,,,Ruinen [GMatch],,,,,,,,,,,,,Ruínas da Cidade [Gimatch],,,, +Fuhrer's Bunker [Gimatch],FUHRER'S BUNKER [GIMATCH],,,,,Führerbunker [GMatch],,,,,,,,,,,,,Bunker do Fuhrer [Gimatch],,,, +Good Night [Gimatch],GOOD NIGHT [GIMATCH],,,,,Gute Nacht [GMatch],,,,,,,,,,,,,Boa Noite [Gimatch],,,, ,,,,,,,,,,,,,,,,,,,,,,, -D Day [Fireteam],D DAY [FIRETEAM],,,,,,,,,,,,,,,,,,,,,, -Seaside Sweep [Fireteam],SEASIDE SWEEP [FIRETEAM],,,,,Küstenfeger [Fireteam],,,,,,,,,,,,,,,,, -Paperwork [Fireteam],PAPERWORK [FIRETEAM],,,,,Papierkram [Fireteam],,,,,,,,,,,,,,,,, -Hunt For The 88'S [Fireteam],HUNT FOR THE 88'S [FIRETEAM],,,,,Suche nach den 88ern [Fireteam],,,,,,,,,,,,,,,,, -D Day [CTF],D DAY [CTF],,,,,,,,,,,,,,,,,,,,,, -City In Ruins [CTF],CITY IN RUINS [CTF],,,,,Stadt in Ruinen [CTF],,,,,,,,,,,,,,,,, -Hedgerow Hell [CTF],HEDGEROW HELL [CTF],,,,,Heckenhölle [CTF],,,,,,,,,,,,,,,,, +D Day [Fireteam],D DAY [FIRETEAM],,,,,,,,,,,,,,,,,,Dia D [Esquadra],,,, +Seaside Sweep [Fireteam],SEASIDE SWEEP [FIRETEAM],,,,,Küstenfeger [Fireteam],,,,,,,,,,,,,Varredura Costeira [Esquadra],,,, +Paperwork [Fireteam],PAPERWORK [FIRETEAM],,,,,Papierkram [Fireteam],,,,,,,,,,,,,Papelada [Esquadra],,,, +Hunt For The 88'S [Fireteam],HUNT FOR THE 88'S [FIRETEAM],,,,,Suche nach den 88ern [Fireteam],,,,,,,,,,,,,Caçando os 88s [Esquadra],,,, +D Day [CTF],D DAY [CTF],,,,,,,,,,,,,,,,,,Dia D [CTF],,,, +City In Ruins [CTF],CITY IN RUINS [CTF],,,,,Stadt in Ruinen [CTF],,,,,,,,,,,,,Cidade Arruinada [CTF],,,, +Hedgerow Hell [CTF],HEDGEROW HELL [CTF],,,,,Heckenhölle [CTF],,,,,,,,,,,,,Inferno dos Espinhos [CTF],,,, Casino De Ouistreham [CTF],CASINO DE OUISTREHAM [CTF],,,,,,,,,,,,,,,,,,,,,, -,Redneck Rampage,,,,,,,,,,,,,,,,,,,,,, -Auto Aimin'...,AUTO AIMIN'...,,,,,Autom. Zielen,,,,,,,,,,,,,,,,, -Show Yer Map: OFF,SHOW YER MAP: OFF,,,,,Zeig die Karte: Aus,,,,,,,,,,,,,,,,, -Turned On!,TURNED ON!,,,,,Angemacht!,,,,,,,,,,,,,,,,, -Cheap Ass Whiskey...,CHEAP ASS WHISKEY...,,,,,Billiger Fusel,,,,,,,,,,,,,,,,, -Locked!,LOCKED!,,,,,Verrammelt!,,,,,,,,,,,,,,,,, -Take It All!,TAKE IT ALL!,,,,,Her damit!,,,,,,,,,,,,,,,,, -Hip Waders...,HIP WADERS...,,,,,Gummistiefel,,,,,,,,,,,,,,,,, -Wasted!,WASTED!,,,,,Verbraucht!,,,,,,,,,,,,,,,,, -Unlocked,UNLOCKED,,,,,Aufgeschlossen,,,,,,,,,,,,,,,,, -Yer Secret Place!,YER SECRET PLACE!,,,,,Dein Geheimort,,,,,,,,,,,,,,,,, -Squashed Like A Bug!,SQUASHED LIKE A BUG!,,,,,Zertreten wie 'ne Fliege,,,,,,,,,,,,,,,,, -You's On A Rampage!!!,YOU'S ON A RAMPAGE!!!,,,,,Du läufst Amok!,,,,,,,,,,,,,,,,, -Mash Activator Key To Kill Again!,MASH ACTIVATOR KEY TO KILL AGAIN!,,,,,Hau auf 'Benutzen' um weiterzutöten!,,,,,,,,,,,,,,,,, -Ammo For Alien Arm Gun!!!,AMMO FOR ALIEN ARM GUN!!!,,,,,Munition für Armgewehr!,,,,,,,,,,,,,,,,, -Turned Off...,TURNED OFF...,,,,,Abgeschaltet,,,,,,,,,,,,,,,,, -Switch Operated Only!,SWITCH OPERATED ONLY!,,,,,Wird mit Schalter bedient!,,,,,,,,,,,,,,,,, -Elvis Lives!,ELVIS LIVES!,,,,,Elvis lebt!,,,,,,,,,,,,,,,,, -The King Is Dead!,THE KING IS DEAD!,,,,,Der King ist tot!,,,,,,,,,,,,,,,,, -Dee-Lishus Goo Goo Cluster!,DEE-LISHUS GOO GOO CLUSTER!,,,,,Leckerer Goo Goo Cluster,,,,,,,,,,,,,,,,, -Wussy Aimin' Device: ON,WUSSY AIMIN' DEVICE: ON,,,,,Zielgerät für Weicheier: AN,,,,,,,,,,,,,,,,, -Wussy Aimin' Device: OFF,WUSSY AIMIN' DEVICE: OFF,,,,,Zielgerät für Weicheier: AUS,,,,,,,,,,,,,,,,, -"Hell, I Thought You Was A Killbilly!","HELL, I THOUGHT YOU WAS A KILLBILLY!",,,,,Und ich dachte du wärst ein Killbilly,,,,,,,,,,,,,,,,, -Type The Cheat Code:,TYPE THE CHEAT CODE:,,,,,Schreib den Schummelcode,,,,,,,,,,,,,,,,, -Yer Sound: ON,YER SOUND: ON,,,,,Dein Sound: AN,,,,,,,,,,,,,,,,, -Yer Sound: OFF,YER SOUND: OFF,,,,,Dein Sound: AUS,,,,,,,,,,,,,,,,, -Yer Screen Captured And Jailed!,YER SCREEN CAPTURED AND JAILED!,,,,,Screenshot eingefangen und weggesperrt!,,,,,,,,,,,,,,,,, -Xxx Moonshine!,XXX MOONSHINE!,,,,,XXX Schwarzgebrannter!,,,,,,,,,,,,,,,,, -Vacuum Cleaner Hose Snorkel System,VACUUM CLEANER HOSE SNORKEL SYSTEM,,,,,Staubsaugerschlauch-Schnorchelsystem,,,,,,,,,,,,,,,,, -Press F1 Fer Help,PRESS F1 FER HELP,,,,,Drücke F1 für Hilfe,,,,,,,,,,,,,,,,, -Ain't Got The Key!,AIN'T GOT THE KEY!,,,,,Hab den Schlüssel nich'!,,,,,,,,,,,,,,,,, -Skeleton Key!,SKELETON KEY!,,,,,Schlüssel!,,,,,,,,,,,,,,,,, -Cheat Code: Unrecognized,CHEAT CODE: UNRECOGNIZED,,,,,Unbekannter Schummelcode,,,,,,,,,,,,,,,,, -Teat Gun Ammo !,TEAT GUN AMMO !,,,,,BH-Munition!,,,,,,,,,,,,,,,,, -Ripsaw Ammo !,RIPSAW AMMO !,,,,,Spaltsägenblätter!,,,,,,,,,,,,,,,,, -Cheater! You Used The,CHEATER! YOU USED THE,,,,,Du Schummler. Du hast dich,,,,,,,,,,,,,,,,, -Cheat To Come Back Alive,CHEAT TO COME BACK ALIVE,,,,,zurück ins Leben gemogelt!,,,,,,,,,,,,,,,,, -No Savin' Or Loadin' Fer Psyco,NO SAVIN' OR LOADIN' FER PSYCO,,,,,Psychos laden und speichern nich'!,,,,,,,,,,,,,,,,, -Huntin' Rifle!,HUNTIN' RIFLE!,,,,,Jagdgewehr!,,,,,,,,,,,,,,,,, -Dyn-O-Mite!,DYN-O-MITE!,,,,,Dynamit!,,,,,,,,,,,,,,,,, -Crossbow!,CROSSBOW!,,,,,Armbrust!,,,,,,,,,,,,,,,,, -Yer Scattergun!,YER SCATTERGUN!,,,,,Deine Schrotflinte!,,,,,,,,,,,,,,,,, -Powder Keg!,POWDER KEG!,,,,,Pulverfass!,,,,,,,,,,,,,,,,, -Alien Teat Gun!,ALIEN TEAT GUN!,,,,,BH-Waffe!,,,,,,,,,,,,,,,,, -Bowling Ball!!,BOWLING BALL!!,,,,,Bowlingkugel!,,,,,,,,,,,,,,,,, -Ripsaw!!,RIPSAW!!,,,,,Spaltsäge!,,,,,,,,,,,,,,,,, -Large Pork Rinds!,LARGE PORK RINDS!,,,,,Schweineschwarten!,,,,,,,,,,,,,,,,, -Ammo For Rifle!,AMMO FOR RIFLE!,,,,,Munition für Jagdgewehr!,,,,,,,,,,,,,,,,, -Ammo For Crossbow!,AMMO FOR CROSSBOW!,,,,,Munition für Armbrust!,,,,,,,,,,,,,,,,, -Speedloader!,SPEEDLOADER!,,,,,Schnelllader!,,,,,,,,,,,,,,,,, -Hip Waders Off,HIP WADERS OFF,,,,,Gummistiefel aus,,,,,,,,,,,,,,,,, -Hip Waders On,HIP WADERS ON,,,,,Gummistiefel an,,,,,,,,,,,,,,,,, -Yer Scattergun Shells!,YER SCATTERGUN SHELLS!,,,,,Flintenpatronen!,,,,,,,,,,,,,,,,, -Some Kind Of Key Required,SOME KIND OF KEY REQUIRED,,,,,Du brauchst 'nen Schlüssel!,,,,,,,,,,,,,,,,, -Some Other Kind Of Key Required,SOME OTHER KIND OF KEY REQUIRED,,,,,Du brauchst 'nen anderen Schlüssel!,,,,,,,,,,,,,,,,, -Yet Even Another Kind Of Key Required,YET EVEN ANOTHER KIND OF KEY REQUIRED,,,,,Du brauchst noch 'nen anderen Schlüssel!,,,,,,,,,,,,,,,,, -Yer Weapon Lowered,YER WEAPON LOWERED,,,,,Waffe gesenkt,,,,,,,,,,,,,,,,, -Yer Weapon Raised,YER WEAPON RAISED,,,,,Waffe gehoben,,,,,,,,,,,,,,,,, -Vaccum Cleaner Hose Snorkel On!,VACCUM CLEANER HOSE SNORKEL ON!,,,,,Schnorchel an,,,,,,,,,,,,,,,,, -Haulin' Ass Mode Off...,HAULIN' ASS MODE OFF...,,,,,Bin doch kein D-Zug!,,,,,,,,,,,,,,,,, -Haulin' Ass Mode On!!!,HAULIN' ASS MODE ON!!!,,,,,Schwing die Hufe!,,,,,,,,,,,,,,,,, -Alien Arm Gun,ALIEN ARM GUN,,,,,Armgewehr,,,,,,,,,,,,,,,,, -Vacuum Cleaner Snorkle,VACUUM CLEANER SNORKLE,,,,,Staubsaugerschnorchel,,,,,,,,,,,,,,,,, -Xxx Moonshine,XXX MOONSHINE,,,,,XXX Schwarzgebrannter,,,,,,,,,,,,,,,,, -For You Grandpa!,FOR YOU GRANDPA!,,,,,"Für dich, Opa!",,,,,,,,,,,,,,,,, -All Locks Toggled,ALL LOCKS TOGGLED,,,,,Alle Schlösser geknackt,,,,,,,,,,,,,,,,, -What The!,WHAT THE!,,,,,Was zum...,,,,,,,,,,,,,,,,, -You Were All Wrong!,YOU WERE ALL WRONG!,,,,,Du hattest Unrecht!,,,,,,,,,,,,,,,,, -Good'n!,GOOD'N!,,,,,Holla!,,,,,,,,,,,,,,,,, -Bad'n...,BAD'N...,,,,,Ups...,,,,,,,,,,,,,,,,, -You're Burnin'!,YOU'RE BURNIN'!,,,,,Du brennst!,,,,,,,,,,,,,,,,, -Clippin': OFF,CLIPPIN': OFF,,,,,Clipping: An,,,,,,,,,,,,,,,,, -Clippin': ON,CLIPPIN': ON,,,,,Clipping: Aus,,,,,,,,,,,,,,,,, -You Done Killed 'Em All!,YOU DONE KILLED 'EM ALL!,,,,,Du hast sie alle alle gemacht!,,,,,,,,,,,,,,,,, +,,Redneck Rampage,,,,,,,,,,,,,,,,,,,,, +Auto Aimin'...,AUTO AIMIN'...,,,,,Autom. Zielen,,,,,,,,,,,,,Mira Automática...,,,, +Show Yer Map: OFF,SHOW YER MAP: OFF,,,,,Zeig die Karte: Aus,,,,,,,,,,,,,Mostra o Mapa: DESLIGADO,,,, +Turned On!,TURNED ON!,,,,,Angemacht!,,,,,,,,,,,,,Tá Ligado!,,,, +Cheap Ass Whiskey...,CHEAP ASS WHISKEY...,,,,,Billiger Fusel,,,,,,,,,,,,,Uísque Barato...,,,, +Locked!,LOCKED!,,,,,Verrammelt!,,,,,,,,,,,,,Trancada!,,,, +Take It All!,TAKE IT ALL!,,,,,Her damit!,,,,,,,,,,,,,Pega Tudo!,,,, +Hip Waders...,HIP WADERS...,,,,,Gummistiefel,,,,,,,,,,,,,Galocha...,,,, +Wasted!,WASTED!,,,,,Verbraucht!,,,,,,,,,,,,,Morreu!,,,, +Unlocked,UNLOCKED,,,,,Aufgeschlossen,,,,,,,,,,,,,Destrancada,,,, +Yer Secret Place!,YER SECRET PLACE!,,,,,Dein Geheimort,,,,,,,,,,,,,Lugar Secreto!,,,, +Squashed Like A Bug!,SQUASHED LIKE A BUG!,,,,,Zertreten wie 'ne Fliege,,,,,,,,,,,,,Esmagado Que Nem um Bicho!,,,, +You's On A Rampage!!!,YOU'S ON A RAMPAGE!!!,,,,,Du läufst Amok!,,,,,,,,,,,,,Tá Com o Diabo no Corpo!!!,,,, +Mash Activator Key To Kill Again!,MASH ACTIVATOR KEY TO KILL AGAIN!,,,,,Hau auf 'Benutzen' um weiterzutöten!,,,,,,,,,,,,,"Aperta em ""Usar"" pra Matar De Novo!",,,, +Ammo For Alien Arm Gun!!!,AMMO FOR ALIEN ARM GUN!!!,,,,,Munition für Armgewehr!,,,,,,,,,,,,,Munição pra Arma Alienígena!!!,,,, +Turned Off...,TURNED OFF...,,,,,Abgeschaltet,,,,,,,,,,,,,Tá Desligado...,,,, +Switch Operated Only!,SWITCH OPERATED ONLY!,,,,,Wird mit Schalter bedient!,,,,,,,,,,,,,Tem Que Usar Interruptor!,,,, +Elvis Lives!,ELVIS LIVES!,,,,,Elvis lebt!,,,,,,,,,,,,,Elvis Tá Vivo!,,,, +The King Is Dead!,THE KING IS DEAD!,,,,,Der King ist tot!,,,,,,,,,,,,,O Rei Tá Morto!,,,, +Dee-Lishus Goo Goo Cluster!,DEE-LISHUS GOO GOO CLUSTER!,,,,,Leckerer Goo Goo Cluster,,,,,,,,,,,,,Eita Docinho Baum!,,,, +Wussy Aimin' Device: ON,WUSSY AIMIN' DEVICE: ON,,,,,Zielgerät für Weicheier: AN,,,,,,,,,,,,,Mira de Amarelão: LIGADA,,,, +Wussy Aimin' Device: OFF,WUSSY AIMIN' DEVICE: OFF,,,,,Zielgerät für Weicheier: AUS,,,,,,,,,,,,,Mira de Amarelão: DESLIGADA,,,, +"Hell, I Thought You Was A Killbilly!","HELL, I THOUGHT YOU WAS A KILLBILLY!",,,,,Und ich dachte du wärst ein Killbilly,,,,,,,,,,,,,"Uai, Achava Que Você Era um Caipira Matador!",,,, +Type The Cheat Code:,TYPE THE CHEAT CODE:,,,,,Schreib den Schummelcode,,,,,,,,,,,,,Digita a Trapaça aí:,,,, +Yer Sound: ON,YER SOUND: ON,,,,,Dein Sound: AN,,,,,,,,,,,,,Som na Caixa: LIGADO,,,, +Yer Sound: OFF,YER SOUND: OFF,,,,,Dein Sound: AUS,,,,,,,,,,,,,Som na Caixa: DESLIGADO,,,, +Yer Screen Captured And Jailed!,YER SCREEN CAPTURED AND JAILED!,,,,,Screenshot eingefangen und weggesperrt!,,,,,,,,,,,,,Tela Capturada e Mandada pro Xilindró!,,,, +Xxx Moonshine!,XXX MOONSHINE!,,,,,XXX Schwarzgebrannter!,,,,,,,,,,,,,Marvada Pinga!,,,, +Vacuum Cleaner Hose Snorkel System,VACUUM CLEANER HOSE SNORKEL SYSTEM,,,,,Staubsaugerschlauch-Schnorchelsystem,,,,,,,,,,,,,Esnórquel Feito de Aspirador de Pó,,,, +Press F1 Fer Help,PRESS F1 FER HELP,,,,,Drücke F1 für Hilfe,,,,,,,,,,,,,Aperta F1 Pra Ajuda,,,, +Ain't Got The Key!,AIN'T GOT THE KEY!,,,,,Hab den Schlüssel nich'!,,,,,,,,,,,,,Tá Sem a Chave!,,,, +Skeleton Key!,SKELETON KEY!,,,,,Schlüssel!,,,,,,,,,,,,,Chave Esqueleto!,,,, +Teat Gun Ammo !,TEAT GUN AMMO !,,,,,BH-Munition!,,,,,,,,,,,,,Munição pra Arma de Teta !,,,, +Ripsaw Ammo !,RIPSAW AMMO !,,,,,Spaltsägenblätter!,,,,,,,,,,,,,Munição pra Serra Circular !,,,, +Cheater! You Used The,CHEATER! YOU USED THE,,,,,Du Schummler. Du hast dich,,,,,,,,,,,,,Trapaceiro! Você Usou,,,, +Cheat To Come Back Alive,CHEAT TO COME BACK ALIVE,,,,,zurück ins Leben gemogelt!,,,,,,,,,,,,,a Trapaça pra Ressucitar,,,, +No Savin' Or Loadin' Fer Psyco,NO SAVIN' OR LOADIN' FER PSYCO,,,,,Psychos laden und speichern nich'!,,,,,,,,,,,,,Psicopata Não Carrega Nem Salva,,,, +Huntin' Rifle!,HUNTIN' RIFLE!,,,,,Jagdgewehr!,,,,,,,,,,,,,Rifle de Caça!,,,, +Dyn-O-Mite!,DYN-O-MITE!,,,,,Dynamit!,,,,,,,,,,,,,Dinamite!,,,, +Crossbow!,CROSSBOW!,,,,,Armbrust!,,,,,,,,,,,,,Besta!,,,, +Yer Scattergun!,YER SCATTERGUN!,,,,,Deine Schrotflinte!,,,,,,,,,,,,,Espingarda!,,,, +Powder Keg!,POWDER KEG!,,,,,Pulverfass!,,,,,,,,,,,,,Barril de Pólvora!,,,, +Alien Teat Gun!,ALIEN TEAT GUN!,,,,,BH-Waffe!,,,,,,,,,,,,,Arma de Teta !,,,, +Bowling Ball!!,BOWLING BALL!!,,,,,Bowlingkugel!,,,,,,,,,,,,,Bola de Boliche!!,,,, +Ripsaw!!,RIPSAW!!,,,,,Spaltsäge!,,,,,,,,,,,,,Serra Circular!!,,,, +Large Pork Rinds!,LARGE PORK RINDS!,,,,,Schweineschwarten!,,,,,,,,,,,,,Toicinho!,,,, +Ammo For Rifle!,AMMO FOR RIFLE!,,,,,Munition für Jagdgewehr!,,,,,,,,,,,,,Munição pro Rifle!,,,, +Ammo For Crossbow!,AMMO FOR CROSSBOW!,,,,,Munition für Armbrust!,,,,,,,,,,,,,Munição pra Besta!,,,, +Speedloader!,SPEEDLOADER!,,,,,Schnelllader!,,,,,,,,,,,,,Carregador Automático!,,,, +Hip Waders Off,HIP WADERS OFF,,,,,Gummistiefel aus,,,,,,,,,,,,,Tirando as Galocha,,,, +Hip Waders On,HIP WADERS ON,,,,,Gummistiefel an,,,,,,,,,,,,,Botando as Galocha,,,, +Yer Scattergun Shells!,YER SCATTERGUN SHELLS!,,,,,Flintenpatronen!,,,,,,,,,,,,,Munição pra Espingarda!,,,, +Some Kind Of Key Required,SOME KIND OF KEY REQUIRED,,,,,Du brauchst 'nen Schlüssel!,,,,,,,,,,,,,Precisa de Alguma Chave,,,, +Some Other Kind Of Key Required,SOME OTHER KIND OF KEY REQUIRED,,,,,Du brauchst 'nen anderen Schlüssel!,,,,,,,,,,,,,Precisa de Outro Tipo de Chave,,,, +Yet Even Another Kind Of Key Required,YET EVEN ANOTHER KIND OF KEY REQUIRED,,,,,Du brauchst noch 'nen anderen Schlüssel!,,,,,,,,,,,,,Precisa de Mais Outro Tipo de Chave,,,, +Yer Weapon Lowered,YER WEAPON LOWERED,,,,,Waffe gesenkt,,,,,,,,,,,,,Arma Abaixada,,,, +Yer Weapon Raised,YER WEAPON RAISED,,,,,Waffe gehoben,,,,,,,,,,,,,Arma Apontada,,,, +Vaccum Cleaner Hose Snorkel On!,VACCUM CLEANER HOSE SNORKEL ON!,,,,,Schnorchel an,,,,,,,,,,,,,Botando o Esnórquel de Aspirador de Pó ,,,, +Haulin' Ass Mode Off...,HAULIN' ASS MODE OFF...,,,,,Bin doch kein D-Zug!,,,,,,,,,,,,,Pode Andar Tranquilo...,,,, +Haulin' Ass Mode On!!!,HAULIN' ASS MODE ON!!!,,,,,Schwing die Hufe!,,,,,,,,,,,,,Sebo nas Canela!!!,,,, +Alien Arm Gun,ALIEN ARM GUN,,,,,Armgewehr,,,,,,,,,,,,,Arma Alienígena,,,, +Vacuum Cleaner Snorkle,VACUUM CLEANER SNORKLE,,,,,Staubsaugerschnorchel,,,,,,,,,,,,,Esnórquel de Aspirador de Pó,,,, +Xxx Moonshine,XXX MOONSHINE,,,,,XXX Schwarzgebrannter,,,,,,,,,,,,,Pinga Caseira,,,, +For You Grandpa!,FOR YOU GRANDPA!,,,,,"Für dich, Opa!",,,,,,,,,,,,,"Pra Você, Vô!",,,, +What The!,WHAT THE!,,,,,Was zum...,,,,,,,,,,,,,Mas que p-,,,, +You Were All Wrong!,YOU WERE ALL WRONG!,,,,,Du hattest Unrecht!,,,,,,,,,,,,,Tá errado!,,,, +Good'n!,GOOD'N!,,,,,Holla!,,,,,,,,,,,,,Boa!,,,, +Bad'n...,BAD'N...,,,,,Ups...,,,,,,,,,,,,,Vixe...,,,, +You're Burnin'!,YOU'RE BURNIN'!,,,,,Du brennst!,,,,,,,,,,,,,Tá Pegando Fogo!,,,, +Clippin': OFF,CLIPPIN': OFF,,,,,Clipping: An,,,,,,,,,,,,,Clipping Desligado,,,, +Clippin': ON,CLIPPIN': ON,,,,,Clipping: Aus,,,,,,,,,,,,,Clipping Ligado,,,, +You Done Killed 'Em All!,YOU DONE KILLED 'EM ALL!,,,,,Du hast sie alle alle gemacht!,,,,,,,,,,,,,Você Matou Tudinho!,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Outskirts,OUTSKIRTS,,,,,Auf dem Lande,,,,,,,,,,,,,,,,, -Downtown,DOWNTOWN,,,,,Im Dorf,,,,,,,,,,,,,,,,, -Pissin' Contest,PISSIN' CONTEST,,,,,Hahnenkampf,,,,,,,,,,,,,,,,, +Outskirts,OUTSKIRTS,,,,,Auf dem Lande,,,,,,,,,,,,,No Interior,,,, +Downtown,DOWNTOWN,,,,,Im Dorf,,,,,,,,,,,,,Cidade Grande,,,, +Pissin' Contest,PISSIN' CONTEST,,,,,Hahnenkampf,,,,,,,,,,,,,Treta das Brava,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Wuss,WUSS,,,,,Lusche,,,,,,,,,,,,,,,,, -Meejum,MEEJUM,,,,,Landei,,,,,,,,,,,,,,,,, -Hard Ass,HARD ASS,,,,,Harter Hund,,,,,,,,,,,,,,,,, -Killbilly,KILLBILLY,,,,,,,,,,,,,,,,,,,,,, -Psychobilly,PSYCHOBILLY,,,,,,,,,,,,,,,,,,,,,, +Wuss,WUSS,,,,,Lusche,,,,,,,,,,,,,Cagão,,,, +Meejum,MEEJUM,,,,,Landei,,,,,,,,,,,,,Marromenos,,,, +Hard Ass,HARD ASS,,,,,Harter Hund,,,,,,,,,,,,,Fodão,,,, +Killbilly,KILLBILLY,,,,,,,,,,,,,,,,,,Caipirão Matador,,,, +Psychobilly,PSYCHOBILLY,,,,,,,,,,,,,,,,,,Psicopata,,,, ,,,,,,,,,,,,,,,,,,,,,,, Taylor Town,TAYLOR TOWN,,,,,,,,,,,,,,,,,,,,,, -Lumberland,LUMBERLAND,,,,,Sägewerk,,,,,,,,,,,,,,,,, -Junkyard,JUNKYARD,,,,,Schrottplatz,,,,,,,,,,,,,,,,, +Lumberland,LUMBERLAND,,,,,Sägewerk,,,,,,,,,,,,,Serraria,,,, +Junkyard,JUNKYARD,,,,,Schrottplatz,,,,,,,,,,,,,Ferro Velho,,,, Drive-In,DRIVE-IN,,,,,Autokino,,,,,,,,,,,,,,,,, -Dairyair Farms,DAIRYAIR FARMS,,,,,Milchfarm,,,,,,,,,,,,,,,,, -Sewers,SEWERS,,,,Kanály,Kanalisation,,Kanalo,Las Alcantarillas,,Viemärit,Egouts,A csatornák,Le Fogne,下水道,하수구,De Rioleringen,Ścieki,Os Esgotos,,Canalizarea,Канализация,Канализација -Smeltin' Plant,SMELTIN' PLANT,,,,,Klärwerk,,,,,,,,,,,,,,,,, +Dairyair Farms,DAIRYAIR FARMS,,,,,Milchfarm,,,,,,,,,,,,,Fazenda das Vaca,,,, +Sewers,SEWERS,,,,Kanály,Kanalisation,,Kanalo,Las Alcantarillas,,Viemärit,Egouts,A csatornák,Le Fogne,下水道,하수구,De Rioleringen,Ścieki,Esgoto,,Canalizarea,Канализация,Канализација +Smeltin' Plant,SMELTIN' PLANT,,,,,Klärwerk,,,,,,,,,,,,,Siderúrgica,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Downtown Hickston,DOWNTOWN HICKSTON,,,,,Hickston Ortsmitte,,,,,,,,,,,,,,,,, -Nut House,NUT HOUSE,,,,,Klapsmühle,,,,,,,,,,,,,,,,, +Downtown Hickston,DOWNTOWN HICKSTON,,,,,Hickston Ortsmitte,,,,,,,,,,,,,Centro de Hickston,,,, +Nut House,NUT HOUSE,,,,,Klapsmühle,,,,,,,,,,,,,Casa de Doido,,,, J.Cluck's!,J.CLUCK'S!,,,,,,,,,,,,,,,,,,,,,, -The Ruins,THE RUINS,,,,,Die Ruinen,,,,,,,,,,,,,,,,, -Grimley's Mortuary,GRIMLEY'S MORTUARY,,,,,Grimleys Leichenhalle,,,,,,,,,,,,,,,,, -Uranium Mines,URANIUM MINES,,,,,Uranmine,,,,,,,,,,,,,,,,, -Beaudry Mansion,BEAUDRY MANSION,,,,,Beaudrys Villa,,,,,,,,,,,,,,,,, +The Ruins,THE RUINS,,,,,Die Ruinen,,,,,,,,,,,,,As Ruínas,,,, +Grimley's Mortuary,GRIMLEY'S MORTUARY,,,,,Grimleys Leichenhalle,,,,,,,,,,,,,Necrotério do Grimley,,,, +Uranium Mines,URANIUM MINES,,,,,Uranmine,,,,,,,,,,,,,Minas de Urânio,,,, +Beaudry Mansion,BEAUDRY MANSION,,,,,Beaudrys Villa,,,,,,,,,,,,,Mansão Beaudry,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Country Livin',COUNTRY LIVIN',,,,,Landleben,,,,,,,,,,,,,,,,, -Barnyard Hijinks,BARNYARD HIJINKS,,,,,Scheunenspaß,,,,,,,,,,,,,,,,, -Condemned,CONDEMNED,,,,,Zum Abriss freigegeben,,,,,,,,,,,,,,,,, -Used Cars,USED CARS,,,,,Gebrauchte Autos,,,,,,,,,,,,,,,,, -Trainspotting,TRAINSPOTTING,,,,,Züge suchen,,,,,,,,,,,,,,,,, -Mud Alley!,MUD ALLEY!,,,,,Kuhstall,,,,,,,,,,,,,,,,, -The Factory,THE FACTORY,,,,,Fabrik,,,,,,,,,,,,,,,,, -,Redneck Rides again,,,,,,,,,,,,,,,,,,,,,, -Got Some Wheels!,GOT SOME WHEELS!,,,,,Habe zwei Räder!,,,,,,,,,,,,,,,,, -Ohhhhhhh Noooooooooooo!,OHHHHHHH NOOOOOOOOOOOO!,,,,,Ohhhhhhh neiiiiinnnnnn!,,,,,,,,,,,,,,,,, -Now Yer Fucked!!!,NOW YER FUCKED!!!,,,,,Jetzt bist du am Arsch!!!,,,,,,,,,,,,,,,,, -Boat Mode Off,BOAT MODE OFF,,,,,Bootmodus aus,,,,,,,,,,,,,,,,, -No More Cheatin',NO MORE CHEATIN',,,,,Kein Mogeln mehr,,,,,,,,,,,,,,,,, -Instadrunk!,INSTADRUNK!,,,,,Voll betrunken!,,,,,,,,,,,,,,,,, -Instasober,INSTASOBER,,,,,Voll nüchtern!,,,,,,,,,,,,,,,,, -Sea Sick Mode On,SEA SICK MODE ON,,,,,Seekrank-Modus an,,,,,,,,,,,,,,,,, -Sea Sick Mode Off,SEA SICK MODE OFF,,,,,Seekrank-Modus aus,,,,,,,,,,,,,,,,, -Motorcycle Gun Ammo!,MOTORCYCLE GUN AMMO!,,,,,Motorradgewehrmunition!,,,,,,,,,,,,,,,,, -Got A Boat!,GOT A BOAT!,,,,,Habe ein Boot!,,,,,,,,,,,,,,,,, -Boat Mode On,BOAT MODE ON,,,,,Bootmodus an,,,,,,,,,,,,,,,,, -Boat Gun Mortars!,BOAT GUN MORTARS!,,,,,Bootwaffenmörser!,,,,,,,,,,,,,,,,, -Chicken Mode!!!!!!!!,CHICKEN MODE!!!!!!!!,,,,,Hühnermodus!!!,,,,,,,,,,,,,,,,, -Chicken Crossbow Ammo!!,CHICKEN CROSSBOW AMMO!!,,,,,Hühner-Armbrustmunition!,,,,,,,,,,,,,,,,, +Country Livin',COUNTRY LIVIN',,,,,Landleben,,,,,,,,,,,,,Vida na Roça,,,, +Barnyard Hijinks,BARNYARD HIJINKS,,,,,Scheunenspaß,,,,,,,,,,,,,Aprontando no Galpão,,,, +Condemned,CONDEMNED,,,,,Zum Abriss freigegeben,,,,,,,,,,,,,Interditado,,,, +Used Cars,USED CARS,,,,,Gebrauchte Autos,,,,,,,,,,,,,Carros Usados,,,, +Trainspotting,TRAINSPOTTING,,,,,Züge suchen,,,,,,,,,,,,,Ô Trêm Bão,,,, +Mud Alley!,MUD ALLEY!,,,,,Kuhstall,,,,,,,,,,,,,Lamaçal!,,,, +The Factory,THE FACTORY,,,,,Fabrik,,,,,,,,,,,,,A Fabrica,,,, +,,Redneck Rides again,,,,,,,,,,,,,,,,,,,,, +Got Some Wheels!,GOT SOME WHEELS!,,,,,Habe zwei Räder!,,,,,,,,,,,,,Bora na Motoca,,,, +Ohhhhhhh Noooooooooooo!,OHHHHHHH NOOOOOOOOOOOO!,,,,,Ohhhhhhh neiiiiinnnnnn!,,,,,,,,,,,,,ARRE ÉÉÉÉGUAAAAAAAAAAA!,,,, +Now Yer Fucked!!!,NOW YER FUCKED!!!,,,,,Jetzt bist du am Arsch!!!,,,,,,,,,,,,,"Se Fudeu, Campeão!!!",,,, +Boat Mode Off,BOAT MODE OFF,,,,,Bootmodus aus,,,,,,,,,,,,,Modo Barco Desligado,,,, +No More Cheatin',NO MORE CHEATIN',,,,,Kein Mogeln mehr,,,,,,,,,,,,,Chega de Trapaça,,,, +Instadrunk!,INSTADRUNK!,,,,,Voll betrunken!,,,,,,,,,,,,,Instabêbado!,,,, +Instasober,INSTASOBER,,,,,Voll nüchtern!,,,,,,,,,,,,,Instasóbrio,,,, +Sea Sick Mode On,SEA SICK MODE ON,,,,,Seekrank-Modus an,,,,,,,,,,,,,Modo Enjôo Ligado,,,, +Sea Sick Mode Off,SEA SICK MODE OFF,,,,,Seekrank-Modus aus,,,,,,,,,,,,,Modo Enjôo Desligado,,,, +Motorcycle Gun Ammo!,MOTORCYCLE GUN AMMO!,,,,,Motorradgewehrmunition!,,,,,,,,,,,,,Munição pra Arma da Moto!,,,, +Got A Boat!,GOT A BOAT!,,,,,Habe ein Boot!,,,,,,,,,,,,,Achou um Barco!,,,, +Boat Mode On,BOAT MODE ON,,,,,Bootmodus an,,,,,,,,,,,,,Modo Barco Ligado,,,, +Boat Gun Mortars!,BOAT GUN MORTARS!,,,,,Bootwaffenmörser!,,,,,,,,,,,,,Morteiro pra Arma do Barco!,,,, +Chicken Mode!!!!!!!!,CHICKEN MODE!!!!!!!!,,,,,Hühnermodus!!!,,,,,,,,,,,,,Modo Galinha!!!!!!,,,, +Chicken Crossbow Ammo!!,CHICKEN CROSSBOW AMMO!!,,,,,Hühner-Armbrustmunition!,,,,,,,,,,,,,Munição pra Besta de Galinha!!,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Land Of The Lost,LAND OF THE LOST,,,,,Das Land der Verlorenen,,,,,,,,,,,,,,,,, -Homeward Bound,HOMEWARD BOUND,,,,,Auf dem Weg nach Hause,,,,,,,,,,,,,,,,, +Land Of The Lost,LAND OF THE LOST,,,,,Das Land der Verlorenen,,,,,,,,,,,,,Terra dos Perdidos,,,, +Homeward Bound,HOMEWARD BOUND,,,,,Auf dem Weg nach Hause,,,,,,,,,,,,,Indo pra Casa,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Area 69,AREA 69,,,,,,,,,,,,,,,,,,,,,, +Area 69,AREA 69,,,,,,,,,,,,,,,,,,Área 69,,,, Camino Del Diablo,CAMINO DEL DIABLO,,,,,,,,,,,,,,,,,,,,,, El Peso,EL PESO,,,,,,,,,,,,,,,,,,,,,, -Jack O' Lope Farm,JACK O' LOPE FARM,,,,,,,,,,,,,,,,,,,,,, +Jack O' Lope Farm,JACK O' LOPE FARM,,,,,,,,,,,,,,,,,,Fazenda Jack O' Lope,,,, Wako,WAKO,,,,,,,,,,,,,,,,,,,,,, -"El Peso, Again","EL PESO, AGAIN",,,,,Schon wieder El Peso,,,,,,,,,,,,,,,,, -Refinery,REFINERY,,,,,Raffinerie,,,,,,,,,,,,,,,,, +"El Peso, Again","EL PESO, AGAIN",,,,,Schon wieder El Peso,,,,,,,,,,,,,"El Peso, De Novo",,,, +Refinery,REFINERY,,,,,Raffinerie,,,,,,,,,,,,,Refinaria,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Sunny Shores,SUNNY SHORES,,,,,Sonnige Ufer,,,,,,,,,,,,,,,,, -Gamblin' Boat,GAMBLIN' BOAT,,,,,Casinoboot,,,,,,,,,,,,,,,,, +Sunny Shores,SUNNY SHORES,,,,,Sonnige Ufer,,,,,,,,,,,,,Praia Ensolarada,,,, +Gamblin' Boat,GAMBLIN' BOAT,,,,,Casinoboot,,,,,,,,,,,,,Barco Casino,,,, Lummockston,LUMMOCKSTON,,,,,,,,,,,,,,,,,,,,,, Disgraceland,DISGRACELAND,,,,,,,,,,,,,,,,,,,,,, -Moto Madness,MOTO MADNESS,,,,,Motorrad-Wahnsinn,,,,,,,,,,,,,,,,, -Brothel,BROTHEL,,,,,Bordell,,,,,,,,,,,,,,,,, -Back To Hickston,BACK TO HICKSTON,,,,,Zurück in Hickston,,,,,,,,,,,,,,,,, +Moto Madness,MOTO MADNESS,,,,,Motorrad-Wahnsinn,,,,,,,,,,,,,Moto-Doidera,,,, +Brothel,BROTHEL,,,,,Bordell,,,,,,,,,,,,,Puteiro,,,, +Back To Hickston,BACK TO HICKSTON,,,,,Zurück in Hickston,,,,,,,,,,,,,De Volta pra Hickston,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Pipe Dreams,PIPE DREAMS,,,,,Wunschträume,,,,,,,,,,,,,,,,, -Swamp Buggies,SWAMP BUGGIES,,,,,Im Sumpf,,,,,,,,,,,,,,,,, -Square Dancin',SQUARE DANCIN',,,,,,,,,,,,,,,,,,,,,, -Hog Wild,HOG WILD,,,,,Wild wie die Schweine,,,,,,,,,,,,,,,,, -Road Rage,ROAD RAGE,,,,,Straßenwut,,,,,,,,,,,,,,,,, -Snake Canyon,SNAKE CANYON,,,,,Schlangenschlucht,,,,,,,,,,,,,,,,, -Luck Sore,LUCK SORE,,,,,Glücksspiel,,,,,,,,,,,,,,,,, -,Route 66,,,,,,,,,,,,,,,,,,,,,, -Route 66 - Part 1,ROUTE 66 - PART 1,,,,,Route 66 - Teil 1,,,,,,,,,,,,,,,,, -Route 66 - Part 2,ROUTE 66 - PART 2,,,,,Route 66 - Teil 2,,,,,,,,,,,,,,,,, +Pipe Dreams,PIPE DREAMS,,,,,Wunschträume,,,,,,,,,,,,,Entrando Pelo Cano,,,, +Swamp Buggies,SWAMP BUGGIES,,,,,Im Sumpf,,,,,,,,,,,,,Foi Pro Brejo,,,, +Square Dancin',SQUARE DANCIN',,,,,,,,,,,,,,,,,,Dança da Quadrilha,,,, +Hog Wild,HOG WILD,,,,,Wild wie die Schweine,,,,,,,,,,,,,Doido Feito Porco,,,, +Road Rage,ROAD RAGE,,,,,Straßenwut,,,,,,,,,,,,,Briga de Trânsito,,,, +Snake Canyon,SNAKE CANYON,,,,,Schlangenschlucht,,,,,,,,,,,,,Desfiladeiro Serpentino,,,, +Luck Sore,LUCK SORE,,,,,Glücksspiel,,,,,,,,,,,,,Maré de Azar,,,, +,,Route 66,,,,,,,,,,,,,,,,,,,,, +Route 66 - Part 1,ROUTE 66 - PART 1,,,,,Route 66 - Teil 1,,,,,,,,,,,,,Rota 66 - Parte 1,,,, +Route 66 - Part 2,ROUTE 66 - PART 2,,,,,Route 66 - Teil 2,,,,,,,,,,,,,Rota 66 - Parte 2,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Hit The Road,HIT THE ROAD,,,,,Auf Achse,,,,,,,,,,,,,,,,, -Carnival Of Terror,CARNIVAL OF TERROR,,,,,Kirmes des Terrors,,,,,,,,,,,,,,,,, +Hit The Road,HIT THE ROAD,,,,,Auf Achse,,,,,,,,,,,,,Pé na Estrada,,,, +Carnival Of Terror,CARNIVAL OF TERROR,,,,,Kirmes des Terrors,,,,,,,,,,,,,Festival de Horror,,,, Big Bertha's,BIG BERTHA'S,,,,,,,,,,,,,,,,,,,,,, -Big Billy's Brewery,BIG BILLY'S BREWERY,,,,,Big Billys Brauerei,,,,,,,,,,,,,,,,, -Flea Market,FLEA MARKET,,,,,Flohmarkt,,,,,,,,,,,,,,,,, -Slaughterhouse,SLAUGHTERHOUSE,,,,,Schlachthaus,,,,,,,,,,,,,,,,, -Fun Park,FUN PARK,,,,,Freizeitpark,,,,,,,,,,,,,,,,, +Big Billy's Brewery,BIG BILLY'S BREWERY,,,,,Big Billys Brauerei,,,,,,,,,,,,,Cervejaria do Big Billy,,,, +Flea Market,FLEA MARKET,,,,,Flohmarkt,,,,,,,,,,,,,Mercado das Pulgas,,,, +Slaughterhouse,SLAUGHTERHOUSE,,,,,Schlachthaus,,,,,,,,,,,,,Matadouro,,,, +Fun Park,FUN PARK,,,,,Freizeitpark,,,,,,,,,,,,,Parque de Diversões,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Gassin' Up,GASSIN' UP,,,,,Auftanken,,,,,,,,,,,,,,,,, -House Of Ill Repute,HOUSE OF ILL REPUTE,,,,,Haus des miesen Rufs,,,,,,,,,,,,,,,,, +Gassin' Up,GASSIN' UP,,,,,Auftanken,,,,,,,,,,,,,Enchendo o Tanque,,,, +House Of Ill Repute,HOUSE OF ILL REPUTE,,,,,Haus des miesen Rufs,,,,,,,,,,,,,Casa da Mãe Joana,,,, Mystery Dino Cave,MYSTERY DINO CAVE,,,,,"Geheimnisvolle Dinohöhle -",,,,,,,,,,,,,,,,, -Campy Crystal Lake,CAMPY CRYSTAL LAKE,,,,,,,,,,,,,,,,,,,,,, -Bigfoot Convention,BIGFOOT CONVENTION,,,,,,,,,,,,,,,,,,,,,, -Hoover Dam,HOOVER DAM,,,,,Hoover Damm,,,,,,,,,,,,,,,,, -Oddity Museum,ODDITY MUSEUM,,,,,Kuriosiätenmuseum,,,,,,,,,,,,,,,,, -,Texts extracted from the source (Duke Nukem),,,,,,,,,,,,,,,,,,,,,, +",,,,,,,,,,,,,Caverna dos Dinossauros,,,, +Campy Crystal Lake,CAMPY CRYSTAL LAKE,,,,,,,,,,,,,,,,,,Acampamento da Lago Cristalino,,,, +Bigfoot Convention,BIGFOOT CONVENTION,,,,,,,,,,,,,,,,,,Convenção do Pé Grande,,,, +Hoover Dam,HOOVER DAM,,,,,Hoover Damm,,,,,,,,,,,,,Represa Hoover,,,, +Oddity Museum,ODDITY MUSEUM,,,,,Kuriosiätenmuseum,,,,,,,,,,,,,Museu das Bizarrices,,,, +,,Texts extracted from the source (Duke Nukem),,,,,,,,,,,,,,,,,,,,, On (2),TXT_ON2,,,,Zap (2),An (2),,Aktiva (2),Activado (2),,Päällä (2),,,Attivo (2),オン (2),켬 (2),Aan (2),Włączone (2),Ligado (2),,Oprit (2),Вкл. (2),Укљ. (2) Loading,TXT_LOADING,,,,,Laden,,,Cargando,,,Charger,,Caricamento,ロード中,,,,Carregando,,,Загрузка, -Loading User Map,TXT_LOADUM,,,,,Lade Benutzerlevel,,,Entrando en mapa de usuario,,,Charger carte joueur...,,Ingresso alla mappa utente,,,,,,,,Вход в карту пользователя, -Loading map,TXT_LOADMAP,,,,,Lade Level,,,,,,,,,,,,,Entrando em mapa de usuário,,,, -Entering,TXT_ENTERING,,,,Vstupujete do,Betrete,,Enirante,Entrando a:,,Seuraava kohde,Niveau Suivant,Következik,Prossimo livello,突入開始,입장,Binnenkomen,Wchodzisz,Próxima fase,Próximo nível,,Следующий уровень,Следећи ниво -Multiplayer Totals,Multiplayer Totals,,,,,Mehrspielerergebnis,,,,,,,,,,,,,,,,, +Loading User Map,TXT_LOADUM,,,,,Lade Benutzerlevel,,,Entrando en mapa de usuario,,,Charger carte joueur...,,Ingresso alla mappa utente,,,,,Carregando Mapa de Usuário,,,Вход в карту пользователя, +Loading map,TXT_LOADMAP,,,,,Lade Level,,,,,,,,,,,,,Carregando mapa,,,, +Entering,TXT_ENTERING,,,,Vstupujete do,Betrete,,Enirante,Entrando a:,,Seuraava kohde,Niveau Suivant,Következik,Prossimo livello,突入開始,입장,Binnenkomen,Wchodzisz,Entrando,Próximo nível,,Следующий уровень,Следећи ниво +Multiplayer Totals,Multiplayer Totals,,,,,Mehrspielerergebnis,,,,,,,,,,,,,Resultados da Partida,,,, Name,Name,,,,Jméno,Name,,Nomo,Nombre,,Nimi,Nom,Név,Nome,名前,이름,Naam,Nazwa,Nome,,,Имя,Име Frags,Frags,,,,Fragy,,,Ĉesoj,Bajas,,Frägit,,Fragek,Frags,フラグ,플레이어 킬수,Frags,Fragi,,,,Фраги,Фрагови Deaths,Deaths,,,,Smrti,Tode,,Mortoj,Muertes,,Kuolemat,Morts,Halálok,Morti,デス,사망한 횟수,Overlijden,Śmierci,Mortes,,,Смерти,Смрти Game Paused,Game Paused,,,,,Spiel pausiert,,,Juego en pausa,,,,,Partita in pausa,ー時停止,,,,Jogo pausado,,,Игра на паузе, -Thanks to all our,Thanks to all our,,,,,Danke an alle,,,,,,,,,,,,,,,,, -fans for giving,fans for giving,,,,,unsere Fans für,,,,,,,,,,,,,,,,, -us big heads.,us big heads.,,,,,ihre Unterstützung.,,,,,,,,,,,,,,,,, -Look for a Duke Nukem 3D,Look for a Duke Nukem 3D,,,,,Haltet bald Ausschau nach,,,,,,,,,,,,,,,,, -sequel soon.,sequel soon.,,,,,dem Duke Nukem 3D Sequel,,,,,,,,,,,,,,,,, +Thanks to all our,Thanks to all our,,,,,Danke an alle,,,,,,,,,,,,,Agradecemos aos,,,, +fans for giving,fans for giving,,,,,unsere Fans für,,,,,,,,,,,,,nosso fãs pelos seus,,,, +us big heads.,us big heads.,,,,,ihre Unterstützung.,,,,,,,,,,,,,grandes cabeções.,,,, +Look for a Duke Nukem 3D,Look for a Duke Nukem 3D,,,,,Haltet bald Ausschau nach,,,,,,,,,,,,,Fique de olho por uma,,,, +sequel soon.,sequel soon.,,,,,dem Duke Nukem 3D Sequel,,,,,,,,,,,,,continuação do Duke Nukem 3D em breve.,,,, Press any key to continue,Presskey,,,,,Drücke eine Taste um fortzufahren.,,,Pulsa una tecla para continuar,,,Appuyez sur une touche,,Premi qualsiasi tasto per continuare,キーを押して続行する,,,,Aperte algo para continuar,,,"Нажмите, чтобы продолжить", Kills,Kills,,,,Zabití,,,Mortigoj,Asesinatos,,Tapot,Victimes,Ölések,Uccisioni,キル,킬수,Doodt,Zabójstwa,Vítimas,,,Убийства,Убиства Completed,Completed,,,,Dokončen,Abgeschlossen,,Finita,Completado,,Suoritettu,terminé,Teljesítve,Completo,攻略,완료,Klaar,Ukończono,Finalizado,,,Уровень завершён,Ниво завршен @@ -1635,534 +990,532 @@ Yer Time:,TXT_YERTIME,,,,,Deine Zeit:,,,Tu tiempo:,,,Ton temps :,,Il tuo tempo: Par Time:,TXT_PARTIME,,,,,Par Zeit:,,,Tiempo medio:,,,Temps requis :,,Tempo medio:,基準タイム:,,,,Tempo de referência:,,,Базовое время:, 3D Realms' Time:,TXT_3DRTIME,,,,,3D Realms Zeit:,,,Tiempo de 3d Realms:,,,Temps 3D Realms :,,Tempo 3D Realms:,3D領域の時間:,,,,Tempo da 3D Realms:,,,Время 3D Realms:, Xatrix Time:,TXT_XTRTIME,,,,,Xatrix Zeit:,,,Tiempo de Xatrix:,,,Temps Xatrix :,,Tempo Xatrix:,,,,,Tempo da Xatrix:,,,Время Xatrix:, -Cheated!,TXT_CHEATED,,,,,Geschummelt!,,,,,,,,,,,,,,,,, +Cheated!,TXT_CHEATED,,,,,Geschummelt!,,,,,,,,,,,,,Tá trapaceando!,,,, Enemies Killed:,TXT_ENEMIESKILLED,,,,,Tote Feinde:,,,Enemigos muertos:,,,Ennemis tués :,,Nemici uccisi:,キルした敵の数:,,,,Inimigos mortos:,,,Убито врагов:, Enemies Left:,TXT_ENEMIESLEFT,,,,,Lebende Feinde:,,,Enemigos restantes:,,,Ennemis restants :,,Nemici rimasti:,残りの敵の数:,,,,Inimigos restantes:,,,Осталось врагов:, -Varmints Killed:,TXT_VARMINTSKILLED,,,,,Totes Ungeziefer:,,,,,,,,,,,,,,,,, -Varmints Left:,TXT_VARMINTSLEFT,,,,,Lebendes Ungeziefer:,,,,,,,,,,,,,,,,, +Varmints Killed:,TXT_VARMINTSKILLED,,,,,Totes Ungeziefer:,,,,,,,,,,,,,Bichos mortos:,,,, +Varmints Left:,TXT_VARMINTSLEFT,,,,,Lebendes Ungeziefer:,,,,,,,,,,,,,Bichos restantes:,,,, N/A,TXT_N_A,,,,,N/V,,,N/D,,,,,,利用不可,,,,,,,, Secrets Found:,TXT_SECFND,,,,,Gefundene Geheimnisse,,,Secretos hallados:,,,Secrets trouvés :,,Segreti trovati:,発見した秘密:,,,,Segredos encontrados:,,,Найдено тайников:, Secrets Missed:,TXT_SECMISS,,,,,Verpasste Geheimnisse,,,Secretos perdidos:,,,Secrets manqués :,,Segreti mancati:,見逃した秘密:,,,,Segredos não encontrados:,,,Пропущено тайников:, -Enterin',TXT_ENTERIN,,,,,Starte,,,Entrando a:,,,Niveau Suivant,,Prossimo livello,突入開始,,,,Próxima fase,,,Следующий уровень, -Close Encounters,TXT_CLOSEENCOUNTERS,,,,,Unheimliche Begegnung,,,,,,,,,,,,,,,,, +Enterin',TXT_ENTERIN,,,,,Starte,,,Entrando a:,,,Niveau Suivant,,Prossimo livello,突入開始,,,,Tamo entrando,,,Следующий уровень, +Close Encounters,TXT_CLOSEENCOUNTERS,,,,,Unheimliche Begegnung,,,,,,,,,,,,,Encontros Imediatos,,,, Enterin' User Map,TXT_ENTRUM,,,,,Starte Benutzerlevel,,,Entrando en mapa de usuario,,,Entrée dans carte joueur...,,Ingresso alla mappa utente,ユーザーマップを開いています,,,,Entrando em mapa de usuário,,,Вход в карту пользователя, -Loadin',TXT_LOADIN,,,,,Laden,,,Cargando,,,Charger,,Caricamento,ロード中,,,,Carregando,,,Загрузка, -,Blood,,,,,,,,,,,,,,,,,,,,,, -Still Kicking,STILL KICKING,,,,,Bewegt sich noch,,,,,,,,,,,,,,,,, -Pink On The Inside,PINK ON THE INSIDE,,,,,Innen noch rot,,,,,,,,,,,,,,,,, -Lightly Broiled,LIGHTLY BROILED,,,,,Leicht gegrillt,,,,,,,,,,,,,,,,, -Well Done,WELL DONE,,,,,Durchgebraten,,,,,,,,,,,,,,,,, -Extra Crispy,EXTRA CRISPY,,,,,Extra knusprig,,,,,,,,,,,,,,,,, -Auto run ON,AUTORUNON,,,,,Rennen AN,,,,,,,,,,,,,,,,, -Auto run OFF,AUTORUNOFF,,,,,Rennen AUS,,,,,,,,,,,,,,,,, -Picked up Skull Key,TXTB_ITEM01,,,,,,,,,,,,,,,,,,,,,, -Picked up Eye Key,TXTB_ITEM02,,,,,,,,,,,,,,,,,,,,,, -Picked up Fire Key,TXTB_ITEM03,,,,,,,,,,,,,,,,,,,,,, -Picked up Dagger Key,TXTB_ITEM04,,,,,,,,,,,,,,,,,,,,,, -Picked up Spider Key,TXTB_ITEM05,,,,,,,,,,,,,,,,,,,,,, -Picked up Moon Key,TXTB_ITEM06,,,,,,,,,,,,,,,,,,,,,, -Picked up Key 7,TXTB_ITEM07,,,,,,,,,,,,,,,,,,,,,, -Picked up Doctor's Bag,TXTB_ITEM08,,,,,,,,,,,,,,,,,,,,,, -Picked up Medicine Pouch,TXTB_ITEM09,,,,,,,,,,,,,,,,,,,,,, -Picked up Life Essence,TXTB_ITEM10,,,,,,,,,,,,,,,,,,,,,, -Picked up Life Seed,TXTB_ITEM11,,,,,,,,,,,,,,,,,,,,,, -Picked up Red Potion,TXTB_ITEM12,,,,,,,,,,,,,,,,,,,,,, -Picked up Feather Fall,TXTB_ITEM13,,,,,,,,,,,,,,,,,,,,,, -Picked up Limited Invisibility,TXTB_ITEM14,,,,,,,,,,,,,,,,,,,,,, -Picked up INVULNERABILITY,TXTB_ITEM15,,,,,,,,,,,,,,,,,,,,,, -Picked up Boots of Jumping,TXTB_ITEM16,,,,,,,,,,,,,,,,,,,,,, -Picked up Raven Flight,TXTB_ITEM17,,,,,,,,,,,,,,,,,,,,,, -Picked up Guns Akimbo,TXTB_ITEM18,,,,,,,,,,,,,,,,,,,,,, -Picked up Diving Suit,TXTB_ITEM19,,,,,,,,,,,,,,,,,,,,,, -Picked up Gas mask,TXTB_ITEM20,,,,,,,,,,,,,,,,,,,,,, -Picked up Clone,TXTB_ITEM21,,,,,,,,,,,,,,,,,,,,,, -Picked up Crystal Ball,TXTB_ITEM22,,,,,,,,,,,,,,,,,,,,,, -Picked up Decoy,TXTB_ITEM23,,,,,,,,,,,,,,,,,,,,,, -Picked up Doppleganger,TXTB_ITEM24,,,,,,,,,,,,,,,,,,,,,, -Picked up Reflective shots,TXTB_ITEM25,,,,,,,,,,,,,,,,,,,,,, -Picked up Beast Vision,TXTB_ITEM26,,,,,,,,,,,,,,,,,,,,,, -Picked up ShadowCloak,TXTB_ITEM27,,,,,,,,,,,,,,,,,,,,,, -Picked up Rage shroom,TXTB_ITEM28,,,,,,,,,,,,,,,,,,,,,, -Picked up Delirium Shroom,TXTB_ITEM29,,,,,,,,,,,,,,,,,,,,,, -Picked up Grow shroom,TXTB_ITEM30,,,,,,,,,,,,,,,,,,,,,, -Picked up Shrink shroom,TXTB_ITEM31,,,,,,,,,,,,,,,,,,,,,, -Picked up Death mask,TXTB_ITEM32,,,,,,,,,,,,,,,,,,,,,, -Picked up Wine Goblet,TXTB_ITEM33,,,,,,,,,,,,,,,,,,,,,, -Picked up Wine Bottle,TXTB_ITEM34,,,,,,,,,,,,,,,,,,,,,, -Picked up Skull Grail,TXTB_ITEM35,,,,,,,,,,,,,,,,,,,,,, -Picked up Silver Grail,TXTB_ITEM36,,,,,,,,,,,,,,,,,,,,,, -Picked up Tome,TXTB_ITEM37,,,,,,,,,,,,,,,,,,,,,, -Picked up Black Chest,TXTB_ITEM38,,,,,,,,,,,,,,,,,,,,,, -Picked up Wooden Chest,TXTB_ITEM39,,,,,,,,,,,,,,,,,,,,,, -Picked up Asbestos Armor,TXTB_ITEM40,,,,,,,,,,,,,,,,,,,,,, -Picked up Basic Armor,TXTB_ITEM41,,,,,,,,,,,,,,,,,,,,,, -Picked up Body Armor,TXTB_ITEM42,,,,,,,,,,,,,,,,,,,,,, -Picked up Fire Armor,TXTB_ITEM43,,,,,,,,,,,,,,,,,,,,,, -Picked up Spirit Armor,TXTB_ITEM44,,,,,,,,,,,,,,,,,,,,,, -Picked up Super Armor,TXTB_ITEM45,,,,,,,,,,,,,,,,,,,,,, -Picked up Blue Team Base,TXTB_ITEM46,,,,,,,,,,,,,,,,,,,,,, -Picked up Red Team Base,TXTB_ITEM47,,,,,,,,,,,,,,,,,,,,,, -Picked up Blue Flag,TXTB_ITEM48,,,,,,,,,,,,,,,,,,,,,, -Picked up Red Flag,TXTB_ITEM49,,,,,,,,,,,,,,,,,,,,,, -Picked up DUMMY,TXTB_ITEM50,,,,,,,,,,,,,,,,,,,,,, -Picked up Level map,TXTB_ITEM51,,,,,,,,,,,,,,,,,,,,,, +Loadin',TXT_LOADIN,,,,,Laden,,,Cargando,,,Charger,,Caricamento,ロード中,,,,Tá carregando,,,Загрузка, +,,Blood,,,,,,,,,,,,,,,,,,,,, +Still Kicking,STILL KICKING,,,,,Bewegt sich noch,,,,,,,,,,,,,Ainda Vivo,,,, +Pink On The Inside,PINK ON THE INSIDE,,,,,Innen noch rot,,,,,,,,,,,,,Mal Passado,,,, +Lightly Broiled,LIGHTLY BROILED,,,,,Leicht gegrillt,,,,,,,,,,,,,No Ponto,,,, +Well Done,WELL DONE,,,,,Durchgebraten,,,,,,,,,,,,,Bem Passado,,,, +Extra Crispy,EXTRA CRISPY,,,,,Extra knusprig,,,,,,,,,,,,,Extra Crocante,,,, +Auto run ON,AUTORUNON,,,,,Rennen AN,,,,,,,,,,,,,Correr LIGADO,,,, +Auto run OFF,AUTORUNOFF,,,,,Rennen AUS,,,,,,,,,,,,,Correr DESLIGADO,,,, +Picked up Skull Key,TXTB_ITEM01,,,,,Totenkopfschlüssel genommen,,,,,,,,,,,,,Pegou a Chave da Caveira,,,, +Picked up Eye Key,TXTB_ITEM02,,,,,Augenschlüssel genommen,,,,,,,,,,,,,Pegou a Chave do Olho,,,, +Picked up Fire Key,TXTB_ITEM03,,,,,Feuerschlüssel genommen,,,,,,,,,,,,,Pegou a Chave do Fogo,,,, +Picked up Dagger Key,TXTB_ITEM04,,,,,Dolchschlüssel genommen,,,,,,,,,,,,,Pegou a Chave da Adaga,,,, +Picked up Spider Key,TXTB_ITEM05,,,,,Spinnenschlüssel genommen,,,,,,,,,,,,,Pegou a Chave da Aranha,,,, +Picked up Moon Key,TXTB_ITEM06,,,,,Mondschlüssel genommen,,,,,,,,,,,,,Pegou a Chave da Lua,,,, +Picked up Key 7,TXTB_ITEM07,,,,,Schlüssel 7 genommen,,,,,,,,,,,,,Pegou a Chave 7,,,, +Picked up Doctor's Bag,TXTB_ITEM08,,,,,Arzttasche genommen,,,,,,,,,,,,,Pegou Maleta do Médico,,,, +Picked up Medicine Pouch,TXTB_ITEM09,,,,,Verbandkasten genommen,,,,,,,,,,,,,Pegou Bolsa de Medicamentos,,,, +Picked up Life Essence,TXTB_ITEM10,,,,,Lebensessenz genommen,,,,,,,,,,,,,Pegou Essência de Vida,,,, +Picked up Life Seed,TXTB_ITEM11,,,,,Lebenssamen genommen,,,,,,,,,,,,,Pegou Semente da Vida,,,, +Picked up Red Potion,TXTB_ITEM12,,,,,Roten Trunk genommen,,,,,,,,,,,,,Pegou Poção Vermelha,,,, +Picked up Feather Fall,TXTB_ITEM13,,,,,Federfall genommen,,,,,,,,,,,,,Pegou Pluma da Leveza,,,, +Picked up Limited Invisibility,TXTB_ITEM14,,,,,Limitierte Unsichtbarkeit genommen,,,,,,,,,,,,,Pegou Invisibilidade Limitada,,,, +Picked up INVULNERABILITY,TXTB_ITEM15,,,,,UNVERWUNDBARKEIT genommen,,,,,,,,,,,,,Pegou INVULNERABILIDADE,,,, +Picked up Boots of Jumping,TXTB_ITEM16,,,,,Sprungstiefel genommen,,,,,,,,,,,,,Pegou Botas de Salto,,,, +Picked up Raven Flight,TXTB_ITEM17,,,,,Rabenflug genommen,,,,,,,,,,,,,Pegou Vôo do Corvo,,,, +Picked up Guns Akimbo,TXTB_ITEM18,,,,,Waffenakimbo genommen,,,,,,,,,,,,,Pegou Empunhadura Dupla,,,, +Picked up Diving Suit,TXTB_ITEM19,,,,,Tauchanzug genommen,,,,,,,,,,,,,Pegou Traje de Mergulho,,,, +Picked up Gas mask,TXTB_ITEM20,,,,,Gasmaske genommen,,,,,,,,,,,,,Pegou Máscara de Gás,,,, +Picked up Clone,TXTB_ITEM21,,,,,Klon genommen,,,,,,,,,,,,,Pegou Clone,,,, +Picked up Crystal Ball,TXTB_ITEM22,,,,,Kristallkugel genommen,,,,,,,,,,,,,Pegou Bola de Cristal,,,, +Picked up Decoy,TXTB_ITEM23,,,,,Köder genommen,,,,,,,,,,,,,Pegou Isca,,,, +Picked up Doppleganger,TXTB_ITEM24,,,,,Doppelgänger genommen,,,,,,,,,,,,,Pegou Sósia,,,, +Picked up Reflective shots,TXTB_ITEM25,,,,,Schutzschild genommen,,,,,,,,,,,,,Pegou Tiros Refletivos,,,, +Picked up Beast Vision,TXTB_ITEM26,,,,,Bestienvision genommen,,,,,,,,,,,,,Pegou Visão da Besta,,,, +Picked up ShadowCloak,TXTB_ITEM27,,,,,Schattenmantel genommen,,,,,,,,,,,,,Pegou Capa Sombria,,,, +Picked up Rage shroom,TXTB_ITEM28,,,,,Wutpilz genommen,,,,,,,,,,,,,Pegou Cogumelo da Fúria,,,, +Picked up Delirium Shroom,TXTB_ITEM29,,,,,Deliriumspilz genommen,,,,,,,,,,,,,Pegou Cogumelo do Delírio,,,, +Picked up Grow shroom,TXTB_ITEM30,,,,,Wuchspilz genommen,,,,,,,,,,,,,Pegou Cogumelo do Crescimento,,,, +Picked up Shrink shroom,TXTB_ITEM31,,,,,Schrumpfpilz genommen,,,,,,,,,,,,,Pegou Cogumelo do Encolhimento,,,, +Picked up Death mask,TXTB_ITEM32,,,,,Todesmaske genommen,,,,,,,,,,,,,Pegou Máscara da Morte,,,, +Picked up Wine Goblet,TXTB_ITEM33,,,,,Weinkelch genommen,,,,,,,,,,,,,Pegou Cálice de Vinho,,,, +Picked up Wine Bottle,TXTB_ITEM34,,,,,Weinflasche genommen,,,,,,,,,,,,,Pegou Garrafa de Vinho,,,, +Picked up Skull Grail,TXTB_ITEM35,,,,,Schädelgral genommen,,,,,,,,,,,,,Pegou Cálice de Caveira,,,, +Picked up Silver Grail,TXTB_ITEM36,,,,,Sibergral genommen,,,,,,,,,,,,,Pegou Cálice de Prata,,,, +Picked up Tome,TXTB_ITEM37,,,,,Buch genommen,,,,,,,,,,,,,Pegou Livro,,,, +Picked up Black Chest,TXTB_ITEM38,,,,,Schwarze Kiste genommen,,,,,,,,,,,,,Pegou Baú Negro,,,, +Picked up Wooden Chest,TXTB_ITEM39,,,,,Holzkiste genommen,,,,,,,,,,,,,Pegou Baú de Madeira,,,, +Picked up Asbestos Armor,TXTB_ITEM40,,,,,Asbestrüstung genommen,,,,,,,,,,,,,Pegou Armadura de Amianto,,,, +Picked up Basic Armor,TXTB_ITEM41,,,,,Basisrüstung genommen,,,,,,,,,,,,,Pegou Armadura Básica,,,, +Picked up Body Armor,TXTB_ITEM42,,,,,Körperrüstung genommen,,,,,,,,,,,,,Pegou Armadura Reforçada,,,, +Picked up Fire Armor,TXTB_ITEM43,,,,,Feuerrüstung genommen,,,,,,,,,,,,,Pegou Armadura de Fogo,,,, +Picked up Spirit Armor,TXTB_ITEM44,,,,,Geisterrüstung genommen,,,,,,,,,,,,,Pegou Armadura Espiritual,,,, +Picked up Super Armor,TXTB_ITEM45,,,,,Superrüstung genommen,,,,,,,,,,,,,Pegou Super Armadura,,,, +Picked up Blue Team Base,TXTB_ITEM46,,,,,Blaue Teambasis genommen,,,,,,,,,,,,,Pegou Base da Equipe Azul,,,, +Picked up Red Team Base,TXTB_ITEM47,,,,,Rote Teambasis genommen,,,,,,,,,,,,,Pegou Base da Equipe Vermelha,,,, +Picked up Blue Flag,TXTB_ITEM48,,,,,Blaue Flagge genommen,,,,,,,,,,,,,Pegou Bandeira Azul,,,, +Picked up Red Flag,TXTB_ITEM49,,,,,Rote Flagge genommen,,,,,,,,,,,,,Pegou Bandeira Vermelha,,,, +Picked up DUMMY,TXTB_ITEM50,,,,,DUMMY genommen,,,,,,,,,,,,,Pegou BONECO,,,, +Picked up Level map,TXTB_ITEM51,,,,,Karte genommen,,,,,,,,,,,,,Pegou Mapa da Fase,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Picked up Spray can,TXTB_AMMO01,,,,,,,,,,,,,,,,,,,,,, -Picked up Bundle of TNT*,TXTB_AMMO02,,,,,,,,,,,,,,,,,,,,,, -Picked up Bundle of TNT,TXTB_AMMO03,,,,,,,,,,,,,,,,,,,,,, -Picked up Case of TNT,TXTB_AMMO04,,,,,,,,,,,,,,,,,,,,,, -Picked up Proximity Detonator,TXTB_AMMO05,,,,,,,,,,,,,,,,,,,,,, -Picked up Remote Detonator,TXTB_AMMO06,,,,,,,,,,,,,,,,,,,,,, -Picked up Trapped Soul,TXTB_AMMO07,,,,,,,,,,,,,,,,,,,,,, -Picked up 4 shotgun shells,TXTB_AMMO08,,,,,,,,,,,,,,,,,,,,,, -Picked up Box of shotgun shells,TXTB_AMMO09,,,,,,,,,,,,,,,,,,,,,, -Picked up A few bullets,TXTB_AMMO10,,,,,,,,,,,,,,,,,,,,,, -Picked up Voodoo Doll,TXTB_AMMO11,,,,,,,,,,,,,,,,,,,,,, +Picked up Spray can,TXTB_AMMO01,,,,,Sprühdose genommen,,,,,,,,,,,,,Pegou Lata de Aerosol,,,, +Picked up Bundle of TNT*,TXTB_AMMO02,,,,,TNT-Bündel genommen*,,,,,,,,,,,,,Pegou Pacote de TNT*,,,, +Picked up Bundle of TNT,TXTB_AMMO03,,,,,TNT-Bündel genommen*,,,,,,,,,,,,,Pegou Pacote de TNT,,,, +Picked up Case of TNT,TXTB_AMMO04,,,,,TNT-Kiste genommen,,,,,,,,,,,,,Pegou Caixa de TNT,,,, +Picked up Proximity Detonator,TXTB_AMMO05,,,,,Kontaktzünder genommen,,,,,,,,,,,,,Pegou Detonador de Proximidade,,,, +Picked up Remote Detonator,TXTB_AMMO06,,,,,Fernzünder genommen,,,,,,,,,,,,,Pegou Detonador Remoto,,,, +Picked up Trapped Soul,TXTB_AMMO07,,,,,Gefangene Seele genommen,,,,,,,,,,,,,Pegou Alma Encurralada,,,, +Picked up 4 shotgun shells,TXTB_AMMO08,,,,,4 Schrotpatronen genommen,,,,,,,,,,,,,Pegou 4 cartuchos de espingarda,,,, +Picked up Box of shotgun shells,TXTB_AMMO09,,,,,Kiste Schrotpatronen genommen,,,,,,,,,,,,,Pegou Caixa de cartuchos de espingarda,,,, +Picked up A few bullets,TXTB_AMMO10,,,,,Ein paar Patronen genommen,,,,,,,,,,,,,Pegou Algumas balas,,,, +Picked up Voodoo Doll,TXTB_AMMO11,,,,,Voodoopuppe genommen,,,,,,,,,,,,,Pegou Boneco Vudu,,,, Picked up OBSOLETE,TXTB_AMMO12,,,,,,,,,,,,,,,,,,,,,, -Picked up Full drum of bullets,TXTB_AMMO13,,,,,,,,,,,,,,,,,,,,,, -Picked up Tesla Charge,TXTB_AMMO14,,,,,,,,,,,,,,,,,,,,,, +Picked up Full drum of bullets,TXTB_AMMO13,,,,,Patronentrommel genommen,,,,,,,,,,,,,Pegou Tambor cheio de munição,,,, +Picked up Tesla Charge,TXTB_AMMO14,,,,,Teslaladung genommen,,,,,,,,,,,,,Pegou Carga Tesla,,,, Picked up OBSOLETE,TXTB_AMMO15,,,,,,,,,,,,,,,,,,,,,, Picked up OBSOLETE,TXTB_AMMO16,,,,,,,,,,,,,,,,,,,,,, -Picked up Flares,TXTB_AMMO17,,,,,,,,,,,,,,,,,,,,,, +Picked up Flares,TXTB_AMMO17,,,,,Leuchtkugel genommen,,,,,,,,,,,,,Pegou Sinalizadores,,,, Picked up OBSOLETE,TXTB_AMMO18,,,,,,,,,,,,,,,,,,,,,, Picked up OBSOLETE,TXTB_AMMO19,,,,,,,,,,,,,,,,,,,,,, -Picked up Gasoline Can,TXTB_AMMO20,,,,,,,,,,,,,,,,,,,,,, +Picked up Gasoline Can,TXTB_AMMO20,,,,,Benzinkanister genommen,,,,,,,,,,,,,Pegou Galão de Gasolina,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Picked up RANDOM,TXTB_WPN01,,,,,,,,,,,,,,,,,,,,,, -Picked up Sawed-off,TXTB_WPN02,,,,,,,,,,,,,,,,,,,,,, -Picked up Tommy Gun,TXTB_WPN03,,,,,,,,,,,,,,,,,,,,,, -Picked up Flare Pistol,TXTB_WPN04,,,,,,,,,,,,,,,,,,,,,, -Picked up Voodoo Doll,TXTB_WPN05,,,,,,,,,,,,,,,,,,,,,, -Picked up Tesla Cannon,TXTB_WPN06,,,,,,,,,,,,,,,,,,,,,, -Picked up Napalm Launcher,TXTB_WPN07,,,,,,,,,,,,,,,,,,,,,, -Picked up Pitchfork,TXTB_WPN08,,,,,,,,,,,,,,,,,,,,,, -Picked up Spray Can,TXTB_WPN09,,,,,,,,,,,,,,,,,,,,,, -Picked up Dynamite,TXTB_WPN10,,,,,,,,,,,,,,,,,,,,,, -Picked up Life Leech,TXTB_WPN11,,,,,,,,,,,,,,,,,,,,,, -It's locked,TXTB_LOCKED,,,,,,,,,,,,,,,,,,,,,, -That requires a key.,TXTB_KEY,,,,,,,,,,,,,,,,,,,,,, +Picked up RANDOM,TXTB_WPN01,,,,,ZUFALL genommen,,,,,,,,,,,,,Pegou ALEATÓRIO,,,, +Picked up Sawed-off,TXTB_WPN02,,,,,Abgesägte Schrotflinte genommen,,,,,,,,,,,,,Pegou Espingarda de Cano Serrado,,,, +Picked up Tommy Gun,TXTB_WPN03,,,,,Tommy Gun genommen,,,,,,,,,,,,,Pegou Metralhadora,,,, +Picked up Flare Pistol,TXTB_WPN04,,,,,Leuchtkugelpistole genommen,,,,,,,,,,,,,Pegou Pistola Sinalizadora,,,, +Picked up Voodoo Doll,TXTB_WPN05,,,,,Voodoopuppe genommen,,,,,,,,,,,,,Pegou Boneco Vudu,,,, +Picked up Tesla Cannon,TXTB_WPN06,,,,,Teslakanone genommen,,,,,,,,,,,,,Pegou Canhão Tesla,,,, +Picked up Napalm Launcher,TXTB_WPN07,,,,,Napalmsprüher genommen,,,,,,,,,,,,,Pegou Lança-Napalm,,,, +Picked up Pitchfork,TXTB_WPN08,,,,,Forke genommen,,,,,,,,,,,,,Pegou Forquilha,,,, +Picked up Spray Can,TXTB_WPN09,,,,,Sprühdose genommen,,,,,,,,,,,,,Pegou Lata de Aerosol,,,, +Picked up Dynamite,TXTB_WPN10,,,,,Dynamit genommen,,,,,,,,,,,,,Pegou Dinamite,,,, +Picked up Life Leech,TXTB_WPN11,,,,,Lebenssauger genommen,,,,,,,,,,,,,Pegou Sugador de Vida,,,, +It's locked,TXTB_LOCKED,,,,,Es ist verschlossen,,,,,,,,,,,,,Está trancada,,,, +That requires a key.,TXTB_KEY,,,,,Du brauchst einen Schlüssel,,,,,,,,,,,,,É necessária uma chave.,,,, %s dropped Blue Flag,"TXTB_DBF -",,,,,,,,,,,,,,,,,,,,,, -%s dropped Red Flag,TXTB_DRF,,,,,,,,,,,,,,,,,,,,,, -%s stole Blue Flag,TXTB_SBF,todo,,,,,,,,,,,,,,,,,,,,, -%s returned Blue Flag,TXTB_RBF,This looks incomplete and broken,,,,,,,,,,,,,,,,,,,,, -%s captured Red Flag!,TXTB_CRF,,,,,,,,,,,,,,,,,,,,,, -You killed yourself!,TXTB_KILLSELF,,,,,,,,,,,,,,,,,,,,,, -I LIVE...AGAIN!!,TXTB_LIVEAGAIN,,,,,,,,,,,,,,,,,,,,,, -%s lives again!,TXTB_LIVESAGAIN,,,,,,,,,,,,,,,,,,,,,, -Level Stats,TXTB_LEVELSTATS,,,,,,,,,,,,,,,,,,,,,, ->>> YOU CHEATED! <<<,TXTB_CHEATED,,,,,,,,,,,,,,,,,,,,,, -Frag Stats,TXTB_FRAGSTATS,,,,,,,,,,,,,,,,,,,,,, -Of,OF,,,,,von,,,,,,,,,,,,,,,,, -A secret is revealed.,TXTB_SECRET0,,,,Tajemství odhaleno!,Ein Geheimnis wurde enthüllt!,Ένα μυστικό αποκαλύφθηκε!,Sekreto estas malkaŝita!,¡Se ha revelado un secreto!,,Sala löydetty!,Vous avez découvert un secret!,Egy rejtekhely feltárva!,È stato svelato un segreto! ,シークレットを解き明かした!,비밀 발견!,Een geheim is onthuld!,Znaleziono sekret!,Um segredo foi revelado!,,,Обнаружен тайник!,Тајна је откривена! -You found a secret.,TXTB_SECRET1,,,,,,,,,,,,,,,,,,,,,, +",,,,,%d hat die blaue Flagge verloren,,,,,,,,,,,,,,,,, +%s dropped Red Flag,TXTB_DRF,,,,,%d hat die rote Flagge verloren,,,,,,,,,,,,,,,,, +%s stole Blue Flag,TXTB_SBF,todo,,,,%d hat die blaue Flagge gestohlen,,,,,,,,,,,,,,,,, +%s returned Blue Flag,TXTB_RBF,This looks incomplete and broken,,,,%d hat die blaue Flagge zurückgebracht,,,,,,,,,,,,,,,,, +%s captured Red Flag!,TXTB_CRF,,,,,%d hat die rote Flagge erobert,,,,,,,,,,,,,,,,, +You killed yourself!,TXTB_KILLSELF,,,,,Du hast dich selbst umgebracht.,,,,,,,,,,,,,Você se matou!,,,, +I LIVE...AGAIN!!,TXTB_LIVEAGAIN,,,,,ICH LEBE... WIEDER!!,,,,,,,,,,,,,ESTOU VIVO...NOVAMENTE!!,,,, +%s lives again!,TXTB_LIVESAGAIN,,,,,%s lebt wieder,,,,,,,,,,,,,,,,, +Level Stats,TXTB_LEVELSTATS,,,,,Levelstatistik,,,,,,,,,,,,,Estatísticas da Fase,,,, +>>> YOU CHEATED! <<<,TXTB_CHEATED,,,,,>>> SCHUMMLER! <<<,,,,,,,,,,,,,>>> VOCÊ TRAPACEOU! <<<,,,, +Frag Stats,TXTB_FRAGSTATS,,,,,Frags,,,,,,,,,,,,,Estatística de Frags,,,, +Of,OF,,,,,von,,,,,,,,,,,,,de,,,, +A secret is revealed.,TXTB_SECRET0,,,,Tajemství odhaleno!,Ein Geheimnis wurde enthüllt!,Ένα μυστικό αποκαλύφθηκε!,Sekreto estas malkaŝita!,¡Se ha revelado un secreto!,,Sala löydetty!,Vous avez découvert un secret!,Egy rejtekhely feltárva!,È stato svelato un segreto! ,シークレットを解き明かした!,비밀 발견!,Een geheim is onthuld!,Znaleziono sekret!,Um segredo foi revelado.,,,Обнаружен тайник!,Тајна је откривена! +You found a secret.,TXTB_SECRET1,,,,,Du hast ein Geheimnis gefunden,,,,,,,,,,,,,Você encontrou um segredo.,,,, Secrets,TXT_SECRETS,,,,Tajemství,Geheimnisse,,Sekretoj,Secretos,,Salat,,Rejtekhelyek,Segreti,シークレット,밝혀낸 비밀,Geheimen,Sekrety,Segredos,,,Тайники,Тајне -You found a Super Secret!,TXT_SUPERSECRET,,,,,Du hast ein Supergeheimnis gefunden!,,,,,,,,,,,,,,,,, +You found a Super Secret!,TXT_SUPERSECRET,,,,,Du hast ein Supergeheimnis gefunden!,,,,,,,,,,,,,Você encontrou um Super Segredo!,,,, ,,,,,,,,,,,,,,,,,,,,,,, -Loading Demo,TXTB_LDEMO,,,,,,,,,,,,,,,,,,,,,, -Loading Level,TXTB_LLEVEL,,,,,,,,,,,,,,,,,,,,,, -Cooperative,TXTB_NETGT1,,,,,,,,,,,,,,,,,,,,,, -Bloodbath,TXTB_NETGT2,,,,,,,,,,,,,,,,,,,,,, -Teams,TXTB_NETGT3,,,,,,,,,,,,,,,,,,,,,, -Map Follow Mode,TXTB_FOLLOWON,,,,,,,,,,,,,,,,,,,,,, +Loading Demo,TXTB_LDEMO,,,,,Lade Demo,,,,,,,,,,,,,Carregando Demo,,,, +Loading Level,TXTB_LLEVEL,,,,,Lade Level,,,,,,,,,,,,,Carregando Fase,,,, +Cooperative,TXTB_NETGT1,,,,,Kooperativ,,,,,,,,,,,,,Cooperativo,,,, +Bloodbath,TXTB_NETGT2,,,,,Blutbad,,,,,,,,,,,,,Banho de Sangue,,,, +Teams,TXTB_NETGT3,,,,,,,,,,,,,,,,,,Equipes,,,, +Map Follow Mode,TXTB_FOLLOWON,,,,,Folgen-Modus,,,,,,,,,,,,,Mapa (Modo Seguir),,,, Map Scroll Mode,TXTB_FOLLOWOFF," -",,,,,,,,,,,,,,,,,,,,, -You are immortal.,TXTB_GODMODE,,,,,,,,,,,,,,,,,,,,,, -You are mortal.,TXTB_NOTGODMODE,,,,,,,,,,,,,,,,,,,,,, -Frags,Frags,,,,Fragy,,,Ĉesoj,Bajas,,Frägit,,Fragek,Frags,フラグ,플레이어 킬수,Frags,Fragi,,,,Фраги,Фрагови -Paused,TXTB_PAUSED,,,,,,,,,,,,,,,,,,,,,, -Please Wait,TXTB_PLSWAIT,,,,,,,,,,,,,,,,,,,,,, -Unclipped movement.,TXTB_NOCLIP,,,,,,,,,,,,,,,,,,,,,, -Normal movement.,TXTB_NOCLIPOFF,,,,,,,,,,,,,,,,,,,,,, -You have full ammo.,TXTB_FULLAMMO,,,,,,,,,,,,,,,,,,,,,, -You have no ammo.,TXTB_NOAMMO,,,,,,,,,,,,,,,,,,,,,, -You have all weapons.,TXTB_ALLWEAP,,,,,,,,,,,,,,,,,,,,,, -You have no weapons.,TXTB_NOWEAP,,,,,,,,,,,,,,,,,,,,,, -Your inventory is full.,TXTB_FULLINV,,,,,,,,,,,,,,,,,,,,,, -Your inventory is empty.,TXTB_NOINV,,,,,,,,,,,,,,,,,,,,,, -You have full armor.,TXTB_FULLARM,,,,,,,,,,,,,,,,,,,,,, -You have no armor.,TXTB_NOARM,,,,,,,,,,,,,,,,,,,,,, -You have all keys.,TXTB_ALLKEYS,,,,,,,,,,,,,,,,,,,,,, -You have no keys.,TXTB_NOKEYS,,,,,,,,,,,,,,,,,,,,,, -You have infinite ammo.,TXTB_INFAMMO,,,,,,,,,,,,,,,,,,,,,, -You have limited ammo.,TXTB_LIMAMO,,,,,,,,,,,,,,,,,,,,,, -You have the map.,TXTB_ALLMAP,,,,,,,,,,,,,,,,,,,,,, -You have no map.,TXTB_NOALLMAP,,,,,,,,,,,,,,,,,,,,,, -You have no Jumping Boots.,TXTB_JBOOTS,,,,,,,,,,,,,,,,,,,,,, -You have the Jumping Boots.,TXTB_NOJBOOTS,,,,,,,,,,,,,,,,,,,,,, -You are visible.,TXTB_VISIBLE,,,,,,,,,,,,,,,,,,,,,, -You are invisible.,TXTB_INVISIBLE,,,,,,,,,,,,,,,,,,,,,, -You are vulnerable.,TXTB_VULN,,,,,,,,,,,,,,,,,,,,,, -You are invulnerable.,TXTB_INVULN,,,,,,,,,,,,,,,,,,,,,, -You are not delirious.,TXTB_NODELIR,,,,,,,,,,,,,,,,,,,,,, -You are delirious.,TXTB_DELIR,,,,,,,,,,,,,,,,,,,,,, -Kevorkian approves.,TXTB_KEVORKIAN,,,,,,,,,,,,,,,,,,,,,, -You're fired!,TXTB_FIRED,,,,,,,,,,,,,,,,,,,,,, -Ahhh...those were the days.,TXTB_THEDAYS,,,,,,,,,,,,,,,,,,,,,, -Flame retardant!,TXTB_RETARD,,,,,,,,,,,,,,,,,,,,,, -You have half armor.,TXTB_HALFARMOR,,,,,,,,,,,,,,,,,,,,,, -,Blood levels and messages,,,,,,,,,,,,,,,,,,,,,, -The Way of All Flesh,The Way of All Flesh,,Blood,,,,,,,,,,,,,,,,,,,, -Even Death May Die,Even Death May Die,,Blood,,,,,,,,,,,,,,,,,,,, -Farewell to Arms,Farewell to Arms,,Blood,,,,,,,,,,,,,,,,,,,, -Dead Reckoning,Dead Reckoning,,Blood,,,,,,,,,,,,,,,,,,,, -BloodBath,BloodBath,,Blood,,,,,,,,,,,,,,,,,,,, +",,,,Scrollmodus,,,,,,,,,,,,,Mapa (Modo Scroll),,,, +You are immortal.,TXTB_GODMODE,,,,,Du bist unsterblich.,,,,,,,,,,,,,Você está imortal.,,,, +You are mortal.,TXTB_NOTGODMODE,,,,,Du bist verwundbar.,,,,,,,,,,,,,Você está mortal.,,,, +Paused,TXTB_PAUSED,,,,,Pausiert,,,,,,,,,,,,,Pausado,,,, +Please Wait,TXTB_PLSWAIT,,,,,Bitte warten,,,,,,,,,,,,,"Por Favor, Aguarde",,,, +Unclipped movement.,TXTB_NOCLIP,,,,,Clipping aus,,,,,,,,,,,,,Modo no-clip ativado.,,,, +Normal movement.,TXTB_NOCLIPOFF,,,,,Clipping an,,,,,,,,,,,,,Modo no-clip desativado.,,,, +You have full ammo.,TXTB_FULLAMMO,,,,,Du hast volle Munition,,,,,,,,,,,,,Você está com munição cheia.,,,, +You have no ammo.,TXTB_NOAMMO,,,,,Du hast keine Munition,,,,,,,,,,,,,Você está sem munição.,,,, +You have all weapons.,TXTB_ALLWEAP,,,,,Du hast alle Waffen,,,,,,,,,,,,,Você possui todas as armas.,,,, +You have no weapons.,TXTB_NOWEAP,,,,,Du hast keine Waffen,,,,,,,,,,,,,Você não possui nenhuma arma.,,,, +Your inventory is full.,TXTB_FULLINV,,,,,Du hast volles Inventar,,,,,,,,,,,,,Seu inventário está cheio.,,,, +Your inventory is empty.,TXTB_NOINV,,,,,Dein Inventar ist leer,,,,,,,,,,,,,Seu inventário está vazio.,,,, +You have full armor.,TXTB_FULLARM,,,,,Du hast volle Rüstung,,,,,,,,,,,,,Você está com armadura completa.,,,, +You have no armor.,TXTB_NOARM,,,,,Du hast keine Rüstung,,,,,,,,,,,,,Você está sem armadura.,,,, +You have all keys.,TXTB_ALLKEYS,,,,,Du hast alle Schlüssel,,,,,,,,,,,,,Você possui todas as chaves.,,,, +You have no keys.,TXTB_NOKEYS,,,,,Du hast keine Schlüssel,,,,,,,,,,,,,Você não possui nenhuma chave.,,,, +You have infinite ammo.,TXTB_INFAMMO,,,,,Du hast unlimitierte Munition,,,,,,,,,,,,,Você possui munição infinita.,,,, +You have limited ammo.,TXTB_LIMAMO,,,,,Du hast begrenzte Munition,,,,,,,,,,,,,Você possui munição limitada.,,,, +You have the map.,TXTB_ALLMAP,,,,,Du hast die Karte,,,,,,,,,,,,,Você possui o mapa.,,,, +You have no map.,TXTB_NOALLMAP,,,,,Du hast keine Karte,,,,,,,,,,,,,Você está sem mapa.,,,, +You have no Jumping Boots.,TXTB_JBOOTS,,,,,Du hast die Sprungstiefel,,,,,,,,,,,,,Você está sem as Botas de Salto.,,,, +You have the Jumping Boots.,TXTB_NOJBOOTS,,,,,Du hast keine Sprungstiefel,,,,,,,,,,,,,Você possui as Botas de Salto.,,,, +You are visible.,TXTB_VISIBLE,,,,,Du bist sichtbar,,,,,,,,,,,,,Você está visível.,,,, +You are invisible.,TXTB_INVISIBLE,,,,,Du bist unsichtbar,,,,,,,,,,,,,Você está invisível.,,,, +You are vulnerable.,TXTB_VULN,,,,,Du bist verwundbar,,,,,,,,,,,,,Você está vulnerável.,,,, +You are invulnerable.,TXTB_INVULN,,,,,Du bist unverwundbar,,,,,,,,,,,,,Você está invulnerável.,,,, +You are not delirious.,TXTB_NODELIR,,,,,Du hast kein Delirium,,,,,,,,,,,,,Você não está delirando.,,,, +You are delirious.,TXTB_DELIR,,,,,Du hast ein Delirium,,,,,,,,,,,,,Você está delirando.,,,, +Kevorkian approves.,TXTB_KEVORKIAN,,,,,Kevorkian stimmt zu,,,,,,,,,,,,,Kervokian aprova.,,,, +You're fired!,TXTB_FIRED,,,,,Du bist gefeuert!,,,,,,,,,,,,,Você está demitido!,,,, +Ahhh...those were the days.,TXTB_THEDAYS,,,,,Ahhh. Das waren noch Tage...,,,,,,,,,,,,,Ahhh...bons tempos.,,,, +Flame retardant!,TXTB_RETARD,,,,,Flammenschutz,,,,,,,,,,,,,Retardante de chamas!,,,, +You have half armor.,TXTB_HALFARMOR,,,,,Du hast halbe Rüstung.,,,,,,,,,,,,,Você possui metade da armadura.,,,, +,,Blood levels and messages,,,,,,,,,,,,,,,,,,,,, +The Way of All Flesh,The Way of All Flesh,,Blood,,,Der Weg allen Fleisches,,,,,,,,,,,,,O Destino da Carne,,,, +Even Death May Die,Even Death May Die,,Blood,,,Sogar der Tod mag sterben,,,,,,,,,,,,,Até a Morte Pode Morrer,,,, +Farewell to Arms,Farewell to Arms,,Blood,,,Abschied von den Waffen,,,,,,,,,,,,,Adeus às Armas,,,, +Dead Reckoning,Dead Reckoning,,Blood,,,Tödliche Abrechnung,,,,,,,,,,,,,Confronto Mortal,,,, +BloodBath,BloodBath,,Blood,,,Blutbad,,,,,,,,,,,,,Banho de Sangue,,,, Post Mortem,Post Mortem,,Blood,,,,,,,,,,,,,,,,,,,, -Cradle to Grave,Cradle to Grave,,Blood,,,,,,,,,,,,,,,,,,,, -Hit the switch to end the level.,Hit the switch to end the level.,,Blood,,,,,,,,,,,,,,,,,,,, -"Slurp, slurp . . .","Slurp, slurp . . .",,Blood,,,,,,,,,,,,,,,,,,,, -OUT! OUT! DAMN SPOT!,OUT! OUT! DAMN SPOT!,,Blood,,,,,,,,,,,,,,,,,,,, -They'll need more of these.,They'll need more of these.,,Blood,,,,,,,,,,,,,,,,,,,, -Nevermore . . .,Nevermore . . .,,Blood,,,,,,,,,,,,,,,,,,,, -Open for Business.,Open for Business.,,Blood,,,,,,,,,,,,,,,,,,,, -I LIVE AGAIN!,I LIVE AGAIN!,,Blood,,,,,,,,,,,,,,,,,,,, -It is sealed shut.,It is sealed shut.,,Blood,,,,,,,,,,,,,,,,,,,, -Wrong Side of the Tracks,Wrong Side of the Tracks,,Blood,,,,,,,,,,,,,,,,,,,, -This probably isn't a good idea.,This probably isn't a good idea.,,Blood,,,,,,,,,,,,,,,,,,,, -You really should consider turning back.,You really should consider turning back.,,Blood,,,,,,,,,,,,,,,,,,,, -Is there a light at the end of the tunnel?,Is there a light at the end of the tunnel?,,Blood,,,,,,,,,,,,,,,,,,,, -Phantom Express,Phantom Express,,Blood,,,,,,,,,,,,,,,,,,,, -I must stop this train!,I must stop this train!,,Blood,,,,,,,,,,,,,,,,,,,, -Safety clamps are in place. This switch is locked.,Safety clamps are in place. This switch is locked.,,Blood,,,,,,,,,,,,,,,,,,,, -Safety clamps disabled.,Safety clamps disabled.,,Blood,,,,,,,,,,,,,,,,,,,, -Internal engine heat rising!,Internal engine heat rising!,,Blood,,,,,,,,,,,,,,,,,,,, -Internal engine heat critical!,Internal engine heat critical!,,Blood,,,,,,,,,,,,,,,,,,,, -Dark Carnival,Dark Carnival,,Blood,,,,,,,,,,,,,,,,,,,, -This doesn't open from this side.,This doesn't open from this side.,,Blood,,,,,,,,,,,,,,,,,,,, -Hit the switch to end the level.,Hit the switch to end the level.,,Blood,,,,,,,,,,,,,,,,,,,, -You're going to the secret level!,You're going to the secret level!,,Blood,,,,,,,,,,,,,,,,,,,, -Congrats! You win a cupie doll!,Congrats! You win a cupie doll!,,Blood,,,,,,,,,,,,,,,,,,,, -Hallowed Grounds,Hallowed Grounds,,Blood,,,,,,,,,,,,,,,,,,,, -The Great Temple,The Great Temple,,Blood,,,,,,,,,,,,,,,,,,,, -I can't believe you found this!,I can't believe you found this!,,Blood,,,,,,,,,,,,,,,,,,,, -"Here, you can have it all.","Here, you can have it all.",,Blood,,,,,,,,,,,,,,,,,,,, -Altar of Stone,Altar of Stone,,Blood,,,,,,,,,,,,,,,,,,,, -House of Horrors,House of Horrors,,Blood,,,,,,,,,,,,,,,,,,,, -Shipwrecked,Shipwrecked,,Blood,,,,,,,,,,,,,,,,,,,, -The door is jammed shut.,The door is jammed shut.,,Blood,,,,,,,,,,,,,,,,,,,, -The Lumber Mill,The Lumber Mill,,Blood,,,,,,,,,,,,,,,,,,,, -Rest for the Wicked,Rest for the Wicked,,Blood,,,,,,,,,,,,,,,,,,,, -You hear hedges rustling nearby.,You hear hedges rustling nearby.,,Blood,,,,,,,,,,,,,,,,,,,, -The Overlooked Hotel,The Overlooked Hotel,,Blood,,,,,,,,,,,,,,,,,,,, -The secret level lies before you.,The secret level lies before you.,,Blood,,,,,,,,,,,,,,,,,,,, -The Haunting,The Haunting,,Blood,,,,,,,,,,,,,,,,,,,, -The Cold Rush,The Cold Rush,,Blood,,,,,,,,,,,,,,,,,,,, -Bowels of the Earth,Bowels of the Earth,,Blood,,,,,,,,,,,,,,,,,,,, -The Lair of Shial,The Lair of Shial,,Blood,,,,,,,,,,,,,,,,,,,, -Thin Ice,Thin Ice,,Blood,,,,,,,,,,,,,,,,,,,, -Ghost Town,Ghost Town,,Blood,,,,,,,,,,,,,,,,,,,, -The Siege,The Siege,,Blood,,,,,,,,,,,,,,,,,,,, -Raw Sewage,Raw Sewage,,Blood,,,,,,,,,,,,,,,,,,,, -The Sick Ward,The Sick Ward,,Blood,,,,,,,,,,,,,,,,,,,, -Spare Parts,Spare Parts,,Blood,,,,,,,,,,,,,,,,,,,, -Failsafes disabled.,Failsafes disabled.,,Blood,,,,,,,,,,,,,,,,,,,, -Disable failsafes first.,Disable failsafes first.,,Blood,,,,,,,,,,,,,,,,,,,, -Monster Bait,Monster Bait,,Blood,,,,,,,,,,,,,,,,,,,, -The Pit of Cerberus,The Pit of Cerberus,,Blood,,,,,,,,,,,,,,,,,,,, -Catacombs,Catacombs,,Blood,,,,,,,,,,,,,,,,,,,, -Butchery Loves Company,Butchery Loves Company,,Blood,,,,,,,,,,,,,,,,,,,, -Breeding Grounds,Breeding Grounds,,Blood,,,,,,,,,,,,,,,,,,,, -Charnel House,Charnel House,,Blood,,,,,,,,,,,,,,,,,,,, -Crystal Lake,Crystal Lake,,Blood,,,,,,,,,,,,,,,,,,,, -Fire and Brimstone,Fire and Brimstone,,Blood,,,,,,,,,,,,,,,,,,,, -The Ganglion Depths,The Ganglion Depths,,Blood,,,,,,,,,,,,,,,,,,,, -In the Flesh,In the Flesh,,Blood,,,,,,,,,,,,,,,,,,,, -The Hall of the Epiphany,The Hall of the Epiphany,,Blood,,,,,,,,,,,,,,,,,,,, -Mall of the Dead,Mall of the Dead,,Blood,,,,,,,,,,,,,,,,,,,, -The Stronghold,The Stronghold,,Blood,,,,,,,,,,,,,,,,,,,, -Winter Wonderland,Winter Wonderland,,Blood,,,,,,,,,,,,,,,,,,,, -Bodies,Bodies,,Blood,,,,,,,,,,,,,,,,,,,, -The Tower,The Tower,,Blood,,,,,,,,,,,,,,,,,,,, -Click!,Click!,,Blood,,,,,,,,,,,,,,,,,,,, -Twin Fortress,Twin Fortress,,Blood,,,,,,,,,,,,,,,,,,,, +Cradle to Grave,Cradle to Grave,,Blood,,,Von der Wiege zum Grab,,,,,,,,,,,,,Do Berço à Cova,,,, +Hit the switch to end the level.,Hit the switch to end the level.,,Blood,,,Drücke den Schalter um das Level zu beenden.,,,,,,,,,,,,,Aperte para terminar a fase,,,, +"Slurp, slurp . . .","Slurp, slurp . . .",,Blood,,,"Schlürf, schlürf...",,,,,,,,,,,,,,,,, +OUT! OUT! DAMN SPOT!,OUT! OUT! DAMN SPOT!,,Blood,,,RAUS! RAUS! VERDAMMT!!,,,,,,,,,,,,,SAI! SAI! MANCHA MALDITA!,,,, +They'll need more of these.,They'll need more of these.,,Blood,,,Die werden mehr davon brauchen.,,,,,,,,,,,,,Precisarão de mais destes.,,,, +Nevermore . . .,Nevermore . . .,,Blood,,,Niemals...,,,,,,,,,,,,,Nunca mais . . .,,,, +Open for Business.,Open for Business.,,Blood,,,Geöffnet.,,,,,,,,,,,,,Aberto para Negócios.,,,, +I LIVE AGAIN!,I LIVE AGAIN!,,Blood,,,ICH LEBE WIEDER!,,,,,,,,,,,,,ESTOU VIVO NOVAMENTE!,,,, +It is sealed shut.,It is sealed shut.,,Blood,,,Es ist fest verschlossen,,,,,,,,,,,,,Está bem fechado.,,,, +Wrong Side of the Tracks,Wrong Side of the Tracks,,Blood,,,Auf der falschen Seite der Gleise,,,,,,,,,,,,,Lado Errado dos Trilhos,,,, +This probably isn't a good idea.,This probably isn't a good idea.,,Blood,,,Das ist wahrscheinlich keine gute Idee.,,,,,,,,,,,,,Isso provavelmente não é uma boa ideia.,,,, +You really should consider turning back.,You really should consider turning back.,,Blood,,,Du solltest wirklich umkehren.,,,,,,,,,,,,,Você deveria mesmo pensar em voltar.,,,, +Is there a light at the end of the tunnel?,Is there a light at the end of the tunnel?,,Blood,,,Ist da Licht am Ende des Tunnels?,,,,,,,,,,,,,Será que há uma luz no fim do túnel?,,,, +Phantom Express,Phantom Express,,Blood,,,Phantomexpress,,,,,,,,,,,,,Expresso Fantasma,,,, +I must stop this train!,I must stop this train!,,Blood,,,Ich muss diesen Zug stoppen!,,,,,,,,,,,,,Preciso parar este trêm!,,,, +Safety clamps are in place. This switch is locked.,Safety clamps are in place. This switch is locked.,,Blood,,,Sicherheitsklammern aktiv. Der Schalter ist blockiert.,,,,,,,,,,,,,As travas de segurança estão ativadas. Este interruptor está trancado.,,,, +Safety clamps disabled.,Safety clamps disabled.,,Blood,,,Sicherheitsklammern deaktiviert.,,,,,,,,,,,,,As travas de segurança desativadas.,,,, +Internal engine heat rising!,Internal engine heat rising!,,Blood,,,Temperatur in der Brennkammer steigt!,,,,,,,,,,,,,A temperatura do motor interno está aumentando!,,,, +Internal engine heat critical!,Internal engine heat critical!,,Blood,,,Temperatur in der Brennkammer kritisch!,,,,,,,,,,,,,A temperatura do motor interno está em nível crítico!,,,, +Dark Carnival,Dark Carnival,,Blood,,,Dunkler Jahrmarkt,,,,,,,,,,,,,Feira Sombria,,,, +This doesn't open from this side.,This doesn't open from this side.,,Blood,,,Das öffnet sich nicht von dieser Seite,,,,,,,,,,,,,Isso não abre deste lado.,,,, +You're going to the secret level!,You're going to the secret level!,,Blood,,,Du gehst zum Geheimlevel.,,,,,,,,,,,,,Você está indo para a fase secreta!,,,, +Congrats! You win a cupie doll!,Congrats! You win a cupie doll!,,Blood,,,Gratulation! Du gewinnst eine Cupie Puppe,,,,,,,,,,,,,Parabéns! Você ganhou uma bonequinha!,,,, +Hallowed Grounds,Hallowed Grounds,,Blood,,,Gesegneter Grund,,,,,,,,,,,,,Solo Sagrado,,,, +The Great Temple,The Great Temple,,Blood,,,Der große Tempel,,,,,,,,,,,,,O Grande Templo,,,, +I can't believe you found this!,I can't believe you found this!,,Blood,,,"Ich kann nicht glauben, das gefunden zu haben.",,,,,,,,,,,,,Não acredito que você achou isso!,,,, +"Here, you can have it all.","Here, you can have it all.",,Blood,,,"Hier, du kannst es alles haben.",,,,,,,,,,,,,"Tome, pode ficar com tudo.",,,, +Altar of Stone,Altar of Stone,,Blood,,,Steinerner Altar,,,,,,,,,,,,,Altar de Pedra,,,, +House of Horrors,House of Horrors,,Blood,,,Haus des Horrors,,,,,,,,,,,,,Casa dos Horrores,,,, +Shipwrecked,Shipwrecked,,Blood,,,Schiffbruch,,,,,,,,,,,,,Naufragado,,,, +The door is jammed shut.,The door is jammed shut.,,Blood,,,Die Tür ist verrammelt.,,,,,,,,,,,,,A porta está emperrada.,,,, +The Lumber Mill,The Lumber Mill,,Blood,,,Das Sägewerk,,,,,,,,,,,,,A Serraria,,,, +Rest for the Wicked,Rest for the Wicked,,Blood,,,Ruhe für die Gottlosen,,,,,,,,,,,,,Sossego para os Perversos,,,, +You hear hedges rustling nearby.,You hear hedges rustling nearby.,,Blood,,,Du hörst Hecken in der Nähe rascheln,,,,,,,,,,,,,Você ouve o barulho dos arbustos por perto.,,,, +The Overlooked Hotel,The Overlooked Hotel,,Blood,,,Das übersehene Hotel,,,,,,,,,,,,,O Hotel Abandonado,,,, +The secret level lies before you.,The secret level lies before you.,,Blood,,,Das Geheimnis liegt vor dir.,,,,,,,,,,,,,A fase secreta está à sua frente.,,,, +The Haunting,The Haunting,,Blood,,,Der Spuk,,,,,,,,,,,,,A Assombração,,,, +The Cold Rush,The Cold Rush,,Blood,,,Der Kalte Rausch,,,,,,,,,,,,,A Corrida do Frio,,,, +Bowels of the Earth,Bowels of the Earth,,Blood,,,In den Tiefen der Erde,,,,,,,,,,,,,Entranhas da Terra,,,, +The Lair of Shial,The Lair of Shial,,Blood,,,Das Lager von Shial,,,,,,,,,,,,,O Covil de Shial,,,, +Thin Ice,Thin Ice,,Blood,,,Dünnes Eis,,,,,,,,,,,,,Gelo Fino,,,, +Ghost Town,Ghost Town,,Blood,,,Geisterstadt,,,,,,,,,,,,,Cidade Fantasma,,,, +The Siege,The Siege,,Blood,,,Die Belagerung,,,,,,,,,,,,,O Cerco,,,, +Raw Sewage,Raw Sewage,,Blood,,,Rohe Abwasser,,,,,,,,,,,,,Puro Esgoto,,,, +The Sick Ward,The Sick Ward,,Blood,,,Das Krankenhaus,,,,,,,,,,,,,O Sanatório,,,, +Spare Parts,Spare Parts,,Blood,,,Ersatzteile,,,,,,,,,,,,,Peças de Reposição,,,, +Failsafes disabled.,Failsafes disabled.,,Blood,,,Sicherungen deaktiviert,,,,,,,,,,,,,Travas de segurança desativadas.,,,, +Disable failsafes first.,Disable failsafes first.,,Blood,,,Du musst erst die Sicherungen deaktivieren,,,,,,,,,,,,,Desative as travas de segurança primeiro.,,,, +Monster Bait,Monster Bait,,Blood,,,Monsterköder,,,,,,,,,,,,,Isca para Monstros,,,, +The Pit of Cerberus,The Pit of Cerberus,,Blood,,,Die Grube des Cerberus,,,,,,,,,,,,,A Toca de Cerberus,,,, +Catacombs,Catacombs,,Blood,,,Katakomben,,,,,,,,,,,,,Catacumbas,,,, +Butchery Loves Company,Butchery Loves Company,,Blood,,,Gemetzel liebt Gesellschaft,,,,,,,,,,,,,Carnificina Adora Companhia,,,, +Breeding Grounds,Breeding Grounds,,Blood,,,Brutgebiet,,,,,,,,,,,,,Área de Procriação,,,, +Charnel House,Charnel House,,Blood,,,Beinhaus,,,,,,,,,,,,,Ossuário,,,, +Crystal Lake,Crystal Lake,,Blood,,,,,,,,,,,,,,,,Lago de Cristal,,,, +Fire and Brimstone,Fire and Brimstone,,Blood,,,Feuer und Schwefel,,,,,,,,,,,,,Fogo e Enxofre,,,, +The Ganglion Depths,The Ganglion Depths,,Blood,,,Die ganglionischen Tiefen,,,,,,,,,,,,,Profundezas Ganglionares,,,, +In the Flesh,In the Flesh,,Blood,,,Im Fleisch,,,,,,,,,,,,,Em Carne e Osso,,,, +The Hall of the Epiphany,The Hall of the Epiphany,,Blood,,,Die Halle der Erleuchtung,,,,,,,,,,,,,O Salão da Epifania,,,, +Mall of the Dead,Mall of the Dead,,Blood,,,Einkaufszentrum des Todes,,,,,,,,,,,,,Shopping dos Mortos,,,, +The Stronghold,The Stronghold,,Blood,,,Die Festung,,,,,,,,,,,,,A Fortaleza,,,, +Winter Wonderland,Winter Wonderland,,Blood,,,Winterwunderland,,,,,,,,,,,,,Inverno Encantado,,,, +Bodies,Bodies,,Blood,,,Körper,,,,,,,,,,,,,Corpos,,,, +The Tower,The Tower,,Blood,,,Der Turm,,,,,,,,,,,,,A Torre,,,, +Click!,Click!,,Blood,,,Klick!,,,,,,,,,,,,,,,,, +Twin Fortress,Twin Fortress,,Blood,,,Zwillingsfestung,,,,,,,,,,,,,Fortalezas Gêmeas,,,, Midgard,Midgard,,Blood,,,,,,,,,,,,,,,,,,,, -Fun With Heads,Fun With Heads,,Blood,,,,,,,,,,,,,,,,,,,, -Monolith Building 11,Monolith Building 11,,Blood,,,,,,,,,,,,,,,,,,,, -Power!,Power!,,Blood,,,,,,,,,,,,,,,,,,,, -Area 15,Area 15,,Blood,,,,,,,,,,,,,,,,,,,, -Welcome to Your Life,Welcome to Your Life,,Blood,,,,,,,,,,,,,,,,,,,, -They Are Here,They Are Here,,Blood,,,,,,,,,,,,,,,,,,,, -Public Storage,Public Storage,,Blood,,,,,,,,,,,,,,,,,,,, -Aqueducts,Aqueducts,,Blood,,,,,,,,,,,,,,,,,,,, -Power restored.,Power restored.,,Blood,,,,,,,,,,,,,,,,,,,, -The Ruined Temple,The Ruined Temple,,Blood,,,,,,,,,,,,,,,,,,,, -Forbidden Rituals,Forbidden Rituals,,Blood,,,,,,,,,,,,,,,,,,,, -The Dungeon,The Dungeon,,Blood,,,,,,,,,,,,,,,,,,,, -You must complete the sequence to open this door.,You must complete the sequence to open this door.,,Blood,,,,,,,,,,,,,,,,,,,, -Part one of three in the sequence has been completed.,Part one of three in the sequence has been completed.,,Blood,,,,,,,,,,,,,,,,,,,, -Part two of three in the sequence has been completed.,Part two of three in the sequence has been completed.,,Blood,,,,,,,,,,,,,,,,,,,, -Final part completed. A door has opened.,Final part completed. A door has opened.,,Blood,,,,,,,,,,,,,,,,,,,, -Beauty and the Beast,Beauty and the Beast,,Blood,,,,,,,,,,,,,,,,,,,, -Forgotten Catacombs,Forgotten Catacombs,,Blood,,,,,,,,,,,,,,,,,,,, -Cryptic Passage,Cryptic Passage,,Blood,,,,,,,,,,,,,,,,,,,, -Cryptic BloodBath,Cryptic BloodBath,,Blood,,,,,,,,,,,,,,,,,,,, -Boat Docks,Boat Docks,,Blood,,,,,,,,,,,,,,,,,,,, -Old Opera House,Old Opera House,,Blood,,,,,,,,,,,,,,,,,,,, -Gothic Library,Gothic Library,,Blood,,,,,,,,,,,,,,,,,,,, -Lost Monastery,Lost Monastery,,Blood,,,,,,,,,,,,,,,,,,,, -Steamboat,Steamboat,,Blood,,,,,,,,,,,,,,,,,,,, -Graveyard,Graveyard,,Blood,,,,,,,,,,,,,,,,,,,, -Mountain Pass,Mountain Pass,,Blood,,,,,,,,,,,,,,,,,,,, -Abysmal Mine,Abysmal Mine,,Blood,,,,,,,,,,,,,,,,,,,, -Castle,Castle,,Blood,,,,,,,,,,,,,,,,,,,, -Boggy Creek,Boggy Creek,,Blood,,,,,,,,,,,,,,,,,,,, -Crypt of Despair,Crypt of Despair,,Blood,,,,,,,,,,,,,,,,,,,, -Pits of Blood,Pits of Blood,,Blood,,,,,,,,,,,,,,,,,,,, -Unholy Cathedral,Unholy Cathedral,,Blood,,,,,,,,,,,,,,,,,,,, -Deadly Inspirations,Deadly Inspirations,,Blood,,,,,,,,,,,,,,,,,,,, -,Shadow Warrior,,,,,,,,,,,,,,,,,,,,,, -Enter the Wang,TXTS_EP1,,,,,,,,,,,,,,,,,,,,,, -Code of Honor,TXTS_EP2,,,,,,,,,,,,,,,,,,,,,, -Four levels (Shareware Version),TXTS_EPD1,,,,,,,,,,,,,,,,,,,,,, -Eighteen levels (Full Version Only),TXTS_EPD2,,,,,,,,,,,,,,,,,,,,,, -Tiny grasshopper,TXTS_SK1,,,,,,,,,,,,,,,,,,,,,, -I Have No Fear,TXTS_SK2,,,,,,,,,,,,,,,,,,,,,, -Who Wants Wang,TXTS_SK3,,,,,,,,,,,,,,,,,,,,,, -"No Pain, No Gain",TXTS_SK4,,,,,,,,,,,,,,,,,,,,,, -Got the RED key!,TXTS_KEY1,,,,,,,,,,,,,,,,,,,,,, -Got the BLUE key!,TXTS_KEY2,,,,,,,,,,,,,,,,,,,,,, -Got the GREEN key!,TXTS_KEY3,,,,,,,,,,,,,,,,,,,,,, -Got the YELLOW key!,TXTS_KEY4,,,,,,,,,,,,,,,,,,,,,, -Got the GOLD master key!,TXTS_KEY5,,,,,,,,,,,,,,,,,,,,,, -Got the SILVER master key!,TXTS_KEY6,,,,,,,,,,,,,,,,,,,,,, -Got the BRONZE master key!,TXTS_KEY7,,,,,,,,,,,,,,,,,,,,,, -Got the RED master key!,TXTS_KEY8,,,,,,,,,,,,,,,,,,,,,, -You need a RED key for this door.,TXTS_DOOR1,,,,,,,,,,,,,,,,,,,,,, -You need a BLUE key for this door.,TXTS_DOOR2,,,,,,,,,,,,,,,,,,,,,, -You need a GREEN key for this door.,TXTS_DOOR3,,,,,,,,,,,,,,,,,,,,,, -You need a YELLOW key for this door.,TXTS_DOOR4,,,,,,,,,,,,,,,,,,,,,, -You need a GOLD key for this door.,TXTS_DOOR5,,,,,,,,,,,,,,,,,,,,,, -You need a SILVER key for this door.,TXTS_DOOR6,,,,,,,,,,,,,,,,,,,,,, -You need a BRONZE key for this door.,TXTS_DOOR7,,,,,,,,,,,,,,,,,,,,,, -You need a RED key for this door.,TXTS_DOOR8,,,,,,,,,,,,,,,,,,,,,, -You never going to score.,TXTS_COOKIE1,,,,,,,,,,,,,,,,,,,,,, +Fun With Heads,Fun With Heads,,Blood,,,Spaß mit Köpfen,,,,,,,,,,,,,Cabeceio,,,, +Monolith Building 11,Monolith Building 11,,Blood,,,Monolith Gebäude 11,,,,,,,,,,,,,Edifício Monolith 11,,,, +Power!,Power!,,Blood,,,Energie!,,,,,,,,,,,,,Energia!,,,, +Area 15,Area 15,,Blood,,,Zone 15,,,,,,,,,,,,,Área 15,,,, +Welcome to Your Life,Welcome to Your Life,,Blood,,,Willkommen in deinem Leven,,,,,,,,,,,,,Bem-vindo à Sua Vida,,,, +They Are Here,They Are Here,,Blood,,,Sie sind hier,,,,,,,,,,,,,Estão Aqui,,,, +Public Storage,Public Storage,,Blood,,,Öffentliche Lagerung,,,,,,,,,,,,,Depósito Público,,,, +Aqueducts,Aqueducts,,Blood,,,Aquädukte,,,,,,,,,,,,,Aquedutos,,,, +Power restored.,Power restored.,,Blood,,,Energie wiederhergestellt.,,,,,,,,,,,,,Energia restaurada.,,,, +The Ruined Temple,The Ruined Temple,,Blood,,,Die Tempelruine,,,,,,,,,,,,,As Ruínas do Templo,,,, +Forbidden Rituals,Forbidden Rituals,,Blood,,,Verbotene Rituale,,,,,,,,,,,,,Rituais Proibidos,,,, +The Dungeon,The Dungeon,,Blood,,,Der Kerker,,,,,,,,,,,,,A Masmorra,,,, +You must complete the sequence to open this door.,You must complete the sequence to open this door.,,Blood,,,Du must die Sequenz komplettieren um diese Tür zu öffnen,,,,,,,,,,,,,Você preicsa compeltar a sequência para abrir esta porta.,,,, +Part one of three in the sequence has been completed.,Part one of three in the sequence has been completed.,,Blood,,,Der erste Teil der Sequenz ist komplett,,,,,,,,,,,,,Parte 1 de 3 da sequência foi completada.,,,, +Part two of three in the sequence has been completed.,Part two of three in the sequence has been completed.,,Blood,,,Der zweite Teil der Sequenz ist komplett,,,,,,,,,,,,,Parte 2 de 3 da sequência foi completada.,,,, +Final part completed. A door has opened.,Final part completed. A door has opened.,,Blood,,,Sequenz komplett. Eine Tür hat sich geöffnet,,,,,,,,,,,,,Parte final completada. Uma porta se abriu.,,,, +Beauty and the Beast,Beauty and the Beast,,Blood,,,Die Schöne und das Biest,,,,,,,,,,,,,A Bela e a Fera,,,, +Forgotten Catacombs,Forgotten Catacombs,,Blood,,,Vergessene Katakomben,,,,,,,,,,,,,Catacumbas Abandonadas,,,, +Cryptic Passage,Cryptic Passage,,Blood,,,Kryptische Passage,,,,,,,,,,,,,Passagem Oculta,,,, +Cryptic BloodBath,Cryptic BloodBath,,Blood,,,Kryptisches Blutbad,,,,,,,,,,,,,Banho de Sangue Oculto,,,, +Boat Docks,Boat Docks,,Blood,,,Bootdocks,,,,,,,,,,,,,Docas,,,, +Old Opera House,Old Opera House,,Blood,,,Altes Opernhaus,,,,,,,,,,,,,Antiga Casa de Ópera,,,, +Gothic Library,Gothic Library,,Blood,,,Gotische Bibliothek,,,,,,,,,,,,,Biblioteca Gótica,,,, +Lost Monastery,Lost Monastery,,Blood,,,Vergessenes Kloster,,,,,,,,,,,,,Mosteiro Perdido,,,, +Steamboat,Steamboat,,Blood,,,Raddampfer,,,,,,,,,,,,,Barco a Vapor,,,, +Graveyard,Graveyard,,Blood,,,Friedhof,,,,,,,,,,,,,Cemitério,,,, +Mountain Pass,Mountain Pass,,Blood,,,Bergpass,,,,,,,,,,,,,Desfiladeiro,,,, +Abysmal Mine,Abysmal Mine,,Blood,,,Abgründige Mine,,,,,,,,,,,,,Mina Abissal,,,, +Castle,Castle,,Blood,,,Burg,,,,,,,,,,,,,Castelo,,,, +Boggy Creek,Boggy Creek,,Blood,,,Sumpfiger Fluss,,,,,,,,,,,,,Riacho Pantanoso,,,, +Crypt of Despair,Crypt of Despair,,Blood,,,Gruft der Verzweiflung,,,,,,,,,,,,,Cripta do Desespero,,,, +Pits of Blood,Pits of Blood,,Blood,,,Blutgruben,,,,,,,,,,,,,Tocas de Sangue,,,, +Unholy Cathedral,Unholy Cathedral,,Blood,,Bezbožná katedrála,Unheilige Kathedrale,Ανίερος Καθεδρικός,Malsankta Katedralo,Catedral Profana,,Epäpyhä katedraali,Cathédrale Profane,Az istentelen katedrális ,E3M5: Cattedrale Blasfema,邪教の大聖堂,불경한 성당,Onheilige Kathedraal,Bluźniercza Katedra,Catedral Profana,,Catedrala Necurată,Нечестивый собор,Несвета катедрала +Deadly Inspirations,Deadly Inspirations,,Blood,,,,,,,,,,,,,,,,Inspirações Mortais,,,, +,,Shadow Warrior,,,,,,,,,,,,,,,,,,,,, +Enter the Wang,TXTS_EP1,,,,,"Gestatten, Wang!",,,,,,,,,,,,,Lá Vem o Wang,,,, +Code of Honor,TXTS_EP2,,,,,Ehrenkodex,,,,,,,,,,,,,Código de Honra,,,, +Four levels (Shareware Version),TXTS_EPD1,,,,,Vier Level (Sharewareversion),,,,,,,,,,,,,Quatro fases (Versão Shareware),,,, +Eighteen levels (Full Version Only),TXTS_EPD2,,,,,Achtzehn Level (Vollversion),,,,,,,,,,,,,Dezoito fases (Somente na Versão Completa),,,, +Tiny Grasshopper,TXTS_SK1,,,,,Kleiner Grashüpfer,,,,,,,,,,,,,Pequeno gafanhoto,,,, +I Have No Fear,TXTS_SK2,,,,,Ich habe keine Angst,,,,,,,,,,,,,Não Tenho Medo,,,, +Who Wants Wang,TXTS_SK3,,,,,Wer will Wang,,,,,,,,,,,,,Quem Quer Wang,,,, +"No Pain, No Gain",TXTS_SK4,,,,,Kkein Schmerz kein Gewinn,,,,,,,,,,,,,"Sem Dor, Sem Ganho",,,, +Got the RED key!,TXTS_KEY1,,,,,Der ROTE Schlüssel!,,,,,,,,,,,,,Pegou a chave VERMELHA!,,,, +Got the BLUE key!,TXTS_KEY2,,,,,Der BLAUE Schlüssel!,,,,,,,,,,,,,Pegou a chave AZUL!,,,, +Got the GREEN key!,TXTS_KEY3,,,,,Der GRÜNE Schlüssel!,,,,,,,,,,,,,Pegou a chave VERDE!,,,, +Got the YELLOW key!,TXTS_KEY4,,,,,Der GELBE Schlüssel!,,,,,,,,,,,,,Pegou a chave AMARELA!,,,, +Got the GOLD master key!,TXTS_KEY5,,,,,Der GOLDENE Hauptschlüssel!,,,,,,,,,,,,,Pegou a chave mestra de OURO!,,,, +Got the SILVER master key!,TXTS_KEY6,,,,,Der SILBERNE Hauptschlüssel!,,,,,,,,,,,,,Pegou a chave mestra de PRATA!,,,, +Got the BRONZE master key!,TXTS_KEY7,,,,,Der BRONZENE Hauptschlüssel!,,,,,,,,,,,,,Pegou a chave mestra de BRONZE!,,,, +Got the RED master key!,TXTS_KEY8,,,,,Der ROTE Hauptschlüssel!,,,,,,,,,,,,,Pegou a chave mestra VERMELHA!,,,, +You need a RED key for this door.,TXTS_DOOR1,,,,,Du brauchst einen ROTEN Schlüssel für diese Tür,,,,,,,,,,,,,Você precisa de uma chave VERMELHA para esta porta.,,,, +You need a BLUE key for this door.,TXTS_DOOR2,,,,,Du brauchst einen BLAUEN Schlüssel für diese Tür,,,,,,,,,,,,,Você precisa de uma chave AZUL para esta porta.,,,, +You need a GREEN key for this door.,TXTS_DOOR3,,,,,Du brauchst einen GRÜNEN Schlüssel für diese Tür,,,,,,,,,,,,,Você precisa de uma chave VERDE para esta porta.,,,, +You need a YELLOW key for this door.,TXTS_DOOR4,,,,,Du brauchst einen GELBEN Schlüssel für diese Tür,,,,,,,,,,,,,Você precisa de uma chave AMARELA para esta porta.,,,, +You need a GOLD key for this door.,TXTS_DOOR5,,,,,Du brauchst einen GOLDENEN Schlüssel für diese Tür,,,,,,,,,,,,,Você precisa de uma chave de OURO para esta porta.,,,, +You need a SILVER key for this door.,TXTS_DOOR6,,,,,Du brauchst einen SILBERNEN Schlüssel für diese Tür,,,,,,,,,,,,,Você precisa de uma chave de PRATA para esta porta.,,,, +You need a BRONZE key for this door.,TXTS_DOOR7,,,,,Du brauchst einen BRONZENEN Schlüssel für diese Tür,,,,,,,,,,,,,Você precisa de uma chave de BRONZE para esta porta.,,,, +You need a RED key for this door.,TXTS_DOOR8,,,,,Du brauchst einen ROTEN Schlüssel für diese Tür,,,,,,,,,,,,,Você precisa de uma chave VERMELHA para esta porta.,,,, +You never going to score.,TXTS_COOKIE1,"If these cannot be translated literally, think of something fitting in your language.",,,,Du es nie zu etwas bringen wirst.,,,,,,,,,,,,,Você nunca vai se dar bem na vida.,,,, 26-31-43-82-16-29,TXTS_COOKIE2,,,,,,,,,,,,,,,,,,,,,, -"Sorry, you no win this time, try again.",TXTS_COOKIE3,,,,,,,,,,,,,,,,,,,,,, -You try harder get along. Be a nice man.,TXTS_COOKIE4,,,,,,,,,,,,,,,,,,,,,, -"No man is island, except Lo Wang.",TXTS_COOKIE5,,,,,,,,,,,,,,,,,,,,,, -There is much death in future.,TXTS_COOKIE6,,,,,,,,,,,,,,,,,,,,,, -You should kill all business associates.,TXTS_COOKIE7,,,,,,,,,,,,,,,,,,,,,, -"(c)1997,3DRealms fortune cookie company.",TXTS_COOKIE8,,,,,,,,,,,,,,,,,,,,,, -Your chi attracts many chicks.,TXTS_COOKIE9,,,,,,,,,,,,,,,,,,,,,, -Don't you know you the scum of society!?,TXTS_COOKIE10,,,,,,,,,,,,,,,,,,,,,, -You should not scratch yourself there.,TXTS_COOKIE11,,,,,,,,,,,,,,,,,,,,,, -"Man who stand on toilet, high on pot.",TXTS_COOKIE12,,,,,,,,,,,,,,,,,,,,,, -Man who fart in church sit in own pew.,TXTS_COOKIE13,,,,,,,,,,,,,,,,,,,,,, -Man trapped in pantry has ass in jam.,TXTS_COOKIE14,,,,,,,,,,,,,,,,,,,,,, -Baseball wrong. Man with 4 balls cannot walk.,TXTS_COOKIE15,,,,,,,,,,,,,,,,,,,,,, -Man who buy drowned cat pay for wet pussy.,TXTS_COOKIE16,,,,,,,,,,,,,,,,,,,,,, -Fortune Say:,TXTS_FORTUNE,,,,,,,,,,,,,,,,,,,,,, -Armor Vest +50,TXTS_INV1,,,,,,,,,,,,,,,,,,,,,, -Kevlar Armor Vest +100,TXTS_INV2,,,,,,,,,,,,,,,,,,,,,, -MedKit +20,TXTS_INV3,,,,,,,,,,,,,,,,,,,,,, -Fortune Cookie +50 BOOST,TXTS_INV4,,,,,,,,,,,,,,,,,,,,,, -Portable MedKit,TXTS_INV5,,,,,,,,,,,,,,,,,,,,,, -Gas Bomb,TXTS_INV6,,,,,,,,,,,,,,,,,,,,,, -Flash Bomb,TXTS_INV7,,,,,,,,,,,,,,,,,,,,,, -Caltrops,TXTS_INV8,,,,,,,,,,,,,,,,,,,,,, -Night Vision Goggles,TXTS_INV9,,,,,,,,,,,,,,,,,,,,,, -Repair Kit,TXTS_INV10,,,,,,,,,,,,,,,,,,,,,, -Smoke Bomb,TXTS_INV11,,,,,,,,,,,,,,,,,,,,,, -Fists,TXTS_WEAP1,,,,,,,,,,,,,,,,,,,,,, -Sword,TXTS_WEAP2,,,,,,,,,,,,,,,,,,,,,, -Shurikens,TXTS_WEAP3,,,,,,,,,,,,,,,,,,,,,, -Sticky Bombs,TXTS_WEAP4,,,,,,,,,,,,,,,,,,,,,, -Darts,TXTS_DARTS,,,,,,,,,,,,,,,,,,,,,, -UZI Submachine Gun,TXTS_WEAP5,,,,,,,,,,,,,,,,,,,,,, -Missile Launcher,TXTS_WEAP6,,,,,,,,,,,,,,,,,,,,,, -Nuclear Warhead,TXTS_WEAP7,,,,,,,,,,,,,,,,,,,,,, -Grenade Launcher,TXTS_WEAP8,,,,,,,,,,,,,,,,,,,,,, -Rail Gun,TXTS_WEAP9,,,,,,,,,,,,,,,,,,,,,, -Riot Gun,TXTS_WEAP10,,,,,,,,,,,,,,,,,,,,,, -Guardian Head,TXTS_WEAP11,,,,,,,,,,,,,,,,,,,,,, -Ripper Heart,TXTS_WEAP12,,,,,,,,,,,,,,,,,,,,,, -UZI Clip,TXTS_AMMO5,,,,,,,,,,,,,,,,,,,,,, -Missiles,TXTS_AMMO6,,,,,,,,,,,,,,,,,,,,,, -Heat Seeker Card,TXTS_AMMO7,,,,,,,,,,,,,,,,,,,,,, -Grenade Shells,TXTS_AMMO8,,,,,,,,,,,,,,,,,,,,,, -Rail Gun Rods,TXTS_AMMO9,,,,,,,,,,,,,,,,,,,,,, -Shotshells,TXTS_AMMO10,,,,,,,,,,,,,,,,,,,,,, -Firebursts,TXTS_AMMO11,,,,,,,,,,,,,,,,,,,,,, -Deathcoils,TXTS_AMMO12,,,,,,,,,,,,,,,,,,,,,, +"Sorry, you no win this time, try again.",TXTS_COOKIE3,,,,,"Schade, du nicht gewinnen dieses Mal, versuch nochmal.",,,,,,,,,,,,,"Foi mal, você não ganhou desta vez. Tenta de novo.",,,, +You try harder get along. Be a nice man.,TXTS_COOKIE4,,,,,"Gib mehr Mühe, netter Mann zu sein.",,,,,,,,,,,,,Vê se tenta se comportar. Seja bom homem.,,,, +"No man is island, except Lo Wang.",TXTS_COOKIE5,,,,,"Kein Mann ist Insel, außer Lo Wang.",,,,,,,,,,,,,"Nenhum homem é ilha, exceto Lo Wang.",,,, +There is much death in future.,TXTS_COOKIE6,,,,,Da ist viel Tod in Zukunft.,,,,,,,,,,,,,Tem muita morte no futuro.,,,, +You should kill all business associates.,TXTS_COOKIE7,,,,,Du solltest töten alle Geschäftspartner.,,,,,,,,,,,,,Você devia matar todos os parceiros de negócios.,,,, +"(c)1997,3DRealms fortune cookie company.",TXTS_COOKIE8,,,,,(c) 1997 3DRealms Glückskeksfabrik,,,,,,,,,,,,,"(c)1997,3DRealms fábrica de biscoito da sorte.",,,, +Your chi attracts many chicks.,TXTS_COOKIE9,,,,,Dein Chi zieht viele Miezen an.,,,,,,,,,,,,,Seu chi atrai bastante gostosa.,,,, +Don't you know you the scum of society!?,TXTS_COOKIE10,,,,,"Weißt du nicht, dass du bist Abschaum von Gesellschaft?",,,,,,,,,,,,,Você não sabia que você é escória da sociedade!?,,,, +You should not scratch yourself there.,TXTS_COOKIE11,,,,,Du solltest dich nicht kratzen hier.,,,,,,,,,,,,,Melhor não se coçar aí.,,,, +"Man who stand on toilet, high on pot.",TXTS_COOKIE12,,,,,"Hast du Frau mit Bart, kann sein ist Mann.",,,,,,,,,,,,,Homem que deixa cair relógio no vaso tem tempo de merda.,,,, +Man who fart in church sit in own pew.,TXTS_COOKIE13,,,,,Berühmtheit mancher Leute hängt zusammen mit Blödheit der Bewunderer,,,,,,,,,,,,,Homem que peida na igreja fica no próprio banco.,,,, +Man trapped in pantry has ass in jam.,TXTS_COOKIE14,,,,,"Erst wenn Mücke auf deinen Eiern landet, wirst du lösen Probleme ohne Gewalt",,,,,,,,,,,,,Homem com um pauzinho passa fome.,,,, +Baseball wrong. Man with 4 balls cannot walk.,TXTS_COOKIE15,,,,,Baseball falsch. Mann mit 4 Eiern kann nicht laufen.,,,,,,,,,,,,,Baseball tá errado. Homem com 4 bolas não caminha.,,,, +Man who buy drowned cat pay for wet pussy.,TXTS_COOKIE16,,,,,Das frühe Vögeln entspannt den Wurm.,,,,,,,,,,,,,Homem que compra gato afogado paga por xaninha molhada.,,,, +Fortune Say:,TXTS_FORTUNE,,,,,Glückskeks sagt:,,,,,,,,,,,,,Sua Sorte Diz:,,,, +Armor Vest +50,TXTS_INV1,,,,,Panzerweste +50,,,,,,,,,,,,,Colete +50,,,, +Kevlar Armor Vest +100,TXTS_INV2,,,,,Kevlarweste +100,,,,,,,,,,,,,Colete de Kevlar +100,,,, +MedKit +20,TXTS_INV3,,,,,,,,,,,,,,,,,,Kit Médico +20,,,, +Fortune Cookie +50 BOOST,TXTS_INV4,,,,,Glückskeks +50,,,,,,,,,,,,,Biscoito da Sorte +50,,,, +Portable MedKit,TXTS_INV5,,,,,Portables MediKit,,,,,,,,,,,,,Kit Médico Portátil,,,, +Gas Bomb,TXTS_INV6,,,,,Gasbombe,,,,,,,,,,,,,Bomba de Gás,,,, +Flash Bomb,TXTS_INV7,,,,,Blendbombe,,,,,,,,,,,,,Bomba Atordoante,,,, +Caltrops,TXTS_INV8,,,,,Krähenfüße,,,,,,,,,,,,,Estrepes,,,, +Night Vision Goggles,TXTS_INV9,,,,,Nachsichtgerät,,,,,,,,,,,,,Óculos de Visão Noturna,,,, +Repair Kit,TXTS_INV10,,,,,Werkzeugkasten,,,,,,,,,,,,,Kit de Reparos,,,, +Smoke Bomb,TXTS_INV11,,,,,Rauchbombe,,,,,,,,,,,,,Bomba de Fumaça,,,, +Fists,TXTS_WEAP1,,,,,Fäuste,,,,,,,,,,,,,Punhos,,,, +Sword,TXTS_WEAP2,,,,,Schwert,,,,,,,,,,,,,Espada,,,, +Shurikens,TXTS_WEAP3,,,,,Shuriken,,,,,,,,,,,,,,,,, +Sticky Bombs,TXTS_WEAP4,,,,,Klebebombe,,,,,,,,,,,,,Bombas Adesivas,,,, +Darts,TXTS_DARTS,,,,,Pfeile,,,,,,,,,,,,,Dardos,,,, +UZI Submachine Gun,TXTS_WEAP5,,,,,UZI Maschinenpistole,,,,,,,,,,,,,Submetralhadora UZI,,,, +Missile Launcher,TXTS_WEAP6,,,,,Raketenwerfer,,,,,,,,,,,,,Lança-mísseis,,,, +Nuclear Warhead,TXTS_WEAP7,,,,,Atomsprengkopf,,,,,,,,,,,,,Ogiva Nuclear,,,, +Grenade Launcher,TXTS_WEAP8,,,,,Granatenwerfer,,,,,,,,,,,,,Lança-granadas,,,, +Rail Gun,TXTS_WEAP9,,,,,,,,,,,,,,,,,,Canhão Elétrico,,,, +Riot Gun,TXTS_WEAP10,,,,,Sturmgewehr,,,,,,,,,,,,,Metralhadora Pesada,,,, +Guardian Head,TXTS_WEAP11,,,,,Wächterkopf,,,,,,,,,,,,,Cabeça de Guardião,,,, +Ripper Heart,TXTS_WEAP12,,,,,Ripperherz,,,,,,,,,,,,,Coração de Ripper,,,, +UZI Clip,TXTS_AMMO5,,,,,UZI Magazin,,,,,,,,,,,,,Carregador de UZI,,,, +Missiles,TXTS_AMMO6,,,,,Raketen,,,,,,,,,,,,,Misseis,,,, +Heat Seeker Card,TXTS_AMMO7,,,,,Hitzesucherkarte,,,,,,,,,,,,,Placa de Míssil Teleguiado,,,, +Grenade Shells,TXTS_AMMO8,,,,,Granaten,,,,,,,,,,,,,Tiros de Granada,,,, +Rail Gun Rods,TXTS_AMMO9,,,,,Rail Gun Munition,,,,,,,,,,,,,Hastes de Canhão Elétrico,,,, +Shotshells,TXTS_AMMO10,,,,,Schrotflintenpatronen,,,,,,,,,,,,,Cartuchos de Metralhadora Pesada,,,, +Firebursts,TXTS_AMMO11,,,,,Feuerkugeln,,,,,,,,,,,,,Bolas de Fogo,,,, +Deathcoils,TXTS_AMMO12,,,,,Todeskerne,,,,,,,,,,,,,Núcleos da Morte,,,, "Automapping ON -",TXTS_AMON,,,,,,,,,,,,,,,,,,,,,, -Automapping OFF,TXTS_AMOFF,,,,,,,,,,,,,,,,,,,,,, -Given Weapon,TXTS_GIVENW,,,,,,,,,,,,,,,,,,,,,, -Add Ammo to Weapon,TXTS_AMMOW,,,,,,,,,,,,,,,,,,,,,, -Added Health,TXTS_ADDEDHEALTH,,,,,,,,,,,,,,,,,,,,,, -Given all keys,TXTS_GIVEKEY,,,,,,,,,,,,,,,,,,,,,, -Key given,TXTS_KEYGIVEN,,,,,,,,,,,,,,,,,,,,,, -Key removed,TXTS_KEYREMOVED,,,,,,,,,,,,,,,,,,,,,, -You're too skillful to cheat,TXTS_TOOSKILLFUL,,,,,,,,,,,,,,,,,,,,,, -Press Space Bar to continue,TXTS_PRESSSPACE,,,,,,,,,,,,,,,,,,,,,, -Press SPACE to restart,TXTS_PRESSSPACER,,,,,,,,,,,,,,,,,,,,,, -%p decided to do the graveyard tour.,TXTS_SUICIDE01,"todo (player.cpp, line 6346ff)",,,,,,,,,,,,,,,,,,,,, -%p had enough and checked out.,TXTS_SUICIDE02,,,,,,,,,,,,,,,,,,,,,, -%p didn't fear the Reaper.,TXTS_SUICIDE03,,,,,,,,,,,,,,,,,,,,,, -%p dialed the 1-800-CYANIDE line.,TXTS_SUICIDE04,,,,,,,,,,,,,,,,,,,,,, -%p wasted himself.,TXTS_SUICIDE05,,,,,,,,,,,,,,,,,,,,,, -%p kicked his own ass.,TXTS_SUICIDE06,,,,,,,,,,,,,,,,,,,,,, -%p went out in blaze of his own glory.,TXTS_SUICIDE07,,,,,,,,,,,,,,,,,,,,,, -%p killed himself before anyone else could.,TXTS_SUICIDE08,,,,,,,,,,,,,,,,,,,,,, -%p needs shooting lessons.,TXTS_SUICIDE09,,,,,,,,,,,,,,,,,,,,,, -%p blew his head off.,TXTS_SUICIDE10,,,,,,,,,,,,,,,,,,,,,, -%p did everyone a favor and offed himself,TXTS_SUICIDE11,,,,,,,,,,,,,,,,,,,,,, -%p was wasted by %k's %z.,TXTS_MPOBIT01,,,,,,,,,,,,,,,,,,,,,, -%p got his ass kicked by %k's %z.,TXTS_MPOBIT02,,,,,,,,,,,,,,,,,,,,,, -%p bows down before the mighty power of %z.,TXTS_MPOBIT03,,,,,,,,,,,,,,,,,,,,,, -%p was killed by %k's %z.,TXTS_MPOBIT04,,,,,,,,,,,,,,,,,,,,,, -%p got slapped down hard by %k's %z.,TXTS_MPOBIT05,,,,,,,,,,,,,,,,,,,,,, -%p got on his knees before %k.,TXTS_MPOBIT06,,,,,,,,,,,,,,,,,,,,,, -%p was totally out classed by %k's %z.,TXTS_MPOBIT07,,,,,,,,,,,,,,,,,,,,,, -%p got chewed apart by %k's %z.,TXTS_MPOBIT08,,,,,,,,,,,,,,,,,,,,,, -%p was retired by %k's %z.,TXTS_MPOBIT09,,,,,,,,,,,,,,,,,,,,,, -%p was greased by %k's %z.,TXTS_MPOBIT10,,,,,,,,,,,,,,,,,,,,,, -%p was humbled lower than dirt by %k.,TXTS_MPOBIT11,,,,,,,,,,,,,,,,,,,,,, -%p beats %k like a red headed step child.,TXTS_MPOBIT12,,,,,,,,,,,,,,,,,,,,,, -%p begs for mercy as %k terminates @[en_ppro] with extreme prejudice.,TXTS_MPOBIT13,,,,,,,,,,,,,,,,,,,,,, -%p falls before the superior skills of %k.,TXTS_MPOBIT14,,,,,,,,,,,,,,,,,,,,,, -%k gives %p a beating @[en_pro] will never forget.,TXTS_MPOBIT15,,,,,,,,,,,,,,,,,,,,,, -%k puts the Smack Dab on %p with the %z.,TXTS_MPOBIT16,,,,,,,,,,,,,,,,,,,,,, -This only opens in single play.,TXTS_SPONLY,,,,,,,,,,,,,,,,,,,,,, -You found a secret area!,TXTS_SECRET,,,,,,,,,,,,,,,,,,,,,, -Zombie,Zombie,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Blood Worm,Blood Worm,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Skeletor Priest,Skeletor Priest,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Coolie Ghost,Coolie Ghost,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Guardian,Guardian,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Hornet,Hornet,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Ripper Hatchling,Ripper Hatchling,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Ripper,Ripper,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Killer Rabbit,Killer Rabbit,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Serpent God,Serpent God,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Girl Ninja,Girl Ninja,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Blade,Blade,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Dart,Dart,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Shuriken,Shuriken,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Crossbow Bolt,Crossbow Bolt,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Spear,Spear,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Lava Boulder,Lava Boulder,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Uzi,Uzi,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Evil Ninja Uzi,Evil Ninja Uzi,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Shotgun,Shotgun,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Meteor,Meteor,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Rocket,Rocket,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Rail Gun,Rail Gun,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Enemy Rocket,Enemy Rocket,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Bunny Rocket,Bunny Rocket,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Explosion,Explosion,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Tank Shell,Tank Shell,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Nuclear Bomb,Nuclear Bomb,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -40mm Grenade,40mm Grenade,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Micro Missile,Micro Missile,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Sticky Bomb,Sticky Bomb,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Napalm,Napalm,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Vomit,Vomit,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Coolie Ghost Phlem,Coolie Ghost Phlem,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Accursed Head,Accursed Head,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Bouncing Betty,Bouncing Betty,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Serpent God Protector,Serpent God Protector,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Flames,Flames,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Radiation,Radiation,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Caltrops,Caltrops,,ShadowWarrior,,,,,,,,,,,,,,,,,,,, -Seppuku Station,TXTS_MAP01,,,,,,,,,,,,,,,,,,,,,, -Zilla Construction,TXTS_MAP02,,,,,,,,,,,,,,,,,,,,,, -Master Leep's Temple,TXTS_MAP03,,,,,,,,,,,,,,,,,,,,,, -Dark Woods of the Serpent,TXTS_MAP04,,,,,,,,,,,,,,,,,,,,,, -Rising Son,TXTS_MAP05,,,,,,,,,,,,,,,,,,,,,, -Killing Fields,TXTS_MAP06,,,,,,,,,,,,,,,,,,,,,, -Hara-Kiri Harbor,TXTS_MAP07,,,,,,,,,,,,,,,,,,,,,, -Zilla's Villa,TXTS_MAP08,,,,,,,,,,,,,,,,,,,,,, -Monastery,TXTS_MAP09,,,,,,,,,,,,,,,,,,,,,, -Raider of the Lost Wang,TXTS_MAP10,,,,,,,,,,,,,,,,,,,,,, -Sumo Sky Palace,TXTS_MAP11,,,,,,,,,,,,,,,,,,,,,, -Bath House,TXTS_MAP12,,,,,,,,,,,,,,,,,,,,,, -Unfriendly Skies,TXTS_MAP13,,,,,,,,,,,,,,,,,,,,,, -Crude Oil,TXTS_MAP14,,,,,,,,,,,,,,,,,,,,,, -Coolie Mines,TXTS_MAP15,,,,,,,,,,,,,,,,,,,,,, -Subpen 7,TXTS_MAP16,,,,,,,,,,,,,,,,,,,,,, -The Great Escape,TXTS_MAP17,,,,,,,,,,,,,,,,,,,,,, -Floating Fortress,TXTS_MAP18,,,,,,,,,,,,,,,,,,,,,, -Water Torture,TXTS_MAP19,,,,,,,,,,,,,,,,,,,,,, -Stone Rain,TXTS_MAP20,,,,,,,,,,,,,,,,,,,,,, -Shanghai Shipwreck,TXTS_MAP21,,,,,,,,,,,,,,,,,,,,,, -Auto Maul,TXTS_MAP22,,,,,,,,,,,,,,,,,,,,,, -Heavy Metal (DM only),TXTS_MAP23,,,,,,,,,,,,,,,,,,,,,, -Ripper Valley (DM only),TXTS_MAP24,,,,,,,,,,,,,,,,,,,,,, -House of Wang (DM only),TXTS_MAP25,,,,,,,,,,,,,,,,,,,,,, -Lo Wang Rally (DM only),TXTS_MAP26,,,,,,,,,,,,,,,,,,,,,, -Ruins of the Ronin (CTF),TXTS_MAP27,,,,,,,,,,,,,,,,,,,,,, -Killing Fields (CTF),TXTS_MAP28,,,,,,,,,,,,,,,,,,,,,, +",TXTS_AMON,,,,,Automap an,,,,,,,,,,,,,Automap Ligado,,,, +Automapping OFF,TXTS_AMOFF,,,,,Automap aus,,,,,,,,,,,,,Automap Desligado,,,, +Given Weapon,TXTS_GIVENW,,,,,Waffe erhalten,,,,,,,,,,,,,Arma Recebida,,,, +Add Ammo to Weapon,TXTS_AMMOW,,,,,Munition für Waffe erhalten,,,,,,,,,,,,,Adicionar Munição à Arma,,,, +Added Health,TXTS_ADDEDHEALTH,,,,,Gesundheit erhalten,,,,,,,,,,,,,Saúde Recebida,,,, +Given all keys,TXTS_GIVEKEY,,,,,Alle Schlüssel erhalten,,,,,,,,,,,,,Todas as Chaves Recebidas,,,, +Key given,TXTS_KEYGIVEN,,,,,Schlüssel erhalten,,,,,,,,,,,,,Chave recebida,,,, +Key removed,TXTS_KEYREMOVED,,,,,Schlüssel entfernt,,,,,,,,,,,,,Chave removida,,,, +You're too skillful to cheat,TXTS_TOOSKILLFUL,,,,,Du bist zu geschickt um zu schummeln,,,,,,,,,,,,,Você é habilidoso demais para trapacear,,,, +Press Space Bar to continue,TXTS_PRESSSPACE,,,,,Drücke 'Benutzen' um fortzufahren,,,,,,,,,,,,,Aperte Espaço para continuar,,,, +Press SPACE to restart,TXTS_PRESSSPACER,,,,,Drücke 'Benutzen' um neuzustarten,,,,,,,,,,,,,Aperte ESPAÇO para reiniciar,,,, +%p decided to do the graveyard tour.,TXTS_SUICIDE01,"todo (player.cpp, line 6346ff)",,,,"%p entschied sich, die Friedhofstour zu machen.",,,,,,,,,,,,,%p decidiu visitar o cemitério.,,,, +%p had enough and checked out.,TXTS_SUICIDE02,,,,,%p hatte genug und verschwand.,,,,,,,,,,,,,%p teve o bastante e deu o fora.,,,, +%p didn't fear the Reaper.,TXTS_SUICIDE03,,,,,%p hatte keine Angst vor dem Tod.,,,,,,,,,,,,,%p não tinha medo da morte.,,,, +%p dialed the 1-800-CYANIDE line.,TXTS_SUICIDE04,,,,,%p wählte 0800-ZYANID.,,,,,,,,,,,,,%p ligou para o número 0800-CIANURETO.,,,, +%p wasted himself.,TXTS_SUICIDE05,,,,,%p erledigte sich selbst,,,,,,,,,,,,,%p se detonou.,,,, +%p kicked his own ass.,TXTS_SUICIDE06,,,,,%p trat sich selbst in den Hintern.,,,,,,,,,,,,,%p chutou a própria bunda.,,,, +%p went out in blaze of his own glory.,TXTS_SUICIDE07,,,,,%p ging in Flammen seiner eigenen Herrlichkeit aus.,,,,,,,,,,,,,%p se foi no lampejo de sua própria glória.,,,, +%p killed himself before anyone else could.,TXTS_SUICIDE08,,,,,"%p tötete sich selbst, bevor irgend jemand anderes dies schaffte.",,,,,,,,,,,,,%p se matou antes que qualquer outro pudesse matar.,,,, +%p needs shooting lessons.,TXTS_SUICIDE09,,,,,%p braucht Waffentraining.,,,,,,,,,,,,,%p precisa de umas aulas de tiro.,,,, +%p blew his head off.,TXTS_SUICIDE10,,,,,%p hat sich den Kopf weggepustet.,,,,,,,,,,,,,%p estourou os próprios miolos.,,,, +%p did everyone a favor and offed himself,TXTS_SUICIDE11,,,,,%p hat allen einen Gefallen getan und sich selbst verabschiedet.,,,,,,,,,,,,,%p fez um favor à todos e se matou.,,,, +%p was wasted by %k's %z.,TXTS_MPOBIT01,,,,,%p wurde von %ks %z niedergestreckt.,,,,,,,,,,,,,%p foi aniquilado com %z de %k.,,,, +%p got his ass kicked by %k's %z.,TXTS_MPOBIT02,,,,,%p wurde von %ks %z in den Arsch getreten.,,,,,,,,,,,,,%p tomou um laço de %z de %k.,,,, +%p bows down before the mighty power of %k.,TXTS_MPOBIT03,,,,,%p machte einen Kniefall vor %ks Macht.,,,,,,,,,,,,,%p se curvou diante do poder supremo de %k.,,,, +%p was killed by %k's %z.,TXTS_MPOBIT04,,,,,%p wurde von %ks %z getötet.,,,,,,,,,,,,,%p foi morto com %z de %k.,,,, +%p got slapped down hard by %k's %z.,TXTS_MPOBIT05,,,,,%p wurde von %ks %z hinweggeblasen.,,,,,,,,,,,,,%p levou uns tabefes de %z de %k.,,,, +%p got on his knees before %k.,TXTS_MPOBIT06,,,,,%p machte einen Kniefall vor %k.,,,,,,,,,,,,,%p se ajoelhou diante de %k.,,,, +%p was totally out classed by %k's %z.,TXTS_MPOBIT07,,,,,%p wurde von %ks %z deklassiert.,,,,,,,,,,,,,%p não teve a menor chance contra %z de %k.,,,, +%p got chewed apart by %k's %z.,TXTS_MPOBIT08,,,,,%p wurde von %ks %z zermalmt.,,,,,,,,,,,,,%p virou pedacinhos por %z de %k.,,,, +%p was retired by %k's %z.,TXTS_MPOBIT09,,,,,%p wurde von %ks %z in den Ruhestand entlassen.,,,,,,,,,,,,,%p foi aposentado por %z de %k.,,,, +%p was greased by %k's %z.,TXTS_MPOBIT10,,,,,%p wurde von %ks %z eingeseift.,,,,,,,,,,,,,%p virou patê por %z de %k.,,,, +%p was humbled lower than dirt by %k.,TXTS_MPOBIT11,,,,,%p wurde von %ks %z erniedrigt.,,,,,,,,,,,,,%p foi humilhado até não poder mais por %z de %k.,,,, +%p beats %k like a red headed step child.,TXTS_MPOBIT12,,,,,%p wurde von %ks %z zu Brei verarbeitet.,,,,,,,,,,,,,%p espancou %k que nem um pobre coitado.,,,, +%p begs for mercy as %k terminates @[en_ppro] with extreme prejudice.,TXTS_MPOBIT13,,,,,"%p hat um Gnade gebettelt, als %k @[de_ppro] aus dem Verkehr gezogen hat.",,,,,,,,,,,,,%p implorou por piedade enquanto %k acaba com @[en_ppro] com força máxima.,,,, +%p falls before the superior skills of %k.,TXTS_MPOBIT14,,,,,%p wurde von %ks überlegenen Fähigkeiten überwältigt.,,,,,,,,,,,,,%p tombou diante das habilidades superiores de %k.,,,, +%k gives %p a beating @[en_pro] will never forget.,TXTS_MPOBIT15,,,,,%p wurde von %ks %z zu Brei verarbeitet.,,,,,,,,,,,,,%k encheu %p de tanta porrada que @[en_pro] nunca vai se esquecer.,,,, +%k puts the Smack Dab on %p with the %z.,TXTS_MPOBIT16,,,,,%p wurde von %ks %z in den Arsch getreten.,,,,,,,,,,,,,%k deu uma sova em %p com %z.,,,, +This only opens in single play.,TXTS_SPONLY,,,,,Dies öffnet nur im Einzelspielermodus.,,,,,,,,,,,,,Isso somente abre no modo singleplayer.,,,, +You found a secret area!,TXTS_SECRET,,,,,Du hast ein Geheimlevel gefunden.,,,,,,,,,,,,,Você encontrou uma área secreta!,,,, +Zombie,Zombie,,ShadowWarrior,,,,,,,,,,,,,,,,Zumbi,,,, +Blood Worm,Blood Worm,,ShadowWarrior,,,Blutwurm,,,,,,,,,,,,,Sanguessuga,,,, +Skeletor Priest,Skeletor Priest,,ShadowWarrior,,,Knochenpriester,,,,,,,,,,,,,Esqueleto Monge,,,, +Coolie Ghost,Coolie Ghost,,ShadowWarrior,,,Kuligeist,,,,,,,,,,,,,Coolie Fantasma,,,, +Guardian,Guardian,,ShadowWarrior,,,Wächter,,,,,,,,,,,,,Guardião,,,, +Hornet,Hornet,,ShadowWarrior,,,Hornisse,,,,,,,,,,,,,Vespa,,,, +Ripper Hatchling,Ripper Hatchling,,ShadowWarrior,,,Ripperlarve,,,,,,,,,,,,,Filhote de Ripper,,,, +Ripper,Ripper,,ShadowWarrior,,,Ripper,,,,,,,,,,,,,Ripper,,,, +Killer Rabbit,Killer Rabbit,,ShadowWarrior,,,Killerkaninchen,,,,,,,,,,,,,Coelho Assassino,,,, +Serpent God,Serpent God,,ShadowWarrior,,,Schlangengott,,,,,,,,,,,,,Deus Serpente,,,, +Girl Ninja,Girl Ninja,,ShadowWarrior,,,Ninjamädchen,,,,,,,,,,,,,Garota Ninja,,,, +Blade,Blade,,ShadowWarrior,,,Klinge,,,,,,,,,,,,,Espada,,,, +Dart,Dart,,ShadowWarrior,,,Pfeil,,,,,,,,,,,,,Dardo,,,, +Shuriken,Shuriken,,ShadowWarrior,,,Shuriken,,,,,,,,,,,,,,,,, +Crossbow Bolt,Crossbow Bolt,,ShadowWarrior,,,Armbrustpfeil,,,,,,,,,,,,,Flecha de Besta,,,, +Spear,Spear,,ShadowWarrior,,,Speer,,,,,,,,,,,,,Lança,,,, +Lava Boulder,Lava Boulder,,ShadowWarrior,,,Lavabrocken,,,,,,,,,,,,,Pedra de Lava,,,, +Uzi,Uzi,,ShadowWarrior,,,,,,,,,,,,,,,,Uzi,,,, +Evil Ninja Uzi,Evil Ninja Uzi,,ShadowWarrior,,,Böse Ninja Uzi,,,,,,,,,,,,,Uzi de Ninja Malígno,,,, +Shotgun,Shotgun,,ShadowWarrior,,,Schrotflinte,,,,,,,,,,,,,Espingarda,,,, +Meteor,Meteor,,ShadowWarrior,,,,,,,,,,,,,,,,Meteoro,,,, +Rocket,Rocket,,ShadowWarrior,,,Rakete,,,,,,,,,,,,,Foguete,,,, +Rail Gun,Rail Gun,,ShadowWarrior,,,,,,,,,,,,,,,,Canhão Elétrico,,,, +Enemy Rocket,Enemy Rocket,,ShadowWarrior,,,Feindrakete,,,,,,,,,,,,,Foguete Inimigo,,,, +Bunny Rocket,Bunny Rocket,,ShadowWarrior,,,Kaninchenrakete,,,,,,,,,,,,,Foguete de Coelho,,,, +Explosion,Explosion,,ShadowWarrior,,,,,,,,,,,,,,,,Explosão,,,, +Tank Shell,Tank Shell,,ShadowWarrior,,,Panzerprojektil,,,,,,,,,,,,,Tiro de Tanque,,,, +Nuclear Bomb,Nuclear Bomb,,ShadowWarrior,,,Atomsprengkopf,,,,,,,,,,,,,Bomba Nuclear,,,, +40mm Grenade,40mm Grenade,,ShadowWarrior,,,40mm Granate,,,,,,,,,,,,,Granada 40mm,,,, +Micro Missile,Micro Missile,,ShadowWarrior,,,Mkrorakete,,,,,,,,,,,,,Micromíssil,,,, +Sticky Bomb,Sticky Bomb,,ShadowWarrior,,,Klebebombe,,,,,,,,,,,,,Bomba Adesiva,,,, +Napalm,Napalm,,ShadowWarrior,,,,,,,,,,,,,,,,Napalm,,,, +Vomit,Vomit,,ShadowWarrior,,,Kotze,,,,,,,,,,,,,Vômito,,,, +Coolie Ghost Phlem,Coolie Ghost Phlem,,ShadowWarrior,,,Kuligeisterschleim,,,,,,,,,,,,,Catarro de Coolie Fantasma,,,, +Accursed Head,Accursed Head,,ShadowWarrior,,,Verfluchter Kopf,,,,,,,,,,,,,Cabeça Maldita,,,, +Bouncing Betty,Bouncing Betty,,ShadowWarrior,,,,,,,,,,,,,,,,Betty Saltitante,,,, +Serpent God Protector,Serpent God Protector,,ShadowWarrior,,,Schlangengottbeschützer,,,,,,,,,,,,,Protetor de Deus Serpente,,,, +Flames,Flames,,ShadowWarrior,,,Flammen,,,,,,,,,,,,,Chamas,,,, +Radiation,Radiation,,ShadowWarrior,,,Strahlung,,,,,,,,,,,,,Radiação,,,, +Caltrops,Caltrops,,ShadowWarrior,,,Krähenfüße,,,,,,,,,,,,,Estrepes,,,, +Seppuku Station,TXTS_MAP01,,,,,,,,,,,,,,,,,,Estação Seppuku,,,, +Zilla Construction,TXTS_MAP02,,,,,Zilla Bauunternehmen,,,,,,,,,,,,,Zilla Construções,,,, +Master Leep's Temple,TXTS_MAP03,,,,,Meister Leeps Tempel,,,,,,,,,,,,,Templo do Mestre Leep,,,, +Dark Woods of the Serpent,TXTS_MAP04,,,,,Dunkler Schlangenwald,,,,,,,,,,,,,Floresta Negra da Serpente,,,, +Rising Son,TXTS_MAP05,,,,,Aufstrebender Sohn,,,,,,,,,,,,,Filho Nascente,,,, +Killing Fields,TXTS_MAP06,,,,,Schlachtfelder,,,,,,,,,,,,,Campos de Execução,,,, +Hara-Kiri Harbor,TXTS_MAP07,,,,,Hara-Kiri Hafen,,,,,,,,,,,,,Porto Harakiri,,,, +Zilla's Villa,TXTS_MAP08,,,,,Zillas Villa,,,,,,,,,,,,,Mansão Zilla,,,, +Monastery,TXTS_MAP09,,,,,Kloster,,,,,,,,,,,,,Mosteiro,,,, +Raider of the Lost Wang,TXTS_MAP10,,,,,Jäger des verlorenen Wang,,,,,,,,,,,,,Caçadores do Wang Perdido,,,, +Sumo Sky Palace,TXTS_MAP11,,,,,Sumo Himmelspalast,,,,,,,,,,,,,Palácio Celestial do Sumo,,,, +Bath House,TXTS_MAP12,,,,,Badehaus,,,,,,,,,,,,,Casa de Banho,,,, +Unfriendly Skies,TXTS_MAP13,,,,,Unfreundlicher Himmel,,,,,,,,,,,,,Céus Nada Amigáveis,,,, +Crude Oil,TXTS_MAP14,,,,,Rohöl,,,,,,,,,,,,,Puro Petróleo,,,, +Coolie Mines,TXTS_MAP15,,,,,Kuli Minen,,,,,,,,,,,,,Minas dos Coolies,,,, +Subpen 7,TXTS_MAP16,,,,,Gebäude 7,,,,,,,,,,,,,Base de Submarinos 7,,,, +The Great Escape,TXTS_MAP17,,,,,Die große Flucht,,,,,,,,,,,,,A Grande Fuga,,,, +Floating Fortress,TXTS_MAP18,,,,,Schwebende Festung,,,,,,,,,,,,,Fortaleza Flutuante,,,, +Water Torture,TXTS_MAP19,,,,,Wasserfolter,,,,,,,,,,,,,Tortura d'Água,,,, +Stone Rain,TXTS_MAP20,,,,,Steinregen,,,,,,,,,,,,,Chuva de Pedra,,,, +Shanghai Shipwreck,TXTS_MAP21,,,,,Shanghai Schiffbruch,,,,,,,,,,,,,Naufrágio em Xangai,,,, +Auto Maul,TXTS_MAP22,,,,,Autoverwertung,,,,,,,,,,,,,Autopeças,,,, +Heavy Metal (DM only),TXTS_MAP23,,,,,Heavy Metal (Nur DM),,,,,,,,,,,,,Heavy Metal (somente DM),,,, +Ripper Valley (DM only),TXTS_MAP24,,,,,Rippertal (Nur DM),,,,,,,,,,,,,Vale dos Rippers (somente DM),,,, +House of Wang (DM only),TXTS_MAP25,,,,,Wangs Haus (Nur DM),,,,,,,,,,,,,Casa do Wang (somente DM),,,, +Lo Wang Rally (DM only),TXTS_MAP26,,,,,Lo Wang Rallye (Nur DM),,,,,,,,,,,,,Rally do Lo Wang (somente DM),,,, +Ruins of the Ronin (CTF),TXTS_MAP27,,,,,Ruinen der Ronin (Nur DM),,,,,,,,,,,,,Ruinas do Ronin (CTF),,,, +Killing Fields (CTF),TXTS_MAP28,,,,,Schlachtfelder (Nur DM),,,,,,,,,,,,,Campos de Execução (CTF),,,, Chinatown,TXTS_W_MAP01,Wanton Destruction,,,,,,,,,,,,,,,,,,,,, -Monastery,TXTS_W_MAP02,,,,,,,,,,,,,,,,,,,,,, -Trolley Yard,TXTS_W_MAP03,,,,,,,,,,,,,,,,,,,,,, -Restaurant,TXTS_W_MAP04,,,,,,,,,,,,,,,,,,,,,, -Skyscraper,TXTS_W_MAP05,,,,,,,,,,,,,,,,,,,,,, -Airplane,TXTS_W_MAP06,,,,,,,,,,,,,,,,,,,,,, -Military Base,TXTS_W_MAP07,,,,,,,,,,,,,,,,,,,,,, -Train,TXTS_W_MAP08,,,,,,,,,,,,,,,,,,,,,, -Auto Factory,TXTS_W_MAP09,,,,,,,,,,,,,,,,,,,,,, -Skyline,TXTS_W_MAP10,,,,,,,,,,,,,,,,,,,,,, -Redwood Forest,TXTS_W_MAP11,,,,,,,,,,,,,,,,,,,,,, -The Docks,TXTS_W_MAP12,,,,,,,,,,,,,,,,,,,,,, -Waterfight (DM only),TXTS_W_MAP13,,,,,,,,,,,,,,,,,,,,,, -Wanton DM 1 (DM only),TXTS_W_MAP14,,,,,,,,,,,,,,,,,,,,,, -Wanton DM2 (DM only),TXTS_W_MAP15,,,,,,,,,,,,,,,,,,,,,, -Wanton CTF (CTF),TXTS_W_MAP16,,,,,,,,,,,,,,,,,,,,,, -Wanton Destruction,TXTS_W_EP,,,,,,,,,,,,,,,,,,,,,, -Home Sweet Home,TXTS_T_MAP05,Twin Dragon,,,,,,,,,,,,,,,,,,,,, -City of Dispair,TXTS_T_MAP06,,,,,,,,,,,,,,,,,,,,,, -Emergency Room,TXTS_T_MAP07,,,,,,,,,,,,,,,,,,,,,, -Hide and Seek,TXTS_T_MAP08,,,,,,,,,,,,,,,,,,,,,, -Warehouse Madness,TXTS_T_MAP09,,,,,,,,,,,,,,,,,,,,,, -Weapons Research Center,TXTS_T_MAP10,,,,,,,,,,,,,,,,,,,,,, -Toxic Waste Facility,TXTS_T_MAP11,,,,,,,,,,,,,,,,,,,,,, -Silver Bullet,TXTS_T_MAP12,,,,,,,,,,,,,,,,,,,,,, -Fishing Village,TXTS_T_MAP13,,,,,,,,,,,,,,,,,,,,,, -Secret Garden,TXTS_T_MAP14,,,,,,,,,,,,,,,,,,,,,, -Hung Lo's Fortress,TXTS_T_MAP15,,,,,,,,,,,,,,,,,,,,,, -Hung Lo's Palace,TXTS_T_MAP20,,,,,,,,,,,,,,,,,,,,,, -Prison Camp (secret level),TXTS_T_MAP21,,,,,,,,,,,,,,,,,,,,,, -Ninja Training Camp (dm),TXTS_T_MAP23,,,,,,,,,,,,,,,,,,,,,, -The Morgue/mortuary (dm),TXTS_T_MAP24,,,,,,,,,,,,,,,,,,,,,, -Island Caves (dm),TXTS_T_MAP25,,,,,,,,,,,,,,,,,,,,,, -Twin Dragon,TXTS_T_TITLE,,,,,,,,,,,,,,,,,,,,,, -,Exhumed,,,,,,,,,,,,,,,,,,,,,, -Training,TXT_EX_MAP00,,,,,,,,,,,,,,,,,,,,,, +Monastery,TXTS_W_MAP02,,,,,Kloster,,,,,,,,,,,,,Mosteiro,,,, +Trolley Yard,TXTS_W_MAP03,,,,,Straßenbahndepot,,,,,,,,,,,,,Estação de Bondes,,,, +Resturant,TXTS_W_MAP04,,,,,,,,,,,,,,,,,,Restaurante,,,, +Skyscraper,TXTS_W_MAP05,,,,,Wolkenkratzer,,,,,,,,,,,,,Arranha-céu,,,, +Airplane,TXTS_W_MAP06,,,,,Flugzeug,,,,,,,,,,,,,Aeronave,,,, +Military Base,TXTS_W_MAP07,,,,,Militärbasis,,,,,,,,,,,,,Base Militar,,,, +Train,TXTS_W_MAP08,,,,,Zug,,,,,,,,,,,,,Trêm,,,, +Auto Factory,TXTS_W_MAP09,,,,,Autofabrik,,,,,,,,,,,,,Fábrica de Automóveis,,,, +Skyline,TXTS_W_MAP10,,,,,,,,,,,,,,,,,,Horizonte Urbano,,,, +Redwood Forest,TXTS_W_MAP11,,,,,Redwoodwald,,,,,,,,,,,,,Floresta de Sequóias,,,, +The Docks,TXTS_W_MAP12,,,,Přístav,Die Docks,,La Havenoj,Los Muelles,,Satamat,Les Docks,A Kikötő,Il Molo,埠頭,항구,De dokken,Doki,As Docas,,Docul,Доки,Лука +Waterfight (DM only),TXTS_W_MAP13,,,,,Wasserkampf (Nur DM),,,,,,,,,,,,,Confronto Aquático (somente DM),,,, +Wanton DM 1 (DM only),TXTS_W_MAP14,,,,,Wanton DM 1 (Nur DM),,,,,,,,,,,,,Matança Total 1 (somente DM),,,, +Wanton DM2 (DM only),TXTS_W_MAP15,,,,,Wanton DM2 (Nur DM),,,,,,,,,,,,,Matança Total 2 (somente DM),,,, +Wanton CTF (CTF),TXTS_W_MAP16,,,,,,,,,,,,,,,,,,CTF Total (CTF),,,, +Wanton Destruction,TXTS_W_EP,,,,,Mutwillige Zerstörung,,,,,,,,,,,,,Destruição Total,,,, +Home Sweet Home,TXTS_T_MAP05,Twin Dragon,,,,"Trautes Heim, Glück allein",,,,,,,,,,,,,Lar Doce Lar,,,, +City of Dispair,TXTS_T_MAP06,,,,,Stadt der Verzweiflung,,,,,,,,,,,,,Cidade do Desespero,,,, +Emergency Room,TXTS_T_MAP07,,,,,Notaufnahme,,,,,,,,,,,,,Sala de Emergência,,,, +Hide and Seek,TXTS_T_MAP08,,,,,Versteckspiel,,,,,,,,,,,,,Esconde-Esconde,,,, +Warehouse Madness,TXTS_T_MAP09,,,,,Lagerhauswahnsinn,,,,,,,,,,,,,Insanidade no Depósito,,,, +Weapons Research Center,TXTS_T_MAP10,,,,,Waffenforschung,,,,,,,,,,,,,Centro de Pesquisa de Armamentos,,,, +Toxic Waste Facility,TXTS_T_MAP11,,,,,Giftabfallbeseitigung,,,,,,,,,,,,,Indústria Tóxica,,,, +Silver Bullet,TXTS_T_MAP12,,,,,Silberkugel,,,,,,,,,,,,,Bala de Prata,,,, +Fishing Village,TXTS_T_MAP13,,,,,Fischerdorf,,,,,,,,,,,,,Vila de Pescadores,,,, +Secret Garden,TXTS_T_MAP14,,,,,Geheimer Garten,,,,,,,,,,,,,Jardim Secreto,,,, +Hung Lo's Fortress,TXTS_T_MAP15,,,,,Hung Los Festung,,,,,,,,,,,,,Fortaleza de Hung Lo,,,, +Hung Lo's Palace,TXTS_T_MAP20,,,,,Hung Los Palast,,,,,,,,,,,,,Palácio de Hung Lo,,,, +Prison Camp,TXTS_T_MAP21,,,,,Gefangenenlager,,,,,,,,,,,,,Campo de Prisioneiros,,,, +Ninja Training Camp (DM),TXTS_T_MAP23,,,,,,,,,,,,,,,,,,Campo de Treinamento Ninja (DM),,,, +The Morgue/Mortuary (DM),TXTS_T_MAP24,,,,,Die Leichenhalle (DM),,,,,,,,,,,,,Necrotério (DM),,,, +Island Caves (DM),TXTS_T_MAP25,,,,,Inselhöhlen (DM),,,,,,,,,,,,,Cavernas da Ilha (DM),,,, +Twin Dragon,TXTS_T_TITLE,,,,,Zwillingsdrache,,,,,,,,,,,,,Dragão Gêmeo,,,, +,,Exhumed,,,,,,,,,,,,,,,,,,,,, +Training,TXT_EX_MAP00,,,,,,,,,,,,,,,,,,Treinamento,,,, Abu Simbel,TXT_EX_MAP01,,,,,,,,,,,,,,,,,,,,,, Dendur,TXT_EX_MAP02,,,,,,,,,,,,,,,,,,,,,, -Kalabash,TXT_EX_MAP03,,,,,,,,,,,,,,,,,,,,,, +Kalabsh,TXT_EX_MAP03,,,,,,,,,,,,,,,,,,,,,, El Subua,TXT_EX_MAP04,,,,,,,,,,,,,,,,,,,,,, El Derr,TXT_EX_MAP05,,,,,,,,,,,,,,,,,,,,,, -Abu Churab,TXT_EX_MAP06,,,,,,,,,,,,,,,,,,,,,, -Philae,TXT_EX_MAP07,,,,,,,,,,,,,,,,,,,,,, -El Kab,TXT_EX_MAP08,,,,,,,,,,,,,,,,,,,,,, -Aswan,TXT_EX_MAP09,,,,,,,,,,,,,,,,,,,,,, -Set,TXT_EX_MAP10,,,,,,,,,,,,,,,,,,,,,, -Qubbet el Kawa,TXT_EX_MAP11,,,,,,,,,,,,,,,,,,,,,, -Abydos,TXT_EX_MAP12,,,,,,,,,,,,,,,,,,,,,, +Abu Ghurab,TXT_EX_MAP06,,,,,,,,,,,,,,,,,,,,,, +Philae,TXT_EX_MAP07,,,,,,,,,,,,,,,,,,Filas,,,, +El Kab,TXT_EX_MAP08,,,,,,,,,,,,,,,,,,Elcabe,,,, +Aswan,TXT_EX_MAP09,,,,,,,,,,,,,,,,,,Assuã,,,, +Set Boss,TXT_EX_MAP10,,,,,,,,,,,,,,,,,,,,,, +Qubbet el Hawa,TXT_EX_MAP11,,,,,,,,,,,,,,,,,,,,,, +Abydos,TXT_EX_MAP12,,,,,,,,,,,,,,,,,,Abidos,,,, Edufu,TXT_EX_MAP13,,,,,,,,,,,,,,,,,,,,,, -West Bank,TXT_EX_MAP14,,,,,,,,,,,,,,,,,,,,,, +West Bank,TXT_EX_MAP14,,,,,,,,,,,,,,,,,,Margem Ocidental,,,, Luxor,TXT_EX_MAP15,,,,,,,,,,,,,,,,,,,,,, -Karnak,TXT_EX_MAP16,,,,,,,,,,,,,,,,,,,,,, -Saqqara,TXT_EX_MAP17,,,,,,,,,,,,,,,,,,,,,, -Mitrrahn,TXT_EX_MAP18,,,,,,,,,,,,,,,,,,,,,, -Kilmaatikahn Boss,TXT_EX_MAP19,,,,,,,,,,,,,,,,,,,,,, -Alien Mothership,TXT_EX_MAP20,,,,,,,,,,,,,,,,,,,,,, -Level 21,TXT_EX_MAP21,No names exist for the MP levels,,,,,,,,,,,,,,,,,,,,, -Level 22,TXT_EX_MAP22,,,,,,,,,,,,,,,,,,,,,, -Level 23,TXT_EX_MAP23,,,,,,,,,,,,,,,,,,,,,, -Level 24,TXT_EX_MAP24,,,,,,,,,,,,,,,,,,,,,, -Level 25,TXT_EX_MAP25,,,,,,,,,,,,,,,,,,,,,, -Level 26,TXT_EX_MAP26,,,,,,,,,,,,,,,,,,,,,, -Level 27,TXT_EX_MAP27,,,,,,,,,,,,,,,,,,,,,, -Level 28,TXT_EX_MAP28,,,,,,,,,,,,,,,,,,,,,, -Level 29,TXT_EX_MAP29,,,,,,,,,,,,,,,,,,,,,, -Level 30,TXT_EX_MAP30,,,,,,,,,,,,,,,,,,,,,, -Level 31,TXT_EX_MAP31,,,,,,,,,,,,,,,,,,,,,, -Level 32,TXT_EX_MAP32,,,,,,,,,,,,,,,,,,,,,, +Karnak,TXT_EX_MAP16,,,,,,,,,,,,,,,,,,Carnaque,,,, +Saqqara,TXT_EX_MAP17,,,,,,,,,,,,,,,,,,Sacara,,,, +Mittrahn,TXT_EX_MAP18,,,,,,,,,,,,,,,,,,,,,, +Kilmaatikahn Boss,TXT_EX_MAP19,,,,,,,,,,,,,,,,,,Kilmaatikahn,,,, +Alien Mothership,TXT_EX_MAP20,,,,,Außerirdisches Mutterschiff,,,,,,,,,,,,,Nave-Mãe Alienígena,,,, +Level 21,TXT_EX_MAP21,No names exist for the MP levels,,,,,,,,,,,,,,,,,Fase 21,,,, +Level 22,TXT_EX_MAP22,,,,,,,,,,,,,,,,,,Fase 22,,,, +Level 23,TXT_EX_MAP23,,,,,,,,,,,,,,,,,,Fase 23,,,, +Level 24,TXT_EX_MAP24,,,,,,,,,,,,,,,,,,Fase 24,,,, +Level 25,TXT_EX_MAP25,,,,,,,,,,,,,,,,,,Fase 25,,,, +Level 26,TXT_EX_MAP26,,,,,,,,,,,,,,,,,,Fase 26,,,, +Level 27,TXT_EX_MAP27,,,,,,,,,,,,,,,,,,Fase 27,,,, +Level 28,TXT_EX_MAP28,,,,,,,,,,,,,,,,,,Fase 28,,,, +Level 29,TXT_EX_MAP29,,,,,,,,,,,,,,,,,,Fase 29,,,, +Level 30,TXT_EX_MAP30,,,,,,,,,,,,,,,,,,Fase 30,,,, +Level 31,TXT_EX_MAP31,,,,,,,,,,,,,,,,,,Fase 31,,,, +Level 32,TXT_EX_MAP32,,,,,,,,,,,,,,,,,,Fase 32,,,, ,,,,,,,,,,,,,,,,,,,,,,, -incoming Message,TXT_EX_LASTLEVEL1,,,,,,,,,,,,,,,,,,,,,, +Incoming Message,TXT_EX_LASTLEVEL1,,,,,Eingehende Nachricht,,,,,,,,,,,,,Recebendo Mensagem,,,, "Our latest scans show that the alien craft is powering up, apparently @@ -2175,7 +1528,32 @@ big hole in our fine planet. A squad is trying to dismantle it right now, but no luck so far, and time is running out. -",TXT_EX_LASTLEVEL2,,,,,,,,,,,,,,,,,,,,,, +",TXT_EX_LASTLEVEL2,,,,,"Unsere neuesten Scans zeigen, +dass das außerirdische Schiff +sufsteigt, anscheinend um die +Erde zu verlassen. +Die schlechte Nachricht ist, +dass sie anscheinend ein Gerät +zurückgelassen haben, und alles +deutet darauf hin, dass es ein +großes Loch in unseren schönen +Planeten sprengen wird. +Ein Trupp versucht gerade, es +abzubauen, hatte aber bisher +keinen Erfolg, und die Zeit läuft +uns davon.",,,,,,,,,,,,," +Nosso últimos rastreio mostra +que a nave alienígena está +carregando sua energia, pelo visto +para tentar partir. As más notícias +são que eles deixaram para trás +um dispositivo e todas as evidências +mostram que isso vai detonar um +grande buraco no nosso belo +planeta. Um esquadrão está +tentando desmontá-lo neste +momento, mas nenhum progresso +até agora e o tempo está se esgotando.",,,, "Get aboard that craft now before it leaves, then find and shoot all the energy @@ -2185,7 +1563,23 @@ take out the control panels and the central power source. This is the big one buddy, best of luck... For all of us. -",TXT_EX_LASTLEVEL3,,,,,,,,,,,,,,,,,,,,,, +",TXT_EX_LASTLEVEL3,,,,,"Begib dich an Bord dieses +Schiffes bevor es startet und +zerstöre alle Energietürme um +in den Kontrollraum einzudringen. +Dort musst du die Schalttafeln und +die zentrale Energiequelle ausschalten. +Das ist der letzte Kampf, viel Glück... +... für uns alle.",,,,,,,,,,,,,"Entre agora naquela nave +antes que ela parta. Depois, +ache e destrua todas as torres +de energia para poder acessar +a sala de controle. Lá você vai +precisar destruir os painéis de +controle e a fonte de energia +central. Essa é a grande missão, +meu amigo. Boa sorte... Para +todos nós.",,,, "The ancient Egyptian city of Karnak has been seized by unknown powers, and great @@ -2227,7 +1621,7 @@ into the heart of karnak... Home to the celebrated burial crypt of the great King Ramses. -",TXT_EX_INTRO,Intro movie subtitles,,,,,,,,,,,,,,,,,,,,, +",TXT_EX_INTRO,Do not translate yet,,,,,,,,,,,,,,,,,,,,, "An evil force known as the Kilmaat has besieged the sanctity of my palace and @@ -2244,15 +1638,58 @@ chaos will prevail. I am being torn between worlds and this insidious experiment must be stopped. -",TXT_EX_CINEMA1,Level 1,,,,,,,,,,,,,,,,,,,,, +",TXT_EX_CINEMA1,Level 1,,,,"Eine böse Kraft, die als Kilmaat +bekannt ist, hat die Heiligkeit +meines Palastes belagert und +zieht an den Wurzeln meiner +Existenz. Diese Kräfte wollen +mich versklaven, indem sie meine +erhaltene Leiche wiederbeleben. +Ich habe meine Leiche mit einem +genetischen Schlüssel geschützt. +Wenn du erfolglos bleibst, kann +ich die Zivilisation nicht schützen, +und es wird Chaos herrschen. +Ich bin zwischen den Welten +hin und her gerissen und +dieses heimtückische +Experiment muss gestoppt +werden. +",,,,,,,,,,,,," +Uma força maligna conhecida +como os Kilmaat invadiram a +santidade de meu palácio e +ameaçam a minha existência. +Eles desejam me escravizar ao +reanimar meu corpo preservado. +Eu protegi meu corpo com uma +chave genética. Se você falhar +eu não poderei proteger a +civilização e o caos dominará. +Estou sendo rasgado entre +mundos diferentes e este +experimento macabro precisa +ter um fim.",,,, "I have hidden a mystical -gauntlet at el kab that will +gauntlet at El Kab that will channel my energy through your hands. Find the -gauntlet and cross the aswan -high dam to defeat the evil +gauntlet and cross the Aswan +High Dam to defeat the evil beast set. -",TXT_EX_CINEMA2,After Level 4,,,,,,,,,,,,,,,,,,,,, +",TXT_EX_CINEMA2,After Level 4,,,,"Ich habe in El Kab einen +mystischen Handschuh +versteckt, der meine Energie +durch deine Hände leiten wird. +Finde den Handschuh und +überquere den Assuan-Staudamm, +um das böse Biest zu besiegen.",,,,,,,,,,,,,"Eu escondi uma braçadeira +mística em Elcabe que +canalizará minha energia +para suas mãos. Encontre-a +e atravesse a Represa de +Assuã para derrotar a +besta malígna Set.",,,, "You've made it halfway toward fullfilling your destiny. The Kilmaat are growing @@ -2260,14 +1697,34 @@ restless with your progress. Seek out a temple in this citadel where I will provide more information. -",TXT_EX_CINEMA3,After Level 10,,,,,,,,,,,,,,,,,,,,, +",TXT_EX_CINEMA3,After Level 10,,,,"Du den halben Weg geschafft, +um dein Schicksal zu erfüllen. +Die Kilmaat werden durch deine +Aktionen unruhig. +Suche in dieser Zitadelle einen +Tempel auf, in dem ich weitere +Informationen geben werde.",,,,,,,,,,,,,"Você já está na metade do +caminho para cumprir o seu +destino. Os Kilmaat estão +ficando inquietos com o seu +progresso. Encontre um +templo nesta cidadela onde +darei mais informações.",,,, "Set was a formidable foe. No mortal has even conquered their own fear, much less entered mortal battle and taken his life. -",TXT_EX_CINEMA4,Before Level 11,,,,,,,,,,,,,,,,,,,,, -"the Kilmaat race has +",TXT_EX_CINEMA4,Before Level 11,,,,"Set war ein beeindruckender Feind. +Kein Sterblicher hat je seine +eigene Angst besiegt, geschweige +denn den tödlichen Kampf +aufgenommen und sein Leben +genommen.",,,,,,,,,,,,,"Set foi um inimigo formidável. +Nenhum mortal jamais conquistou +o próprio medo, tampouco entrou +em combate mortal e tirou a sua vida.",,,, +"The Kilmaat race has continued their monsterous animal-human experiments in an effort to solve the key of @@ -2283,7 +1740,35 @@ and insect intent on slaying you. Prepare yourself for battle as she will be waiting for you at the Luxor temple. -",TXT_EX_CINEMA5,In Level 11,,,,,,,,,,,,,,,,,,,,, +",TXT_EX_CINEMA5,In Level 11,,,,"Die Kilmaat-Rasse hat ihre +monströsen Tier-Mensch- +Experimente fortgesetzt, +um den Schlüssel zur Animation +meiner Leiche zu lösen. +Der Sieg gegen Set hat dich +nicht so sehr gebremst, wie sie +es geplant hatten. Sie berauben +aktiv eine Sklavin ihres Lebens, +um einen weiteren monströsen +Greuel zu erschaffen, der +Mensch und Insekt kombiniert +und darauf abzielt, dich zu töten. +Bereite dich auf den Kampf vor, +denn sie wird im Luxor-Tempel +auf dich warten.",,,,,,,,,,,,,"A raça Kilmaat continuou com +seus experimentos monstruosos +com seres humanos e animais +para tentar solucionar a chave +para reanimar o meu corpo. +A vitória contra Set não te +atrasou tanto o quanto eles +planejavam. Eles estão tirando +a vida de uma garota escrava +para criar mais outra abominação, +combinando humano com inseto +para te destruir. Prepare-se para +a batalha pois ela estará te +esperando no Templo de Luxor.",,,, "You've done well to defeat Selkis. You have distracted the Kilmaat with your @@ -2296,7 +1781,30 @@ against you. Arrogance is her weakness, and if you can defeat Kilmaatikhan, the battle will be won. -",TXT_EX_CINEMA6,After Level 15,,,,,,,,,,,,,,,,,,,,, +",TXT_EX_CINEMA6,After Level 15,,,,"Es war gute Arbeit, Selkis zu +besiegen. Du hast die Kilmaat +mit deiner Anwesenheit +abgelenkt und sie haben die +Animation meiner Leiche +vorübergehend aufgegeben. +Die außerirdische Königin +Kilmaatikhan plant eine +persönliche Rache gegen dich. +Arroganz ist ihre Schwäche, +und wenn du Kilmaatikhan +besiegen kannst, wird +der Kampf gewonnen.",,,,,,,,,,,,,"Você fez bem em derrotar +Selkis. Conseguiu distrair os +Kilmaat com a sua presença +e eles abandonaram +temporariamente a reanimação +de meu corpo. A rainha +alienígena Kilmaatikhan tem +uma desejo pessoal de +vingança contra você. +Arrogância é fraqueza dela +e se você conseguir derrotá-la, +a batalha será vencida.",,,, "The Kilmaat have been destroyed. Unfortunately, your recklessness has @@ -2304,7 +1812,17 @@ destroyed the Earth and all of its inhabitants. All that remains is a smoldering hunk of rock. -",TXT_EX_CINEMA7,Bad ending,,,,,,,,,,,,,,,,,,,,, +",TXT_EX_CINEMA7,Bad ending,,,,"Die Kilmaat sind vernichtet. +Dummerweise hat deine +Sorglosigkeit zur Zerstörung +der Erde und all ihrer +Bewohner geführt. +Alles, was bleibt ist ein +kokelnder Felsbrocken.",,,,,,,,,,,,,"Os Kilmaat foram destruídos. +Infelizmente, o seu descuido +destruiu a Terra e todos os seus +habitantes. Tudo o que resta é +um pedaço de pedra fumegante.",,,, "The Kilmaat have been defeated and you single handedly saved the Earth @@ -2314,38 +1832,54 @@ from destruction. Your bravery and heroism are legendary. -",TXT_EX_CINEMA8,After Level 20,,,,,,,,,,,,,,,,,,,,, +",TXT_EX_CINEMA8,After Level 20,,,,"Die Klimaat sind geschlagen +und du alleine hast die +Erde vor der Zerstörung +berwahrt. + + + +Deine Tapferkeit und +Heldenmut sind legendär.",,,,,,,,,,,,,"Os Kilmaat foram destruídos +e você conseguiu por conta +própria salvar a Terra da +destruição. + + + +Sua bravura e seu heroísmo +são lendários.",,,, "LOBOTOMY SOFTWARE, INC.,",TXT_EX_COPYRIGHT1,,,,,,,,,,,,,,,,,,,,,, "3D ENGINE BY 3D REALMS,",TXT_EX_COPYRIGHT2,,,,,,,,,,,,,,,,,,,,,, -Life Blood,TXT_EX_PICKUP1,,,,,,,,,,,,,,,,,,,,,, -Life,TXT_EX_PICKUP2,,,,,,,,,,,,,,,,,,,,,, -Venom,TXT_EX_PICKUP3,,,,,,,,,,,,,,,,,,,,,, -You're Losing Your Grip,TXT_EX_PICKUP4,,,,,,,,,,,,,,,,,,,,,, -Full Life,TXT_EX_PICKUP5,,,,,,,,,,,,,,,,,,,,,, -Invincibility,TXT_EX_PICKUP6,,,,,,,,,,,,,,,,,,,,,, -Invisibility,TXT_EX_PICKUP7,,,,,,,,,,,,,,,,,,,,,, -Torch,TXT_EX_PICKUP8,,,,,,,,,,,,,,,,,,,,,, -Sobek Mask,TXT_EX_PICKUP9,,,,,,,,,,,,,,,,,,,,,, -Increased Weapon Power!,TXT_EX_PICKUP10,,,,,,,,,,,,,,,,,,,,,, -The Map!,TXT_EX_PICKUP11,,,,,,,,,,,,,,,,,,,,,, -An Extra Life!,TXT_EX_PICKUP12,,,,,,,,,,,,,,,,,,,,,, +Life Blood,TXT_EX_PICKUP1,,,,,Lebensblut,,,,,,,,,,,,,Sangue da Vida,,,, +Life,TXT_EX_PICKUP2,,,,,Leben,,,,,,,,,,,,,Vida,,,, +Venom,TXT_EX_PICKUP3,,,,,Gift,,,,,,,,,,,,,Veneno,,,, +You're Losing Your Grip,TXT_EX_PICKUP4,,,,,Du verlierst den Verstand,,,,,,,,,,,,,Você Está Perdendo o Controle,,,, +Full Life,TXT_EX_PICKUP5,,,,,Volles Leben,,,,,,,,,,,,,Vida Cheia,,,, +Invincibility,TXT_EX_PICKUP6,,,,,Unverwundbarkeit,,,,,,,,,,,,,Invencibilidade,,,, +Invisibility,TXT_EX_PICKUP7,,,,,Unsichtbarkeit,,,,,,,,,,,,,Invisibilidade,,,, +Torch,TXT_EX_PICKUP8,,,,,Fackel,,,,,,,,,,,,,Tocha,,,, +Sobek Mask,TXT_EX_PICKUP9,,,,,Sobekmaske,,,,,,,,,,,,,Máscara de Sobeque,,,, +Increased Weapon Power!,TXT_EX_PICKUP10,,,,,Erhöhe Waffenkraft,,,,,,,,,,,,,Potência de Arma Aumentada!,,,, +The Map!,TXT_EX_PICKUP11,,,,,Die Karte!,,,,,,,,,,,,,O Mapa!,,,, +An Extra Life!,TXT_EX_PICKUP12,,,,,Ein Extraleben,,,,,,,,,,,,,Uma Vida Extra!,,,, .357 Magnum!,TXT_EX_PICKUP13,,,,,,,,,,,,,,,,,,,,,, -Grenade,TXT_EX_PICKUP14,,,,,,,,,,,,,,,,,,,,,, +Grenade,TXT_EX_PICKUP14,,,,,Granate,,,,,,,,,,,,,Granada,,,, M-60,TXT_EX_PICKUP15,,,,,,,,,,,,,,,,,,,,,, -Flame Thrower!,TXT_EX_PICKUP16,,,,,,,,,,,,,,,,,,,,,, -Cobra Staff!,TXT_EX_PICKUP17,,,,,,,,,,,,,,,,,,,,,, -The Eye Of Rah Gauntlet!,TXT_EX_PICKUP18,,,,,,,,,,,,,,,,,,,,,, -Speed Loader,TXT_EX_PICKUP19,,,,,,,,,,,,,,,,,,,,,, -Ammo,TXT_EX_PICKUP20,,,,,,,,,,,,,,,,,,,,,, -Fuel,TXT_EX_PICKUP21,,,,,,,,,,,,,,,,,,,,,, -Cobra!,TXT_EX_PICKUP22,,,,,,,,,,,,,,,,,,,,,, -Raw Energy,TXT_EX_PICKUP23,,,,,,,,,,,,,,,,,,,,,, -Power Key,TXT_EX_PICKUP24,,,,,,,,,,,,,,,,,,,,,, -Time Key,TXT_EX_PICKUP25,,,,,,,,,,,,,,,,,,,,,, -War Key,TXT_EX_PICKUP26,,,,,,,,,,,,,,,,,,,,,, -Earth Key,TXT_EX_PICKUP27,,,,,,,,,,,,,,,,,,,,,, -Magic,TXT_EX_PICKUP28,,,,,,,,,,,,,,,,,,,,,, -Location Preserved,TXT_EX_PICKUP29,,,,,,,,,,,,,,,,,,,,,, +Flame Thrower!,TXT_EX_PICKUP16,,,,,Flammenwerfer,,,,,,,,,,,,,Lança-chamas!,,,, +Cobra Staff!,TXT_EX_PICKUP17,,,,,Kobrastab,,,,,,,,,,,,,Cajado da Cobra!,,,, +The Eye Of Ra Gauntlet!,TXT_EX_PICKUP18,,,,,Handschuh des Auges des Ra,,,,,,,,,,,,,Braçadeira do Olho de Rá!,,,, +Speed Loader,TXT_EX_PICKUP19,,,,,Schnellader,,,,,,,,,,,,,Carregador Automático,,,, +Ammo,TXT_EX_PICKUP20,,,,,Munition,,,,,,,,,,,,,Munição,,,, +Fuel,TXT_EX_PICKUP21,,,,,Benzin,,,,,,,,,,,,,Combustível,,,, +Cobra!,TXT_EX_PICKUP22,,,,,Kobra!,,,,,,,,,,,,,,,,, +Raw Energy,TXT_EX_PICKUP23,,,,,Rohenergie,,,,,,,,,,,,,Energia Pura,,,, +Power Key,TXT_EX_PICKUP24,,,,,Energieschlüssel,,,,,,,,,,,,,Chave do Poder,,,, +Time Key,TXT_EX_PICKUP25,,,,,Zeitschlüssel,,,,,,,,,,,,,Chave do Tempo,,,, +War Key,TXT_EX_PICKUP26,,,,,Kriegsschlüssel,,,,,,,,,,,,,Chave da Guerra,,,, +Earth Key,TXT_EX_PICKUP27,,,,,Erdschlüssel,,,,,,,,,,,,,Chave da Terra,,,, +Magic,TXT_EX_PICKUP28,,,,,Msgie,,,,,,,,,,,,,Magia,,,, +Location Preserved,TXT_EX_PICKUP29,,,,,Position gespeichert,,,,,,,,,,,,,Local Preservado,,,, "Pick up a copy of Exhumed today to continue the adventure! More levels, nastier creatures @@ -2354,26 +1888,35 @@ Kilmaat await you in the full version of the game. Twenty levels, plus 12 network play levels can be yours! -",TXT_EX_SHAREWARE,,,,,,,,,,,,,,,,,,,,,, -"Hi Sweetie, I love you",TXT_EX_SWEETIE,,,,,,,,,,,,,,,,,,,,,, -Flashes toggled,TXT_EX_FLASHES,,,,,,,,,,,,,,,,,,,,,, -Full Map,TXT_EX_FULLMAP,,,,,,,,,,,,,,,,,,,,,, -Slip mode ON,TXT_EX_SLIPON,,,,,,,,,,,,,,,,,,,,,, -Slip mode OFF,TXT_EX_SLIPOFF,,,,,,,,,,,,,,,,,,,,,, -Snake Cam Enabled,TXT_EX_SNAKEON,,,,,,,,,,,,,,,,,,,,,, -Snake Cam Disabled,TXT_EX_SNAKEOFF,,,,,,,,,,,,,,,,,,,,,, -Hand,TXT_EX_USEINV1,,,,,,,,,,,,,,,,,,,,,, -Eye,TXT_EX_USEINV2,,,,,,,,,,,,,,,,,,,,,, -Mask,TXT_EX_USEINV3,,,,,,,,,,,,,,,,,,,,,, -Heart,TXT_EX_USEINV4,,,,,,,,,,,,,,,,,,,,,, -Torch,TXT_EX_USEINV5,,,,,,,,,,,,,,,,,,,,,, -Scarab,TXT_EX_USEINV6,,,,,,,,,,,,,,,,,,,,,, -Deity mode ON for player,TXT_EX_DEITYON,,,,,,,,,,,,,,,,,,,,,, -Deity mode OFF for player,TXT_EX_DEITYOFF,,,,,,,,,,,,,,,,,,,,,, -All weapons loaded for player,TXT_EX_WEAPONS,,,,,,,,,,,,,,,,,,,,,, -All keys loaded for player,TXT_EX_KEYS,,,,,,,,,,,,,,,,,,,,,, -All items loaded for player,TXT_EX_ITEMS,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,,,, -,USE_GENERIC_FONT,This is not a text to be translated but an engine switch for complex languages.,,,,,,,,,,,,,1,1,,,,,,, -,REQUIRED_CHARACTERS,This should list all uppercase characters that are REQUIRED for proper language display. If it is acceptable that accents get omitted a character should NOT be listed here!,,,ÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ,ÄÖÜẞ,ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩς,ĈĜĤĴŜŬ,ÁÉÍÓÚÑÜ,,ÄÖ,ÀÂÇÉÈÊËÎÏÔŒÙÛŸ,ÁÉÍÓÖÚÜŐŰ,ÀÈÉÌÒÙ,,,"ÉËÖ -",ĄĆĘŁŃÓŚŹŻ,ÁÉÍÓÚÀÃÕÂÊÔÇ,,ĂÎȚÂȘ,АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ,АБВГДЂЕЖЗИЈКЛЉМНЊОПРСТЋУФХЦЧЏШ \ No newline at end of file +",TXT_EX_SHAREWARE,,,,,"Besorge dir noch heute die +Vollversion um weiterzuspielen! +Mehr Level, fiesere Kreaturen und +Untaten der Kilmaat warten auf +dich dort. +Zwanzig Level plus 12 +Multispielerlevel warten auf dich!",,,,,,,,,,,,,"Adquira uma cópia de Exhumed +hoje mesmo para continuar +a aventura! Mais fases, criaturas +mais terríveis ainda e os atos +cruéis dos Kilmaat te esperam +na versão completa do jogo. +Vinte fases serão suas, além de +mais 12 fases para jogar em rede!",,,, +"Hi Sweetie, I love you",TXT_EX_SWEETIE,,,,,"Hallo, ich liebe dich",,,,,,,,,,,,,"Oi querida, te amo",,,, +Flashes toggled,TXT_EX_FLASHES,,,,,Blitze umgeschaltet,,,,,,,,,,,,,Flashes ligados,,,, +Full Map,TXT_EX_FULLMAP,,,,,Volle Karte,,,,,,,,,,,,,Mapa Completo,,,, +Slip mode ON,TXT_EX_SLIPON,,,,,Schlüpfmodus an,,,,,,,,,,,,,Modo escorregadio ATIVADO,,,, +Slip mode OFF,TXT_EX_SLIPOFF,,,,,Schlüpfmodus aus,,,,,,,,,,,,,Modo escorregadio DESATIVADO,,,, +Snake Cam Enabled,TXT_EX_SNAKEON,,,,,Schlangenkamera an,,,,,,,,,,,,,Câmera da Cobra Ativada,,,, +Snake Cam Disabled,TXT_EX_SNAKEOFF,,,,,Schlangenkamera aus,,,,,,,,,,,,,Câmera da Cobra Desativada,,,, +Hand,TXT_EX_USEINV1,,,,,Handschuh des Auges des Ra,,,,,,,,,,,,,Mão,,,, +Eye,TXT_EX_USEINV2,,,,,,,,,,,,,,,,,,Olho,,,, +Mask,TXT_EX_USEINV3,,,,,Auge,,,,,,,,,,,,,Máscara,,,, +Heart,TXT_EX_USEINV4,,,,,Herz,,,,,,,,,,,,,Coração,,,, +Torch,TXT_EX_USEINV5,,,,,Fackel,,,,,,,,,,,,,Tocha,,,, +Scarab,TXT_EX_USEINV6,,,,,Skarabäus,,,,,,,,,,,,,Escaravelho,,,, +Deity mode ON for player,TXT_EX_DEITYON,,,,,Gottmodus AN,,,,,,,,,,,,,Modo divino LIGADO para jogador,,,, +Deity mode OFF for player,TXT_EX_DEITYOFF,,,,,Gottmodus AUS,,,,,,,,,,,,,Modo divino DESLIGADO para jogador,,,, +All weapons loaded for player,TXT_EX_WEAPONS,,,,,Alle Waffen geladen,,,,,,,,,,,,,Todas as armas carregadas para jogador,,,, +All keys loaded for player,TXT_EX_KEYS,,,,,Alle Schlüssel geladen,,,,,,,,,,,,,Todas as chaves dadas para jogador,,,, +All items loaded for player,TXT_EX_ITEMS,,,,,Alle Gegenstände geladen,,,,,,,,,,,,,Todos os itens dados para jogador,,,, \ No newline at end of file diff --git a/wadsrc/static/engine/menudef.txt b/wadsrc/static/menudef.txt similarity index 75% rename from wadsrc/static/engine/menudef.txt rename to wadsrc/static/menudef.txt index 99983deb8..6a62b91a3 100644 --- a/wadsrc/static/engine/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -6,64 +6,65 @@ LISTMENU "MainMenu" { - ScriptId 0 - class "$.MainMenu" + Size 320, 200 ifgame(Duke, Nam, WW2GI, Redneck, RedneckRides) { - position 160, 55, 115 - centermenu + position 160, 55 + Linespacing 20 animatedtransition - NativeTextItem "$MNU_NEWGAME", "n", "EpisodeMenu" - //NativeTextItem "$MNU_NEWGAME", "m", "MultiMenu" // In EDuke this replaces "New Game" when in networking mode. Kept here as a reminder. - NativeTextItem "$MNU_LOADGAME", "l", "LoadGameMenu" - NativeTextItem "$MNU_OPTIONS", "o", "OptionsMenu" - NativeTextItem "$MNU_HELP", "h", "HelpMenu" - NativeTextItem "$MNU_CREDITS", "c", "CreditsMenu" - NativeTextItem "$MNU_QUITGAME", "q", "QuitMenu" + DukeLogo + DukeTextItem "$MNU_NEWGAME", "n", "EpisodeMenu" + //DukeTextItem "$MNU_NEWGAME", "m", "MultiMenu" // In EDuke this replaces "New Game" when in networking mode. Kept here as a reminder. + DukeTextItem "$MNU_LOADGAME", "l", "LoadGameMenu" + DukeTextItem "$MNU_OPTIONS", "o", "OptionsMenu" + DukeTextItem "$MNU_HELP", "h", "HelpMenu" + DukeTextItem "$MNU_CREDITS", "c", "CreditsMenu" + DukeTextItem "$MNU_QUITGAME", "q", "QuitMenu" } ifgame(Blood) { - position 160, 45, 150 - caption "Blood" - centermenu + CaptionItem "Blood" + position 160, 45 Linespacing 20 - NativeTextItem "$MNU_NEWGAME", "n", "EpisodeMenu" - NativeTextItem "$MNU_MULTIPLAYER", "m", "MultiMenu" - NativeTextItem "$MNU_OPTIONS", "o", "OptionsMenu" - NativeTextItem "$MNU_LOADGAME", "l", "LoadGameMenu" - NativeTextItem "$MNU_HELP", "h", "HelpMenu" - NativeTextItem "$MNU_CREDITS", "c", "CreditsMenu" - NativeTextItem "$MNU_QUITGAME", "q", "QuitMenu" + BloodTextItem "$MNU_NEWGAME", "n", "EpisodeMenu" + BloodTextItem "$MNU_MULTIPLAYER", "m", "MultiMenu" + BloodTextItem "$MNU_OPTIONS", "o", "OptionsMenu" + BloodTextItem "$MNU_LOADGAME", "l", "LoadGameMenu" + BloodTextItem "$MNU_HELP", "h", "HelpMenu" + BloodTextItem "$MNU_CREDITS", "c", "CreditsMenu" + BloodTextItem "$MNU_QUITGAME", "q", "QuitMenu" + BloodDripDrawer } ifgame(ShadowWarrior) { Position 55, 32 Linespacing 17 - NativeTextItem "$MNU_NEWGAME", "n", "EpisodeMenu" - NativeTextItem "$MNU_LOADGAME", "l", "LoadGameMenu" - NativeTextItem "$MNU_SAVEGAME", "s", "SaveGameMenu" - NativeTextItem "$MNU_OPTIONS", "o", "OptionsMenu" - //NativeTextItem "$MNU_COOLSTUFF", "h", "HelpMenu" // Perfectly useless retro ads. :D - ifshareware(false) + SWLogo + SWTextItem "$MNU_NEWGAME", "n", "EpisodeMenu" + SWTextItem "$MNU_LOADGAME", "l", "LoadGameMenu" + SWTextItem "$MNU_SAVEGAME", "s", "none" + SWTextItem "$MNU_OPTIONS", "o", "OptionsMenu" + ifnotgame (shareware) { - NativeTextItem "$MNU_CREDITS", "c", "CreditsMenu" + SWTextItem "$MNU_CREDITS", "c", "CreditsMenu" } else { - NativeTextItem "$MNU_HOWTOORDER", "h", "CreditsMenu" + SWTextItem "$MNU_HOWTOORDER", "h", "CreditsMenu" } - NativeTextItem "$MNU_QUITGAME", "q", "QuitMenu" + SWTextItem "$MNU_QUITGAME", "q", "QuitMenu" } ifgame(Exhumed) { + class ExhumedMainMenu Position 160, 65 - centermenu linespacing 22 - NativeTextItem "3460", "n", "StartGame", 1 - NativeTextItem "3461", "l", "LoadGameMenu" - NativeTextItem "3462", "m", "StartGame", 0 - NativeTextItem "3463", "v", "OptionsMenu" - NativeTextItem "3464", "q", "QuitMenu" + ExhumedPlasma + ExhumedTextItem "$MNU_NEWGAME", "n", "StartGameNoSkill", 1 + ExhumedTextItem "$MNU_LOADGAME", "l", "LoadGameMenu" + ExhumedTextItem "$TXT_EX_MAP00", "m", "StartGameNoSkill", 0 + ExhumedTextItem "$MNU_OPTIONS", "v", "OptionsMenu" + ExhumedTextItem "$MNU_QUITGAME", "q", "QuitMenu" } } @@ -75,64 +76,65 @@ LISTMENU "MainMenu" LISTMENU "IngameMenu" { - ScriptId 50 - class "$.MainMenu" ifgame(Duke, Nam, WW2GI, Redneck, RedneckRides) { - position 160, 55, 115 - centermenu + position 160, 55 + linespacing 18 animatedtransition - NativeTextItem "$MNU_NEWGAME", "n", "EpisodeMenu" - NativeTextItem "$MNU_SAVEGAME", "s", "SaveGameMenu" - NativeTextItem "$MNU_LOADGAME", "l", "LoadGameMenu" - NativeTextItem "$MNU_OPTIONS", "o", "OptionsMenu" - NativeTextItem "$MNU_HELP", "h", "HelpMenu" - NativeTextItem "$MNU_ENDGAME", "e", "EndgameMenu" - NativeTextItem "$MNU_QUITGAME", "q", "QuitMenu" + DukeLogo + DukeTextItem "$MNU_NEWGAME", "n", "EpisodeMenu" + DukeTextItem "$MNU_SAVEGAME", "s", "SaveGameMenu" + DukeTextItem "$MNU_LOADGAME", "l", "LoadGameMenu" + DukeTextItem "$MNU_OPTIONS", "o", "OptionsMenu" + DukeTextItem "$MNU_HELP", "h", "HelpMenu" + DukeTextItem "$MNU_ENDGAME", "e", "EndgameMenu" + DukeTextItem "$MNU_QUITGAME", "q", "QuitMenu" } ifgame(Blood) { - position 160, 45, 150 - caption "Blood" - centermenu + position 160, 45 + CaptionItem "Blood" Linespacing 17 - NativeTextItem "$MNU_NEWGAME", "n", "EpisodeMenu" - NativeTextItem "$MNU_OPTIONS", "o", "OptionsMenu" - NativeTextItem "$MNU_SAVEGAME", "s", "SaveGameMenu" - NativeTextItem "$MNU_LOADGAME", "l", "LoadGameMenu" - NativeTextItem "$MNU_HELP", "h", "HelpMenu" - NativeTextItem "$MNU_CREDITS", "c", "CreditsMenu" - NativeTextItem "$MNU_ENDGAME", "e", "EndgameMenu" - NativeTextItem "$MNU_QUITGAME", "q", "QuitMenu" + BloodTextItem "$MNU_NEWGAME", "n", "EpisodeMenu" + BloodTextItem "$MNU_OPTIONS", "o", "OptionsMenu" + BloodTextItem "$MNU_SAVEGAME", "s", "SaveGameMenu" + BloodTextItem "$MNU_LOADGAME", "l", "LoadGameMenu" + BloodTextItem "$MNU_HELP", "h", "HelpMenu" + BloodTextItem "$MNU_CREDITS", "c", "CreditsMenu" + BloodTextItem "$MNU_ENDGAME", "e", "EndgameMenu" + BloodTextItem "$MNU_QUITGAME", "q", "QuitMenu" + BloodDripDrawer } ifgame(ShadowWarrior) { Position 55, 32 Linespacing 17 - NativeTextItem "$MNU_NEWGAME", "n", "EpisodeMenu" - NativeTextItem "$MNU_LOADGAME", "l", "LoadGameMenu" - NativeTextItem "$MNU_SAVEGAME", "s", "SaveGameMenu" - NativeTextItem "$MNU_OPTIONS", "o", "OptionsMenu" - ifshareware(false) + SWLogo + SWTextItem "$MNU_NEWGAME", "n", "EpisodeMenu" + SWTextItem "$MNU_LOADGAME", "l", "LoadGameMenu" + SWTextItem "$MNU_SAVEGAME", "s", "SaveGameMenu" + SWTextItem "$MNU_OPTIONS", "o", "OptionsMenu" + ifnotgame (shareware) { - NativeTextItem "$MNU_CREDITS", "c", "CreditsMenu" + SWTextItem "$MNU_CREDITS", "c", "CreditsMenu" } else { - NativeTextItem "$MNU_HOWTOORDER", "h", "CreditsMenu" + SWTextItem "$MNU_HOWTOORDER", "h", "CreditsMenu" } - NativeTextItem "$MNU_QUITGAME", "q", "QuitMenu" + SWTextItem "$MNU_QUITGAME", "q", "QuitMenu" } ifgame(Exhumed) { + class ExhumedMainMenu Position 160, 65 - centermenu linespacing 22 - NativeTextItem "3460", "n", "StartGame", 1 - NativeTextItem "3461", "l", "LoadGameMenu" - NativeTextItem "3462", "m", "StartGame", 0 - NativeTextItem "3463", "v", "OptionsMenu" - NativeTextItem "3464", "q", "QuitMenu" + ExhumedLogo + ExhumedTextItem "$MNU_NEWGAME", "n", "StartGameNoSkill", 1 + ExhumedTextItem "$MNU_LOADGAME", "l", "LoadGameMenu" + ExhumedTextItem "$TXT_EX_MAP00", "m", "StartGameNoSkill", 0 + ExhumedTextItem "$MNU_OPTIONS", "v", "OptionsMenu" + ExhumedTextItem "$MNU_QUITGAME", "q", "QuitMenu" } } @@ -146,58 +148,48 @@ LISTMENU "EpisodeMenu" { ifgame(Duke, Nam, WW2GI, Redneck, RedneckRides) { - class "$.ListMenu" - caption "$MNU_SELECTEPISODE" - position 160, 48, 142 - centermenu - fixedspacing 5 + position 160, 48 + Linespacing 20 + captionItem "$MNU_SELECTEPISODE" animatedtransition } ifgame(blood) { - class "$.ListMenu" - caption "$MNU_EPISODES" - position 160, 45, 150 - centermenu + position 160, 45 Linespacing 20 + CaptionItem "$MNU_EPISODES" + BloodDripDrawer } ifgame(ShadowWarrior) { - caption "$MNU_EPISODES" + CaptionItem "$MNU_EPISODES" Position 35, 32 Linespacing 17 } - - ScriptId 100 } LISTMENU "SkillMenu" { ifgame(Duke, Nam, WW2GI, Redneck, RedneckRides) { - class "$.ListMenu" - position 160, 55, 115 - centermenu - animatedtransition - caption "$MNU_SELECTSKILL" - fixedspacing 5 + position 160, 48 + Linespacing 20 + captionItem "$MNU_SELECTSKILL" animatedtransition } ifgame(blood) { - class "$.ListMenu" - caption "$MNU_DIFFICULTY" - position 160, 60, 150 - centermenu + position 160, 60 Linespacing 20 + CaptionItem "$MNU_DIFFICULTY" + BloodDripDrawer } ifgame(ShadowWarrior) { - caption "$MNU_DIFFICULTY" + CaptionItem "$MNU_DIFFICULTY" Position 35, 32 Linespacing 17 } - ScriptId 110 } //------------------------------------------------------------------------------------------- @@ -208,46 +200,42 @@ LISTMENU "SkillMenu" ImageScroller "HelpMenu" { - ifgame(Duke, Nam, WW2GI) + ifgame(Duke, Nam, WW2GI, Redneck, RedneckRides) { - ImageItem "#3280", 400 - ImageItem "#2445", 401 - class "$.ImageScrollerMenu" - ifgame(Duke, Nam, WW2GI) - { - animatedtransition - } - } - ifgame(Redneck, RedneckRides) - { - ImageItem "#2541" - ImageItem "#1633" + + ImageItem "TEXTSTORY" + ImageItem "F1HELP" ifgame(RedneckRides) { - ImageItem "#1636" + ImageItem "DRIVABLES" } animatedtransition } ifgame(blood) { - class "$.ImageScrollerMenu" // The duplication here is to integrate the alternating versions of HELP3 - QAVAnimationItem "Help4.qav" - QAVAnimationItem "Help5.qav" - QAVAnimationItem "Help3.qav" - QAVAnimationItem "Help4.qav" - QAVAnimationItem "Help5.qav" - QAVAnimationItem "Help3b.qav" + QAVDrawer "Help4.qav" + QAVDrawer "Help5.qav" + QAVDrawer "Help3.qav" + QAVDrawer "Help4.qav" + QAVDrawer "Help5.qav" + QAVDrawer "Help3b.qav" } ifgame(ShadowWarrior) { // The menu has no default binding, but if someone tries to open it anyway show the cool retro ads that were shipped with the game. :D - ImageItem "#5262" - ifshareware(false) + ImageItem "ADSCREEN1" + ifnotgame (shareware) { - ImageItem "#5261" + ImageItem "ADSCREEN2" } } + ifgame(Exhumed) + { + // This is only here to prevent crashes if someone decides to open the menu from the console + ImageItem "TileBMGLogo" + ImageItem "TilePIELogo" + } } //------------------------------------------------------------------------------------------- @@ -265,90 +253,111 @@ ImageScroller "CreditsMenu" { ifgame(Duke, Nam, WW2GI) { - ImageItem "#2504", 990 - ImageItem "#2505", 991 - ImageItem "#2506", 992 + ifgame(PLUTOPAK) + { + ImageItem "CREDITPAGE1" + ImageItem "CREDITPAGE2" + ImageItem "CREDITPAGE3" + } + else + { + DukeCredits1 + DukeCredits2 + DukeCredits3 + } animatedtransition - class "Duke.ImageScrollerMenu" } ifgame(Redneck) { + TextBackground "MENUSCREEN" + TextBackgroundBrightness 0.5 + TextFont "SmallFont" + TextScale 0.45 // no point putting this into the string table. - TextItem "ORIGINAL CONCEPT, DESIGN AND DIRECTION\n\nDREW MARKHAM", 80 - TextItem "PRODUCED BY\n\nGREG GOODRICH", 80 - TextItem "GAME PROGRAMMING\n\nRAFAEL PAIZ", 80 - TextItem "ART DIRECTORS\n\nCLAIRE PRADERIE MAXX KAUFMAN ", 80 - TextItem "LEAD LEVEL DESIGNER\nALEX MAYBERRY\n\nLEVEL DESIGN\nMAL BLACKWELL\nSVERRE KVERNMO", 80 - TextItem "SENIOR ANIMATOR AND ARTIST\n\nJASON HOOVER", 80 - TextItem "TECHNICAL DIRECTOR\n\nBARRY DEMPSEY", 80 - TextItem "MOTION CAPTURE SPECIALIST AND\nCHARACTER ANIMATION\nAMIT DORON\n\nA.I. PROGRAMMING\nARTHUR DONAVAN\n\nADDITIONAL ANIMATION\nGEORGE KARL", 60 - TextItem "CHARACTER DESIGN\nCORKY LEHMKUHL\n\nMAP PAINTERS\nVIKTOR ANTONOV\nMATTHIAS BEEGUER\nSTEPHAN BURLE\n\nSCULPTORS\nGEORGE ENGEL\nJAKE GARBER\nJEFF HIMMEL", 50 - TextItem "CHARACTER VOICES\n\nLEONARD\nBURTON GILLIAM\n\nBUBBA, BILLY RAY, SKINNY OL' COOT\nAND THE TURD MINION\nDREW MARKHAM\n\nSHERIFF LESTER T. HOBBES\nMOJO NIXON\n\nALIEN VIXEN\nPEGGY JO JACOBS", 40 - TextItem "SOUND DESIGN\nGARY BRADFIELD\n\nMUSIC\nMOJO NIXON\nTHE BEAT FARMERS\nTHE REVEREND HORTON HEAT\nCEMENT POND\n\nADDITIONAL SOUND EFFECTS\nJIM SPURGIN", 50 - TextItem "MOTION CAPTURE ACTOR\nJ.P. MANOUX\n\nMOTION CAPTURE VIXEN\nSHAWN WOLFE", 80 - TextItem "PRODUCTION ASSISTANCE\nMINERVA MAYBERRY\n\nNUTS AND BOLTS\nSTEVE GOLDBERG\nMARCUS HUTCHINSON\n\nBEAN COUNTING\nMAX YOSHIKAWA\n\nADMINISTRATIVE ASSISTANCE\nSERAFIN LEWIS", 50 - TextItem "LOCATION MANAGER, LOUISIANA\nRICK SKINNER\n\nLOCATION SCOUT, LOUISIANA\nBRIAN BENOS\n\nPHOTOGRAPHER\nCARLOS SERRAO", 70 - TextItem "ADDITIONAL 3D MODELING BY\n3 NAME 3D\nVIEWPOINT DATALABS INTERNATIONAL\n\nAUDIO RECORDED AT\nPACIFIC OCEAN POST, SANTA MONICA, C.A.\n\nCEMENT POND TRACKS RECORDED AT\nDREAMSTATE RECORDING, BURBANK, C.A.\n\nRECORDING ENGINEER\nDAVE AHLERT", 50 - TextItem "3D BUILD ENGINE LICENSED FROM\n3D REALMS ENTERTAINMENT\n\nBUILD ENGINE AND RELATED TOOLS\nCREATED BY KEN SILVERMAN", 80 - TextItem "FOR INTERPLAY\n\nLEAD TESTER\nDARRELL JONES\n\nTESTERS\nTIM ANDERSON\nERICK LUJAN\nTIEN TRAN", 60 - TextItem "IS TECHS\nBILL DELK\nAARON MEYERS\n\nCOMPATIBILITY TECHS\nMARC DURAN\nDAN FORSYTH\nDEREK GIBBS\nAARON OLAIZ\nJACK PARKER", 60 - TextItem "DIRECTOR OF COMPATIBILITY\nPHUONG NGUYEN\n\nASSISTANT QA DIRECTOR\nCOLIN TOTMAN\n\nQA DIRECTOR\nCHAD ALLISON", 70 - TextItem "INTERPLAY PRODUCER\nBILL DUGAN\n\nINTERPLAY LINE PRODUCER\nCHRIS BENSON\n\nPRODUCT MANAGER\nJIM VEEVAERT\n\nPUBLIC RELATIONS\nERIKA PRICE", 50 - TextItem "SPECIAL THANKS\n\nJIM GAUER\nPAUL VAIS\nSCOTT MILLER\nTODD REPLOGLE\nCHUCK BUECHE\nCARTER LIPSCOMB\nJOHN CONLEY\nDON MAGGI", 60 - TextItem "EXTRA SPECIAL THANKS\n\nBRIAN FARGO", 80 - TextItem "REDNECK RAMPAGE\n(c) 1997 XATRIX ENTERTAINMENT, INC.\n\nREDNECK RAMPAGE IS A TRADEMARK OF\nINTERPLAY PRODUCTIONS", 60 + TextItem "ORIGINAL CONCEPT, DESIGN AND DIRECTION\n\nDREW MARKHAM" //, 80 + TextItem "PRODUCED BY\n\nGREG GOODRICH" //, 80 + TextItem "GAME PROGRAMMING\n\nRAFAEL PAIZ" //, 80 + TextItem "ART DIRECTORS\n\nCLAIRE PRADERIE MAXX KAUFMAN " //, 80 + TextItem "LEAD LEVEL DESIGNER\nALEX MAYBERRY\n\nLEVEL DESIGN\nMAL BLACKWELL\nSVERRE KVERNMO" //, 60 + TextItem "SENIOR ANIMATOR AND ARTIST\n\nJASON HOOVER" //, 80 + TextItem "TECHNICAL DIRECTOR\n\nBARRY DEMPSEY" //, 80 + TextItem "MOTION CAPTURE SPECIALIST AND\nCHARACTER ANIMATION\nAMIT DORON\n\nA.I. PROGRAMMING\nARTHUR DONAVAN\n\nADDITIONAL ANIMATION\nGEORGE KARL" //, 60 + TextItem "CHARACTER DESIGN\nCORKY LEHMKUHL\n\nMAP PAINTERS\nVIKTOR ANTONOV\nMATTHIAS BEEGUER\nSTEPHAN BURLE\n\nSCULPTORS\nGEORGE ENGEL\nJAKE GARBER\nJEFF HIMMEL" //, 30 + TextItem "CHARACTER VOICES\n\nLEONARD\nBURTON GILLIAM\n\nBUBBA, BILLY RAY, SKINNY OL' COOT\nAND THE TURD MINION\nDREW MARKHAM\n\nSHERIFF LESTER T. HOBBES\nMOJO NIXON\n\nALIEN VIXEN\nPEGGY JO JACOBS" //, 30 + TextItem "SOUND DESIGN\nGARY BRADFIELD\n\nMUSIC\nMOJO NIXON\nTHE BEAT FARMERS\nTHE REVEREND HORTON HEAT\nCEMENT POND\n\nADDITIONAL SOUND EFFECTS\nJIM SPURGIN" //, 30 + TextItem "MOTION CAPTURE ACTOR\nJ.P. MANOUX\n\nMOTION CAPTURE VIXEN\nSHAWN WOLFE" //, 70 + TextItem "PRODUCTION ASSISTANCE\nMINERVA MAYBERRY\n\nNUTS AND BOLTS\nSTEVE GOLDBERG\nMARCUS HUTCHINSON\n\nBEAN COUNTING\nMAX YOSHIKAWA\n\nADMINISTRATIVE ASSISTANCE\nSERAFIN LEWIS" //, 50 + TextItem "LOCATION MANAGER, LOUISIANA\nRICK SKINNER\n\nLOCATION SCOUT, LOUISIANA\nBRIAN BENOS\n\nPHOTOGRAPHER\nCARLOS SERRAO" //, 70 + TextItem "ADDITIONAL 3D MODELING BY\n3 NAME 3D\nVIEWPOINT DATALABS INTERNATIONAL\n\nAUDIO RECORDED AT\nPACIFIC OCEAN POST, SANTA MONICA, C.A.\n\nCEMENT POND TRACKS RECORDED AT\nDREAMSTATE RECORDING, BURBANK, C.A.\n\nRECORDING ENGINEER\nDAVE AHLERT" //, 50 + TextItem "3D BUILD ENGINE LICENSED FROM\n3D REALMS ENTERTAINMENT\n\nBUILD ENGINE AND RELATED TOOLS\nCREATED BY KEN SILVERMAN" //, 80 + TextItem "FOR INTERPLAY\n\nLEAD TESTER\nDARRELL JONES\n\nTESTERS\nTIM ANDERSON\nERICK LUJAN\nTIEN TRAN" //, 60 + TextItem "IS TECHS\nBILL DELK\nAARON MEYERS\n\nCOMPATIBILITY TECHS\nMARC DURAN\nDAN FORSYTH\nDEREK GIBBS\nAARON OLAIZ\nJACK PARKER" //, 60 + TextItem "DIRECTOR OF COMPATIBILITY\nPHUONG NGUYEN\n\nASSISTANT QA DIRECTOR\nCOLIN TOTMAN\n\nQA DIRECTOR\nCHAD ALLISON" //, 70 + TextItem "INTERPLAY PRODUCER\nBILL DUGAN\n\nINTERPLAY LINE PRODUCER\nCHRIS BENSON\n\nPRODUCT MANAGER\nJIM VEEVAERT\n\nPUBLIC RELATIONS\nERIKA PRICE" //, 50 + TextItem "SPECIAL THANKS\n\nJIM GAUER\nPAUL VAIS\nSCOTT MILLER\nTODD REPLOGLE\nCHUCK BUECHE\nCARTER LIPSCOMB\nJOHN CONLEY\nDON MAGGI" //, 60 + TextItem "EXTRA SPECIAL THANKS\n\nBRIAN FARGO" //, 80 + TextItem "REDNECK RAMPAGE\n(c) 1997 XATRIX ENTERTAINMENT, INC.\n\nREDNECK RAMPAGE IS A TRADEMARK OF\nINTERPLAY PRODUCTIONS" //, 60 animatedtransition } ifgame(RedneckRides) { - TextItem "ORIGINAL CONCEPT, DESIGN AND DIRECTION\n\nDREW MARKHAM", 80 - TextItem "ART DIRECTION AND ADDITIONAL DESIGN\n\nCORKY LEHMKUHL", 80 - TextItem "PRODUCED BY\n\nGREG GOODRICH", 80 - TextItem "GAME PROGRAMMING\n\nJOSEPH AURILI", 80 - TextItem "ORIGINAL GAME PROGRAMMING\n\nRAFAEL PAIZ", 80 - TextItem "LEVEL DESIGN\n\nRHETT BALDWIN & AARON BARBER", 80 - TextItem "ORIGINAL ART DIRECTION AND SUPPORT\n\nMAXX KAUFMAN & CLAIRE PRADERIE-MARKHAM", 80 - TextItem "COMPUTER GRAPHICS SUPERVISOR &\nCHARACTER ANIMATION DIRECTION\n\nBARRY DEMPSEY", 80 - TextItem "SENIOR ANIMATOR & MODELER\n\nJASON HOOVER", 80 - TextItem "CHARACTER ANIMATION &\nMOTION CAPTURE SPECIALIST\n\nAMIT DORON", 80 - TextItem "SOUND DESIGN &\nMUSIC PRODUCTION COORDINATION\n\nGARY BRADFIELD", 80 - TextItem "INTRODUCTION ANIMATION\n\nDOMINIQUE DROZDZ", 80 - TextItem "ARTIST\n\nMATTHIAS BEEGUER", 80 - TextItem "ADDITIONAL ART\n\nVIKTOR ANTONOV", 80 - TextItem "PRODUCTION COORDINATOR\n\nVICTORIA SYLVESTER", 80 - TextItem "CHARACTER VOICES\n\nLEONARD\nBURTON GILLIAM\n\nDAISY MAE\nTARA CHARENDOFF\n\nBUBBA, BILLY RAY, SKINNY OL' COOT,\nFRANK THE BIKER, THE TURD MINION\n& ALL OTHER VARIOUS RAMBLINGS...\nDREW MARKHAM", 40 - TextItem "SPECIAL APPEARENCE BY\n\nSHERIFF LESTER T. HOBBES\nMOJO NIXON\n\nALIEN VIXEN\nPEGGY JO JACOBS", 70 + TextBackground "MENUSCREEN" + TextBackgroundBrightness 0.5 + TextFont "SmallFont" + TextScale 0.45 + TextItem "ORIGINAL CONCEPT, DESIGN AND DIRECTION\n\nDREW MARKHAM" //, 80 + TextItem "ART DIRECTION AND ADDITIONAL DESIGN\n\nCORKY LEHMKUHL" //, 80 + TextItem "PRODUCED BY\n\nGREG GOODRICH" //, 80 + TextItem "GAME PROGRAMMING\n\nJOSEPH AURILI" //, 80 + TextItem "ORIGINAL GAME PROGRAMMING\n\nRAFAEL PAIZ" //, 80 + TextItem "LEVEL DESIGN\n\nRHETT BALDWIN & AARON BARBER" //, 80 + TextItem "ORIGINAL ART DIRECTION AND SUPPORT\n\nMAXX KAUFMAN & CLAIRE PRADERIE-MARKHAM" //, 80 + TextItem "COMPUTER GRAPHICS SUPERVISOR &\nCHARACTER ANIMATION DIRECTION\n\nBARRY DEMPSEY" //, 80 + TextItem "SENIOR ANIMATOR & MODELER\n\nJASON HOOVER" //, 80 + TextItem "CHARACTER ANIMATION &\nMOTION CAPTURE SPECIALIST\n\nAMIT DORON" //, 80 + TextItem "SOUND DESIGN &\nMUSIC PRODUCTION COORDINATION\n\nGARY BRADFIELD" //, 80 + TextItem "INTRODUCTION ANIMATION\n\nDOMINIQUE DROZDZ" //, 80 + TextItem "ARTIST\n\nMATTHIAS BEEGUER" //, 80 + TextItem "ADDITIONAL ART\n\nVIKTOR ANTONOV" //, 80 + TextItem "PRODUCTION COORDINATOR\n\nVICTORIA SYLVESTER" //, 80 + TextItem "CHARACTER VOICES\n\nLEONARD\nBURTON GILLIAM\n\nDAISY MAE\nTARA CHARENDOFF\n\nBUBBA, BILLY RAY, SKINNY OL' COOT,\nFRANK THE BIKER, THE TURD MINION\n& ALL OTHER VARIOUS RAMBLINGS...\nDREW MARKHAM" //, 40 + TextItem "SPECIAL APPEARENCE BY\n\nSHERIFF LESTER T. HOBBES\nMOJO NIXON\n\nALIEN VIXEN\nPEGGY JO JACOBS" //, 70 TextItem "REDNECK RAMPAGE TITLE TRACK & CYBERSEX\nWRITTEN & PERFORMED BY\nMOJO NIXON\n\n(c) MUFFIN'STUFFIN' MUSIC (BMI)\nADMINISTERED BY BUG.", 70 - TextItem "MUSIC\n\nDISGRACELAND\nTINY D & THE SOFA KINGS\n\nBANJO AND GUITAR PICKIN\nJOHN SCHLOCKER\nHOWARD YEARWOOD", 60 - TextItem "RECORDING ENGINEER\nDAVE AHLERT\n\nRECORDING ASSISTANCE\nJEFF GILBERT", 80 - TextItem "MOTION CAPTURE ACTOR\nJ.P. MANOUX\n\nMOTION CAPTURE ACTRESS\nSHAWN WOLFE", 80 - TextItem "THIS GAME COULD NOT HAVE BEEN MADE WITHOUT\nALEX MAYBERRY\nMAL BLACKWELL\n\nNUTS AND BOLTS\nSTEVE GOLDBERG\n\nBEAN COUNTING\nMAX YOSHIKAWA\n\nADMINISTRATIVE ASSISTANCE\nMINERVA MAYBERRY", 50 - TextItem "FOR INTERPLAY\n\nPRODUCER\nBILL DUGAN\n\nLINE PRODUCER\nCHRIS BENSON\n\nLEAD TESTER\nDARRELL JONES", 60 - TextItem "TESTERS\n\nTIM ANDERSON\nPRIMO PULANCO\nMARK MCCARTY\nBRIAN AXLINE", 70 - TextItem "PRODUCTION BABY\n\nPAULINE MARIE MARKHAM", 80 - TextItem "ORIGINAL PRODUCTION BABY\n\nALYSON KAUFMAN", 80 - TextItem "3D BUILD ENGINE LICENSED FROM\n3D REALMS ENTERTAINMENT\n\nBUILD ENGINE AND RELATED TOOLS\nCREATED BY KEN SILVERMAN", 80 - TextItem "SPECIAL THANKS\n\nSCOTT MILLER\nGEORGE BROUSSARD", 80 - TextItem "EXTRA SPECIAL THANKS\n\nBRIAN FARGO", 80 - TextItem "REDNECK RAMPAGE RIDES AGAIN\n(c) 1998 XATRIX ENTERTAINMENT, INC.\n\nREDNECK RAMPAGE RIDES AGAIN\nIS A TRADEMARK OF\nINTERPLAY PRODUCTIONS", 70 + TextItem "MUSIC\n\nDISGRACELAND\nTINY D & THE SOFA KINGS\n\nBANJO AND GUITAR PICKIN\nJOHN SCHLOCKER\nHOWARD YEARWOOD" //, 60 + TextItem "RECORDING ENGINEER\nDAVE AHLERT\n\nRECORDING ASSISTANCE\nJEFF GILBERT" //, 80 + TextItem "MOTION CAPTURE ACTOR\nJ.P. MANOUX\n\nMOTION CAPTURE ACTRESS\nSHAWN WOLFE" //, 80 + TextItem "THIS GAME COULD NOT HAVE BEEN MADE WITHOUT\nALEX MAYBERRY\nMAL BLACKWELL\n\nNUTS AND BOLTS\nSTEVE GOLDBERG\n\nBEAN COUNTING\nMAX YOSHIKAWA\n\nADMINISTRATIVE ASSISTANCE\nMINERVA MAYBERRY" //, 50 + TextItem "FOR INTERPLAY\n\nPRODUCER\nBILL DUGAN\n\nLINE PRODUCER\nCHRIS BENSON\n\nLEAD TESTER\nDARRELL JONES" //, 60 + TextItem "TESTERS\n\nTIM ANDERSON\nPRIMO PULANCO\nMARK MCCARTY\nBRIAN AXLINE" //, 70 + TextItem "PRODUCTION BABY\n\nPAULINE MARIE MARKHAM" //, 80 + TextItem "ORIGINAL PRODUCTION BABY\n\nALYSON KAUFMAN" //, 80 + TextItem "3D BUILD ENGINE LICENSED FROM\n3D REALMS ENTERTAINMENT\n\nBUILD ENGINE AND RELATED TOOLS\nCREATED BY KEN SILVERMAN" //, 80 + TextItem "SPECIAL THANKS\n\nSCOTT MILLER\nGEORGE BROUSSARD" //, 80 + TextItem "EXTRA SPECIAL THANKS\n\nBRIAN FARGO" //, 80 + TextItem "REDNECK RAMPAGE RIDES AGAIN\n(c) 1998 XATRIX ENTERTAINMENT, INC.\n\nREDNECK RAMPAGE RIDES AGAIN\nIS A TRADEMARK OF\nINTERPLAY PRODUCTIONS" //, 70 animatedtransition } ifgame(blood) { - class "Blood.ImageScrollerMenu" - QAVAnimationItem "Credits.qav" + QAVDrawer "Credits.qav" } ifgame(ShadowWarrior) { - ifshareware(true) + ifgame (shareware) { - ImageItem "#5110" - ImageItem "#5112" + ImageItem "SWORDER1" + ImageItem "SWORDER2" } - ImageItem "#5111" - ImageItem "#5118" - ImageItem "#4979" - ImageItem "#5113" + ImageItem "CREDITS1" + ImageItem "CREDITS2" + ImageItem "SUPPORT" + ImageItem "ONLINE" + } + ifgame(Exhumed) + { + // This is only here to prevent crashes if someone decides to open the menu from the console + ImageItem "TileBMGLogo" + ImageItem "TilePIELogo" } } @@ -360,9 +369,9 @@ ImageScroller "CreditsMenu" ListMenu "LoadGameMenu" { - Caption "$MNU_LOADGAME" Position 0, 40 Class "LoadMenu" // uses its own implementation + CaptionItem "$MNU_LOADGAME" } //------------------------------------------------------------------------------------------- @@ -373,9 +382,9 @@ ListMenu "LoadGameMenu" ListMenu "SaveGameMenu" { - Caption "$MNU_SAVEGAME" Position 0, 40 Class "SaveMenu" // uses its own implementation + CaptionItem "$MNU_SAVEGAME" } //------------------------------------------------------------------------------------------- @@ -423,10 +432,10 @@ OptionMenuSettings DefaultOptionMenu { - Position 85 + Position -20 } -OptionMenu "OptionsMenu" +OptionMenu "OptionsMenu" protected { Caption "$MNU_OPTIONS" Submenu "$OPTMNU_CONTROLS", "CustomizeControls" @@ -440,6 +449,8 @@ OptionMenu "OptionsMenu" Submenu "$OPTMNU_GAMEPLAY", "GameplayOptions" Submenu "$OPTMNU_MISCELLANEOUS", "MiscOptions" StaticText " " + Submenu "$OS_TITLE", "os_Menu" + StaticText " " Submenu "$MNU_ENGINECREDITS", "EngineCredits" SafeCommand "$OPTMNU_DEFAULTS", "reset2defaults" SafeCommand "$OPTMNU_RESETTOSAVED", "reset2saved" @@ -452,7 +463,7 @@ OptionMenu "OptionsMenu" // //------------------------------------------------------------------------------------------- -OptionMenu "CustomizeControls" +OptionMenu "CustomizeControls" protected { Title "$CNTRLMNU_TITLE" @@ -469,7 +480,7 @@ OptionMenu "CustomizeControls" SafeCommand "$CTRL_LEFTHANDED", "controlpreset 2" //engine/leftbinds.txt } -OptionMenu "ActionControlsMenu"// protected +OptionMenu "ActionControlsMenu" protected { Title "$CNTRLMNU_ACTION_TITLE" ScrollTop 2 @@ -531,7 +542,7 @@ OptionMenu "ActionControlsMenu"// protected //Control "$CNTRLMNU_SCOREBOARD" , "+show_dukematch_scores" } -OptionMenu "ChatControlsMenu"// protected +OptionMenu "ChatControlsMenu" protected { Title "$CNTRLMNU_CHAT_TITLE" ScrollTop 2 @@ -541,7 +552,7 @@ OptionMenu "ChatControlsMenu"// protected Control "$CNTRLMNU_SAY" , "+send_message" } -OptionMenu "WeaponsControlMenu"// protected +OptionMenu "WeaponsControlMenu" protected { Title "$CNTRLMNU_WEAPONS_TITLE" ScrollTop 2 @@ -587,7 +598,7 @@ OptionMenu "WeaponsControlMenu"// protected } -OptionMenu "InventoryControlsMenu"// protected +OptionMenu "InventoryControlsMenu" protected { Title "$CNTRLMNU_INVENTORY_TITLE" ScrollTop 2 @@ -663,7 +674,7 @@ OptionMenu "InventoryControlsMenu"// protected } } -OptionMenu "OtherControlsMenu"// protected +OptionMenu "OtherControlsMenu" protected { Title "$CNTRLMNU_OTHER_TITLE" ScrollTop 2 @@ -701,7 +712,7 @@ OptionMenu "OtherControlsMenu"// protected } -OptionMenu "MapControlsMenu" +OptionMenu "MapControlsMenu" protected { Title "$MAPCNTRLMNU_CONTROLS" @@ -747,7 +758,7 @@ OptionString "Cursors" "-", "$OPTSTR_SYSTEMCURSOR" } -OptionMenu "MouseOptions" //protected +OptionMenu "MouseOptions" protected { Title "$MOUSEMNU_TITLE" //Option "$MOUSEMNU_ENABLEMOUSE", "in_mouse", "YesNo" @@ -776,12 +787,29 @@ OptionMenu "MouseOptions" //protected // //------------------------------------------------------------------------------------------- -OptionMenu "JoystickOptions" //protected +OptionMenu "JoystickOptionsDefaults" protected { Title "$JOYMNU_OPTIONS" - // This will be filled in by joystick code if devices get connected or disconnected + Option "$JOYMNU_ENABLE", "use_joystick", "YesNo" + Option "$JOYMNU_NOMENU", "m_blockcontrollers", "YesNo" + IfOption(Windows) + { + Option "$JOYMNU_DINPUT", "joy_dinput", "YesNo" + Option "$JOYMNU_XINPUT", "joy_xinput", "YesNo" + Option "$JOYMNU_PS2", "joy_ps2raw", "YesNo" + } + StaticText "" + StaticTextSwitchable "$JOYMNU_NOCON", "$JOYMNU_CONFIG", "ConfigureMessage" + StaticTextSwitchable " ", "$JOYMNU_DISABLED1", "ConnectMessage1" + StaticTextSwitchable " ", "$JOYMNU_DISABLED2", "ConnectMessage2" + + // The rest will be filled in by joystick code if devices get connected or disconnected } +OptionMenu "JoystickOptions" protected +{ + Title "$JOYMNU_OPTIONS" +} OptionValue "JoyAxisMapNames" { @@ -799,7 +827,7 @@ OptionValue "Inversion" 1, "$OPTVAL_INVERTED" } -OptionMenu "JoystickConfigMenu" //protected +OptionMenu "JoystickConfigMenu" protected { Title "$JOYMNU_TITLE" Class "JoystickConfigMenu" @@ -851,7 +879,7 @@ OptionValue "Gender" } -OptionMenu "NewPlayerMenu" //protected +OptionMenu "NewPlayerMenu" protected { Title "$MNU_PLAYERSETUP" TextField "$PLYRMNU_NAME", playername @@ -866,10 +894,10 @@ OptionMenu "NewPlayerMenu" //protected } Option "$PLYRMNU_PLAYERGENDER", "playergender", "Gender" Submenu "$PLRMNU_TAUNTS", "TauntsMenu" - Class "NewPlayerMenu" + Class "PlayerMenu" } -OptionMenu "TauntsMenu" //protected +OptionMenu "TauntsMenu" protected { Title "$PLRMNU_TAUNTS" TextField "1", "combatmacro0" @@ -911,7 +939,7 @@ OptionValue "WeapSwitch" } -OptionMenu GameplayOptions //protected +OptionMenu GameplayOptions protected { Title "$GMPLYMNU_TITLE" Option "$PLYRMNU_AUTOAIM", "cl_autoaim", "AimMode" @@ -967,7 +995,7 @@ OptionValue "Multisample" } -OptionMenu "VideoOptions" //protected +OptionMenu "VideoOptions" protected { Title "$DSPLYMNU_TITLE" @@ -1068,7 +1096,6 @@ OptionMenu "AutomapOptions" Option "$AUTOMAPMNU_ROTATE", "am_rotate", "OnOff" Option "$AUTOMAPMNU_FOLLOW", "am_followplayer", "OnOff" - // move map controls here. // todo: //CVAR(Bool, am_textfont, false, CVAR_ARCHIVE) //CVAR(Bool, am_showlabel, false, CVAR_ARCHIVE) @@ -1112,7 +1139,7 @@ OptionValue CrosshairHealthTypes 2.0, "$OPTVAL_YES_ENHANCED" } -OptionMenu "HUDOptions" //protected +OptionMenu "HUDOptions" protected { Title "$OPTMNU_HUD" @@ -1231,7 +1258,7 @@ OptionString SpeakerModes } -OptionMenu OpenALSoundItems //protected +OptionMenu OpenALSoundItems protected { Title "$OPENALMNU_TITLE" Option "$OPENALMNU_PLAYBACKDEVICE", "snd_aldevice", "ALDevices" @@ -1245,7 +1272,7 @@ OptionValue MidiDevices // filled in by the sound code } -OptionMenu SoundOptions //protected +OptionMenu SoundOptions protected { Title "$SNDMNU_TITLE" Slider "$MODMNU_MASTERVOLUME", "snd_mastervolume", 0, 1, 0.05, 2 @@ -1279,6 +1306,7 @@ OptionMenu SoundOptions //protected } StaticText " " Submenu "$SNDMNU_ADVANCED", "AdvSoundOptions" + //Submenu "$OPTMNU_REVERB", "ReverbEdit" // disabled because there's no way to use the edited data. } /*======================================= @@ -1288,7 +1316,7 @@ OptionMenu SoundOptions //protected *=======================================*/ -OptionMenu AdvSoundOptions //protected +OptionMenu AdvSoundOptions protected { Title "$ADVSNDMNU_TITLE" Option "$ADVSNDMNU_LOOKUPMUS", "mus_extendedlookup", "OnOff" @@ -1314,12 +1342,12 @@ OptionMenu AdvSoundOptions //protected } -OptionMenu TimidityConfigMenu //protected +OptionMenu TimidityConfigMenu protected { Title "$ADVSNDMNU_SELCONFIG" } -OptionMenu FluidPatchsetMenu //protected +OptionMenu FluidPatchsetMenu protected { Title "$ADVSNDMNU_SELCONFIG" } @@ -1352,7 +1380,7 @@ OptionValue ModVolumeRamps -OptionMenu ModReplayerOptions //protected +OptionMenu ModReplayerOptions protected { Title "$MODMNU_TITLE" Slider "$MODMNU_MASTERVOLUME", "mod_dumb_mastervolume", 1, 16, 0.5, 1 @@ -1372,7 +1400,7 @@ OptionMenu ModReplayerOptions //protected * *=======================================*/ - OptionMenu MidiPlayerOptions /*FluidsynthOptions*/ //protected + OptionMenu MidiPlayerOptions /*FluidsynthOptions*/ protected { Title "$SNDMNU_MIDIPLAYER" //Title "$ADVSNDMNU_FLUIDSYNTH" @@ -1445,7 +1473,7 @@ OptionValue GPUSwitch 2.0, "$OPTVAL_INTEGRATED" } -OptionMenu VideoModeMenu //protected +OptionMenu VideoModeMenu protected { Title "$VIDMNU_TITLE" @@ -1485,7 +1513,7 @@ OptionMenu VideoModeMenu //protected SubMenu "$VIDMNU_RESPRESET", CustomResolutionMenu } -OptionMenu CustomResolutionMenu //protected +OptionMenu CustomResolutionMenu protected { Title "$VIDMNU_RESPRESETTTL" @@ -1530,7 +1558,7 @@ OptionValue Autosave 2, "$OPTVAL_NEVER" } -OptionMenu "MiscOptions" //protected +OptionMenu "MiscOptions" protected { Title "$MISCMNU_TITLE" //Indent 220 @@ -1562,13 +1590,123 @@ OptionMenu "MiscOptions" //protected } +//------------------------------------------------------------------------------------------- +// +// Reverb editor +// +//------------------------------------------------------------------------------------------- + +OptionMenu "ReverbEdit" protected +{ + Class "ReverbEdit" + Title "$OPTMNU_REVERB" + StaticTextSwitchable "", "", "EvironmentName", 1 + StaticTextSwitchable "", "", "EvironmentID" + StaticText " " + Submenu "$REVMNU_SELECT", "ReverbSelect" + Option "$REVMNU_TEST", "eaxedit_test", OnOff + StaticText " " + Submenu "$REVMNU_NEW", "ReverbNew" + Submenu "$REVMNU_SAVE", "ReverbSave" + Submenu "$REVMNU_EDIT", "ReverbSettings" +} + +OptionMenu "ReverbSelect" protected +{ + Class "ReverbSelect" + Title "$REVMNU_SELECT" + // filled in by code +} + +OptionMenu "ReverbSettings" protected +{ + Title "$REVMNU_EDIT" + SafeCommand "$REVMNU_REVERT", "revertenvironment" + StaticText " " + SliderReverbEditOption "$REVMNU_Environment_Size", 1, 100, 0.01, 3, 1 + SliderReverbEditOption "$REVMNU_Environment_Diffusion", 0, 1, 0.01, 3, 2 + SliderReverbEditOption "$REVMNU_Room", -10000, 0, 1, 0, 3 + SliderReverbEditOption "$REVMNU_Room_HF", -10000, 0, 1, 0, 4 + SliderReverbEditOption "$REVMNU_Room_LF", -10000, 0, 1, 0, 5 + SliderReverbEditOption "$REVMNU_Decay_Time", 1, 200, 0.01, 3, 6 + SliderReverbEditOption "$REVMNU_Decay_HF_Ratio", 1, 20, 0.01, 3, 7 + SliderReverbEditOption "$REVMNU_Decay_LF_Ratio", 1, 20, 0.01, 3, 8 + SliderReverbEditOption "$REVMNU_Reflections", -10000, 1000, 1, 0, 9 + SliderReverbEditOption "$REVMNU_Reflections_Delay", 0, 0.3, 1, 3, 10 + SliderReverbEditOption "$REVMNU_Reflections_Pan_X", -2000, 2000, 1, 3, 11 + SliderReverbEditOption "$REVMNU_Reflections_Pan_Y", -2000, 2000, 1, 3, 12 + SliderReverbEditOption "$REVMNU_Reflections_Pan_Z", -2000, 2000, 1, 3, 13 + SliderReverbEditOption "$REVMNU_Reverb", -10000, 2000, 1, 0, 14 + SliderReverbEditOption "$REVMNU_Reverb_Delay", 0, 0.1, 0.01, 3, 15 + SliderReverbEditOption "$REVMNU_Reverb_Pan_X", -2000, 2000, 1, 3, 16 + SliderReverbEditOption "$REVMNU_Reverb_Pan_Y", -2000, 2000, 1, 3, 17 + SliderReverbEditOption "$REVMNU_Reverb_Pan_Z", -2000, 2000, 1, 3, 18 + SliderReverbEditOption "$REVMNU_Echo_Time", 0.075, 0.25, 0.005, 3, 19 + SliderReverbEditOption "$REVMNU_Echo_Depth", 0, 1, 0.01, 3, 20 + SliderReverbEditOption "$REVMNU_Modulation_Time", 0.04, 4, 0.01, 3, 21 + SliderReverbEditOption "$REVMNU_Modulation_Depth",0, 1, 0.01, 3, 22 + SliderReverbEditOption "$REVMNU_Air_Absorption_HF", -100, 0, 0.01, 3, 23 + SliderReverbEditOption "$REVMNU_HF_Reference", 10000, 200000, 1, 3, 24 + SliderReverbEditOption "$REVMNU_LF_Reference",20, 10000, 0.1, 3, 25 + SliderReverbEditOption "$REVMNU_Room_Rolloff_Factor",0, 10, 0.01, 3, 26 + SliderReverbEditOption "$REVMNU_Diffusion",0, 100, 0.01, 3, 27 + SliderReverbEditOption "$REVMNU_Density",0, 100, 0.01, 3, 28 + StaticText " " + ReverbOption "$REVMNU_Reflections_Scale", 29, OnOff + ReverbOption "$REVMNU_Reflections_Delay_Scale", 30, OnOff + ReverbOption "$REVMNU_Decay_Time_Scale", 31, OnOff + ReverbOption "$REVMNU_Decay_HF_Limit", 32, OnOff + ReverbOption "$REVMNU_Reverb_Scale", 33, OnOff + ReverbOption "$REVMNU_Reverb_Delay_Scale", 34, OnOff + ReverbOption "$REVMNU_Echo_Time_Scale", 35, OnOff + ReverbOption "$REVMNU_Modulation_Time_Scale", 36, OnOff +} + +OptionMenu "ReverbNew" protected +{ + Title "$REVMNU_NEW" + ReverbSelect "$REVMNU_Based_on", "ReverbSelect" + TextField "$REVMNU_Name", "reverbedit_name" + NumberField "$REVMNU_ID_1", "reverbedit_id1", 0, 255 + NumberField "$REVMNU_ID_2", "reverbedit_id2", 0, 255 + Command "$REVMNU_Create", "createenvironment", 0, 1 +} + +OptionMenu "ReverbSave" protected +{ + Class "ReverbSave" + Title "$REVMNU_SAVE" + Command "$REVMNU_Save", "savereverbs" + TextField "$REVMNU_File_name", "reverbsavename" + StaticText "" + StaticText "$REVMNU_Environments_to_save" + // Rest is filled in by code. +} + +/*======================================= + * + * Option Search menu + * + *=======================================*/ + +OptionMenu "os_Menu" +{ + Class "os_Menu" + Title "$OS_TITLE" +} + +OptionValue "os_isanyof_values" +{ + 0, "$OS_ALL" + 1, "$OS_ANY" +} //------------------------------------------------------------------------------------------- // // No multiplayer support for now, but kept for documentation. // //------------------------------------------------------------------------------------------- - +/* LISTMENU "MultiMenu" { ifgame(Duke, Nam, WW2GI) @@ -1653,21 +1791,22 @@ OptionMenu "MultiOptionsMenu" Option "$NETMNU_FFIRE", "m_ffire", "OnOff" SafeCommand "$NETMNU_ACCEPT", "MultiAccept" } +*/ OptionMenu "EngineCredits" { title "$MNU_CREDITS" Submenu " ---->", "EngineCredits1a" - StaticText "Developers" + StaticText "Developers", 1 StaticText "Christoph Oelckers", 0 StaticText "Mitchell Richters", 0 StaticText "" - StaticText "Additional Developers" + StaticText "Additional Developers", 1 StaticText "Rachael Alexanderson", 0 StaticText "Magnus Norddahl", 0 StaticText "Alexey Lysiuk", 0 StaticText "" - StaticText "The Raze team thanks the following contributors" + StaticText "The Raze team thanks the following contributors", 1 StaticText "Nash Muhandes", 0 StaticText "Dynamo", 0 } @@ -1676,7 +1815,7 @@ OptionMenu "EngineCredits1a" { title "$MNU_CREDITS" Submenu " ---->", "EngineCredits1b" - StaticText "Raze QA" + StaticText "Raze QA", 1 StaticText "sinisterseed ", 0 StaticText "Major Cooke Dynamo ", 0 @@ -1688,11 +1827,11 @@ OptionMenu "EngineCredits1b" { title "$MNU_CREDITS" Submenu " ---->", "EngineCredits2" - StaticText "ZDoom / GZDoom / ZDuke" + StaticText "ZDoom / GZDoom / ZDuke", 1 StaticText "Marisa \"Randi\" Heit", 0 StaticText "Braden \"Blzut3\" Obrzut", 0 StaticText "" - StaticText "Sound Engine" + StaticText "Sound Engine", 1 StaticText "Chris Robinson", 0 StaticText "" } @@ -1702,18 +1841,18 @@ OptionMenu "EngineCredits2" { title "$MNU_CREDITS" Submenu " ---->", "EngineCredits2a" - StaticText "EDuke 2.0" + StaticText "EDuke 2.0", 1 StaticText "Matt Saettler", 0 StaticText "" - StaticText "JFDuke / JFSW", 0 + StaticText "JFDuke / JFSW", 1 StaticText "Jonathon \"JonoF\" Fowler", 0 StaticText "" - StaticText "EDuke32 / VoidSW" + StaticText "EDuke32 / VoidSW", 1 StaticText "Richard \"TerminX\" Gobeille", 0 StaticText "Evan \"Hendricks266\" Ramos", 0 StaticText "Alex \"pogokeen\" Dawson", 0 StaticText "" - StaticText "Retired developers" + StaticText "Retired developers", 1 StaticText "Pierre-Loup \"Plagman\" Griffais", 0 StaticText "Philipp \"Helixhorned\" Kutin", 0 } @@ -1722,13 +1861,13 @@ OptionMenu "EngineCredits2a" { title "$MNU_CREDITS" Submenu " ---->", "EngineCredits3" - StaticText "RedNukem / NBlood" + StaticText "RedNukem / NBlood", 1 StaticText "Alexey \"Nuke.YKT\" Skrybykin", 0 StaticText "" - StaticText "SWP" + StaticText "SWP", 1 StaticText "Ben \"ProAsm\" Smit", 0 StaticText "" - StaticText "PCExhumed" + StaticText "PCExhumed", 1 StaticText "Alexey \"Nuke.YKT\" Skrybykin", 0 StaticText "sirlemonhead", 0 } @@ -1736,9 +1875,9 @@ OptionMenu "EngineCredits2a" OptionMenu "EngineCredits3" { title "$MNU_CREDITS" - Submenu " ---->", "EngineCredits" - StaticText "The EDuke32 team thanks the following people" - StaticText "for their contributions:" + //Submenu " ---->", "EngineCredits" // This creates a circular dependency which makes the search tool crash. + StaticText "The EDuke32 team thanks the following people", 1 + StaticText "for their contributions:", 1 StaticText "Alexey Skrybykin  Bioman            Brandon Bergren  ", 0 StaticText "Charlie Honig     Dan Gaskill       David Koenig     ", 0 diff --git a/wadsrc/static/zscript.txt b/wadsrc/static/zscript.txt index b07f4f284..8d9ef7e6d 100644 --- a/wadsrc/static/zscript.txt +++ b/wadsrc/static/zscript.txt @@ -4,4 +4,29 @@ version "4.3" #include "zscript/constants.zs" #include "zscript/events.zs" #include "zscript/dictionary.zs" -#include "zscript/gamescreen.zs" \ No newline at end of file +#include "zscript/gamescreen.zs" +#include "zscript/razebase.zs" + +#include "zscript/ui/menu/colorpickermenu.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/reverbedit.zs" +#include "zscript/ui/menu/textentermenu.zs" +#include "zscript/ui/menu/menucustomize.zs" +#include "zscript/ui/menu/imagescroller.zs" +#include "zscript/ui/menu/search/menu.zs" +#include "zscript/ui/menu/search/searchfield.zs" +#include "zscript/ui/menu/search/query.zs" +#include "zscript/ui/menu/search/anyoralloption.zs" + +#include "zscript/games/duke/ui/menu.zs" +#include "zscript/games/blood/ui/menu.zs" +#include "zscript/games/sw/ui/menu.zs" +#include "zscript/games/exhumed/ui/menu.zs" diff --git a/wadsrc/static/zscript/base.zs b/wadsrc/static/zscript/base.zs index abbb3182e..223ac495f 100644 --- a/wadsrc/static/zscript/base.zs +++ b/wadsrc/static/zscript/base.zs @@ -1,9 +1,155 @@ + +// constants for A_PlaySound +enum ESoundFlags +{ + CHAN_AUTO = 0, + CHAN_WEAPON = 1, + CHAN_VOICE = 2, + CHAN_ITEM = 3, + CHAN_BODY = 4, + CHAN_5 = 5, + CHAN_6 = 6, + CHAN_7 = 7, + + // modifier flags + CHAN_LISTENERZ = 8, + CHAN_MAYBE_LOCAL = 16, + CHAN_UI = 32, + CHAN_NOPAUSE = 64, + CHAN_LOOP = 256, + CHAN_PICKUP = (CHAN_ITEM|CHAN_MAYBE_LOCAL), // Do not use this with A_StartSound! It would not do what is expected. + CHAN_NOSTOP = 4096, + CHAN_OVERLAP = 8192, + + // Same as above, with an F appended to allow better distinction of channel and channel flags. + CHANF_DEFAULT = 0, // just to make the code look better and avoid literal 0's. + CHANF_LISTENERZ = 8, + CHANF_MAYBE_LOCAL = 16, + CHANF_UI = 32, + CHANF_NOPAUSE = 64, + CHANF_LOOP = 256, + CHANF_NOSTOP = 4096, + CHANF_OVERLAP = 8192, + CHANF_LOCAL = 16384, + + + CHANF_LOOPING = CHANF_LOOP | CHANF_NOSTOP, // convenience value for replicating the old 'looping' boolean. + +}; + +// sound attenuation values +const ATTN_NONE = 0; +const ATTN_NORM = 1; +const ATTN_IDLE = 1.001; +const ATTN_STATIC = 3; + + +enum ERenderStyle +{ + STYLE_None, // Do not draw + STYLE_Normal, // Normal; just copy the image to the screen + STYLE_Fuzzy, // Draw silhouette using "fuzz" effect + STYLE_SoulTrans, // Draw translucent with amount in r_transsouls + STYLE_OptFuzzy, // Draw as fuzzy or translucent, based on user preference + STYLE_Stencil, // Fill image interior with alphacolor + STYLE_Translucent, // Draw translucent + STYLE_Add, // Draw additive + STYLE_Shaded, // Treat patch data as alpha values for alphacolor + STYLE_TranslucentStencil, + STYLE_Shadow, + STYLE_Subtract, // Actually this is 'reverse subtract' but this is what normal people would expect by 'subtract'. + STYLE_AddStencil, // Fill image interior with alphacolor + STYLE_AddShaded, // Treat patch data as alpha values for alphacolor + STYLE_Multiply, // Multiply source with destination (HW renderer only.) + STYLE_InverseMultiply, // Multiply source with inverse of destination (HW renderer only.) + STYLE_ColorBlend, // Use color intensity as transparency factor + STYLE_Source, // No blending (only used internally) + STYLE_ColorAdd, // Use color intensity as transparency factor and blend additively. + +}; + + +enum EGameState +{ + GS_LEVEL, + GS_INTERMISSION, + GS_FINALE, + GS_DEMOSCREEN, + GS_MENUSCREEN = GS_DEMOSCREEN, + GS_FULLCONSOLE, + GS_HIDECONSOLE, + GS_STARTUP, + GS_TITLELEVEL, +} + +const TEXTCOLOR_BRICK = "\034A"; +const TEXTCOLOR_TAN = "\034B"; +const TEXTCOLOR_GRAY = "\034C"; +const TEXTCOLOR_GREY = "\034C"; +const TEXTCOLOR_GREEN = "\034D"; +const TEXTCOLOR_BROWN = "\034E"; +const TEXTCOLOR_GOLD = "\034F"; +const TEXTCOLOR_RED = "\034G"; +const TEXTCOLOR_BLUE = "\034H"; +const TEXTCOLOR_ORANGE = "\034I"; +const TEXTCOLOR_WHITE = "\034J"; +const TEXTCOLOR_YELLOW = "\034K"; +const TEXTCOLOR_UNTRANSLATED = "\034L"; +const TEXTCOLOR_BLACK = "\034M"; +const TEXTCOLOR_LIGHTBLUE = "\034N"; +const TEXTCOLOR_CREAM = "\034O"; +const TEXTCOLOR_OLIVE = "\034P"; +const TEXTCOLOR_DARKGREEN = "\034Q"; +const TEXTCOLOR_DARKRED = "\034R"; +const TEXTCOLOR_DARKBROWN = "\034S"; +const TEXTCOLOR_PURPLE = "\034T"; +const TEXTCOLOR_DARKGRAY = "\034U"; +const TEXTCOLOR_CYAN = "\034V"; +const TEXTCOLOR_ICE = "\034W"; +const TEXTCOLOR_FIRE = "\034X"; +const TEXTCOLOR_SAPPHIRE = "\034Y"; +const TEXTCOLOR_TEAL = "\034Z"; + +const TEXTCOLOR_NORMAL = "\034-"; +const TEXTCOLOR_BOLD = "\034+"; + +const TEXTCOLOR_CHAT = "\034*"; +const TEXTCOLOR_TEAMCHAT = "\034!"; + + +enum EMonospacing +{ + Mono_Off = 0, + Mono_CellLeft = 1, + Mono_CellCenter = 2, + Mono_CellRight = 3 +}; + +enum EPrintLevel +{ + PRINT_LOW, // pickup messages + PRINT_MEDIUM, // death messages + PRINT_HIGH, // critical messages + PRINT_CHAT, // chat messages + PRINT_TEAMCHAT, // chat messages from a teammate + PRINT_LOG, // only to logfile + PRINT_BOLD = 200, // What Printf_Bold used + PRINT_TYPES = 1023, // Bitmask. + PRINT_NONOTIFY = 1024, // Flag - do not add to notify buffer + PRINT_NOLOG = 2048, // Flag - do not print to log file +}; + struct _ native // These are the global variables, the struct is only here to avoid extending the parser for this. { native readonly Array AllClasses; - //native readonly int GameTicRate; - + native readonly bool multiplayer; + native @KeyBindings Bindings; + native @KeyBindings AutomapBindings; + native readonly @GameInfoStruct gameinfo; + native readonly ui bool netgame; + native readonly uint gameaction; + native readonly int gamestate; native readonly Font smallfont; native readonly Font smallfont2; native readonly Font bigfont; @@ -22,10 +168,19 @@ struct _ native // These are the global variables, the struct is only here to av native readonly int CleanYFac_1; native readonly int CleanWidth_1; native readonly int CleanHeight_1; + native ui int menuactive; + native readonly @FOptionMenuSettings OptionMenuSettings; + native readonly bool demoplayback; + native ui int BackbuttonTime; + native ui float BackbuttonAlpha; native readonly @MusPlayingInfo musplaying; + native readonly bool generic_ui; + native readonly int GameTicRate; + native MenuDelegateBase menuDelegate; + native readonly int consoleplayer; + native readonly double NotifyFontScale; } - struct MusPlayingInfo native { native String name; @@ -76,7 +231,7 @@ struct TexMan NOT_FLAT = 24 }; - native static TextureID CheckForTexture(String name, int usetype, int flags = TryAny); + native static TextureID CheckForTexture(String name, int usetype = Type_Any, int flags = TryAny); native static String GetName(TextureID tex); native static int, int GetSize(TextureID tex); native static Vector2 GetScaledSize(TextureID tex); @@ -85,6 +240,30 @@ struct TexMan native static bool OkForLocalization(TextureID patch, String textSubstitute); } +enum EScaleMode +{ + FSMode_None = 0, + FSMode_ScaleToFit = 1, + FSMode_ScaleToFill = 2, + FSMode_ScaleToFit43 = 3, + FSMode_ScaleToScreen = 4, + FSMode_ScaleToFit43Top = 5, + FSMode_ScaleToFit43Bottom = 6, + FSMode_ScaleToHeight = 7, + + + FSMode_Max, + + // These all use ScaleToFit43, their purpose is to cut down on verbosity because they imply the virtual screen size. + FSMode_Predefined = 1000, + FSMode_Fit320x200 = 1000, + FSMode_Fit320x240, + FSMode_Fit640x400, + FSMode_Fit640x480, + FSMode_Fit320x200Top, + FSMode_Predefined_Max, +}; + enum DrawTextureTags { TAG_USER = (1<<30), @@ -170,6 +349,7 @@ enum DrawTextureTags DTA_FlipOffsets, // Flips offsets when using DTA_FlipX and DTA_FlipY, this cannot be automatic due to unexpected behavior with unoffsetted graphics. DTA_Indexed, // Use an indexed texture combined with the given translation. DTA_CleanTop, // Like DTA_Clean but aligns to the top of the screen instead of the center. + DTA_NoOffset, // Ignore 2D drawer's offset. }; @@ -211,14 +391,16 @@ struct Screen native native static vararg void DrawChar(Font font, int normalcolor, double x, double y, int character, ...); native static vararg void DrawText(Font font, int normalcolor, double x, double y, String text, ...); native static void DrawLine(int x0, int y0, int x1, int y1, Color color, int alpha = 255); + native static void DrawLineFrame(Color color, int x0, int y0, int w, int h, int thickness = 1); native static void DrawThickLine(int x0, int y0, int x1, int y1, double thickness, Color color, int alpha = 255); - native static Vector2, Vector2 VirtualToRealCoords(Vector2 pos, Vector2 size, Vector2 vsize, bool vbottom=false, int handleaspect=0); + native static Vector2, Vector2 VirtualToRealCoords(Vector2 pos, Vector2 size, Vector2 vsize, bool vbottom=false, bool handleaspect=true); native static double GetAspectRatio(); native static void SetClipRect(int x, int y, int w, int h); native static void ClearClipRect(); native static int, int, int, int GetClipRect(); - //native static int, int, int, int GetViewWindow(); + native static int, int, int, int GetViewWindow(); native static double, double, double, double GetFullscreenRect(double vwidth, double vheight, int fsmode); + native static Vector2 SetOffset(double x, double y); } struct Font native @@ -304,6 +486,7 @@ struct Font native native static Font FindFont(Name fontname); native static Font GetFont(Name fontname); native BrokenLines BreakLines(String text, int maxlen); + native int GetGlyphHeight(int code); } struct Console native @@ -325,7 +508,6 @@ struct CVar native }; native static CVar FindCVar(Name name); - //native static CVar GetCVar(Name name, PlayerInfo player = null); bool GetBool() { return GetInt(); } native int GetInt(); native double GetFloat(); @@ -344,6 +526,19 @@ struct GIFont version("2.4") Name color; }; +struct GameInfoStruct native +{ + native int gametype; + native String mBackButton; + native Name mSliderColor; +} + +struct SystemTime +{ + native static ui int Now(); // This returns the epoch time + native static clearscope String Format(String timeForm, int timeVal); // This converts an epoch time to a local time, then uses the strftime syntax to format it +} + class Object native { const TICRATE = 35; @@ -462,3 +657,12 @@ struct StringStruct native native int CodePointCount() const; native int, int GetNextCodePoint(int position) const; } + +struct Translation version("2.4") +{ + static int MakeID(int group, int num) + { + return (group << 16) + num; + } +} + diff --git a/wadsrc/static/zscript/constants.zs b/wadsrc/static/zscript/constants.zs index 4ccf98c2c..3110cee4a 100644 --- a/wadsrc/static/zscript/constants.zs +++ b/wadsrc/static/zscript/constants.zs @@ -1,74 +1,4 @@ -// constants for A_PlaySound -enum ESoundFlags -{ - CHAN_AUTO = 0, - CHAN_WEAPON = 1, - CHAN_VOICE = 2, - CHAN_ITEM = 3, - CHAN_BODY = 4, - CHAN_5 = 5, - CHAN_6 = 6, - CHAN_7 = 7, - - // modifier flags - CHAN_LISTENERZ = 8, - CHAN_MAYBE_LOCAL = 16, - CHAN_UI = 32, - CHAN_NOPAUSE = 64, - CHAN_LOOP = 256, - CHAN_PICKUP = (CHAN_ITEM|CHAN_MAYBE_LOCAL), // Do not use this with A_StartSound! It would not do what is expected. - CHAN_NOSTOP = 4096, - CHAN_OVERLAP = 8192, - - // Same as above, with an F appended to allow better distinction of channel and channel flags. - CHANF_DEFAULT = 0, // just to make the code look better and avoid literal 0's. - CHANF_LISTENERZ = 8, - CHANF_MAYBE_LOCAL = 16, - CHANF_UI = 32, - CHANF_NOPAUSE = 64, - CHANF_LOOP = 256, - CHANF_NOSTOP = 4096, - CHANF_OVERLAP = 8192, - CHANF_LOCAL = 16384, - - - CHANF_LOOPING = CHANF_LOOP | CHANF_NOSTOP, // convenience value for replicating the old 'looping' boolean. - -}; - -// sound attenuation values -const ATTN_NONE = 0; -const ATTN_NORM = 1; -const ATTN_IDLE = 1.001; -const ATTN_STATIC = 3; - - -enum ERenderStyle -{ - STYLE_None, // Do not draw - STYLE_Normal, // Normal; just copy the image to the screen - STYLE_Fuzzy, // Draw silhouette using "fuzz" effect - STYLE_SoulTrans, // Draw translucent with amount in r_transsouls - STYLE_OptFuzzy, // Draw as fuzzy or translucent, based on user preference - STYLE_Stencil, // Fill image interior with alphacolor - STYLE_Translucent, // Draw translucent - STYLE_Add, // Draw additive - STYLE_Shaded, // Treat patch data as alpha values for alphacolor - STYLE_TranslucentStencil, - STYLE_Shadow, - STYLE_Subtract, // Actually this is 'reverse subtract' but this is what normal people would expect by 'subtract'. - STYLE_AddStencil, // Fill image interior with alphacolor - STYLE_AddShaded, // Treat patch data as alpha values for alphacolor - STYLE_Multiply, // Multiply source with destination (HW renderer only.) - STYLE_InverseMultiply, // Multiply source with inverse of destination (HW renderer only.) - STYLE_ColorBlend, // Use color intensity as transparency factor - STYLE_Source, // No blending (only used internally) - STYLE_ColorAdd, // Use color intensity as transparency factor and blend additively. - -}; - - enum ETranslationTable { TRANSLATION_Invalid, @@ -76,71 +6,25 @@ enum ETranslationTable TRANSLATION_Remap, }; -enum EGameState +enum gameaction_t : int { - GS_LEVEL, - GS_INTERMISSION, - GS_FINALE, - GS_MENUSCREEN, - GS_FULLCONSOLE, - GS_HIDECONSOLE, - GS_STARTUP, - GS_TITLELEVEL, -} + ga_nothing, + ga_level, // Switch to play mode without any initialization + ga_intro, + ga_intermission, -const TEXTCOLOR_BRICK = "\034A"; -const TEXTCOLOR_TAN = "\034B"; -const TEXTCOLOR_GRAY = "\034C"; -const TEXTCOLOR_GREY = "\034C"; -const TEXTCOLOR_GREEN = "\034D"; -const TEXTCOLOR_BROWN = "\034E"; -const TEXTCOLOR_GOLD = "\034F"; -const TEXTCOLOR_RED = "\034G"; -const TEXTCOLOR_BLUE = "\034H"; -const TEXTCOLOR_ORANGE = "\034I"; -const TEXTCOLOR_WHITE = "\034J"; -const TEXTCOLOR_YELLOW = "\034K"; -const TEXTCOLOR_UNTRANSLATED = "\034L"; -const TEXTCOLOR_BLACK = "\034M"; -const TEXTCOLOR_LIGHTBLUE = "\034N"; -const TEXTCOLOR_CREAM = "\034O"; -const TEXTCOLOR_OLIVE = "\034P"; -const TEXTCOLOR_DARKGREEN = "\034Q"; -const TEXTCOLOR_DARKRED = "\034R"; -const TEXTCOLOR_DARKBROWN = "\034S"; -const TEXTCOLOR_PURPLE = "\034T"; -const TEXTCOLOR_DARKGRAY = "\034U"; -const TEXTCOLOR_CYAN = "\034V"; -const TEXTCOLOR_ICE = "\034W"; -const TEXTCOLOR_FIRE = "\034X"; -const TEXTCOLOR_SAPPHIRE = "\034Y"; -const TEXTCOLOR_TEAL = "\034Z"; - -const TEXTCOLOR_NORMAL = "\034-"; -const TEXTCOLOR_BOLD = "\034+"; - -const TEXTCOLOR_CHAT = "\034*"; -const TEXTCOLOR_TEAMCHAT = "\034!"; - - -enum EMonospacing -{ - Mono_Off = 0, - Mono_CellLeft = 1, - Mono_CellCenter = 2, - Mono_CellRight = 3 -}; - -enum EPrintLevel -{ - PRINT_LOW, // pickup messages - PRINT_MEDIUM, // death messages - PRINT_HIGH, // critical messages - PRINT_CHAT, // chat messages - PRINT_TEAMCHAT, // chat messages from a teammate - PRINT_LOG, // only to logfile - PRINT_BOLD = 200, // What Printf_Bold used - PRINT_TYPES = 1023, // Bitmask. - PRINT_NONOTIFY = 1024, // Flag - do not add to notify buffer - PRINT_NOLOG = 2048, // Flag - do not print to log file + ga_startup, // go back to intro after uninitializing the game state + ga_mainmenu, // go back to main menu after uninitializing the game state + ga_mainmenunostopsound, // Same but doesn't stop playing sounds. + ga_creditsmenu, // go to the credits menu after uninitializing the game state + ga_newgame, // start a new game + ga_recordgame, // start a new demo recording (later) + ga_loadgame, // load a savegame and resume play. + ga_loadgameplaydemo, // load a savegame and play a demo. + ga_autoloadgame, // load last autosave and resume play. + ga_savegame, // save the game + ga_autosave, // autosave the game (for triggering a save from within the game.) + ga_completed, // Level was exited. + ga_nextlevel, // Actually start the next level. + ga_loadgamehidecon }; diff --git a/wadsrc/static/zscript/games/blood/ui/menu.zs b/wadsrc/static/zscript/games/blood/ui/menu.zs new file mode 100644 index 000000000..775afb5d3 --- /dev/null +++ b/wadsrc/static/zscript/games/blood/ui/menu.zs @@ -0,0 +1,131 @@ + +//------------------------------------------------------------------------------------------- +// +// Caption drawer +// +//------------------------------------------------------------------------------------------- + +class BloodMenuDelegate : RazeMenuDelegate +{ + override int DrawCaption(String title, Font fnt, int y, bool drawit) + { + let font = generic_ui? NewConsoleFont : BigFont; // this ignores the passed font intentionally. + let texid = TexMan.CheckForTexture("MENUBAR"); + let texsize = TexMan.GetScaledSize(texid); + let fonth = font.GetGlyphHeight("A"); + if (drawit) + { + int width = font.StringWidth(title); + if (texid.isValid()) + { + double scalex = 1.; // Expand the box if the text is longer + if (texsize.X - 10 < width) scalex = width / (texsize.X - 10); + screen.DrawTexture(texid, false, 160, 20, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_CenterOffsetRel, true, DTA_ScaleX, scalex); + } + screen.DrawText(font, Font.CR_UNDEFINED, 160 - width / 2, 20 - fonth / 2, title, DTA_FullscreenScale, FSMode_Fit320x200Top); + } + double fx, fy, fw, fh; + [fx, fy, fw, fh] = Screen.GetFullscreenRect(320, 200, FSMode_ScaleToFit43Top); + int h = texid.isValid()? texsize.Y : fonth; + return int((y+h) * fh / 200); // This must be the covered height of the header in true pixels. + } + + override bool DrawSelector(ListMenuDescriptor desc) + { + return true; // do not draw any selector. + } + +} + +//------------------------------------------------------------------------------------------- +// +// The dripping blood - partially native. +// +//------------------------------------------------------------------------------------------- + +class ListMenuItemBloodDripDrawer : ListMenuItem +{ + void Init(ListMenuDescriptor desc) + { + Super.Init(0, 0); + } + + native override void Draw(bool selected, ListMenuDescriptor desc); +} + + + +//============================================================================= +// +// text item +// +//============================================================================= + +class ListMenuItemBloodTextItem : ListMenuItemTextItem +{ + void Init(ListMenuDescriptor desc, String text, String hotkey, Name child, int param = 0) + { + Super.Init(desc, text, hotkey, child, param); + } + + void InitDirect(double x, double y, int height, String hotkey, String text, Font font, int color, int color2, Name child, int param = 0) + { + Super.InitDirect(x, y, height, hotkey, text, font, color, color2, child, param); + } + + override void Draw(bool selected, ListMenuDescriptor desc) + { + int shade = Selectable()? 32: 48; + int pal = 5; + let gamefont = generic_ui ? NewSmallFont : BigFont; + int xpos = mXpos - gamefont.StringWidth(mText) / 2; + int cr = generic_ui? Font.CR_GRAY : Font.CR_UNDEFINED; + int trans = generic_ui? 0 : Translation.MakeID(Translation_Remap, pal); + + if (selected) shade = 32 - ((MSTime() * 120 / 1000) & 63); + + Screen.DrawText(gamefont, Font.CR_UNDEFINED, xpos+1, mYpos+1, mText, DTA_Color, 0xff000000, DTA_FullscreenScale, FSMode_Fit320x200); + Screen.DrawText(gamefont, Font.CR_UNDEFINED, xpos, mYpos, mText, DTA_TranslationIndex, trans, DTA_Color, Build.shadeToLight(shade), DTA_FullscreenScale, FSMode_Fit320x200); + } + +} + + +class ImageScrollerPageQavDrawer : ImageScrollerPage +{ + String qavn; + voidptr qav; + + void Init(ImageScrollerDescriptor desc, String qavname) + { + Super.Init(); + qavn = qavname; + qav = null; + } + + override void OnDestroy() + { + if (qav) DestroyQav(qav); + Super.OnDestroy(); + } + + override void Drawer(bool selected) + { + if (qav) DrawQav(qav); + } + + override void OnStartPage() + { + qav = LoadQav(qavn); + } + + override void OnEndPage() + { + if (qav) DestroyQav(qav); + qav = null; + } + + native static voidptr LoadQav(string s); + native static void DestroyQav(voidptr s); + native static void DrawQav(voidptr s); +} diff --git a/wadsrc/static/zscript/games/duke/ui/menu.zs b/wadsrc/static/zscript/games/duke/ui/menu.zs new file mode 100644 index 000000000..b0d343593 --- /dev/null +++ b/wadsrc/static/zscript/games/duke/ui/menu.zs @@ -0,0 +1,331 @@ + +class DukeMenuDelegate : RazeMenuDelegate +{ + override int DrawCaption(String title, Font fnt, int y, bool drawit) + { + let font = generic_ui? NewConsoleFont : BigFont; // this ignores the passed font intentionally. + let texid = TexMan.CheckForTexture("MENUBAR"); + let texsize = TexMan.GetScaledSize(texid); + let fonth = font.GetGlyphHeight("A"); + if (drawit) + { + int width = font.StringWidth(title); + double scalex = (gameinfo.gameType & GAMEFLAG_RRALL)? 0.4 : 1.; + double scaley = scalex; + if (texid.isValid()) + { + screen.DrawTexture(texid, false, 160, 19, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_CenterOffsetRel, true, DTA_Color, 0xff808080); + if (texsize.X - 30 < width) scalex = (texsize.X - 30) / width; // Squash the text if it doesn't fit. + } + screen.DrawText(font, Font.CR_UNTRANSLATED, 160 - width / 2 * scalex, 19 - fonth / 2 * scaley, title, DTA_ScaleX, scalex, DTA_ScaleY, scaley, DTA_FullscreenScale, FSMode_Fit320x200Top); + } + double fx, fy, fw, fh; + [fx, fy, fw, fh] = Screen.GetFullscreenRect(320, 200, FSMode_ScaleToFit43Top); + int h = texid.isValid()? texsize.Y : fonth; + return int((y+h) * fh / 200); // This must be the covered height of the header in true pixels. + } + + //---------------------------------------------------------------------------- + // + // + // + //---------------------------------------------------------------------------- + + void DrawCursor(double x, double y, double scale, bool right) + { + uint mclock = MSTime() * 120 / 1000; + uint frames = (gameinfo.gametype & GAMEFLAG_RRALL) ? 16 : 7; + String picname; + if (!right) picname= String.Format("SPINNINGNUKEICON%d", ((mclock >> 3) % frames)); + else picname = String.Format("SPINNINGNUKEICON%d", frames - 1 - ((frames - 1 + (mclock >> 3)) % frames)); + int light = 231 + (Build.calcSinTableValue(mclock<<5) / 768.); + let pe = color(255, light, light, light); + Screen.DrawTexture(TexMan.CheckForTexture(picname), false, x, y, DTA_FullscreenScale, FSMode_Fit320x200, DTA_ScaleX, scale, DTA_ScaleY, scale, DTA_Color, pe, DTA_CenterOffsetRel, true); + } + + override bool DrawSelector(ListMenuDescriptor desc) + { + int cursorOffset = 110; + double cursorScale = (gameinfo.gametype & GAMEFLAG_RRALL) ? 0.2 : 1.0; + double ymid = desc.mItems[desc.mSelectedItem].GetY() + 7; // half height must be hardcoded or layouts will break. + DrawCursor(160 + cursorOffset, ymid, cursorScale, false); + DrawCursor(169 - cursorOffset, ymid, cursorScale, true); + return true; + } + + //---------------------------------------------------------------------------- + // + // + // + //---------------------------------------------------------------------------- + + static void shadowminitext(int xx, int yy, String t, int p) + { + double x = xx / 65536.; + double y = yy / 65536.; + + Screen.DrawText(SmallFont2, Font.CR_UNDEFINED, x + 1, y + 1, t, DTA_FullscreenScale, FSMode_Fit320x200, DTA_Color, 0xff000000, DTA_Alpha, 0.5); + Screen.DrawText(SmallFont2, Font.CR_UNDEFINED, x, y, t, DTA_FullscreenScale, FSMode_Fit320x200, DTA_TranslationIndex, TRANSLATION.MakeID(Translation_Remap, p)); + } + + static void mgametextcenter(int xx, int yy, String t) + { + double x = xx / 65536. + 160. - SmallFont.StringWidth(t) * 0.5; + double y = yy / 65536.; + + Screen.DrawText(SmallFont, Font.CR_UNDEFINED, x, y + 2, t, DTA_FullscreenScale, FSMode_Fit320x200); + } + + +} + +//---------------------------------------------------------------------------- +// +// Logo +// +//---------------------------------------------------------------------------- + +class ListMenuItemDukeLogo : ListMenuItem +{ + const x = 160; + + void Init(ListMenuDescriptor desc) + { + Super.Init(0, 0); + } + + override void Draw(bool selected, ListMenuDescriptor desc) + { + if (gameinfo.gametype & GAMEFLAG_RRRA) + { + Screen.DrawTexture(TexMan.CheckForTexture("THREEDEE"), false, x-5, 57, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_ScaleX, 0.253, DTA_ScaleY, 0.253, DTA_CenterOffsetRel, true); + } + else if (gameinfo.gametype & GAMEFLAG_RR) + { + Screen.DrawTexture(TexMan.CheckForTexture("INGAMEDUKETHREEDEE"), false, x+5, 24, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_ScaleX, 0.36, DTA_ScaleY, 0.36, DTA_CenterOffsetRel, true); + } + else + { + Screen.DrawTexture(TexMan.CheckForTexture("INGAMEDUKETHREEDEE"), false, x, 29, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_CenterOffsetRel, true); + if (gameinfo.gametype & GAMEFLAG_PLUTOPAK) + { + int mclock = MSTime() * 120 / 1000; + int light = 223 + (Build.calcSinTableValue(mclock<<4) / 512.); + let pe = Color(255, light, light, light); + Screen.DrawTexture(TexMan.CheckForTexture("MENUPLUTOPAKSPRITE"), false, x + 100, 36, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_Color, pe, DTA_CenterOffsetRel, true); + } + } + + } +} + +//---------------------------------------------------------------------------- +// +// text item +// +//---------------------------------------------------------------------------- + +class ListMenuItemDukeTextItem : ListMenuItemTextItem +{ + void Init(ListMenuDescriptor desc, String text, String hotkey, Name child, int param = 0) + { + Super.Init(desc, text, hotkey, child, param); + mColorSelected = 0; + } + + void InitDirect(double x, double y, int height, String hotkey, String text, Font font, int color, int color2, Name child, int param = 0) + { + Super.InitDirect(x, y, height, hotkey, text, font, color, color2, child, param); + } + + override void Draw(bool selected, ListMenuDescriptor desc) + { + int trans = mColorSelected? Translation.MakeID(Translation_Remap, 1) : 0; + Color pe; + double scale = (gameinfo.gametype & GAMEFLAG_RRALL) ? 0.4 : 1.; + let xpos = mXpos - BigFont.StringWidth(mText) * scale * 0.5; + + if (selected) + { + int mclock = MSTime() * 120 / 1000; + int light = 231 + (Build.calcSinTableValue(mclock<<5) / 512.); + pe = Color(255, light, light, light); + } + else + { + pe = Color(255, 160, 160, 160); + } + + Screen.DrawText(BigFont, Font.CR_UNDEFINED, xpos, mYpos, mText, DTA_FullscreenScale, FSMode_Fit320x200, DTA_ScaleX, scale, DTA_ScaleY, scale, DTA_Color, pe, DTA_TranslationIndex, trans); + } + +} + +//---------------------------------------------------------------------------- +// +// Credits for Duke 1.3 +// +//---------------------------------------------------------------------------- + +class ImageScrollerPageDukeCredits1 : ImageScrollerPage +{ + + void Init(ImageScrollerDescriptor desc) + { + Super.Init(); + } + + override void Drawer(bool selected) + { + int m, l; + Screen.DrawTexture(TexMan.CheckForTexture("MENUSCREEN"), false, 160, 100, DTA_FullscreenScale, FSMode_Fit320x200, DTA_Color, 0xff808080, DTA_CenterOffset, true); + m = (20 << 16); + l = (33 << 16); + + DukeMenuDelegate.shadowminitext(m, l, "Original Concept", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Todd Replogle and Allen H. Blum III", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Produced & Directed By", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Greg Malone", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Executive Producer", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "George Broussard", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "BUILD Engine", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Ken Silverman", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Game Programming", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Todd Replogle", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "3D Engine/Tools/Net", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Ken Silverman", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Network Layer/Setup Program", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Mark Dochtermann", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Map Design", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Allen H. Blum III", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Richard Gray", 12); l += 7 << 16; + + m = (180 << 16); + l = (33 << 16); + + DukeMenuDelegate.shadowminitext(m, l, "3D Modeling", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Chuck Jones", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Sapphire Corporation", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Artwork", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Dirk Jones, Stephen Hornback", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "James Storey, David Demaret", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Douglas R. Wood", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Sound Engine", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Jim Dose", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Sound & Music Development", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Robert Prince", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Lee Jackson", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Voice Talent", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Lani Minella - Voice Producer", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Jon St. John as \"Duke Nukem\"", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Graphic Design", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Packaging, Manual, Ads", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Robert M. Atkins", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Michael Hadwin", 12); l += 7 << 16; + } +} + +class ImageScrollerPageDukeCredits2 : ImageScrollerPage +{ + + void Init(ImageScrollerDescriptor desc) + { + Super.Init(); + } + + override void Drawer(bool selected) + { + int m, l; + Screen.DrawTexture(TexMan.CheckForTexture("MENUSCREEN"), false, 160, 100, DTA_FullscreenScale, FSMode_Fit320x200, DTA_Color, 0xff808080, DTA_CenterOffset, true); + + m = (20 << 16); + l = (33 << 16); + + DukeMenuDelegate.shadowminitext(m, l, "Special Thanks To", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Steven Blackburn, Tom Hall", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Scott Miller, Joe Siegler", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Terry Nagy, Colleen Compton", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "HASH, Inc., FormGen, Inc.", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "The 3D Realms Beta Testers", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Nathan Anderson, Wayne Benner", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Glenn Brensinger, Rob Brown", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Erik Harris, Ken Heckbert", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Terry Herrin, Greg Hively", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Hank Leukart, Eric Baker", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Jeff Rausch, Kelly Rogers", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Mike Duncan, Doug Howell", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Bill Blair", 12); l += 7 << 16; + + m = (160 << 16); + l = (33 << 16); + + DukeMenuDelegate.shadowminitext(m, l, "Company Product Support", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "The following companies were cool", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "enough to give us lots of stuff", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "during the making of Duke Nukem 3D.", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Altec Lansing Multimedia", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "for tons of speakers and the", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "THX-licensed sound system.", 12); l += 7 << 16; + DukeMenuDelegate.shadowminitext(m, l, "For info call 1-800-548-0620", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Creative Labs, Inc.", 12); l += 7 << 16; + l += 3 << 16; + DukeMenuDelegate.shadowminitext(m, l, "Thanks for the hardware, guys.", 12); l += 7 << 16; + } +} + +class ImageScrollerPageDukeCredits3 : ImageScrollerPage +{ + + void Init(ImageScrollerDescriptor desc) + { + Super.Init(); + } + + override void Drawer(bool selected) + { + let VOLUMEONE = gameinfo.gametype & GAMEFLAG_SHAREWARE; + int m, l; + Screen.DrawTexture(TexMan.CheckForTexture("MENUSCREEN"), false, 160, 100, DTA_FullscreenScale, FSMode_Fit320x200, DTA_Color, 0xff808080, DTA_CenterOffset, true); + + DukeMenuDelegate.mgametextcenter(0, (50 << 16), "Duke Nukem 3D is a trademark of"); + DukeMenuDelegate.mgametextcenter(0, (59 << 16), "3D Realms Entertainment"); + DukeMenuDelegate.mgametextcenter(0, (77 << 16), "Duke Nukem 3D"); + DukeMenuDelegate.mgametextcenter(0, (86 << 16), "(C) 1996 3D Realms Entertainment"); + + if (VOLUMEONE) + { + DukeMenuDelegate.mgametextcenter(0, (106 << 16), "Please read LICENSE.DOC for shareware"); + DukeMenuDelegate.mgametextcenter(0, (115 << 16), "distribution grants and restrictions."); + } + DukeMenuDelegate.mgametextcenter(0, ((VOLUMEONE ? 134 : 115) << 16), "Made in Dallas, Texas USA"); + } +} + +class PlayerMenu : OptionMenu +{ + override void Drawer() + { + // Hack: The team item is #3. This part doesn't work properly yet. + DrawPlayerSprite((mDesc.mSelectedItem == 3)); + Super.Drawer(); + } + + native static void DrawPlayerSprite(int sel); +} diff --git a/wadsrc/static/zscript/games/exhumed/ui/menu.zs b/wadsrc/static/zscript/games/exhumed/ui/menu.zs new file mode 100644 index 000000000..52101751d --- /dev/null +++ b/wadsrc/static/zscript/games/exhumed/ui/menu.zs @@ -0,0 +1,139 @@ + +class ExhumedMenuDelegate : RazeMenuDelegate +{ + double zoomsize; // this is the only persistent place where it can be conveniently stored. + + override int DrawCaption(String title, Font fnt, int y, bool drawit) + { + let font = generic_ui? NewConsoleFont : BigFont; // this ignores the passed font intentionally. + let cr = generic_ui ? Font.CR_FIRE : Font.CR_UNTRANSLATED; // this ignores the passed font intentionally. + let texid = TexMan.CheckForTexture("MENUBLANK"); + let texsize = TexMan.GetScaledSize(texid); + let fonth = font.GetGlyphHeight("A"); + if (drawit) + { + int width = font.StringWidth(title); + if (texid.isValid()) + { + double scalex = 1.; // Expand the box if the text is longer + if (texsize.X - 18 < width) scalex = width / (texsize.X - 18); + screen.DrawTexture(texid, false, 160, 20, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_CenterOffset, true, DTA_ScaleX, scalex); + } + screen.DrawText(font, cr, 160 - width / 2, 20 - fonth / 2, title, DTA_FullscreenScale, FSMode_Fit320x200Top); + } + double fx, fy, fw, fh; + [fx, fy, fw, fh] = Screen.GetFullscreenRect(320, 200, FSMode_ScaleToFit43Top); + int h = texid.isValid()? texsize.Y : fonth; + return int((y+h) * fh / 200); // This must be the covered height of the header in true pixels. + } + + override bool DrawSelector(ListMenuDescriptor desc) + { + double y = desc.mItems[desc.mSelectedItem].GetY(); + let tex = TexMan.CheckForTexture("MENUCURSORTILE"); + screen.DrawTexture(tex, false, 37, y - 12, DTA_FullscreenScale, FSMode_Fit320x200, DTA_TopLeft, true); + screen.DrawTexture(tex, false, 232, y - 12, DTA_FullscreenScale, FSMode_Fit320x200, DTA_TopLeft, true, DTA_FlipX, true); + return true; + } +} + +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + +class ListMenuItemExhumedPlasma : ListMenuItem +{ + void Init(ListMenuDescriptor desc) + { + Super.Init(0, 0); + } + + native override void Draw(bool selected, ListMenuDescriptor desc); +} + +class ListMenuItemExhumedLogo : ListMenuItem +{ + void Init(ListMenuDescriptor desc) + { + Super.Init(0, 0); + } + + native override void Draw(bool selected, ListMenuDescriptor desc); +} + +//---------------------------------------------------------------------------- +// +// Menu related game interface functions +// +//---------------------------------------------------------------------------- + +class ListMenuItemExhumedTextItem : ListMenuItemTextItem +{ + void Init(ListMenuDescriptor desc, String text, String hotkey, Name child, int param = 0) + { + Super.Init(desc, text, hotkey, child, param); + if (child == 'none') mEnabled = -1; + } + + void InitDirect(double x, double y, int height, String hotkey, String text, Font font, int color, int color2, Name child, int param = 0) + { + Super.InitDirect(x, y, height, hotkey, text, font, color, color2, child, param); + } + + override void Draw(bool selected, ListMenuDescriptor desc) + { + let font = generic_ui ? NewConsoleFont : BigFont; // this ignores the passed font intentionally. + let cr = generic_ui ? Font.CR_FIRE : Font.CR_UNTRANSLATED; // this ignores the passed font intentionally. + let tex = TexMan.CheckForTexture("MENUBLANK"); + let texsize = TexMan.GetScaledSize(tex); + let fonth = font.GetGlyphHeight("A"); + int width = font.StringWidth(mText); + let delegate = ExhumedMenuDelegate(menuDelegate); + let zoom = delegate ? delegate.zoomsize : 1.; + + + let v = TexMan.GetScaledSize(tex); + double y = mYpos + v.y / 2; + + int shade; + if (selected) shade = Build.CalcSinTableValue(MSTime() * 16 * 120 / 1000) >> 9; + else if (Selectable()) shade = 0; + else shade = 25; + let color = Build.shadeToLight(shade); + + double scalex = 1.; // Squash the text if it is too wide. Due to design limitations we cannot expand the box here. :( + if (texsize.X - 18 < width) + { + scalex = (texsize.X - 18) / width; + width = (texsize.X - 18); + } + + screen.DrawTexture(tex, false, 160, y, DTA_FullscreenScale, FSMode_Fit320x200, DTA_CenterOffset, true, DTA_ScaleX, scalex, DTA_Color, color, DTA_ScaleX, zoom, DTA_ScaleY, zoom); + screen.DrawText(font, cr, 160 - zoom * width / 2, y - zoom * fonth / 2, mText, DTA_FullscreenScale, FSMode_Fit320x200, DTA_Color, color, DTA_ScaleX, zoom * scalex, DTA_ScaleY, zoom); + } +} + +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- +class ExhumedMainMenu : ListMenu +{ + override void Ticker() + { + Super.Ticker(); + let delegate = ExhumedMenuDelegate(menuDelegate); + if (!delegate) return; + // handle the menu zoom-in. The zoom is stored in the delegate so that it can be accessed by code which does not receive a reference to the menu. + if (delegate.zoomsize < 1.) + { + delegate.zoomsize += 0.0625; + if (delegate.zoomsize >= 1.) + delegate.zoomsize = 1.; + } + } + +} diff --git a/wadsrc/static/zscript/games/sw/ui/menu.zs b/wadsrc/static/zscript/games/sw/ui/menu.zs new file mode 100644 index 000000000..3b317e200 --- /dev/null +++ b/wadsrc/static/zscript/games/sw/ui/menu.zs @@ -0,0 +1,113 @@ + +class SWMenuDelegate : RazeMenuDelegate +{ + override int DrawCaption(String title, Font fnt, int y, bool drawit) + { + let font = generic_ui? NewConsoleFont : BigFont; // this ignores the passed font intentionally. + let texid = TexMan.CheckForTexture("MENUBAR"); + let texsize = TexMan.GetScaledSize(texid); + let fonth = font.GetGlyphHeight("A"); + let fontscale = 1.; + if (drawit) + { + int width = font.StringWidth(title) * fontscale; + double scalex = 1.; + if (texid.isValid()) + { + if (texsize.X - 60 < width) + { + // First start squashing the font down to 0.7x the original width. + fontscale = (texsize.X - 60) / width; + if (fontscale < 0.7) + { + // If that is not enough, extend the box. + fontscale = 0.7; + width *= 0.7; + scalex = width / (texsize.X - 60); + } + else width *= fontscale; + } + screen.DrawTexture(texid, false, 160, 15, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_CenterOffsetRel, true, DTA_ScaleX, scalex); + } + screen.DrawText(font, Font.CR_UNTRANSLATED, 160 - width / 2, 17 - fonth / 2, title, DTA_FullscreenScale, FSMode_Fit320x200Top, DTA_ScaleX, fontscale); + } + double fx, fy, fw, fh; + [fx, fy, fw, fh] = Screen.GetFullscreenRect(320, 200, FSMode_ScaleToFit43Top); + int h = texid.isValid()? texsize.Y : fonth; + return int((y+h) * fh / 200); // This must be the covered height of the header in true pixels. + } + + override bool DrawSelector(ListMenuDescriptor desc) + { + let item = desc.mItems[desc.mSelectedItem]; + let x = item.GetX(); + let y = item.GetY(); + + + let tex = TexMan.CheckForTexture("YINYANG"); + + x -= TexMan.GetSize(tex) / 4 + 2; + y += 4; + + Screen.DrawTexture(tex, true, x, y, DTA_FullscreenScale, FSMode_Fit320x200, + DTA_CenterOffset, true, DTA_Color, 0xfff0f0f0, DTA_ScaleX, 0.5, DTA_ScaleY, 0.5); + return true; + } +} + +//============================================================================= +// +// logo +// +//============================================================================= + +class ListMenuItemSWLogo : ListMenuItem +{ + void Init(ListMenuDescriptor desc) + { + Super.Init(0, 0); + } + + override void Draw(bool selected, ListMenuDescriptor desc) + { + screen.DrawTexture(TexMan.CheckForTexture("shadow_warrior"), false, 160, 15, DTA_FullscreenScale, FSMode_Fit320x200, DTA_CenterOffsetRel, true, DTA_Color, 0xfff0f0f0); + } +} + +//============================================================================= +// +// text item +// +//============================================================================= + +class ListMenuItemSWTextItem : ListMenuItemTextItem +{ + void Init(ListMenuDescriptor desc, String text, String hotkey, Name child, int param = 0) + { + Super.Init(desc, text, hotkey, child, param); + if (child == 'none') mEnabled = -1; + } + + void InitDirect(double x, double y, int height, String hotkey, String text, Font font, int color, int color2, Name child, int param = 0) + { + Super.InitDirect(x, y, height, hotkey, text, font, color, color2, child, param); + } + + override void Draw(bool selected, ListMenuDescriptor desc) + { + let gamefont = generic_ui ? NewSmallFont : BigFont; + int cr = generic_ui? Font.CR_RED : Font.CR_UNDEFINED; + double scalex = 1.; + + + // The font here is very bulky and may cause problems with localized content. Account for that by squashing the text if needed. + int length = gamefont.StringWidth(mText); + if (mXpos + length > 320) + { + scalex = (315. - mXpos) / length; + } + + Screen.DrawText(BigFont, cr, mXpos, mYpos, mText, DTA_FullscreenScale, FSMode_Fit320x200, DTA_Color, !Selectable()? 0xff505050 : 0xffffffff, DTA_ScaleX, scalex); + } +} + diff --git a/wadsrc/static/zscript/razebase.zs b/wadsrc/static/zscript/razebase.zs new file mode 100644 index 000000000..4f12af4c2 --- /dev/null +++ b/wadsrc/static/zscript/razebase.zs @@ -0,0 +1,55 @@ + +enum EGameType +{ + GAMEFLAG_DUKE = 0x00000001, + GAMEFLAG_NAM = 0x00000002, + GAMEFLAG_NAPALM = 0x00000004, + GAMEFLAG_WW2GI = 0x00000008, + GAMEFLAG_ADDON = 0x00000010, + GAMEFLAG_SHAREWARE = 0x00000020, + GAMEFLAG_DUKEBETA = 0x00000060, // includes 0x20 since it's a shareware beta + GAMEFLAG_PLUTOPAK = 0x00000080, + GAMEFLAG_RR = 0x00000100, + GAMEFLAG_RRRA = 0x00000200, + GAMEFLAG_RRALL = GAMEFLAG_RR | GAMEFLAG_RRRA, + GAMEFLAG_BLOOD = 0x00000800, + GAMEFLAG_SW = 0x00001000, + GAMEFLAG_POWERSLAVE = 0x00002000, + GAMEFLAG_EXHUMED = 0x00004000, + GAMEFLAG_PSEXHUMED = GAMEFLAG_POWERSLAVE | GAMEFLAG_EXHUMED, // the two games really are the same, except for the name and the publisher. + GAMEFLAG_WORLDTOUR = 0x00008000, + GAMEFLAG_DUKEDC = 0x00010000, + GAMEFLAGMASK = 0x0000FFFF, // flags allowed from grpinfo + + // We still need these for the parsers. + GAMEFLAG_FURY = 0, + GAMEFLAG_DEER = 0, + +}; + + +struct Build +{ + static int calcSinTableValue(int ang) + { + return int(16384 * sin((360./2048) * ang)); + } + + native static Color shadeToLight(int shade); +} + +/* +struct TileFiles +{ + native static TextureID GetTexture(int tile, bool animate = false); +} +*/ + +class RazeMenuDelegate : MenuDelegateBase +{ + // Todo: Fix this so that it can be done outside the games' sound modules. + native override void PlaySound(name sname); + // This is native for security reasons. Having a script call to open the console could be subject to abuse. + native override void MenuDismissed(); + +} diff --git a/wadsrc/static/zscript/ui/menu/colorpickermenu.zs b/wadsrc/static/zscript/ui/menu/colorpickermenu.zs new file mode 100644 index 000000000..f8ce51874 --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/colorpickermenu.zs @@ -0,0 +1,355 @@ +/* +** colorpickermenu.txt +** The color picker menu +** +**--------------------------------------------------------------------------- +** Copyright 2010-2017 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. +**--------------------------------------------------------------------------- +** +*/ + + +//============================================================================= +// +// This is only used by the color picker +// +//============================================================================= + +class OptionMenuSliderVar : OptionMenuSliderBase +{ + int mIndex; + + OptionMenuSliderVar Init(String label, int index, double min, double max, double step, int showval) + { + Super.Init(label, min, max, step, showval); + mIndex = index; + return self; + } + + override double GetSliderValue() + { + return ColorpickerMenu(Menu.GetCurrentMenu()).GetColor(mIndex); + } + + override void SetSliderValue(double val) + { + ColorpickerMenu(Menu.GetCurrentMenu()).setColor(mIndex, val); + } +} + +class ColorpickerMenu : OptionMenu +{ + float mRed; + float mGreen; + float mBlue; + + int mGridPosX; + int mGridPosY; + + int mStartItem; + + CVar mCVar; + + double GetColor(int index) + { + double v = index == 0? mRed : index == 1? mGreen : mBlue; + return v; + } + + void SetColor(int index, double val) + { + if (index == 0) mRed = val; + else if (index == 1) mGreen = val; + else mBlue = val; + } + + //============================================================================= + // + // + // + //============================================================================= + + void Init(Menu parent, String name, OptionMenuDescriptor desc, CVar cv) + { + Super.Init(parent, desc); + + mStartItem = mDesc.mItems.Size(); + mCVar = cv; + + ResetColor(); + mGridPosX = 0; + mGridPosY = 0; + + // This menu uses some features that are hard to implement in an external control lump + // so it creates its own list of menu items. + mDesc.mItems.Resize(mStartItem+8); + mDesc.mItems[mStartItem+0] = new ("OptionMenuItemStaticText").Init(name, false); + mDesc.mItems[mStartItem+1] = new ("OptionMenuItemStaticText").Init(" ", false); + mDesc.mItems[mStartItem+2] = new ("OptionMenuSliderVar").Init("$TXT_COLOR_RED", 0, 0, 255, 15, 0); + mDesc.mItems[mStartItem+3] = new ("OptionMenuSliderVar").Init("$TXT_COLOR_GREEN", 1, 0, 255, 15, 0); + mDesc.mItems[mStartItem+4] = new ("OptionMenuSliderVar").Init("$TXT_COLOR_BLUE", 2, 0, 255, 15, 0); + mDesc.mItems[mStartItem+5] = new ("OptionMenuItemStaticText").Init(" ", false); + mDesc.mItems[mStartItem+6] = new ("OptionMenuItemCommand").Init("$TXT_UNDOCHANGES", "undocolorpic"); + mDesc.mItems[mStartItem+7] = new ("OptionMenuItemStaticText").Init(" ", false); + mDesc.mSelectedItem = mStartItem + 2; + mDesc.mIndent = 0; + mDesc.CalcIndent(); + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool MenuEvent (int mkey, bool fromcontroller) + { + switch (mkey) + { + case MKEY_Down: + if (mDesc.mSelectedItem == mStartItem+6) // last valid item + { + MenuSound ("menu/cursor"); + mGridPosY = 0; + // let it point to the last static item so that the super class code still has a valid item + mDesc.mSelectedItem = mStartItem+7; + return true; + } + else if (mDesc.mSelectedItem == mStartItem+7) + { + if (mGridPosY < 15) + { + MenuSound ("menu/cursor"); + mGridPosY++; + } + return true; + } + break; + + case MKEY_Up: + if (mDesc.mSelectedItem == mStartItem+7) + { + if (mGridPosY > 0) + { + MenuSound ("menu/cursor"); + mGridPosY--; + } + else + { + MenuSound ("menu/cursor"); + mDesc.mSelectedItem = mStartItem+6; + } + return true; + } + break; + + case MKEY_Left: + if (mDesc.mSelectedItem == mStartItem+7) + { + MenuSound ("menu/cursor"); + if (--mGridPosX < 0) mGridPosX = 15; + return true; + } + break; + + case MKEY_Right: + if (mDesc.mSelectedItem == mStartItem+7) + { + MenuSound ("menu/cursor"); + if (++mGridPosX > 15) mGridPosX = 0; + return true; + } + break; + + case MKEY_Enter: + if (mDesc.mSelectedItem == mStartItem+7) + { + // Choose selected palette entry + int index = mGridPosX + mGridPosY * 16; + color col = Screen.PaletteColor(index); + mRed = col.r; + mGreen = col.g; + mBlue = col.b; + MenuSound ("menu/choose"); + return true; + } + break; + } + if (mDesc.mSelectedItem >= 0 && mDesc.mSelectedItem < mStartItem+7) + { + if (mDesc.mItems[mDesc.mSelectedItem].MenuEvent(mkey, fromcontroller)) return true; + } + return Super.MenuEvent(mkey, fromcontroller); + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool MouseEvent(int type, int mx, int my) + { + int olditem = mDesc.mSelectedItem; + bool res = Super.MouseEvent(type, mx, my); + + if (mDesc.mSelectedItem == -1 || mDesc.mSelectedItem == mStartItem+7) + { + int y = (-mDesc.mPosition + BigFont.GetHeight() + mDesc.mItems.Size() * OptionMenuSettings.mLinespacing) * CleanYfac_1; + int h = (screen.GetHeight() - y) / 16; + int fh = OptionMenuSettings.mLinespacing * CleanYfac_1; + int w = fh; + int yy = y + 2 * CleanYfac_1; + int indent = (screen.GetWidth() / 2); + + if (h > fh) h = fh; + else if (h < 4) return res; // no space to draw it. + + int box_y = y - 2 * CleanYfac_1; + int box_x = indent - 16*w; + + if (mx >= box_x && mx < box_x + 16*w && my >= box_y && my < box_y + 16*h) + { + int cell_x = (mx - box_x) / w; + int cell_y = (my - box_y) / h; + + if (olditem != mStartItem+7 || cell_x != mGridPosX || cell_y != mGridPosY) + { + mGridPosX = cell_x; + mGridPosY = cell_y; + } + mDesc.mSelectedItem = mStartItem+7; + if (type == MOUSE_Release) + { + MenuEvent(MKEY_Enter, true); + if (m_use_mouse == 2) mDesc.mSelectedItem = -1; + } + res = true; + } + } + return res; + } + + //============================================================================= + // + // + // + //============================================================================= + + override void Drawer() + { + Super.Drawer(); + + if (mCVar == null) return; + int y = (-mDesc.mPosition + BigFont.GetHeight() + mDesc.mItems.Size() * OptionMenuSettings.mLinespacing) * CleanYfac_1; + int fh = OptionMenuSettings.mLinespacing * CleanYfac_1; + int h = (screen.GetHeight() - y) / 16; + int w = fh; + int yy = y; + + if (h > fh) h = fh; + else if (h < 4) return; // no space to draw it. + + int indent = (screen.GetWidth() / 2); + int p = 0; + + for(int i = 0; i < 16; i++) + { + int box_x, box_y; + int x1; + + box_y = y - 2 * CleanYfac_1; + box_x = indent - 16*w; + for (x1 = 0; x1 < 16; ++x1) + { + screen.Clear (box_x, box_y, box_x + w, box_y + h, 0, p); + if ((mDesc.mSelectedItem == mStartItem+7) && + (/*p == CurrColorIndex ||*/ (i == mGridPosY && x1 == mGridPosX))) + { + int r, g, b; + Color col; + double blinky; + if (i == mGridPosY && x1 == mGridPosX) + { + r = 255; g = 128; b = 0; + } + else + { + r = 200; g = 200; b = 255; + } + // Make sure the cursors stand out against similar colors + // by pulsing them. + blinky = abs(sin(MSTime()/1000.0)) * 0.5 + 0.5; + col = Color(255, int(r*blinky), int(g*blinky), int(b*blinky)); + + screen.Clear (box_x, box_y, box_x + w, box_y + 1, col); + screen.Clear (box_x, box_y + h-1, box_x + w, box_y + h, col); + screen.Clear (box_x, box_y, box_x + 1, box_y + h, col); + screen.Clear (box_x + w - 1, box_y, box_x + w, box_y + h, col); + } + box_x += w; + p++; + } + y += h; + } + y = yy; + color newColor = Color(255, int(mRed), int(mGreen), int(mBlue)); + color oldColor = mCVar.GetInt() | 0xFF000000; + + int x = screen.GetWidth()*2/3; + + screen.Clear (x, y, x + 48*CleanXfac_1, y + 48*CleanYfac_1, oldColor); + screen.Clear (x + 48*CleanXfac_1, y, x + 48*2*CleanXfac_1, y + 48*CleanYfac_1, newColor); + + y += 49*CleanYfac_1; + screen.DrawText (SmallFont, Font.CR_GRAY, x+(48-SmallFont.StringWidth("---->")/2)*CleanXfac_1, y, "---->", DTA_CleanNoMove_1, true); + } + + override void OnDestroy() + { + if (mStartItem >= 0) + { + mDesc.mItems.Resize(mStartItem); + if (mCVar != null) + { + mCVar.SetInt(Color(int(mRed), int(mGreen), int(mBlue))); + } + mStartItem = -1; + } + } + + override void ResetColor() + { + if (mCVar != null) + { + Color clr = Color(mCVar.GetInt()); + mRed = clr.r; + mGreen = clr.g; + mBlue = clr.b; + } + } +} \ No newline at end of file diff --git a/wadsrc/static/zscript/ui/menu/imagescroller.zs b/wadsrc/static/zscript/ui/menu/imagescroller.zs new file mode 100644 index 000000000..a5e581c71 --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/imagescroller.zs @@ -0,0 +1,283 @@ +/* +** imagescroller.cpp +** Scrolls through multiple fullscreen image pages, +** +**--------------------------------------------------------------------------- +** Copyright 2019-220 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. +**--------------------------------------------------------------------------- +** +*/ + +class ImageScrollerDescriptor : MenuDescriptor native +{ + native Array mItems; + native Font textFont; + native TextureID textBackground; + native Color textBackgroundBrightness; + native double textScale; + native bool mAnimatedTransition; + native int virtWidth, virtHeight; +} + +class ImageScrollerPage : MenuItemBase +{ + int virtWidth, virtHeight; + + protected void DrawText(Font fnt, int color, double x, double y, String text) + { + screen.DrawText(fnt, color, x, y, text, DTA_VirtualWidth, virtWidth, DTA_VirtualHeight, virtHeight, DTA_FullscreenScale, FSMode_ScaleToFit43); + } + + protected void DrawTexture(TextureID tex, double x, double y) + { + screen.DrawTexture(tex, true, x, y, DTA_VirtualWidth, virtWidth, DTA_VirtualHeight, virtHeight, DTA_FullscreenScale, FSMode_ScaleToFit43); + } + + virtual void OnStartPage() + {} + + virtual void OnEndPage() + {} +} + +//============================================================================= +// +// an image page +// +//============================================================================= + +class ImageScrollerPageImageItem : ImageScrollerPage +{ + TextureID mTexture; + + void Init(ImageScrollerDescriptor desc, String patch) + { + Super.Init(); + mTexture = TexMan.CheckForTexture(patch); + } + + override void Drawer(bool selected) + { + Screen.DrawTexture(mTexture, true, 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, DTA_LegacyRenderStyle, STYLE_Normal); + } +} + +//============================================================================= +// +// a simple text page +// +//============================================================================= + +class ImageScrollerPageTextItem : ImageScrollerPage +{ + Font mFont; + BrokenLines mText; + TextureID mTexture; + Color mBrightness; + double mTextScale; + + void Init(ImageScrollerDescriptor desc, String txt, int y = -1) + { + Super.Init(); + mTexture = desc.textBackground; + mBrightness = desc.textBackgroundBrightness; + mFont = desc.textFont; + mTextScale = desc.textScale; + virtWidth = desc.virtWidth; + virtHeight = desc.virtHeight; + + mText = mFont.BreakLines(Stringtable.Localize(txt.Filter()), virtWidth / mTextScale); + mYpos = y >= 0? y : virtHeight / 2 - mText.Count() * mFont.GetHeight() * mTextScale / 2; + + } + + override void Drawer(bool selected) + { + Screen.DrawTexture(mTexture, true, 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, DTA_LegacyRenderStyle, STYLE_Normal, DTA_Color, mBrightness); + + int fontheight = mFont.GetHeight() * mTextScale; + let y = mYpos; + let c = mText.Count(); + for (int i = 0; i < c; i++) + { + screen.DrawText (mFont, Font.CR_UNTRANSLATED, virtWidth/2 - mText.StringWidth(i) * mTextScale / 2, y, mText.StringAt(i), DTA_ScaleX, mTextScale, DTA_ScaleY, mTextScale, + DTA_VirtualWidth, virtWidth, DTA_VirtualHeight, virtHeight, DTA_FullscreenScale, FSMode_ScaleToFit43); + y += fontheight; + } + } +} + +//============================================================================= +// +// The main class +// +//============================================================================= + +class ImageScrollerMenu : Menu +{ + ImageScrollerPage previous; + ImageScrollerPage current; + + double start; + int length; + int dir; + int index; + ImageScrollerDescriptor mDesc; + + + private void StartTransition(ImageScrollerPage to, int animtype) + { + if (AnimatedTransition) + { + start = MSTime() * (120. / 1000.); + length = 30; + dir = animtype; + previous = current; + } + to.onStartPage(); + current = to; + } + + virtual void Init(Menu parent, ImageScrollerDescriptor desc) + { + mParentMenu = parent; + index = 0; + mDesc = desc; + AnimatedTransition = desc.mAnimatedTransition; + current = mDesc.mItems[0]; + current.onStartPage(); + previous = null; + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool MenuEvent(int mkey, bool fromcontroller) + { + if (mDesc.mItems.Size() <= 1) + { + if (mkey == MKEY_Enter) mkey = MKEY_Back; + else if (mkey == MKEY_Right || mkey == MKEY_Left) return true; + } + switch (mkey) + { + case MKEY_Back: + // Before going back the currently running transition must be terminated. + previous = null; + return Super.MenuEvent(mkey, fromcontroller); + + + case MKEY_Left: + if (previous == null) + { + if (--index < 0) index = mDesc.mItems.Size() - 1; + let next = mDesc.mItems[index]; + StartTransition(next, -1); + MenuSound("menu/choose"); + } + return true; + + case MKEY_Right: + case MKEY_Enter: + if (previous == null) + { + int oldindex = index; + if (++index >= mDesc.mItems.Size()) index = 0; + let next = mDesc.mItems[index]; + StartTransition(next, 1); + MenuSound("menu/choose"); + } + return true; + + default: + return Super.MenuEvent(mkey, fromcontroller); + } + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool MouseEvent(int type, int x, int y) + { + // Todo: Implement some form of drag event to switch between pages. + if (type == MOUSE_Release) + { + return MenuEvent(MKEY_Enter, false); + } + return Super.MouseEvent(type, x, y); + } + + //============================================================================= + // + // + // + //============================================================================= + + private bool DrawTransition() + { + double now = MSTime() * (120. / 1000.); + if (now < start + length) + { + double factor = screen.GetWidth()/2; + double phase = (now - start) / length * 180. + 90.; + + screen.SetOffset(factor * dir * (sin(phase) - 1.), 0); + previous.Drawer(false); + screen.SetOffset(factor * dir * (sin(phase) + 1.), 0); + current.Drawer(false); + screen.SetOffset(0, 0); + return true; + } + previous.OnEndPage(); + previous = null; + return false; + } + + //============================================================================= + // + // + // + //============================================================================= + + override void Drawer() + { + if (previous != null) + { + Animated = true; + if (DrawTransition()) return; + previous = null; + } + current.Drawer(false); + Animated = false; + } +} diff --git a/wadsrc/static/zscript/ui/menu/joystickmenu.zs b/wadsrc/static/zscript/ui/menu/joystickmenu.zs new file mode 100644 index 000000000..48b5840e7 --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/joystickmenu.zs @@ -0,0 +1,312 @@ +/* +** joystickmenu.cpp +** The joystick configuration menus +** +**--------------------------------------------------------------------------- +** Copyright 2010-2017 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. +**--------------------------------------------------------------------------- +** +*/ + +//============================================================================= +// +// +// +//============================================================================= + +class OptionMenuSliderJoySensitivity : OptionMenuSliderBase +{ + JoystickConfig mJoy; + + OptionMenuSliderJoySensitivity Init(String label, double min, double max, double step, int showval, JoystickConfig joy) + { + Super.Init(label, min, max, step, showval); + mJoy = joy; + return self; + } + + override double GetSliderValue() + { + return mJoy.GetSensitivity(); + } + + override void SetSliderValue(double val) + { + mJoy.SetSensitivity(val); + } +} + +//============================================================================= +// +// +// +//============================================================================= + +class OptionMenuSliderJoyScale : OptionMenuSliderBase +{ + int mAxis; + int mNeg; + JoystickConfig mJoy; + + OptionMenuSliderJoyScale Init(String label, int axis, double min, double max, double step, int showval, JoystickConfig joy) + { + Super.Init(label, min, max, step, showval); + mAxis = axis; + mNeg = 1; + mJoy = joy; + return self; + } + + override double GetSliderValue() + { + double d = mJoy.GetAxisScale(mAxis); + mNeg = d < 0? -1:1; + return d; + } + + override void SetSliderValue(double val) + { + mJoy.SetAxisScale(mAxis, val * mNeg); + } +} + +//============================================================================= +// +// +// +//============================================================================= + +class OptionMenuSliderJoyDeadZone : OptionMenuSliderBase +{ + int mAxis; + int mNeg; + JoystickConfig mJoy; + + OptionMenuSliderJoyDeadZone Init(String label, int axis, double min, double max, double step, int showval, JoystickConfig joy) + { + Super.Init(label, min, max, step, showval); + mAxis = axis; + mNeg = 1; + mJoy = joy; + return self; + } + + override double GetSliderValue() + { + double d = mJoy.GetAxisDeadZone(mAxis); + mNeg = d < 0? -1:1; + return d; + } + + override void SetSliderValue(double val) + { + mJoy.SetAxisDeadZone(mAxis, val * mNeg); + } +} + +//============================================================================= +// +// +// +//============================================================================= + +class OptionMenuItemJoyMap : OptionMenuItemOptionBase +{ + int mAxis; + JoystickConfig mJoy; + + OptionMenuItemJoyMap Init(String label, int axis, Name values, int center, JoystickConfig joy) + { + Super.Init(label, 'none', values, null, center); + mAxis = axis; + mJoy = joy; + return self; + } + + override int GetSelection() + { + double f = mJoy.GetAxisMap(mAxis); + let opt = OptionValues.GetCount(mValues); + if (opt > 0) + { + // Map from joystick axis to menu selection. + for(int i = 0; i < opt; i++) + { + if (f ~== OptionValues.GetValue(mValues, i)) + { + return i; + } + } + } + return -1; + } + + override void SetSelection(int selection) + { + let opt = OptionValues.GetCount(mValues); + // Map from menu selection to joystick axis. + if (opt == 0 || selection >= opt) + { + selection = JoystickConfig.JOYAXIS_None; + } + else + { + selection = int(OptionValues.GetValue(mValues, selection)); + } + mJoy.SetAxisMap(mAxis, selection); + } +} + +//============================================================================= +// +// +// +//============================================================================= + +class OptionMenuItemInverter : OptionMenuItemOptionBase +{ + int mAxis; + JoystickConfig mJoy; + + OptionMenuItemInverter Init(String label, int axis, int center, JoystickConfig joy) + { + Super.Init(label, "none", "YesNo", NULL, center); + mAxis = axis; + mJoy = joy; + return self; + } + + override int GetSelection() + { + float f = mJoy.GetAxisScale(mAxis); + return f > 0? 0:1; + } + + override void SetSelection(int Selection) + { + let f = abs(mJoy.GetAxisScale(mAxis)); + if (Selection) f*=-1; + mJoy.SetAxisScale(mAxis, f); + } +} + +//============================================================================= +// +// Executes a CCMD, action is a CCMD name +// +//============================================================================= + +class OptionMenuItemJoyConfigMenu : OptionMenuItemSubmenu +{ + JoystickConfig mJoy; + + OptionMenuItemJoyConfigMenu Init(String label, JoystickConfig joy) + { + Super.Init(label, "JoystickConfigMenu"); + mJoy = joy; + return self; + } + + override bool Activate() + { + let desc = OptionMenuDescriptor(MenuDescriptor.GetDescriptor('JoystickConfigMenu')); + if (desc != NULL) + { + SetController(OptionMenuDescriptor(desc), mJoy); + } + let res = Super.Activate(); + let joymenu = JoystickConfigMenu(Menu.GetCurrentMenu()); + if (res && joymenu != null) joymenu.mJoy = mJoy; + return res; + } + + static void SetController(OptionMenuDescriptor opt, JoystickConfig joy) + { + OptionMenuItem it; + opt.mItems.Clear(); + if (joy == NULL) + { + opt.mTitle = "$JOYMNU_CONFIG"; + it = new("OptionMenuItemStaticText").Init("$JOYMNU_INVALID", false); + opt.mItems.Push(it); + } + else + { + it = new("OptionMenuItemStaticText").Init(joy.GetName(), false); + it = new("OptionMenuItemStaticText").Init("", false); + + it = new("OptionMenuSliderJoySensitivity").Init("$JOYMNU_OVRSENS", 0, 2, 0.1, 3, joy); + opt.mItems.Push(it); + it = new("OptionMenuItemStaticText").Init(" ", false); + opt.mItems.Push(it); + + if (joy.GetNumAxes() > 0) + { + it = new("OptionMenuItemStaticText").Init("$JOYMNU_AXIS", true); + opt.mItems.Push(it); + + for (int i = 0; i < joy.GetNumAxes(); ++i) + { + it = new("OptionMenuItemStaticText").Init(" ", false); + opt.mItems.Push(it); + + it = new("OptionMenuItemJoyMap").Init(joy.GetAxisName(i), i, "JoyAxisMapNames", false, joy); + opt.mItems.Push(it); + it = new("OptionMenuSliderJoyScale").Init("$JOYMNU_OVRSENS", i, 0, 4, 0.1, 3, joy); + opt.mItems.Push(it); + it = new("OptionMenuItemInverter").Init("$JOYMNU_INVERT", i, false, joy); + opt.mItems.Push(it); + it = new("OptionMenuSliderJoyDeadZone").Init("$JOYMNU_DEADZONE", i, 0, 0.9, 0.05, 3, joy); + opt.mItems.Push(it); + } + } + else + { + it = new("OptionMenuItemStaticText").Init("$JOYMNU_NOAXES", false); + opt.mItems.Push(it); + } + } + opt.mScrollPos = 0; + opt.mSelectedItem = -1; + opt.mIndent = 0; + opt.mPosition = -25; + opt.CalcIndent(); + } + +} + +//============================================================================= +// +// +// +//============================================================================= + +class JoystickConfigMenu : OptionMenu +{ + JoystickConfig mJoy; +} + diff --git a/wadsrc/static/zscript/ui/menu/listmenu.zs b/wadsrc/static/zscript/ui/menu/listmenu.zs new file mode 100644 index 000000000..c10256518 --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/listmenu.zs @@ -0,0 +1,300 @@ + + +class ListMenuDescriptor : MenuDescriptor native +{ + enum EScale + { + CleanScale = -1, + OptCleanScale = -2 + }; + native Array mItems; + native int mSelectedItem; + native double mSelectOfsX; + native double mSelectOfsY; + native TextureID mSelector; + native int mDisplayTop; + native double mXpos, mYpos; + native int mWLeft, mWRight; + native int mLinespacing; // needs to be stored for dynamically created menus + native int mAutoselect; // this can only be set by internal menu creation functions + native Font mFont; + native int mFontColor; + native int mFontColor2; + native bool mCenter; + native bool mAnimatedTransition; + native int mVirtWidth, mVirtHeight; + + native void Reset(); + int DisplayWidth() + { + if (mVirtWidth == OptCleanScale) return m_cleanscale ? CleanScale : 320; + return mVirtWidth; + } + int DisplayHeight() + { + if (mVirtWidth == OptCleanScale) return m_cleanscale ? CleanScale : 200; + return mVirtHeight; + } +} + +//============================================================================= +// +// list menu class runs a menu described by a DListMenuDescriptor +// +//============================================================================= + +class ListMenu : Menu +{ + ListMenuDescriptor mDesc; + MenuItemBase mFocusControl; + + virtual void Init(Menu parent = NULL, ListMenuDescriptor desc = NULL) + { + Super.Init(parent); + mDesc = desc; + AnimatedTransition = mDesc.mAnimatedTransition; + if (desc.mCenter) + { + double center = 160; + for(int i=0; i < mDesc.mItems.Size(); i++) + { + double xpos = mDesc.mItems[i].GetX(); + int width = mDesc.mItems[i].GetWidth(); + double curx = mDesc.mSelectOfsX; + + if (width > 0 && mDesc.mItems[i].Selectable()) + { + double left = 160 - (width - curx) / 2 - curx; + if (left < center) center = left; + } + } + for(int i=0;i 0) + { + mDesc.mItems[i].SetX(center); + } + } + } + // notify all items that the menu was just created. + for(int i=0;i 0) + { + // tolower + int ch = ev.KeyChar; + ch = ch >= 65 && ch < 91 ? ch + 32 : ch; + + for(int i = mDesc.mSelectedItem + 1; i < mDesc.mItems.Size(); i++) + { + if (mDesc.mitems[i].Selectable() && mDesc.mItems[i].CheckHotkey(ch)) + { + mDesc.mSelectedItem = i; + MenuSound("menu/cursor"); + return true; + } + } + for(int i = 0; i < mDesc.mSelectedItem; i++) + { + if (mDesc.mitems[i].Selectable() && mDesc.mItems[i].CheckHotkey(ch)) + { + mDesc.mSelectedItem = i; + MenuSound("menu/cursor"); + return true; + } + } + } + return Super.OnUIEvent(ev); + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool MenuEvent (int mkey, bool fromcontroller) + { + int oldSelect = mDesc.mSelectedItem; + int startedAt = mDesc.mSelectedItem; + + switch (mkey) + { + case MKEY_Up: + do + { + if (--mDesc.mSelectedItem < 0) mDesc.mSelectedItem = mDesc.mItems.Size()-1; + } + while (!mDesc.mItems[mDesc.mSelectedItem].Selectable() && mDesc.mSelectedItem != startedAt); + if (mDesc.mSelectedItem == startedAt) mDesc.mSelectedItem = oldSelect; + MenuSound("menu/cursor"); + return true; + + case MKEY_Down: + do + { + if (++mDesc.mSelectedItem >= mDesc.mItems.Size()) mDesc.mSelectedItem = 0; + } + while (!mDesc.mItems[mDesc.mSelectedItem].Selectable() && mDesc.mSelectedItem != startedAt); + if (mDesc.mSelectedItem == startedAt) mDesc.mSelectedItem = oldSelect; + MenuSound("menu/cursor"); + return true; + + case MKEY_Enter: + if (mDesc.mSelectedItem >= 0 && mDesc.mItems[mDesc.mSelectedItem].Activate()) + { + MenuSound("menu/advance"); + } + return true; + + default: + return Super.MenuEvent(mkey, fromcontroller); + } + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool MouseEvent(int type, int x, int y) + { + int sel = -1; + + int w = mDesc.DisplayWidth(); + double sx, sy; + if (w == ListMenuDescriptor.CleanScale) + { + // convert x/y from screen to virtual coordinates, according to CleanX/Yfac use in DrawTexture + x = ((x - (screen.GetWidth() / 2)) / CleanXfac) + 160; + y = ((y - (screen.GetHeight() / 2)) / CleanYfac) + 100; + } + else + { + // for fullscreen scale, transform coordinates so that for the given rect the coordinates are within (0, 0, w, h) + int h = mDesc.DisplayHeight(); + double fx, fy, fw, fh; + [fx, fy, fw, fh] = Screen.GetFullscreenRect(w, h, FSMode_ScaleToFit43); + + x = int((x - fx) * w / fw); + y = int((y - fy) * h / fh); + } + + + if (mFocusControl != NULL) + { + mFocusControl.MouseEvent(type, x, y); + return true; + } + else + { + if ((mDesc.mWLeft <= 0 || x > mDesc.mWLeft) && + (mDesc.mWRight <= 0 || x < mDesc.mWRight)) + { + for(int i=0;i= 0 && mDesc.mSelectedItem < mDesc.mItems.Size()) + { + if (!menuDelegate.DrawSelector(mDesc)) + mDesc.mItems[mDesc.mSelectedItem].DrawSelector(mDesc.mSelectOfsX, mDesc.mSelectOfsY, mDesc.mSelector, mDesc); + } + Super.Drawer(); + } + + //============================================================================= + // + // + // + //============================================================================= + + override void SetFocus(MenuItemBase fc) + { + mFocusControl = fc; + } + override bool CheckFocus(MenuItemBase fc) + { + return mFocusControl == fc; + } + override void ReleaseFocus() + { + mFocusControl = NULL; + } +} + + diff --git a/wadsrc/static/zscript/ui/menu/listmenuitems.zs b/wadsrc/static/zscript/ui/menu/listmenuitems.zs new file mode 100644 index 000000000..13d96281c --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/listmenuitems.zs @@ -0,0 +1,370 @@ +/* +** listmenu.cpp +** A simple menu consisting of a list of items +** +**--------------------------------------------------------------------------- +** Copyright 2010-2017 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. +**--------------------------------------------------------------------------- +** +*/ + + +class ListMenuItem : MenuItemBase +{ + protected void DrawText(ListMenuDescriptor desc, Font fnt, int color, double x, double y, String text, bool ontop = false) + { + int w = desc ? desc.DisplayWidth() : ListMenuDescriptor.CleanScale; + int h = desc ? desc.DisplayHeight() : -1; + if (w == ListMenuDescriptor.CleanScale) + { + screen.DrawText(fnt, color, x, y, text, ontop? DTA_CleanTop : DTA_Clean, true); + } + else + { + screen.DrawText(fnt, color, x, y, text, DTA_VirtualWidth, w, DTA_VirtualHeight, h, DTA_FullscreenScale, FSMode_ScaleToFit43); + } + } + + protected void DrawTexture(ListMenuDescriptor desc, TextureID tex, double x, double y, bool ontop = false) + { + int w = desc ? desc.DisplayWidth() : ListMenuDescriptor.CleanScale; + int h = desc ? desc.DisplayHeight() : -1; + if (w == ListMenuDescriptor.CleanScale) + { + screen.DrawTexture(tex, true, x, y, ontop ? DTA_CleanTop : DTA_Clean, true); + } + else + { + screen.DrawTexture(tex, true, x, y, DTA_VirtualWidth, w, DTA_VirtualHeight, h, DTA_FullscreenScale, FSMode_ScaleToFit43); + } + } + + virtual void DrawSelector(double xofs, double yofs, TextureID tex, ListMenuDescriptor desc = null) + { + if (tex.isNull()) + { + if ((Menu.MenuTime() % 8) < 6) + { + DrawText(desc, ConFont, OptionMenuSettings.mFontColorSelection, mXpos + xofs, mYpos + yofs + 8, "\xd"); + } + } + else + { + DrawTexture(desc, tex, mXpos + xofs, mYpos + yofs); + } + } + + // We cannot extend Drawer here because it is inherited from the parent class. + virtual void Draw(bool selected, ListMenuDescriptor desc) + { + Drawer(selected); // fall back to the legacy version, if not overridden + } +} + +//============================================================================= +// +// static patch +// +//============================================================================= + +class ListMenuItemStaticPatch : ListMenuItem +{ + TextureID mTexture; + bool mCentered; + String mSubstitute; + Font mFont; + int mColor; + + void Init(ListMenuDescriptor desc, double x, double y, TextureID patch, bool centered = false, String substitute = "") + { + Super.Init(x, y); + mTexture = patch; + mCentered = centered; + mSubstitute = substitute; + mFont = desc.mFont; + mColor = desc.mFontColor; + + } + + override void Draw(bool selected, ListMenuDescriptor desc) + { + if (!mTexture.Exists()) + { + return; + } + + double x = mXpos; + Vector2 vec = TexMan.GetScaledSize(mTexture); + + if (mSubstitute == "" || TexMan.OkForLocalization(mTexture, mSubstitute)) + { + if (mCentered) x -= vec.X / 2; + DrawTexture(desc, mTexture, x, abs(mYpos), mYpos < 0); + } + else + { + let font = generic_ui ? NewSmallFont : mFont; + if (mCentered) x -= font.StringWidth(mSubstitute) / 2; + DrawText(desc, font, mColor, x, abs(mYpos), mSubstitute, mYpos < 0); + } + } +} + +class ListMenuItemStaticPatchCentered : ListMenuItemStaticPatch +{ + void Init(ListMenuDescriptor desc, double x, double y, TextureID patch) + { + Super.Init(desc, x, y, patch, true); + } +} + +//============================================================================= +// +// static text +// +//============================================================================= + +class ListMenuItemStaticText : ListMenuItem +{ + String mText; + Font mFont; + int mColor; + bool mCentered; + + void Init(ListMenuDescriptor desc, double x, double y, String text, int color = -1) + { + Super.Init(x, y); + mText = text; + mFont = desc.mFont; + mColor = color >= 0? color : desc.mFontColor; + mCentered = false; + } + + void InitDirect(double x, double y, String text, Font font, int color = Font.CR_UNTRANSLATED, bool centered = false) + { + Super.Init(x, y); + mText = text; + mFont = font; + mColor = color; + mCentered = centered; + } + + override void Draw(bool selected, ListMenuDescriptor desc) + { + if (mText.Length() != 0) + { + let font = generic_ui? NewSmallFont : mFont; + + String text = Stringtable.Localize(mText); + + double x = mXpos; + if (mCentered) x -= font.StringWidth(text) / 2; + DrawText(desc, font, mColor, x, abs(mYpos), text, mYpos < 0); + } + } +} + +class ListMenuItemStaticTextCentered : ListMenuItemStaticText +{ + void Init(ListMenuDescriptor desc, double x, double y, String text, int color = -1) + { + Super.Init(desc, x, y, text, color); + mCentered = true; + } +} + +//============================================================================= +// +// selectable items +// +//============================================================================= + +class ListMenuItemSelectable : ListMenuItem +{ + int mHotkey; + int mHeight; + int mParam; + + protected void Init(double x, double y, int height, Name childmenu, int param = -1) + { + Super.Init(x, y, childmenu); + mHeight = height; + mParam = param; + mHotkey = 0; + } + + override bool CheckCoordinate(int x, int y) + { + return mEnabled > 0 && y >= mYpos && y < mYpos + mHeight; // no x check here + } + + override bool Selectable() + { + return mEnabled > 0; + } + + override bool CheckHotkey(int c) + { + return c > 0 && c == mHotkey; + } + + override bool Activate() + { + Menu.SetMenu(mAction, mParam); + return true; + } + + override bool MouseEvent(int type, int x, int y) + { + if (type == Menu.MOUSE_Release) + { + let m = Menu.GetCurrentMenu(); + if (m != NULL && m.MenuEvent(Menu.MKEY_Enter, true)) + { + return true; + } + } + return false; + } + + override Name, int GetAction() + { + return mAction, mParam; + } +} + +//============================================================================= +// +// text item +// +//============================================================================= + +class ListMenuItemTextItem : ListMenuItemSelectable +{ + String mText; + Font mFont; + int mColor; + int mColorSelected; + + void Init(ListMenuDescriptor desc, String text, String hotkey, Name child, int param = 0) + { + Super.Init(desc.mXpos, desc.mYpos, desc.mLinespacing, child, param); + mText = text; + mFont = desc.mFont; + mColor = desc.mFontColor; + mColorSelected = desc.mFontcolor2; + mHotkey = hotkey.GetNextCodePoint(0); + } + + void InitDirect(double x, double y, int height, String hotkey, String text, Font font, int color, int color2, Name child, int param = 0) + { + Super.Init(x, y, height, child, param); + mText = text; + mFont = font; + mColor = color; + mColorSelected = color2; + int pos = 0; + mHotkey = hotkey.GetNextCodePoint(0); + } + + override void Draw(bool selected, ListMenuDescriptor desc) + { + let font = generic_ui ? NewSmallFont : mFont; + DrawText(desc, font, selected ? mColorSelected : mColor, mXpos, mYpos, mText); + } + + override int GetWidth() + { + let font = generic_ui? NewSmallFont : mFont; + return max(1, font.StringWidth(StringTable.Localize(mText))); + } +} + +//============================================================================= +// +// patch item +// +//============================================================================= + +class ListMenuItemPatchItem : ListMenuItemSelectable +{ + TextureID mTexture; + + void Init(ListMenuDescriptor desc, TextureID patch, String hotkey, Name child, int param = 0) + { + Super.Init(desc.mXpos, desc.mYpos, desc.mLinespacing, child, param); + mHotkey = hotkey.GetNextCodePoint(0); + mTexture = patch; + } + + 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.GetNextCodePoint(0); + mTexture = patch; + } + + override void Draw(bool selected, ListMenuDescriptor desc) + { + DrawTexture(desc, mTexture, mXpos, mYpos); + } + + override int GetWidth() + { + return TexMan.GetSize(mTexture); + } + +} + +//============================================================================= +// +// caption - draws a text using the customizer's caption hook +// +//============================================================================= + +class ListMenuItemCaptionItem : ListMenuItem +{ + String mText; + Font mFont; + + void Init(ListMenuDescriptor desc, String text, String fnt = "BigFont") + { + Super.Init(0, 0); + mText = text; + mFont = Font.FindFont(fnt); + } + + override void Draw(bool selected, ListMenuDescriptor desc) + { + let font = generic_ui || !desc.mFont ? NewSmallFont : desc.mFont; + if (font && mText.Length() > 0) + { + menuDelegate.DrawCaption(mText, font, 0, true); + } + } +} + diff --git a/wadsrc/static/zscript/ui/menu/loadsavemenu.zs b/wadsrc/static/zscript/ui/menu/loadsavemenu.zs new file mode 100644 index 000000000..786dfa675 --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/loadsavemenu.zs @@ -0,0 +1,655 @@ +/* +** loacpp +** The load game and save game menus +** +**--------------------------------------------------------------------------- +** Copyright 2001-2010 Randy Heit +** Copyright 2010-2017 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. +**--------------------------------------------------------------------------- +** +*/ + + +struct SaveGameNode native +{ + native String SaveTitle; + native readonly String Filename; + native bool bOldVersion; + native bool bMissingWads; + native bool bNoDelete; +} + +struct SavegameManager native ui +{ + native int WindowSize; + native SaveGameNode quickSaveSlot; + native readonly String SaveCommentString; + + native static SavegameManager GetManager(); + native void ReadSaveStrings(); + native void UnloadSaveData(); + + native int RemoveSaveSlot(int index); + native void LoadSavegame(int Selected); + native void DoSave(int Selected, String savegamestring); + native int ExtractSaveData(int index); + native void ClearSaveStuff(); + native bool DrawSavePic(int x, int y, int w, int h); + deprecated("4.0") void DrawSaveComment(Font font, int cr, int x, int y, int scalefactor) + { + // Unfortunately, this was broken beyond repair so it now prints nothing. + } + native void SetFileInfo(int Selected); + native int SavegameCount(); + native SaveGameNode GetSavegame(int i); + native void InsertNewSaveNode(); + native bool RemoveNewSaveNode(); + +} + + + +class LoadSaveMenu : ListMenu +{ + SavegameManager manager; + int TopItem; + int Selected; + + int savepicLeft; + int savepicTop; + int savepicWidth; + int savepicHeight; + int rowHeight; + int listboxLeft; + int listboxTop; + int listboxWidth; + + int listboxRows; + int listboxHeight; + int listboxRight; + + int commentLeft; + int commentTop; + int commentWidth; + int commentHeight; + int commentRows; + + bool mEntering; + TextEnterMenu mInput; + double FontScale; + + BrokenLines BrokenSaveComment; + + + + //============================================================================= + // + // + // + //============================================================================= + + override void Init(Menu parent, ListMenuDescriptor desc) + { + Super.Init(parent, desc); + manager = SavegameManager.GetManager(); + manager.ReadSaveStrings(); + SetWindows(); + } + + private void SetWindows() + { + bool aspect43 = true; + int Width43 = screen.GetHeight() * 4 / 3; + int Left43 = (screen.GetWidth() - Width43) / 2; + + double wScale = Width43 / 640.; + + savepicLeft = Left43 + int(20 * wScale); + savepicTop = mDesc.mYpos * screen.GetHeight() / 200 ; + savepicWidth = int(240 * wScale); + savepicHeight = int(180 * wScale); + + FontScale = max(screen.GetHeight() / 480, 1); + rowHeight = int(max((NewConsoleFont.GetHeight() + 1) * FontScale, 1)); + + listboxLeft = savepicLeft + savepicWidth + int(20*wScale); + listboxTop = savepicTop; + listboxWidth = Width43 + Left43 - listboxLeft - int(30 * wScale); + int listboxHeight1 = screen.GetHeight() - listboxTop - int(20*wScale); + listboxRows = (listboxHeight1 - 1) / rowHeight; + listboxHeight = listboxRows * rowHeight + 1; + listboxRight = listboxLeft + listboxWidth; + + commentLeft = savepicLeft; + commentTop = savepicTop + savepicHeight + int(16 * wScale); + commentWidth = savepicWidth; + commentHeight = listboxHeight - savepicHeight - int(16 * wScale); + commentRows = commentHeight / rowHeight; + } + + + //============================================================================= + // + // + // + //============================================================================= + + override void OnDestroy() + { + //manager.ClearSaveStuff (); + Super.OnDestroy(); + } + + //============================================================================= + // + // + // + //============================================================================= + + virtual void DrawFrame(int left, int top, int width, int height) + { + let framecolor = Color(255, 80, 80, 80); + Screen.DrawLineFrame(framecolor, left, top, width, height, screen.GetHeight() / 240); + } + + override void Drawer () + { + Super.Drawer(); + + SaveGameNode node; + int i; + int j; + bool didSeeSelected = false; + + // Draw picture area + if (gameaction == ga_loadgame || gameaction == ga_loadgamehidecon || gameaction == ga_savegame) + { + return; + } + + SetWindows(); + DrawFrame(savepicLeft, savepicTop, savepicWidth, savepicHeight); + if (!manager.DrawSavePic(savepicLeft, savepicTop, savepicWidth, savepicHeight)) + { + screen.Dim(0, 0.6, savepicLeft, savepicTop, savepicWidth, savepicHeight); + + if (manager.SavegameCount() > 0) + { + if (Selected >= manager.SavegameCount()) Selected = 0; + String text = (Selected == -1 || !manager.GetSavegame(Selected).bOldVersion)? Stringtable.Localize("$MNU_NOPICTURE") : Stringtable.Localize("$MNU_DIFFVERSION"); + int textlen = NewSmallFont.StringWidth(text); + + screen.DrawText (NewSmallFont, Font.CR_GOLD, (savepicLeft + savepicWidth / 2) / FontScale - textlen/2, + (savepicTop+(savepicHeight-rowHeight)/2) / FontScale, text, DTA_VirtualWidthF, screen.GetWidth() / FontScale, DTA_VirtualHeightF, screen.GetHeight() / FontScale, DTA_KeepRatio, true); + } + } + + // Draw comment area + DrawFrame (commentLeft, commentTop, commentWidth, commentHeight); + screen.Dim(0, 0.6, commentLeft, commentTop, commentWidth, commentHeight); + + int numlinestoprint = min(commentRows, BrokenSaveComment? BrokenSaveComment.Count() : 0); + for(int i = 0; i < numlinestoprint; i++) + { + screen.DrawText(NewConsoleFont, Font.CR_ORANGE, commentLeft / FontScale, (commentTop + rowHeight * i) / FontScale, BrokenSaveComment.StringAt(i), + DTA_VirtualWidthF, screen.GetWidth() / FontScale, DTA_VirtualHeightF, screen.GetHeight() / FontScale, DTA_KeepRatio, true); + } + + + // Draw file area + DrawFrame (listboxLeft, listboxTop, listboxWidth, listboxHeight); + screen.Dim(0, 0.6, listboxLeft, listboxTop, listboxWidth, listboxHeight); + + if (manager.SavegameCount() == 0) + { + String text = Stringtable.Localize("$MNU_NOFILES"); + int textlen = int(NewConsoleFont.StringWidth(text) * FontScale); + + screen.DrawText (NewConsoleFont, Font.CR_GOLD, (listboxLeft+(listboxWidth-textlen)/2) / FontScale, (listboxTop+(listboxHeight-rowHeight)/2) / FontScale, text, + DTA_VirtualWidthF, screen.GetWidth() / FontScale, DTA_VirtualHeightF, screen.GetHeight() / FontScale, DTA_KeepRatio, true); + return; + } + + j = TopItem; + for (i = 0; i < listboxRows && j < manager.SavegameCount(); i++) + { + int colr; + node = manager.GetSavegame(j); + if (node.bOldVersion) + { + colr = Font.CR_RED; + } + else if (node.bMissingWads) + { + colr = Font.CR_YELLOW; + } + else if (j == Selected) + { + colr = Font.CR_WHITE; + } + else + { + 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 (NewConsoleFont, colr, (listboxLeft+1) / FontScale, (listboxTop+rowHeight*i + FontScale) / FontScale, node.SaveTitle, + DTA_VirtualWidthF, screen.GetWidth() / FontScale, DTA_VirtualHeightF, screen.GetHeight() / FontScale, DTA_KeepRatio, true); + } + else + { + String s = mInput.GetText() .. NewConsoleFont.GetCursor(); + int length = int(NewConsoleFont.StringWidth(s) * FontScale); + int displacement = min(0, listboxWidth - 2 - length); + screen.DrawText (NewConsoleFont, Font.CR_WHITE, (listboxLeft + 1 + displacement) / FontScale, (listboxTop+rowHeight*i + FontScale) / FontScale, s, + DTA_VirtualWidthF, screen.GetWidth() / FontScale, DTA_VirtualHeightF, screen.GetHeight() / FontScale, DTA_KeepRatio, true); + } + } + else + { + screen.DrawText (NewConsoleFont, colr, (listboxLeft+1) / FontScale, (listboxTop+rowHeight*i + FontScale) / FontScale, node.SaveTitle, + DTA_VirtualWidthF, screen.GetWidth() / FontScale, DTA_VirtualHeightF, screen.GetHeight() / FontScale, DTA_KeepRatio, true); + } + screen.ClearClipRect(); + j++; + } + } + + void UpdateSaveComment() + { + BrokenSaveComment = NewConsoleFont.BreakLines(manager.SaveCommentString, int(commentWidth / FontScale)); + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool MenuEvent (int mkey, bool fromcontroller) + { + switch (mkey) + { + case MKEY_Up: + if (manager.SavegameCount() > 1) + { + if (Selected == -1) Selected = TopItem; + else + { + if (--Selected < 0) Selected = manager.SavegameCount()-1; + if (Selected < TopItem) TopItem = Selected; + else if (Selected >= TopItem + listboxRows) TopItem = MAX(0, Selected - listboxRows + 1); + } + manager.UnloadSaveData (); + manager.ExtractSaveData (Selected); + UpdateSaveComment(); + } + return true; + + case MKEY_Down: + if (manager.SavegameCount() > 1) + { + if (Selected == -1) Selected = TopItem; + else + { + if (++Selected >= manager.SavegameCount()) Selected = 0; + if (Selected < TopItem) TopItem = Selected; + else if (Selected >= TopItem + listboxRows) TopItem = MAX(0, Selected - listboxRows + 1); + } + manager.UnloadSaveData (); + manager.ExtractSaveData (Selected); + UpdateSaveComment(); + } + return true; + + case MKEY_PageDown: + if (manager.SavegameCount() > 1) + { + if (TopItem >= manager.SavegameCount() - listboxRows) + { + TopItem = 0; + if (Selected != -1) Selected = 0; + } + else + { + TopItem = MIN(TopItem + listboxRows, manager.SavegameCount() - listboxRows); + if (TopItem > Selected && Selected != -1) Selected = TopItem; + } + manager.UnloadSaveData (); + manager.ExtractSaveData (Selected); + UpdateSaveComment(); + } + return true; + + case MKEY_PageUp: + if (manager.SavegameCount() > 1) + { + if (TopItem == 0) + { + TopItem = MAX(0, manager.SavegameCount() - listboxRows); + if (Selected != -1) Selected = TopItem; + } + else + { + TopItem = MAX(TopItem - listboxRows, 0); + if (Selected >= TopItem + listboxRows) Selected = TopItem; + } + manager.UnloadSaveData (); + manager.ExtractSaveData (Selected); + UpdateSaveComment(); + } + return true; + + case MKEY_Enter: + return false; // This event will be handled by the subclasses + + case MKEY_MBYes: + { + if (Selected < manager.SavegameCount()) + { + Selected = manager.RemoveSaveSlot (Selected); + UpdateSaveComment(); + } + return true; + } + + default: + return Super.MenuEvent(mkey, fromcontroller); + } + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool MouseEvent(int type, int x, int y) + { + if (x >= listboxLeft && x < listboxLeft + listboxWidth && + y >= listboxTop && y < listboxTop + listboxHeight) + { + int lineno = (y - listboxTop) / rowHeight; + + if (TopItem + lineno < manager.SavegameCount()) + { + Selected = TopItem + lineno; + manager.UnloadSaveData (); + manager.ExtractSaveData (Selected); + UpdateSaveComment(); + if (type == MOUSE_Release) + { + if (MenuEvent(MKEY_Enter, true)) + { + return true; + } + } + } + else Selected = -1; + } + else Selected = -1; + + return Super.MouseEvent(type, x, y); + } + + + //============================================================================= + // + // + // + //============================================================================= + + override bool OnUIEvent(UIEvent ev) + { + if (ev.Type == UIEvent.Type_KeyDown) + { + if (Selected != -1 && Selected < manager.SavegameCount()) + { + switch (ev.KeyChar) + { + case UIEvent.Key_F1: + manager.SetFileInfo(Selected); + UpdateSaveComment(); + return true; + + case UIEvent.Key_DEL: + { + String EndString; + EndString = String.Format("%s%s%s%s?\n\n%s", Stringtable.Localize("$MNU_DELETESG"), TEXTCOLOR_WHITE, manager.GetSavegame(Selected).SaveTitle, TEXTCOLOR_NORMAL, Stringtable.Localize("$PRESSYN")); + StartMessage (EndString, 0); + } + return true; + } + } + } + else if (ev.Type == UIEvent.Type_WheelUp) + { + if (TopItem > 0) TopItem--; + return true; + } + else if (ev.Type == UIEvent.Type_WheelDown) + { + if (TopItem < manager.SavegameCount() - listboxRows) TopItem++; + return true; + } + return Super.OnUIEvent(ev); + } + + +} + +class SaveMenu : LoadSaveMenu +{ + String mSaveName; + + //============================================================================= + // + // + // + //============================================================================= + + override void Init(Menu parent, ListMenuDescriptor desc) + { + Super.Init(parent, desc); + manager.InsertNewSaveNode(); + TopItem = 0; + Selected = manager.ExtractSaveData (-1); + UpdateSaveComment(); + } + + //============================================================================= + // + // + // + //============================================================================= + + override void OnDestroy() + { + if (manager.RemoveNewSaveNode()) + { + Selected--; + } + Super.OnDestroy(); + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool MenuEvent (int mkey, bool fromcontroller) + { + if (Super.MenuEvent(mkey, fromcontroller)) + { + return true; + } + if (Selected == -1) + { + return false; + } + + if (mkey == MKEY_Enter) + { + String SavegameString = (Selected != 0)? manager.GetSavegame(Selected).SaveTitle : ""; + mInput = TextEnterMenu.OpenTextEnter(self, Menu.OptionFont(), SavegameString, -1, fromcontroller); + mInput.ActivateMenu(); + mEntering = true; + } + else if (mkey == MKEY_Input) + { + // Do not start the save here, it would cause some serious execution ordering problems. + mEntering = false; + mSaveName = mInput.GetText(); + mInput = null; + } + else if (mkey == MKEY_Abort) + { + mEntering = false; + mInput = null; + } + return false; + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool MouseEvent(int type, int x, int y) + { + if (mSaveName.Length() > 0) + { + // Do not process events when saving is in progress to avoid update of the current index, + // i.e. Selected member variable must remain unchanged + return true; + } + + return Super.MouseEvent(type, x, y); + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool OnUIEvent(UIEvent ev) + { + if (ev.Type == UIEvent.Type_KeyDown) + { + if (Selected != -1) + { + switch (ev.KeyChar) + { + case UIEvent.Key_DEL: + // cannot delete 'new save game' item + if (Selected == 0) return true; + break; + + case 78://'N': + Selected = TopItem = 0; + manager.UnloadSaveData (); + return true; + } + } + } + return Super.OnUIEvent(ev); + } + + //============================================================================= + // + // + // + //============================================================================= + + override void Ticker() + { + if (mSaveName.Length() > 0) + { + manager.DoSave(Selected, mSaveName); + mSaveName = ""; + } + } + +} + +//============================================================================= +// +// +// +//============================================================================= + +class LoadMenu : LoadSaveMenu +{ + //============================================================================= + // + // + // + //============================================================================= + + override void Init(Menu parent, ListMenuDescriptor desc) + { + Super.Init(parent, desc); + TopItem = 0; + Selected = manager.ExtractSaveData (-1); + UpdateSaveComment(); + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool MenuEvent (int mkey, bool fromcontroller) + { + if (Super.MenuEvent(mkey, fromcontroller)) + { + return true; + } + if (Selected == -1 || manager.SavegameCount() == 0) + { + return false; + } + + if (mkey == MKEY_Enter) + { + manager.LoadSavegame(Selected); + return true; + } + return false; + } +} diff --git a/wadsrc/static/zscript/ui/menu/menu.zs b/wadsrc/static/zscript/ui/menu/menu.zs new file mode 100644 index 000000000..a9a7a01b8 --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/menu.zs @@ -0,0 +1,345 @@ + +struct KeyBindings native version("2.4") +{ + native static String NameKeys(int k1, int k2); + native static String NameAllKeys(array list); + + native int, int GetKeysForCommand(String cmd); + native void GetAllKeysForCommand(out array list, String cmd); + + native void SetBind(int key, String cmd); + native void UnbindACommand (String str); +} + +struct OptionValues native version("2.4") +{ + native static int GetCount(Name group); + native static String GetText(Name group, int index); + native static double GetValue(Name group, int index); + native static String GetTextValue(Name group, int index); +} + +struct JoystickConfig native version("2.4") +{ + enum EJoyAxis + { + JOYAXIS_None = -1, + JOYAXIS_Yaw, + JOYAXIS_Pitch, + JOYAXIS_Forward, + JOYAXIS_Side, + JOYAXIS_Up, + // JOYAXIS_Roll, // Ha ha. No roll for you. + NUM_JOYAXIS, + }; + + native float GetSensitivity(); + native void SetSensitivity(float scale); + + native float GetAxisScale(int axis); + native void SetAxisScale(int axis, float scale); + + native float GetAxisDeadZone(int axis); + native void SetAxisDeadZone(int axis, float zone); + + native int GetAxisMap(int axis); + native void SetAxisMap(int axis, int gameaxis); + + native String GetName(); + native int GetNumAxes(); + native String GetAxisName(int axis); + +} + +class Menu : Object native ui version("2.4") +{ + enum EMenuKey + { + MKEY_Up, + MKEY_Down, + MKEY_Left, + MKEY_Right, + MKEY_PageUp, + MKEY_PageDown, + MKEY_Enter, + MKEY_Back, + MKEY_Clear, + NUM_MKEYS, + + // These are not buttons but events sent from other menus + + MKEY_Input, + MKEY_Abort, + MKEY_MBYes, + MKEY_MBNo, + } + + enum EMenuMouse + { + MOUSE_Click, + MOUSE_Move, + MOUSE_Release + }; + + enum EMenuState + { + Off, // Menu is closed + On, // Menu is opened + WaitKey, // Menu is opened and waiting for a key in the controls menu + OnNoPause, // Menu is opened but does not pause the game + }; + + native Menu mParentMenu; + native bool mMouseCapture; + native bool mBackbuttonSelected; + native bool DontDim; + native bool DontBlur; + native bool AnimatedTransition; + native bool Animated; + + native static int MenuTime(); + native static Menu GetCurrentMenu(); + native static clearscope void SetMenu(Name mnu, int param = 0); // This is not 100% safe but needs to be available - but always make sure to check that only the desired player opens it! + native static void StartMessage(String msg, int mode = 0, Name command = 'none'); + native static void SetMouseCapture(bool on); + native void Close(); + native void ActivateMenu(); + + //============================================================================= + // + // + // + //============================================================================= + + void Init(Menu parent) + { + mParentMenu = parent; + mMouseCapture = false; + mBackbuttonSelected = false; + DontDim = false; + DontBlur = false; + AnimatedTransition = false; + Animated = false; + } + + //============================================================================= + // + // + // + //============================================================================= + + virtual bool MenuEvent (int mkey, bool fromcontroller) + { + switch (mkey) + { + case MKEY_Back: + { + Close(); + let m = GetCurrentMenu(); + MenuSound(m != null ? "menu/backup" : "menu/clear"); + if (!m) menuDelegate.MenuDismissed(); + return true; + } + } + return false; + } + + + //============================================================================= + // + // + // + //============================================================================= + + protected bool MouseEventBack(int type, int x, int y) + { + if (m_show_backbutton >= 0) + { + let tex = TexMan.CheckForTexture(gameinfo.mBackButton, TexMan.Type_MiscPatch); + if (tex.IsValid()) + { + Vector2 v = TexMan.GetScaledSize(tex); + int w = int(v.X + 0.5) * CleanXfac; + int h = int(v.Y + 0.5) * CleanYfac; + if (m_show_backbutton&1) x -= screen.GetWidth() - w; + if (m_show_backbutton&2) y -= screen.GetHeight() - h; + mBackbuttonSelected = ( x >= 0 && x < w && y >= 0 && y < h); + if (mBackbuttonSelected && type == MOUSE_Release) + { + if (m_use_mouse == 2) mBackbuttonSelected = false; + MenuEvent(MKEY_Back, true); + } + return mBackbuttonSelected; + } + } + return false; + } + + //============================================================================= + // + // + // + //============================================================================= + + virtual bool OnUIEvent(UIEvent ev) + { + bool res = false; + int y = ev.MouseY; + if (ev.type == UIEvent.Type_LButtonDown) + { + res = MouseEventBack(MOUSE_Click, ev.MouseX, y); + // make the menu's mouse handler believe that the current coordinate is outside the valid range + if (res) y = -1; + res |= MouseEvent(MOUSE_Click, ev.MouseX, y); + if (res) + { + SetCapture(true); + } + + } + else if (ev.type == UIEvent.Type_MouseMove) + { + BackbuttonTime = 4*GameTicRate; + if (mMouseCapture || m_use_mouse == 1) + { + res = MouseEventBack(MOUSE_Move, ev.MouseX, y); + if (res) y = -1; + res |= MouseEvent(MOUSE_Move, ev.MouseX, y); + } + } + else if (ev.type == UIEvent.Type_LButtonUp) + { + if (mMouseCapture) + { + SetCapture(false); + res = MouseEventBack(MOUSE_Release, ev.MouseX, y); + if (res) y = -1; + res |= MouseEvent(MOUSE_Release, ev.MouseX, y); + } + } + return false; + } + + virtual bool OnInputEvent(InputEvent ev) + { + return false; + } + + //============================================================================= + // + // + // + //============================================================================= + + virtual void Drawer () + { + if (self == GetCurrentMenu() && BackbuttonAlpha > 0 && m_show_backbutton >= 0 && m_use_mouse) + { + let tex = TexMan.CheckForTexture(gameinfo.mBackButton, TexMan.Type_MiscPatch); + if (tex.IsValid()) + { + Vector2 v = TexMan.GetScaledSize(tex); + int w = int(v.X + 0.5) * CleanXfac; + int h = int(v.Y + 0.5) * CleanYfac; + int x = (!(m_show_backbutton&1))? 0:screen.GetWidth() - w; + int y = (!(m_show_backbutton&2))? 0:screen.GetHeight() - h; + if (mBackbuttonSelected && (mMouseCapture || m_use_mouse == 1)) + { + screen.DrawTexture(tex, true, x, y, DTA_CleanNoMove, true, DTA_ColorOverlay, Color(40, 255,255,255), DTA_NOOFFSET, true); + } + else + { + screen.DrawTexture(tex, true, x, y, DTA_CleanNoMove, true, DTA_Alpha, BackbuttonAlpha, DTA_NOOFFSET, true); + } + } + } + } + + //============================================================================= + // + // + // + //============================================================================= + + void SetCapture(bool on) + { + if (mMouseCapture != on) + { + mMouseCapture = on; + SetMouseCapture(on); + } + } + + //============================================================================= + // + // + // + //============================================================================= + + virtual bool TranslateKeyboardEvents() { return true; } + virtual void SetFocus(MenuItemBase fc) {} + virtual bool CheckFocus(MenuItemBase fc) { return false; } + virtual void ReleaseFocus() {} + virtual void ResetColor() {} + virtual bool MouseEvent(int type, int mx, int my) { return true; } + virtual void Ticker() {} + virtual void OnReturn() {} + + //============================================================================= + // + // + // + //============================================================================= + + static void MenuSound(Name snd) + { + menuDelegate.PlaySound(snd); + } + + deprecated("4.0") static void DrawConText (int color, int x, int y, String str) + { + screen.DrawText (ConFont, color, x, y, str, DTA_CellX, 8 * CleanXfac, DTA_CellY, 8 * CleanYfac); + } + + static Font OptionFont() + { + return NewSmallFont; + } + + static int OptionHeight() + { + return OptionFont().GetHeight(); + } + + static int OptionWidth(String s) + { + return OptionFont().StringWidth(s); + } + + static void DrawOptionText(int x, int y, int color, String text, bool grayed = false) + { + String label = Stringtable.Localize(text); + int overlay = grayed? Color(96,48,0,0) : 0; + screen.DrawText (OptionFont(), color, x, y, text, DTA_CleanNoMove_1, true, DTA_ColorOverlay, overlay); + } + + +} + +class MenuDescriptor : Object native ui version("2.4") +{ + native Name mMenuName; + native String mNetgameMessage; + native Class mClass; + + native static MenuDescriptor GetDescriptor(Name n); +} + +// This class is only needed to give it a virtual Init method that doesn't belong to Menu itself +class GenericMenu : Menu +{ + virtual void Init(Menu parent) + { + Super.Init(parent); + } +} \ No newline at end of file diff --git a/wadsrc/static/zscript/ui/menu/menucustomize.zs b/wadsrc/static/zscript/ui/menu/menucustomize.zs new file mode 100644 index 000000000..3d3ee1431 --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/menucustomize.zs @@ -0,0 +1,25 @@ +// This class allows global customization of certain menu aspects, e.g. replacing the menu caption. + +class MenuDelegateBase ui +{ + virtual int DrawCaption(String title, Font fnt, int y, bool drawit) + { + screen.DrawText(fnt, OptionMenuSettings.mTitleColor, (screen.GetWidth() - fnt.StringWidth(title) * CleanXfac_1) / 2, 10 * CleanYfac_1, title, DTA_CleanNoMove_1, true); + return (y + fnt.GetHeight()) * CleanYfac_1; // return is spacing in screen pixels. + } + + virtual void PlaySound(Name sound) + { + } + + virtual bool DrawSelector(ListMenuDescriptor desc) + { + return false; + } + + virtual void MenuDismissed() + { + // overriding this allows to execute special actions when the menu closes + } + +} diff --git a/wadsrc/static/zscript/ui/menu/menuitembase.zs b/wadsrc/static/zscript/ui/menu/menuitembase.zs new file mode 100644 index 000000000..53a32e47f --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/menuitembase.zs @@ -0,0 +1,50 @@ +//============================================================================= +// +// base class for menu items +// +//============================================================================= + +class MenuItemBase : Object native ui version("2.4") +{ + protected native double mXpos, mYpos; + protected native Name mAction; + native int mEnabled; + + void Init(double xpos = 0, double ypos = 0, Name actionname = 'None') + { + mXpos = xpos; + mYpos = ypos; + mAction = actionname; + mEnabled = true; + } + + virtual bool CheckCoordinate(int x, int y) { return false; } + virtual void Ticker() {} + virtual void Drawer(bool selected) {} + virtual bool Selectable() {return false; } + virtual bool Activate() { return false; } + virtual Name, int GetAction() { return mAction, 0; } + virtual bool SetString(int i, String s) { return false; } + virtual bool, String GetString(int i) { return false, ""; } + virtual bool SetValue(int i, int value) { return false; } + virtual bool, int GetValue(int i) { return false, 0; } + virtual void Enable(bool on) { mEnabled = on; } + virtual bool MenuEvent (int mkey, bool fromcontroller) { return false; } + virtual bool MouseEvent(int type, int x, int y) { return false; } + virtual bool CheckHotkey(int c) { return false; } + virtual int GetWidth() { return 0; } + virtual int GetIndent() { return 0; } + virtual int Draw(OptionMenuDescriptor desc, int y, int indent, bool selected) { return indent; } + + void OffsetPositionY(double ydelta) { mYpos += ydelta; } + double GetY() { return mYpos; } + double GetX() { return mXpos; } + void SetX(double x) { mXpos = x; } + virtual void OnMenuCreated() {} +} + +// this is only used to parse font color ranges in MENUDEF +enum MenudefColorRange +{ + NO_COLOR = -1 +} \ No newline at end of file diff --git a/wadsrc/static/zscript/ui/menu/messagebox.zs b/wadsrc/static/zscript/ui/menu/messagebox.zs new file mode 100644 index 000000000..3bae3c27a --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/messagebox.zs @@ -0,0 +1,319 @@ +/* +** messagebox.cpp +** Confirmation, notification screens +** +**--------------------------------------------------------------------------- +** Copyright 2010-2017 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. +**--------------------------------------------------------------------------- +** +*/ + +class MessageBoxMenu : Menu +{ + BrokenLines mMessage; + voidptr Handler; + int mMessageMode; + int messageSelection; + int mMouseLeft, mMouseRight, mMouseY; + Name mAction; + + Font textFont, arrowFont; + int destWidth, destHeight; + String selector; + + native static void CallHandler(voidptr hnd); + + + //============================================================================= + // + // + // + //============================================================================= + + virtual void Init(Menu parent, String message, int messagemode, bool playsound = false, Name cmd = 'None', voidptr native_handler = null) + { + Super.Init(parent); + mAction = cmd; + messageSelection = 0; + mMouseLeft = 140; + mMouseY = 0x80000000; + textFont = null; + + if (!generic_ui) + { + if (SmallFont && SmallFont.CanPrint(message) && SmallFont.CanPrint("$TXT_YES") && SmallFont.CanPrint("$TXT_NO")) textFont = SmallFont; + else if (OriginalSmallFont && OriginalSmallFont.CanPrint(message) && OriginalSmallFont.CanPrint("$TXT_YES") && OriginalSmallFont.CanPrint("$TXT_NO")) textFont = OriginalSmallFont; + } + + if (!textFont) + { + arrowFont = textFont = NewSmallFont; + int factor = (CleanXfac+1) / 2; + destWidth = screen.GetWidth() / factor; + destHeight = screen.GetHeight() / factor; + selector = "▶"; + } + else + { + arrowFont = ConFont; + destWidth = CleanWidth; + destHeight = CleanHeight; + selector = "\xd"; + } + + int mr1 = destWidth/2 + 10 + textFont.StringWidth(Stringtable.Localize("$TXT_YES")); + int mr2 = destWidth/2 + 10 + textFont.StringWidth(Stringtable.Localize("$TXT_NO")); + mMouseRight = MAX(mr1, mr2); + mParentMenu = parent; + mMessage = textFont.BreakLines(Stringtable.Localize(message), 300/NotifyFontScale); + mMessageMode = messagemode; + if (playsound) + { + MenuSound ("menu/prompt"); + } + Handler = native_handler; + } + + //============================================================================= + // + // + // + //============================================================================= + + override void Drawer () + { + int i, y; + int fontheight = textFont.GetHeight() * NotifyFontScale; + + y = destHeight / 2; + + int c = mMessage.Count(); + y -= c * fontHeight / 2; + + for (i = 0; i < c; i++) + { + screen.DrawText (textFont, Font.CR_UNTRANSLATED, destWidth/2 - mMessage.StringWidth(i)*NotifyFontScale/2, y, mMessage.StringAt(i), DTA_VirtualWidth, destWidth, DTA_VirtualHeight, destHeight, DTA_KeepRatio, true, + DTA_ScaleX, NotifyFontScale, DTA_ScaleY, NotifyFontScale); + y += fontheight; + } + + if (mMessageMode == 0) + { + y += fontheight; + mMouseY = y; + screen.DrawText(textFont, messageSelection == 0? OptionMenuSettings.mFontColorSelection : OptionMenuSettings.mFontColor, destWidth / 2, y, Stringtable.Localize("$TXT_YES"), DTA_VirtualWidth, destWidth, DTA_VirtualHeight, destHeight, DTA_KeepRatio, true, DTA_ScaleX, NotifyFontScale, DTA_ScaleY, NotifyFontScale); + screen.DrawText(textFont, messageSelection == 1? OptionMenuSettings.mFontColorSelection : OptionMenuSettings.mFontColor, destWidth / 2, y + fontheight, Stringtable.Localize("$TXT_NO"), DTA_VirtualWidth, destWidth, DTA_VirtualHeight, destHeight, DTA_KeepRatio, true, DTA_ScaleX, NotifyFontScale, DTA_ScaleY, NotifyFontScale); + + if (messageSelection >= 0) + { + if ((MenuTime() % 8) < 6) + { + screen.DrawText(arrowFont, OptionMenuSettings.mFontColorSelection, + destWidth/2 - 11, y + fontheight * messageSelection, selector, DTA_VirtualWidth, destWidth, DTA_VirtualHeight, destHeight, DTA_KeepRatio, true); + } + } + } + } + + + //============================================================================= + // + // + // + //============================================================================= + + protected void CloseSound() + { + MenuSound (GetCurrentMenu() != NULL? "menu/backup" : "menu/dismiss"); + } + + //============================================================================= + // + // + // + //============================================================================= + + virtual void HandleResult(bool res) + { + if (Handler != null) + { + if (res) + { + CallHandler(Handler); + } + else + { + Close(); + CloseSound(); + } + } + else if (mParentMenu != NULL) + { + if (mMessageMode == 0) + { + if (mAction == 'None') + { + mParentMenu.MenuEvent(res? MKEY_MBYes : MKEY_MBNo, false); + Close(); + } + else + { + Close(); + if (res) SetMenu(mAction, -1); + } + CloseSound(); + } + } + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool OnUIEvent(UIEvent ev) + { + if (ev.type == UIEvent.Type_KeyDown) + { + if (mMessageMode == 0) + { + // tolower + int ch = ev.KeyChar; + ch = ch >= 65 && ch <91? ch + 32 : ch; + + if (ch == 110 /*'n'*/ || ch == 32) + { + HandleResult(false); + return true; + } + else if (ch == 121 /*'y'*/) + { + HandleResult(true); + return true; + } + } + else + { + Close(); + return true; + } + return false; + } + return Super.OnUIEvent(ev); + } + + override bool OnInputEvent(InputEvent ev) + { + if (ev.type == InputEvent.Type_KeyDown) + { + Close(); + return true; + } + return Super.OnInputEvent(ev); + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool MenuEvent(int mkey, bool fromcontroller) + { + if (mMessageMode == 0) + { + if (mkey == MKEY_Up || mkey == MKEY_Down) + { + MenuSound("menu/cursor"); + messageSelection = !messageSelection; + return true; + } + else if (mkey == MKEY_Enter) + { + // 0 is yes, 1 is no + HandleResult(!messageSelection); + return true; + } + else if (mkey == MKEY_Back) + { + HandleResult(false); + return true; + } + return false; + } + else + { + Close(); + CloseSound(); + return true; + } + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool MouseEvent(int type, int x, int y) + { + if (mMessageMode == 1) + { + if (type == MOUSE_Click) + { + return MenuEvent(MKEY_Enter, true); + } + return false; + } + else + { + int sel = -1; + int fh = textFont.GetHeight() + 1; + + // convert x/y from screen to virtual coordinates, according to CleanX/Yfac use in DrawTexture + x = x * destWidth / screen.GetWidth(); + y = y * destHeight / screen.GetHeight(); + + if (x >= mMouseLeft && x <= mMouseRight && y >= mMouseY && y < mMouseY + 2 * fh) + { + sel = y >= mMouseY + fh; + } + messageSelection = sel; + if (type == MOUSE_Release) + { + return MenuEvent(MKEY_Enter, true); + } + return true; + } + } + + +} + + + diff --git a/wadsrc/static/zscript/ui/menu/optionmenu.zs b/wadsrc/static/zscript/ui/menu/optionmenu.zs new file mode 100644 index 000000000..6392adf3f --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/optionmenu.zs @@ -0,0 +1,580 @@ +/* +** optionmenu.cpp +** Handler class for the option menus and associated items +** +**--------------------------------------------------------------------------- +** Copyright 2010-2017 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. +**--------------------------------------------------------------------------- +** +*/ + +struct FOptionMenuSettings native version("2.4") +{ + int mTitleColor; + int mFontColor; + int mFontColorValue; + int mFontColorMore; + int mFontColorHeader; + int mFontColorHighlight; + int mFontColorSelection; + int mLinespacing; +} + +class OptionMenuDescriptor : MenuDescriptor native +{ + native Array mItems; + native String mTitle; + native int mSelectedItem; + native int mDrawTop; + native int mScrollTop; + native int mScrollPos; + native int mIndent; + native int mPosition; + native bool mDontDim; + native Font mFont; + + void Reset() + { + // Reset the default settings (ignore all other values in the struct) + mPosition = 0; + mScrollTop = 0; + mIndent = 0; + mDontDim = 0; + } + + //============================================================================= + // + // + // + //============================================================================= + + void CalcIndent() + { + // calculate the menu indent + int widest = 0, thiswidth; + + for (int i = 0; i < mItems.Size(); i++) + { + thiswidth = mItems[i].GetIndent(); + if (thiswidth > widest) widest = thiswidth; + } + mIndent = widest + 4; + } +} + + +class OptionMenu : Menu +{ + OptionMenuDescriptor mDesc; + bool CanScrollUp; + bool CanScrollDown; + int VisBottom; + OptionMenuItem mFocusControl; + + //============================================================================= + // + // + // + //============================================================================= + + virtual void Init(Menu parent, OptionMenuDescriptor desc) + { + mParentMenu = parent; + mDesc = desc; + DontDim = desc.mDontDim; + + let itemCount = mDesc.mItems.size(); + if (itemCount > 0) + { + let last = mDesc.mItems[itemCount - 1]; + bool lastIsText = (last is "OptionMenuItemStaticText"); + if (lastIsText) + { + String text = last.mLabel; + bool lastIsSpace = (text == "" || text == " "); + if (lastIsSpace) + { + mDesc.mItems.Pop(); + } + } + } + + if (mDesc.mSelectedItem == -1) mDesc.mSelectedItem = FirstSelectable(); + mDesc.CalcIndent(); + + // notify all items that the menu was just created. + for(int i=0;i=0 && i < mDesc.mItems.Size()) return i; + else return -1; + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool OnUIEvent(UIEvent ev) + { + if (ev.type == UIEvent.Type_WheelUp) + { + int scrollamt = MIN(2, mDesc.mScrollPos); + mDesc.mScrollPos -= scrollamt; + return true; + } + else if (ev.type == UIEvent.Type_WheelDown) + { + if (CanScrollDown) + { + if (VisBottom >= 0 && VisBottom < (mDesc.mItems.Size()-2)) + { + mDesc.mScrollPos += 2; + VisBottom += 2; + } + else + { + mDesc.mScrollPos++; + VisBottom++; + } + } + return true; + } + return Super.OnUIEvent(ev); + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool MenuEvent (int mkey, bool fromcontroller) + { + int startedAt = mDesc.mSelectedItem; + + switch (mkey) + { + case MKEY_Up: + if (mDesc.mSelectedItem == -1) + { + mDesc.mSelectedItem = FirstSelectable(); + break; + } + do + { + --mDesc.mSelectedItem; + + if (mDesc.mScrollPos > 0 && + mDesc.mSelectedItem <= mDesc.mScrollTop + mDesc.mScrollPos) + { + mDesc.mScrollPos = MAX(mDesc.mSelectedItem - mDesc.mScrollTop - 1, 0); + } + + if (mDesc.mSelectedItem < 0) + { + // Figure out how many lines of text fit on the menu + int y = mDesc.mPosition; + + if (y <= 0) + { + y = DrawCaption(mDesc.mTitle, y, false); + } + y *= CleanYfac_1; + int rowheight = OptionMenuSettings.mLinespacing * CleanYfac_1; + int maxitems = (screen.GetHeight() - rowheight - y) / rowheight + 1; + + mDesc.mScrollPos = MAX (0, mDesc.mItems.Size() - maxitems + mDesc.mScrollTop); + mDesc.mSelectedItem = mDesc.mItems.Size()-1; + } + } + while (!mDesc.mItems[mDesc.mSelectedItem].Selectable() && mDesc.mSelectedItem != startedAt); + break; + + case MKEY_Down: + if (mDesc.mSelectedItem == -1) + { + mDesc.mSelectedItem = FirstSelectable(); + break; + } + do + { + ++mDesc.mSelectedItem; + + if (CanScrollDown && mDesc.mSelectedItem == VisBottom) + { + mDesc.mScrollPos++; + VisBottom++; + } + if (mDesc.mSelectedItem >= mDesc.mItems.Size()) + { + if (startedAt == -1) + { + mDesc.mSelectedItem = -1; + mDesc.mScrollPos = -1; + break; + } + else + { + mDesc.mSelectedItem = 0; + mDesc.mScrollPos = 0; + } + } + } + while (!mDesc.mItems[mDesc.mSelectedItem].Selectable() && mDesc.mSelectedItem != startedAt); + break; + + case MKEY_PageUp: + if (mDesc.mScrollPos > 0) + { + mDesc.mScrollPos -= VisBottom - mDesc.mScrollPos - mDesc.mScrollTop; + if (mDesc.mScrollPos < 0) + { + mDesc.mScrollPos = 0; + } + if (mDesc.mSelectedItem != -1) + { + mDesc.mSelectedItem = mDesc.mScrollTop + mDesc.mScrollPos + 1; + while (!mDesc.mItems[mDesc.mSelectedItem].Selectable()) + { + if (++mDesc.mSelectedItem >= mDesc.mItems.Size()) + { + mDesc.mSelectedItem = 0; + } + } + if (mDesc.mScrollPos > mDesc.mSelectedItem) + { + mDesc.mScrollPos = mDesc.mSelectedItem; + } + } + } + break; + + case MKEY_PageDown: + if (CanScrollDown) + { + int pagesize = VisBottom - mDesc.mScrollPos - mDesc.mScrollTop; + mDesc.mScrollPos += pagesize; + if (mDesc.mScrollPos + mDesc.mScrollTop + pagesize > mDesc.mItems.Size()) + { + mDesc.mScrollPos = mDesc.mItems.Size() - mDesc.mScrollTop - pagesize; + } + if (mDesc.mSelectedItem != -1) + { + mDesc.mSelectedItem = mDesc.mScrollTop + mDesc.mScrollPos; + while (!mDesc.mItems[mDesc.mSelectedItem].Selectable()) + { + if (++mDesc.mSelectedItem >= mDesc.mItems.Size()) + { + mDesc.mSelectedItem = 0; + } + } + if (mDesc.mScrollPos > mDesc.mSelectedItem) + { + mDesc.mScrollPos = mDesc.mSelectedItem; + } + } + } + break; + + case MKEY_Enter: + if (mDesc.mSelectedItem >= 0 && mDesc.mItems[mDesc.mSelectedItem].Activate()) + { + return true; + } + // fall through to default + default: + if (mDesc.mSelectedItem >= 0 && + mDesc.mItems[mDesc.mSelectedItem].MenuEvent(mkey, fromcontroller)) return true; + return Super.MenuEvent(mkey, fromcontroller); + } + + if (mDesc.mSelectedItem != startedAt) + { + MenuSound ("menu/cursor"); + } + return true; + } + + + //============================================================================= + // + // + // + //============================================================================= + + override bool MouseEvent(int type, int x, int y) + { + y = (y / CleanYfac_1) - mDesc.mDrawTop; + + if (mFocusControl) + { + mFocusControl.MouseEvent(type, x, y); + return true; + } + else + { + int yline = (y / OptionMenuSettings.mLinespacing); + if (yline >= mDesc.mScrollTop) + { + yline += mDesc.mScrollPos; + } + if (yline >= 0 && yline < mDesc.mItems.Size() && mDesc.mItems[yline].Selectable()) + { + if (yline != mDesc.mSelectedItem) + { + mDesc.mSelectedItem = yline; + } + mDesc.mItems[yline].MouseEvent(type, x, y); + return true; + } + } + mDesc.mSelectedItem = -1; + return Super.MouseEvent(type, x, y); + } + + + //============================================================================= + // + // + // + //============================================================================= + + override void Ticker () + { + Super.Ticker(); + for(int i = 0; i < mDesc.mItems.Size(); i++) + { + mDesc.mItems[i].Ticker(); + } + } + + //============================================================================= + // + // + // + //============================================================================= + + virtual int GetIndent() + { + int indent = max(0, (mDesc.mIndent + 40) - CleanWidth_1 / 2); + return screen.GetWidth() / 2 + indent * CleanXfac_1; + } + + //============================================================================= + // + // draws and/or measures the caption. + // + //============================================================================= + + virtual int DrawCaption(String title, int y, bool drawit) + { + let font = generic_ui || !mDesc.mFont ? NewSmallFont : mDesc.mFont; + if (font && mDesc.mTitle.Length() > 0) + { + return menuDelegate.DrawCaption(title, font, y, drawit); + } + else + { + return y; + } + + } + + //============================================================================= + // + // + // + //============================================================================= + + override void Drawer () + { + int y = mDesc.mPosition; + + if (y <= 0) + { + y = DrawCaption(mDesc.mTitle, -y, true); + } + mDesc.mDrawTop = y / CleanYfac_1; // mouse checks are done in clean space. + int fontheight = OptionMenuSettings.mLinespacing * CleanYfac_1; + + int indent = GetIndent(); + + int ytop = y + mDesc.mScrollTop * 8 * CleanYfac_1; + int lastrow = screen.GetHeight() - OptionHeight() * CleanYfac_1; + + int i; + for (i = 0; i < mDesc.mItems.Size() && y <= lastrow; i++) + { + // Don't scroll the uppermost items + if (i == mDesc.mScrollTop) + { + i += mDesc.mScrollPos; + if (i >= mDesc.mItems.Size()) break; // skipped beyond end of menu + } + bool isSelected = mDesc.mSelectedItem == i; + int cur_indent = mDesc.mItems[i].Draw(mDesc, y, indent, isSelected); + if (cur_indent >= 0 && isSelected && mDesc.mItems[i].Selectable()) + { + if (((MenuTime() % 8) < 6) || GetCurrentMenu() != self) + { + DrawOptionText(cur_indent + 3 * CleanXfac_1, y, OptionMenuSettings.mFontColorSelection, "◄"); + } + } + y += fontheight; + } + + CanScrollUp = (mDesc.mScrollPos > 0); + CanScrollDown = (i < mDesc.mItems.Size()); + VisBottom = i - 1; + + if (CanScrollUp) + { + DrawOptionText(screen.GetWidth() - 11 * CleanXfac_1, ytop, OptionMenuSettings.mFontColorSelection, "▲"); + } + if (CanScrollDown) + { + DrawOptionText(screen.GetWidth() - 11 * CleanXfac_1 , y - 8*CleanYfac_1, OptionMenuSettings.mFontColorSelection, "▼"); + } + Super.Drawer(); + } + + //============================================================================= + // + // + // + //============================================================================= + + override void SetFocus(MenuItemBase fc) + { + mFocusControl = OptionMenuItem(fc); + } + + override bool CheckFocus(MenuItemBase fc) + { + return mFocusControl == fc; + } + + override void ReleaseFocus() + { + mFocusControl = NULL; + } +} + + +class GLTextureGLOptions : OptionMenu +{ + private int mWarningIndex; + private string mWarningLabel; + + override void Init(Menu parent, OptionMenuDescriptor desc) + { + super.Init(parent, desc); + + // Find index of warning item placeholder + mWarningIndex = -1; + mWarningLabel = "!HQRESIZE_WARNING!"; + + for (int i=0; i < mDesc.mItems.Size(); ++i) + { + if (mDesc.mItems[i].mLabel == mWarningLabel) + { + mWarningIndex = i; + break; + } + } + } + + override void OnDestroy() + { + // Restore warning item placeholder + if (mWarningIndex >= 0) + { + mDesc.mItems[mWarningIndex].mLabel = mWarningLabel; + } + + Super.OnDestroy(); + } + + override void Ticker() + { + Super.Ticker(); + + if (mWarningIndex >= 0) + { + string message; + + if (gl_texture_hqresizemult > 1 && gl_texture_hqresizemode > 0) + { + int multiplier = gl_texture_hqresizemult * gl_texture_hqresizemult; + + message = StringTable.Localize("$GLTEXMNU_HQRESIZEWARN"); + string mult = String.Format("%d", multiplier); + message.Replace("%d", mult); + } + + mDesc.mItems[mWarningIndex].mLabel = Font.TEXTCOLOR_CYAN .. message; + } + } +} diff --git a/wadsrc/static/zscript/ui/menu/optionmenuitems.zs b/wadsrc/static/zscript/ui/menu/optionmenuitems.zs new file mode 100644 index 000000000..28b48310b --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/optionmenuitems.zs @@ -0,0 +1,1236 @@ +/* +** optionmenuitems.txt +** Control items for option menus +** +**--------------------------------------------------------------------------- +** Copyright 2010-2017 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. +**--------------------------------------------------------------------------- +** +*/ + +class OptionMenuItem : MenuItemBase +{ + String mLabel; + bool mCentered; + + protected void Init(String label, String command, bool center = false) + { + Super.Init(0, 0, command); + mLabel = label; + mCentered = center; + } + + protected void drawText(int x, int y, int color, String text, bool grayed = false) + { + Menu.DrawOptionText(x, y, color, text, grayed); + } + + protected int drawLabel(int indent, int y, int color, bool grayed = false) + { + String label = Stringtable.Localize(mLabel); + + int x; + int w = Menu.OptionWidth(label) * CleanXfac_1; + if (!mCentered) x = indent - w; + else x = (screen.GetWidth() - w) / 2; + Menu.DrawOptionText(x, y, color, label, grayed); + return x; + } + + protected void drawValue(int indent, int y, int color, String text, bool grayed = false) + { + Menu.DrawOptionText(indent + CursorSpace(), y, color, text, grayed); + } + + + int CursorSpace() + { + return (14 * CleanXfac_1); + } + + override bool Selectable() + { + return true; + } + + override int GetIndent() + { + if (mCentered) return 0; + if (screen.GetWidth() < 640) return screen.GetWidth() / 2; + return Menu.OptionWidth(Stringtable.Localize(mLabel)); + } + + override bool MouseEvent(int type, int x, int y) +{ + if (Selectable() && type == Menu.MOUSE_Release) + { + return Menu.GetCurrentMenu().MenuEvent(Menu.MKEY_Enter, true); + } + return false; + } +} + +//============================================================================= +// +// opens a submenu, command is a submenu name +// +//============================================================================= + +class OptionMenuItemSubmenu : OptionMenuItem +{ + int mParam; + OptionMenuItemSubmenu Init(String label, Name command, int param = 0, bool centered = false) + { + Super.init(label, command, centered); + mParam = param; + return self; + } + + override int Draw(OptionMenuDescriptor desc, int y, int indent, bool selected) + { + int x = drawLabel(indent, y, selected? OptionMenuSettings.mFontColorSelection : OptionMenuSettings.mFontColorMore); + if (mCentered) + { + return x - 16*CleanXfac_1; + } + return indent; + } + + override bool Activate() + { + Menu.MenuSound("menu/choose"); + Menu.SetMenu(mAction, mParam); + return true; + } +} + +//============================================================================= +// +// opens a submenu, command is a submenu name +// +//============================================================================= + +class OptionMenuItemLabeledSubmenu : OptionMenuItemSubmenu +{ + CVar mLabelCVar; + OptionMenuItemSubmenu Init(String label, CVar labelcvar, Name command, int param = 0) + { + Super.init(label, command, false); + mLabelCVar = labelcvar; + return self; + } + + override int Draw(OptionMenuDescriptor desc, int y, int indent, bool selected) + { + drawLabel(indent, y, selected? OptionMenuSettings.mFontColorSelection : OptionMenuSettings.mFontColor); + + String text = mLabelCVar.GetString(); + if (text.Length() == 0) text = Stringtable.Localize("$notset"); + drawValue(indent, y, OptionMenuSettings.mFontColorValue, text); + return indent; + } +} + +//============================================================================= +// +// Executes a CCMD, command is a CCMD name +// +//============================================================================= + +class OptionMenuItemCommand : OptionMenuItemSubmenu +{ + private String ccmd; // do not allow access to this from the outside. + bool mCloseOnSelect; + private bool mUnsafe; + + OptionMenuItemCommand Init(String label, Name command, bool centered = false, bool closeonselect = false) + { + Super.Init(label, command, 0, centered); + ccmd = command; + mCloseOnSelect = closeonselect; + mUnsafe = true; + return self; + } + + private native static void DoCommand(String cmd, bool unsafe); // This is very intentionally limited to this menu item to prevent abuse. + + override bool Activate() + { + // This needs to perform a few checks to prevent abuse by malicious modders. + if (GetClass() != "OptionMenuItemSafeCommand") + { + let m = OptionMenu(Menu.GetCurrentMenu()); + // don't execute if no menu is active + if (m == null) return false; + // don't execute if this item cannot be found in the current menu. + if (m.GetItem(mAction) != self) return false; + } + else mUnsafe = false; + Menu.MenuSound("menu/choose"); + DoCommand(ccmd, mUnsafe); + if (mCloseOnSelect) + { + let curmenu = Menu.GetCurrentMenu(); + if (curmenu != null) curmenu.Close(); + } + return true; + } + +} + +//============================================================================= +// +// Executes a CCMD after confirmation, command is a CCMD name +// +//============================================================================= + +class OptionMenuItemSafeCommand : OptionMenuItemCommand +{ + String mPrompt; + + + OptionMenuItemSafeCommand Init(String label, Name command, String prompt = "") + { + Super.Init(label, command); + mPrompt = prompt; + return self; + } + + override bool MenuEvent (int mkey, bool fromcontroller) + { + if (mkey == Menu.MKEY_MBYes) + { + Super.Activate(); + return true; + } + return Super.MenuEvent(mkey, fromcontroller); + } + + override bool Activate() + { + String msg = mPrompt.Length() > 0 ? mPrompt : "$SAFEMESSAGE"; + msg = StringTable.Localize(msg); + String actionLabel = StringTable.localize(mLabel); + + String FullString; + FullString = String.Format("%s%s%s\n\n%s", TEXTCOLOR_WHITE, actionLabel, TEXTCOLOR_NORMAL, msg); + Menu.StartMessage(FullString, 0); + return true; + } +} + +//============================================================================= +// +// Base class for option lists +// +//============================================================================= + +class OptionMenuItemOptionBase : OptionMenuItem +{ + // command is a CVAR + Name mValues; // Entry in OptionValues table + CVar mGrayCheck; + int mCenter; + + const OP_VALUES = 0x11001; + + protected void Init(String label, Name command, Name values, CVar graycheck, int center) + { + Super.Init(label, command); + mValues = values; + mGrayCheck = graycheck; + mCenter = center; + } + + override bool SetString(int i, String newtext) + { + if (i == OP_VALUES) + { + int cnt = OptionValues.GetCount(mValues); + if (cnt >= 0) + { + mValues = newtext; + int s = GetSelection(); + if (s >= cnt) s = 0; + SetSelection(s); // readjust the CVAR if its value is outside the range now + return true; + } + } + return false; + } + + //============================================================================= + virtual int GetSelection() + { + return 0; + } + + virtual void SetSelection(int Selection) + { + } + + //============================================================================= + override int Draw(OptionMenuDescriptor desc, int y, int indent, bool selected) + { + if (mCenter) + { + indent = (screen.GetWidth() / 2); + } + drawLabel(indent, y, selected? OptionMenuSettings.mFontColorSelection : OptionMenuSettings.mFontColor, isGrayed()); + + int Selection = GetSelection(); + String text = StringTable.Localize(OptionValues.GetText(mValues, Selection)); + if (text.Length() == 0) text = "Unknown"; + drawValue(indent, y, OptionMenuSettings.mFontColorValue, text, isGrayed()); + return indent; + } + + //============================================================================= + override bool MenuEvent (int mkey, bool fromcontroller) + { + int cnt = OptionValues.GetCount(mValues); + if (cnt > 0) + { + int Selection = GetSelection(); + if (mkey == Menu.MKEY_Left) + { + if (Selection == -1) Selection = 0; + else if (--Selection < 0) Selection = cnt - 1; + } + else if (mkey == Menu.MKEY_Right || mkey == Menu.MKEY_Enter) + { + if (++Selection >= cnt) Selection = 0; + } + else + { + return Super.MenuEvent(mkey, fromcontroller); + } + SetSelection(Selection); + Menu.MenuSound("menu/change"); + } + else + { + return Super.MenuEvent(mkey, fromcontroller); + } + return true; + } + + virtual bool isGrayed() + { + return mGrayCheck != null && !mGrayCheck.GetInt(); + } + + override bool Selectable() + { + return !isGrayed(); + } +} + +//============================================================================= +// +// Change a CVAR, command is the CVAR name +// +//============================================================================= + +class OptionMenuItemOption : OptionMenuItemOptionBase +{ + CVar mCVar; + + private static native void SetCVarDescription(CVar cv, String label); + + OptionMenuItemOption Init(String label, Name command, Name values, CVar graycheck = null, int center = 0) + { + Super.Init(label, command, values, graycheck, center); + mCVar = CVar.FindCVar(mAction); + if (mCVar) SetCVarDescription(mCVar, label); + return self; + } + + //============================================================================= + override int GetSelection() + { + int Selection = -1; + int cnt = OptionValues.GetCount(mValues); + if (cnt > 0 && mCVar != null) + { + if (OptionValues.GetTextValue(mValues, 0).Length() == 0) + { + let f = mCVar.GetFloat(); + for(int i = 0; i < cnt; i++) + { + if (f ~== OptionValues.GetValue(mValues, i)) + { + Selection = i; + break; + } + } + } + else + { + String cv = mCVar.GetString(); + for(int i = 0; i < cnt; i++) + { + if (cv ~== OptionValues.GetTextValue(mValues, i)) + { + Selection = i; + break; + } + } + } + } + return Selection; + } + + override void SetSelection(int Selection) + { + int cnt = OptionValues.GetCount(mValues); + if (cnt > 0 && mCVar != null) + { + if (OptionValues.GetTextValue(mValues, 0).Length() == 0) + { + mCVar.SetFloat(OptionValues.GetValue(mValues, Selection)); + } + else + { + mCVar.SetString(OptionValues.GetTextValue(mValues, Selection)); + } + } + } +} + +//============================================================================= +// +// This class is used to capture the key to be used as the new key binding +// for a control item +// +//============================================================================= + +class EnterKey : Menu +{ + OptionMenuItemControlBase mOwner; + + void Init(Menu parent, OptionMenuItemControlBase owner) + { + Super.Init(parent); + mOwner = owner; + SetMenuMessage(1); + menuactive = Menu.WaitKey; // There should be a better way to disable GUI capture... + } + + override bool TranslateKeyboardEvents() + { + return false; + } + + private void SetMenuMessage(int which) + { + let parent = OptionMenu(mParentMenu); + if (parent != null) + { + let it = parent.GetItem('Controlmessage'); + if (it != null) + { + it.SetValue(0, which); + } + } + } + + override bool OnInputEvent(InputEvent ev) + { + // This menu checks raw keys, not GUI keys because it needs the raw codes for binding. + if (ev.type == InputEvent.Type_KeyDown) + { + mOwner.SendKey(ev.KeyScan); + menuactive = Menu.On; + SetMenuMessage(0); + Close(); + mParentMenu.MenuEvent((ev.KeyScan == InputEvent.KEY_ESCAPE)? Menu.MKEY_Abort : Menu.MKEY_Input, 0); + return true; + } + return false; + } + + override void Drawer() + { + mParentMenu.Drawer(); + } +} + +//============================================================================= +// +// // Edit a key binding, Action is the CCMD to bind +// +//============================================================================= + +class OptionMenuItemControlBase : OptionMenuItem +{ + KeyBindings mBindings; + int mInput; + bool mWaiting; + + protected void Init(String label, Name command, KeyBindings bindings) + { + Super.init(label, command); + mBindings = bindings; + mWaiting = false; + } + + //============================================================================= + override int Draw(OptionMenuDescriptor desc, int y, int indent, bool selected) + { + drawLabel(indent, y, mWaiting ? OptionMenuSettings.mFontColorHighlight : + (selected ? OptionMenuSettings.mFontColorSelection : OptionMenuSettings.mFontColor)); + + String description; + Array keys; + + mBindings.GetAllKeysForCommand(keys, mAction); + description = KeyBindings.NameAllKeys(keys); + if (description.Length() > 0) + { + drawValue(indent, y, Font.CR_WHITE, description); + } + else + { + drawValue(indent, y, Font.CR_BLACK, "---"); + } + return indent; + } + + //============================================================================= + override bool MenuEvent(int mkey, bool fromcontroller) + { + if (mkey == Menu.MKEY_Input) + { + mWaiting = false; + mBindings.SetBind(mInput, mAction); + return true; + } + else if (mkey == Menu.MKEY_Clear) + { + mBindings.UnbindACommand(mAction); + return true; + } + else if (mkey == Menu.MKEY_Abort) + { + mWaiting = false; + return true; + } + return false; + } + + void SendKey(int key) + { + mInput = key; + } + + override bool Activate() + { + Menu.MenuSound("menu/choose"); + mWaiting = true; + let input = new("EnterKey"); + input.Init(Menu.GetCurrentMenu(), self); + input.ActivateMenu(); + return true; + } +} + +class OptionMenuItemControl : OptionMenuItemControlBase +{ + OptionMenuItemControl Init(String label, Name command) + { + Super.Init(label, command, Bindings); + return self; + } +} + +class OptionMenuItemMapControl : OptionMenuItemControlBase +{ + OptionMenuItemMapControl Init(String label, Name command) + { + Super.Init(label, command, AutomapBindings); + return self; + } +} + +//============================================================================= +// +// +// +//============================================================================= + +class OptionMenuItemStaticText : OptionMenuItem +{ + int mColor; + + // this function is only for use from MENUDEF, it needs to do some strange things with the color for backwards compatibility. + OptionMenuItemStaticText Init(String label, int cr = -1) + { + Super.Init(label, 'None', true); + mColor = OptionMenuSettings.mFontColor; + if ((cr & 0xffff0000) == 0x12340000) mColor = cr & 0xffff; + else if (cr > 0) mColor = OptionMenuSettings.mFontColorHeader; + return self; + } + + OptionMenuItemStaticText InitDirect(String label, int cr) + { + Super.Init(label, 'None', true); + mColor = cr; + return self; + } + + override int Draw(OptionMenuDescriptor desc, int y, int indent, bool selected) + { + drawLabel(indent, y, mColor); + return -1; + } + + override bool Selectable() + { + return false; + } + +} + +//============================================================================= +// +// +// +//============================================================================= + +class OptionMenuItemStaticTextSwitchable : OptionMenuItem +{ + int mColor; + String mAltText; + int mCurrent; + + // this function is only for use from MENUDEF, it needs to do some strange things with the color for backwards compatibility. + OptionMenuItemStaticTextSwitchable Init(String label, String label2, Name command, int cr = -1) + { + Super.Init(label, command, true); + mAltText = label2; + mCurrent = 0; + + mColor = OptionMenuSettings.mFontColor; + if ((cr & 0xffff0000) == 0x12340000) mColor = cr & 0xffff; + else if (cr > 0) mColor = OptionMenuSettings.mFontColorHeader; + return self; + } + + OptionMenuItemStaticTextSwitchable InitDirect(String label, String label2, Name command, int cr) + { + Super.Init(label, command, true); + mColor = cr; + mAltText = label2; + mCurrent = 0; + return self; + } + + override int Draw(OptionMenuDescriptor desc, int y, int indent, bool selected) + { + String txt = StringTable.Localize(mCurrent? mAltText : mLabel); + int w = Menu.OptionWidth(txt) * CleanXfac_1; + int x = (screen.GetWidth() - w) / 2; + drawText(x, y, mColor, txt); + return -1; + } + + override bool SetValue(int i, int val) + { + if (i == 0) + { + mCurrent = val; + return true; + } + return false; + } + + override bool SetString(int i, String newtext) + { + if (i == 0) + { + mAltText = newtext; + return true; + } + return false; + } + + override bool Selectable() + { + return false; + } +} + +//============================================================================= +// +// +// +//============================================================================= + +class OptionMenuSliderBase : OptionMenuItem +{ + // command is a CVAR + double mMin, mMax, mStep; + int mShowValue; + int mDrawX; + int mSliderShort; + CVar mGrayCheck; + + protected void Init(String label, double min, double max, double step, int showval, Name command = 'none', CVar graycheck = NULL) + { + Super.Init(label, command); + mMin = min; + mMax = max; + mStep = step; + mShowValue = showval; + mDrawX = 0; + mSliderShort = 0; + mGrayCheck = graycheck; + } + + virtual double GetSliderValue() + { + return 0; + } + + virtual void SetSliderValue(double val) + { + } + + bool IsGrayed(void) + { + return mGrayCheck != NULL && !mGrayCheck.GetInt(); + } + + override bool Selectable(void) + { + return !IsGrayed(); + } + + //============================================================================= + // + // Draw a slider. Set fracdigits negative to not display the current value numerically. + // + //============================================================================= + + private void DrawSliderElement (int color, int x, int y, String str, bool grayed = false) + { + int overlay = grayed? Color(96, 48, 0, 0) : 0; + screen.DrawText (ConFont, color, x, y, str, DTA_CellX, 16 * CleanXfac_1, DTA_CellY, 16 * CleanYfac_1, DTA_ColorOverlay, overlay); + } + + protected void DrawSlider (int x, int y, double min, double max, double cur, int fracdigits, int indent, bool grayed = false) + { + String formater = String.format("%%.%df", fracdigits); // The format function cannot do the '%.*f' syntax. + String textbuf; + double range; + int maxlen = 0; + int right = x + (12*16 + 4) * CleanXfac_1; // length of slider. This uses the old ConFont and + int cy = y + CleanYFac; + + range = max - min; + double ccur = clamp(cur, min, max) - min; + + if (fracdigits >= 0) + { + textbuf = String.format(formater, max); + maxlen = Menu.OptionWidth(textbuf) * CleanXfac_1; + } + + mSliderShort = right + maxlen > screen.GetWidth(); + + if (!mSliderShort) + { + DrawSliderElement(Font.CR_WHITE, x, cy, "\x10\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x12", grayed); + DrawSliderElement(Font.FindFontColor(gameinfo.mSliderColor), x + int((5 + ((ccur * 78) / range)) * 2 * CleanXfac_1), cy, "\x13", grayed); + } + else + { + // On 320x200 we need a shorter slider + DrawSliderElement(Font.CR_WHITE, x, cy, "\x10\x11\x11\x11\x11\x11\x12", grayed); + DrawSliderElement(Font.FindFontColor(gameinfo.mSliderColor), x + int((5 + ((ccur * 38) / range)) * 2 * CleanXfac_1), cy, "\x13", grayed); + right -= 5*8*CleanXfac; + } + + if (fracdigits >= 0 && right + maxlen <= screen.GetWidth()) + { + textbuf = String.format(formater, cur); + drawText(right, y, Font.CR_DARKGRAY, textbuf, grayed); + } + } + + + //============================================================================= + override int Draw(OptionMenuDescriptor desc, int y, int indent, bool selected) + { + drawLabel(indent, y, selected? OptionMenuSettings.mFontColorSelection : OptionMenuSettings.mFontColor, IsGrayed()); + mDrawX = indent + CursorSpace(); + DrawSlider (mDrawX, y, mMin, mMax, GetSliderValue(), mShowValue, indent, IsGrayed()); + return indent; + } + + //============================================================================= + override bool MenuEvent (int mkey, bool fromcontroller) + { + double value = GetSliderValue(); + + if (mkey == Menu.MKEY_Left) + { + value -= mStep; + } + else if (mkey == Menu.MKEY_Right) + { + value += mStep; + } + else + { + return OptionMenuItem.MenuEvent(mkey, fromcontroller); + } + if (value ~== 0) value = 0; // This is to prevent formatting anomalies with very small values + SetSliderValue(clamp(value, mMin, mMax)); + Menu.MenuSound("menu/change"); + return true; + } + + override bool MouseEvent(int type, int x, int y) + { + let lm = OptionMenu(Menu.GetCurrentMenu()); + if (type != Menu.MOUSE_Click) + { + if (!lm.CheckFocus(self)) return false; + } + if (type == Menu.MOUSE_Release) + { + lm.ReleaseFocus(); + } + + int slide_left = mDrawX+16*CleanXfac_1; + int slide_right = slide_left + (10*16*CleanXfac_1 >> mSliderShort); // 10 char cells with 16 pixels each. + + if (type == Menu.MOUSE_Click) + { + if (x < slide_left || x >= slide_right) return true; + } + + x = clamp(x, slide_left, slide_right); + double v = mMin + ((x - slide_left) * (mMax - mMin)) / (slide_right - slide_left); + if (v != GetSliderValue()) + { + SetSliderValue(v); + //Menu.MenuSound("menu/change"); + } + if (type == Menu.MOUSE_Click) + { + lm.SetFocus(self); + } + return true; + } + +} + +//============================================================================= +// +// +// +//============================================================================= + +class OptionMenuItemSlider : OptionMenuSliderBase +{ + CVar mCVar; + + OptionMenuItemSlider Init(String label, Name command, double min, double max, double step, int showval = 1, CVar graycheck = NULL) + { + Super.Init(label, min, max, step, showval, command, graycheck); + mCVar =CVar.FindCVar(command); + return self; + } + + override double GetSliderValue() + { + if (mCVar != null) + { + return mCVar.GetFloat(); + } + else + { + return 0; + } + } + + override void SetSliderValue(double val) + { + if (mCVar != null) + { + mCVar.SetFloat(val); + } + } +} + +//============================================================================= +// +// // Edit a key binding, Action is the CCMD to bind +// +//============================================================================= + +class OptionMenuItemColorPicker : OptionMenuItem +{ + CVar mCVar; + + const CPF_RESET = 0x20001; + + OptionMenuItemColorPicker Init(String label, Name command) + { + Super.Init(label, command); + CVar cv = CVar.FindCVar(command); + if (cv != null && cv.GetRealType() != CVar.CVAR_Color) cv = null; + mCVar = cv; + return self; + } + + //============================================================================= + override int Draw(OptionMenuDescriptor desc, int y, int indent, bool selected) + { + drawLabel(indent, y, selected? OptionMenuSettings.mFontColorSelection : OptionMenuSettings.mFontColor); + + if (mCVar != null) + { + int box_x = indent + CursorSpace(); + int box_y = y + CleanYfac_1; + screen.Clear (box_x, box_y, box_x + 32*CleanXfac_1, box_y + OptionMenuSettings.mLinespacing*CleanYfac_1, mCVar.GetInt() | 0xff000000); + } + return indent; + } + + override bool SetValue(int i, int v) + { + if (i == CPF_RESET && mCVar != null) + { + mCVar.ResetToDefault(); + return true; + } + return false; + } + + override bool Activate() + { + if (mCVar != null) + { + Menu.MenuSound("menu/choose"); + + // This code is a bit complicated because it should allow subclassing the + // colorpicker menu. + // New color pickers must inherit from the internal one to work here. + + let desc = MenuDescriptor.GetDescriptor('Colorpickermenu'); + if (desc != NULL && (desc.mClass == null || desc.mClass is "ColorPickerMenu")) + { + let odesc = OptionMenuDescriptor(desc); + if (odesc != null) + { + let cls = desc.mClass; + if (cls == null) cls = "ColorpickerMenu"; + let picker = ColorpickerMenu(new(cls)); + picker.Init(Menu.GetCurrentMenu(), mLabel, odesc, mCVar); + picker.ActivateMenu(); + return true; + } + } + } + return false; + } +} + +//============================================================================= +// +// [TP] OptionMenuFieldBase +// +// Base class for input fields +// +//============================================================================= + +class OptionMenuFieldBase : OptionMenuItem +{ + void Init (String label, Name command, CVar graycheck = null) + { + Super.Init(label, command); + mCVar = CVar.FindCVar(mAction); + mGrayCheck = graycheck; + } + + String GetCVarString() + { + if (mCVar == null) + return ""; + + return mCVar.GetString(); + } + + virtual String Represent() + { + return GetCVarString(); + } + + override int Draw (OptionMenuDescriptor d, int y, int indent, bool selected) + { + bool grayed = mGrayCheck != null && !mGrayCheck.GetInt(); + drawLabel(indent, y, selected ? OptionMenuSettings.mFontColorSelection : OptionMenuSettings.mFontColor, grayed); + drawValue(indent, y, OptionMenuSettings.mFontColorValue, Represent(), grayed); + return indent; + } + + override bool, String GetString (int i) + { + if (i == 0) + { + return true, GetCVarString(); + } + return false, ""; + } + + override bool SetString (int i, String s) + { + if (i == 0) + { + if (mCVar) mCVar.SetString(s); + return true; + } + return false; + } + + override bool Selectable() + { + return mGrayCheck == null || mGrayCheck.GetInt() != 0; + } + + CVar mCVar; + CVar mGrayCheck; +} + +//============================================================================= +// +// [TP] OptionMenuTextField +// +// A text input field widget, for use with string CVars. +// +//============================================================================= + +class OptionMenuItemTextField : OptionMenuFieldBase +{ + TextEnterMenu mEnter; + + OptionMenuItemTextField Init (String label, Name command, CVar graycheck = null) + { + Super.Init(label, command, graycheck); + mEnter = null; + return self; + } + + override String Represent() + { + if (mEnter) return mEnter.GetText() .. Menu.OptionFont().GetCursor(); + else + { + bool b; + String s; + [b, s] = GetString(0); + return s; + } + } + + override int Draw(OptionMenuDescriptor desc, int y, int indent, bool selected) + { + if (mEnter) + { + // reposition the text so that the cursor is visible when in entering mode. + String text = Represent(); + int tlen = Menu.OptionWidth(text) * CleanXfac_1; + int newindent = screen.GetWidth() - tlen - CursorSpace(); + if (newindent < indent) indent = newindent; + } + return Super.Draw(desc, y, indent, selected); + } + + override bool MenuEvent (int mkey, bool fromcontroller) + { + if (mkey == Menu.MKEY_Enter) + { + bool b; + String s; + [b, s] = GetString(0); + Menu.MenuSound("menu/choose"); + mEnter = TextEnterMenu.OpenTextEnter(Menu.GetCurrentMenu(), Menu.OptionFont(), s, -1, fromcontroller); + mEnter.ActivateMenu(); + return true; + } + else if (mkey == Menu.MKEY_Input) + { + SetString(0, mEnter.GetText()); + mEnter = null; + return true; + } + else if (mkey == Menu.MKEY_Abort) + { + mEnter = null; + return true; + } + + return Super.MenuEvent(mkey, fromcontroller); + } +} + + +//============================================================================= +// +// [TP] FOptionMenuNumberField +// +// A numeric input field widget, for use with number CVars where sliders are inappropriate (i.e. +// where the user is interested in the exact value specifically) +// +//============================================================================= + +class OptionMenuItemNumberField : OptionMenuFieldBase +{ + OptionMenuItemNumberField Init (String label, Name command, float minimum = 0, float maximum = 100, float step = 1, CVar graycheck = null) + { + Super.Init(label, command, graycheck); + mMinimum = min(minimum, maximum); + mMaximum = max(minimum, maximum); + mStep = max(1, step); + return self; + } + + override String Represent() + { + if (mCVar == null) return ""; + return String.format("%.3f", mCVar.GetFloat()); + } + + + override bool MenuEvent (int mkey, bool fromcontroller) + { + if (mCVar) + { + float value = mCVar.GetFloat(); + + if (mkey == Menu.MKEY_Left) + { + value -= mStep; + if (value < mMinimum) value = mMaximum; + } + else if (mkey == Menu.MKEY_Right || mkey == Menu.MKEY_Enter) + { + value += mStep; + if (value > mMaximum) value = mMinimum; + } + else + return Super.MenuEvent(mkey, fromcontroller); + + mCVar.SetFloat(value); + Menu.MenuSound("menu/change"); + } + else return Super.MenuEvent(mkey, fromcontroller); + + return true; + } + + float mMinimum; + float mMaximum; + float mStep; +} + +//============================================================================= +// +// A special slider that displays plain text for special settings related +// to scaling. +// +//============================================================================= + +class OptionMenuItemScaleSlider : OptionMenuItemSlider +{ + String TextZero; + String TextNegOne; + int mClickVal; + + OptionMenuItemScaleSlider Init(String label, Name command, double min, double max, double step, String zero, String negone = "") + { + Super.Init(label, command, min, max, step, 0); + mCVar =CVar.FindCVar(command); + TextZero = zero; + TextNEgOne = negone; + mClickVal = -10; + return self; + } + + //============================================================================= + override int Draw(OptionMenuDescriptor desc, int y, int indent, bool selected) + { + drawLabel(indent, y, selected? OptionMenuSettings.mFontColorSelection : OptionMenuSettings.mFontColor); + + int Selection = int(GetSliderValue()); + if ((Selection == 0 || Selection == -1) && mClickVal <= 0) + { + String text = Selection == 0? TextZero : Selection == -1? TextNegOne : ""; + drawValue(indent, y, OptionMenuSettings.mFontColorValue, text); + } + else + { + mDrawX = indent + CursorSpace(); + DrawSlider (mDrawX, y, mMin, mMax, GetSliderValue(), mShowValue, indent); + } + return indent; + } + + override bool MouseEvent(int type, int x, int y) + { + int value = int(GetSliderValue()); + switch (type) + { + case Menu.MOUSE_Click: + mClickVal = value; + if (value <= 0) return false; + return Super.MouseEvent(type, x, y); + + case Menu.MOUSE_Move: + if (mClickVal <= 0) return false; + return Super.MouseEvent(type, x, y); + + case Menu.MOUSE_Release: + if (mClickVal <= 0) + { + mClickVal = -10; + SetSliderValue(value + 1); + return true; + } + mClickVal = -10; + return Super.MouseEvent(type, x, y); + } + return false; + } + +} + diff --git a/wadsrc/static/zscript/ui/menu/reverbedit.zs b/wadsrc/static/zscript/ui/menu/reverbedit.zs new file mode 100644 index 000000000..65fa5158e --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/reverbedit.zs @@ -0,0 +1,258 @@ + +class ReverbEdit : OptionMenu +{ + static native double GetValue(int index); + static native double SetValue(int index, double value); + static native bool GrayCheck(); + static native string, int GetSelectedEnvironment(); + static native void FillSelectMenu(String ccmd, OptionMenuDescriptor desc); + static native void FillSaveMenu(OptionMenuDescriptor desc); + static native int GetSaveSelection(int num); + static native void ToggleSaveSelection(int num); + + override void Init(Menu parent, OptionMenuDescriptor desc) + { + super.Init(parent, desc); + OnReturn(); + } + + override void OnReturn() + { + string env; + int id; + + [env, id] = GetSelectedEnvironment(); + + let li = GetItem('EvironmentName'); + if (li != NULL) + { + if (id != -1) + { + li.SetValue(0, 1); + li.SetString(0, env); + } + else + { + li.SetValue(0, 0); + } + } + li = GetItem('EvironmentID'); + if (li != NULL) + { + if (id != -1) + { + li.SetValue(0, 1); + li.SetString(0, String.Format("%d, %d", (id >> 8) & 255, id & 255)); + } + else + { + li.SetValue(0, 0); + } + } + } +} + +class ReverbSelect : OptionMenu +{ + //============================================================================= + // + // + // + //============================================================================= + + override void Init(Menu parent, OptionMenuDescriptor desc) + { + ReverbEdit.FillSelectMenu("selectenvironment", desc); + super.Init(parent, desc); + } +} + +class ReverbSave : OptionMenu +{ + //============================================================================= + // + // + // + //============================================================================= + + override void Init(Menu parent, OptionMenuDescriptor desc) + { + ReverbEdit.FillSaveMenu(desc); + super.Init(parent, desc); + } +} + +//============================================================================= +// +// Change a CVAR, command is the CVAR name +// +//============================================================================= + +class OptionMenuItemReverbSaveSelect : OptionMenuItemOptionBase +{ + int mValIndex; + + OptionMenuItemReverbSaveSelect Init(String label, int index, Name values) + { + Super.Init(label, 'None', values, null, 0); + mValIndex = index; + return self; + } + + //============================================================================= + override int GetSelection() + { + return ReverbEdit.GetSaveSelection(mValIndex); + } + + override void SetSelection(int Selection) + { + ReverbEdit.ToggleSaveSelection(mValIndex); + } +} + + +//============================================================================= +// +// opens a submenu, command is a submenu name +// +//============================================================================= + +class OptionMenuItemReverbSelect : OptionMenuItemSubMenu +{ + OptionMenuItemReverbSelect Init(String label, Name command) + { + Super.init(label, command, 0, false); + return self; + } + + + override int Draw(OptionMenuDescriptor desc, int y, int indent, bool selected) + { + int x = drawLabel(indent, y, selected? OptionMenuSettings.mFontColorSelection : OptionMenuSettings.mFontColor); + + String text = ReverbEdit.GetSelectedEnvironment(); + drawValue(indent, y, OptionMenuSettings.mFontColorValue, text); + return indent; + } +} + + +//============================================================================= +// +// +// +//============================================================================= + +class OptionMenuItemReverbOption : OptionMenuItemOptionBase +{ + int mValIndex; + + OptionMenuItemReverbOption Init(String label, int valindex, Name values) + { + Super.Init(label, "", values, null, false); + mValIndex = valindex; + return self; + } + + override bool isGrayed() + { + return ReverbEdit.GrayCheck(); + } + + override int GetSelection() + { + return int(ReverbEdit.GetValue(mValIndex)); + } + + override void SetSelection(int Selection) + { + ReverbEdit.SetValue(mValIndex, Selection); + } +} + +//============================================================================= +// +// +// +//============================================================================= + +class OptionMenuItemSliderReverbEditOption : OptionMenuSliderBase +{ + int mValIndex; + String mEditValue; + TextEnterMenu mEnter; + + OptionMenuItemSliderReverbEditOption Init(String label, double min, double max, double step, int showval, int valindex) + { + Super.Init(label, min, max, step, showval); + mValIndex = valindex; + mEnter = null; + return self; + } + + + override double GetSliderValue() + { + return ReverbEdit.GetValue(mValIndex); + } + + override void SetSliderValue(double val) + { + ReverbEdit.SetValue(mValIndex, val); + } + + override bool Selectable() + { + return !ReverbEdit.GrayCheck(); + } + + virtual String Represent() + { + return mEnter.GetText() .. Menu.OptionFont().GetCursor(); + } + + //============================================================================= + override int Draw(OptionMenuDescriptor desc, int y, int indent, bool selected) + { + drawLabel(indent, y, selected ? OptionMenuSettings.mFontColorSelection : OptionMenuSettings.mFontColor, ReverbEdit.GrayCheck()); + + mDrawX = indent + CursorSpace(); + if (mEnter) + { + drawText(mDrawX, y, OptionMenuSettings.mFontColorValue, Represent()); + } + else + { + DrawSlider (mDrawX, y, mMin, mMax, GetSliderValue(), mShowValue, indent); + } + return indent; + } + + override bool MenuEvent (int mkey, bool fromcontroller) + { + if (mkey == Menu.MKEY_Enter) + { + Menu.MenuSound("menu/choose"); + mEnter = TextEnterMenu.OpenTextEnter(Menu.GetCurrentMenu(), Menu.OptionFont(), String.Format("%.3f", GetSliderValue()), -1, fromcontroller); + mEnter.ActivateMenu(); + return true; + } + else if (mkey == Menu.MKEY_Input) + { + String val = mEnter.GetText(); + SetSliderValue(val.toDouble()); + mEnter = null; + return true; + } + else if (mkey == Menu.MKEY_Abort) + { + mEnter = null; + return true; + } + + return Super.MenuEvent(mkey, fromcontroller); + } + +} + diff --git a/wadsrc/static/zscript/ui/menu/search/anyoralloption.zs b/wadsrc/static/zscript/ui/menu/search/anyoralloption.zs new file mode 100644 index 000000000..d38983b4b --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/search/anyoralloption.zs @@ -0,0 +1,33 @@ +//============================================================================= +// +// os_AnyOrAllOption class represents an Option Item for Option Search menu. +// Changing the value of this option causes the menu to refresh the search +// results. +// +//============================================================================= + +class os_AnyOrAllOption : OptionMenuItemOption +{ + os_AnyOrAllOption Init(os_Menu menu) + { + Super.Init("", "os_isanyof", "os_isanyof_values"); + + mMenu = menu; + + return self; + } + + override bool MenuEvent(int mkey, bool fromcontroller) + { + bool result = Super.MenuEvent(mkey, fromcontroller); + + if (mKey == Menu.MKEY_Left || mKey == Menu.MKEY_Right || mkey == Menu.MKEY_Enter) + { + mMenu.search(); + } + + return result; + } + + private os_Menu mMenu; +} diff --git a/wadsrc/static/zscript/ui/menu/search/menu.zs b/wadsrc/static/zscript/ui/menu/search/menu.zs new file mode 100644 index 000000000..46efc0c6a --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/search/menu.zs @@ -0,0 +1,218 @@ +//============================================================================= +// +// Option Search Menu class. +// This menu contains search field, and is dynamically filled with search +// results. +// +//============================================================================= + +class os_Menu : OptionMenu +{ + override void Init(Menu parent, OptionMenuDescriptor desc) + { + Super.Init(parent, desc); + + mDesc.mItems.clear(); + + addSearchField(); + + mDesc.mScrollPos = 0; + mDesc.mSelectedItem = 0; + mDesc.CalcIndent(); + } + + void search() + { + string text = mSearchField.GetText(); + let query = os_Query.fromString(text); + bool isAnyTermMatches = mIsAnyOfItem.mCVar.GetBool(); + + mDesc.mItems.clear(); + + addSearchField(text); + + bool found = listOptions(mDesc, "MainMenu", query, "", isAnyTermMatches); + + if (!found) { addNoResultsItem(mDesc); } + + mDesc.CalcIndent(); + } + + private void addSearchField(string query = "") + { + string searchLabel = StringTable.Localize("$OS_LABEL"); + + mSearchField = new("os_SearchField").Init(searchLabel, self, query); + mIsAnyOfItem = new("os_AnyOrAllOption").Init(self); + + mDesc.mItems.push(mSearchField); + mDesc.mItems.push(mIsAnyOfItem); + addEmptyLine(mDesc); + } + + private static bool listOptions(OptionMenuDescriptor targetDesc, + string menuName, + os_Query query, + string path, + bool isAnyTermMatches) + { + let desc = MenuDescriptor.GetDescriptor(menuName); + let listMenuDesc = ListMenuDescriptor(desc); + + if (listMenuDesc) + { + return listOptionsListMenu(listMenuDesc, targetDesc, query, path, isAnyTermMatches); + } + + let optionMenuDesc = OptionMenuDescriptor(desc); + + if (optionMenuDesc) + { + return listOptionsOptionMenu(optionMenuDesc, targetDesc, query, path, isAnyTermMatches); + } + + return false; + } + + private static bool listOptionsListMenu(ListMenuDescriptor sourceDesc, + OptionMenuDescriptor targetDesc, + os_Query query, + string path, + bool isAnyTermMatches) + { + int nItems = sourceDesc.mItems.size(); + bool found = false; + + for (int i = 0; i < nItems; ++i) + { + let item = sourceDesc.mItems[i]; + string actionN = item.GetAction(); + let textItem = ListMenuItemTextItem(item); + string newPath = textItem + ? makePath(path, StringTable.Localize(textItem.mText)) + : path; + + found |= listOptions(targetDesc, actionN, query, newPath, isAnyTermMatches); + } + + return found; + } + + private static bool listOptionsOptionMenu(OptionMenuDescriptor sourceDesc, + OptionMenuDescriptor targetDesc, + os_Query query, + string path, + bool isAnyTermMatches) + { + if (sourceDesc == targetDesc) { return false; } + + int nItems = sourceDesc.mItems.size(); + bool first = true; + bool found = false; + + for (int i = 0; i < nItems; ++i) + { + let item = sourceDesc.mItems[i]; + + if (item is "OptionMenuItemStaticText") { continue; } + + string label = StringTable.Localize(item.mLabel); + + if (!query.matches(label, isAnyTermMatches)) { continue; } + + found = true; + + if (first) + { + addEmptyLine(targetDesc); + addPathItem(targetDesc, path); + + first = false; + } + + let itemOptionBase = OptionMenuItemOptionBase(item); + + if (itemOptionBase) + { + itemOptionBase.mCenter = false; + } + + targetDesc.mItems.push(item); + } + + for (int i = 0; i < nItems; ++i) + { + let item = sourceDesc.mItems[i]; + string label = StringTable.Localize(item.mLabel); + string optionSearchTitle = StringTable.Localize("$OS_TITLE"); + + if (label == optionSearchTitle) { continue; } + + if (item is "OptionMenuItemSubMenu") + { + string newPath = makePath(path, label); + + found |= listOptions(targetDesc, item.GetAction(), query, newPath, isAnyTermMatches); + } + } + + return found; + } + + private static string makePath(string path, string label) + { + if (path.length() == 0) { return label; } + + int pathWidth = SmallFont.StringWidth(path .. "/" .. label); + int screenWidth = Screen.GetWidth(); + bool isTooWide = (pathWidth > screenWidth / 3); + string newPath = isTooWide + ? path .. "/" .. "\n" .. label + : path .. "/" .. label; + + return newPath; + } + + private static void addPathItem(OptionMenuDescriptor desc, string path) + { + Array lines; + path.split(lines, "\n"); + + int nLines = lines.size(); + + for (int i = 0; i < nLines; ++i) + { + OptionMenuItemStaticText text = new("OptionMenuItemStaticText").Init(lines[i], 1); + + desc.mItems.push(text); + } + } + + private static void addEmptyLine(OptionMenuDescriptor desc) + { + int nItems = desc.mItems.size(); + + if (nItems > 0) + { + let staticText = OptionMenuItemStaticText(desc.mItems[nItems - 1]); + + if (staticText != null && staticText.mLabel == "") { return; } + } + + let item = new("OptionMenuItemStaticText").Init(""); + + desc.mItems.push(item); + } + + private static void addNoResultsItem(OptionMenuDescriptor desc) + { + string noResults = StringTable.Localize("$OS_NO_RESULTS"); + let text = new("OptionMenuItemStaticText").Init(noResults, 0); + + addEmptyLine(desc); + desc.mItems.push(text); + } + + private os_AnyOrAllOption mIsAnyOfItem; + private os_SearchField mSearchField; +} diff --git a/wadsrc/static/zscript/ui/menu/search/query.zs b/wadsrc/static/zscript/ui/menu/search/query.zs new file mode 100644 index 000000000..70c5437c1 --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/search/query.zs @@ -0,0 +1,73 @@ +//============================================================================= +// +// Option Search Query class represents a search query. +// A search query consists constists of one or more terms (words). +// +// Query matching deponds on "os_is_any_of" variable. +// If this variable is "true", the text matches the query if any of the terms +// matches the query. +// If this variable is "false", the text matches the query only if all the +// terms match the query. +// +//============================================================================= + +class os_Query +{ + static os_Query fromString(string str) + { + let query = new("os_Query"); + + str.Split(query.mQueryParts, " ", TOK_SKIPEMPTY); + + return query; + } + + bool matches(string text, bool isSearchForAny) + { + return isSearchForAny + ? matchesAny(text) + : matchesAll(text); + } + + // private: ////////////////////////////////////////////////////////////////// + + private bool matchesAny(string text) + { + int nParts = mQueryParts.size(); + + for (int i = 0; i < nParts; ++i) + { + string queryPart = mQueryParts[i]; + + if (contains(text, queryPart)) { return true; } + } + + return false; + } + + private bool matchesAll(string text) + { + int nParts = mQueryParts.size(); + + for (int i = 0; i < nParts; ++i) + { + string queryPart = mQueryParts[i]; + + if (!contains(text, queryPart)) { return false; } + } + + return true; + } + + private static bool contains(string str, string substr) + { + let lowerstr = str .MakeLower(); + let lowersubstr = substr.MakeLower(); + + bool contains = (lowerstr.IndexOf(lowersubstr) != -1); + + return contains; + } + + private Array mQueryParts; +} diff --git a/wadsrc/static/zscript/ui/menu/search/searchfield.zs b/wadsrc/static/zscript/ui/menu/search/searchfield.zs new file mode 100644 index 000000000..88135716a --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/search/searchfield.zs @@ -0,0 +1,52 @@ +//============================================================================= +// +// Option Search Field class. +// +// When the search query is entered, makes Search Menu perform a search. +// +//============================================================================= + +class os_SearchField : OptionMenuItemTextField +{ + os_SearchField Init(String label, os_Menu menu, string query) + { + Super.Init(label, ""); + + mMenu = menu; + + mText = query; + + return self; + } + + override bool MenuEvent(int mkey, bool fromcontroller) + { + if (mkey == Menu.MKEY_Enter) + { + Menu.MenuSound("menu/choose"); + mEnter = TextEnterMenu.OpenTextEnter(Menu.GetCurrentMenu(), Menu.OptionFont(), mText, -1, fromcontroller); + mEnter.ActivateMenu(); + return true; + } + if (mkey == Menu.MKEY_Input) + { + mtext = mEnter.GetText(); + + mMenu.search(); + } + + return Super.MenuEvent(mkey, fromcontroller); + } + + override String Represent() + { + return mEnter + ? mEnter.GetText() .. NewSmallFont.GetCursor() + : mText; + } + + String GetText() { return mText; } + + private os_Menu mMenu; + private string mText; +} diff --git a/wadsrc/static/zscript/ui/menu/textentermenu.zs b/wadsrc/static/zscript/ui/menu/textentermenu.zs new file mode 100644 index 000000000..2f179d0d7 --- /dev/null +++ b/wadsrc/static/zscript/ui/menu/textentermenu.zs @@ -0,0 +1,379 @@ +/* +** menuinput.cpp +** The string input code +** +**--------------------------------------------------------------------------- +** Copyright 2001-2010 Randy Heit +** Copyright 2010-2017 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. +**--------------------------------------------------------------------------- +** +*/ + + +class TextEnterMenu : Menu +{ + const INPUTGRID_WIDTH = 13; + const INPUTGRID_HEIGHT = 5; + + const Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-=.,!?@'\":;[]()<>^#$%&*/_ \b"; + + String mEnterString; + int mEnterSize; + int mEnterPos; + bool mInputGridOkay; + int InputGridX; + int InputGridY; + int CursorSize; + bool AllowColors; + Font displayFont; + + //============================================================================= + // + // + // + //============================================================================= + + // [TP] Added allowcolors + private void Init(Menu parent, Font dpf, String textbuffer, int maxlen, bool showgrid, bool allowcolors) + { + Super.init(parent); + mEnterString = textbuffer; + mEnterSize = maxlen; + mInputGridOkay = (showgrid && (m_showinputgrid == 0)) || (m_showinputgrid >= 1); + if (mEnterString.Length() > 0) + { + InputGridX = INPUTGRID_WIDTH - 1; + InputGridY = INPUTGRID_HEIGHT - 1; + } + else + { + // If we are naming a new save, don't start the cursor on "end". + InputGridX = 0; + InputGridY = 0; + } + AllowColors = allowcolors; // [TP] + displayFont = dpf; + CursorSize = displayFont.StringWidth(displayFont.GetCursor()); + } + + // 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, Menu.OptionFont(), 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; + } + + + //============================================================================= + // + // + // + //============================================================================= + + String GetText() + { + return mEnterString; + } + + override bool TranslateKeyboardEvents() + { + return mInputGridOkay; + } + + + //============================================================================= + // + // + // + //============================================================================= + + override bool OnUIEvent(UIEvent ev) + { + // Save game and player name string input + if (ev.Type == UIEvent.Type_Char) + { + mInputGridOkay = false; + AppendChar(ev.KeyChar); + return true; + } + int ch = ev.KeyChar; + if ((ev.Type == UIEvent.Type_KeyDown || ev.Type == UIEvent.Type_KeyRepeat) && ch == 8) + { + if (mEnterString.Length() > 0) + { + mEnterString.DeleteLastCharacter(); + } + } + else if (ev.Type == UIEvent.Type_KeyDown) + { + if (ch == UIEvent.Key_ESCAPE) + { + Menu parent = mParentMenu; + Close(); + parent.MenuEvent(MKEY_Abort, false); + return true; + } + else if (ch == 13) + { + if (mEnterString.Length() > 0) + { + // [TP] If we allow color codes, colorize the string now. + if (AllowColors) + mEnterString = mEnterString.Filter(); + + Menu parent = mParentMenu; + parent.MenuEvent(MKEY_Input, false); + Close(); + return true; + } + } + } + if (ev.Type == UIEvent.Type_KeyDown || ev.Type == UIEvent.Type_KeyRepeat) + { + return true; + } + return Super.OnUIEvent(ev); + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool MouseEvent(int type, int x, int y) + { + int cell_width = 18 * CleanXfac_1; + int cell_height = 16 * CleanYfac_1; + int screen_y = screen.GetHeight() - INPUTGRID_HEIGHT * cell_height; + int screen_x = (screen.GetWidth() - INPUTGRID_WIDTH * cell_width) / 2; + + if (x >= screen_x && x < screen_x + INPUTGRID_WIDTH * cell_width && y >= screen_y) + { + InputGridX = (x - screen_x) / cell_width; + InputGridY = (y - screen_y) / cell_height; + if (type == MOUSE_Release) + { + if (MenuEvent(MKEY_Enter, true)) + { + MenuSound("menu/choose"); + if (m_use_mouse == 2) InputGridX = InputGridY = -1; + } + } + return true; + } + else + { + InputGridX = InputGridY = -1; + } + return Super.MouseEvent(type, x, y); + } + + //============================================================================= + // + // + // + //============================================================================= + + private void AppendChar(int ch) + { + String newstring = String.Format("%s%c%s", mEnterString, ch, displayFont.GetCursor()); + if (mEnterSize < 0 || displayFont.StringWidth(newstring) < mEnterSize) + { + mEnterString.AppendCharacter(ch); + } + } + + //============================================================================= + // + // + // + //============================================================================= + + override bool MenuEvent (int key, bool fromcontroller) + { + String InputGridChars = Chars; + if (key == MKEY_Back) + { + mParentMenu.MenuEvent(MKEY_Abort, false); + return Super.MenuEvent(key, fromcontroller); + } + if (fromcontroller) + { + mInputGridOkay = true; + } + + if (mInputGridOkay) + { + int ch; + + if (InputGridX == -1 || InputGridY == -1) + { + InputGridX = InputGridY = 0; + } + switch (key) + { + case MKEY_Down: + InputGridY = (InputGridY + 1) % INPUTGRID_HEIGHT; + return true; + + case MKEY_Up: + InputGridY = (InputGridY + INPUTGRID_HEIGHT - 1) % INPUTGRID_HEIGHT; + return true; + + case MKEY_Right: + InputGridX = (InputGridX + 1) % INPUTGRID_WIDTH; + return true; + + case MKEY_Left: + InputGridX = (InputGridX + INPUTGRID_WIDTH - 1) % INPUTGRID_WIDTH; + return true; + + case MKEY_Clear: + if (mEnterString.Length() > 0) + { + mEnterString.DeleteLastCharacter(); + } + return true; + + case MKEY_Enter: + if (mInputGridOkay) + { + int ch = InputGridChars.ByteAt(InputGridX + InputGridY * INPUTGRID_WIDTH); + if (ch == 0) // end + { + if (mEnterString.Length() > 0) + { + Menu parent = mParentMenu; + parent.MenuEvent(MKEY_Input, false); + Close(); + return true; + } + } + else if (ch == 8) // bs + { + if (mEnterString.Length() > 0) + { + mEnterString.DeleteLastCharacter(); + } + } + else + { + AppendChar(ch); + } + } + return true; + + default: + break; + } + } + return false; + } + + + //============================================================================= + // + // + // + //============================================================================= + + override void Drawer () + { + mParentMenu.Drawer(); + if (mInputGridOkay) + { + String InputGridChars = Chars; + int cell_width = 18 * CleanXfac_1; + int cell_height = 16 * CleanYfac_1; + int top_padding = cell_height / 2 - displayFont.GetHeight() * CleanYfac_1 / 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); + + if (InputGridX >= 0 && InputGridY >= 0) + { + // Highlight the background behind the selected character. + screen.Dim(Color(255,248,220), 0.6, + InputGridX * cell_width - INPUTGRID_WIDTH * cell_width / 2 + screen.GetWidth() / 2, + InputGridY * cell_height - INPUTGRID_HEIGHT * cell_height + screen.GetHeight(), + cell_width, cell_height); + } + + for (int y = 0; y < INPUTGRID_HEIGHT; ++y) + { + int yy = y * cell_height - INPUTGRID_HEIGHT * cell_height + screen.GetHeight(); + for (int x = 0; x < INPUTGRID_WIDTH; ++x) + { + int xx = x * cell_width - INPUTGRID_WIDTH * cell_width / 2 + screen.GetWidth() / 2; + int ch = InputGridChars.ByteAt(y * INPUTGRID_WIDTH + x); + 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; + Color palcolor = (x == InputGridX && y == InputGridY) ? Color(160, 120, 0) : Color(120, 120, 120); + + if (ch > 32) + { + // Draw a normal character. + screen.DrawChar(displayFont, colr, xx + cell_width/2 - width*CleanXfac_1/2, yy + top_padding, ch, DTA_CleanNoMove_1, true); + } + else if (ch == 32) + { + // Draw the space as a box outline. We also draw it 50% wider than it really is. + int x1 = xx + cell_width/2 - width * CleanXfac_1 * 3 / 4; + int x2 = x1 + width * 3 * CleanXfac_1 / 2; + int y1 = yy + top_padding; + int y2 = y1 + displayFont.GetHeight() * CleanYfac_1; + screen.Clear(x1, y1, x2, y1+CleanYfac_1, palcolor); // top + screen.Clear(x1, y2, x2, y2+CleanYfac_1, palcolor); // bottom + screen.Clear(x1, y1+CleanYfac_1, x1+CleanXfac_1, y2, palcolor); // left + screen.Clear(x2-CleanXfac_1, y1+CleanYfac_1, x2, y2, palcolor); // right + } + else if (ch == 8 || ch == 0) + { + // Draw the backspace and end "characters". + String str = ch == 8 ? "BS" : "ED"; + screen.DrawText(displayFont, colr, + xx + cell_width/2 - displayFont.StringWidth(str)*CleanXfac_1/2, + yy + top_padding, str, DTA_CleanNoMove_1, true); + } + } + } + } + Super.Drawer(); + } + +}