mirror of
https://github.com/ZDoom/qzdoom.git
synced 2025-03-14 06:42:09 +00:00
Merge branch 'master' of https://github.com/coelckers/gzdoom
This commit is contained in:
commit
b813cba1bc
114 changed files with 9777 additions and 4832 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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()
|
||||
);
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 );
|
||||
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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. ---*/
|
||||
{
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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__
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 ¤tProperties : 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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
127
src/rendering/vulkan/renderer/vk_streambuffer.cpp
Normal file
127
src/rendering/vulkan/renderer/vk_streambuffer.cpp
Normal 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();
|
||||
}
|
58
src/rendering/vulkan/renderer/vk_streambuffer.h
Normal file
58
src/rendering/vulkan/renderer/vk_streambuffer.h
Normal 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;
|
||||
};
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
1
src/rendering/vulkan/thirdparty/volk/volk.c
vendored
1
src/rendering/vulkan/thirdparty/volk/volk.c
vendored
|
@ -4,6 +4,7 @@
|
|||
|
||||
#ifdef __APPLE__
|
||||
#define VK_USE_PLATFORM_MACOS_MVK
|
||||
#define VK_USE_PLATFORM_METAL_EXT
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
19
src/rendering/vulkan/thirdparty/vulkan/vulkan.h
vendored
19
src/rendering/vulkan/thirdparty/vulkan/vulkan.h
vendored
|
@ -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_
|
||||
|
|
121
src/rendering/vulkan/thirdparty/vulkan/vulkan_android.h
vendored
Normal file
121
src/rendering/vulkan/thirdparty/vulkan/vulkan_android.h
vendored
Normal 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
|
2387
src/rendering/vulkan/thirdparty/vulkan/vulkan_core.h
vendored
2387
src/rendering/vulkan/thirdparty/vulkan/vulkan_core.h
vendored
File diff suppressed because it is too large
Load diff
56
src/rendering/vulkan/thirdparty/vulkan/vulkan_fuchsia.h
vendored
Normal file
56
src/rendering/vulkan/thirdparty/vulkan/vulkan_fuchsia.h
vendored
Normal 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
|
67
src/rendering/vulkan/thirdparty/vulkan/vulkan_ggp.h
vendored
Normal file
67
src/rendering/vulkan/thirdparty/vulkan/vulkan_ggp.h
vendored
Normal 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
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
63
src/rendering/vulkan/thirdparty/vulkan/vulkan_metal.h
vendored
Normal file
63
src/rendering/vulkan/thirdparty/vulkan/vulkan_metal.h
vendored
Normal 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
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -109,6 +109,7 @@ struct FISoundChannel
|
|||
float DistanceScale;
|
||||
float DistanceSqr;
|
||||
bool ManualRolloff;
|
||||
int ChanFlags;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
@ -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)"
|
||||
}
|
||||
|
||||
/*=======================================
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 ();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
|
||||
|
|
|
@ -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 ()
|
||||
|
|
|
@ -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!,,,Вторжение!,
|
|
BIN
wadsrc_extra/static/filter/game-chex/fonts/bigfont/0402.lmp
Normal file
BIN
wadsrc_extra/static/filter/game-chex/fonts/bigfont/0402.lmp
Normal file
Binary file not shown.
BIN
wadsrc_extra/static/filter/game-chex/fonts/bigfont/0409.lmp
Normal file
BIN
wadsrc_extra/static/filter/game-chex/fonts/bigfont/0409.lmp
Normal file
Binary file not shown.
BIN
wadsrc_extra/static/filter/game-chex/fonts/bigfont/040A.lmp
Normal file
BIN
wadsrc_extra/static/filter/game-chex/fonts/bigfont/040A.lmp
Normal file
Binary file not shown.
BIN
wadsrc_extra/static/filter/game-chex/fonts/bigfont/040B.lmp
Normal file
BIN
wadsrc_extra/static/filter/game-chex/fonts/bigfont/040B.lmp
Normal file
Binary file not shown.
BIN
wadsrc_extra/static/filter/game-chex/fonts/bigfont/040F.lmp
Normal file
BIN
wadsrc_extra/static/filter/game-chex/fonts/bigfont/040F.lmp
Normal file
Binary file not shown.
BIN
wadsrc_extra/static/filter/game-strife/fonts/bigfont/0402.lmp
Normal file
BIN
wadsrc_extra/static/filter/game-strife/fonts/bigfont/0402.lmp
Normal file
Binary file not shown.
BIN
wadsrc_extra/static/filter/game-strife/fonts/bigfont/0409.lmp
Normal file
BIN
wadsrc_extra/static/filter/game-strife/fonts/bigfont/0409.lmp
Normal file
Binary file not shown.
BIN
wadsrc_extra/static/filter/game-strife/fonts/bigfont/040A.lmp
Normal file
BIN
wadsrc_extra/static/filter/game-strife/fonts/bigfont/040A.lmp
Normal file
Binary file not shown.
BIN
wadsrc_extra/static/filter/game-strife/fonts/bigfont/040B.lmp
Normal file
BIN
wadsrc_extra/static/filter/game-strife/fonts/bigfont/040B.lmp
Normal file
Binary file not shown.
BIN
wadsrc_extra/static/filter/game-strife/fonts/bigfont/040F.lmp
Normal file
BIN
wadsrc_extra/static/filter/game-strife/fonts/bigfont/040F.lmp
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
wadsrc_extra/static/filter/hacx.hacx1/fonts/bigfont/0402.lmp
Normal file
BIN
wadsrc_extra/static/filter/hacx.hacx1/fonts/bigfont/0402.lmp
Normal file
Binary file not shown.
BIN
wadsrc_extra/static/filter/hacx.hacx1/fonts/bigfont/0409.lmp
Normal file
BIN
wadsrc_extra/static/filter/hacx.hacx1/fonts/bigfont/0409.lmp
Normal file
Binary file not shown.
BIN
wadsrc_extra/static/filter/hacx.hacx1/fonts/bigfont/040A.lmp
Normal file
BIN
wadsrc_extra/static/filter/hacx.hacx1/fonts/bigfont/040A.lmp
Normal file
Binary file not shown.
BIN
wadsrc_extra/static/filter/hacx.hacx1/fonts/bigfont/040B.lmp
Normal file
BIN
wadsrc_extra/static/filter/hacx.hacx1/fonts/bigfont/040B.lmp
Normal file
Binary file not shown.
BIN
wadsrc_extra/static/filter/hacx.hacx1/fonts/bigfont/040F.lmp
Normal file
BIN
wadsrc_extra/static/filter/hacx.hacx1/fonts/bigfont/040F.lmp
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue