This commit is contained in:
Rachael Alexanderson 2019-08-04 09:37:17 -04:00
commit b813cba1bc
114 changed files with 9777 additions and 4832 deletions

View file

@ -2,8 +2,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
bzip2/libbzip2 version 1.0.7 of 27 June 2019
Copyright (C) 1996-2010 Julian Seward <jseward@acm.org>
bzip2/libbzip2 version 1.0.8 of 13 July 2019
Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
@ -338,3 +338,19 @@ Security fix only. Fixes CERT-FI 20469 as it applies to bzip2.
* bzip2recover: Fix use after free issue with outFile (CVE-2016-3189)
* Make sure nSelectors is not out of range (CVE-2019-12900)
1.0.8 (13 Jul 19)
~~~~~~~~~~~~~~~~~
* Accept as many selectors as the file format allows.
This relaxes the fix for CVE-2019-12900 from 1.0.7
so that bzip2 allows decompression of bz2 files that
use (too) many selectors again.
* Fix handling of large (> 4GB) files on Windows.
* Cleanup of bzdiff and bzgrep scripts so they don't use
any bash extensions and handle multiple archives correctly.
* There is now a bz2-files testsuite at
https://sourceware.org/git/bzip2-tests.git

View file

@ -2,7 +2,7 @@
--------------------------------------------------------------------------
This program, "bzip2", the associated library "libbzip2", and all
documentation, are copyright (C) 1996-2010 Julian R Seward. All
documentation, are copyright (C) 1996-2019 Julian R Seward. All
rights reserved.
Redistribution and use in source and binary forms, with or without
@ -37,6 +37,6 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Julian Seward, jseward@acm.org
bzip2/libbzip2 version 1.0.7 of 27 June 2019
bzip2/libbzip2 version 1.0.8 of 13 July 2019
--------------------------------------------------------------------------

View file

@ -6,8 +6,8 @@ This version is fully compatible with the previous public releases.
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
bzip2/libbzip2 version 1.0.7 of 27 June 2019
Copyright (C) 1996-2010 Julian Seward <jseward@acm.org>
bzip2/libbzip2 version 1.0.8 of 13 July 2019
Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in this file.
@ -165,8 +165,8 @@ WHAT'S NEW IN 1.0.x ?
See the CHANGES file.
I hope you find bzip2 useful. Feel free to contact me at
jseward@acm.org
I hope you find bzip2 useful. Feel free to contact the developers at
bzip2-devel@sourceware.org
if you have any suggestions or queries. Many people mailed me with
comments, suggestions and patches after the releases of bzip-0.15,
bzip-0.21, and bzip2 versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1,
@ -193,3 +193,4 @@ Cambridge, UK.
10 December 2007 (bzip2, version 1.0.5)
6 Sept 2010 (bzip2, version 1.0.6)
27 June 2019 (bzip2, version 1.0.7)
13 July 2019 (bzip2, version 1.0.8)

View file

@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
bzip2/libbzip2 version 1.0.7 of 27 June 2019
Copyright (C) 1996-2010 Julian Seward <jseward@acm.org>
bzip2/libbzip2 version 1.0.8 of 13 July 2019
Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.

View file

@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
bzip2/libbzip2 version 1.0.7 of 27 June 2019
Copyright (C) 1996-2010 Julian Seward <jseward@acm.org>
bzip2/libbzip2 version 1.0.8 of 13 July 2019
Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
@ -43,12 +43,12 @@ void BZ2_bz__AssertH__fail ( int errcode )
fprintf(stderr,
"\n\nbzip2/libbzip2: internal error number %d.\n"
"This is a bug in bzip2/libbzip2, %s.\n"
"Please report it to me at: jseward@acm.org. If this happened\n"
"Please report it to: bzip2-devel@sourceware.org. If this happened\n"
"when you were using some program which uses libbzip2 as a\n"
"component, you should also report this bug to the author(s)\n"
"of that program. Please make an effort to report this bug;\n"
"timely and accurate bug reports eventually lead to higher\n"
"quality software. Thanks. Julian Seward, 10 December 2007.\n\n",
"quality software. Thanks.\n\n",
errcode,
BZ2_bzlibVersion()
);

View file

@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
bzip2/libbzip2 version 1.0.7 of 27 June 2019
Copyright (C) 1996-2010 Julian Seward <jseward@acm.org>
bzip2/libbzip2 version 1.0.8 of 13 July 2019
Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.

View file

@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
bzip2/libbzip2 version 1.0.7 of 27 June 2019
Copyright (C) 1996-2010 Julian Seward <jseward@acm.org>
bzip2/libbzip2 version 1.0.8 of 13 July 2019
Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
@ -36,7 +36,7 @@
/*-- General stuff. --*/
#define BZ_VERSION "1.0.7, 27-Jun-2019"
#define BZ_VERSION "1.0.8, 13-Jul-2019"
typedef char Char;
typedef unsigned char Bool;

View file

@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
bzip2/libbzip2 version 1.0.7 of 27 June 2019
Copyright (C) 1996-2010 Julian Seward <jseward@acm.org>
bzip2/libbzip2 version 1.0.8 of 13 July 2019
Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
@ -454,7 +454,7 @@ void sendMTFValues ( EState* s )
AssertH( nGroups < 8, 3002 );
AssertH( nSelectors < 32768 &&
nSelectors <= (2 + (900000 / BZ_G_SIZE)),
nSelectors <= BZ_MAX_SELECTORS,
3003 );

View file

@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
bzip2/libbzip2 version 1.0.7 of 27 June 2019
Copyright (C) 1996-2010 Julian Seward <jseward@acm.org>
bzip2/libbzip2 version 1.0.8 of 13 July 2019
Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.

View file

@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
bzip2/libbzip2 version 1.0.7 of 27 June 2019
Copyright (C) 1996-2010 Julian Seward <jseward@acm.org>
bzip2/libbzip2 version 1.0.8 of 13 July 2019
Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
@ -287,7 +287,7 @@ Int32 BZ2_decompress ( DState* s )
GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
if (nGroups < 2 || nGroups > BZ_N_GROUPS) RETURN(BZ_DATA_ERROR);
GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
if (nSelectors < 1 || nSelectors > BZ_MAX_SELECTORS) RETURN(BZ_DATA_ERROR);
if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
for (i = 0; i < nSelectors; i++) {
j = 0;
while (True) {
@ -296,8 +296,14 @@ Int32 BZ2_decompress ( DState* s )
j++;
if (j >= nGroups) RETURN(BZ_DATA_ERROR);
}
s->selectorMtf[i] = j;
/* Having more than BZ_MAX_SELECTORS doesn't make much sense
since they will never be used, but some implementations might
"round up" the number of selectors, so just ignore those. */
if (i < BZ_MAX_SELECTORS)
s->selectorMtf[i] = j;
}
if (nSelectors > BZ_MAX_SELECTORS)
nSelectors = BZ_MAX_SELECTORS;
/*--- Undo the MTF values for the selectors. ---*/
{

View file

@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
bzip2/libbzip2 version 1.0.7 of 27 June 2019
Copyright (C) 1996-2010 Julian Seward <jseward@acm.org>
bzip2/libbzip2 version 1.0.8 of 13 July 2019
Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.

View file

@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
bzip2/libbzip2 version 1.0.7 of 27 June 2019
Copyright (C) 1996-2010 Julian Seward <jseward@acm.org>
bzip2/libbzip2 version 1.0.8 of 13 July 2019
Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.

View file

@ -920,6 +920,7 @@ set (VULKAN_SOURCES
rendering/vulkan/system/vk_buffers.cpp
rendering/vulkan/renderer/vk_renderstate.cpp
rendering/vulkan/renderer/vk_renderpass.cpp
rendering/vulkan/renderer/vk_streambuffer.cpp
rendering/vulkan/renderer/vk_postprocess.cpp
rendering/vulkan/renderer/vk_renderbuffers.cpp
rendering/vulkan/shaders/vk_shader.cpp
@ -1481,8 +1482,14 @@ if( ZD_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE )
endif()
if( APPLE )
set( LINK_FRAMEWORKS "-framework Cocoa -framework IOKit -framework OpenGL")
if( HAVE_VULKAN )
set( LINK_FRAMEWORKS "${LINK_FRAMEWORKS} -framework QuartzCore" )
endif()
set_target_properties(zdoom PROPERTIES
LINK_FLAGS "-framework Cocoa -framework IOKit -framework OpenGL"
LINK_FLAGS "${LINK_FRAMEWORKS}"
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/posix/osx/zdoom-info.plist" )
# Dymanic libraries like libvulkan.dylib or libMoltenVK.dylib will be loaded by dlopen()

View file

@ -581,11 +581,6 @@ CUSTOM_CVAR (Int, msgmidcolor2, 4, CVAR_ARCHIVE)
setmsgcolor (PRINTLEVELS+1, self);
}
FFont * C_GetDefaultHUDFont()
{
return generic_ui? NewSmallFont : SmallFont;
}
void C_InitConback()
{
conback = TexMan.CheckForTexture ("CONBACK", ETextureType::MiscPatch);

View file

@ -94,8 +94,9 @@ void G_DoPlayDemo (void);
void G_DoCompleted (void);
void G_DoVictory (void);
void G_DoWorldDone (void);
void G_DoSaveGame (bool okForQuicksave, FString filename, const char *description);
void G_DoSaveGame (bool okForQuicksave, bool forceQuicksave, FString filename, const char *description);
void G_DoAutoSave ();
void G_DoQuickSave ();
void STAT_Serialize(FSerializer &file);
bool WriteZip(const char *filename, TArray<FString> &filenames, TArray<FCompressedBuffer> &content);
@ -1058,7 +1059,7 @@ void G_Ticker ()
G_DoLoadGame ();
break;
case ga_savegame:
G_DoSaveGame (true, savegamefile, savedescription);
G_DoSaveGame (true, false, savegamefile, savedescription);
gameaction = ga_nothing;
savegamefile = "";
savedescription = "";
@ -2027,6 +2028,14 @@ CUSTOM_CVAR (Int, autosavecount, 4, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
if (self < 0)
self = 0;
}
CVAR (Int, quicksavenum, -1, CVAR_NOSET|CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
static int lastquicksave = -1;
CVAR (Bool, quicksaverotation, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
CUSTOM_CVAR (Int, quicksaverotationcount, 4, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
{
if (self < 1)
self = 1;
}
void G_DoAutoSave ()
{
@ -2060,7 +2069,35 @@ void G_DoAutoSave ()
readableTime = myasctime ();
description.Format("Autosave %s", readableTime);
G_DoSaveGame (false, file, description);
G_DoSaveGame (false, false, file, description);
}
void G_DoQuickSave ()
{
FString description;
FString file;
// Keeps a rotating set of quicksaves
UCVarValue num;
const char *readableTime;
int count = quicksaverotationcount != 0 ? quicksaverotationcount : 1;
if (quicksavenum < 0)
{
lastquicksave = 0;
}
else
{
lastquicksave = (quicksavenum + 1) % count;
}
num.Int = lastquicksave;
quicksavenum.ForceSet (num, CVAR_Int);
file = G_BuildSaveName ("quick", lastquicksave);
readableTime = myasctime ();
description.Format("Quicksave %s", readableTime);
G_DoSaveGame (true, true, file, description);
}
@ -2165,7 +2202,7 @@ static void PutSavePic (FileWriter *file, int width, int height)
}
}
void G_DoSaveGame (bool okForQuicksave, FString filename, const char *description)
void G_DoSaveGame (bool okForQuicksave, bool forceQuicksave, FString filename, const char *description)
{
TArray<FCompressedBuffer> savegame_content;
TArray<FString> savegame_filenames;
@ -2281,7 +2318,7 @@ void G_DoSaveGame (bool okForQuicksave, FString filename, const char *descriptio
WriteZip(filename, savegame_filenames, savegame_content);
savegameManager.NotifyNewSave (filename, description, okForQuicksave);
savegameManager.NotifyNewSave (filename, description, okForQuicksave, forceQuicksave);
// delete the JSON buffers we created just above. Everything else will
// either still be needed or taken care of automatically.

View file

@ -82,6 +82,8 @@ void G_DoLoadGame (void);
// Called by M_Responder.
void G_SaveGame (const char *filename, const char *description);
// Called by messagebox
void G_DoQuickSave ();
// Only called by startup code.
void G_RecordDemo (const char* name);

View file

@ -86,7 +86,7 @@ EXTERN_CVAR (Int, con_scaletext)
EXTERN_CVAR(Bool, vid_fps)
EXTERN_CVAR(Bool, inter_subtitles)
CVAR(Int, hud_scale, 0, CVAR_ARCHIVE);
CVAR(Bool, log_vgafont, false, CVAR_ARCHIVE)
DBaseStatusBar *StatusBar;
@ -1231,10 +1231,10 @@ void DBaseStatusBar::DrawLog ()
if (text.IsNotEmpty())
{
// This uses the same scaling as regular HUD messages
auto scale = active_con_scaletext(generic_ui);
auto scale = active_con_scaletext(generic_ui || log_vgafont);
hudwidth = SCREENWIDTH / scale;
hudheight = SCREENHEIGHT / scale;
FFont *font = C_GetDefaultHUDFont();
FFont *font = (generic_ui || log_vgafont)? NewSmallFont : SmallFont;
int linelen = hudwidth<640? Scale(hudwidth,9,10)-40 : 560;
auto lines = V_BreakLines (font, linelen, text[0] == '$'? GStrings(text.GetChars()+1) : text.GetChars());

View file

@ -1107,6 +1107,53 @@ int FFont::StringWidth(const uint8_t *string) const
return MAX(maxw, w);
}
//==========================================================================
//
// Get the largest ascender in the first line of this text.
//
//==========================================================================
int FFont::GetMaxAscender(const uint8_t* string) const
{
int retval = 0;
while (*string)
{
auto chr = GetCharFromString(string);
if (chr == TEXTCOLOR_ESCAPE)
{
// We do not need to check for UTF-8 in here.
if (*string == '[')
{
while (*string != '\0' && *string != ']')
{
++string;
}
}
if (*string != '\0')
{
++string;
}
continue;
}
else if (chr == '\n')
{
break;
}
else
{
auto ctex = GetChar(chr, CR_UNTRANSLATED, nullptr);
if (ctex)
{
auto offs = int(ctex->GetScaledTopOffset(0));
if (offs > retval) retval = offs;
}
}
}
return retval;
}
//==========================================================================
//
// FFont :: LoadTranslations

View file

@ -102,7 +102,10 @@ FSpecialFont::FSpecialFont (const char *name, int first, int count, FTexture **l
if (charlumps[i] != nullptr)
{
charlumps[i]->SetUseType(ETextureType::FontChar);
// If texture is used as a sprite, do not set use type
// Changing it would break actors that use this sprite
if (charlumps[i]->GetUseType() != ETextureType::Sprite)
charlumps[i]->SetUseType(ETextureType::FontChar);
Chars[i].OriginalPic = charlumps[i];
if (!noTranslate)

View file

@ -103,6 +103,9 @@ public:
int GetSpaceWidth () const { return SpaceWidth; }
int GetHeight () const { return FontHeight; }
int GetDefaultKerning () const { return GlobalKerning; }
int GetMaxAscender(const uint8_t* text) const;
int GetMaxAscender(const char* text) const { return GetMaxAscender((uint8_t*)text); }
int GetMaxAscender(const FString &text) const { return GetMaxAscender((uint8_t*)text.GetChars()); }
virtual void LoadTranslations();
FName GetName() const { return FontName; }
@ -188,7 +191,5 @@ EColorRange V_ParseFontColor (const uint8_t *&color_value, int normalcolor, int
FFont *V_GetFont(const char *fontname, const char *fontlumpname = nullptr);
void V_InitFontColors();
FFont * C_GetDefaultHUDFont();
#endif //__V_FONT_H__

View file

@ -125,7 +125,9 @@ TArray<FBrokenLines> V_BreakLines (FFont *font, int maxwidth, const uint8_t *str
if ((w > 0 && w + nw > maxwidth) || c == '\n')
{ // Time to break the line
if (!space)
space = string - 1;
{
for (space = string - 1; (*space & 0xc0) == 0x80 && space > start; space--);
}
auto index = Lines.Reserve(1);
breakit (&Lines[index], font, start, space, linecolor);

View file

@ -84,7 +84,7 @@ void DrawFullscreenSubtitle(const char *text)
auto scale = active_con_scaletext(generic_ui);
int hudwidth = SCREENWIDTH / scale;
int hudheight = SCREENHEIGHT / scale;
FFont *font = C_GetDefaultHUDFont();
FFont *font = generic_ui? NewSmallFont : SmallFont;
int linelen = hudwidth < 640 ? Scale(hudwidth, 9, 10) - 40 : 560;
auto lines = V_BreakLines(font, linelen, text);

View file

@ -318,7 +318,7 @@ DEFINE_ACTION_FUNCTION(FSavegameManager, ReadSaveStrings)
//
//=============================================================================
void FSavegameManager::NotifyNewSave(const FString &file, const FString &title, bool okForQuicksave)
void FSavegameManager::NotifyNewSave(const FString &file, const FString &title, bool okForQuicksave, bool forceQuicksave)
{
FSaveGameNode *node;
@ -342,7 +342,7 @@ void FSavegameManager::NotifyNewSave(const FString &file, const FString &title,
node->bMissingWads = false;
if (okForQuicksave)
{
if (quickSaveSlot == nullptr) quickSaveSlot = node;
if (quickSaveSlot == nullptr || forceQuicksave) quickSaveSlot = node;
LastAccessed = LastSaved = i;
}
return;
@ -358,7 +358,7 @@ void FSavegameManager::NotifyNewSave(const FString &file, const FString &title,
if (okForQuicksave)
{
if (quickSaveSlot == nullptr) quickSaveSlot = node;
if (quickSaveSlot == nullptr || forceQuicksave) quickSaveSlot = node;
LastAccessed = LastSaved = index;
}
}

View file

@ -84,7 +84,7 @@ public:
private:
int InsertSaveNode(FSaveGameNode *node);
public:
void NotifyNewSave(const FString &file, const FString &title, bool okForQuicksave);
void NotifyNewSave(const FString &file, const FString &title, bool okForQuicksave, bool forceQuicksave);
void ClearSaveGames();
void ReadSaveStrings();

View file

@ -44,6 +44,7 @@
#include "vm.h"
EXTERN_CVAR (Bool, saveloadconfirmation) // [mxd]
EXTERN_CVAR (Bool, quicksaverotation)
typedef void(*hfunc)();
DEFINE_ACTION_FUNCTION(DMessageBoxMenu, CallHandler)
@ -174,6 +175,13 @@ CCMD (quicksave)
if (gamestate != GS_LEVEL)
return;
// If the quick save rotation is enabled, it handles the save slot.
if (quicksaverotation)
{
G_DoQuickSave();
return;
}
if (savegameManager.quickSaveSlot == NULL)
{

View file

@ -70,6 +70,7 @@ static bool DrawConversationMenu ();
static void PickConversationReply (int replyindex);
static void TerminalResponse (const char *str);
CVAR(Bool, dlg_vgafont, false, CVAR_ARCHIVE)
//============================================================================
//

View file

@ -289,7 +289,7 @@ public:
void SetLogNumber (int num);
void SetLogText (const char *text);
void SendPitchLimits() const;
void SetSubtitle(int num);
void SetSubtitle(int num, FSoundID soundid);
AActor *mo = nullptr;
uint8_t playerstate = 0;

View file

@ -3196,7 +3196,7 @@ FUNC(LS_SendToCommunicator)
if (it->CheckLocalView())
{
S_StopSound (CHAN_VOICE);
it->player->SetSubtitle(arg0);
it->player->SetSubtitle(arg0, name);
S_Sound (CHAN_VOICE, name, 1, ATTN_NORM);
// Get the message from the LANGUAGE lump.

View file

@ -2780,11 +2780,11 @@ static void PlayerLandedOnThing (AActor *mo, AActor *onmobj)
P_FallingDamage (mo);
// [RH] only make noise if alive
if (!mo->player->morphTics && mo->health > 0)
if (mo->health > 0 && !mo->player->morphTics)
{
grunted = false;
// Why should this number vary by gravity?
if (mo->health > 0 && mo->Vel.Z < -mo->player->mo->FloatVar(NAME_GruntSpeed))
if (mo->Vel.Z < -mo->player->mo->FloatVar(NAME_GruntSpeed))
{
S_Sound (mo, CHAN_VOICE, "*grunt", 1, ATTN_NORM);
grunted = true;

View file

@ -437,7 +437,7 @@ DEFINE_ACTION_FUNCTION(_PlayerInfo, SetLogText)
return 0;
}
void player_t::SetSubtitle(int num)
void player_t::SetSubtitle(int num, FSoundID soundid)
{
char lumpname[36];
@ -449,7 +449,8 @@ void player_t::SetSubtitle(int num)
if (text != nullptr)
{
SubtitleText = lumpname;
SubtitleCounter = 7 * TICRATE;
int sl = soundid == 0 ? 7000 : std::max<int>(7000, S_GetMSLength(soundid));
SubtitleCounter = sl * TICRATE / 1000;
}
}
@ -457,7 +458,8 @@ DEFINE_ACTION_FUNCTION(_PlayerInfo, SetSubtitleNumber)
{
PARAM_SELF_STRUCT_PROLOGUE(player_t);
PARAM_INT(log);
self->SetSubtitle(log);
PARAM_SOUND(soundid);
self->SetSubtitle(log, soundid);
return 0;
}

View file

@ -35,6 +35,7 @@
#ifdef HAVE_VULKAN
#define VK_USE_PLATFORM_MACOS_MVK
#define VK_USE_PLATFORM_METAL_EXT
#include "volk/volk.h"
#endif
@ -867,12 +868,37 @@ void I_GetVulkanDrawableSize(int *width, int *height)
bool I_GetVulkanPlatformExtensions(unsigned int *count, const char **names)
{
static const char* extensions[] =
static std::vector<const char*> extensions;
if (extensions.empty())
{
VK_KHR_SURFACE_EXTENSION_NAME,
VK_MVK_MACOS_SURFACE_EXTENSION_NAME
};
static const unsigned int extensionCount = static_cast<unsigned int>(sizeof extensions / sizeof extensions[0]);
uint32_t extensionPropertyCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extensionPropertyCount, nullptr);
std::vector<VkExtensionProperties> extensionProperties(extensionPropertyCount);
vkEnumerateInstanceExtensionProperties(nullptr, &extensionPropertyCount, extensionProperties.data());
static const char* const EXTENSION_NAMES[] =
{
VK_KHR_SURFACE_EXTENSION_NAME, // KHR_surface, required
VK_EXT_METAL_SURFACE_EXTENSION_NAME, // EXT_metal_surface, optional, preferred
VK_MVK_MACOS_SURFACE_EXTENSION_NAME, // MVK_macos_surface, optional, deprecated
};
for (const VkExtensionProperties &currentProperties : extensionProperties)
{
for (const char *const extensionName : EXTENSION_NAMES)
{
if (strcmp(currentProperties.extensionName, extensionName) == 0)
{
extensions.push_back(extensionName);
}
}
}
}
static const unsigned int extensionCount = static_cast<unsigned int>(extensions.size());
assert(extensionCount >= 2); // KHR_surface + at least one of the platform surface extentions
if (count == nullptr && names == nullptr)
{
@ -899,11 +925,34 @@ bool I_GetVulkanPlatformExtensions(unsigned int *count, const char **names)
bool I_CreateVulkanSurface(VkInstance instance, VkSurfaceKHR *surface)
{
NSView *const view = CocoaVideo::GetWindow().contentView;
CALayer *const layer = view.layer;
// Set magnification filter for swapchain image when it's copied to a physical display surface
// This is needed for gfx-portability because MoltenVK uses preferred nearest sampling by default
const char *const magFilterEnv = getenv("MVK_CONFIG_SWAPCHAIN_MAG_FILTER_USE_NEAREST");
const bool useNearestFilter = magFilterEnv == nullptr || strtol(magFilterEnv, nullptr, 0) != 0;
layer.magnificationFilter = useNearestFilter ? kCAFilterNearest : kCAFilterLinear;
if (vkCreateMetalSurfaceEXT)
{
// Preferred surface creation path
VkMetalSurfaceCreateInfoEXT surfaceCreateInfo;
surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT;
surfaceCreateInfo.pNext = nullptr;
surfaceCreateInfo.flags = 0;
surfaceCreateInfo.pLayer = static_cast<CAMetalLayer*>(layer);
const VkResult result = vkCreateMetalSurfaceEXT(instance, &surfaceCreateInfo, nullptr, surface);
return result == VK_SUCCESS;
}
// Deprecated surface creation path
VkMacOSSurfaceCreateInfoMVK windowCreateInfo;
windowCreateInfo.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK;
windowCreateInfo.pNext = nullptr;
windowCreateInfo.flags = 0;
windowCreateInfo.pView = [[CocoaVideo::GetWindow() contentView] layer];
windowCreateInfo.pView = view;
const VkResult result = vkCreateMacOSSurfaceMVK(instance, &windowCreateInfo, nullptr, surface);
return result == VK_SUCCESS;

View file

@ -93,6 +93,11 @@ int VkRenderPassManager::GetVertexFormat(int numBindingPoints, int numAttributes
return (int)VertexFormats.size() - 1;
}
VkVertexFormat *VkRenderPassManager::GetVertexFormat(int index)
{
return &VertexFormats[index];
}
void VkRenderPassManager::CreateDynamicSetLayout()
{
DescriptorSetLayoutBuilder builder;
@ -173,8 +178,8 @@ void VkRenderPassManager::UpdateDynamicSet()
WriteDescriptors update;
update.addBuffer(DynamicSet.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->ViewpointUBO->mBuffer.get(), 0, sizeof(HWViewpointUniforms));
update.addBuffer(DynamicSet.get(), 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->LightBufferSSO->mBuffer.get());
update.addBuffer(DynamicSet.get(), 2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->MatricesUBO->mBuffer.get(), 0, sizeof(MatricesUBO));
update.addBuffer(DynamicSet.get(), 3, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->StreamUBO->mBuffer.get(), 0, sizeof(StreamUBO));
update.addBuffer(DynamicSet.get(), 2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->MatrixBuffer->UniformBuffer->mBuffer.get(), 0, sizeof(MatricesUBO));
update.addBuffer(DynamicSet.get(), 3, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->StreamBuffer->UniformBuffer->mBuffer.get(), 0, sizeof(StreamUBO));
update.addCombinedImageSampler(DynamicSet.get(), 4, fb->GetBuffers()->Shadowmap.View.get(), fb->GetBuffers()->ShadowmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
update.updateSets(fb->device);
}
@ -289,7 +294,7 @@ std::unique_ptr<VulkanPipeline> VkRenderPassSetup::CreatePipeline(const VkPipeli
builder.addVertexShader(program->vert.get());
builder.addFragmentShader(program->frag.get());
const VkVertexFormat &vfmt = fb->GetRenderPassManager()->VertexFormats[key.VertexFormat];
const VkVertexFormat &vfmt = *fb->GetRenderPassManager()->GetVertexFormat(key.VertexFormat);
for (int i = 0; i < vfmt.NumBindingPoints; i++)
builder.addVertexBufferBinding(i, vfmt.Stride);

View file

@ -88,6 +88,8 @@ public:
VkRenderPassSetup *GetRenderPass(const VkRenderPassKey &key);
int GetVertexFormat(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute *attrs);
VkVertexFormat *GetVertexFormat(int index);
std::unique_ptr<VulkanDescriptorSet> AllocateTextureDescriptorSet(int numLayers);
VulkanPipelineLayout* GetPipelineLayout(int numLayers);
@ -96,8 +98,6 @@ public:
std::unique_ptr<VulkanDescriptorSet> DynamicSet;
std::vector<VkVertexFormat> VertexFormats;
private:
void CreateDynamicSetLayout();
void CreateDescriptorPool();
@ -111,4 +111,5 @@ private:
std::unique_ptr<VulkanDescriptorPool> DynamicDescriptorPool;
std::vector<std::unique_ptr<VulkanDescriptorSetLayout>> TextureSetLayouts;
std::vector<std::unique_ptr<VulkanPipelineLayout>> PipelineLayouts;
std::vector<VkVertexFormat> VertexFormats;
};

View file

@ -21,7 +21,6 @@ CVAR(Int, vk_submit_size, 1000, 0);
VkRenderState::VkRenderState()
{
mIdentityMatrix.loadIdentity();
Reset();
}
@ -315,24 +314,18 @@ void VkRenderState::ApplyStreamData()
auto fb = GetVulkanFrameBuffer();
auto passManager = fb->GetRenderPassManager();
mStreamData.useVertexData = passManager->VertexFormats[static_cast<VKVertexBuffer*>(mVertexBuffer)->VertexFormat].UseVertexData;
mStreamData.useVertexData = passManager->GetVertexFormat(static_cast<VKVertexBuffer*>(mVertexBuffer)->VertexFormat)->UseVertexData;
if (mMaterial.mMaterial && mMaterial.mMaterial->tex)
mStreamData.timer = static_cast<float>((double)(screen->FrameTime - firstFrame) * (double)mMaterial.mMaterial->tex->shaderspeed / 1000.);
else
mStreamData.timer = 0.0f;
mDataIndex++;
if (mDataIndex == MAX_STREAM_DATA)
if (!mStreamBufferWriter.Write(mStreamData))
{
mDataIndex = 0;
mStreamDataOffset += sizeof(StreamUBO);
if (mStreamDataOffset + sizeof(StreamUBO) >= fb->StreamUBO->Size())
WaitForStreamBuffers();
WaitForStreamBuffers();
mStreamBufferWriter.Write(mStreamData);
}
uint8_t *ptr = (uint8_t*)fb->StreamUBO->Memory();
memcpy(ptr + mStreamDataOffset + sizeof(StreamData) * mDataIndex, &mStreamData, sizeof(StreamData));
}
void VkRenderState::ApplyPushConstants()
@ -371,63 +364,19 @@ void VkRenderState::ApplyPushConstants()
mPushConstants.uSpecularMaterial = { mMaterial.mMaterial->tex->Glossiness, mMaterial.mMaterial->tex->SpecularLevel };
mPushConstants.uLightIndex = mLightIndex;
mPushConstants.uDataIndex = mDataIndex;
mPushConstants.uDataIndex = mStreamBufferWriter.DataIndex();
auto fb = GetVulkanFrameBuffer();
auto passManager = fb->GetRenderPassManager();
mCommandBuffer->pushConstants(passManager->GetPipelineLayout(mPipelineKey.NumTextureLayers), VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, (uint32_t)sizeof(PushConstants), &mPushConstants);
}
template<typename T>
static void BufferedSet(bool &modified, T &dst, const T &src)
{
if (dst == src)
return;
dst = src;
modified = true;
}
static void BufferedSet(bool &modified, VSMatrix &dst, const VSMatrix &src)
{
if (memcmp(dst.get(), src.get(), sizeof(FLOATTYPE) * 16) == 0)
return;
dst = src;
modified = true;
}
void VkRenderState::ApplyMatrices()
{
bool modified = (mMatricesOffset == 0); // always modified first call
if (mTextureMatrixEnabled)
if (!mMatrixBufferWriter.Write(mModelMatrix, mModelMatrixEnabled, mTextureMatrix, mTextureMatrixEnabled))
{
BufferedSet(modified, mMatrices.TextureMatrix, mTextureMatrix);
}
else
{
BufferedSet(modified, mMatrices.TextureMatrix, mIdentityMatrix);
}
if (mModelMatrixEnabled)
{
BufferedSet(modified, mMatrices.ModelMatrix, mModelMatrix);
if (modified)
mMatrices.NormalModelMatrix.computeNormalMatrix(mModelMatrix);
}
else
{
BufferedSet(modified, mMatrices.ModelMatrix, mIdentityMatrix);
BufferedSet(modified, mMatrices.NormalModelMatrix, mIdentityMatrix);
}
if (modified)
{
auto fb = GetVulkanFrameBuffer();
if (mMatricesOffset + (fb->UniformBufferAlignedSize<MatricesUBO>() << 1) >= fb->MatricesUBO->Size())
WaitForStreamBuffers();
mMatricesOffset += fb->UniformBufferAlignedSize<MatricesUBO>();
memcpy(static_cast<uint8_t*>(fb->MatricesUBO->Memory()) + mMatricesOffset, &mMatrices, sizeof(MatricesUBO));
WaitForStreamBuffers();
mMatrixBufferWriter.Write(mModelMatrix, mModelMatrixEnabled, mTextureMatrix, mTextureMatrixEnabled);
}
}
@ -436,9 +385,9 @@ void VkRenderState::ApplyVertexBuffers()
if ((mVertexBuffer != mLastVertexBuffer || mVertexOffsets[0] != mLastVertexOffsets[0] || mVertexOffsets[1] != mLastVertexOffsets[1]) && mVertexBuffer)
{
auto vkbuf = static_cast<VKVertexBuffer*>(mVertexBuffer);
const auto &format = GetVulkanFrameBuffer()->GetRenderPassManager()->VertexFormats[vkbuf->VertexFormat];
const VkVertexFormat *format = GetVulkanFrameBuffer()->GetRenderPassManager()->GetVertexFormat(vkbuf->VertexFormat);
VkBuffer vertexBuffers[2] = { vkbuf->mBuffer->buffer, vkbuf->mBuffer->buffer };
VkDeviceSize offsets[] = { mVertexOffsets[0] * format.Stride, mVertexOffsets[1] * format.Stride };
VkDeviceSize offsets[] = { mVertexOffsets[0] * format->Stride, mVertexOffsets[1] * format->Stride };
mCommandBuffer->bindVertexBuffers(0, 2, vertexBuffers, offsets);
mLastVertexBuffer = mVertexBuffer;
mLastVertexOffsets[0] = mVertexOffsets[0];
@ -470,17 +419,19 @@ void VkRenderState::ApplyMaterial()
void VkRenderState::ApplyDynamicSet()
{
if (mViewpointOffset != mLastViewpointOffset || mMatricesOffset != mLastMatricesOffset || mStreamDataOffset != mLastStreamDataOffset)
auto fb = GetVulkanFrameBuffer();
uint32_t matrixOffset = mMatrixBufferWriter.Offset();
uint32_t streamDataOffset = mStreamBufferWriter.StreamDataOffset();
if (mViewpointOffset != mLastViewpointOffset || matrixOffset != mLastMatricesOffset || streamDataOffset != mLastStreamDataOffset)
{
auto fb = GetVulkanFrameBuffer();
auto passManager = fb->GetRenderPassManager();
uint32_t offsets[3] = { mViewpointOffset, mMatricesOffset, mStreamDataOffset };
uint32_t offsets[3] = { mViewpointOffset, matrixOffset, streamDataOffset };
mCommandBuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, passManager->GetPipelineLayout(mPipelineKey.NumTextureLayers), 0, passManager->DynamicSet.get(), 3, offsets);
mLastViewpointOffset = mViewpointOffset;
mLastMatricesOffset = mMatricesOffset;
mLastStreamDataOffset = mStreamDataOffset;
mLastMatricesOffset = matrixOffset;
mLastStreamDataOffset = streamDataOffset;
}
}
@ -489,9 +440,8 @@ void VkRenderState::WaitForStreamBuffers()
EndRenderPass();
GetVulkanFrameBuffer()->WaitForCommands(false);
mApplyCount = 0;
mStreamDataOffset = 0;
mDataIndex = 0;
mMatricesOffset = 0;
mStreamBufferWriter.Reset();
mMatrixBufferWriter.Reset();
}
void VkRenderState::Bind(int bindingpoint, uint32_t offset)
@ -527,9 +477,8 @@ void VkRenderState::EndRenderPass()
void VkRenderState::EndFrame()
{
mMatricesOffset = 0;
mStreamDataOffset = 0;
mDataIndex = -1;
mMatrixBufferWriter.Reset();
mStreamBufferWriter.Reset();
}
void VkRenderState::EnableDrawBuffers(int count)

View file

@ -4,6 +4,7 @@
#include "vulkan/system/vk_buffers.h"
#include "vulkan/shaders/vk_shader.h"
#include "vulkan/renderer/vk_renderpass.h"
#include "vulkan/renderer/vk_streambuffer.h"
#include "name.h"
@ -63,8 +64,8 @@ protected:
void ApplyVertexBuffers();
void ApplyMaterial();
void WaitForStreamBuffers();
void BeginRenderPass(VulkanCommandBuffer *cmdbuffer);
void WaitForStreamBuffers();
bool mDepthClamp = true;
VulkanCommandBuffer *mCommandBuffer = nullptr;
@ -90,18 +91,15 @@ protected:
int mColorMask = 15;
int mCullMode = 0;
MatricesUBO mMatrices = {};
PushConstants mPushConstants = {};
uint32_t mLastViewpointOffset = 0xffffffff;
uint32_t mLastMatricesOffset = 0xffffffff;
uint32_t mLastStreamDataOffset = 0xffffffff;
uint32_t mViewpointOffset = 0;
uint32_t mMatricesOffset = 0;
uint32_t mDataIndex = -1;
uint32_t mStreamDataOffset = 0;
VSMatrix mIdentityMatrix;
VkStreamBufferWriter mStreamBufferWriter;
VkMatrixBufferWriter mMatrixBufferWriter;
int mLastVertexOffsets[2] = { 0, 0 };
IVertexBuffer *mLastVertexBuffer = nullptr;

View file

@ -0,0 +1,127 @@
#include "vk_renderstate.h"
#include "vulkan/system/vk_framebuffer.h"
#include "vulkan/system/vk_builders.h"
#include "vulkan/renderer/vk_streambuffer.h"
VkStreamBuffer::VkStreamBuffer(size_t structSize, size_t count)
{
mBlockSize = static_cast<uint32_t>((structSize + screen->uniformblockalignment - 1) / screen->uniformblockalignment * screen->uniformblockalignment);
UniformBuffer = (VKDataBuffer*)GetVulkanFrameBuffer()->CreateDataBuffer(-1, false, false);
UniformBuffer->SetData(mBlockSize * count, nullptr, false);
}
VkStreamBuffer::~VkStreamBuffer()
{
delete UniformBuffer;
}
uint32_t VkStreamBuffer::NextStreamDataBlock()
{
mStreamDataOffset += mBlockSize;
if (mStreamDataOffset + (size_t)mBlockSize >= UniformBuffer->Size())
{
mStreamDataOffset = 0;
return 0xffffffff;
}
return mStreamDataOffset;
}
/////////////////////////////////////////////////////////////////////////////
VkStreamBufferWriter::VkStreamBufferWriter()
{
mBuffer = GetVulkanFrameBuffer()->StreamBuffer;
}
bool VkStreamBufferWriter::Write(const StreamData& data)
{
mDataIndex++;
if (mDataIndex == MAX_STREAM_DATA)
{
mDataIndex = 0;
mStreamDataOffset = mBuffer->NextStreamDataBlock();
if (mStreamDataOffset == 0xffffffff)
return false;
}
uint8_t* ptr = (uint8_t*)mBuffer->UniformBuffer->Memory();
memcpy(ptr + mStreamDataOffset + sizeof(StreamData) * mDataIndex, &data, sizeof(StreamData));
return true;
}
void VkStreamBufferWriter::Reset()
{
mDataIndex = MAX_STREAM_DATA - 1;
mStreamDataOffset = 0;
mBuffer->Reset();
}
/////////////////////////////////////////////////////////////////////////////
VkMatrixBufferWriter::VkMatrixBufferWriter()
{
mBuffer = GetVulkanFrameBuffer()->MatrixBuffer;
mIdentityMatrix.loadIdentity();
}
template<typename T>
static void BufferedSet(bool& modified, T& dst, const T& src)
{
if (dst == src)
return;
dst = src;
modified = true;
}
static void BufferedSet(bool& modified, VSMatrix& dst, const VSMatrix& src)
{
if (memcmp(dst.get(), src.get(), sizeof(FLOATTYPE) * 16) == 0)
return;
dst = src;
modified = true;
}
bool VkMatrixBufferWriter::Write(const VSMatrix& modelMatrix, bool modelMatrixEnabled, const VSMatrix& textureMatrix, bool textureMatrixEnabled)
{
bool modified = (mOffset == 0); // always modified first call
if (modelMatrixEnabled)
{
BufferedSet(modified, mMatrices.ModelMatrix, modelMatrix);
if (modified)
mMatrices.NormalModelMatrix.computeNormalMatrix(modelMatrix);
}
else
{
BufferedSet(modified, mMatrices.ModelMatrix, mIdentityMatrix);
BufferedSet(modified, mMatrices.NormalModelMatrix, mIdentityMatrix);
}
if (textureMatrixEnabled)
{
BufferedSet(modified, mMatrices.TextureMatrix, textureMatrix);
}
else
{
BufferedSet(modified, mMatrices.TextureMatrix, mIdentityMatrix);
}
if (modified)
{
mOffset = mBuffer->NextStreamDataBlock();
if (mOffset == 0xffffffff)
return false;
uint8_t* ptr = (uint8_t*)mBuffer->UniformBuffer->Memory();
memcpy(ptr + mOffset, &mMatrices, sizeof(MatricesUBO));
}
return true;
}
void VkMatrixBufferWriter::Reset()
{
mOffset = 0;
mBuffer->Reset();
}

View file

@ -0,0 +1,58 @@
#pragma once
#include "vulkan/system/vk_buffers.h"
#include "vulkan/shaders/vk_shader.h"
class VkStreamBuffer;
class VkMatrixBuffer;
class VkStreamBufferWriter
{
public:
VkStreamBufferWriter();
bool Write(const StreamData& data);
void Reset();
uint32_t DataIndex() const { return mDataIndex; }
uint32_t StreamDataOffset() const { return mStreamDataOffset; }
private:
VkStreamBuffer* mBuffer;
uint32_t mDataIndex = MAX_STREAM_DATA - 1;
uint32_t mStreamDataOffset = 0;
};
class VkMatrixBufferWriter
{
public:
VkMatrixBufferWriter();
bool Write(const VSMatrix& modelMatrix, bool modelMatrixEnabled, const VSMatrix& textureMatrix, bool textureMatrixEnabled);
void Reset();
uint32_t Offset() const { return mOffset; }
private:
VkStreamBuffer* mBuffer;
MatricesUBO mMatrices = {};
VSMatrix mIdentityMatrix;
uint32_t mOffset = 0;
};
class VkStreamBuffer
{
public:
VkStreamBuffer(size_t structSize, size_t count);
~VkStreamBuffer();
uint32_t NextStreamDataBlock();
void Reset() { mStreamDataOffset = 0; }
VKDataBuffer* UniformBuffer = nullptr;
private:
uint32_t mBlockSize = 0;
uint32_t mStreamDataOffset = 0;
};

View file

@ -50,6 +50,7 @@
#include "vk_buffers.h"
#include "vulkan/renderer/vk_renderstate.h"
#include "vulkan/renderer/vk_renderpass.h"
#include "vulkan/renderer/vk_streambuffer.h"
#include "vulkan/renderer/vk_postprocess.h"
#include "vulkan/renderer/vk_renderbuffers.h"
#include "vulkan/shaders/vk_shader.h"
@ -106,8 +107,8 @@ VulkanFrameBuffer::~VulkanFrameBuffer()
VKBuffer::ResetAll();
PPResource::ResetAll();
delete MatricesUBO;
delete StreamUBO;
delete MatrixBuffer;
delete StreamBuffer;
delete mVertexData;
delete mSkyData;
delete mViewpoints;
@ -158,10 +159,8 @@ void VulkanFrameBuffer::InitializeState()
CreateFanToTrisIndexBuffer();
// To do: move this to HW renderer interface maybe?
MatricesUBO = (VKDataBuffer*)CreateDataBuffer(-1, false, false);
StreamUBO = (VKDataBuffer*)CreateDataBuffer(-1, false, false);
MatricesUBO->SetData(UniformBufferAlignedSize<::MatricesUBO>() * 50000, nullptr, false);
StreamUBO->SetData(UniformBufferAlignedSize<::StreamUBO>() * 200, nullptr, false);
MatrixBuffer = new VkStreamBuffer(sizeof(MatricesUBO), 50000);
StreamBuffer = new VkStreamBuffer(sizeof(StreamUBO), 300);
mShaderManager.reset(new VkShaderManager(device));
mSamplerManager.reset(new VkSamplerManager(device));

View file

@ -9,6 +9,7 @@ class VkSamplerManager;
class VkShaderManager;
class VkRenderPassManager;
class VkRenderState;
class VkStreamBuffer;
class VKDataBuffer;
class VkHardwareTexture;
class VkRenderBuffers;
@ -38,13 +39,10 @@ public:
unsigned int GetLightBufferBlockSize() const;
template<typename T>
int UniformBufferAlignedSize() const { return (sizeof(T) + uniformblockalignment - 1) / uniformblockalignment * uniformblockalignment; }
VKDataBuffer *ViewpointUBO = nullptr;
VKDataBuffer *LightBufferSSO = nullptr;
VKDataBuffer *MatricesUBO = nullptr;
VKDataBuffer *StreamUBO = nullptr;
VkStreamBuffer *MatrixBuffer = nullptr;
VkStreamBuffer *StreamBuffer = nullptr;
VKDataBuffer *LightNodes = nullptr;
VKDataBuffer *LightLines = nullptr;

View file

@ -44,7 +44,7 @@ uint32_t VulkanSwapChain::AcquireImage(int width, int height, VulkanSemaphore *s
{
break;
}
else if (result == VK_SUBOPTIMAL_KHR)
else if (result == VK_SUBOPTIMAL_KHR || result == VK_ERROR_SURFACE_LOST_KHR)
{
// Force the recreate to happen next frame.
// The spec is not very clear about what happens to the semaphore or the acquired image if the swapchain is recreated before the image is released with a call to vkQueuePresentKHR.
@ -69,10 +69,6 @@ uint32_t VulkanSwapChain::AcquireImage(int width, int height, VulkanSemaphore *s
{
VulkanError("vkAcquireNextImageKHR failed: device lost");
}
else if (result == VK_ERROR_SURFACE_LOST_KHR)
{
VulkanError("vkAcquireNextImageKHR failed: surface lost");
}
else
{
VulkanError("vkAcquireNextImageKHR failed");
@ -92,7 +88,7 @@ void VulkanSwapChain::QueuePresent(uint32_t imageIndex, VulkanSemaphore *semapho
presentInfo.pImageIndices = &imageIndex;
presentInfo.pResults = nullptr;
VkResult result = vkQueuePresentKHR(device->presentQueue, &presentInfo);
if (result == VK_SUBOPTIMAL_KHR || result == VK_ERROR_OUT_OF_DATE_KHR)
if (result == VK_SUBOPTIMAL_KHR || result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_ERROR_SURFACE_LOST_KHR)
{
lastSwapWidth = 0;
lastSwapHeight = 0;
@ -108,10 +104,6 @@ void VulkanSwapChain::QueuePresent(uint32_t imageIndex, VulkanSemaphore *semapho
{
VulkanError("vkQueuePresentKHR failed: device lost");
}
else if (result == VK_ERROR_SURFACE_LOST_KHR)
{
VulkanError("vkQueuePresentKHR failed: surface lost");
}
else if (result != VK_SUCCESS)
{
VulkanError("vkQueuePresentKHR failed");

View file

@ -4,6 +4,7 @@
#ifdef __APPLE__
#define VK_USE_PLATFORM_MACOS_MVK
#define VK_USE_PLATFORM_METAL_EXT
#endif

View file

@ -88,7 +88,8 @@ typedef enum {
VK_ICD_WSI_PLATFORM_ANDROID,
VK_ICD_WSI_PLATFORM_MACOS,
VK_ICD_WSI_PLATFORM_IOS,
VK_ICD_WSI_PLATFORM_DISPLAY
VK_ICD_WSI_PLATFORM_DISPLAY,
VK_ICD_WSI_PLATFORM_HEADLESS
} VkIcdWsiPlatform;
typedef struct {
@ -167,4 +168,8 @@ typedef struct {
VkExtent2D imageExtent;
} VkIcdSurfaceDisplay;
typedef struct {
VkIcdSurfaceBase base;
} VkIcdSurfaceHeadless;
#endif // VKICD_H

View file

@ -35,9 +35,6 @@
#define VK_LAYER_EXPORT
#endif
// Definition for VkLayerDispatchTable and VkLayerInstanceDispatchTable now appear in externally generated header
#include "vk_layer_dispatch_table.h"
#define MAX_NUM_UNKNOWN_EXTS 250
// Loader-Layer version negotiation API. Versions add the following features:
@ -50,6 +47,9 @@
#define VK_CURRENT_CHAIN_VERSION 1
// Typedef for use in the interfaces below
typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char* pName);
// Version negotiation values
typedef enum VkNegotiateLayerStructType {
LAYER_NEGOTIATE_UNINTIALIZED = 0,
@ -82,7 +82,8 @@ typedef VkResult(VKAPI_PTR *PFN_PhysDevExt)(VkPhysicalDevice phys_device);
*/
typedef enum VkLayerFunction_ {
VK_LAYER_LINK_INFO = 0,
VK_LOADER_DATA_CALLBACK = 1
VK_LOADER_DATA_CALLBACK = 1,
VK_LOADER_LAYER_CREATE_DEVICE_CALLBACK = 2
} VkLayerFunction;
typedef struct VkLayerInstanceLink_ {
@ -107,7 +108,9 @@ typedef VkResult (VKAPI_PTR *PFN_vkSetInstanceLoaderData)(VkInstance instance,
void *object);
typedef VkResult (VKAPI_PTR *PFN_vkSetDeviceLoaderData)(VkDevice device,
void *object);
typedef VkResult (VKAPI_PTR *PFN_vkLayerCreateDevice)(VkInstance instance, VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator, VkDevice *pDevice, PFN_vkGetInstanceProcAddr layerGIPA, PFN_vkGetDeviceProcAddr *nextGDPA);
typedef void (VKAPI_PTR *PFN_vkLayerDestroyDevice)(VkDevice physicalDevice, const VkAllocationCallbacks *pAllocator, PFN_vkDestroyDevice destroyFunction);
typedef struct {
VkStructureType sType; // VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO
const void *pNext;
@ -115,6 +118,10 @@ typedef struct {
union {
VkLayerInstanceLink *pLayerInfo;
PFN_vkSetInstanceLoaderData pfnSetInstanceLoaderData;
struct {
PFN_vkLayerCreateDevice pfnLayerCreateDevice;
PFN_vkLayerDestroyDevice pfnLayerDestroyDevice;
} layerDevice;
} u;
} VkLayerInstanceCreateInfo;

View file

@ -2,7 +2,7 @@
#define VULKAN_H_ 1
/*
** Copyright (c) 2015-2018 The Khronos Group Inc.
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@ -24,6 +24,10 @@
#include "vulkan_android.h"
#endif
#ifdef VK_USE_PLATFORM_FUCHSIA
#include <zircon/types.h>
#include "vulkan_fuchsia.h"
#endif
#ifdef VK_USE_PLATFORM_IOS_MVK
#include "vulkan_ios.h"
@ -34,13 +38,10 @@
#include "vulkan_macos.h"
#endif
#ifdef VK_USE_PLATFORM_MIR_KHR
#include <mir_toolkit/client_types.h>
#include "vulkan_mir.h"
#ifdef VK_USE_PLATFORM_METAL_EXT
#include "vulkan_metal.h"
#endif
#ifdef VK_USE_PLATFORM_VI_NN
#include "vulkan_vi.h"
#endif
@ -76,4 +77,10 @@
#include "vulkan_xlib_xrandr.h"
#endif
#ifdef VK_USE_PLATFORM_GGP
#include <ggp_c/vulkan_types.h>
#include "vulkan_ggp.h"
#endif
#endif // VULKAN_H_

View file

@ -0,0 +1,121 @@
#ifndef VULKAN_ANDROID_H_
#define VULKAN_ANDROID_H_ 1
#ifdef __cplusplus
extern "C" {
#endif
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
/*
** This header is generated from the Khronos Vulkan XML API Registry.
**
*/
#define VK_KHR_android_surface 1
struct ANativeWindow;
#define VK_KHR_ANDROID_SURFACE_SPEC_VERSION 6
#define VK_KHR_ANDROID_SURFACE_EXTENSION_NAME "VK_KHR_android_surface"
typedef VkFlags VkAndroidSurfaceCreateFlagsKHR;
typedef struct VkAndroidSurfaceCreateInfoKHR {
VkStructureType sType;
const void* pNext;
VkAndroidSurfaceCreateFlagsKHR flags;
struct ANativeWindow* window;
} VkAndroidSurfaceCreateInfoKHR;
typedef VkResult (VKAPI_PTR *PFN_vkCreateAndroidSurfaceKHR)(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
#ifndef VK_NO_PROTOTYPES
VKAPI_ATTR VkResult VKAPI_CALL vkCreateAndroidSurfaceKHR(
VkInstance instance,
const VkAndroidSurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkSurfaceKHR* pSurface);
#endif
#define VK_ANDROID_external_memory_android_hardware_buffer 1
struct AHardwareBuffer;
#define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_SPEC_VERSION 3
#define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME "VK_ANDROID_external_memory_android_hardware_buffer"
typedef struct VkAndroidHardwareBufferUsageANDROID {
VkStructureType sType;
void* pNext;
uint64_t androidHardwareBufferUsage;
} VkAndroidHardwareBufferUsageANDROID;
typedef struct VkAndroidHardwareBufferPropertiesANDROID {
VkStructureType sType;
void* pNext;
VkDeviceSize allocationSize;
uint32_t memoryTypeBits;
} VkAndroidHardwareBufferPropertiesANDROID;
typedef struct VkAndroidHardwareBufferFormatPropertiesANDROID {
VkStructureType sType;
void* pNext;
VkFormat format;
uint64_t externalFormat;
VkFormatFeatureFlags formatFeatures;
VkComponentMapping samplerYcbcrConversionComponents;
VkSamplerYcbcrModelConversion suggestedYcbcrModel;
VkSamplerYcbcrRange suggestedYcbcrRange;
VkChromaLocation suggestedXChromaOffset;
VkChromaLocation suggestedYChromaOffset;
} VkAndroidHardwareBufferFormatPropertiesANDROID;
typedef struct VkImportAndroidHardwareBufferInfoANDROID {
VkStructureType sType;
const void* pNext;
struct AHardwareBuffer* buffer;
} VkImportAndroidHardwareBufferInfoANDROID;
typedef struct VkMemoryGetAndroidHardwareBufferInfoANDROID {
VkStructureType sType;
const void* pNext;
VkDeviceMemory memory;
} VkMemoryGetAndroidHardwareBufferInfoANDROID;
typedef struct VkExternalFormatANDROID {
VkStructureType sType;
void* pNext;
uint64_t externalFormat;
} VkExternalFormatANDROID;
typedef VkResult (VKAPI_PTR *PFN_vkGetAndroidHardwareBufferPropertiesANDROID)(VkDevice device, const struct AHardwareBuffer* buffer, VkAndroidHardwareBufferPropertiesANDROID* pProperties);
typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryAndroidHardwareBufferANDROID)(VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, struct AHardwareBuffer** pBuffer);
#ifndef VK_NO_PROTOTYPES
VKAPI_ATTR VkResult VKAPI_CALL vkGetAndroidHardwareBufferPropertiesANDROID(
VkDevice device,
const struct AHardwareBuffer* buffer,
VkAndroidHardwareBufferPropertiesANDROID* pProperties);
VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryAndroidHardwareBufferANDROID(
VkDevice device,
const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo,
struct AHardwareBuffer** pBuffer);
#endif
#ifdef __cplusplus
}
#endif
#endif

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,56 @@
#ifndef VULKAN_FUCHSIA_H_
#define VULKAN_FUCHSIA_H_ 1
#ifdef __cplusplus
extern "C" {
#endif
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
/*
** This header is generated from the Khronos Vulkan XML API Registry.
**
*/
#define VK_FUCHSIA_imagepipe_surface 1
#define VK_FUCHSIA_IMAGEPIPE_SURFACE_SPEC_VERSION 1
#define VK_FUCHSIA_IMAGEPIPE_SURFACE_EXTENSION_NAME "VK_FUCHSIA_imagepipe_surface"
typedef VkFlags VkImagePipeSurfaceCreateFlagsFUCHSIA;
typedef struct VkImagePipeSurfaceCreateInfoFUCHSIA {
VkStructureType sType;
const void* pNext;
VkImagePipeSurfaceCreateFlagsFUCHSIA flags;
zx_handle_t imagePipeHandle;
} VkImagePipeSurfaceCreateInfoFUCHSIA;
typedef VkResult (VKAPI_PTR *PFN_vkCreateImagePipeSurfaceFUCHSIA)(VkInstance instance, const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
#ifndef VK_NO_PROTOTYPES
VKAPI_ATTR VkResult VKAPI_CALL vkCreateImagePipeSurfaceFUCHSIA(
VkInstance instance,
const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkSurfaceKHR* pSurface);
#endif
#ifdef __cplusplus
}
#endif
#endif

View file

@ -0,0 +1,67 @@
#ifndef VULKAN_GGP_H_
#define VULKAN_GGP_H_ 1
#ifdef __cplusplus
extern "C" {
#endif
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
/*
** This header is generated from the Khronos Vulkan XML API Registry.
**
*/
#define VK_GGP_stream_descriptor_surface 1
#define VK_GGP_STREAM_DESCRIPTOR_SURFACE_SPEC_VERSION 1
#define VK_GGP_STREAM_DESCRIPTOR_SURFACE_EXTENSION_NAME "VK_GGP_stream_descriptor_surface"
typedef VkFlags VkStreamDescriptorSurfaceCreateFlagsGGP;
typedef struct VkStreamDescriptorSurfaceCreateInfoGGP {
VkStructureType sType;
const void* pNext;
VkStreamDescriptorSurfaceCreateFlagsGGP flags;
GgpStreamDescriptor streamDescriptor;
} VkStreamDescriptorSurfaceCreateInfoGGP;
typedef VkResult (VKAPI_PTR *PFN_vkCreateStreamDescriptorSurfaceGGP)(VkInstance instance, const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
#ifndef VK_NO_PROTOTYPES
VKAPI_ATTR VkResult VKAPI_CALL vkCreateStreamDescriptorSurfaceGGP(
VkInstance instance,
const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkSurfaceKHR* pSurface);
#endif
#define VK_GGP_frame_token 1
#define VK_GGP_FRAME_TOKEN_SPEC_VERSION 1
#define VK_GGP_FRAME_TOKEN_EXTENSION_NAME "VK_GGP_frame_token"
typedef struct VkPresentFrameTokenGGP {
VkStructureType sType;
const void* pNext;
GgpFrameToken frameToken;
} VkPresentFrameTokenGGP;
#ifdef __cplusplus
}
#endif
#endif

View file

@ -6,7 +6,7 @@ extern "C" {
#endif
/*
** Copyright (c) 2015-2018 The Khronos Group Inc.
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@ -27,12 +27,11 @@ extern "C" {
*/
#define VK_MVK_ios_surface 1
#define VK_MVK_IOS_SURFACE_SPEC_VERSION 2
#define VK_MVK_IOS_SURFACE_EXTENSION_NAME "VK_MVK_ios_surface"
typedef VkFlags VkIOSSurfaceCreateFlagsMVK;
typedef struct VkIOSSurfaceCreateInfoMVK {
VkStructureType sType;
const void* pNext;
@ -40,7 +39,6 @@ typedef struct VkIOSSurfaceCreateInfoMVK {
const void* pView;
} VkIOSSurfaceCreateInfoMVK;
typedef VkResult (VKAPI_PTR *PFN_vkCreateIOSSurfaceMVK)(VkInstance instance, const VkIOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
#ifndef VK_NO_PROTOTYPES

View file

@ -6,7 +6,7 @@ extern "C" {
#endif
/*
** Copyright (c) 2015-2018 The Khronos Group Inc.
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@ -27,12 +27,11 @@ extern "C" {
*/
#define VK_MVK_macos_surface 1
#define VK_MVK_MACOS_SURFACE_SPEC_VERSION 2
#define VK_MVK_MACOS_SURFACE_EXTENSION_NAME "VK_MVK_macos_surface"
typedef VkFlags VkMacOSSurfaceCreateFlagsMVK;
typedef struct VkMacOSSurfaceCreateInfoMVK {
VkStructureType sType;
const void* pNext;
@ -40,7 +39,6 @@ typedef struct VkMacOSSurfaceCreateInfoMVK {
const void* pView;
} VkMacOSSurfaceCreateInfoMVK;
typedef VkResult (VKAPI_PTR *PFN_vkCreateMacOSSurfaceMVK)(VkInstance instance, const VkMacOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
#ifndef VK_NO_PROTOTYPES

View file

@ -0,0 +1,63 @@
#ifndef VULKAN_METAL_H_
#define VULKAN_METAL_H_ 1
#ifdef __cplusplus
extern "C" {
#endif
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
/*
** This header is generated from the Khronos Vulkan XML API Registry.
**
*/
#define VK_EXT_metal_surface 1
#ifdef __OBJC__
@class CAMetalLayer;
#else
typedef void CAMetalLayer;
#endif
#define VK_EXT_METAL_SURFACE_SPEC_VERSION 1
#define VK_EXT_METAL_SURFACE_EXTENSION_NAME "VK_EXT_metal_surface"
typedef VkFlags VkMetalSurfaceCreateFlagsEXT;
typedef struct VkMetalSurfaceCreateInfoEXT {
VkStructureType sType;
const void* pNext;
VkMetalSurfaceCreateFlagsEXT flags;
const CAMetalLayer* pLayer;
} VkMetalSurfaceCreateInfoEXT;
typedef VkResult (VKAPI_PTR *PFN_vkCreateMetalSurfaceEXT)(VkInstance instance, const VkMetalSurfaceCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
#ifndef VK_NO_PROTOTYPES
VKAPI_ATTR VkResult VKAPI_CALL vkCreateMetalSurfaceEXT(
VkInstance instance,
const VkMetalSurfaceCreateInfoEXT* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkSurfaceKHR* pSurface);
#endif
#ifdef __cplusplus
}
#endif
#endif

View file

@ -6,7 +6,7 @@ extern "C" {
#endif
/*
** Copyright (c) 2015-2018 The Khronos Group Inc.
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@ -27,12 +27,11 @@ extern "C" {
*/
#define VK_NN_vi_surface 1
#define VK_NN_VI_SURFACE_SPEC_VERSION 1
#define VK_NN_VI_SURFACE_EXTENSION_NAME "VK_NN_vi_surface"
typedef VkFlags VkViSurfaceCreateFlagsNN;
typedef struct VkViSurfaceCreateInfoNN {
VkStructureType sType;
const void* pNext;
@ -40,7 +39,6 @@ typedef struct VkViSurfaceCreateInfoNN {
void* window;
} VkViSurfaceCreateInfoNN;
typedef VkResult (VKAPI_PTR *PFN_vkCreateViSurfaceNN)(VkInstance instance, const VkViSurfaceCreateInfoNN* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
#ifndef VK_NO_PROTOTYPES

View file

@ -6,7 +6,7 @@ extern "C" {
#endif
/*
** Copyright (c) 2015-2018 The Khronos Group Inc.
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@ -27,12 +27,11 @@ extern "C" {
*/
#define VK_KHR_wayland_surface 1
#define VK_KHR_WAYLAND_SURFACE_SPEC_VERSION 6
#define VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME "VK_KHR_wayland_surface"
typedef VkFlags VkWaylandSurfaceCreateFlagsKHR;
typedef struct VkWaylandSurfaceCreateInfoKHR {
VkStructureType sType;
const void* pNext;
@ -41,7 +40,6 @@ typedef struct VkWaylandSurfaceCreateInfoKHR {
struct wl_surface* surface;
} VkWaylandSurfaceCreateInfoKHR;
typedef VkResult (VKAPI_PTR *PFN_vkCreateWaylandSurfaceKHR)(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, struct wl_display* display);

View file

@ -6,7 +6,7 @@ extern "C" {
#endif
/*
** Copyright (c) 2015-2018 The Khronos Group Inc.
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@ -27,12 +27,11 @@ extern "C" {
*/
#define VK_KHR_win32_surface 1
#define VK_KHR_WIN32_SURFACE_SPEC_VERSION 6
#define VK_KHR_WIN32_SURFACE_EXTENSION_NAME "VK_KHR_win32_surface"
typedef VkFlags VkWin32SurfaceCreateFlagsKHR;
typedef struct VkWin32SurfaceCreateInfoKHR {
VkStructureType sType;
const void* pNext;
@ -41,7 +40,6 @@ typedef struct VkWin32SurfaceCreateInfoKHR {
HWND hwnd;
} VkWin32SurfaceCreateInfoKHR;
typedef VkResult (VKAPI_PTR *PFN_vkCreateWin32SurfaceKHR)(VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex);
@ -57,10 +55,10 @@ VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWin32PresentationSupportKHR(
uint32_t queueFamilyIndex);
#endif
#define VK_KHR_external_memory_win32 1
#define VK_KHR_EXTERNAL_MEMORY_WIN32_SPEC_VERSION 1
#define VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME "VK_KHR_external_memory_win32"
typedef struct VkImportMemoryWin32HandleInfoKHR {
VkStructureType sType;
const void* pNext;
@ -90,7 +88,6 @@ typedef struct VkMemoryGetWin32HandleInfoKHR {
VkExternalMemoryHandleTypeFlagBits handleType;
} VkMemoryGetWin32HandleInfoKHR;
typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandleKHR)(VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle);
typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandlePropertiesKHR)(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, HANDLE handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties);
@ -107,10 +104,10 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandlePropertiesKHR(
VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties);
#endif
#define VK_KHR_win32_keyed_mutex 1
#define VK_KHR_WIN32_KEYED_MUTEX_SPEC_VERSION 1
#define VK_KHR_WIN32_KEYED_MUTEX_EXTENSION_NAME "VK_KHR_win32_keyed_mutex"
typedef struct VkWin32KeyedMutexAcquireReleaseInfoKHR {
VkStructureType sType;
const void* pNext;
@ -128,7 +125,6 @@ typedef struct VkWin32KeyedMutexAcquireReleaseInfoKHR {
#define VK_KHR_external_semaphore_win32 1
#define VK_KHR_EXTERNAL_SEMAPHORE_WIN32_SPEC_VERSION 1
#define VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME "VK_KHR_external_semaphore_win32"
typedef struct VkImportSemaphoreWin32HandleInfoKHR {
VkStructureType sType;
const void* pNext;
@ -163,7 +159,6 @@ typedef struct VkSemaphoreGetWin32HandleInfoKHR {
VkExternalSemaphoreHandleTypeFlagBits handleType;
} VkSemaphoreGetWin32HandleInfoKHR;
typedef VkResult (VKAPI_PTR *PFN_vkImportSemaphoreWin32HandleKHR)(VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo);
typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreWin32HandleKHR)(VkDevice device, const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle);
@ -178,10 +173,10 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreWin32HandleKHR(
HANDLE* pHandle);
#endif
#define VK_KHR_external_fence_win32 1
#define VK_KHR_EXTERNAL_FENCE_WIN32_SPEC_VERSION 1
#define VK_KHR_EXTERNAL_FENCE_WIN32_EXTENSION_NAME "VK_KHR_external_fence_win32"
typedef struct VkImportFenceWin32HandleInfoKHR {
VkStructureType sType;
const void* pNext;
@ -207,7 +202,6 @@ typedef struct VkFenceGetWin32HandleInfoKHR {
VkExternalFenceHandleTypeFlagBits handleType;
} VkFenceGetWin32HandleInfoKHR;
typedef VkResult (VKAPI_PTR *PFN_vkImportFenceWin32HandleKHR)(VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo);
typedef VkResult (VKAPI_PTR *PFN_vkGetFenceWin32HandleKHR)(VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle);
@ -222,10 +216,10 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceWin32HandleKHR(
HANDLE* pHandle);
#endif
#define VK_NV_external_memory_win32 1
#define VK_NV_EXTERNAL_MEMORY_WIN32_SPEC_VERSION 1
#define VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME "VK_NV_external_memory_win32"
typedef struct VkImportMemoryWin32HandleInfoNV {
VkStructureType sType;
const void* pNext;
@ -240,7 +234,6 @@ typedef struct VkExportMemoryWin32HandleInfoNV {
DWORD dwAccess;
} VkExportMemoryWin32HandleInfoNV;
typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandleNV)(VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE* pHandle);
#ifndef VK_NO_PROTOTYPES
@ -251,10 +244,10 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandleNV(
HANDLE* pHandle);
#endif
#define VK_NV_win32_keyed_mutex 1
#define VK_NV_WIN32_KEYED_MUTEX_SPEC_VERSION 1
#define VK_NV_WIN32_KEYED_MUTEX_EXTENSION_NAME "VK_NV_win32_keyed_mutex"
typedef struct VkWin32KeyedMutexAcquireReleaseInfoNV {
VkStructureType sType;
const void* pNext;
@ -269,6 +262,64 @@ typedef struct VkWin32KeyedMutexAcquireReleaseInfoNV {
#define VK_EXT_full_screen_exclusive 1
#define VK_EXT_FULL_SCREEN_EXCLUSIVE_SPEC_VERSION 3
#define VK_EXT_FULL_SCREEN_EXCLUSIVE_EXTENSION_NAME "VK_EXT_full_screen_exclusive"
typedef enum VkFullScreenExclusiveEXT {
VK_FULL_SCREEN_EXCLUSIVE_DEFAULT_EXT = 0,
VK_FULL_SCREEN_EXCLUSIVE_ALLOWED_EXT = 1,
VK_FULL_SCREEN_EXCLUSIVE_DISALLOWED_EXT = 2,
VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT = 3,
VK_FULL_SCREEN_EXCLUSIVE_BEGIN_RANGE_EXT = VK_FULL_SCREEN_EXCLUSIVE_DEFAULT_EXT,
VK_FULL_SCREEN_EXCLUSIVE_END_RANGE_EXT = VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT,
VK_FULL_SCREEN_EXCLUSIVE_RANGE_SIZE_EXT = (VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT - VK_FULL_SCREEN_EXCLUSIVE_DEFAULT_EXT + 1),
VK_FULL_SCREEN_EXCLUSIVE_MAX_ENUM_EXT = 0x7FFFFFFF
} VkFullScreenExclusiveEXT;
typedef struct VkSurfaceFullScreenExclusiveInfoEXT {
VkStructureType sType;
void* pNext;
VkFullScreenExclusiveEXT fullScreenExclusive;
} VkSurfaceFullScreenExclusiveInfoEXT;
typedef struct VkSurfaceCapabilitiesFullScreenExclusiveEXT {
VkStructureType sType;
void* pNext;
VkBool32 fullScreenExclusiveSupported;
} VkSurfaceCapabilitiesFullScreenExclusiveEXT;
typedef struct VkSurfaceFullScreenExclusiveWin32InfoEXT {
VkStructureType sType;
const void* pNext;
HMONITOR hmonitor;
} VkSurfaceFullScreenExclusiveWin32InfoEXT;
typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, uint32_t* pPresentModeCount, VkPresentModeKHR* pPresentModes);
typedef VkResult (VKAPI_PTR *PFN_vkAcquireFullScreenExclusiveModeEXT)(VkDevice device, VkSwapchainKHR swapchain);
typedef VkResult (VKAPI_PTR *PFN_vkReleaseFullScreenExclusiveModeEXT)(VkDevice device, VkSwapchainKHR swapchain);
typedef VkResult (VKAPI_PTR *PFN_vkGetDeviceGroupSurfacePresentModes2EXT)(VkDevice device, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkDeviceGroupPresentModeFlagsKHR* pModes);
#ifndef VK_NO_PROTOTYPES
VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfacePresentModes2EXT(
VkPhysicalDevice physicalDevice,
const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
uint32_t* pPresentModeCount,
VkPresentModeKHR* pPresentModes);
VKAPI_ATTR VkResult VKAPI_CALL vkAcquireFullScreenExclusiveModeEXT(
VkDevice device,
VkSwapchainKHR swapchain);
VKAPI_ATTR VkResult VKAPI_CALL vkReleaseFullScreenExclusiveModeEXT(
VkDevice device,
VkSwapchainKHR swapchain);
VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupSurfacePresentModes2EXT(
VkDevice device,
const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
VkDeviceGroupPresentModeFlagsKHR* pModes);
#endif
#ifdef __cplusplus
}
#endif

View file

@ -6,7 +6,7 @@ extern "C" {
#endif
/*
** Copyright (c) 2015-2018 The Khronos Group Inc.
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@ -27,12 +27,11 @@ extern "C" {
*/
#define VK_KHR_xcb_surface 1
#define VK_KHR_XCB_SURFACE_SPEC_VERSION 6
#define VK_KHR_XCB_SURFACE_EXTENSION_NAME "VK_KHR_xcb_surface"
typedef VkFlags VkXcbSurfaceCreateFlagsKHR;
typedef struct VkXcbSurfaceCreateInfoKHR {
VkStructureType sType;
const void* pNext;
@ -41,7 +40,6 @@ typedef struct VkXcbSurfaceCreateInfoKHR {
xcb_window_t window;
} VkXcbSurfaceCreateInfoKHR;
typedef VkResult (VKAPI_PTR *PFN_vkCreateXcbSurfaceKHR)(VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, xcb_connection_t* connection, xcb_visualid_t visual_id);

View file

@ -6,7 +6,7 @@ extern "C" {
#endif
/*
** Copyright (c) 2015-2018 The Khronos Group Inc.
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@ -27,12 +27,11 @@ extern "C" {
*/
#define VK_KHR_xlib_surface 1
#define VK_KHR_XLIB_SURFACE_SPEC_VERSION 6
#define VK_KHR_XLIB_SURFACE_EXTENSION_NAME "VK_KHR_xlib_surface"
typedef VkFlags VkXlibSurfaceCreateFlagsKHR;
typedef struct VkXlibSurfaceCreateInfoKHR {
VkStructureType sType;
const void* pNext;
@ -41,7 +40,6 @@ typedef struct VkXlibSurfaceCreateInfoKHR {
Window window;
} VkXlibSurfaceCreateInfoKHR;
typedef VkResult (VKAPI_PTR *PFN_vkCreateXlibSurfaceKHR)(VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display* dpy, VisualID visualID);

View file

@ -6,7 +6,7 @@ extern "C" {
#endif
/*
** Copyright (c) 2015-2018 The Khronos Group Inc.
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@ -27,10 +27,10 @@ extern "C" {
*/
#define VK_EXT_acquire_xlib_display 1
#define VK_EXT_ACQUIRE_XLIB_DISPLAY_SPEC_VERSION 1
#define VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME "VK_EXT_acquire_xlib_display"
typedef VkResult (VKAPI_PTR *PFN_vkAcquireXlibDisplayEXT)(VkPhysicalDevice physicalDevice, Display* dpy, VkDisplayKHR display);
typedef VkResult (VKAPI_PTR *PFN_vkGetRandROutputDisplayEXT)(VkPhysicalDevice physicalDevice, Display* dpy, RROutput rrOutput, VkDisplayKHR* pDisplay);

View file

@ -2032,6 +2032,19 @@ DEFINE_ACTION_FUNCTION_NATIVE(FFont, StringWidth, StringWidth)
ACTION_RETURN_INT(StringWidth(self, str));
}
static int GetMaxAscender(FFont* font, const FString& str)
{
const char* txt = str[0] == '$' ? GStrings(&str[1]) : str.GetChars();
return font->GetMaxAscender(txt);
}
DEFINE_ACTION_FUNCTION_NATIVE(FFont, GetMaxAscender, GetMaxAscender)
{
PARAM_SELF_STRUCT_PROLOGUE(FFont);
PARAM_STRING(str);
ACTION_RETURN_INT(GetMaxAscender(self, str));
}
static int CanPrint(FFont *font, const FString &str)
{
const char *txt = str[0] == '$' ? GStrings(&str[1]) : str.GetChars();

View file

@ -142,6 +142,15 @@ DEFINE_ACTION_FUNCTION_NATIVE(AActor, A_StopSound, NativeStopSound)
return 0;
}
DEFINE_ACTION_FUNCTION_NATIVE(AActor, A_SoundPitch, S_ChangeSoundPitch)
{
PARAM_SELF_PROLOGUE(AActor);
PARAM_INT(channel);
PARAM_FLOAT(pitch);
S_ChangeSoundPitch(self, channel, pitch);
return 0;
}
DEFINE_ACTION_FUNCTION_NATIVE(AActor, A_SoundVolume, S_ChangeSoundVolume)
{
PARAM_SELF_PROLOGUE(AActor);
@ -160,7 +169,8 @@ DEFINE_ACTION_FUNCTION_NATIVE(AActor, A_PlaySound, A_PlaySound)
PARAM_BOOL(looping);
PARAM_FLOAT(attenuation);
PARAM_BOOL(local);
A_PlaySound(self, soundid, channel, volume, looping, attenuation, local);
PARAM_FLOAT(pitch);
A_PlaySound(self, soundid, channel, volume, looping, attenuation, local, pitch);
return 0;
}

View file

@ -158,6 +158,9 @@ public:
void ChannelVolume(FISoundChannel *, float)
{
}
void ChannelPitch(FISoundChannel *, float)
{
}
// Streaming sounds.
SoundStream *CreateStream (SoundStreamCallback callback, int buffbytes, int flags, int samplerate, void *userdata)

View file

@ -39,6 +39,7 @@
#include "i_soundinternal.h"
class FileReader;
struct FSoundChan;
enum ECodecType
{
@ -130,6 +131,9 @@ public:
// Changes a channel's volume.
virtual void ChannelVolume (FISoundChannel *chan, float volume) = 0;
// Changes a channel's pitch.
virtual void ChannelPitch(FISoundChannel *chan, float volume) = 0;
// Marks a channel's start time without actually playing it.
virtual void MarkStartTime (FISoundChannel *chan) = 0;

View file

@ -109,6 +109,7 @@ struct FISoundChannel
float DistanceScale;
float DistanceSqr;
bool ManualRolloff;
int ChanFlags;
};

View file

@ -1870,6 +1870,20 @@ void OpenALSoundRenderer::ChannelVolume(FISoundChannel *chan, float volume)
alSourcef(source, AL_GAIN, SfxVolume * volume);
}
void OpenALSoundRenderer::ChannelPitch(FISoundChannel *chan, float pitch)
{
if (chan == NULL || chan->SysChannel == NULL)
return;
alDeferUpdatesSOFT();
ALuint source = GET_PTRID(chan->SysChannel);
if (WasInWater && !(chan->ChanFlags & CHAN_UI))
alSourcef(source, AL_PITCH, MAX(pitch, 0.0001f)*PITCH_MULT);
else
alSourcef(source, AL_PITCH, MAX(pitch, 0.0001f));
}
void OpenALSoundRenderer::FreeSource(ALuint source)
{
alSourceRewind(source);
@ -2118,7 +2132,7 @@ void OpenALSoundRenderer::UpdateListener(SoundListener *listener)
const_cast<ReverbContainer*>(env)->Modified = false;
}
// NOTE: Moving into and out of water will undo pitch variations on sounds.
if(listener->underwater || env->SoftwareWater)
{
@ -2138,20 +2152,33 @@ void OpenALSoundRenderer::UpdateListener(SoundListener *listener)
alFilterf(EnvFilters[1], AL_LOWPASS_GAINHF, 1.f);
// Apply the updated filters on the sources
for(uint32_t i = 0;i < ReverbSfx.Size();++i)
FSoundChan *schan = Channels;
while (schan)
{
alSourcei(ReverbSfx[i], AL_DIRECT_FILTER, EnvFilters[0]);
alSource3i(ReverbSfx[i], AL_AUXILIARY_SEND_FILTER, EnvSlot, 0, EnvFilters[1]);
ALuint source = GET_PTRID(schan->SysChannel);
if (source && !(schan->ChanFlags & CHAN_UI))
{
alSourcei(source, AL_DIRECT_FILTER, EnvFilters[0]);
alSource3i(source, AL_AUXILIARY_SEND_FILTER, EnvSlot, 0, EnvFilters[1]);
}
schan = schan->NextChan;
}
}
for(uint32_t i = 0;i < ReverbSfx.Size();++i)
alSourcef(ReverbSfx[i], AL_PITCH, PITCH_MULT);
FSoundChan *schan = Channels;
while (schan)
{
ALuint source = GET_PTRID(schan->SysChannel);
if (source && !(schan->ChanFlags & CHAN_UI))
alSourcef(source, AL_PITCH, schan->Pitch / 128.0f * PITCH_MULT);
schan = schan->NextChan;
}
getALError();
}
}
else if(WasInWater)
{
WasInWater = false;
if(EnvSlot != 0)
@ -2162,15 +2189,28 @@ void OpenALSoundRenderer::UpdateListener(SoundListener *listener)
alFilterf(EnvFilters[0], AL_LOWPASS_GAINHF, 1.f);
alFilterf(EnvFilters[1], AL_LOWPASS_GAIN, 1.f);
alFilterf(EnvFilters[1], AL_LOWPASS_GAINHF, 1.f);
for(uint32_t i = 0;i < ReverbSfx.Size();++i)
FSoundChan *schan = Channels;
while (schan)
{
alSourcei(ReverbSfx[i], AL_DIRECT_FILTER, EnvFilters[0]);
alSource3i(ReverbSfx[i], AL_AUXILIARY_SEND_FILTER, EnvSlot, 0, EnvFilters[1]);
ALuint source = GET_PTRID(schan->SysChannel);
if (source && !(schan->ChanFlags & CHAN_UI))
{
alSourcei(source, AL_DIRECT_FILTER, EnvFilters[0]);
alSource3i(source, AL_AUXILIARY_SEND_FILTER, EnvSlot, 0, EnvFilters[1]);
}
schan = schan->NextChan;
}
}
for(uint32_t i = 0;i < ReverbSfx.Size();++i)
alSourcef(ReverbSfx[i], AL_PITCH, 1.f);
FSoundChan *schan = Channels;
while (schan)
{
ALuint source = GET_PTRID(schan->SysChannel);
if (source && !(schan->ChanFlags & CHAN_UI))
alSourcef(source, AL_PITCH, schan->Pitch / 128.0f);
schan = schan->NextChan;
}
getALError();
}
}

View file

@ -144,6 +144,9 @@ public:
// Changes a channel's volume.
virtual void ChannelVolume(FISoundChannel *chan, float volume);
// Changes a channel's pitch.
virtual void ChannelPitch(FISoundChannel *chan, float pitch);
// Stops a sound channel.
virtual void StopChannel(FISoundChannel *chan);

View file

@ -132,7 +132,7 @@ static void CalcPosVel(int type, const AActor *actor, const sector_t *sector, co
static void CalcSectorSoundOrg(const DVector3 &listenpos, const sector_t *sec, int channum, FVector3 &res);
static void CalcPolyobjSoundOrg(const DVector3 &listenpos, const FPolyObj *poly, FVector3 &res);
static FSoundChan *S_StartSound(AActor *mover, const sector_t *sec, const FPolyObj *poly,
const FVector3 *pt, int channel, FSoundID sound_id, float volume, float attenuation, FRolloffInfo *rolloff);
const FVector3 *pt, int channel, FSoundID sound_id, float volume, float attenuation, FRolloffInfo *rolloff, float spitch);
static void S_SetListener(SoundListener &listener, AActor *listenactor);
// PRIVATE DATA DEFINITIONS ------------------------------------------------
@ -929,7 +929,7 @@ static void CalcPolyobjSoundOrg(const DVector3 &listenpos, const FPolyObj *poly,
static FSoundChan *S_StartSound(AActor *actor, const sector_t *sec, const FPolyObj *poly,
const FVector3 *pt, int channel, FSoundID sound_id, float volume, float attenuation,
FRolloffInfo *forcedrolloff=NULL)
FRolloffInfo *forcedrolloff=NULL, float spitch = 0.0f)
{
sfxinfo_t *sfx;
int chanflags;
@ -1235,6 +1235,10 @@ static FSoundChan *S_StartSound(AActor *actor, const sector_t *sec, const FPolyO
default: break;
}
}
if (spitch > 0.0)
S_SetPitch(chan, spitch);
return chan;
}
@ -1318,9 +1322,14 @@ void S_RestartSound(FSoundChan *chan)
//
//==========================================================================
void S_Sound (int channel, FSoundID sound_id, float volume, float attenuation)
void S_SoundPitch(int channel, FSoundID sound_id, float volume, float attenuation, float pitch)
{
S_StartSound (NULL, NULL, NULL, NULL, channel, sound_id, volume, attenuation);
S_StartSound(NULL, NULL, NULL, NULL, channel, sound_id, volume, attenuation, 0, pitch);
}
void S_Sound(int channel, FSoundID sound_id, float volume, float attenuation)
{
S_StartSound (NULL, NULL, NULL, NULL, channel, sound_id, volume, attenuation, 0, 0.f);
}
DEFINE_ACTION_FUNCTION(DObject, S_Sound)
@ -1330,7 +1339,8 @@ DEFINE_ACTION_FUNCTION(DObject, S_Sound)
PARAM_INT(channel);
PARAM_FLOAT(volume);
PARAM_FLOAT(attn);
S_Sound(channel, id, static_cast<float>(volume), static_cast<float>(attn));
PARAM_FLOAT(pitch);
S_SoundPitch(channel, id, static_cast<float>(volume), static_cast<float>(attn), static_cast<float>(pitch));
return 0;
}
@ -1339,14 +1349,17 @@ DEFINE_ACTION_FUNCTION(DObject, S_Sound)
// S_Sound - An actor is source
//
//==========================================================================
void S_Sound (AActor *ent, int channel, FSoundID sound_id, float volume, float attenuation)
void S_SoundPitchActor(AActor *ent, int channel, FSoundID sound_id, float volume, float attenuation, float pitch)
{
if (ent == nullptr || ent->Sector->Flags & SECF_SILENT || ent->Level != primaryLevel)
return;
S_StartSound (ent, nullptr, nullptr, nullptr, channel, sound_id, volume, attenuation);
S_StartSound (ent, nullptr, nullptr, nullptr, channel, sound_id, volume, attenuation, 0, pitch);
}
void S_Sound(AActor *ent, int channel, FSoundID sound_id, float volume, float attenuation)
{
S_SoundPitchActor(ent, channel, sound_id, volume, attenuation, 0.f);
}
//==========================================================================
//
// S_SoundMinMaxDist - An actor is source
@ -1414,38 +1427,43 @@ void S_Sound (const sector_t *sec, int channel, FSoundID sfxid, float volume, fl
//
//==========================================================================
void S_PlaySound(AActor *a, int chan, FSoundID sid, float vol, float atten, bool local)
void S_PlaySoundPitch(AActor *a, int chan, FSoundID sid, float vol, float atten, bool local, float pitch)
{
if (a == nullptr || a->Sector->Flags & SECF_SILENT || a->Level != primaryLevel)
return;
if (!local)
{
S_Sound(a, chan, sid, vol, atten);
S_SoundPitchActor(a, chan, sid, vol, atten, pitch);
}
else
{
if (a->CheckLocalView())
{
S_Sound(chan, sid, vol, ATTN_NONE);
S_SoundPitch(chan, sid, vol, ATTN_NONE, pitch);
}
}
}
void A_PlaySound(AActor *self, int soundid, int channel, double volume, int looping, double attenuation, int local)
void S_PlaySound(AActor *a, int chan, FSoundID sid, float vol, float atten, bool local)
{
S_PlaySoundPitch(a, chan, sid, vol, atten, local, 0.f);
}
void A_PlaySound(AActor *self, int soundid, int channel, double volume, int looping, double attenuation, int local, double pitch)
{
if (!looping)
{
if (!(channel & CHAN_NOSTOP) || !S_IsActorPlayingSomething(self, channel & 7, soundid))
{
S_PlaySound(self, channel, soundid, (float)volume, (float)attenuation, local);
S_PlaySoundPitch(self, channel, soundid, (float)volume, (float)attenuation, local, (float)pitch);
}
}
else
{
if (!S_IsActorPlayingSomething(self, channel & 7, soundid))
{
S_PlaySound(self, channel | CHAN_LOOP, soundid, (float)volume, (float)attenuation, local);
S_PlaySoundPitch(self, channel | CHAN_LOOP, soundid, (float)volume, (float)attenuation, local, (float)pitch);
}
}
}
@ -1843,6 +1861,33 @@ void S_ChangeSoundVolume(AActor *actor, int channel, double dvolume)
return;
}
//==========================================================================
//
// S_ChangeSoundPitch
//
//==========================================================================
void S_ChangeSoundPitch(AActor *actor, int channel, double pitch)
{
for (FSoundChan *chan = Channels; chan != NULL; chan = chan->NextChan)
{
if (chan->SourceType == SOURCE_Actor &&
chan->Actor == actor &&
chan->EntChannel == channel)
{
S_SetPitch(chan, (float)pitch);
return;
}
}
return;
}
void S_SetPitch(FSoundChan *chan, float pitch)
{
GSnd->ChannelPitch(chan, MAX(0.0001f, pitch));
chan->Pitch = MAX(1, int(float(NORM_PITCH) * pitch));
}
//==========================================================================
//
// S_GetSoundPlayingInfo

View file

@ -179,7 +179,6 @@ struct FSoundChan : public FISoundChannel
FSoundID SoundID; // Sound ID of playing sound.
FSoundID OrgID; // Sound ID of sound used to start this channel.
float Volume;
int ChanFlags;
int16_t Pitch; // Pitch variation.
uint8_t EntChannel; // Actor's sound channel.
int8_t Priority;
@ -231,8 +230,12 @@ void S_Sound (const FPolyObj *poly, int channel, FSoundID sfxid, float volume, f
void S_Sound (const sector_t *sec, int channel, FSoundID sfxid, float volume, float attenuation);
void S_Sound(FLevelLocals *Level, const DVector3 &pos, int channel, FSoundID sfxid, float volume, float attenuation);
void S_SoundPitch (int channel, FSoundID sfxid, float volume, float attenuation, float pitch);
void S_SoundPitchActor (AActor *ent, int channel, FSoundID sfxid, float volume, float attenuation, float pitch);
// [Nash] Used by ACS and DECORATE
void S_PlaySound(AActor *a, int chan, FSoundID sid, float vol, float atten, bool local);
void S_PlaySoundPitch(AActor *a, int chan, FSoundID sid, float vol, float atten, bool local, float pitch);
// sound channels
// channel 0 never willingly overrides
@ -310,6 +313,10 @@ bool S_IsActorPlayingSomething (AActor *actor, int channel, int sound_id);
// Change a playing sound's volume
void S_ChangeSoundVolume(AActor *actor, int channel, double volume);
// Change a playing sound's pitch
void S_ChangeSoundPitch(AActor *actor, int channel, double pitch);
void S_SetPitch(FSoundChan *chan, float dpitch);
// Moves all sounds from one mobj to another
void S_RelinkSound (AActor *from, AActor *to);
@ -372,7 +379,7 @@ sfxinfo_t *S_LoadSound(sfxinfo_t *sfx, FSoundLoadBuffer *pBuffer = nullptr);
unsigned int S_GetMSLength(FSoundID sound);
void S_ParseMusInfo();
bool S_ParseTimeTag(const char *tag, bool *as_samples, unsigned int *time);
void A_PlaySound(AActor *self, int soundid, int channel, double volume, int looping, double attenuation, int local);
void A_PlaySound(AActor *self, int soundid, int channel, double volume, int looping, double attenuation, int local, double pitch);
// [RH] Prints sound debug info to the screen.
// Modelled after Hexen's noise cheat.

File diff suppressed because it is too large Load diff

View file

@ -1182,6 +1182,8 @@ OptionMenu "MiscOptions" protected
Option "$MISCMNU_ENABLEAUTOSAVES", "disableautosave", "Autosave"
Option "$MISCMNU_SAVELOADCONFIRMATION", "saveloadconfirmation", "OnOff"
Slider "$MISCMNU_AUTOSAVECOUNT", "autosavecount", 1, 20, 1, 0
Option "$MISCMNU_QUICKSAVEROTATION", "quicksaverotation", "OnOff"
Slider "$MISCMNU_QUICKSAVECOUNT", "quicksaverotationcount", 1, 20, 1, 0
Option "$MISCMNU_DEHLOAD", "dehload", "dehopt"
Option "$MISCMNU_ENABLESCRIPTSCREENSHOTS", "enablescriptscreenshot", "OnOff"
Option "$MISCMNU_INTERSCROLL", "nointerscrollabort", "OffOn"
@ -2714,11 +2716,13 @@ OptionString "LanguageOptions"
"esm", "Español (Latino) (Latin American Spanish)"
"fr", "Français (French)"
"it", "Italiano (Italian)"
"jp", "日本語 (Japanese)"
"ko", "한국의 (Korean)"
"pl", "Polski (Polish)"
"ptg", "Português (European Portuguese)"
"pt", "Português do Brasil (Brazilian Portuguese)"
"ru", "Русский (Russian)"
"sr", "Српски (Serbian)"
}
/*=======================================

View file

@ -1052,8 +1052,9 @@ class Actor : Thinker native
deprecated("2.3") native void A_BulletAttack();
native void A_WolfAttack(int flags = 0, sound whattoplay = "weapons/pistol", double snipe = 1.0, int maxdamage = 64, int blocksize = 128, int pointblank = 2, int longrange = 4, double runspeed = 160.0, class<Actor> pufftype = "BulletPuff");
native clearscope void A_PlaySound(sound whattoplay = "weapons/pistol", int slot = CHAN_BODY, double volume = 1.0, bool looping = false, double attenuation = ATTN_NORM, bool local = false);
native clearscope void A_PlaySound(sound whattoplay = "weapons/pistol", int slot = CHAN_BODY, double volume = 1.0, bool looping = false, double attenuation = ATTN_NORM, bool local = false, double pitch = 0.0);
native void A_SoundVolume(int slot, double volume);
native void A_SoundPitch(int slot, double pitch);
deprecated("2.3") void A_PlayWeaponSound(sound whattoplay) { A_PlaySound(whattoplay, CHAN_WEAPON); }
native void A_StopSound(int slot = CHAN_VOICE); // Bad default but that's what is originally was...
deprecated("2.3") native void A_PlaySoundEx(sound whattoplay, name slot, bool looping = false, int attenuation = 0);

View file

@ -363,11 +363,11 @@ class Korax : Actor
if (health <= (SpawnHealth() >> 1))
{
numcommands = 5;
numcommands = 4;
}
else
{
numcommands = 4;
numcommands = 3;
}
ACS_Execute(250 + (random[KoraxCommand](0, numcommands)), 0);

View file

@ -132,19 +132,6 @@ class BasicArmor : Armor
// You shouldn't be picking up BasicArmor anyway.
return true;
}
if (!item.bIgnoreSkill)
{
if (item is "BasicArmorBonus")
{
let armor = BasicArmorBonus(item);
armor.SaveAmount = int(armor.SaveAmount * G_SkillPropertyFloat(SKILLP_ArmorFactor));
}
else if (item is "BasicArmorPickup")
{
let armor = BasicArmorPickup(item);
armor.SaveAmount = int(armor.SaveAmount * G_SkillPropertyFloat(SKILLP_ArmorFactor));
}
}
return false;
}
@ -263,12 +250,6 @@ class BasicArmorBonus : Armor
override Inventory CreateCopy (Actor other)
{
let copy = BasicArmorBonus(Super.CreateCopy (other));
if (!bIgnoreSkill)
{
SaveAmount = int(SaveAmount * G_SkillPropertyFloat(SKILLP_ArmorFactor));
}
copy.SavePercent = SavePercent;
copy.SaveAmount = SaveAmount;
copy.MaxSaveAmount = MaxSaveAmount;
@ -309,7 +290,7 @@ class BasicArmorBonus : Armor
result = true;
}
int saveAmount = min(SaveAmount, MaxSaveAmount);
int saveAmount = min(GetSaveAmount(), MaxSaveAmount);
if (saveAmount <= 0)
{ // If it can't give you anything, it's as good as used.
@ -344,6 +325,11 @@ class BasicArmorBonus : Armor
{
SaveAmount *= amount;
}
int GetSaveAmount ()
{
return !bIgnoreSkill ? int(SaveAmount * G_SkillPropertyFloat(SKILLP_ArmorFactor)) : SaveAmount;
}
}
//===========================================================================
@ -383,12 +369,6 @@ class BasicArmorPickup : Armor
override Inventory CreateCopy (Actor other)
{
let copy = BasicArmorPickup(Super.CreateCopy (other));
if (!bIgnoreSkill)
{
SaveAmount = int(SaveAmount * G_SkillPropertyFloat(SKILLP_ArmorFactor));
}
copy.SavePercent = SavePercent;
copy.SaveAmount = SaveAmount;
copy.MaxAbsorb = MaxAbsorb;
@ -410,6 +390,7 @@ class BasicArmorPickup : Armor
override bool Use (bool pickup)
{
int SaveAmount = GetSaveAmount();
let armor = BasicArmor(Owner.FindInventory("BasicArmor"));
// This should really never happen but let's be prepared for a broken inventory.
@ -450,6 +431,10 @@ class BasicArmorPickup : Armor
SaveAmount *= amount;
}
int GetSaveAmount ()
{
return !bIgnoreSkill ? int(SaveAmount * G_SkillPropertyFloat(SKILLP_ArmorFactor)) : SaveAmount;
}
}
//===========================================================================

View file

@ -2692,7 +2692,7 @@ struct PlayerInfo native play // self is what internally is known as player_t
native PSprite FindPSprite(int id) const;
native void SetLogNumber (int text);
native void SetLogText (String text);
native void SetSubtitleNumber (int text);
native void SetSubtitleNumber (int text, Sound sound_id = 0);
native bool Resurrect();
native String GetUserName() const;

View file

@ -102,7 +102,7 @@ class Acolyte : StrifeHumanoid
{
players[i].mo.GiveInventoryType ("QuestItem7");
players[i].SetLogNumber (14);
players[i].SetSubtitleNumber (14);
players[i].SetSubtitleNumber (14, "svox/voc14");
A_StopSound (CHAN_VOICE);
A_PlaySound ("svox/voc14", CHAN_VOICE, 1, false, ATTN_NONE);
}

View file

@ -181,7 +181,7 @@ class AlienSpectre1 : SpectralMonster
String voc = "svox/voc" .. log;
A_PlaySound(voc, CHAN_VOICE, 1, false, ATTN_NONE);
player.player.SetLogNumber (log);
player.player.SetSubtitleNumber (log);
player.player.SetSubtitleNumber (log, voc);
}
}

View file

@ -1865,7 +1865,7 @@ class PowerCoupling : Actor
players[i].mo.GiveInventoryType ("QuestItem6");
S_Sound ("svox/voc13", CHAN_VOICE);
players[i].SetLogNumber (13);
players[i].SetSubtitleNumber (13);
players[i].SetSubtitleNumber (13, "svox/voc13");
A_DropItem ("BrokenPowerCoupling", -1, 256);
Destroy ();
}

View file

@ -320,6 +320,7 @@ struct Font native
native int GetCharWidth(int code);
native int StringWidth(String code);
native int GetMaxAscender(String code);
native bool CanPrint(String code);
native int GetHeight();
native int GetDisplacement();
@ -442,7 +443,7 @@ class Object native
{
return level.PickPlayerStart(pnum, flags);
}
native static void S_Sound (Sound sound_id, int channel, float volume = 1, float attenuation = ATTN_NORM);
native static void S_Sound (Sound sound_id, int channel, float volume = 1, float attenuation = ATTN_NORM, float pitch = 0.0);
native static void S_PauseSound (bool notmusic, bool notsfx);
native static void S_ResumeSound (bool notsfx);
native static bool S_ChangeMusic(String music_name, int order = 0, bool looping = true, bool force = false);

View file

@ -77,6 +77,8 @@ class ConversationMenu : Menu
Array<String> mResponseLines;
Array<uint> mResponses;
bool mShowGold;
bool mHasBackdrop;
bool mConfineTextToBackdrop;
StrifeDialogueNode mCurNode;
int mYpos;
PlayerInfo mPlayer;
@ -85,6 +87,7 @@ class ConversationMenu : Menu
int LineHeight;
int ReplyLineHeight;
Font displayFont;
int speechDisplayWidth;
int displayWidth;
int displayHeight;
int fontScale;
@ -101,7 +104,7 @@ class ConversationMenu : Menu
//=============================================================================
//
// returns the y position of the replies boy for positioning the terminal response.
// returns the y position of the replies box for positioning the terminal response.
//
//=============================================================================
@ -112,7 +115,11 @@ class ConversationMenu : Menu
mShowGold = false;
ConversationPauseTic = gametic + 20;
DontDim = true;
if (!generic_ui)
let tex = TexMan.CheckForTexture (CurNode.Backdrop, TexMan.Type_MiscPatch);
mHasBackdrop = tex.isValid();
if (!generic_ui && !dlg_vgafont)
{
displayFont = SmallFont;
displayWidth = CleanWidth;
@ -123,17 +130,33 @@ class ConversationMenu : Menu
ReplyWidth = 320-50-10;
SpeechWidth = screen.GetWidth()/CleanXfac - 24*2;
ReplyLineHeight = LineHeight = displayFont.GetHeight();
mConfineTextToBackdrop = false;
speechDisplayWidth = displayWidth;
}
else
{
displayFont = NewSmallFont;
fontScale = (CleanXfac+1) / 2;
displayWidth = screen.GetWidth() / fontScale;
displayHeight = screen.GetHeight() / fontScale;
refwidth = 640;
refheight = 400;
ReplyWidth = 640-100-20;
SpeechWidth = screen.GetWidth()/fontScale - (24*2 * CleanXfac / fontScale);
displayWidth = screen.GetWidth() / fontScale;
displayHeight = screen.GetHeight() / fontScale;
let aspect = Screen.GetAspectRatio();
if (!mHasBackdrop || aspect <= 1.3334)
{
SpeechWidth = screen.GetWidth()/fontScale - (24*3 * CleanXfac / fontScale);
mConfineTextToBackdrop = false;
speechDisplayWidth = displayWidth;
}
else
{
let formatWidth = Screen.GetHeight() * 1.3333;
SpeechWidth = formatWidth / fontScale - (24*3 * CleanXfac / fontScale);
mConfineTextToBackdrop = true;
speechDisplayWidth = formatWidth / fontScale;
}
LineHeight = displayFont.GetHeight() + 2;
ReplyLineHeight = LineHeight * fontScale / CleanYfac;
}
@ -442,13 +465,13 @@ class ConversationMenu : Menu
if (speakerName.Length() > 0)
{
screen.DrawText(displayFont, Font.CR_WHITE, x / fontScale, y / fontScale, speakerName, DTA_KeepRatio, true, DTA_VirtualWidth, displayWidth, DTA_VirtualHeight, displayHeight);
screen.DrawText(displayFont, Font.CR_WHITE, x / fontScale, y / fontScale, speakerName, DTA_KeepRatio, !mConfineTextToBackdrop, DTA_VirtualWidth, speechDisplayWidth, DTA_VirtualHeight, displayHeight);
y += linesize * 3 / 2;
}
x = 24 * screen.GetWidth() / 320;
for (int i = 0; i < cnt; ++i)
{
screen.DrawText(displayFont, Font.CR_UNTRANSLATED, x / fontScale, y / fontScale, mDialogueLines.StringAt(i), DTA_KeepRatio, true, DTA_VirtualWidth, displayWidth, DTA_VirtualHeight, displayHeight);
screen.DrawText(displayFont, Font.CR_UNTRANSLATED, x / fontScale, y / fontScale, mDialogueLines.StringAt(i), DTA_KeepRatio, !mConfineTextToBackdrop, DTA_VirtualWidth, speechDisplayWidth, DTA_VirtualHeight, displayHeight);
y += linesize;
}
}

View file

@ -149,7 +149,7 @@ class StatusScreen abstract play version("2.5")
//
//====================================================================
int, int DrawName(int y, TextureID tex, String levelname)
int DrawName(int y, TextureID tex, String levelname)
{
// draw <LevelName>
if (tex.isValid())
@ -161,7 +161,7 @@ class StatusScreen abstract play version("2.5")
// patches with vast amounts of empty space at the bottom.
size.Y = TexMan.CheckRealHeight(tex);
}
return y + int(Size.Y), (BigFont.GetHeight() - BigFont.GetDisplacement()) * CleanYfac / 4;
return y + int(Size.Y) * CleanYfac;
}
else if (levelname.Length() > 0)
{
@ -176,9 +176,9 @@ class StatusScreen abstract play version("2.5")
screen.DrawText(mapname.mFont, mapname.mColor, (screen.GetWidth() - lines.StringWidth(i) * CleanXfac) / 2, y + h, lines.StringAt(i), DTA_CleanNoMove, true);
h += lumph;
}
return y + h, (mapname.mFont.GetHeight() - mapname.mFont.GetDisplacement())/4;
return y + h;
}
return 0, 0;
return 0;
}
//====================================================================
@ -232,17 +232,35 @@ class StatusScreen abstract play version("2.5")
virtual int drawLF ()
{
int y = TITLEY * CleanYfac;
bool ispatch = wbs.LName0.isValid();
int oldy = TITLEY * CleanYfac;
int h;
if (!ispatch)
{
let asc = mapname.mFont.GetMaxAscender(lnametexts[1]);
if (asc > TITLEY - 2)
{
oldy = (asc+2) * CleanYfac;
}
}
int y = DrawName(oldy, wbs.LName0, lnametexts[0]);
[y, h] = DrawName(y, wbs.LName0, lnametexts[0]);
// Adjustment for different font sizes for map name and 'finished'.
let fontspace1 = finished.mFont.GetDisplacement();
let fontspace2 = ((h + (finished.mFont.GetHeight() - fontspace1)/4)) / 2;
y += max(0, fontspace2 - fontspace1) * CleanYFac;
// If the displayed info is made of patches we need some additional offsetting here.
if (ispatch)
{
int h1 = BigFont.GetHeight() - BigFont.GetDisplacement();
int h2 = (y - oldy) / CleanYfac / 4;
let disp = min(h1, h2);
// The offset getting applied here must at least be as tall as the largest ascender in the following text to avoid overlaps.
if (!TexMan.OkForLocalization(finishedPatch, "$WI_FINISHED"))
{
disp += finished.mFont.GetMaxAscender("$WI_FINISHED");
}
y += disp * CleanYfac;
}
// draw "Finished!"
int statsy = multiplayer? NG_STATSY : SP_STATSY * CleanYFac;
@ -266,19 +284,36 @@ class StatusScreen abstract play version("2.5")
virtual void drawEL ()
{
int y = TITLEY * CleanYfac;
bool ispatch = TexMan.OkForLocalization(enteringPatch, "$WI_ENTERING");
int oldy = TITLEY * CleanYfac;
y = DrawPatchOrText(y, entering, enteringPatch, "$WI_ENTERING");
let h = (entering.mFont.GetHeight() - entering.mFont.GetDisplacement()) / 4;
if (!wbs.LName1.isValid())
if (!ispatch)
{
// Factor out the font's displacement here.
let fontspace1 = mapname.mFont.GetDisplacement();
let fontspace2 = ((h + (mapname.mFont.GetHeight() - fontspace1)/4)) / 2;
h = max(0, fontspace2 - fontspace1) * CleanYFac;
}
y += h * CleanYFac;
let asc = entering.mFont.GetMaxAscender("$WI_ENTERING");
if (asc > TITLEY - 2)
{
oldy = (asc+2) * CleanYfac;
}
}
int y = DrawPatchOrText(oldy, entering, enteringPatch, "$WI_ENTERING");
// If the displayed info is made of patches we need some additional offsetting here.
if (ispatch)
{
int h1 = BigFont.GetHeight() - BigFont.GetDisplacement();
let size = TexMan.GetScaledSize(enteringPatch);
int h2 = int(size.Y);
let disp = min(h1, h2) / 4;
// The offset getting applied here must at least be as tall as the largest ascender in the following text to avoid overlaps.
if (!wbs.LName1.isValid())
{
disp += mapname.mFont.GetMaxAscender(lnametexts[1]);
}
y += disp * CleanYfac;
}
DrawName(y, wbs.LName1, lnametexts[1]);
}

View file

@ -109,7 +109,7 @@ class StrifeStatusBar : BaseStatusBar
override void ShowPop (int popnum)
{
Super.ShowPop(popnum);
if (popnum == CurrentPop || (popnum == POP_LOG && generic_ui))
if (popnum == CurrentPop || (popnum == POP_LOG && MustDrawLog(0)))
{
if (popnum == POP_Keys)
{
@ -146,7 +146,7 @@ class StrifeStatusBar : BaseStatusBar
override bool MustDrawLog(int state)
{
// Tell the base class to draw the log if the pop screen won't be displayed.
return generic_ui;
return generic_ui || log_vgafont;
}
void Reset ()

View file

@ -1,63 +1,63 @@
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,ko,pl,pt,ptg,ro,ru,sr
,,,,,,,,,,,,,,,,,,,,,
Picked up a blue flemkey.,GOTBLUEFLEM,,,,Sebrán modrý slizoklíč.,Blauen Flemschlüssel genommen,,,Recogiste una flemllave azul.,,,Flemclé bleue récupérée.,,Raccolta una chiave-flem blu.,청색 플렘열쇠 획득.,Podniesiono niebieski flemowy klucz,Pegou uma flemchave azul.,,,Получен синий флемключ.,
Picked up a yellow flemkey.,GOTYELLOWFLEM,,,,Sebrán žlutý slizoklíč.,Gelben Flemschlüssel genommen,,,Recogiste una flemllave amarilla.,,,Flemclé jaune récupérée.,,Raccolta una chiave-flem gialla.,황색 플렘열쇠 획득.,Podniesiono żółty flemowy klucz,Pegou uma flemchave amarela.,,,Получен жёлтый флемключ.,
Picked up a red flemkey.,GOTREDFLEM,,,,Sebrán červený slizoklíč.,Roten Flemschlüssel genommen.,,,Recogiste una flemllave roja.,,,Flemclé rouge récupérée.,,Raccolta una chiave-flem rossa.,적색 플렘열쇠 획득.,Podniesiono czerwony flemowy klucz,Pegou uma flemchave vermelha.,,,Получен красный флемключ.,
Found Ultra Goggles,GOTGOGGLES,,,,Nalezeny ultrabrýle.,Ultrasichtbrille gefunden,,,Encontraste Ultra Gafas,,,Ultra-lunettes récupérées.,,,울트라 고글 사용.,Znaleziono Ultra Gogle,Achou um Ultra Óculos.,,,Получены Ультра-очки,
You need a blue key to activate this object,PD_BLUECO,,,,Potřebuješ modrý klíč pro aktivaci tohoto objektu,"Du brauchst einen blauen Schlüssel, um dieses Objekt zu aktivieren.",,,Necesitas una llave azul para activar este objeto,,,Il vous faut une clé bleue pour activer cet objet.,Egy kék kulcs szükséges az objektum aktiválásához.,Ti serve una chiave blu per attivare questo oggetto,이걸 작동하려면 청색 열쇠가 필요합니다,"Potrzebujesz niebieskiego klucza, aby aktywować ten przedmiot",Você precisa de uma chave azul para ativar este objeto,,,Для активации нужен синий ключ,Треба вам плави кључ да би активирали овај предмет
You need a red key to activate this object,PD_REDCO,,,,Potřebuješ červený klíč pro aktivaci tohoto objektu,"Du brauchst einen roten Schlüssel, um dieses Objekt zu aktivieren.",,,Necesitas una llave roja para activar este objeto,,,Il vous faut une clé rouge pour activer cet objet.,"Piros kulcs kell, hogy aktiválhasd ezt az objektumot.",Ti serve una chiave rossa per attivare questo oggetto,이걸 작동하려면 적색 열쇠가 필요합니다,"Potrzebujesz czerwonego klucza, aby aktywować ten przedmiot",Você precisa de uma chave vermelha para ativar este objeto,,,Для активации нужен красный ключ,Треба вам црвени кључ да би активирали овај предмет
You need a yellow key to activate this object,PD_YELLOWCO,,,,Potřebuješ žlutý klíč pro aktivaci tohoto objektu,"Du brauchst einen gelben Schlüssel, um dieses Objekt zu aktivieren.",,,Necesitas una llave amarilla para activar este objeto,,,Il vous faut une clé jaune pour activer cet objet.,Egy sárga kulccsal aktiválható ez az objektum,Ti serve una chiave gialla per attivare questo oggetto,이걸 작동하려면 황색 열쇠가 필요합니다,"Potrzebujesz żółtego klucza, aby aktywować ten przedmiot",Você precisa de uma chave amarela para ativar este objeto,,,Для активации нужен жёлтый ключ,Треба вам жути кључ да би активирали овај предмет
You need a blue flemkey to activate this object,PD_BLUEFO,,,,Potřebuješ modrý slizoklíč pro aktivaci tohoto objektu.,"Du brauchst einen blauen Flemschlüssel, um dieses Objekt zu aktivieren.",,,Necesitas una flemllave azul para activar este objeto,,,Il vous faut une flemclé bleue pour activer cet objet.,,Ti serve una chiave-flem blu per attivare questo oggetto,이걸 작동하려면 청색 플렘열쇠가 필요합니다,"Potrzebujesz niebieskiego flemowego klucza, aby aktywować ten przedmiot",Você precisa de uma flemchave azul para ativar este objeto,,,Для активации нужен синий флемключ,
You need a red flemkey to activate this object,PD_REDFO,,,,Potřebuješ červený slizoklíč pro aktivaci tohoto objektu.,"Du brauchst einen roten Flemschlüssel, um dieses Objekt zu aktivieren.",,,Necesitas una flemllave roja para activar este objeto,,,Il vous faut une flemclé rouge pour activer cet objet.,,Ti serve una chiave-flem rossa per attivare questo oggetto,이걸 작동하려면 적색 플렘열쇠가 필요합니다,"Potrzebujesz czerwonego flemowego klucza, aby aktywować ten przedmiot",Você precisa de uma flemchave vermelha para ativar este objeto,,,Для активации нужен красный флемключ,
You need a yellow flemkey to activate this object,PD_YELLOWFO,,,,Potřebuješ žlutý slizoklíč pro aktivaci tohoto objektu.,"Du brauchst einen gelben Flemschlüssel, um dieses Objekt zu aktivieren.",,,Necesitas unaflemllave amarilla para activar este objeto,,,Il vous faut une flemclé jaune pour activer cet objet.,,Ti serve una chiave-flem gialla per attivare questo oggetto,이걸 작동하려면 황색 플렘열쇠가 필요합니다,"Potrzebujesz żółtego flemowego klucza, aby aktywować ten przedmiot",Você precisa de uma flemchave amarela para ativar este objeto,,,Для активации нужен жёлтый флемключ,
Picked up a zorcher.,PICKUP_PISTOL_DROPPED,,,,Sebrán bzukr.,Zorcher genommen.,,,Recogiste un zorcher.,,,Zorcheur récupéré.,,,자쳐 습득.,Podniesiono Zorcher,Pegou um zorcher.,,,Получен Зорчер.,
Zorch and keys added,STSTR_KFAADDED,,,,Bzukr a klíče přidány,Zorch und Schlüssel hinzugefügt.,,,Zorch y llaves añadidas,,,Zorch et clés ajoutées.,,,저치와 열쇠,Dodano amunicję Zorch i klucze,Zorch e chaves adicionadas,,,Зорч и ключи получены,
E1M1: Landing Zone,HUSTR_E1M1,,,,E1M1: Přistávací zóna,E1M1: Landezone,,,E1M1: Zona de Aterrizaje,,,E1M1: Zone D'Atterissage,E1M1: Landoló Zóna,E1M1: Zona di Atterraggio,E1M1: 착륙 지점,E1M1: Strefa Lądowania,E1M1: Zona de Pouso,,,E1M1: Зона высадки,
E1M2: Storage Facility,HUSTR_E1M2,,,,E1M2: Skladiště,E1M2: Lagerhalle,,,E1M2: Instalación de Almacenamiento,,,E1M2: Centre de Stockage,,E1M2: Struttura di Immagazzinamento,E1M2: 저장 시설,E1M2: Magazyn,E1M2: Depósito,,,E1M2: Хранилище,
E1M3: Laboratory,HUSTR_E1M3,,,,E1M3: Testovací laboratoř,E1M3: Labor,,,E1M3: Laboratorio,,,E1M3: Laboratoire,,E1M3: Laboratorio,E1M3: 연구소,E1M3: Laboratorium Eksperymentalne,E1M3: Laboratório de Experimentos,,,E1M3: Лаборатория,
E1M4: Arboretum,HUSTR_E1M4,,,,,,,,E1M4: Arboreto,,,E1M4: Arboretum,,E1M4: Arboreto,E1M4: 수목원,E1M4: Arboretum,E1M4: Arvoredo,,,E1M4: Дендрарий,
E1M5: Caverns of Bazoik,HUSTR_E1M5,,,,E1M5: Bazoikské jeskyně,E1M5: Die Höhlen von Bazoik,,,E1M5: Cavernas de Bazoik,,,E1M5: Cavernes de Bazoik,,E1M5: Caverne di Bazoik,E1M5: 바조이크의 대동굴,E1M5: Jaskinie Bazoik,E1M5: Cavernas de Bazoik,,,E1M5: Пещеры Базоика,
E2M1: Spaceport,HUSTR_E2M1,,,,E2M1: Kosmodrom,E2M1: Raumhafen,,,E2M1: Puerto Espacial,,,E2M1: Spatioport,,E2M1: Spazioporto,E2M1: 우주공항,E2M1: Port Kosmiczny,E2M1: Espaçoporto,,,E2M1: Космодром,
E2M2: Cinema,HUSTR_E2M2,,,,E2M2: Kino,E2M2: Kino,,,E2M2: Cine,,,E2M2: Cinéma,,,E2M2: 극장,E2M2: Kino,E2M2: Cinema,,,E2M2: Кинотеатр,
E2M3: Chex Museum,HUSTR_E2M3,,,,E2M3: Muzem Chex,,,,E2M3: Museo de Chex,,,E2M3: Musée Chex,,E2M3: Museo di Chex,E2M3: 첵스 박물관,E2M3: Muzeum Chex,E2M3: Museu Chex,,,E2M3: Музей Chex,
E2M4: City Streets,HUSTR_E2M4,,,,E2M4: Městské ulice,E2M4: städtische Straßen,,,E2M4: Calles de la Ciudad,,,E2M4: Rues de la Ville,,E2M4: Strade della città,E2M4: 도시 거리,E2M4: Ulice Miasta,E2M4: Ruas da Cidade,,,E2M4: Городские улицы,
E2M5: Sewer System,HUSTR_E2M5,,,,E2M5: Kanalizace,E2M5: Kanalisation,,,E2M5: Alcantarillado,,,E2M5: Système d'égouts,,E2M5: Rete fognaria,E2M5: 하수도,E2M5: System Ścieków,E2M5: Rede de Esgoto,,,E2M5: Канализация,
E3M1: Central Command,HUSTR_E3M1,,,,E3M1: Centrální velení,E3M1: Kommandozentrale,,,E3M1: Comando central,,,E3M1: Commandement,,E3M1: Comando centrale,E3M1: 중앙 사령부,E3M1: Centrum Dowodzenia,E3M1: Comando Central,,,E3M1: Командный центр,
E3M2: United Cereals,HUSTR_E3M2,,,,E3M2: Spojené cereálie,E3M2: Vereinigte Zerealien,,,E3M2: Cereales unidos,,,E3M2: Céréales Unies,,E3M2: Cereali uniti,E3M2: 시리얼 연합,E3M2: Zjednoczone Płatki,E3M2: Cereais Unidos,,,E3M2: Организация Объединённых Хлопьев,
E3M3: Villa Chex,HUSTR_E3M3,,,,,,,,,,,E3M3: Villa Chex,,,E3M3: 책스 주택,E3M3: Willa Chex,E3M3: Villa Chex,,,E3M3: Вилла Chex,
E3M4: Provincial Park,HUSTR_E3M4,,,,E3M4: Provinciální park,E3M4: Provinzpark,,,E3M4: Parque provincial,,,E3M4: Parc Naturel,,E3M4: Parco provinciale,E3M4: 주립공원,E3M4: Prowincjonalny Park,E3M4: Parque Natural,,,E3M4: Провинциальный парк,
E3M5: Meteor Spaceship,HUSTR_E3M5,,,,E3M5: Meteorová vesmírná loď,E3M5: Meteor-Raumschiff,,,E3M5: Nave Meteoro,,,E3M5: Vaisseau Météore,,E2M5: Astronave meteorica,E3M5: 거대 유성호,"E3M5: Statek Kosmiczny ""Meteor""",E3M5: Espaçonave Meteoro,,,E3M5: Космический корабль “Метеор”,
Commonus,CC_ZOMBIE,,,,Obecnýs,,,,,,,,,,커머누스,Pospolitus,,,,Обыкновеннус,
Bipedicus,CC_SHOTGUN,,,,Dvojnožus,,,,,,,,,,바이피디쿠스,,,,,Двуножка,
Bipedicus with Armor,CC_IMP,,,,Dvojnožus s brněním,Bipedicus mit Panzerung,,,Bipedicus con Armadura,,,Bipedicus avec Armure,,Bipedicus corazzato,정예 바이피디쿠스,Opancerzony Bipedicus,Bipedicus de Armadura,,,Бронированная двуножка,
Stridicus,CC_DEMON,,,,Běhakus,,,,,,,,,,스트리디쿠스,,,,,Длинноножка,
Flem Mine,CC_LOST,,,,Slizná mina,,,,Flem-Mina,,,,,Mina di Flem,플렘 지뢰,Flemowa Mina,Mina Flem,,,Флем-мина,
Super Cycloptis,CC_CACO,,,,Superkykloptus,,,,,,,,,,슈퍼 사이클롭티스,Super Cykloptis,,,,Супер-циклоптис,
Maximus,CC_BARON,,,,,,,,,,,,,,맥시무스,,,,,Максимус,
The Flembomination,CC_SPIDER,,,,Slizavnost,Die Flembomination,,,La Flembominación,,,La Flembomination,,La Flembominio,플렘보미네이션,Flembominacja,A Flembominação,,,Флемомерзость,
Lord Snotfolus,CC_CYBER,,,,Lord Hlenfujus,,,,Lord Mocofolus,,,Seigneur Morvator,,,스놋폴러스 마왕,Lord Smarkofolus,Lorde Snotfolus,,,Лорд Соплезелёнус,
Chex Warrior,CC_HERO,,,,Bojovník Chex,Chex Krieger,,,Guerrero Chex,,,Guerrier Chex,,Guerriero Chex,첵스 전사,Wojownik Chex,,,,Воин Chex,
You need a blue key to open this door,PD_BLUEC,,,,Potřebuješ modrý klíč pro otevření těchto dveří,"Du brauchst einen blauen Schlüssel, um diese Tür zu öffnen.",,,Necesitas una llave azul para abrir esta puerta,,,Il vous faut une clé bleue pour ouvrir cette porte.,Az ajtót a kék kulcs nyitja.,Ti serve una chiave blu per aprire questa porta,이 문을 열려면 청색 열쇠가 필요합니다,"Potrzebujesz niebieskiego klucza, aby otworzyć te drzwi",Você precisa de uma chave azul para abrir essa porta,,,"Нужен синий ключ, чтобы открыть",Треба вам плави кључ да би отворили ова врата
You need a red key to open this door,PD_REDC,,,,Potřebuješ červený klíč pro otevření těchto dveří,"Du brauchst einen roten Schlüssel, um diese Tür zu öffnen.",,,Necesitas una llave roja para abrir esta puerta,,,Il vous faut une clé rouge pour ouvrir cette porte.,"Piros kulcs szükséges, hogy az ajtót kinyithasd.",Ti serve una chiave rossa per aprire questa porta,이 문을 열려면 적색 열쇠가 필요합니다,"Potrzebujesz czerwonego klucza, aby otworzyć te drzwi",Você precisa de uma chave vermelha para abrir essa porta,,,"Нужен красный ключ, чтобы открыть",Треба вам црвени кључ да би отворили ова врата
You need a yellow key to open this door,PD_YELLOWC,,,,Potřebuješ žlutý klíč pro otevření těchto dveří,"Du brauchst einen gelben Schlüssel, um diese Tür zu öffnen.",,,Necesitas una llave amarilla para abrir esta puerta,,,Il vous faut une clé jaune pour ouvrir cette porte.,Kell egy sárga kulcs hogy kinyisd ezt az ajtót.,Ti serve una chiave gialla per aprire questa porta,이 문을 열려면 황색 열쇠가 필요합니다,"Potrzebujesz żółtego klucza, aby otworzyć te drzwi",Você precisa de uma chave amarela para abrir essa porta,,,"Нужен жёлтый ключ, чтобы открыть",Треба вам жути кључ да би отворили ова врата
You need a blue flemkey to open this door,PD_BLUEF,,,,Potřebuješ modrý slizoklíč pro otevření těchto dveří,"Du brauchst einen blauen Flemschlüssel, um diese Tür zu öffnen.",,,Necesitas una flemllave azul para abrir esta puerta,,,Il vous faut une flemclé bleue pour ouvrir cette porte.,,Ti serve una chiave-flem blu per aprire questa porta,이 문을 열려면 청색 플렘열쇠가 필요합니다,"Potrzebujesz niebieskiego flemowego klucza, aby otworzyć te drzwi",Você precisa de uma flemchave azul para ativar este objeto,,,"Нужен синий флемключ, чтобы открыть",
You need a red flemkey to open this door,PD_REDF,,,,Potřebuješ červený slizoklíč pro otevření těchto dveří,"Du brauchst einen roten Flemschlüssel, um diese Tür zu öffnen.",,,Necesitas una flemllave roja para abrir esta puerta,,,Il vous faut une flemclé rouge pour ouvrir cette porte.,,Ti serve una chiave-flem rossa per aprire questa porta,이 문을 열려면 적색 플렘열쇠가 필요합니다,"Potrzebujesz czerwonego flemowego klucza, aby otworzyć te drzwi",Você precisa de uma flemchave vermelha para ativar este objeto,,,"Нужен красный флемключ, чтобы открыть",
You need a yellow flemkey to open this door,PD_YELLOWF,,,,Potřebuješ žlutý slizoklíč pro otevření těchto dveří,"Du brauchst einen gelben Flemschlüssel, um diese Tür zu öffnen.",,,Necesitas una flemllave amarilla para abrir esta puerta,,,Il vous faut une flemclé jaune pour ouvrir cette porte.,,Ti serve una chiave-flem gialla per aprire questa porta,이 문을 열려면 황색 플렘열쇠가 필요합니다,"Potrzebujesz żółtego flemowego klucza, aby otworzyć te drzwi",Você precisa de uma flemchave amarela para ativar este objeto,,,"Нужен жёлтый флемключ, чтобы открыть",
%o sinks into some slime.,OB_SLIME,,,,%o se propadl@[ao_cs] do slizu.,%o versank im Schleim,,,%o se hunde en lodo.,,,%o se noie dans la morve.,,,%o 는(은) 점액 속으로 가라앉았습니다.,%o topi się w szlamie.,%o afundou na gosma.,,,Игрок %o утонул в слизи.,
%o sinks into some slime.,OB_LAVA,,,,%o se propadl@[ao_cs] do slizu.,%o versank im Schleim,,,%o se hunde en lodo.,,,%o se noie dans la morve.,,,%o 는(은) 질척하게 가라앉았습니다.,%o topi się w szlamie.,%o afundou na gosma.,,,Игрок %o утонул в слизи.,
%o was hit by inter-dimensional slime!,OB_POWERSTRAND,,,,%o byl@[ao_cs] zasažen@[ao_cs] mezidimenzionálním slizem!,%o wurde von interdimensionalem Schleim getroffen,,,¡%o fue alcanzad@[ao_esp] por lodo interdimensional!,,,%o s'est fait@[e_fr] toucher par de la morve interdimensionelle!,,,%o 는(은) 차원균열 점액에 맞았습니다!,%o został@[ao_pl] uderzon@[adj_pl] przez międzywymiarowy szlam!,%o foi atingid@[ao_ptb] por gosma interdimensional!,,,В игрока %o попала межпространственная слизь!,
%o was hit by inter-dimensional slime!,OB_KILLEDSELF,,,,%o byl@[ao_cs] zasažen@[ao_cs] mezidimenzionálním slizem!,%o wurde von interdimensionalem Schleim getroffen,,,¡%o fue alcanzad@[ao_esp] por lodo interdimensional!,,,%o s'est fait@[e_fr] toucher par de la morve interdimensionelle!,,,%o 는(은) 모르는 사이에 점액에 당했습니다!,%o został@[ao_pl] uderzon@[adj_pl] przez międzywymiarowy szlam!,%o foi atingid@[ao_ptb] por gosma interdimensional!,,,В игрока %o попала межпространственная слизь!,
%o was boogered by a stridicus.,OB_STRIDICUS,,,,%o dostal@[ao_cs] holuby od běhakem.,%o wurde von einem Stridicus bepopelt.,,,%o fue moquead@[ao_esp] por un stridicus.,,,%o s'est fait@[e_fr] engluer par un stridicus.,,,%o 는(은) 스트리디쿠스의 코딱지에 당했습니다.,%o został@[ao_pl] zaglutowan@[adj_pl] przez stridicusa.,%o foi melecad@[ao_ptb] por um stridicus.,,,Игрока %o облепила соплями длинноножка. ,
%o was gooed by a flem mine.,OB_FLEMMINE,,,,%o byl@[ao_cs] zablácen@[ao_cs] sliznou minou.,%o wurde von einer Flem-Mine beschmiert.,,,%o fue pegotead@[ao_esp] por una flem-mina.,,,%o s'est fait@[e_fr] éclabousser par une flem mine.,,,%o 는(은) 플렘 지뢰에 의해 점액 범벅이 됐습니다.,"%o został@[ao_pl] zabrejowan@[adj_pl] przez flemową minę.
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,pl,pt,ptg,ro,ru,sr
,,,,,,,,,,,,,,,,,,,,,,
Picked up a blue flemkey.,GOTBLUEFLEM,,,,Sebrán modrý slizoklíč.,Blauen Flemschlüssel genommen,,,Recogiste una flemllave azul.,,,Flemclé bleue récupérée.,,Raccolta una chiave-flem blu.,ブルー フレムキー をみつけた,청색 플렘열쇠 획득.,Podniesiono niebieski flemowy klucz,Pegou uma flemchave azul.,,,Получен синий флемключ.,
Picked up a yellow flemkey.,GOTYELLOWFLEM,,,,Sebrán žlutý slizoklíč.,Gelben Flemschlüssel genommen,,,Recogiste una flemllave amarilla.,,,Flemclé jaune récupérée.,,Raccolta una chiave-flem gialla.,イエローフレムキー をみつけた,황색 플렘열쇠 획득.,Podniesiono żółty flemowy klucz,Pegou uma flemchave amarela.,,,Получен жёлтый флемключ.,
Picked up a red flemkey.,GOTREDFLEM,,,,Sebrán červený slizoklíč.,Roten Flemschlüssel genommen.,,,Recogiste una flemllave roja.,,,Flemclé rouge récupérée.,,Raccolta una chiave-flem rossa.,レッド フレムキー をみつけた,적색 플렘열쇠 획득.,Podniesiono czerwony flemowy klucz,Pegou uma flemchave vermelha.,,,Получен красный флемключ.,
Found Ultra Goggles,GOTGOGGLES,,,,Nalezeny ultrabrýle.,Ultrasichtbrille gefunden,,,Encontraste Ultra Gafas,,,Ultra-lunettes récupérées.,,,ウルトラゴーグル をみつけた,울트라 고글 사용.,Znaleziono Ultra Gogle,Achou um Ultra Óculos.,,,Получены Ультра-очки,
You need a blue key to activate this object,PD_BLUECO,,,,Potřebuješ modrý klíč pro aktivaci tohoto objektu,"Du brauchst einen blauen Schlüssel, um dieses Objekt zu aktivieren.",,,Necesitas una llave azul para activar este objeto,,,Il vous faut une clé bleue pour activer cet objet.,Egy kék kulcs szükséges az objektum aktiválásához.,Ti serve una chiave blu per attivare questo oggetto,このそうちは ブルー キー がひつようだ,이걸 작동하려면 청색 열쇠가 필요합니다,"Potrzebujesz niebieskiego klucza, aby aktywować ten przedmiot",Você precisa de uma chave azul para ativar este objeto,,,Для активации нужен синий ключ,Треба вам плави кључ да би активирали овај предмет
You need a red key to activate this object,PD_REDCO,,,,Potřebuješ červený klíč pro aktivaci tohoto objektu,"Du brauchst einen roten Schlüssel, um dieses Objekt zu aktivieren.",,,Necesitas una llave roja para activar este objeto,,,Il vous faut une clé rouge pour activer cet objet.,"Piros kulcs kell, hogy aktiválhasd ezt az objektumot.",Ti serve una chiave rossa per attivare questo oggetto,このそうちは レッド キー がひつようだ,이걸 작동하려면 적색 열쇠가 필요합니다,"Potrzebujesz czerwonego klucza, aby aktywować ten przedmiot",Você precisa de uma chave vermelha para ativar este objeto,,,Для активации нужен красный ключ,Треба вам црвени кључ да би активирали овај предмет
You need a yellow key to activate this object,PD_YELLOWCO,,,,Potřebuješ žlutý klíč pro aktivaci tohoto objektu,"Du brauchst einen gelben Schlüssel, um dieses Objekt zu aktivieren.",,,Necesitas una llave amarilla para activar este objeto,,,Il vous faut une clé jaune pour activer cet objet.,Egy sárga kulccsal aktiválható ez az objektum,Ti serve una chiave gialla per attivare questo oggetto,このそうちは イエローキー がひつようだ,이걸 작동하려면 황색 열쇠가 필요합니다,"Potrzebujesz żółtego klucza, aby aktywować ten przedmiot",Você precisa de uma chave amarela para ativar este objeto,,,Для активации нужен жёлтый ключ,Треба вам жути кључ да би активирали овај предмет
You need a blue flemkey to activate this object,PD_BLUEFO,,,,Potřebuješ modrý slizoklíč pro aktivaci tohoto objektu.,"Du brauchst einen blauen Flemschlüssel, um dieses Objekt zu aktivieren.",,,Necesitas una flemllave azul para activar este objeto,,,Il vous faut une flemclé bleue pour activer cet objet.,,Ti serve una chiave-flem blu per attivare questo oggetto,このそうちは ブルー キーがひつようだ,이걸 작동하려면 청색 플렘열쇠가 필요합니다,"Potrzebujesz niebieskiego flemowego klucza, aby aktywować ten przedmiot",Você precisa de uma flemchave azul para ativar este objeto,,,Для активации нужен синий флемключ,
You need a red flemkey to activate this object,PD_REDFO,,,,Potřebuješ červený slizoklíč pro aktivaci tohoto objektu.,"Du brauchst einen roten Flemschlüssel, um dieses Objekt zu aktivieren.",,,Necesitas una flemllave roja para activar este objeto,,,Il vous faut une flemclé rouge pour activer cet objet.,,Ti serve una chiave-flem rossa per attivare questo oggetto,このそうちは レッド キーがひつようだ,이걸 작동하려면 적색 플렘열쇠가 필요합니다,"Potrzebujesz czerwonego flemowego klucza, aby aktywować ten przedmiot",Você precisa de uma flemchave vermelha para ativar este objeto,,,Для активации нужен красный флемключ,
You need a yellow flemkey to activate this object,PD_YELLOWFO,,,,Potřebuješ žlutý slizoklíč pro aktivaci tohoto objektu.,"Du brauchst einen gelben Flemschlüssel, um dieses Objekt zu aktivieren.",,,Necesitas unaflemllave amarilla para activar este objeto,,,Il vous faut une flemclé jaune pour activer cet objet.,,Ti serve una chiave-flem gialla per attivare questo oggetto,このそうちは イエローキーがひつようだ,이걸 작동하려면 황색 플렘열쇠가 필요합니다,"Potrzebujesz żółtego flemowego klucza, aby aktywować ten przedmiot",Você precisa de uma flemchave amarela para ativar este objeto,,,Для активации нужен жёлтый флемключ,
Picked up a zorcher.,PICKUP_PISTOL_DROPPED,,,,Sebrán bzukr.,Zorcher genommen.,,,Recogiste un zorcher.,,,Zorcheur récupéré.,,Ho preso uno zorcher.,ゾーカー をひろった,자쳐 습득.,Podniesiono Zorcher,Pegou um zorcher.,,,Получен Зорчер.,
Zorch and keys added,STSTR_KFAADDED,,,,Bzukr a klíče přidány,Zorch und Schlüssel hinzugefügt.,,,Zorch y llaves añadidas,,,Zorch et clés ajoutées.,,Zorch e chiavi aggiunte,ゾーク と キーがとどいた,저치와 열쇠,Dodano amunicję Zorch i klucze,Zorch e chaves adicionadas,,,Зорч и ключи получены,
E1M1: Landing Zone,HUSTR_E1M1,,,,E1M1: Přistávací zóna,E1M1: Landezone,,,E1M1: Zona de Aterrizaje,,,E1M1: Zone D'Atterissage,E1M1: Landoló Zóna,E1M1: Zona di Atterraggio,E1M1: ちゃくち ちてん,E1M1: 착륙 지점,E1M1: Strefa Lądowania,E1M1: Zona de Pouso,,,E1M1: Зона высадки,
E1M2: Storage Facility,HUSTR_E1M2,,,,E1M2: Skladiště,E1M2: Lagerhalle,,,E1M2: Instalación de Almacenamiento,,,E1M2: Centre de Stockage,,E1M2: Struttura di Immagazzinamento,E1M2: ちょぞう しせつ,E1M2: 저장 시설,E1M2: Magazyn,E1M2: Depósito,,,E1M2: Хранилище,
E1M3: Laboratory,HUSTR_E1M3,,,,E1M3: Testovací laboratoř,E1M3: Labor,,,E1M3: Laboratorio,,,E1M3: Laboratoire,,E1M3: Laboratorio,E1M3: ラボラトリー,E1M3: 연구소,E1M3: Laboratorium Eksperymentalne,E1M3: Laboratório de Experimentos,,,E1M3: Лаборатория,
E1M4: Arboretum,HUSTR_E1M4,,,,,,,,E1M4: Arboreto,,,E1M4: Arboretum,,E1M4: Arboreto,E1M4: じゅもく園,E1M4: 수목원,E1M4: Arboretum,E1M4: Arvoredo,,,E1M4: Дендрарий,
E1M5: Caverns of Bazoik,HUSTR_E1M5,,,,E1M5: Bazoikské jeskyně,E1M5: Die Höhlen von Bazoik,,,E1M5: Cavernas de Bazoik,,,E1M5: Cavernes de Bazoik,,E1M5: Caverne di Bazoik,E1M5: バゾイクのどうくつ,E1M5: 바조이크의 대동굴,E1M5: Jaskinie Bazoik,E1M5: Cavernas de Bazoik,,,E1M5: Пещеры Базоика,
E2M1: Spaceport,HUSTR_E2M1,,,,E2M1: Kosmodrom,E2M1: Raumhafen,,,E2M1: Puerto Espacial,,,E2M1: Spatioport,,E2M1: Spazioporto,E2M1: スペースポート,E2M1: 우주공항,E2M1: Port Kosmiczny,E2M1: Espaçoporto,,,E2M1: Космодром,
E2M2: Cinema,HUSTR_E2M2,,,,E2M2: Kino,E2M2: Kino,,,E2M2: Cine,,,E2M2: Cinéma,,,E2M2: シネマ,E2M2: 극장,E2M2: Kino,E2M2: Cinema,,,E2M2: Кинотеатр,
E2M3: Chex Museum,HUSTR_E2M3,,,,E2M3: Muzem Chex,,,,E2M3: Museo de Chex,,,E2M3: Musée Chex,,E2M3: Museo di Chex,E2M3: チェックス ミュージアム,E2M3: 첵스 박물관,E2M3: Muzeum Chex,E2M3: Museu Chex,,,E2M3: Музей Chex,
E2M4: City Streets,HUSTR_E2M4,,,,E2M4: Městské ulice,E2M4: städtische Straßen,,,E2M4: Calles de la Ciudad,,,E2M4: Rues de la Ville,,E2M4: Strade della città,E2M4: シティーストリート,E2M4: 도시 거리,E2M4: Ulice Miasta,E2M4: Ruas da Cidade,,,E2M4: Городские улицы,
E2M5: Sewer System,HUSTR_E2M5,,,,E2M5: Kanalizace,E2M5: Kanalisation,,,E2M5: Alcantarillado,,,E2M5: Système d'égouts,,E2M5: Rete fognaria,E2M5: サワー システム,E2M5: 하수도,E2M5: System Ścieków,E2M5: Rede de Esgoto,,,E2M5: Канализация,
E3M1: Central Command,HUSTR_E3M1,,,,E3M1: Centrální velení,E3M1: Kommandozentrale,,,E3M1: Comando central,,,E3M1: Commandement,,E3M1: Comando centrale,E3M1: 中央 しれいとう,E3M1: 중앙 사령부,E3M1: Centrum Dowodzenia,E3M1: Comando Central,,,E3M1: Командный центр,
E3M2: United Cereals,HUSTR_E3M2,,,,E3M2: Spojené cereálie,E3M2: Vereinigte Zerealien,,,E3M2: Cereales unidos,,,E3M2: Céréales Unies,,E3M2: Cereali uniti,E3M2: ユナイテッド シリアル,E3M2: 시리얼 연합,E3M2: Zjednoczone Płatki,E3M2: Cereais Unidos,,,E3M2: Организация Объединённых Хлопьев,
E3M3: Villa Chex,HUSTR_E3M3,,,,,,,,,,,E3M3: Villa Chex,,,E3M3: チェックスのべっそう,E3M3: 책스 주택,E3M3: Willa Chex,E3M3: Villa Chex,,,E3M3: Вилла Chex,
E3M4: Provincial Park,HUSTR_E3M4,,,,E3M4: Provinciální park,E3M4: Provinzpark,,,E3M4: Parque provincial,,,E3M4: Parc Naturel,,E3M4: Parco provinciale,E3M4: 州立公園,E3M4: 주립공원,E3M4: Prowincjonalny Park,E3M4: Parque Natural,,,E3M4: Провинциальный парк,
E3M5: Meteor Spaceship,HUSTR_E3M5,,,,E3M5: Meteorová vesmírná loď,E3M5: Meteor-Raumschiff,,,E3M5: Nave Meteoro,,,E3M5: Vaisseau Météore,,E2M5: Astronave meteorica,E3M5: メテオスペースシップ,E3M5: 거대 유성호,"E3M5: Statek Kosmiczny ""Meteor""",E3M5: Espaçonave Meteoro,,,E3M5: Космический корабль “Метеор”,
Commonus,CC_ZOMBIE,,,,Obecnýs,,,,,,,,,,コモンズ,커머누스,Pospolitus,,,,Обыкновеннус,
Bipedicus,CC_SHOTGUN,,,,Dvojnožus,,,,,,,,,,バイピディクス,바이피디쿠스,,,,,Двуножка,
Bipedicus with Armor,CC_IMP,,,,Dvojnožus s brněním,Bipedicus mit Panzerung,,,Bipedicus con Armadura,,,Bipedicus avec Armure,,Bipedicus corazzato,アーマードバイピディクス,정예 바이피디쿠스,Opancerzony Bipedicus,Bipedicus de Armadura,,,Бронированная двуножка,
Stridicus,CC_DEMON,,,,Běhakus,,,,,,,,,,ステュリクス,스트리디쿠스,,,,,Длинноножка,
Flem Mine,CC_LOST,,,,Slizná mina,,,,Flem-Mina,,,,,Bomba a Flem,フレムマイン,플렘 지뢰,Flemowa Mina,Mina Flem,,,Флем-мина,
Super Cycloptis,CC_CACO,,,,Superkykloptus,,,,,,,,,,スーパーサイクロプティス,슈퍼 사이클롭티스,Super Cykloptis,,,,Супер-циклоптис,
Maximus,CC_BARON,,,,,,,,,,,,,,マクシムス,맥시무스,,,,,Максимус,
The Flembomination,CC_SPIDER,,,,Slizavnost,Die Flembomination,,,La Flembominación,,,La Flembomination,,La Flembominio,フレンボミネーション,플렘보미네이션,Flembominacja,A Flembominação,,,Флемомерзость,
Lord Snotfolus,CC_CYBER,,,,Lord Hlenfujus,,,,Lord Mocofolus,,,Seigneur Morvator,,,ロード スノフォールス,스놋폴러스 마왕,Lord Smarkofolus,Lorde Snotfolus,,,Лорд Соплезелёнус,
Chex Warrior,CC_HERO,,,,Bojovník Chex,Chex Krieger,,,Guerrero Chex,,,Guerrier Chex,,Guerriero Chex,チェックスのせんし,첵스 전사,Wojownik Chex,,,,Воин Chex,
You need a blue key to open this door,PD_BLUEC,,,,Potřebuješ modrý klíč pro otevření těchto dveří,"Du brauchst einen blauen Schlüssel, um diese Tür zu öffnen.",,,Necesitas una llave azul para abrir esta puerta,,,Il vous faut une clé bleue pour ouvrir cette porte.,Az ajtót a kék kulcs nyitja.,Ti serve una chiave blu per aprire questa porta,このとびらは ブルー キー がひつようだ,이 문을 열려면 청색 열쇠가 필요합니다,"Potrzebujesz niebieskiego klucza, aby otworzyć te drzwi",Você precisa de uma chave azul para abrir essa porta,,,"Нужен синий ключ, чтобы открыть",Треба вам плави кључ да би отворили ова врата
You need a red key to open this door,PD_REDC,,,,Potřebuješ červený klíč pro otevření těchto dveří,"Du brauchst einen roten Schlüssel, um diese Tür zu öffnen.",,,Necesitas una llave roja para abrir esta puerta,,,Il vous faut une clé rouge pour ouvrir cette porte.,"Piros kulcs szükséges, hogy az ajtót kinyithasd.",Ti serve una chiave rossa per aprire questa porta,このとびらは レッド キー がひつようだ,이 문을 열려면 적색 열쇠가 필요합니다,"Potrzebujesz czerwonego klucza, aby otworzyć te drzwi",Você precisa de uma chave vermelha para abrir essa porta,,,"Нужен красный ключ, чтобы открыть",Треба вам црвени кључ да би отворили ова врата
You need a yellow key to open this door,PD_YELLOWC,,,,Potřebuješ žlutý klíč pro otevření těchto dveří,"Du brauchst einen gelben Schlüssel, um diese Tür zu öffnen.",,,Necesitas una llave amarilla para abrir esta puerta,,,Il vous faut une clé jaune pour ouvrir cette porte.,Kell egy sárga kulcs hogy kinyisd ezt az ajtót.,Ti serve una chiave gialla per aprire questa porta,このとびらは イエローキー がひつようだ,이 문을 열려면 황색 열쇠가 필요합니다,"Potrzebujesz żółtego klucza, aby otworzyć te drzwi",Você precisa de uma chave amarela para abrir essa porta,,,"Нужен жёлтый ключ, чтобы открыть",Треба вам жути кључ да би отворили ова врата
You need a blue flemkey to open this door,PD_BLUEF,,,,Potřebuješ modrý slizoklíč pro otevření těchto dveří,"Du brauchst einen blauen Flemschlüssel, um diese Tür zu öffnen.",,,Necesitas una flemllave azul para abrir esta puerta,,,Il vous faut une flemclé bleue pour ouvrir cette porte.,,Ti serve una chiave-flem blu per aprire questa porta,このとびらは ブルー キーがひつようだ,이 문을 열려면 청색 플렘열쇠가 필요합니다,"Potrzebujesz niebieskiego flemowego klucza, aby otworzyć te drzwi",Você precisa de uma flemchave azul para ativar este objeto,,,"Нужен синий флемключ, чтобы открыть",
You need a red flemkey to open this door,PD_REDF,,,,Potřebuješ červený slizoklíč pro otevření těchto dveří,"Du brauchst einen roten Flemschlüssel, um diese Tür zu öffnen.",,,Necesitas una flemllave roja para abrir esta puerta,,,Il vous faut une flemclé rouge pour ouvrir cette porte.,,Ti serve una chiave-flem rossa per aprire questa porta,このとびらは レッド キーがひつようだ,이 문을 열려면 적색 플렘열쇠가 필요합니다,"Potrzebujesz czerwonego flemowego klucza, aby otworzyć te drzwi",Você precisa de uma flemchave vermelha para ativar este objeto,,,"Нужен красный флемключ, чтобы открыть",
You need a yellow flemkey to open this door,PD_YELLOWF,,,,Potřebuješ žlutý slizoklíč pro otevření těchto dveří,"Du brauchst einen gelben Flemschlüssel, um diese Tür zu öffnen.",,,Necesitas una flemllave amarilla para abrir esta puerta,,,Il vous faut une flemclé jaune pour ouvrir cette porte.,,Ti serve una chiave-flem gialla per aprire questa porta,このとびらは イエローキーがひつようだ,이 문을 열려면 황색 플렘열쇠가 필요합니다,"Potrzebujesz żółtego flemowego klucza, aby otworzyć te drzwi",Você precisa de uma flemchave amarela para ativar este objeto,,,"Нужен жёлтый флемключ, чтобы открыть",
%o sinks into some slime.,OB_SLIME,,,,%o se propadl@[ao_cs] do slizu.,%o versank im Schleim,,,%o se hunde en lodo.,,,%o se noie dans la morve.,,%o affonda in qualche melma.,%o はスライムにしずんだ。,%o 는(은) 점액 속으로 가라앉았습니다.,%o topi się w szlamie.,%o afundou na gosma.,,,Игрок %o утонул в слизи.,
%o sinks into some slime.,OB_LAVA,,,,%o se propadl@[ao_cs] do slizu.,%o versank im Schleim,,,%o se hunde en lodo.,,,%o se noie dans la morve.,,%o affonda in qualche melma.,%o はスライムにしずんだ。,%o 는(은) 질척하게 가라앉았습니다.,%o topi się w szlamie.,%o afundou na gosma.,,,Игрок %o утонул в слизи.,
%o was hit by inter-dimensional slime!,OB_POWERSTRAND,,,,%o byl@[ao_cs] zasažen@[ao_cs] mezidimenzionálním slizem!,%o wurde von interdimensionalem Schleim getroffen,,,¡%o fue alcanzad@[ao_esp] por lodo interdimensional!,,,%o s'est fait@[e_fr] toucher par de la morve interdimensionelle!,,%o è stato colpito da melma interdimensionale!,%o は いじげんスライムまみれになった!,%o 는(은) 차원균열 점액에 맞았습니다!,%o został@[ao_pl] uderzon@[adj_pl] przez międzywymiarowy szlam!,%o foi atingid@[ao_ptb] por gosma interdimensional!,,,В игрока %o попала межпространственная слизь!,
%o was hit by inter-dimensional slime!,OB_KILLEDSELF,,,,%o byl@[ao_cs] zasažen@[ao_cs] mezidimenzionálním slizem!,%o wurde von interdimensionalem Schleim getroffen,,,¡%o fue alcanzad@[ao_esp] por lodo interdimensional!,,,%o s'est fait@[e_fr] toucher par de la morve interdimensionelle!,,%o è stato colpito da melma interdimensionale!,%o は いじげんスライムまみれになった!,%o 는(은) 모르는 사이에 점액에 당했습니다!,%o został@[ao_pl] uderzon@[adj_pl] przez międzywymiarowy szlam!,%o foi atingid@[ao_ptb] por gosma interdimensional!,,,В игрока %o попала межпространственная слизь!,
%o was boogered by a stridicus.,OB_STRIDICUS,,,,%o dostal@[ao_cs] holuby od běhakem.,%o wurde von einem Stridicus bepopelt.,,,%o fue moquead@[ao_esp] por un stridicus.,,,%o s'est fait@[e_fr] engluer par un stridicus.,,%o è stato colpito da uno Stridicus.,%o は ステュリクスに おびやかされた。,%o 는(은) 스트리디쿠스의 코딱지에 당했습니다.,%o został@[ao_pl] zaglutowan@[adj_pl] przez stridicusa.,%o foi melecad@[ao_ptb] por um stridicus.,,,Игрока %o облепила соплями длинноножка. ,
%o was gooed by a flem mine.,OB_FLEMMINE,,,,%o byl@[ao_cs] zablácen@[ao_cs] sliznou minou.,%o wurde von einer Flem-Mine beschmiert.,,,%o fue pegotead@[ao_esp] por una flem-mina.,,,%o s'est fait@[e_fr] éclabousser par une flem mine.,,%o è stata colpita da una bomba a flem.,%o はフレムマインに ヒドいめにあった。,%o 는(은) 플렘 지뢰에 의해 점액 범벅이 됐습니다.,"%o został@[ao_pl] zabrejowan@[adj_pl] przez flemową minę.
",%o foi engosmad@[ao_ptb] por uma mina flem.,,,Игрока %o забрызгала флем-мина.,
%o was slimed by a super cycloptis.,OB_SUPERCYCLOPTIS,,,,%o byl@[ao_cs] osliznut@[ao_cs] superkykloptem.,%o wurde von einem Super Cycloptis vollgeschleimt.,,,%o fue enlodad@[ao_esp] por un super cycloptis.,,,%o s'est fait@[e_fr] gélifier par un super cycloptis.,,,%o 는(은) 슈퍼 사이클롭티스의 점액에 당했습니다.,%o został@[ao_pl] oszlamion@[adj_pl] przez super cykloptisa.,%o foi lambuzad@[ao_ptb] por um super cyclóptis.,,,Игрока %o обслюнявил супер-циклоптис.,
%o was defeated by a Maximus.,OB_MAXIMUS,,,,%o byl@[ao_cs] poražen@[ao_cs] Maximem.,%o wurde von einem Maximus besiegt.,,,%o fue derrotad@[ao_esp] por un Maximus.,,,%o s'est fait@[e_fr] battre par un Maximus.,,,%o 는(은) 맥시무스에게 패배했습니다.,%o został@[ao_pl] pokonan@[adj_pl] przez Maximusa.,%o foi derrotad@[ao_ptb] por um Maximus.,,,Игрок %o проиграл Максимусу.,
%o was gooed by a larva.,OB_LARVA,,,,%o byl@[ao_cs] zacáknut@[ao_cs] larvou.,%o wurde von einer Larve beschmiert.,,,%o fue pegotead@[ao_esp] por una larva.,,,%o s'est fait@[e_fr] tacher par une larve.,,,%o 는(은) 애벌레에 의해 점액 범벅이 됐습니다.,%o został@[ao_pl] zabrejowan@[adj_pl] przez larwę.,%o foi engosmad@[ao_ptb] por uma larva.,,,Игрока %o обслюнявила личинка.,
%o was slimed by a Quadrumpus.,OB_QUADRUMPUS,,,,%o byl@[ao_cs] zahleněn@[ao_cs] Čtyřzadkem.,%o wurde von einem Quadrumpus vollgeschleimt.,,,%o fue enlodad@[ao_esp] por un Quadrumpus.,,,%o s'est fait@[e_fr] morver par un quadrumpus.,,,%o 는(은) 쿼드럼푸스의 점액에 당했습니다.,%o został@[ao_pl] oszlamion@[adj_pl] przez Quadrumpusa.,%o foi melecad@[ao_ptb] por um Quadrumpus.,,,Игрока %o обслюнявила многоручка. ,
%o was defeated by the Flembomination.,OB_FLEMBOMINATION,,,,%o byl@[ao_cs] poražen@[ao_cs] Slizavností.,%o wurde von der Flembomination besiegt.,,,%o fue derrotad@[ao_esp] por la Flembominación.,,,%o s'est fait@[e_fr] éliminer par la Flembomination.,,,%o 는(은) 플렘보미네이션으로부터 벗어날 수 없었습니다.,%o został@[ao_pl] pokonan@[adj_pl] przez Flembominację.,%o foi derrotad@[ao_ptb] pela Flembominação.,,,Игрока %o победила Флемомерзость.,
%o was defeated by Lord Snotfolus.,OB_SNOTFOLUS,,,,%o byl@[ao_cs] poražen@[ao_cs] Lordem Hlenfujem.,%o wurde von Lord Snotfolus besiegt.,,,%o fue derrotad@[ao_esp] por Lord Mocofolus.,,,%o est tombé@[e_fr] face au Seigneur Morvator.,,,%o 는(은) 스놋폴러스 마왕과 싸울 준비를 제대로 하지 못했습니다.,%o został@[ao_pl] pokonan@[adj_pl] przez Lorda Smarkofolusa.,%o foi derrotad@[ao_ptb] pelo Lorde Snotfolus.,,,Игрока %o победил лорд Соплезелёнус.,
%o was hit by %k's propulsor.,OB_MPR_SPLASH,,,,%o byl@[ao_cs] zasažen@[ao_cs] propulzorem hráče %k.,%o wurde von %ks Propeller getroffen,,,%o fue alcanzad@[ao_esp] por el propulsor de %k.,,,%o s'est fait@[e_fr] propulser par %k.,,,%o 는(은) %k 의 추진력에 휘말렸습니다.,%o został@[ao_pl] uderzon@[adj_pl] przez pędnik %k.,%o foi atingid@[ao_ptb] pelo propulsor de %k.,,,Игрок %o подстрелен из Ускорителя Зорча %k.,
%o was lazzed by %k.,OB_MPBFG_SPLASH,,,,%o byl@[ao_cs] odlazován@[ao_cs] hráčem %k.,%o wurde von %o weggezorcht.,,,%o fue lazead@[ao_esp] por %k.,,,%o est entré@[e_fr] dans la zone de zorchage large de %k.,,,%o 는(은) %k 에게 레이져를 쐬였습니다.,%o został@[ao_pl] zLAZowan@[adj_pl] przez %k.,%o foi LAZead@[ao_ptb] por %k.,,,Игрок %o получил заряд из «ЗБР» игрока %k.,
%o was slimed by a super cycloptis.,OB_SUPERCYCLOPTIS,,,,%o byl@[ao_cs] osliznut@[ao_cs] superkykloptem.,%o wurde von einem Super Cycloptis vollgeschleimt.,,,%o fue enlodad@[ao_esp] por un super cycloptis.,,,%o s'est fait@[e_fr] gélifier par un super cycloptis.,,%o è stato snellito da una Super Ciyloptis.,%o はスーパーサイクロプティスに とかされた。,%o 는(은) 슈퍼 사이클롭티스의 점액에 당했습니다.,%o został@[ao_pl] oszlamion@[adj_pl] przez super cykloptisa.,%o foi lambuzad@[ao_ptb] por um super cyclóptis.,,,Игрока %o обслюнявил супер-циклоптис.,
%o was defeated by a Maximus.,OB_MAXIMUS,,,,%o byl@[ao_cs] poražen@[ao_cs] Maximem.,%o wurde von einem Maximus besiegt.,,,%o fue derrotad@[ao_esp] por un Maximus.,,,%o s'est fait@[e_fr] battre par un Maximus.,,%o è stato sconfitto da un Maximus.,%o はマクシムスに 敗北した。,%o 는(은) 맥시무스에게 패배했습니다.,%o został@[ao_pl] pokonan@[adj_pl] przez Maximusa.,%o foi derrotad@[ao_ptb] por um Maximus.,,,Игрок %o проиграл Максимусу.,
%o was gooed by a larva.,OB_LARVA,,,,%o byl@[ao_cs] zacáknut@[ao_cs] larvou.,%o wurde von einer Larve beschmiert.,,,%o fue pegotead@[ao_esp] por una larva.,,,%o s'est fait@[e_fr] tacher par une larve.,,%o è stato colpito da una larva.,%o はラーバに ヒドいめにあわされた。,%o 는(은) 애벌레에 의해 점액 범벅이 됐습니다.,%o został@[ao_pl] zabrejowan@[adj_pl] przez larwę.,%o foi engosmad@[ao_ptb] por uma larva.,,,Игрока %o обслюнявила личинка.,
%o was slimed by a Quadrumpus.,OB_QUADRUMPUS,,,,%o byl@[ao_cs] zahleněn@[ao_cs] Čtyřzadkem.,%o wurde von einem Quadrumpus vollgeschleimt.,,,%o fue enlodad@[ao_esp] por un Quadrumpus.,,,%o s'est fait@[e_fr] morver par un quadrumpus.,,%o è stato ridotto da un Quadrumpus.,%o はクワッドロンプスに スライムにされた。,%o 는(은) 쿼드럼푸스의 점액에 당했습니다.,%o został@[ao_pl] oszlamion@[adj_pl] przez Quadrumpusa.,%o foi melecad@[ao_ptb] por um Quadrumpus.,,,Игрока %o обслюнявила многоручка. ,
%o was defeated by the Flembomination.,OB_FLEMBOMINATION,,,,%o byl@[ao_cs] poražen@[ao_cs] Slizavností.,%o wurde von der Flembomination besiegt.,,,%o fue derrotad@[ao_esp] por la Flembominación.,,,%o s'est fait@[e_fr] éliminer par la Flembomination.,,%o è stato sconfitto dalla Flembomination.,%o はフレンボミネーションに敗北した。,%o 는(은) 플렘보미네이션으로부터 벗어날 수 없었습니다.,%o został@[ao_pl] pokonan@[adj_pl] przez Flembominację.,%o foi derrotad@[ao_ptb] pela Flembominação.,,,Игрока %o победила Флемомерзость.,
%o was defeated by Lord Snotfolus.,OB_SNOTFOLUS,,,,%o byl@[ao_cs] poražen@[ao_cs] Lordem Hlenfujem.,%o wurde von Lord Snotfolus besiegt.,,,%o fue derrotad@[ao_esp] por Lord Mocofolus.,,,%o est tombé@[e_fr] face au Seigneur Morvator.,,%o è stato sconfitto da Lord Snotfolus.,%o はロード スノフォールスに敗北した。,%o 는(은) 스놋폴러스 마왕과 싸울 준비를 제대로 하지 못했습니다.,%o został@[ao_pl] pokonan@[adj_pl] przez Lorda Smarkofolusa.,%o foi derrotad@[ao_ptb] pelo Lorde Snotfolus.,,,Игрока %o победил лорд Соплезелёнус.,
%o was hit by %k's propulsor.,OB_MPR_SPLASH,,,,%o byl@[ao_cs] zasažen@[ao_cs] propulzorem hráče %k.,%o wurde von %ks Propeller getroffen,,,%o fue alcanzad@[ao_esp] por el propulsor de %k.,,,%o s'est fait@[e_fr] propulser par %k.,,%o è stato colpito dal propulsore di %k.,%o に %k のロケットゾーカーがとどいた。,%o 는(은) %k 의 추진력에 휘말렸습니다.,%o został@[ao_pl] uderzon@[adj_pl] przez pędnik %k.,%o foi atingid@[ao_ptb] pelo propulsor de %k.,,,Игрок %o подстрелен из Ускорителя Зорча %k.,
%o was lazzed by %k.,OB_MPBFG_SPLASH,,,,%o byl@[ao_cs] odlazován@[ao_cs] hráčem %k.,%o wurde von %o weggezorcht.,,,%o fue lazead@[ao_esp] por %k.,,,%o est entré@[e_fr] dans la zone de zorchage large de %k.,,%o è stato lazzato da %k.,%o は %k にとかされた。,%o 는(은) %k 에게 레이져를 쐬였습니다.,%o został@[ao_pl] zLAZowan@[adj_pl] przez %k.,%o foi LAZead@[ao_ptb] por %k.,,,Игрок %o получил заряд из «ЗБР» игрока %k.,
"After sending the monstrous Flembrane
back to his own dimension, you free the
captives. Yet flemoids are everywhere!
@ -142,7 +142,35 @@ Malheureusement, vous avez raison.
Quand vous retournez sur votre planète,
vous découvrez que les flémoïdes vous
ont suivi jusqu'ici. Préparez vous pour
Chex Quest 2: Terreur à Chex City!",,,"플렘브레인을 원래 차원으로 보내버린 뒤, 당신은 인질들을 풀어줬지만,
Chex Quest 2: Terreur à Chex City!",,"Dopo aver rispedito il mostruoso Flembrane
nella sua dimensione, si liberano i prigionieri.
Eppure i flemoidi sono ovunque! Tu e i
prigionieri fare una pausa per la vostra
astronave. I flemoidi melma la vostra nave,
ma si fuggire di poco in orbita.
Durante il ritorno ci si congratula per
l'audace salvataggio, ma si emette un
avvertimento...
Non abbiamo visto l'ultimo dei Flemoidi.
Purtroppo hai ragione. Infatti, al vostro
ritorno a casa, vi accorgerete che le
flotte vi hanno in qualche modo seguito qui.
Preparatevi per
Chex Quest 2: Terrore a Chex City!","巨大なフレムブレンを元の次元に送り ほりょを解放した。
けれども、フレモイドはまだまだいる!
フレモイドは 君の宇宙船を スライムまみれにしたため、
君と ほりょは 船をこわし せまい道をたどって にげだした。
目的地に たどりついたとき、君の 大たんな救出の成功を
いわった。しかし 君はけいかいしていた...
さいごのフレモイドはどこにいったか。
ざんねんながら けいかいは 正しかった。
家に着くと、フレモイドが 君を探していた形跡が見つかった。
チェックス クエスト2 : チェックス シティーのきょうふ
に そなえろ!
","플렘브레인을 원래 차원으로 보내버린 뒤, 당신은 인질들을 풀어줬지만,
아직 플레모이드들이 사방에 있었습니다! 당신과 인질들은 당신의
우주선으로 도망갔습니다. 플레모이드들이 당신의 우주선에
공격을 가하지만, 아슬아슬하게 궤도 밖으로 탈출하는데
@ -279,7 +307,36 @@ géante se dirige vers la planète
des céréales!
Préparez vous pour Chex Quest 3:
Invasion!",,,"당신은 하수구에 모인 잔존 플레모이드들을 처리하는 데 성공했습니다.
Invasion!",,"Hai zorch il restante flemoidi che si erano
riuniti nelle fogne. Chex City è stata
salvata. Sembra che la minaccia Flemoid è
finalmente finita.
Dieci anni passano in pace e prosperità.
Ma i Flemoid non sono stati sconfitti
e il loro desiderio di controllare la
dimensione ricca di nutrienti cereali
non è diminuito. Hanno raccolto tutte
le loro forze, hanno aperto una gigantesca
spaccatura interdimensionale nello spazio
e ora una grande palla di melma è diretta
direttamente verso il pianeta dei cereali!
Preparati per
Chex Quest 3: Invasione!
","君は 下水道に集まっていたフレモイドを
ぶっとばして、チェックス シティーを守った。
フレモイドの きょういはようやく なくなったようだ。
平和と はんえいの中で10年がたった。
しかしフレモイドは敗北しておらず、えいようのある
シリアルを せいふくするという野望は のこっていた。
かれらは全ての力を集め、宇宙に巨大な次元のさけめを
開いた。そして今や大きなボールオブスライムが
シリアルプラネットに真っ直ぐ向かっている!
チェックスクエスト3 : インベーション
の じゅんびだ!","당신은 하수구에 모인 잔존 플레모이드들을 처리하는 데 성공했습니다.
이제 책스 시티는 안전합니다. 플레모이드들의 위협도 이로써 막을
내린 것 같습니다.
@ -396,7 +453,27 @@ revenir envahir la dimension des
céréales.
Mais vous savez que vous serez
prêt pour eux!",,,"최후의 한방으로, 당신은 스놋폴러스 마왕을 원래 세계로 추방했습니다!
prêt pour eux!",,"Con un ultimo colpo, hai zorch Lord Snotfolus
torna alla sua dimensione! contro tutte
le probabilità che hai sventato
l'invasione con una sola mano!
Speri davvero che i flemoidi hanno
finalmente imparato la lezione e non
torneranno mai più alla dimensione dei cereali.
Ma se lo sai che sarai pronto per loro!
","さいごのいちげきで、ロード スノフォールスを元の次元に
もどした。君一人で全てのオーズのしゅうげきを 阻止した!
君は フレモイド達のことを みんなに教え、再び
シリアル ディメンジョンに ぎゃくしゅうをしかけて
こないよう ねがった。
しかし、そんな考えを持っていたとしても
君にはかなわないと思い知るだろう!","최후의 한방으로, 당신은 스놋폴러스 마왕을 원래 세계로 추방했습니다!
그 모든 역경 속에서 당신은 손쉽게 모든 침공을 막아냈습니다!
당신은 드디어 플레모이드들이 정신을 차리고 다신 시리얼
@ -437,6 +514,6 @@ estará preparad@[ao_ptb]!",,,"Последним метким выстрело
Но если всё-таки проникнут,
ты уже будешь к этому готов@[ao_rus]!",
Rescue on Bazoik,M_EPI1,,,,Záchrana na Bazoiku,Rettung auf Bazoik,,,Rescate en Bazoik,,,Sauvetage sur Bazoik,,,바조이크의 대동굴,Ratunek na Bazoik,Resgate em Bazoik,,,Спасение на Базоике,
Terror in Chex City,M_EPI2,,,,Hrůza v Chex City,,,,Terror en Chex City,,,Terreur à Chex City,,,첵스 시티의 공포,Terror w Mieście Chex,Terror em Chexópolis,,,Террор в Городе Chex,
Invasion!,M_EPI3,,,,Invaze!,,,,¡Invasión!,,,,,,대침공!,Inwazja,A Invasão!,,,Вторжение!,
Rescue on Bazoik,M_EPI1,,,,Záchrana na Bazoiku,Rettung auf Bazoik,,,Rescate en Bazoik,,,Sauvetage sur Bazoik,,Salvataggio su Bazoik,バゾイクからのきゅうしゅつ,바조이크의 대동굴,Ratunek na Bazoik,Resgate em Bazoik,,,Спасение на Базоике,
Terror in Chex City,M_EPI2,,,,Hrůza v Chex City,,,,Terror en Chex City,,,Terreur à Chex City,,Terrore a Chex City,チェックスシティーのきょうふ,첵스 시티의 공포,Terror w Mieście Chex,Terror em Chexópolis,,,Террор в Городе Chex,
Invasion!,M_EPI3,,,,Invaze!,,,,¡Invasión!,,,,,Invasione!,しんにゅう!,대침공!,Inwazja,A Invasão!,,,Вторжение!,
1 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 pl pt ptg ro ru sr
2
3 Picked up a blue flemkey. GOTBLUEFLEM Sebrán modrý slizoklíč. Blauen Flemschlüssel genommen Recogiste una flemllave azul. Flemclé bleue récupérée. Raccolta una chiave-flem blu. ブルー フレムキー をみつけた 청색 플렘열쇠 획득. Podniesiono niebieski flemowy klucz Pegou uma flemchave azul. Получен синий флемключ.
4 Picked up a yellow flemkey. GOTYELLOWFLEM Sebrán žlutý slizoklíč. Gelben Flemschlüssel genommen Recogiste una flemllave amarilla. Flemclé jaune récupérée. Raccolta una chiave-flem gialla. イエローフレムキー をみつけた 황색 플렘열쇠 획득. Podniesiono żółty flemowy klucz Pegou uma flemchave amarela. Получен жёлтый флемключ.
5 Picked up a red flemkey. GOTREDFLEM Sebrán červený slizoklíč. Roten Flemschlüssel genommen. Recogiste una flemllave roja. Flemclé rouge récupérée. Raccolta una chiave-flem rossa. レッド フレムキー をみつけた 적색 플렘열쇠 획득. Podniesiono czerwony flemowy klucz Pegou uma flemchave vermelha. Получен красный флемключ.
6 Found Ultra Goggles GOTGOGGLES Nalezeny ultrabrýle. Ultrasichtbrille gefunden Encontraste Ultra Gafas Ultra-lunettes récupérées. ウルトラゴーグル をみつけた 울트라 고글 사용. Znaleziono Ultra Gogle Achou um Ultra Óculos. Получены Ультра-очки
7 You need a blue key to activate this object PD_BLUECO Potřebuješ modrý klíč pro aktivaci tohoto objektu Du brauchst einen blauen Schlüssel, um dieses Objekt zu aktivieren. Necesitas una llave azul para activar este objeto Il vous faut une clé bleue pour activer cet objet. Egy kék kulcs szükséges az objektum aktiválásához. Ti serve una chiave blu per attivare questo oggetto このそうちは ブルー キー がひつようだ 이걸 작동하려면 청색 열쇠가 필요합니다 Potrzebujesz niebieskiego klucza, aby aktywować ten przedmiot Você precisa de uma chave azul para ativar este objeto Для активации нужен синий ключ Треба вам плави кључ да би активирали овај предмет
8 You need a red key to activate this object PD_REDCO Potřebuješ červený klíč pro aktivaci tohoto objektu Du brauchst einen roten Schlüssel, um dieses Objekt zu aktivieren. Necesitas una llave roja para activar este objeto Il vous faut une clé rouge pour activer cet objet. Piros kulcs kell, hogy aktiválhasd ezt az objektumot. Ti serve una chiave rossa per attivare questo oggetto このそうちは レッド キー がひつようだ 이걸 작동하려면 적색 열쇠가 필요합니다 Potrzebujesz czerwonego klucza, aby aktywować ten przedmiot Você precisa de uma chave vermelha para ativar este objeto Для активации нужен красный ключ Треба вам црвени кључ да би активирали овај предмет
9 You need a yellow key to activate this object PD_YELLOWCO Potřebuješ žlutý klíč pro aktivaci tohoto objektu Du brauchst einen gelben Schlüssel, um dieses Objekt zu aktivieren. Necesitas una llave amarilla para activar este objeto Il vous faut une clé jaune pour activer cet objet. Egy sárga kulccsal aktiválható ez az objektum Ti serve una chiave gialla per attivare questo oggetto このそうちは イエローキー がひつようだ 이걸 작동하려면 황색 열쇠가 필요합니다 Potrzebujesz żółtego klucza, aby aktywować ten przedmiot Você precisa de uma chave amarela para ativar este objeto Для активации нужен жёлтый ключ Треба вам жути кључ да би активирали овај предмет
10 You need a blue flemkey to activate this object PD_BLUEFO Potřebuješ modrý slizoklíč pro aktivaci tohoto objektu. Du brauchst einen blauen Flemschlüssel, um dieses Objekt zu aktivieren. Necesitas una flemllave azul para activar este objeto Il vous faut une flemclé bleue pour activer cet objet. Ti serve una chiave-flem blu per attivare questo oggetto このそうちは ブルー キーがひつようだ 이걸 작동하려면 청색 플렘열쇠가 필요합니다 Potrzebujesz niebieskiego flemowego klucza, aby aktywować ten przedmiot Você precisa de uma flemchave azul para ativar este objeto Для активации нужен синий флемключ
11 You need a red flemkey to activate this object PD_REDFO Potřebuješ červený slizoklíč pro aktivaci tohoto objektu. Du brauchst einen roten Flemschlüssel, um dieses Objekt zu aktivieren. Necesitas una flemllave roja para activar este objeto Il vous faut une flemclé rouge pour activer cet objet. Ti serve una chiave-flem rossa per attivare questo oggetto このそうちは レッド キーがひつようだ 이걸 작동하려면 적색 플렘열쇠가 필요합니다 Potrzebujesz czerwonego flemowego klucza, aby aktywować ten przedmiot Você precisa de uma flemchave vermelha para ativar este objeto Для активации нужен красный флемключ
12 You need a yellow flemkey to activate this object PD_YELLOWFO Potřebuješ žlutý slizoklíč pro aktivaci tohoto objektu. Du brauchst einen gelben Flemschlüssel, um dieses Objekt zu aktivieren. Necesitas unaflemllave amarilla para activar este objeto Il vous faut une flemclé jaune pour activer cet objet. Ti serve una chiave-flem gialla per attivare questo oggetto このそうちは イエローキーがひつようだ 이걸 작동하려면 황색 플렘열쇠가 필요합니다 Potrzebujesz żółtego flemowego klucza, aby aktywować ten przedmiot Você precisa de uma flemchave amarela para ativar este objeto Для активации нужен жёлтый флемключ
13 Picked up a zorcher. PICKUP_PISTOL_DROPPED Sebrán bzukr. Zorcher genommen. Recogiste un zorcher. Zorcheur récupéré. Ho preso uno zorcher. ゾーカー をひろった 자쳐 습득. Podniesiono Zorcher Pegou um zorcher. Получен Зорчер.
14 Zorch and keys added STSTR_KFAADDED Bzukr a klíče přidány Zorch und Schlüssel hinzugefügt. Zorch y llaves añadidas Zorch et clés ajoutées. Zorch e chiavi aggiunte ゾーク と キーがとどいた 저치와 열쇠 Dodano amunicję Zorch i klucze Zorch e chaves adicionadas Зорч и ключи получены
15 E1M1: Landing Zone HUSTR_E1M1 E1M1: Přistávací zóna E1M1: Landezone E1M1: Zona de Aterrizaje E1M1: Zone D'Atterissage E1M1: Landoló Zóna E1M1: Zona di Atterraggio E1M1: ちゃくち ちてん E1M1: 착륙 지점 E1M1: Strefa Lądowania E1M1: Zona de Pouso E1M1: Зона высадки
16 E1M2: Storage Facility HUSTR_E1M2 E1M2: Skladiště E1M2: Lagerhalle E1M2: Instalación de Almacenamiento E1M2: Centre de Stockage E1M2: Struttura di Immagazzinamento E1M2: ちょぞう しせつ E1M2: 저장 시설 E1M2: Magazyn E1M2: Depósito E1M2: Хранилище
17 E1M3: Laboratory HUSTR_E1M3 E1M3: Testovací laboratoř E1M3: Labor E1M3: Laboratorio E1M3: Laboratoire E1M3: Laboratorio E1M3: ラボラトリー E1M3: 연구소 E1M3: Laboratorium Eksperymentalne E1M3: Laboratório de Experimentos E1M3: Лаборатория
18 E1M4: Arboretum HUSTR_E1M4 E1M4: Arboreto E1M4: Arboretum E1M4: Arboreto E1M4: じゅもく園 E1M4: 수목원 E1M4: Arboretum E1M4: Arvoredo E1M4: Дендрарий
19 E1M5: Caverns of Bazoik HUSTR_E1M5 E1M5: Bazoikské jeskyně E1M5: Die Höhlen von Bazoik E1M5: Cavernas de Bazoik E1M5: Cavernes de Bazoik E1M5: Caverne di Bazoik E1M5: バゾイクのどうくつ E1M5: 바조이크의 대동굴 E1M5: Jaskinie Bazoik E1M5: Cavernas de Bazoik E1M5: Пещеры Базоика
20 E2M1: Spaceport HUSTR_E2M1 E2M1: Kosmodrom E2M1: Raumhafen E2M1: Puerto Espacial E2M1: Spatioport E2M1: Spazioporto E2M1: スペースポート E2M1: 우주공항 E2M1: Port Kosmiczny E2M1: Espaçoporto E2M1: Космодром
21 E2M2: Cinema HUSTR_E2M2 E2M2: Kino E2M2: Kino E2M2: Cine E2M2: Cinéma E2M2: シネマ E2M2: 극장 E2M2: Kino E2M2: Cinema E2M2: Кинотеатр
22 E2M3: Chex Museum HUSTR_E2M3 E2M3: Muzem Chex E2M3: Museo de Chex E2M3: Musée Chex E2M3: Museo di Chex E2M3: チェックス ミュージアム E2M3: 첵스 박물관 E2M3: Muzeum Chex E2M3: Museu Chex E2M3: Музей Chex
23 E2M4: City Streets HUSTR_E2M4 E2M4: Městské ulice E2M4: städtische Straßen E2M4: Calles de la Ciudad E2M4: Rues de la Ville E2M4: Strade della città E2M4: シティーストリート E2M4: 도시 거리 E2M4: Ulice Miasta E2M4: Ruas da Cidade E2M4: Городские улицы
24 E2M5: Sewer System HUSTR_E2M5 E2M5: Kanalizace E2M5: Kanalisation E2M5: Alcantarillado E2M5: Système d'égouts E2M5: Rete fognaria E2M5: サワー システム E2M5: 하수도 E2M5: System Ścieków E2M5: Rede de Esgoto E2M5: Канализация
25 E3M1: Central Command HUSTR_E3M1 E3M1: Centrální velení E3M1: Kommandozentrale E3M1: Comando central E3M1: Commandement E3M1: Comando centrale E3M1: 中央 しれいとう E3M1: 중앙 사령부 E3M1: Centrum Dowodzenia E3M1: Comando Central E3M1: Командный центр
26 E3M2: United Cereals HUSTR_E3M2 E3M2: Spojené cereálie E3M2: Vereinigte Zerealien E3M2: Cereales unidos E3M2: Céréales Unies E3M2: Cereali uniti E3M2: ユナイテッド シリアル E3M2: 시리얼 연합 E3M2: Zjednoczone Płatki E3M2: Cereais Unidos E3M2: Организация Объединённых Хлопьев
27 E3M3: Villa Chex HUSTR_E3M3 E3M3: Villa Chex E3M3: チェックスのべっそう E3M3: 책스 주택 E3M3: Willa Chex E3M3: Villa Chex E3M3: Вилла Chex
28 E3M4: Provincial Park HUSTR_E3M4 E3M4: Provinciální park E3M4: Provinzpark E3M4: Parque provincial E3M4: Parc Naturel E3M4: Parco provinciale E3M4: 州立公園 E3M4: 주립공원 E3M4: Prowincjonalny Park E3M4: Parque Natural E3M4: Провинциальный парк
29 E3M5: Meteor Spaceship HUSTR_E3M5 E3M5: Meteorová vesmírná loď E3M5: Meteor-Raumschiff E3M5: Nave Meteoro E3M5: Vaisseau Météore E2M5: Astronave meteorica E3M5: メテオスペースシップ E3M5: 거대 유성호 E3M5: Statek Kosmiczny "Meteor" E3M5: Espaçonave Meteoro E3M5: Космический корабль “Метеор”
30 Commonus CC_ZOMBIE Obecnýs コモンズ 커머누스 Pospolitus Обыкновеннус
31 Bipedicus CC_SHOTGUN Dvojnožus バイピディクス 바이피디쿠스 Двуножка
32 Bipedicus with Armor CC_IMP Dvojnožus s brněním Bipedicus mit Panzerung Bipedicus con Armadura Bipedicus avec Armure Bipedicus corazzato アーマードバイピディクス 정예 바이피디쿠스 Opancerzony Bipedicus Bipedicus de Armadura Бронированная двуножка
33 Stridicus CC_DEMON Běhakus ステュリクス 스트리디쿠스 Длинноножка
34 Flem Mine CC_LOST Slizná mina Flem-Mina Mina di Flem Bomba a Flem フレムマイン 플렘 지뢰 Flemowa Mina Mina Flem Флем-мина
35 Super Cycloptis CC_CACO Superkykloptus スーパーサイクロプティス 슈퍼 사이클롭티스 Super Cykloptis Супер-циклоптис
36 Maximus CC_BARON マクシムス 맥시무스 Максимус
37 The Flembomination CC_SPIDER Slizavnost Die Flembomination La Flembominación La Flembomination La Flembominio フレンボミネーション 플렘보미네이션 Flembominacja A Flembominação Флемомерзость
38 Lord Snotfolus CC_CYBER Lord Hlenfujus Lord Mocofolus Seigneur Morvator ロード スノフォールス 스놋폴러스 마왕 Lord Smarkofolus Lorde Snotfolus Лорд Соплезелёнус
39 Chex Warrior CC_HERO Bojovník Chex Chex Krieger Guerrero Chex Guerrier Chex Guerriero Chex チェックスのせんし 첵스 전사 Wojownik Chex Воин Chex
40 You need a blue key to open this door PD_BLUEC Potřebuješ modrý klíč pro otevření těchto dveří Du brauchst einen blauen Schlüssel, um diese Tür zu öffnen. Necesitas una llave azul para abrir esta puerta Il vous faut une clé bleue pour ouvrir cette porte. Az ajtót a kék kulcs nyitja. Ti serve una chiave blu per aprire questa porta このとびらは ブルー キー がひつようだ 이 문을 열려면 청색 열쇠가 필요합니다 Potrzebujesz niebieskiego klucza, aby otworzyć te drzwi Você precisa de uma chave azul para abrir essa porta Нужен синий ключ, чтобы открыть Треба вам плави кључ да би отворили ова врата
41 You need a red key to open this door PD_REDC Potřebuješ červený klíč pro otevření těchto dveří Du brauchst einen roten Schlüssel, um diese Tür zu öffnen. Necesitas una llave roja para abrir esta puerta Il vous faut une clé rouge pour ouvrir cette porte. Piros kulcs szükséges, hogy az ajtót kinyithasd. Ti serve una chiave rossa per aprire questa porta このとびらは レッド キー がひつようだ 이 문을 열려면 적색 열쇠가 필요합니다 Potrzebujesz czerwonego klucza, aby otworzyć te drzwi Você precisa de uma chave vermelha para abrir essa porta Нужен красный ключ, чтобы открыть Треба вам црвени кључ да би отворили ова врата
42 You need a yellow key to open this door PD_YELLOWC Potřebuješ žlutý klíč pro otevření těchto dveří Du brauchst einen gelben Schlüssel, um diese Tür zu öffnen. Necesitas una llave amarilla para abrir esta puerta Il vous faut une clé jaune pour ouvrir cette porte. Kell egy sárga kulcs hogy kinyisd ezt az ajtót. Ti serve una chiave gialla per aprire questa porta このとびらは イエローキー がひつようだ 이 문을 열려면 황색 열쇠가 필요합니다 Potrzebujesz żółtego klucza, aby otworzyć te drzwi Você precisa de uma chave amarela para abrir essa porta Нужен жёлтый ключ, чтобы открыть Треба вам жути кључ да би отворили ова врата
43 You need a blue flemkey to open this door PD_BLUEF Potřebuješ modrý slizoklíč pro otevření těchto dveří Du brauchst einen blauen Flemschlüssel, um diese Tür zu öffnen. Necesitas una flemllave azul para abrir esta puerta Il vous faut une flemclé bleue pour ouvrir cette porte. Ti serve una chiave-flem blu per aprire questa porta このとびらは ブルー キーがひつようだ 이 문을 열려면 청색 플렘열쇠가 필요합니다 Potrzebujesz niebieskiego flemowego klucza, aby otworzyć te drzwi Você precisa de uma flemchave azul para ativar este objeto Нужен синий флемключ, чтобы открыть
44 You need a red flemkey to open this door PD_REDF Potřebuješ červený slizoklíč pro otevření těchto dveří Du brauchst einen roten Flemschlüssel, um diese Tür zu öffnen. Necesitas una flemllave roja para abrir esta puerta Il vous faut une flemclé rouge pour ouvrir cette porte. Ti serve una chiave-flem rossa per aprire questa porta このとびらは レッド キーがひつようだ 이 문을 열려면 적색 플렘열쇠가 필요합니다 Potrzebujesz czerwonego flemowego klucza, aby otworzyć te drzwi Você precisa de uma flemchave vermelha para ativar este objeto Нужен красный флемключ, чтобы открыть
45 You need a yellow flemkey to open this door PD_YELLOWF Potřebuješ žlutý slizoklíč pro otevření těchto dveří Du brauchst einen gelben Flemschlüssel, um diese Tür zu öffnen. Necesitas una flemllave amarilla para abrir esta puerta Il vous faut une flemclé jaune pour ouvrir cette porte. Ti serve una chiave-flem gialla per aprire questa porta このとびらは イエローキーがひつようだ 이 문을 열려면 황색 플렘열쇠가 필요합니다 Potrzebujesz żółtego flemowego klucza, aby otworzyć te drzwi Você precisa de uma flemchave amarela para ativar este objeto Нужен жёлтый флемключ, чтобы открыть
46 %o sinks into some slime. OB_SLIME %o se propadl@[ao_cs] do slizu. %o versank im Schleim %o se hunde en lodo. %o se noie dans la morve. %o affonda in qualche melma. %o はスライムにしずんだ。 %o 는(은) 점액 속으로 가라앉았습니다. %o topi się w szlamie. %o afundou na gosma. Игрок %o утонул в слизи.
47 %o sinks into some slime. OB_LAVA %o se propadl@[ao_cs] do slizu. %o versank im Schleim %o se hunde en lodo. %o se noie dans la morve. %o affonda in qualche melma. %o はスライムにしずんだ。 %o 는(은) 질척하게 가라앉았습니다. %o topi się w szlamie. %o afundou na gosma. Игрок %o утонул в слизи.
48 %o was hit by inter-dimensional slime! OB_POWERSTRAND %o byl@[ao_cs] zasažen@[ao_cs] mezidimenzionálním slizem! %o wurde von interdimensionalem Schleim getroffen ¡%o fue alcanzad@[ao_esp] por lodo interdimensional! %o s'est fait@[e_fr] toucher par de la morve interdimensionelle! %o è stato colpito da melma interdimensionale! %o は いじげんスライムまみれになった! %o 는(은) 차원균열 점액에 맞았습니다! %o został@[ao_pl] uderzon@[adj_pl] przez międzywymiarowy szlam! %o foi atingid@[ao_ptb] por gosma interdimensional! В игрока %o попала межпространственная слизь!
49 %o was hit by inter-dimensional slime! OB_KILLEDSELF %o byl@[ao_cs] zasažen@[ao_cs] mezidimenzionálním slizem! %o wurde von interdimensionalem Schleim getroffen ¡%o fue alcanzad@[ao_esp] por lodo interdimensional! %o s'est fait@[e_fr] toucher par de la morve interdimensionelle! %o è stato colpito da melma interdimensionale! %o は いじげんスライムまみれになった! %o 는(은) 모르는 사이에 점액에 당했습니다! %o został@[ao_pl] uderzon@[adj_pl] przez międzywymiarowy szlam! %o foi atingid@[ao_ptb] por gosma interdimensional! В игрока %o попала межпространственная слизь!
50 %o was boogered by a stridicus. OB_STRIDICUS %o dostal@[ao_cs] holuby od běhakem. %o wurde von einem Stridicus bepopelt. %o fue moquead@[ao_esp] por un stridicus. %o s'est fait@[e_fr] engluer par un stridicus. %o è stato colpito da uno Stridicus. %o は ステュリクスに おびやかされた。 %o 는(은) 스트리디쿠스의 코딱지에 당했습니다. %o został@[ao_pl] zaglutowan@[adj_pl] przez stridicusa. %o foi melecad@[ao_ptb] por um stridicus. Игрока %o облепила соплями длинноножка.
51 %o was gooed by a flem mine. OB_FLEMMINE %o byl@[ao_cs] zablácen@[ao_cs] sliznou minou. %o wurde von einer Flem-Mine beschmiert. %o fue pegotead@[ao_esp] por una flem-mina. %o s'est fait@[e_fr] éclabousser par une flem mine. %o è stata colpita da una bomba a flem. %o はフレムマインに ヒドいめにあった。 %o 는(은) 플렘 지뢰에 의해 점액 범벅이 됐습니다. %o został@[ao_pl] zabrejowan@[adj_pl] przez flemową minę. %o foi engosmad@[ao_ptb] por uma mina flem. Игрока %o забрызгала флем-мина.
52 %o was slimed by a super cycloptis. OB_SUPERCYCLOPTIS %o byl@[ao_cs] osliznut@[ao_cs] superkykloptem. %o wurde von einem Super Cycloptis vollgeschleimt. %o fue enlodad@[ao_esp] por un super cycloptis. %o s'est fait@[e_fr] gélifier par un super cycloptis. %o è stato snellito da una Super Ciyloptis. %o はスーパーサイクロプティスに とかされた。 %o 는(은) 슈퍼 사이클롭티스의 점액에 당했습니다. %o został@[ao_pl] oszlamion@[adj_pl] przez super cykloptisa. %o foi lambuzad@[ao_ptb] por um super cyclóptis. Игрока %o обслюнявил супер-циклоптис.
53 %o was defeated by a Maximus. OB_MAXIMUS %o byl@[ao_cs] poražen@[ao_cs] Maximem. %o wurde von einem Maximus besiegt. %o fue derrotad@[ao_esp] por un Maximus. %o s'est fait@[e_fr] battre par un Maximus. %o è stato sconfitto da un Maximus. %o はマクシムスに 敗北した。 %o 는(은) 맥시무스에게 패배했습니다. %o został@[ao_pl] pokonan@[adj_pl] przez Maximusa. %o foi derrotad@[ao_ptb] por um Maximus. Игрок %o проиграл Максимусу.
54 %o was gooed by a larva. OB_LARVA %o byl@[ao_cs] zacáknut@[ao_cs] larvou. %o wurde von einer Larve beschmiert. %o fue pegotead@[ao_esp] por una larva. %o s'est fait@[e_fr] tacher par une larve. %o è stato colpito da una larva. %o はラーバに ヒドいめにあわされた。 %o 는(은) 애벌레에 의해 점액 범벅이 됐습니다. %o został@[ao_pl] zabrejowan@[adj_pl] przez larwę. %o foi engosmad@[ao_ptb] por uma larva. Игрока %o обслюнявила личинка.
55 %o was slimed by a Quadrumpus. OB_QUADRUMPUS %o byl@[ao_cs] zahleněn@[ao_cs] Čtyřzadkem. %o wurde von einem Quadrumpus vollgeschleimt. %o fue enlodad@[ao_esp] por un Quadrumpus. %o s'est fait@[e_fr] morver par un quadrumpus. %o è stato ridotto da un Quadrumpus. %o はクワッドロンプスに スライムにされた。 %o 는(은) 쿼드럼푸스의 점액에 당했습니다. %o został@[ao_pl] oszlamion@[adj_pl] przez Quadrumpusa. %o foi melecad@[ao_ptb] por um Quadrumpus. Игрока %o обслюнявила многоручка.
56 %o was defeated by the Flembomination. OB_FLEMBOMINATION %o byl@[ao_cs] poražen@[ao_cs] Slizavností. %o wurde von der Flembomination besiegt. %o fue derrotad@[ao_esp] por la Flembominación. %o s'est fait@[e_fr] éliminer par la Flembomination. %o è stato sconfitto dalla Flembomination. %o はフレンボミネーションに敗北した。 %o 는(은) 플렘보미네이션으로부터 벗어날 수 없었습니다. %o został@[ao_pl] pokonan@[adj_pl] przez Flembominację. %o foi derrotad@[ao_ptb] pela Flembominação. Игрока %o победила Флемомерзость.
57 %o was defeated by Lord Snotfolus. OB_SNOTFOLUS %o byl@[ao_cs] poražen@[ao_cs] Lordem Hlenfujem. %o wurde von Lord Snotfolus besiegt. %o fue derrotad@[ao_esp] por Lord Mocofolus. %o est tombé@[e_fr] face au Seigneur Morvator. %o è stato sconfitto da Lord Snotfolus. %o はロード スノフォールスに敗北した。 %o 는(은) 스놋폴러스 마왕과 싸울 준비를 제대로 하지 못했습니다. %o został@[ao_pl] pokonan@[adj_pl] przez Lorda Smarkofolusa. %o foi derrotad@[ao_ptb] pelo Lorde Snotfolus. Игрока %o победил лорд Соплезелёнус.
58 %o was hit by %k's propulsor. OB_MPR_SPLASH %o byl@[ao_cs] zasažen@[ao_cs] propulzorem hráče %k. %o wurde von %ks Propeller getroffen %o fue alcanzad@[ao_esp] por el propulsor de %k. %o s'est fait@[e_fr] propulser par %k. %o è stato colpito dal propulsore di %k. %o に %k のロケットゾーカーがとどいた。 %o 는(은) %k 의 추진력에 휘말렸습니다. %o został@[ao_pl] uderzon@[adj_pl] przez pędnik %k. %o foi atingid@[ao_ptb] pelo propulsor de %k. Игрок %o подстрелен из Ускорителя Зорча %k.
59 %o was lazzed by %k. OB_MPBFG_SPLASH %o byl@[ao_cs] odlazován@[ao_cs] hráčem %k. %o wurde von %o weggezorcht. %o fue lazead@[ao_esp] por %k. %o est entré@[e_fr] dans la zone de zorchage large de %k. %o è stato lazzato da %k. %o は %k にとかされた。 %o 는(은) %k 에게 레이져를 쐬였습니다. %o został@[ao_pl] zLAZowan@[adj_pl] przez %k. %o foi LAZead@[ao_ptb] por %k. Игрок %o получил заряд из «ЗБР» игрока %k.
60 After sending the monstrous Flembrane back to his own dimension, you free the captives. Yet flemoids are everywhere! You and the captives make a break for your spaceship. The flemoids slime your ship, but you narrowly escape into orbit. During the return you are congratulated for the daring rescue, but you issue a warning... We haven't seen the last of the Flemoids. Unfortunately you are correct. For as you return home, you find that the Flemoids have somehow followed you here. Prepare for Chex Quest 2: Terror in Chex City! E1TEXT Poté, co jsi poslal@[ao_cs] nestvůrnou Slizbránu zpět do její dimenze, osvobodíš rukojmí. Ale sliznatci jsou všude! Spolu s rukojmími podniknete útěk zpět do tvé lodi. Sliznatci osliznou tvou loď, ale těsně se vám podaří uniknout na orbitu. Během návratu ti je pogratulováno za odvážnou záchranu, ale ty je varuješ... Ještě jsme neviděli Sliznatce naposledy. Bohužel máš pravdu. Při návratu domů vidíš, že tě nějakým způsobem sliznatci následovali. Připrav se na Misi Chex 2: Hrůzu v Chex City! Nachdem du die monströse Flembrane in ihre eigene Dimension zurückgeschickt hast, befreist du die Gefangenen. Und dennoch sind die Flemoiden überall! Du kämpfst dich mit den Gefangenen zu deinem Raumschiff durch und entkommst mit knapper Not. Du schickst eine Warnung ab, dass wir die Flemoiden noch nicht los sind. Unglückicherweise hast du Recht. Denn als du nach Hause kommst, erkennst du, dass dir die Flemoiden gefolgt sind. Bereite dich auf Chex Quest 2: Terror in Chex-City vor! Tras enviar a la monstruosa Flembrana de vuelta a su dimensión, liberas a los rehenes. ¡Pero los flemoides están por todas partes! Tú y los rehenes escapais hacia tu nave. Los flemoides cubren de lodo tu nave, pero escapas en órbita por los pelos. Durante el regreso eres felicitad@[ao_esp] por tu valiente rescate, pero mandas una advertencia... Queda por ver lo último de los Flemoides. Desafortunadamente tienes razón. Ya que al llegar de vuelta a casa, te das cuenta de que de alguna manera los Flemoides te han seguido hasta aquí. ¡Prepárate para Chex Quest 2: Terror en Chex City! Tras enviar a la monstruosa Flembrana de vuelta a su dimensión, liberas a los rehenes. ¡Pero los flemoides están por todas partes! Tú y los rehenes escapan hacia tu nave. Los flemoides cubren de lodo tu nave, pero escapas en órbita por un pelo. Durante el regreso eres felicitad@[ao_esp] por tu valiente rescate, pero mandas una advertencia... Queda por ver lo último de los Flemoides. Desafortunadamente tienes razón. Ya que al llegar de vuelta a casa, te das cuenta de que de alguna manera los Flemoides te han seguido hasta aquí. ¡Prepárate para Chex Quest 2: Terror en Chex City! Ayant renvoyé la terrible Flembrane dans sa dimension, vous libérez les prisonniers. Pourtant, les flémoïdes sont partout! Vous aidez les prisonniers à rejoindre votre vaisseau. Les flémoïdes s'agglutinent dessus, mais vous arrivez à vous mettre en orbite. Lors du retour, vous êtes félicité, mais vous avez un avertissement.. Ce n'est pas la fin de la menace flémoïde. Malheureusement, vous avez raison. Quand vous retournez sur votre planète, vous découvrez que les flémoïdes vous ont suivi jusqu'ici. Préparez vous pour Chex Quest 2: Terreur à Chex City! Dopo aver rispedito il mostruoso Flembrane nella sua dimensione, si liberano i prigionieri. Eppure i flemoidi sono ovunque! Tu e i prigionieri fare una pausa per la vostra astronave. I flemoidi melma la vostra nave, ma si fuggire di poco in orbita. Durante il ritorno ci si congratula per l'audace salvataggio, ma si emette un avvertimento... Non abbiamo visto l'ultimo dei Flemoidi. Purtroppo hai ragione. Infatti, al vostro ritorno a casa, vi accorgerete che le flotte vi hanno in qualche modo seguito qui. Preparatevi per Chex Quest 2: Terrore a Chex City! 巨大なフレムブレンを元の次元に送り ほりょを解放した。 けれども、フレモイドはまだまだいる! フレモイドは 君の宇宙船を スライムまみれにしたため、 君と ほりょは 船をこわし せまい道をたどって にげだした。 目的地に たどりついたとき、君の 大たんな救出の成功を いわった。しかし 君はけいかいしていた... さいごのフレモイドはどこにいったか。 ざんねんながら けいかいは 正しかった。 家に着くと、フレモイドが 君を探していた形跡が見つかった。 チェックス クエスト2 : チェックス シティーのきょうふ に そなえろ! 플렘브레인을 원래 차원으로 보내버린 뒤, 당신은 인질들을 풀어줬지만, 아직 플레모이드들이 사방에 있었습니다! 당신과 인질들은 당신의 우주선으로 도망갔습니다. 플레모이드들이 당신의 우주선에 공격을 가하지만, 아슬아슬하게 궤도 밖으로 탈출하는데 성공했습니다. 돌아오는 동안 당신의 용맹한 구출과 활약에 모두 축배를 들지만, 한 가지 걸리는 게 있으니... 바로 플레모이드들과 끝장을 보지 못했다는 것! 불행히도 그 예감은 맞았습니다. 집으로 돌아가는 와중, 플레모이드들이 당신을 추적해왔다는 걸 알게 됐는데... 다음 이야기는 "첵스 퀘스트 2 : 첵스 시티의 공포"에서 계속됩니다! Po wysłaniu Flembrany do jej własnego wymiaru, uwolniłeś jeńców. Ale flemoidy są wszędzie! Ty razem z jeńcami przebijacie się do statku kosmicznego. Flemoidy oszlamiły twój statek, ale ledwo uciekasz na orbitę. Podczas powrotu pogratulowano ci za brawurowy ratunek, ale zauważasz ostrzeżenie... To nie ostatni raz kiedy widzimy Flemoidy. Niestety masz rację. Jak wróciłeś do domu, zauważasz, że Flemoidy jakoś podążały za tobą. Przeygotuj się na Misja Chex 2: Terror w Mieście Chex! Após mandar a monstruosa Flembrana para sua dimensão, você libertou os prisioneiros! Você e os prisioneiros correm até a sua espaçonave. Os flemóides lambuzam a sua nave, mas por pouco você consegue escapar até a órbita. Ao retornar, você é parabenizado pelo seu ousado resgate, mas você também avisa... Ainda não terminamos de dar um fim à ameaça flemóide. Infelizmente, você está corret@[ao_ptb]. Pois ao retornar para casa, você descobre que os flemóides te seguiram até aqui de alguma forma. Prepare-se para o Chex Quest 2: Terror em Chexópolis! Изгнав чудовищную Флембрану назад в её измерение, ты освободил@[ao_rus] пленников. Флемоиды окружили вас со всех сторон! Вы с пленниками прорвались с боем к космическому кораблю. Флемоиды облепили ваш корабль, но вы спаслись и улетели на орбиту. По дороге домой, пленники поблагодарили тебя за освобождение, но ты предупредил@[ao_rus] их... Мы ещё встретимся с Флемоидами. К сожалению, ты оказал@[refl_rus] прав@[ao_rus]. Вернувшись домой, ты обнаружил@[ao_rus], что Флемоиды добрались и сюда. Тебя ждёт Chex Quest 2: Террор в Городе Chex!
61 You zorch the remaining flemoids who had gathered in the sewers. Chex City has been saved. It seems that the Flemoid threat has finally ended. Ten years pass in peace and prosperity. But the Flemoids were not defeated and their desire to control the nutritionally rich cereal dimension has not diminished. They have gathered all their forces, opened a gigantic inter-dimensional rift in space and now a great ball of slime is headed straight for the cereals' planet! Get ready for Chex Quest 3: Invasion! E2TEXT Vybzukl@[ao_cs] jsi poslední ze zbylých sliznatců, kteří se nahromadili ve stokách. Chex City je zachráněno. Zdá se, že hrozba sliznatců konečně skončila. Deset let uplyne v míru a prosperitě. Ale Sliznatci nebyli poraženi a jejich touha ovládnout nutričně bohatou dimenzi cereálií se nijak nezmenšila. Shromáždili veškeré své síly, otevřeli obrovskou mezidimenzionální vesmírnou trhlinu a nyní se na planetu cereálií řítí obrovská koule slizu! Připrav se na Misi Chex 3: Invazi! Du zorchst die verbleibenden Flemoiden, die sich noch in der Kanalisation aufhielten, weg. Chex City ist gerettet. Es sieht aus, als ob die Flemoidenbedrohung beendet ist. Zehn Jahre vergehen in Frieden und Wohlstand. Aber die Flemoiden waren nicht besiegt und ihr Verlangen, die Zerealiendimension zu kontollieren, hat nicht abgenommen. Sie haben all ihre Truppen zusammengezogen und ein gigantisches interdimensionales Portal erschaffen, und nun macht sich ein gigantischer Ball intergalaktischen Schleims auf den Weg zum Zerealien- planeten. Mach dich bereit für Chex Quest 3: Invasion! Electrizas a los flemoides restantes que estaban reunidos en las alcantarillas. Chex City ha sido salvada. Parece que la amenaza Flemoide al fin ha acabado. Diez años pasan en paz y prosperidad. Pero los flemoides no fueron derrotados y su deseo de controlar la dimensión de cereales ricos en nutrientes no ha disminuido. ¡Han reunido todas sus fuerzas, abierto un gigantesco túnel interdimensional en el espacio y ahora una gran bola de lodo se dirige derecha al planeta de los cereales! Prepárate para Chex Quest 3: ¡Invasión! Vous zorchez les derniers flémoïdes restant dans les égouts. Chex City est sauvée. Il semble que la menace flémoïde n'existe plus. Dix ans se déroulent dans la paix et la prospérité, mais les flémoïdes ne se sont pas laissé battre, et veulent contrôler la dimension des céréales, riche en nutriments. Ils on regroupé leur forces et ont ouvert un portail inter-dimensionnel colossal, et maintenant, une sphère de morve géante se dirige vers la planète des céréales! Préparez vous pour Chex Quest 3: Invasion! Hai zorch il restante flemoidi che si erano riuniti nelle fogne. Chex City è stata salvata. Sembra che la minaccia Flemoid è finalmente finita. Dieci anni passano in pace e prosperità. Ma i Flemoid non sono stati sconfitti e il loro desiderio di controllare la dimensione ricca di nutrienti cereali non è diminuito. Hanno raccolto tutte le loro forze, hanno aperto una gigantesca spaccatura interdimensionale nello spazio e ora una grande palla di melma è diretta direttamente verso il pianeta dei cereali! Preparati per Chex Quest 3: Invasione! 君は 下水道に集まっていたフレモイドを ぶっとばして、チェックス シティーを守った。 フレモイドの きょういはようやく なくなったようだ。 平和と はんえいの中で10年がたった。 しかしフレモイドは敗北しておらず、えいようのある シリアルを せいふくするという野望は のこっていた。 かれらは全ての力を集め、宇宙に巨大な次元のさけめを 開いた。そして今や大きなボールオブスライムが シリアルプラネットに真っ直ぐ向かっている! チェックスクエスト3 : インベーション の じゅんびだ! 당신은 하수구에 모인 잔존 플레모이드들을 처리하는 데 성공했습니다. 이제 책스 시티는 안전합니다. 플레모이드들의 위협도 이로써 막을 내린 것 같습니다. 평화와 번창 속에서 10년이라는 세월이 흘렀지만, 사실 플레모이드들 전부가 패배한 것이 아니었고, 그들의 영양가 풍부한 시리얼 행성을 지배하려는 야망은 아직 사그라지지 않았던 것이었습니다! 그들은 병력을 모아, 우주에 거대한 차원균열 관문을 열었고, 그들의 거대한 녹색 점액 덩어리가 시리얼 행성을 향하고 있는데! 다음 이야기는 "첵스 퀘스트 3: 대침공"에서 이어집니다! Zorchujesz pozostałe flemoidy, które zebrały się w ściekach. Miasto Chex zostało uratowane. Wygląda na to, że zagrożenie flemoidami zostało zakończone. Dziesięć lat mija w spokoju i dobrobycie. Ale Flemoidy nie zostały pokonane, a ich chęć kontrolowania wymiaru z bogatym odżywianiem nie osłabła. Zebrały wszystkie swoje siły, otworzyły wielką szczelinę międzywymiarową w kosmosie i teraz wielka kula szlamu leci prosto na planetę płatków! Przygotuj się na Misja Chex 3: Inwazja! Você zorcha os flemóides que restaram nos esgotos. Chexópolis foi salva. Parece que a ameaça flemóide finalmente acabou. Dez anos se passaram com paz e propseridade. Mas os flemóides não foram derrotados e seu desejo para controlar a dimensão dos cereias ricos em nutrientes não diminuiu. Eles juntaram todas as suas forças, abriram uma grande fenda interdimensional no espaço e agora uma bola gigante de gosma está vindo direto para o planeta dos cereais! Se prepare para o Chex Quest 3: A Invasão! С помощью Зорчера, ты освободил@[ao_rus] канализацию от оставшихся флемоидов. Город Chex спасён. Казалось, что с угрозой Флемоидов наконец-то покончено. Десять лет прошли в мире и процветании. Но Флемоиды не были побеждены, им всё ещё хотелось править измерением полезных и питательных хлопьев. Они собрали все силы и открыли громадный межпространственный разлом в космосе. Над планетой хлопьев навис огромный шар из слизи! Приготовься к Chex Quest 3: Вторжение!
62 With one final blast, you zorch Lord Snotfolus back to his own dimension! Against all the odds you have single- handedly foiled the invasion! You truly hope that the Flemoids have finally learned their lesson and will never again return to the cereal dimension. But if they do you know you will be ready for them! E3TEXT S posledním výstřelem jsi vybzukl@[ao_cs] lorda Hlenfuje zpět do jeho dimenze! Navzdory všemu jsi vlastnoručně zhatil@[ao_cs] celou invazi! Opravdu doufáš, že Sliznatci dostali za vyučenou a už se nikdy nepokusí vrátit do dimenze cereálií. Ale jestli se o to pokusí, víš, že na ně budeš připraven@[adj_cs]! Mit einem letzten Schuss zorchst du Lord Snotfolus zurück in seine eigene Dimension! Gegen alle Widerstände hast du eigenhändiig die Invasion scheitern lassen! Du hoffst wirklich, dass die Flemoiden ihre Lektion gelernt haben und nie wieder in die Zerealiendimension zurückkehren. Aber falls sie das doch tun, wirst du bereit sein! ¡Con un último disparo, electrizas a Lord Mocofolus de vuelta a su dimensión! ¡Contra viento y marea tú sol@[ao_esp] has detenido la invasión! Realmente esperas que los Flemoides por fin hayan aprendido su lección y nunca más vuelvan a la dimension de cereales. ¡Pero si lo hacen sabes que estarás preparad@[ao_esp] para ellos! Avec un dernier tir, vous zorchez Seigneur Morvator dans sa propre dimension! Contre toute attente, vous avez surmonté l'invasion de par vos propres moyens. Vous espérez sincèrement que les flémoïdes ont appris leur leçon et qu'il n'essaieront jamais de revenir envahir la dimension des céréales. Mais vous savez que vous serez prêt pour eux! Con un ultimo colpo, hai zorch Lord Snotfolus torna alla sua dimensione! contro tutte le probabilità che hai sventato l'invasione con una sola mano! Speri davvero che i flemoidi hanno finalmente imparato la lezione e non torneranno mai più alla dimensione dei cereali. Ma se lo sai che sarai pronto per loro! さいごのいちげきで、ロード スノフォールスを元の次元に もどした。君一人で全てのオーズのしゅうげきを 阻止した! 君は フレモイド達のことを みんなに教え、再び シリアル ディメンジョンに ぎゃくしゅうをしかけて こないよう ねがった。 しかし、そんな考えを持っていたとしても 君にはかなわないと思い知るだろう! 최후의 한방으로, 당신은 스놋폴러스 마왕을 원래 세계로 추방했습니다! 그 모든 역경 속에서 당신은 손쉽게 모든 침공을 막아냈습니다! 당신은 드디어 플레모이드들이 정신을 차리고 다신 시리얼 차원에 발을 들일 생각조차 안 하기를 바랐습니다. 뭐, 다시 온다 해도 당신은 항상 대비하고 있을 테지만! Z ostatnim strzałem zorchujesz Lorda Smarkofolusa z powrotem do jego wymaru! Po wszystkim udało ci się w pojedynkę powstrzymać inwazję! Masz nadzieję, że Flemoidy w końcu się nauczyły i nigdy nie wrócą do wymiaru płatków. Ale jeśli jednak to zrobią, wiesz, że będziesz na nie gotów! Com mais uma última explosão, você zorcha o Lorde Snotfolus de volta para sua dimensão! Contra todas as probabilidades você impediu sozinh@[ao_ptb] a invasão! Você torce que os flemóides finalmente tenham aprendido a lição e que eles nunca mais voltarão para a dimensão dos cereais. Mas se voltarem, você sabe que você estará preparad@[ao_ptb]! Последним метким выстрелом из Зорчера, лорд Снотфолус был изгнан в назад своё измерение. Всем бедам вопреки, ты собственноручно покончил@[ao_rus] со вторжением! Остаётся лишь надеяться, что теперь флемоиды усвоят урок, и больше никогда не проникнут в измерение Хлопьев. Но если всё-таки проникнут, ты уже будешь к этому готов@[ao_rus]!
63 Rescue on Bazoik M_EPI1 Záchrana na Bazoiku Rettung auf Bazoik Rescate en Bazoik Sauvetage sur Bazoik Salvataggio su Bazoik バゾイクからのきゅうしゅつ 바조이크의 대동굴 Ratunek na Bazoik Resgate em Bazoik Спасение на Базоике
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
514
515
516
517
518
519

Some files were not shown because too many files have changed in this diff Show more