From 941d89042a4b53b9efe7b540452d61fca843f9a7 Mon Sep 17 00:00:00 2001 From: Jonathan Russell Date: Thu, 3 Aug 2017 01:20:55 +0100 Subject: [PATCH 001/110] - externalise DCanvas::DrawLine to ZScript --- src/v_draw.cpp | 14 ++++++++++++++ wadsrc/static/zscript/base.txt | 1 + 2 files changed, 15 insertions(+) diff --git a/src/v_draw.cpp b/src/v_draw.cpp index 2377e8f7d4..9b78c5054d 100644 --- a/src/v_draw.cpp +++ b/src/v_draw.cpp @@ -958,6 +958,20 @@ void DCanvas::DrawLine(int x0, int y0, int x1, int y1, int palColor, uint32_t re #endif } +DEFINE_ACTION_FUNCTION(_Screen, DrawLine) +{ + PARAM_PROLOGUE; + PARAM_INT(x0); + PARAM_INT(y0); + PARAM_INT(x1); + PARAM_INT(y1); + PARAM_INT(color); + PARAM_INT_DEF(palcol); + if (!screen->HasBegun2D()) ThrowAbortException(X_OTHER, "Attempt to draw to screen outside a draw function"); + screen->DrawLine(x0, y0, x1, y1, palcol, color); + return 0; +} + void DCanvas::DrawPixel(int x, int y, int palColor, uint32_t realcolor) { #ifndef NO_SWRENDER diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index b2fd9c6c8f..f8c7134534 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -167,6 +167,7 @@ struct Screen native native static vararg void DrawTexture(TextureID tex, bool animate, double x, double y, ...); native static vararg void DrawChar(Font font, int normalcolor, double x, double y, int character, ...); native static vararg void DrawText(Font font, int normalcolor, double x, double y, String text, ...); + native static void DrawLine(int x0, int y0, int x1, int y1, Color color, int palcolor = -1); native static void DrawFrame(int x, int y, int w, int h); native static Vector2, Vector2 VirtualToRealCoords(Vector2 pos, Vector2 size, Vector2 vsize, bool vbottom=false, bool handleaspect=true); native static double GetAspectRatio(); From 03640a16ea4a172a51a33475e879d419b58ddb2a Mon Sep 17 00:00:00 2001 From: Jonathan Russell Date: Thu, 3 Aug 2017 02:09:48 +0100 Subject: [PATCH 002/110] - removed ZScript DrawLine palcolor arg --- src/v_draw.cpp | 3 +-- wadsrc/static/zscript/base.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/v_draw.cpp b/src/v_draw.cpp index 9b78c5054d..accded5576 100644 --- a/src/v_draw.cpp +++ b/src/v_draw.cpp @@ -966,9 +966,8 @@ DEFINE_ACTION_FUNCTION(_Screen, DrawLine) PARAM_INT(x1); PARAM_INT(y1); PARAM_INT(color); - PARAM_INT_DEF(palcol); if (!screen->HasBegun2D()) ThrowAbortException(X_OTHER, "Attempt to draw to screen outside a draw function"); - screen->DrawLine(x0, y0, x1, y1, palcol, color); + screen->DrawLine(x0, y0, x1, y1, -1, color); return 0; } diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index f8c7134534..9c21916c55 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -167,7 +167,7 @@ struct Screen native native static vararg void DrawTexture(TextureID tex, bool animate, double x, double y, ...); native static vararg void DrawChar(Font font, int normalcolor, double x, double y, int character, ...); native static vararg void DrawText(Font font, int normalcolor, double x, double y, String text, ...); - native static void DrawLine(int x0, int y0, int x1, int y1, Color color, int palcolor = -1); + native static void DrawLine(int x0, int y0, int x1, int y1, Color color); native static void DrawFrame(int x, int y, int w, int h); native static Vector2, Vector2 VirtualToRealCoords(Vector2 pos, Vector2 size, Vector2 vsize, bool vbottom=false, bool handleaspect=true); native static double GetAspectRatio(); From 505c99b0a8b27c2c0388e98189c0d77ab813f07e Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Mon, 4 Dec 2017 17:39:44 -0500 Subject: [PATCH 003/110] - fixed: doublize more internal structures, even if they still get converted to float later --- src/gl/models/gl_models.cpp | 2 +- src/gl/renderer/gl_renderstate.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gl/models/gl_models.cpp b/src/gl/models/gl_models.cpp index 0d3754b7f4..f6ee0e9367 100644 --- a/src/gl/models/gl_models.cpp +++ b/src/gl/models/gl_models.cpp @@ -157,7 +157,7 @@ void FGLModelRenderer::DrawElements(int numIndices, size_t offset) double FGLModelRenderer::GetTimeFloat() { - return (float)I_msTime() * (float)TICRATE / 1000.0f; + return (double)I_msTime() * (double)TICRATE / 1000.; } //=========================================================================== diff --git a/src/gl/renderer/gl_renderstate.cpp b/src/gl/renderer/gl_renderstate.cpp index 6dd78d5938..2405aff095 100644 --- a/src/gl/renderer/gl_renderstate.cpp +++ b/src/gl/renderer/gl_renderstate.cpp @@ -173,7 +173,7 @@ bool FRenderState::ApplyShader() activeShader->muInterpolationFactor.Set(mInterpolationFactor); activeShader->muClipHeight.Set(mClipHeight); activeShader->muClipHeightDirection.Set(mClipHeightDirection); - activeShader->muTimer.Set((double)(screen->FrameTime - firstFrame) * mShaderTimer / 1000.f); + activeShader->muTimer.Set((double)(screen->FrameTime - firstFrame) * (double)mShaderTimer / 1000.); activeShader->muAlphaThreshold.Set(mAlphaThreshold); activeShader->muLightIndex.Set(mLightIndex); // will always be -1 for now activeShader->muClipSplit.Set(mClipSplit); From 5162e7162e5c7d520af5c0a551445e9d44bafb3f Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Wed, 6 Dec 2017 10:59:20 +0200 Subject: [PATCH 004/110] Fixed overbright screenshots with hardware gamma off When render buffers are used to apply gamma/brightness/contrast screenshots should not use PNG gamma correction --- src/gl/scene/gl_scene.cpp | 2 +- src/gl/system/gl_framebuffer.cpp | 6 +++++- src/gl/system/gl_framebuffer.h | 2 +- src/gl/system/gl_swframebuffer.cpp | 7 ++++--- src/gl/system/gl_swframebuffer.h | 2 +- src/m_misc.cpp | 9 +++++---- src/m_png.cpp | 4 ++-- src/m_png.h | 2 +- src/swrenderer/r_swrenderer.cpp | 4 ++-- src/v_video.cpp | 3 ++- src/v_video.h | 2 +- src/win32/fb_d3d9.cpp | 5 +++-- src/win32/win32swiface.h | 2 +- 13 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/gl/scene/gl_scene.cpp b/src/gl/scene/gl_scene.cpp index af03af86e1..bbead77371 100644 --- a/src/gl/scene/gl_scene.cpp +++ b/src/gl/scene/gl_scene.cpp @@ -969,7 +969,7 @@ void GLSceneDrawer::WriteSavePic (player_t *player, FileWriter *file, int width, uint8_t * scr = (uint8_t *)M_Malloc(width * height * 3); glReadPixels(0,0,width, height,GL_RGB,GL_UNSIGNED_BYTE,scr); - M_CreatePNG (file, scr + ((height-1) * width * 3), NULL, SS_RGB, width, height, -width*3); + M_CreatePNG (file, scr + ((height-1) * width * 3), NULL, SS_RGB, width, height, -width * 3, Gamma); M_Free(scr); } diff --git a/src/gl/system/gl_framebuffer.cpp b/src/gl/system/gl_framebuffer.cpp index b10b8b418d..7425271bed 100644 --- a/src/gl/system/gl_framebuffer.cpp +++ b/src/gl/system/gl_framebuffer.cpp @@ -487,7 +487,7 @@ void OpenGLFrameBuffer::FillSimplePoly(FTexture *texture, FVector2 *points, int // //=========================================================================== -void OpenGLFrameBuffer::GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &color_type) +void OpenGLFrameBuffer::GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &color_type, float &gamma) { const auto &viewport = GLRenderer->mOutputLetterbox; @@ -527,6 +527,10 @@ void OpenGLFrameBuffer::GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, pitch = -w*3; color_type = SS_RGB; buffer = ScreenshotBuffer + w * 3 * (h - 1); + + // Screenshot should not use gamma correction if it was already applied to rendered image + EXTERN_CVAR(Bool, fullscreen); + gamma = 1 == vid_hwgamma || (2 == vid_hwgamma && !fullscreen) ? 1.0f : Gamma; } //=========================================================================== diff --git a/src/gl/system/gl_framebuffer.h b/src/gl/system/gl_framebuffer.h index 1d85562b35..0c7c922aaa 100644 --- a/src/gl/system/gl_framebuffer.h +++ b/src/gl/system/gl_framebuffer.h @@ -51,7 +51,7 @@ public: // Retrieves a buffer containing image data for a screenshot. // Hint: Pitch can be negative for upside-down images, in which case buffer // points to the last row in the buffer, which will be the first row output. - virtual void GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &color_type); + virtual void GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &color_type, float &gamma) override; // Releases the screenshot buffer. virtual void ReleaseScreenshotBuffer(); diff --git a/src/gl/system/gl_swframebuffer.cpp b/src/gl/system/gl_swframebuffer.cpp index 85bddf8c64..4ea5bfc0b4 100644 --- a/src/gl/system/gl_swframebuffer.cpp +++ b/src/gl/system/gl_swframebuffer.cpp @@ -1671,15 +1671,15 @@ void OpenGLSWFrameBuffer::SetBlendingRect(int x1, int y1, int x2, int y2) // //========================================================================== -void OpenGLSWFrameBuffer::GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &color_type) +void OpenGLSWFrameBuffer::GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &color_type, float &gamma) { - Super::GetScreenshotBuffer(buffer, pitch, color_type); + Super::GetScreenshotBuffer(buffer, pitch, color_type, gamma); /* LockedRect lrect; if (!Accel2D) { - Super::GetScreenshotBuffer(buffer, pitch, color_type); + Super::GetScreenshotBuffer(buffer, pitch, color_type, gamma); return; } buffer = nullptr; @@ -1702,6 +1702,7 @@ void OpenGLSWFrameBuffer::GetScreenshotBuffer(const uint8_t *&buffer, int &pitch buffer = (const uint8_t *)lrect.pBits; pitch = lrect.Pitch; color_type = SS_BGRA; + gamma = Gamma; } } */ diff --git a/src/gl/system/gl_swframebuffer.h b/src/gl/system/gl_swframebuffer.h index e29ff40baa..8c45b17af6 100644 --- a/src/gl/system/gl_swframebuffer.h +++ b/src/gl/system/gl_swframebuffer.h @@ -44,7 +44,7 @@ public: int GetPageCount() override; void SetVSync(bool vsync) override; void NewRefreshRate() override; - void GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &color_type) override; + void GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &color_type, float &gamma) override; void ReleaseScreenshotBuffer() override; void SetBlendingRect(int x1, int y1, int x2, int y2) override; bool Begin2D(bool copy3d) override; diff --git a/src/m_misc.cpp b/src/m_misc.cpp index c2fa021f6d..8fcaf9e0cd 100644 --- a/src/m_misc.cpp +++ b/src/m_misc.cpp @@ -521,11 +521,11 @@ void WritePCXfile (FileWriter *file, const uint8_t *buffer, const PalEntry *pale // WritePNGfile // void WritePNGfile (FileWriter *file, const uint8_t *buffer, const PalEntry *palette, - ESSType color_type, int width, int height, int pitch) + ESSType color_type, int width, int height, int pitch, float gamma) { char software[100]; mysnprintf(software, countof(software), GAMENAME " %s", GetVersionString()); - if (!M_CreatePNG (file, buffer, palette, color_type, width, height, pitch) || + if (!M_CreatePNG (file, buffer, palette, color_type, width, height, pitch, gamma) || !M_AppendPNGText (file, "Software", software) || !M_FinishPNG (file)) { @@ -626,8 +626,9 @@ void M_ScreenShot (const char *filename) const uint8_t *buffer; int pitch; ESSType color_type; + float gamma; - screen->GetScreenshotBuffer(buffer, pitch, color_type); + screen->GetScreenshotBuffer(buffer, pitch, color_type, gamma); if (buffer != NULL) { PalEntry palette[256]; @@ -651,7 +652,7 @@ void M_ScreenShot (const char *filename) else { WritePNGfile(file, buffer, palette, color_type, - screen->GetWidth(), screen->GetHeight(), pitch); + screen->GetWidth(), screen->GetHeight(), pitch, gamma); } delete file; screen->ReleaseScreenshotBuffer(); diff --git a/src/m_png.cpp b/src/m_png.cpp index 08cac8d543..a7f82ed8f4 100644 --- a/src/m_png.cpp +++ b/src/m_png.cpp @@ -132,7 +132,7 @@ CVAR(Float, png_gamma, 0.f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) //========================================================================== bool M_CreatePNG (FileWriter *file, const uint8_t *buffer, const PalEntry *palette, - ESSType color_type, int width, int height, int pitch) + ESSType color_type, int width, int height, int pitch, float gamma) { uint8_t work[8 + // signature 12+2*4+5 + // IHDR @@ -157,7 +157,7 @@ bool M_CreatePNG (FileWriter *file, const uint8_t *buffer, const PalEntry *palet MakeChunk (ihdr, MAKE_ID('I','H','D','R'), 2*4+5); // Assume a display exponent of 2.2 (100000/2.2 ~= 45454.5) - *gama = BigLong (int (45454.5f * (png_gamma == 0.f ? Gamma : png_gamma))); + *gama = BigLong (int (45454.5f * (png_gamma == 0.f ? gamma : png_gamma))); MakeChunk (gama, MAKE_ID('g','A','M','A'), 4); if (color_type == SS_PAL) diff --git a/src/m_png.h b/src/m_png.h index 4182440fb9..7bc9b474f0 100644 --- a/src/m_png.h +++ b/src/m_png.h @@ -46,7 +46,7 @@ class FileWriter; // This function writes the PNG signature and the IHDR, gAMA, PLTE, and IDAT // chunks. bool M_CreatePNG (FileWriter *file, const uint8_t *buffer, const PalEntry *pal, - ESSType color_type, int width, int height, int pitch); + ESSType color_type, int width, int height, int pitch, float gamma); // Creates a grayscale 1x1 PNG file. Used for savegames without savepics. bool M_CreateDummyPNG (FileWriter *file); diff --git a/src/swrenderer/r_swrenderer.cpp b/src/swrenderer/r_swrenderer.cpp index 19bf055a63..3c18e62188 100644 --- a/src/swrenderer/r_swrenderer.cpp +++ b/src/swrenderer/r_swrenderer.cpp @@ -225,7 +225,7 @@ void FSoftwareRenderer::WriteSavePic (player_t *player, FileWriter *file, int wi r_viewwindow = mScene.MainThread()->Viewport->viewwindow; } screen->GetFlashedPalette (palette); - M_CreatePNG (file, pic->GetBuffer(), palette, SS_PAL, width, height, pic->GetPitch()); + M_CreatePNG (file, pic->GetBuffer(), palette, SS_PAL, width, height, pic->GetPitch(), Gamma); pic->Unlock (); delete pic; } @@ -399,4 +399,4 @@ uint32_t FSoftwareRenderer::GetCaps() FlagSet |= RFF_COLORMAP; return (uint32_t)FlagSet; -} \ No newline at end of file +} diff --git a/src/v_video.cpp b/src/v_video.cpp index 814dc46150..ca2e8b62ae 100644 --- a/src/v_video.cpp +++ b/src/v_video.cpp @@ -329,12 +329,13 @@ void DCanvas::Dim (PalEntry color) // //========================================================================== -void DCanvas::GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &color_type) +void DCanvas::GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &color_type, float &gamma) { Lock(true); buffer = GetBuffer(); pitch = IsBgra() ? GetPitch() * 4 : GetPitch(); color_type = IsBgra() ? SS_BGRA : SS_PAL; + gamma = Gamma; } //========================================================================== diff --git a/src/v_video.h b/src/v_video.h index 1cbf565af5..1d7abd581f 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -256,7 +256,7 @@ public: // Retrieves a buffer containing image data for a screenshot. // Hint: Pitch can be negative for upside-down images, in which case buffer // points to the last row in the buffer, which will be the first row output. - virtual void GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &color_type); + virtual void GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &color_type, float &gamma); // Releases the screenshot buffer. virtual void ReleaseScreenshotBuffer(); diff --git a/src/win32/fb_d3d9.cpp b/src/win32/fb_d3d9.cpp index ff05faca9b..fe033946b0 100644 --- a/src/win32/fb_d3d9.cpp +++ b/src/win32/fb_d3d9.cpp @@ -1755,13 +1755,13 @@ void D3DFB::SetBlendingRect(int x1, int y1, int x2, int y2) // //========================================================================== -void D3DFB::GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &color_type) +void D3DFB::GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &color_type, float &gamma) { D3DLOCKED_RECT lrect; if (!Accel2D) { - Super::GetScreenshotBuffer(buffer, pitch, color_type); + Super::GetScreenshotBuffer(buffer, pitch, color_type, gamma); return; } buffer = NULL; @@ -1784,6 +1784,7 @@ void D3DFB::GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &col buffer = (const uint8_t *)lrect.pBits; pitch = lrect.Pitch; color_type = SS_BGRA; + gamma = Gamma; } } } diff --git a/src/win32/win32swiface.h b/src/win32/win32swiface.h index 657b120a32..d2cea20241 100644 --- a/src/win32/win32swiface.h +++ b/src/win32/win32swiface.h @@ -124,7 +124,7 @@ public: bool PaintToWindow (); void SetVSync (bool vsync); void NewRefreshRate(); - void GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &color_type); + void GetScreenshotBuffer(const uint8_t *&buffer, int &pitch, ESSType &color_type, float &gamma) override; void ReleaseScreenshotBuffer(); void SetBlendingRect (int x1, int y1, int x2, int y2); bool Begin2D (bool copy3d); From 29d2d8b3f864bc4219504af8af4a9afef05aefb8 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 7 Dec 2017 01:53:35 -0500 Subject: [PATCH 005/110] - changed ttl in particle_t from short to int32_t for longer lifespan. --- src/p_effect.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_effect.h b/src/p_effect.h index bb87a53d54..4620bfa5a9 100644 --- a/src/p_effect.h +++ b/src/p_effect.h @@ -52,7 +52,7 @@ struct particle_t double size; double sizestep; subsector_t * subsector; - short ttl; + int32_t ttl; uint8_t bright; bool notimefreeze; float fadestep; From a29d9e157c6cba36c35cec2d0f9149bd3e3e7fa2 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 7 Dec 2017 03:01:57 -0500 Subject: [PATCH 006/110] - fixed: screen->FrameTime should use an adjusted frame start time --- src/d_main.cpp | 2 +- src/i_time.cpp | 5 +++++ src/i_time.h | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 9d8055b0d8..6247a5339e 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -781,7 +781,7 @@ void D_Display () { - screen->FrameTime = I_msTime(); + screen->FrameTime = I_msTimeFS(); TexMan.UpdateAnimations(screen->FrameTime); R_UpdateSky(screen->FrameTime); switch (gamestate) diff --git a/src/i_time.cpp b/src/i_time.cpp index 0511a79f06..bd8a3817a9 100644 --- a/src/i_time.cpp +++ b/src/i_time.cpp @@ -164,6 +164,11 @@ uint64_t I_msTime() return NSToMS(I_nsTime()); } +uint64_t I_msTimeFS() // from "start" +{ + return NSToMS(I_nsTime() - FirstFrameStartTime); +} + int I_GetTime() { return NSToTic(CurrentFrameStartTime - FirstFrameStartTime); diff --git a/src/i_time.h b/src/i_time.h index 33907ded2a..63c4586f15 100644 --- a/src/i_time.h +++ b/src/i_time.h @@ -22,5 +22,8 @@ void I_FreezeTime(bool frozen); // [RH] Returns millisecond-accurate time uint64_t I_msTime(); +// [SP] Returns millisecond-accurate time from start +uint64_t I_msTimeFS(); + // Nanosecond-accurate time uint64_t I_nsTime(); From 938cd3cabea6f62ec2c596e87df33080692c25a6 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 7 Dec 2017 06:32:51 -0500 Subject: [PATCH 007/110] - implemented win_borderless for fake fullscreen in Windows --- src/win32/hardware.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/win32/hardware.cpp b/src/win32/hardware.cpp index 57abe59f95..58a611d3e7 100644 --- a/src/win32/hardware.cpp +++ b/src/win32/hardware.cpp @@ -53,6 +53,7 @@ EXTERN_CVAR (Bool, fullscreen) EXTERN_CVAR (Bool, swtruecolor) EXTERN_CVAR (Float, vid_winscale) EXTERN_CVAR (Bool, vid_forceddraw) +EXTERN_CVAR (Bool, win_borderless) CVAR(Int, win_x, -1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Int, win_y, -1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) @@ -413,6 +414,13 @@ void I_RestoreWindowedPos () } MoveWindow (Window, winx, winy, winw, winh, TRUE); + if (win_borderless && !Args->CheckParm("-0")) + { + LONG lStyle = GetWindowLong(Window, GWL_STYLE); + lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU); + SetWindowLong(Window, GWL_STYLE, lStyle); + SetWindowPos(Window, HWND_TOP, 0, 0, scrwidth, scrheight, 0); + } if (win_maximized && !Args->CheckParm("-0")) ShowWindow(Window, SW_MAXIMIZE); } @@ -432,6 +440,18 @@ CUSTOM_CVAR(Bool, swtruecolor, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITC } } +CUSTOM_CVAR(Bool, win_borderless, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) +{ + // Just reinit the window. Saves a lot of trouble. + if (!fullscreen) + { + NewWidth = screen->VideoWidth; + NewHeight = screen->VideoHeight; + NewBits = DisplayBits; + setmodeneeded = true; + } +} + CUSTOM_CVAR (Bool, fullscreen, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITCALL) { NewWidth = screen->VideoWidth; From a3a350e6e8b8ff1d07453a0fce8904975da55ad5 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 7 Dec 2017 16:31:27 -0500 Subject: [PATCH 008/110] - fixed: make level.ShaderStartTime use the same values as what screen->FrameTime normally gets. --- src/p_setup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_setup.cpp b/src/p_setup.cpp index dfa7ecb267..ea8b696491 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -3627,7 +3627,7 @@ void P_SetupLevel (const char *lumpname, int position) bool buildmap; const int *oldvertextable = NULL; - level.ShaderStartTime = I_msTime(); // indicate to the shader system that the level just started + level.ShaderStartTime = I_msTimeFS(); // indicate to the shader system that the level just started // This is motivated as follows: From 0bd9437a962e8608906ce66cd6819cc1a39b4608 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 9 Dec 2017 11:37:25 +0200 Subject: [PATCH 009/110] Fixed loading of external DeHackEd patches https://forum.zdoom.org/viewtopic.php?t=58685 --- src/d_dehacked.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_dehacked.cpp b/src/d_dehacked.cpp index f68fd1d634..cd65253040 100644 --- a/src/d_dehacked.cpp +++ b/src/d_dehacked.cpp @@ -2490,7 +2490,7 @@ bool D_LoadDehFile(const char *patchfile) { FileReader fr; - if (!fr.Open(patchfile)) + if (fr.Open(patchfile)) { PatchSize = fr.GetLength(); From 81769518c9825b4891b1d48f0e213432aedb050f Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 9 Dec 2017 11:57:05 +0200 Subject: [PATCH 010/110] Fixed inconsistent angle of spawned leaves https://forum.zdoom.org/viewtopic.php?t=58664 --- wadsrc/static/zscript/hexen/hexenspecialdecs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wadsrc/static/zscript/hexen/hexenspecialdecs.txt b/wadsrc/static/zscript/hexen/hexenspecialdecs.txt index 626e499aac..f300dc5265 100644 --- a/wadsrc/static/zscript/hexen/hexenspecialdecs.txt +++ b/wadsrc/static/zscript/hexen/hexenspecialdecs.txt @@ -458,7 +458,7 @@ class LeafSpawner : Actor if (mo) { - mo.Thrust(random[LeafSpawn]() / 128. + 3); + mo.Thrust(random[LeafSpawn]() / 128. + 3, angle); mo.target = self; mo.special1 = 0; } From e3ba9567c9073f064bebb26688f01c95a43d78f5 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 9 Dec 2017 12:57:09 +0200 Subject: [PATCH 011/110] Fixed English localization issues https://forum.zdoom.org/viewtopic.php?t=58684 --- wadsrc/static/language.enu | 3 +-- wadsrc/static/menudef.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index e68c9ae86e..c66c97612c 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -1777,7 +1777,7 @@ MOUSEMNU_LOOKSTRAFE = "Lookstrafe"; // Joystick Menu -JOYMNU_CONFIG = "CONFIGURE CONTROLLER"; +JOYMNU_TITLE = "CONFIGURE CONTROLLER"; JOYMNU_OPTIONS = "CONTROLLER OPTIONS"; JOYMNU_NOMENU = "Block controller input in menu"; @@ -2796,7 +2796,6 @@ OPTVAL_TRANSLUCENTFUZZ = "Translucent fuzz"; OPTVAL_NOISE = "Noise"; OPTVAL_SMOOTHNOISE = "Smooth Noise"; OPTVAL_JAGGEDFUZZ = "Jagged fuzz"; -OPTVAL_NORMAL = "Normal"; OPTVAL_GREENMAGENTA = "Green/Magenta"; OPTVAL_REDCYAN = "Red/Cyan"; OPTVAL_AMBERBLUE = "Amber/Blue"; diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 3d0621c3f2..9e45f4137e 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -608,7 +608,7 @@ OptionValue "Inversion" OptionMenu "JoystickConfigMenu" protected { - Title "$JOY_CONFIG" + Title "$JOYMNU_TITLE" Class "JoystickConfigMenu" // Will be filled in by joystick code. } From eb5da3e641273acfefe611e13da8159eeb8023b4 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sat, 9 Dec 2017 06:09:39 -0500 Subject: [PATCH 012/110] - fixed: if the level is started before the first timer call, pass an earlier timestamp to screen->FrameTime --- src/i_time.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i_time.cpp b/src/i_time.cpp index bd8a3817a9..29119ddb4d 100644 --- a/src/i_time.cpp +++ b/src/i_time.cpp @@ -166,7 +166,7 @@ uint64_t I_msTime() uint64_t I_msTimeFS() // from "start" { - return NSToMS(I_nsTime() - FirstFrameStartTime); + return (FirstFrameStartTime == 0) ? 0 : NSToMS(I_nsTime() - FirstFrameStartTime); } int I_GetTime() From ebb926e7b052572decb40d259062a3c08ddbf8df Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 9 Dec 2017 17:38:34 +0200 Subject: [PATCH 013/110] Added free space margin aka safe frame for automap am_freespacemargin CVAR and corresponding menu options can set empty space margin for automap in percentage of zoomed out size https://forum.zdoom.org/viewtopic.php?t=58653 --- src/am_map.cpp | 19 +++++++++++++++++-- wadsrc/static/language.enu | 1 + wadsrc/static/menudef.txt | 1 + 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index d5c6a05f0c..5ab41cd097 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -98,6 +98,20 @@ CVAR (Bool, am_showkeys, true, CVAR_ARCHIVE); CVAR (Int, am_showtriggerlines, 0, CVAR_ARCHIVE); CVAR (Int, am_showthingsprites, 0, CVAR_ARCHIVE); +CUSTOM_CVAR (Int, am_emptyspacemargin, 0, CVAR_ARCHIVE) +{ + if (self < 0) + { + self = 0; + } + else if (self > 50) + { + self = 50; + } + + AM_NewResolution(); +} + //============================================================================= // // Automap colors @@ -1063,8 +1077,9 @@ static void AM_findMinMaxBoundaries () static void AM_calcMinMaxMtoF() { - double a = SCREENWIDTH / max_w; - double b = StatusBar->GetTopOfStatusbar() / max_h; + const double safe_frame = 1.0 - am_emptyspacemargin / 100.0; + double a = safe_frame * (SCREENWIDTH / max_w); + double b = safe_frame * (StatusBar->GetTopOfStatusbar() / max_h); min_scale_mtof = a < b ? a : b; max_scale_mtof = SCREENHEIGHT / (2*PLAYERRADIUS); diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index c66c97612c..a147eeb807 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -1941,6 +1941,7 @@ AUTOMAPMNU_SHOWKEYS = "Show keys (cheat)"; AUTOMAPMNU_SHOWTRIGGERLINES = "Show trigger lines"; AUTOMAPMNU_SHOWTHINGSPRITES = "Show things as sprites"; AUTOMAPMNU_PTOVERLAY = "Overlay portals"; +AUTOMAPMNU_EMPTYSPACEMARGIN = "Empty space margin"; // Automap Controls MAPCNTRLMNU_TITLE = "CUSTOMIZE MAP CONTROLS"; diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 9e45f4137e..9574608f37 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -1091,6 +1091,7 @@ OptionMenu AutomapOptions protected Option "$AUTOMAPMNU_TEXTURED", "am_textured", "OnOff" Option "$AUTOMAPMNU_FOLLOW", "am_followplayer", "OnOff" Option "$AUTOMAPMNU_PTOVERLAY", "am_portaloverlay", "OnOff" + Slider "$AUTOMAPMNU_EMPTYSPACEMARGIN", "am_emptyspacemargin", 0, 50, 5, 0 StaticText " " Option "$AUTOMAPMNU_SHOWITEMS", "am_showitems", "OnOff" Option "$AUTOMAPMNU_SHOWMONSTERS", "am_showmonsters", "OnOff" From 1559d74c2ca336bfaf21bcd1f4978d1185fd1102 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 10 Dec 2017 04:22:13 -0500 Subject: [PATCH 014/110] - repaired the video scaling code --- src/gl/renderer/gl_renderer.cpp | 6 ++++-- src/gl/system/gl_framebuffer.cpp | 1 - 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/gl/renderer/gl_renderer.cpp b/src/gl/renderer/gl_renderer.cpp index af910921b7..74bd81c177 100644 --- a/src/gl/renderer/gl_renderer.cpp +++ b/src/gl/renderer/gl_renderer.cpp @@ -75,7 +75,6 @@ #include "r_videoscale.h" EXTERN_CVAR(Int, screenblocks) -EXTERN_CVAR(Int, vid_scalemode) CVAR(Bool, gl_scale_viewport, true, CVAR_ARCHIVE); @@ -312,7 +311,10 @@ void FGLRenderer::SetOutputViewport(GL_IRECT *bounds) mSceneViewport.height = height; // Scale viewports to fit letterbox - if ((gl_scale_viewport && !framebuffer->IsFullscreen() && vid_scalemode == 0) || !FGLRenderBuffers::IsEnabled()) + bool notScaled = ((mScreenViewport.width == ViewportScaledWidth(mScreenViewport.width, mScreenViewport.height)) && + (mScreenViewport.width == ViewportScaledHeight(mScreenViewport.width, mScreenViewport.height)) && + !ViewportIsScaled43()); + if ((gl_scale_viewport && !framebuffer->IsFullscreen() && notScaled) || !FGLRenderBuffers::IsEnabled()) { mScreenViewport.width = mOutputLetterbox.width; mScreenViewport.height = mOutputLetterbox.height; diff --git a/src/gl/system/gl_framebuffer.cpp b/src/gl/system/gl_framebuffer.cpp index 7425271bed..d6eb142d80 100644 --- a/src/gl/system/gl_framebuffer.cpp +++ b/src/gl/system/gl_framebuffer.cpp @@ -56,7 +56,6 @@ EXTERN_CVAR (Float, vid_brightness) EXTERN_CVAR (Float, vid_contrast) EXTERN_CVAR (Bool, vid_vsync) -EXTERN_CVAR(Int, vid_scalemode) CVAR(Bool, gl_aalines, false, CVAR_ARCHIVE) From a89bc237897d91191a27b770b74b7cf6ace2ed6e Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 10 Dec 2017 13:24:16 +0200 Subject: [PATCH 015/110] Fixed crash when loading saved game with missing ACS module --- src/p_acs.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 3d93e7a0a5..22afac1b63 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -3655,6 +3655,12 @@ void DLevelScript::Serialize(FSerializer &arc) if (arc.isReading()) { activeBehavior = FBehavior::StaticGetModule(lib); + + if (nullptr == activeBehavior) + { + I_Error("Could not find ACS module"); + } + pc = activeBehavior->Ofs2PC(pcofs); } } From acc943329bad48d3a602d778674d8afebbc1a3df Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 10 Dec 2017 14:35:30 +0200 Subject: [PATCH 016/110] Added null check for probe in SectorAction.OnDestroy() Absence of check led to unhandled VM abort exception in case of saved game failed to load --- wadsrc/static/zscript/shared/sectoraction.txt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/wadsrc/static/zscript/shared/sectoraction.txt b/wadsrc/static/zscript/shared/sectoraction.txt index 32302959ad..fb7edfb194 100644 --- a/wadsrc/static/zscript/shared/sectoraction.txt +++ b/wadsrc/static/zscript/shared/sectoraction.txt @@ -37,13 +37,16 @@ class SectorAction : Actor else { Actor probe = CurSector.SecActTarget; - while (probe.tracer != self && probe.tracer != null) + if (null != probe) { - probe = probe.tracer; - } - if (probe.tracer == self) - { - probe.tracer = tracer; + while (probe.tracer != self && probe.tracer != null) + { + probe = probe.tracer; + } + if (probe.tracer == self) + { + probe.tracer = tracer; + } } } } From 724c9976951bcf85a82ea9d06e125fee640a811c Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 10 Dec 2017 15:10:32 +0200 Subject: [PATCH 017/110] Fixed error check when saving GL nodes --- src/p_glnodes.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/p_glnodes.cpp b/src/p_glnodes.cpp index 977426e572..bd574ad837 100644 --- a/src/p_glnodes.cpp +++ b/src/p_glnodes.cpp @@ -1137,7 +1137,8 @@ static void CreateCachedNodes(MapData *map) if (fw != nullptr) { - if (fw->Write(compressed, outlen+offset) != 1) + const size_t length = outlen + offset; + if (fw->Write(compressed, length) != length) { Printf("Error saving nodes to file %s\n", path.GetChars()); } From 6b42036eb6a17af9d01406be9630709ca770dba5 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 10 Dec 2017 21:26:52 +0100 Subject: [PATCH 018/110] - fixed: AActor::UnlinkFromWorld must also destroy all portal link nodes for the calling actor. --- src/p_maputl.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index e6b39e5866..31ab084968 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -343,6 +343,16 @@ void AActor::UnlinkFromWorld (FLinkContext *ctx) } BlockNode = NULL; } + ClearRenderSectorList(); + ClearRenderLineList(); +} + +DEFINE_ACTION_FUNCTION(AActor, UnlinkFromWorld) +{ + PARAM_SELF_PROLOGUE(AActor); + PARAM_POINTER_DEF(ctx, FLinkContext); + self->UnlinkFromWorld(ctx); // fixme + return 0; } @@ -429,15 +439,6 @@ bool AActor::FixMapthingPos() return success; } -DEFINE_ACTION_FUNCTION(AActor, UnlinkFromWorld) -{ - PARAM_SELF_PROLOGUE(AActor); - PARAM_POINTER_DEF(ctx, FLinkContext); - self->UnlinkFromWorld(ctx); // fixme - return 0; -} - - //========================================================================== // // P_SetThingPosition From f3ac82e11249501fffa3337dca92d3b83bbffe33 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 13 Dec 2017 22:14:30 +0100 Subject: [PATCH 019/110] - do not allow outside access to the variable storing the CCMD for OptionMenuItemCommand. This can be abused to execute atbitrary commands from inside script code. --- wadsrc/static/zscript/menu/optionmenuitems.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wadsrc/static/zscript/menu/optionmenuitems.txt b/wadsrc/static/zscript/menu/optionmenuitems.txt index f08dca713d..3405ae5493 100644 --- a/wadsrc/static/zscript/menu/optionmenuitems.txt +++ b/wadsrc/static/zscript/menu/optionmenuitems.txt @@ -126,9 +126,12 @@ class OptionMenuItemSubmenu : OptionMenuItem class OptionMenuItemCommand : OptionMenuItemSubmenu { + private String ccmd; // do not allow access to this from the outside. + OptionMenuItemCommand Init(String label, Name command, bool centered = false) { Super.Init(label, command, 0, centered); + ccmd = command; return self; } @@ -146,7 +149,7 @@ class OptionMenuItemCommand : OptionMenuItemSubmenu if (m.GetItem(mAction) != self) return false; } Menu.MenuSound("menu/choose"); - DoCommand(mAction); + DoCommand(ccmd); return true; } From de12902d77642c65e56679201fa8c3b45054177f Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Thu, 14 Dec 2017 16:17:55 +0200 Subject: [PATCH 020/110] Increased limit for automap empty space margin to 90% https://forum.zdoom.org/viewtopic.php?t=58653 --- src/am_map.cpp | 4 ++-- wadsrc/static/menudef.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index 5ab41cd097..5404614412 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -104,9 +104,9 @@ CUSTOM_CVAR (Int, am_emptyspacemargin, 0, CVAR_ARCHIVE) { self = 0; } - else if (self > 50) + else if (self > 90) { - self = 50; + self = 90; } AM_NewResolution(); diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 9574608f37..faf57c054d 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -1091,7 +1091,7 @@ OptionMenu AutomapOptions protected Option "$AUTOMAPMNU_TEXTURED", "am_textured", "OnOff" Option "$AUTOMAPMNU_FOLLOW", "am_followplayer", "OnOff" Option "$AUTOMAPMNU_PTOVERLAY", "am_portaloverlay", "OnOff" - Slider "$AUTOMAPMNU_EMPTYSPACEMARGIN", "am_emptyspacemargin", 0, 50, 5, 0 + Slider "$AUTOMAPMNU_EMPTYSPACEMARGIN", "am_emptyspacemargin", 0, 90, 5, 0 StaticText " " Option "$AUTOMAPMNU_SHOWITEMS", "am_showitems", "OnOff" Option "$AUTOMAPMNU_SHOWMONSTERS", "am_showmonsters", "OnOff" From f77ba14948e4d405b8e5fffe6412b6f3828420d8 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 14 Dec 2017 15:51:24 -0500 Subject: [PATCH 021/110] - use a whitelist for DoCommand zscript command --- src/c_dispatch.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/c_dispatch.cpp b/src/c_dispatch.cpp index 996872a669..4e3f027f07 100644 --- a/src/c_dispatch.cpp +++ b/src/c_dispatch.cpp @@ -664,13 +664,29 @@ void C_DoCommand (const char *cmd, int keynum) } } +#define ZS_SAFE_COMMAND(ccmd) if (stricmp(cmd, #ccmd) == 0) return true; + +bool C_ZSIsSafe(FString cmd) +{ + ZS_SAFE_COMMAND(snd_reset) + ZS_SAFE_COMMAND(reset2defaults) + ZS_SAFE_COMMAND(menuconsole) + ZS_SAFE_COMMAND(clearnodecache) + ZS_SAFE_COMMAND(am_restorecolors) + + return false; +} + // This is only accessible to the special menu item to run CCMDs. DEFINE_ACTION_FUNCTION(DOptionMenuItemCommand, DoCommand) { if (CurrentMenu == nullptr) return 0; PARAM_PROLOGUE; PARAM_STRING(cmd); - C_DoCommand(cmd); + if (C_ZSIsSafe(cmd)) + C_DoCommand(cmd); + else + Printf("Script attempted to call unsafe command '%s'\n", cmd); return 0; } From dee5d064e977acb236f61582b945aa806b89e8c3 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 14 Dec 2017 16:39:33 -0500 Subject: [PATCH 022/110] - revise last script a bit: allow certain cheats/scripts/events to be called from the menu. --- src/c_dispatch.cpp | 56 +++++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/src/c_dispatch.cpp b/src/c_dispatch.cpp index 4e3f027f07..1bca9051b5 100644 --- a/src/c_dispatch.cpp +++ b/src/c_dispatch.cpp @@ -126,7 +126,7 @@ FButtonStatus Button_Mlook, Button_Klook, Button_Use, Button_AltAttack, Button_AM_PanLeft, Button_AM_PanRight, Button_AM_PanDown, Button_AM_PanUp, Button_AM_ZoomIn, Button_AM_ZoomOut; -bool ParsingKeyConf; +bool ParsingKeyConf, ParsingMenuDef = false; // To add new actions, go to the console and type "key ". // This will give you the key value to use in the first column. Then @@ -187,6 +187,21 @@ static const char *KeyConfCommands[] = "clearplayerclasses" }; +static const char *MenuDefCommands[] = +{ + "snd_reset", + "reset2defaults", + "menuconsole", + "clearnodecache", + "am_restorecolors", + "special", + "puke", + "fpuke", + "pukename", + "event", + "netevent" +}; + // CODE -------------------------------------------------------------------- IMPLEMENT_CLASS(DWaitingCommand, false, false) @@ -584,6 +599,25 @@ void C_DoCommand (const char *cmd, int keynum) } } + if (ParsingMenuDef) + { + int i; + + for (i = countof(MenuDefCommands)-1; i >= 0; --i) + { + if (strnicmp (beg, MenuDefCommands[i], len) == 0 && + MenuDefCommands[i][len] == 0) + { + break; + } + } + if (i < 0) + { + Printf ("Invalid command for MENUDEF/ZScript: %s\n", beg); + return; + } + } + // Check if this is an action if (*beg == '+' || *beg == '-') { @@ -664,29 +698,15 @@ void C_DoCommand (const char *cmd, int keynum) } } -#define ZS_SAFE_COMMAND(ccmd) if (stricmp(cmd, #ccmd) == 0) return true; - -bool C_ZSIsSafe(FString cmd) -{ - ZS_SAFE_COMMAND(snd_reset) - ZS_SAFE_COMMAND(reset2defaults) - ZS_SAFE_COMMAND(menuconsole) - ZS_SAFE_COMMAND(clearnodecache) - ZS_SAFE_COMMAND(am_restorecolors) - - return false; -} - // This is only accessible to the special menu item to run CCMDs. DEFINE_ACTION_FUNCTION(DOptionMenuItemCommand, DoCommand) { if (CurrentMenu == nullptr) return 0; PARAM_PROLOGUE; PARAM_STRING(cmd); - if (C_ZSIsSafe(cmd)) - C_DoCommand(cmd); - else - Printf("Script attempted to call unsafe command '%s'\n", cmd); + ParsingMenuDef = true; + C_DoCommand(cmd); + ParsingMenuDef = false; return 0; } From 31f2bb5218d75668f3d21f110a3b07286e3c40f5 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 15 Dec 2017 10:17:43 +0200 Subject: [PATCH 023/110] Extended workaround for bug in VS2017 compiler to 32-bit build game-music-emu\gme\fir_resampler.cpp(32): fatal error C1001: An internal error has occurred in the compiler. --- game-music-emu/gme/Fir_Resampler.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/game-music-emu/gme/Fir_Resampler.cpp b/game-music-emu/gme/Fir_Resampler.cpp index 355b959145..a311895a27 100644 --- a/game-music-emu/gme/Fir_Resampler.cpp +++ b/game-music-emu/gme/Fir_Resampler.cpp @@ -23,9 +23,9 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #undef PI #define PI 3.1415926535897932384626433832795029 -#if _MSC_VER >= 1911 && defined _M_X64 +#if _MSC_VER >= 1911 #pragma float_control(precise, on, push) -#endif // _MSC_VER >= 1911 && _M_X64 +#endif // _MSC_VER >= 1911 static void gen_sinc( double rolloff, int width, double offset, double spacing, double scale, int count, short* out ) @@ -56,9 +56,9 @@ static void gen_sinc( double rolloff, int width, double offset, double spacing, } } -#if _MSC_VER >= 1911 && defined _M_X64 +#if _MSC_VER >= 1911 #pragma float_control(pop) -#endif // _MSC_VER >= 1911 && _M_X64 +#endif // _MSC_VER >= 1911 Fir_Resampler_::Fir_Resampler_( int width, sample_t* impulses_ ) : width_( width ), From c387574c020b50698c2b2c957fccb503ab8ed80b Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 15 Dec 2017 12:34:56 +0200 Subject: [PATCH 024/110] Stop demo recording after ending game with menu_endgame CCMD https://forum.zdoom.org/viewtopic.php?t=58735 --- src/menu/messagebox.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/menu/messagebox.cpp b/src/menu/messagebox.cpp index 3531cf2f62..bf5f4410ff 100644 --- a/src/menu/messagebox.cpp +++ b/src/menu/messagebox.cpp @@ -139,6 +139,7 @@ void ActivateEndGameMenu() M_ClearMenus(); if (!netgame) { + G_CheckDemoStatus(); D_StartTitle(); } }); From f452184d823a8c8ba6c020bb8ddfca4096a7d805 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 16 Dec 2017 11:49:50 +0200 Subject: [PATCH 025/110] Updated to Xcode 9.2 in Travis configuration --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c7ff08eaa4..f457d5f999 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ git: matrix: include: - os: osx - osx_image: xcode9.1 + osx_image: xcode9.2 env: - CMAKE_OPTIONS="-DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=10.7" From 0afc09678f02803f457b64f2831141f1cc1859c7 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 16 Dec 2017 17:37:03 +0200 Subject: [PATCH 026/110] Fixed bright sprites in sectors with Doom 64 lighting https://forum.zdoom.org/viewtopic.php?t=58703 --- src/gl/scene/gl_sprite.cpp | 7 +++---- src/gl/scene/gl_weapon.cpp | 12 ++++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/gl/scene/gl_sprite.cpp b/src/gl/scene/gl_sprite.cpp index 154720022f..a773373ef0 100644 --- a/src/gl/scene/gl_sprite.cpp +++ b/src/gl/scene/gl_sprite.cpp @@ -342,10 +342,9 @@ void GLSprite::Draw(int pass) sector_t *cursec = actor ? actor->Sector : particle ? particle->subsector->sector : nullptr; if (cursec != nullptr) { - PalEntry finalcol(ThingColor.a, - ThingColor.r * cursec->SpecialColors[sector_t::sprites].r / 255, - ThingColor.g * cursec->SpecialColors[sector_t::sprites].g / 255, - ThingColor.b * cursec->SpecialColors[sector_t::sprites].b / 255); + const PalEntry finalcol = fullbright + ? ThingColor + : ThingColor.Modulate(cursec->SpecialColors[sector_t::sprites]); gl_RenderState.SetObjectColor(finalcol); } diff --git a/src/gl/scene/gl_weapon.cpp b/src/gl/scene/gl_weapon.cpp index 3d42245200..69551f28a5 100644 --- a/src/gl/scene/gl_weapon.cpp +++ b/src/gl/scene/gl_weapon.cpp @@ -385,18 +385,18 @@ void GLSceneDrawer::DrawPlayerSprites(sector_t * viewsector, bool hudModelStep) // now draw the different layers of the weapon. // For stencil render styles brightmaps need to be disabled. gl_RenderState.EnableBrightmap(!(RenderStyle.Flags & STYLEF_ColorIsFixed)); - PalEntry finalcol(ThingColor.a, - ThingColor.r * viewsector->SpecialColors[sector_t::sprites].r / 255, - ThingColor.g * viewsector->SpecialColors[sector_t::sprites].g / 255, - ThingColor.b * viewsector->SpecialColors[sector_t::sprites].b / 255); + const bool bright = isBright(psp); + const PalEntry finalcol = bright + ? ThingColor + : ThingColor.Modulate(viewsector->SpecialColors[sector_t::sprites]); gl_RenderState.SetObjectColor(finalcol); if (psp->GetState() != nullptr) { FColormap cmc = cm; int ll = lightlevel; - if (isBright(psp)) + if (bright) { if (fakesec == viewsector || in_area != area_below) { @@ -487,4 +487,4 @@ void GLSceneDrawer::DrawTargeterSprites() { if (psp->GetState() != nullptr) DrawPSprite(player, psp, psp->x, psp->y, false, 0, false); } -} \ No newline at end of file +} From 0d841ab4df7fa3f4d3c700df76dd5e3c0a6e62c7 Mon Sep 17 00:00:00 2001 From: Major Cooke Date: Tue, 7 Nov 2017 09:55:15 -0600 Subject: [PATCH 027/110] - Added DMG_NO_PAIN for DamageMobj. --- src/p_interaction.cpp | 21 +++++++++++++-------- src/p_local.h | 1 + wadsrc/static/zscript/constants.txt | 1 + 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index edfe3f8b8c..4de850900d 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -903,8 +903,7 @@ void P_AutoUseStrifeHealth (player_t *player) static inline bool MustForcePain(AActor *target, AActor *inflictor) { - return (!(target->flags5 & MF5_NOPAIN) && inflictor != NULL && - (inflictor->flags6 & MF6_FORCEPAIN) && !(inflictor->flags5 & MF5_PAINLESS)); + return (inflictor && (inflictor->flags6 & MF6_FORCEPAIN)); } static inline bool isFakePain(AActor *target, AActor *inflictor, int damage) @@ -928,6 +927,7 @@ static int DamageMobj (AActor *target, AActor *inflictor, AActor *source, int da bool invulpain = false; bool fakedPain = false; bool forcedPain = false; + bool noPain = false; int fakeDamage = 0; int holdDamage = 0; const int rawdamage = damage; @@ -940,9 +940,14 @@ static int DamageMobj (AActor *target, AActor *inflictor, AActor *source, int da return 0; } - //Rather than unnecessarily call the function over and over again, let's be a little more efficient. - fakedPain = (isFakePain(target, inflictor, damage)); - forcedPain = (MustForcePain(target, inflictor)); + // Rather than unnecessarily call the function over and over again, let's be a little more efficient. + // But first, check and see if it's even needed, which it won't be if pain must not be triggered. + noPain = ((flags & DMG_NO_PAIN) || (target->flags5 & MF5_NOPAIN) || (inflictor && (inflictor->flags5 & MF5_PAINLESS))); + if (!noPain) + { + fakedPain = (isFakePain(target, inflictor, damage)); + forcedPain = (MustForcePain(target, inflictor)); + } // Spectral targets only take damage from spectral projectiles. if (target->flags4 & MF4_SPECTRAL && !telefragDamage) @@ -1306,7 +1311,7 @@ static int DamageMobj (AActor *target, AActor *inflictor, AActor *source, int da { // player is invulnerable, so don't hurt him //Make sure no godmodes and NOPAIN flags are found first. //Then, check to see if the player has NODAMAGE or ALLOWPAIN, or inflictor has CAUSEPAIN. - if ((player->cheats & CF_GODMODE) || (player->cheats & CF_GODMODE2) || (player->mo->flags5 & MF5_NOPAIN)) + if ((flags & DMG_NO_PAIN) || (player->cheats & CF_GODMODE) || (player->cheats & CF_GODMODE2) || (player->mo->flags5 & MF5_NOPAIN)) return 0; else if ((((player->mo->flags7 & MF7_ALLOWPAIN) || (player->mo->flags5 & MF5_NODAMAGE)) || ((inflictor != NULL) && (inflictor->flags7 & MF7_CAUSEPAIN)))) { @@ -1333,7 +1338,7 @@ static int DamageMobj (AActor *target, AActor *inflictor, AActor *source, int da if (damage <= 0) { // [MC] Godmode doesn't need checking here, it's already being handled above. - if ((target->flags5 & MF5_NOPAIN) || (inflictor && (inflictor->flags5 & MF5_PAINLESS))) + if (noPain) return 0; // If MF6_FORCEPAIN is set, make the player enter the pain state. @@ -1522,7 +1527,7 @@ static int DamageMobj (AActor *target, AActor *inflictor, AActor *source, int da fakepain: //Needed so we can skip the rest of the above, but still obey the original rules. - if (!(target->flags5 & MF5_NOPAIN) && (inflictor == NULL || !(inflictor->flags5 & MF5_PAINLESS)) && + if (!noPain && (target->player != NULL || !G_SkillProperty(SKILLP_NoPain)) && !(target->flags & MF_SKULLFLY)) { painchance = target->PainChance; diff --git a/src/p_local.h b/src/p_local.h index c3fd295209..e4123cd512 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -437,6 +437,7 @@ enum EDmgFlags DMG_FOILBUDDHA = 128, DMG_NO_PROTECT = 256, DMG_USEANGLE = 512, + DMG_NO_PAIN = 1 << 10, }; diff --git a/wadsrc/static/zscript/constants.txt b/wadsrc/static/zscript/constants.txt index a8aea4123b..5dd6b778b0 100644 --- a/wadsrc/static/zscript/constants.txt +++ b/wadsrc/static/zscript/constants.txt @@ -913,6 +913,7 @@ enum EDmgFlags DMG_FOILBUDDHA = 128, DMG_NO_PROTECT = 256, DMG_USEANGLE = 512, + DMG_NO_PAIN = 1 << 10, } enum EReplace From ceffe1ba5fde70e4a36d70504bf7078b65e6b628 Mon Sep 17 00:00:00 2001 From: Major Cooke Date: Tue, 7 Nov 2017 10:50:21 -0600 Subject: [PATCH 028/110] Consistent style. --- src/p_local.h | 2 +- wadsrc/static/zscript/constants.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_local.h b/src/p_local.h index e4123cd512..2f12b6a5ba 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -437,7 +437,7 @@ enum EDmgFlags DMG_FOILBUDDHA = 128, DMG_NO_PROTECT = 256, DMG_USEANGLE = 512, - DMG_NO_PAIN = 1 << 10, + DMG_NO_PAIN = 1024, }; diff --git a/wadsrc/static/zscript/constants.txt b/wadsrc/static/zscript/constants.txt index 5dd6b778b0..dc44832534 100644 --- a/wadsrc/static/zscript/constants.txt +++ b/wadsrc/static/zscript/constants.txt @@ -913,7 +913,7 @@ enum EDmgFlags DMG_FOILBUDDHA = 128, DMG_NO_PROTECT = 256, DMG_USEANGLE = 512, - DMG_NO_PAIN = 1 << 10, + DMG_NO_PAIN = 1024, } enum EReplace From 6db8e71b14a2d3abb914b539ace09ebb53705190 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 17 Dec 2017 13:01:03 +0200 Subject: [PATCH 029/110] Fixed inconsistent color remapping via translation ranges https://forum.zdoom.org/viewtopic.php?t=58537 --- src/r_data/r_translate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/r_data/r_translate.cpp b/src/r_data/r_translate.cpp index d8af38b11e..0fe5f6f07a 100644 --- a/src/r_data/r_translate.cpp +++ b/src/r_data/r_translate.cpp @@ -368,7 +368,7 @@ void FRemapTable::AddIndexRange(int start, int end, int pal1, int pal2) palstep = (pal2 - palcol) / (end - start); for (int i = start; i <= end; palcol += palstep, ++i) { - int j = GPalette.Remap[i], k = GPalette.Remap[int(palcol)]; + int j = GPalette.Remap[i], k = GPalette.Remap[int(round(palcol))]; Remap[j] = k; Palette[j] = GPalette.BaseColors[k]; Palette[j].a = j == 0 ? 0 : 255; From 8c60c3c532ecad2e7f39e29d9cb4b473a58065d8 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 17 Dec 2017 14:53:38 +0200 Subject: [PATCH 030/110] Added bounds checks for color translation indices ACS scripts could pass arbitrary values as palette indices leading to undefined behavior --- src/r_data/r_translate.cpp | 49 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/r_data/r_translate.cpp b/src/r_data/r_translate.cpp index 0fe5f6f07a..2313d573de 100644 --- a/src/r_data/r_translate.cpp +++ b/src/r_data/r_translate.cpp @@ -78,6 +78,30 @@ const uint8_t IcePalette[16][3] = { 148,148,172 } }; +static bool IndexOutOfRange(const int color) +{ + const bool outOfRange = color < 0 || color > 255; + + if (outOfRange) + { + Printf("Palette index %i is out of range [0..255]\n", color); + } + + return outOfRange; +} + +static bool IndexOutOfRange(const int start, const int end) +{ + const bool outOfRange = IndexOutOfRange(start); + return IndexOutOfRange(end) || outOfRange; +} + +static bool IndexOutOfRange(const int start1, const int end1, const int start2, const int end2) +{ + const bool outOfRange = IndexOutOfRange(start1, end1); + return IndexOutOfRange(start2, end2) || outOfRange; +} + /****************************************************/ /****************************************************/ @@ -348,6 +372,11 @@ FNativePalette *FRemapTable::GetNative() void FRemapTable::AddIndexRange(int start, int end, int pal1, int pal2) { + if (IndexOutOfRange(start, end, pal1, pal2)) + { + return; + } + double palcol, palstep; if (start > end) @@ -383,6 +412,11 @@ void FRemapTable::AddIndexRange(int start, int end, int pal1, int pal2) void FRemapTable::AddColorRange(int start, int end, int _r1,int _g1, int _b1, int _r2, int _g2, int _b2) { + if (IndexOutOfRange(start, end)) + { + return; + } + double r1 = _r1; double g1 = _g1; double b1 = _b1; @@ -442,6 +476,11 @@ void FRemapTable::AddColorRange(int start, int end, int _r1,int _g1, int _b1, in void FRemapTable::AddDesaturation(int start, int end, double r1, double g1, double b1, double r2, double g2, double b2) { + if (IndexOutOfRange(start, end)) + { + return; + } + r1 = clamp(r1, 0.0, 2.0); g1 = clamp(g1, 0.0, 2.0); b1 = clamp(b1, 0.0, 2.0); @@ -490,6 +529,11 @@ void FRemapTable::AddDesaturation(int start, int end, double r1, double g1, doub void FRemapTable::AddColourisation(int start, int end, int r, int g, int b) { + if (IndexOutOfRange(start, end)) + { + return; + } + for (int i = start; i < end; ++i) { double br = GPalette.BaseColors[i].r; @@ -515,6 +559,11 @@ void FRemapTable::AddColourisation(int start, int end, int r, int g, int b) void FRemapTable::AddTint(int start, int end, int r, int g, int b, int amount) { + if (IndexOutOfRange(start, end)) + { + return; + } + for (int i = start; i < end; ++i) { float br = GPalette.BaseColors[i].r; From 90c734a39f9125fb9aa4f185a02e02f22d272081 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Tue, 19 Dec 2017 18:07:29 +0200 Subject: [PATCH 031/110] Fixed VM abort when drawing from ZScript happens during 0 game tic https://forum.zdoom.org/viewtopic.php?t=58523 https://forum.zdoom.org/viewtopic.php?t=58780 --- src/d_main.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/d_main.cpp b/src/d_main.cpp index 6247a5339e..656a2ca3b5 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -797,7 +797,13 @@ void D_Display () case GS_LEVEL: case GS_TITLELEVEL: if (!gametic) + { + if (!screen->HasBegun2D()) + { + screen->Begin2D(false); + } break; + } if (StatusBar != NULL) { From 0e2aee7d5e7d899561911a9d0382d6169f102f1f Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 20 Dec 2017 03:21:50 -0500 Subject: [PATCH 032/110] - whitelist reset2saved in menudef --- src/c_dispatch.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/c_dispatch.cpp b/src/c_dispatch.cpp index 1bca9051b5..7b40628741 100644 --- a/src/c_dispatch.cpp +++ b/src/c_dispatch.cpp @@ -191,6 +191,7 @@ static const char *MenuDefCommands[] = { "snd_reset", "reset2defaults", + "reset2saved", "menuconsole", "clearnodecache", "am_restorecolors", From b9a23989355ab62b19798332215399b16ec66177 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 21 Dec 2017 18:00:13 -0500 Subject: [PATCH 033/110] - added 'undocolorpic' to c_dispatch whitelist --- src/c_dispatch.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/c_dispatch.cpp b/src/c_dispatch.cpp index 7b40628741..2ab57ab7eb 100644 --- a/src/c_dispatch.cpp +++ b/src/c_dispatch.cpp @@ -195,6 +195,7 @@ static const char *MenuDefCommands[] = "menuconsole", "clearnodecache", "am_restorecolors", + "undocolorpic", "special", "puke", "fpuke", From d50ba4954aacf398bf259a4e41b9323d565edc0a Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 23 Dec 2017 15:27:32 +0200 Subject: [PATCH 034/110] Fixed potential crash when calling undefined function in ZScript The following code which uses explicit class specifier led to a crash: class C { void F() { Object.Undefined(); } } --- src/scripting/backend/codegen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index 5642402034..d504282d1a 100644 --- a/src/scripting/backend/codegen.cpp +++ b/src/scripting/backend/codegen.cpp @@ -8091,7 +8091,7 @@ FxExpression *FxMemberFunctionCall::Resolve(FCompileContext& ctx) { bool error; PFunction *afd = FindClassMemberFunction(ccls, ctx.Class, MethodName, ScriptPosition, &error); - if ((afd->Variants[0].Flags & VARF_Method) && (afd->Variants[0].Flags & VARF_Virtual)) + if ((nullptr != afd) && (afd->Variants[0].Flags & VARF_Method) && (afd->Variants[0].Flags & VARF_Virtual)) { staticonly = false; novirtual = true; From bfaa09c429c50e3423bddc398affa9446abe7088 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 23 Dec 2017 15:48:28 +0200 Subject: [PATCH 035/110] Fixed crash after restart CCMD --- src/am_map.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index 5404614412..2d80b59a0e 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -109,7 +109,10 @@ CUSTOM_CVAR (Int, am_emptyspacemargin, 0, CVAR_ARCHIVE) self = 90; } - AM_NewResolution(); + if (nullptr != StatusBar) + { + AM_NewResolution(); + } } //============================================================================= From a11e9ca4dc44c6b767490119afa7b0393a398606 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 24 Dec 2017 10:33:29 +0200 Subject: [PATCH 036/110] Apply compatibility flags to all map format UDMF maps were no affected by settings in compatibility.txt --- src/p_setup.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_setup.cpp b/src/p_setup.cpp index ea8b696491..b87bf6b874 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -3815,8 +3815,6 @@ void P_SetupLevel (const char *lumpname, int position) P_LoadThings (map); else P_LoadThings2 (map); // [RH] Load Hexen-style things - - SetCompatibilityParams(); } else { @@ -3825,6 +3823,8 @@ void P_SetupLevel (const char *lumpname, int position) times[0].Unclock(); } + SetCompatibilityParams(); + times[6].Clock(); P_LoopSidedefs (true); times[6].Unclock(); From 563a80ff839b879dcdfbe4dcc6f16f3e68243f25 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 24 Dec 2017 10:37:22 +0200 Subject: [PATCH 037/110] Added compatibility settings for Hanging Gardens Six trees spawned below arches blocking player's path to red keycard https://www.doomworld.com/idgames/levels/doom2/Ports/g-i/hgarden --- wadsrc/static/compatibility.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/wadsrc/static/compatibility.txt b/wadsrc/static/compatibility.txt index f76ffebf68..245c450529 100644 --- a/wadsrc/static/compatibility.txt +++ b/wadsrc/static/compatibility.txt @@ -833,3 +833,14 @@ CA3773ED313E8899311F3DD0CA195A68 // e3m6 { polyobj } + +3D8ED20BF5CAAE6D6AE0E10999C75084 // hgarden.pk3 map01 +{ + // spawn trees on top of arches + setthingz 399 168 + setthingz 400 168 + setthingz 401 168 + setthingz 402 168 + setthingz 403 168 + setthingz 404 168 +} From aacdc3546caa90adf9acf59fe07393d85d428003 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 24 Dec 2017 11:00:02 +0200 Subject: [PATCH 038/110] Fixed take ammo cheat https://forum.zdoom.org/viewtopic.php?t=58854 --- wadsrc/static/zscript/shared/player_cheat.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wadsrc/static/zscript/shared/player_cheat.txt b/wadsrc/static/zscript/shared/player_cheat.txt index 15bad043cf..949c89a3c4 100644 --- a/wadsrc/static/zscript/shared/player_cheat.txt +++ b/wadsrc/static/zscript/shared/player_cheat.txt @@ -272,7 +272,7 @@ extend class PlayerPawn if (type != null && type is deletetype) { let pack = FindInventory(type); - if (pack) pack.Destroy(); + if (pack) pack.DepleteOrDestroy(); } } } From 000037dbf69c2c1580f3c9bb8a9771bf18bc7ae8 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 24 Dec 2017 18:01:45 -0500 Subject: [PATCH 039/110] - implemented 'i_soundinbackground' to continue playing sounds and music while in the background. - OpenGL rendering continues now even when losing focus while in windowed mode. --- src/posix/cocoa/i_main.mm | 3 ++- src/posix/sdl/i_input.cpp | 3 ++- src/win32/i_input.cpp | 3 ++- src/win32/win32gliface.cpp | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/posix/cocoa/i_main.mm b/src/posix/cocoa/i_main.mm index fd3e9a737d..5d30341b4e 100644 --- a/src/posix/cocoa/i_main.mm +++ b/src/posix/cocoa/i_main.mm @@ -60,6 +60,7 @@ // --------------------------------------------------------------------------- +CVAR (Bool, i_soundinbackground, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) EXTERN_CVAR(Int, vid_defwidth ) EXTERN_CVAR(Int, vid_defheight) EXTERN_CVAR(Bool, vid_vsync ) @@ -323,7 +324,7 @@ ApplicationController* appCtrl; { ZD_UNUSED(aNotification); - S_SetSoundPaused(0); + S_SetSoundPaused((!!i_soundinbackground) || 0); } diff --git a/src/posix/sdl/i_input.cpp b/src/posix/sdl/i_input.cpp index ecf93ed5d7..338b343d53 100644 --- a/src/posix/sdl/i_input.cpp +++ b/src/posix/sdl/i_input.cpp @@ -62,6 +62,7 @@ extern int paused; CVAR (Bool, use_mouse, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR (Bool, m_noprescale, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR (Bool, m_filter, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) +CVAR (Bool, i_soundinbackground, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) EXTERN_CVAR (Bool, fullscreen) @@ -312,7 +313,7 @@ void MessagePump (const SDL_Event &sev) { case SDL_WINDOWEVENT_FOCUS_GAINED: case SDL_WINDOWEVENT_FOCUS_LOST: - S_SetSoundPaused(sev.window.event == SDL_WINDOWEVENT_FOCUS_GAINED); + S_SetSoundPaused((!!i_soundinbackground) || sev.window.event == SDL_WINDOWEVENT_FOCUS_GAINED); break; } break; diff --git a/src/win32/i_input.cpp b/src/win32/i_input.cpp index 9b05775feb..9289438205 100644 --- a/src/win32/i_input.cpp +++ b/src/win32/i_input.cpp @@ -165,6 +165,7 @@ BOOL AppActive = TRUE; int SessionState = 0; int BlockMouseMove; +CVAR (Bool, i_soundinbackground, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR (Bool, k_allowfullscreentoggle, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CUSTOM_CVAR(Bool, norawinput, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITCALL) @@ -567,7 +568,7 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { SetPriorityClass (GetCurrentProcess (), IDLE_PRIORITY_CLASS); } - S_SetSoundPaused (wParam); + S_SetSoundPaused ((!!i_soundinbackground) || wParam); break; case WM_WTSSESSION_CHANGE: diff --git a/src/win32/win32gliface.cpp b/src/win32/win32gliface.cpp index 77963a43b2..d5df5d8df7 100644 --- a/src/win32/win32gliface.cpp +++ b/src/win32/win32gliface.cpp @@ -1130,7 +1130,7 @@ void Win32GLFrameBuffer::InitializeState() bool Win32GLFrameBuffer::CanUpdate() { - if (!AppActive) return false; + if (!AppActive && IsFullscreen()) return false; return true; } From 205c64d4b179a6f612750049f8095dc19a1befa7 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 24 Dec 2017 20:48:51 -0500 Subject: [PATCH 040/110] - prevent level from exiting if no deathmatch starts are available in multiplayer --- src/g_game.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_game.cpp b/src/g_game.cpp index 0adfa2fc9d..4044846728 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1772,7 +1772,7 @@ void G_DoReborn (int playernum, bool freshbot) } // spawn at random spot if in deathmatch - if (deathmatch || isUnfriendly) + if ((deathmatch || isUnfriendly) && (level.deathmatchstarts.Size () > 0)) { G_DeathMatchSpawnPlayer (playernum); return; From 35dbe965e1c611fae087573986ea3e6dd188b418 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Mon, 25 Dec 2017 12:36:37 +0200 Subject: [PATCH 041/110] Fixed tics to seconds conversion, now in ZScript Stat screens display correct time values --- wadsrc/static/zscript/base.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 89eea6bdeb..c0373fab05 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -417,8 +417,7 @@ class Thinker : Object native play static clearscope int Tics2Seconds(int tics) { - // This compensates for one tic being slightly less than 1/35 of a second. - return int(tics * (0.98 / TICRATE)); + return int(tics / TICRATE); } } From 8fce9d9d2d3ff9e83eadbd24dbc7ba02e000a746 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Mon, 25 Dec 2017 05:49:48 -0500 Subject: [PATCH 042/110] - added menu option for 'i_soundinbackground' --- wadsrc/static/language.enu | 1 + wadsrc/static/menudef.txt | 2 ++ 2 files changed, 3 insertions(+) diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index a147eeb807..06af663074 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -2129,6 +2129,7 @@ SNDMNU_SFXVOLUME = "Sounds volume"; SNDMNU_MENUVOLUME = "Menu volume"; SNDMNU_MUSICVOLUME = "Music volume"; SNDMNU_MIDIDEVICE = "MIDI device"; +SNDMNU_BACKGROUND = "Sound in Background"; SNDMNU_UNDERWATERREVERB = "Underwater reverb"; SNDMNU_RANDOMIZEPITCHES = "Randomize pitches"; SNDMNU_CHANNELS = "Sound channels"; diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index faf57c054d..9b2c9a6003 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -1616,6 +1616,8 @@ OptionMenu SoundOptions protected Option "$SNDMNU_RANDOMIZEPITCHES", "snd_pitched", "OnOff" Slider "$SNDMNU_CHANNELS", "snd_channels", 64, 256, 8, 0 StaticText " " + Option "$SNDMNU_BACKGROUND", "i_soundinbackground", "OnOff" + StaticText " " ifoption(openal) { From 2eb51e5f798df0006bee4e58e8279838f9e49ff8 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Mon, 25 Dec 2017 18:14:56 +0200 Subject: [PATCH 043/110] Disabled modifier keys processing in UI by Cocoa backend Modifier keys no longer trigger bound actions in menu/console/chat --- src/posix/cocoa/i_input.mm | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/posix/cocoa/i_input.mm b/src/posix/cocoa/i_input.mm index 7eda4785df..745b0c6dca 100644 --- a/src/posix/cocoa/i_input.mm +++ b/src/posix/cocoa/i_input.mm @@ -588,6 +588,12 @@ void ProcessKeyboardEvent(NSEvent* theEvent) void ProcessKeyboardFlagsEvent(NSEvent* theEvent) { + if (GUICapture) + { + // Ignore events from modifier keys in menu/console/chat + return; + } + static const uint32_t FLAGS_MASK = NSDeviceIndependentModifierFlagsMask & ~NSNumericPadKeyMask; @@ -601,23 +607,15 @@ void ProcessKeyboardFlagsEvent(NSEvent* theEvent) } event_t event = {}; - event.type = modifiers > oldModifiers ? EV_KeyDown : EV_KeyUp; event.data1 = ModifierToDIK(deltaModifiers); oldModifiers = modifiers; - // Caps Lock is a modifier key which generates one event per state change - // but not per actual key press or release. So treat any event as key down - // Also its event should be not be posted in menu and console - if (DIK_CAPITAL == event.data1) { - if (GUICapture) - { - return; - } - + // Caps Lock is a modifier key which generates one event per state change + // but not per actual key press or release. So treat any event as key down event.type = EV_KeyDown; } From 1e7df5505e553f3a0f4596813423d96fbb67baac Mon Sep 17 00:00:00 2001 From: Major Cooke Date: Wed, 27 Dec 2017 14:38:17 -0600 Subject: [PATCH 044/110] Added GetPixelStretch to LevelLocals struct. --- src/g_level.cpp | 17 +++++++++++++++++ src/g_levellocals.h | 1 + wadsrc/static/zscript/base.txt | 1 + 3 files changed, 19 insertions(+) diff --git a/src/g_level.cpp b/src/g_level.cpp index 0ee56d6c3d..c333ba0740 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1952,6 +1952,23 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, SetInterMusic) return 0; } +//========================================================================== +// +// +// +//========================================================================== + +float FLevelLocals::PixelStretch() +{ + return level.info->pixelstretch; +} + +DEFINE_ACTION_FUNCTION(FLevelLocals, GetPixelStretch) +{ + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); + ACTION_RETURN_FLOAT(self->PixelStretch()); +} + //========================================================================== // // diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 505d797b6e..024e6302dd 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -46,6 +46,7 @@ struct FLevelLocals void Tick (); void AddScroller (int secnum); void SetInterMusic(const char *nextmap); + float PixelStretch(); uint8_t md5[16]; // for savegame validation. If the MD5 does not match the savegame won't be loaded. int time; // time in the hub diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index c0373fab05..237f8a0841 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -547,6 +547,7 @@ struct LevelLocals native native static void WorldDone(); native static void RemoveAllBots(bool fromlist); native void SetInterMusic(String nextmap); + native double GetPixelStretch(); native String FormatMapName(int mapnamecolor); native bool IsJumpingAllowed() const; native bool IsCrouchingAllowed() const; From a3399c1af2904e52230aa9c40565070f7fa9ff03 Mon Sep 17 00:00:00 2001 From: Christopher Bruns Date: Wed, 27 Dec 2017 13:05:13 -0800 Subject: [PATCH 045/110] Fix: Bind the default framebuffer before testing whether hardware stereo 3D is supported. This allows Nvidia 3D vision glasses to function correctly when gl_light_shadowmap is ON. Doc: Add "requires restart" to "enable quad stereo" option menu label, to help folks trying to setup 3D. --- src/gl/stereo3d/gl_quadstereo.cpp | 16 ++++++++-------- wadsrc/static/language.enu | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/gl/stereo3d/gl_quadstereo.cpp b/src/gl/stereo3d/gl_quadstereo.cpp index b65c109c8d..769f289069 100644 --- a/src/gl/stereo3d/gl_quadstereo.cpp +++ b/src/gl/stereo3d/gl_quadstereo.cpp @@ -50,19 +50,19 @@ void QuadStereo::checkInitialRenderContextState() { // Keep trying until we see at least one good OpenGL context to render to static bool bDecentContextWasFound = false; - if (!bDecentContextWasFound) { - // I'm using a "random" OpenGL call (glGetFramebufferAttachmentParameteriv) - // that appears to correlate with whether the context is ready - GLint attachmentType = GL_NONE; - glGetFramebufferAttachmentParameteriv(GL_DRAW_FRAMEBUFFER, GL_FRONT_LEFT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &attachmentType); - if (attachmentType != GL_NONE) // Finally, a useful OpenGL context + static int contextCheckCount = 0; + if ( (! bDecentContextWasFound) && (contextCheckCount < 200) ) + { + contextCheckCount += 1; + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); // This question is about the main screen display context + GLboolean supportsStereo, supportsBuffered; + glGetBooleanv(GL_DOUBLEBUFFER, &supportsBuffered); + if (supportsBuffered) // Finally, a useful OpenGL context { // This block will be executed exactly ONCE during a game run bDecentContextWasFound = true; // now we can stop checking every frame... // Now check whether this context supports hardware stereo - GLboolean supportsStereo, supportsBuffered; glGetBooleanv(GL_STEREO, &supportsStereo); - glGetBooleanv(GL_DOUBLEBUFFER, &supportsBuffered); bQuadStereoSupported = supportsStereo && supportsBuffered; leftEye.bQuadStereoSupported = bQuadStereoSupported; rightEye.bQuadStereoSupported = bQuadStereoSupported; diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index 06af663074..b05981a5a3 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -2725,7 +2725,7 @@ GLPREFMNU_AMBLIGHT = "Ambient light level"; GLPREFMNU_RENDERQUALITY = "Rendering quality"; GLPREFMNU_MENUBLUR = "Menu Blur"; GLPREFMNU_VRMODE = "Stereo 3D VR"; -GLPREFMNU_VRQUADSTEREO = "Enable Quad Stereo"; +GLPREFMNU_VRQUADSTEREO = "Enable Quad Stereo (Requires Restart)"; GLPREFMNU_MULTISAMPLE = "Multisample"; GLPREFMNU_TONEMAP = "Tonemap Mode"; GLPREFMNU_BLOOM = "Bloom effect"; From fa0082aef6fcb4aa84bb8bb2b8028ed47b1030e2 Mon Sep 17 00:00:00 2001 From: Major Cooke Date: Wed, 27 Dec 2017 19:21:11 -0600 Subject: [PATCH 046/110] Added ability to perform reverse fades with A_SetBlend --- src/g_shared/a_flashfader.cpp | 1 + src/p_actionfunctions.cpp | 7 ++++--- wadsrc/static/zscript/actor.txt | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/g_shared/a_flashfader.cpp b/src/g_shared/a_flashfader.cpp index 64c4ff2184..359c732a65 100644 --- a/src/g_shared/a_flashfader.cpp +++ b/src/g_shared/a_flashfader.cpp @@ -59,6 +59,7 @@ DFlashFader::DFlashFader (float r1, float g1, float b1, float a1, void DFlashFader::OnDestroy () { + Blends[1][3] = 0.f; // Needed in order to cancel out the secondary fade. SetBlend (1.f); Super::OnDestroy(); } diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index ea64c36d32..b7a817cd36 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -3575,16 +3575,17 @@ DEFINE_ACTION_FUNCTION(AActor, A_SetBlend) PARAM_FLOAT (alpha); PARAM_INT (tics); PARAM_COLOR_DEF (color2); + PARAM_FLOAT_DEF (alpha2); if (color == MAKEARGB(255,255,255,255)) color = 0; if (color2 == MAKEARGB(255,255,255,255)) color2 = 0; - if (color2.a == 0) - color2 = color; +// if (color2.a == 0) +// color2 = color; Create(color.r/255.f, color.g/255.f, color.b/255.f, float(alpha), - color2.r/255.f, color2.g/255.f, color2.b/255.f, 0.f, + color2.r/255.f, color2.g/255.f, color2.b/255.f, float(alpha2), float(tics)/TICRATE, self); return 0; } diff --git a/wadsrc/static/zscript/actor.txt b/wadsrc/static/zscript/actor.txt index 13f5140c9e..ee464a35b5 100644 --- a/wadsrc/static/zscript/actor.txt +++ b/wadsrc/static/zscript/actor.txt @@ -1030,7 +1030,7 @@ class Actor : Thinker native native void A_SpawnParticle(color color1, int flags = 0, int lifetime = 35, double size = 1, double angle = 0, double xoff = 0, double yoff = 0, double zoff = 0, double velx = 0, double vely = 0, double velz = 0, double accelx = 0, double accely = 0, double accelz = 0, double startalphaf = 1, double fadestepf = -1, double sizestep = 0); native void A_ExtChase(bool usemelee, bool usemissile, bool playactive = true, bool nightmarefast = false); native void A_DropInventory(class itemtype, int amount = -1); - native void A_SetBlend(color color1, double alpha, int tics, color color2 = 0); + native void A_SetBlend(color color1, double alpha, int tics, color color2 = 0, double alpha2 = 0.); deprecated("2.3") native void A_ChangeFlag(string flagname, bool value); native void A_ChangeCountFlags(int kill = FLAG_NO_CHANGE, int item = FLAG_NO_CHANGE, int secret = FLAG_NO_CHANGE); native void A_RaiseMaster(int flags = 0); From 10465c1d27c6fe78c4ac232d627753ac104abd06 Mon Sep 17 00:00:00 2001 From: Major Cooke Date: Wed, 27 Dec 2017 22:24:23 -0600 Subject: [PATCH 047/110] - Fade cancelling should only always be active for A_SetBlend fades, not always for everything else (such as ACS fades). --- src/g_shared/a_flashfader.cpp | 5 +++-- src/g_shared/a_sharedglobal.h | 5 +++-- src/p_actionfunctions.cpp | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/g_shared/a_flashfader.cpp b/src/g_shared/a_flashfader.cpp index 359c732a65..ed0e022028 100644 --- a/src/g_shared/a_flashfader.cpp +++ b/src/g_shared/a_flashfader.cpp @@ -50,16 +50,17 @@ DFlashFader::DFlashFader () DFlashFader::DFlashFader (float r1, float g1, float b1, float a1, float r2, float g2, float b2, float a2, - float time, AActor *who) + float time, AActor *who, bool terminate) : TotalTics ((int)(time*TICRATE)), StartTic (level.time), ForWho (who) { Blends[0][0]=r1; Blends[0][1]=g1; Blends[0][2]=b1; Blends[0][3]=a1; Blends[1][0]=r2; Blends[1][1]=g2; Blends[1][2]=b2; Blends[1][3]=a2; + Terminate = terminate; } void DFlashFader::OnDestroy () { - Blends[1][3] = 0.f; // Needed in order to cancel out the secondary fade. + if (Terminate) Blends[1][3] = 0.f; // Needed in order to cancel out the secondary fade. SetBlend (1.f); Super::OnDestroy(); } diff --git a/src/g_shared/a_sharedglobal.h b/src/g_shared/a_sharedglobal.h index 626985f937..ce2376cec0 100644 --- a/src/g_shared/a_sharedglobal.h +++ b/src/g_shared/a_sharedglobal.h @@ -84,19 +84,20 @@ class DFlashFader : public DThinker public: DFlashFader (float r1, float g1, float b1, float a1, float r2, float g2, float b2, float a2, - float time, AActor *who); + float time, AActor *who, bool terminate = false); void OnDestroy() override; void Serialize(FSerializer &arc); void Tick (); AActor *WhoFor() { return ForWho; } void Cancel (); + protected: float Blends[2][4]; int TotalTics; int StartTic; TObjPtr ForWho; - + bool Terminate; void SetBlend (float time); DFlashFader (); }; diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index b7a817cd36..1abe2c9390 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -3586,7 +3586,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_SetBlend) Create(color.r/255.f, color.g/255.f, color.b/255.f, float(alpha), color2.r/255.f, color2.g/255.f, color2.b/255.f, float(alpha2), - float(tics)/TICRATE, self); + float(tics)/TICRATE, self, true); return 0; } From 45531090a7f2754acfc0ba46e5624c261621d2dd Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 28 Dec 2017 00:53:30 -0500 Subject: [PATCH 048/110] - add 'playerrespawn' skill flag to allow gameplay mods to retroactively enable player respawns in single player on all maps --- src/g_game.cpp | 3 ++- src/g_level.h | 2 ++ src/g_skill.cpp | 8 ++++++++ src/p_mobj.cpp | 3 ++- wadsrc/static/zscript/constants.txt | 1 + 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/g_game.cpp b/src/g_game.cpp index 4044846728..82bff3f736 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1743,7 +1743,8 @@ static void G_QueueBody (AActor *body) EXTERN_CVAR(Bool, sv_singleplayerrespawn) void G_DoReborn (int playernum, bool freshbot) { - if (!multiplayer && !(level.flags2 & LEVEL2_ALLOWRESPAWN) && !sv_singleplayerrespawn) + if (!multiplayer && !(level.flags2 & LEVEL2_ALLOWRESPAWN) && !sv_singleplayerrespawn && + !G_SkillProperty(SKILLP_PlayerRespawn)) { if (BackupSaveName.Len() > 0 && FileExists (BackupSaveName.GetChars())) { // Load game from the last point it was saved diff --git a/src/g_level.h b/src/g_level.h index 7fb38a046c..78dcd55b11 100644 --- a/src/g_level.h +++ b/src/g_level.h @@ -538,6 +538,7 @@ enum ESkillProperty SKILLP_EasyKey, SKILLP_SlowMonsters, SKILLP_Infight, + SKILLP_PlayerRespawn, }; enum EFSkillProperty // floating point properties { @@ -595,6 +596,7 @@ struct FSkillInfo double FriendlyHealth; bool NoPain; int Infighting; + bool PlayerRespawn; FSkillInfo() {} FSkillInfo(const FSkillInfo &other) diff --git a/src/g_skill.cpp b/src/g_skill.cpp index 6e23c9523a..5c252274fb 100644 --- a/src/g_skill.cpp +++ b/src/g_skill.cpp @@ -89,6 +89,7 @@ void FMapInfoParser::ParseSkill () skill.FriendlyHealth = 1.; skill.NoPain = false; skill.Infighting = 0; + skill.PlayerRespawn = false; sc.MustGetString(); skill.Name = sc.String; @@ -155,6 +156,10 @@ void FMapInfoParser::ParseSkill () { skill.NoMenu = true; } + else if (sc.Compare ("playerrespawn")) + { + skill.PlayerRespawn = true; + } else if (sc.Compare("respawntime")) { ParseAssign(); @@ -397,6 +402,9 @@ int G_SkillProperty(ESkillProperty prop) if (AllSkills[gameskill].Infighting == LEVEL2_TOTALINFIGHTING) return 1; if (AllSkills[gameskill].Infighting == LEVEL2_NOINFIGHTING) return -1; return infighting; + + case SKILLP_PlayerRespawn: + return AllSkills[gameskill].PlayerRespawn; } } return 0; diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 561334a52d..dc0e76ad1f 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -5648,7 +5648,8 @@ APlayerPawn *P_SpawnPlayer (FPlayerStart *mthing, int playernum, int flags) { // Give all cards in death match mode. p->mo->GiveDeathmatchInventory (); } - else if ((multiplayer || (level.flags2 & LEVEL2_ALLOWRESPAWN) || sv_singleplayerrespawn) && state == PST_REBORN && oldactor != NULL) + else if ((multiplayer || (level.flags2 & LEVEL2_ALLOWRESPAWN) || sv_singleplayerrespawn || + !!G_SkillProperty(SKILLP_PlayerRespawn)) && state == PST_REBORN && oldactor != NULL) { // Special inventory handling for respawning in coop p->mo->FilterCoopRespawnInventory (oldactor); } diff --git a/wadsrc/static/zscript/constants.txt b/wadsrc/static/zscript/constants.txt index dc44832534..e35af3a80f 100644 --- a/wadsrc/static/zscript/constants.txt +++ b/wadsrc/static/zscript/constants.txt @@ -962,6 +962,7 @@ enum ESkillProperty SKILLP_EasyKey, SKILLP_SlowMonsters, SKILLP_Infight, + SKILLP_PlayerRespawn, }; enum EFSkillProperty // floating point properties { From 5c602b1ec098a0a61b3bdd187b13cfa23fed8c8d Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 28 Dec 2017 01:41:56 -0500 Subject: [PATCH 049/110] - fixed: FSkillInfo operator "=" did not set PlayerRespawn value --- src/g_skill.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/g_skill.cpp b/src/g_skill.cpp index 5c252274fb..90ed9f723d 100644 --- a/src/g_skill.cpp +++ b/src/g_skill.cpp @@ -558,6 +558,7 @@ FSkillInfo &FSkillInfo::operator=(const FSkillInfo &other) Infighting = other.Infighting; ArmorFactor = other.ArmorFactor; HealthFactor = other.HealthFactor; + PlayerRespawn = other.PlayerRespawn; return *this; } From fbb931b759f4b2cef2f1bd1c1eabf0f222a4d9c2 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Thu, 28 Dec 2017 10:21:36 +0200 Subject: [PATCH 050/110] Improved Advanced Sound Options menu Added option for FluidSynth chorus Removed fractional part from FluidSynth voices option Removed duplicate localized string --- wadsrc/static/language.enu | 3 +-- wadsrc/static/menudef.txt | 5 +++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index b05981a5a3..8b40c52da1 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -2162,11 +2162,10 @@ ADVSNDMNU_FLUIDSYNTH = "FluidSynth"; ADVSNDMNU_FLUIDPATCHSET = "Patch set"; ADVSNDMNU_FLUIDGAIN = "Gain"; ADVSNDMNU_REVERB = "Reverb"; -ADVSNDMNU_FLUIDVOICES = "MIDI voices"; +ADVSNDMNU_CHORUS = "Chorus"; ADVSNDMNU_TIMIDITY = "Timidity++"; ADVSNDMNU_TIMIDITYEXE = "Path for executable"; ADVSNDMNU_TIMIDITYCONFIG = "Timidity config file"; -ADVSNDMNU_TIMIDITYCHORUS = "Chorus"; ADVSNDMNU_TIMIDITYVOLUME = "Relative volume"; ADVSNDMNU_WILDMIDI = "WildMidi"; ADVSNDMNU_WILDMIDICONFIG = "WildMidi config file"; diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 9b2c9a6003..43c86b7124 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -1678,7 +1678,8 @@ OptionMenu AdvSoundOptions protected SubMenu "$ADVSNDMNU_SELCONFIG", "FluidPatchsetMenu" Slider "$ADVSNDMNU_FLUIDGAIN", "fluid_gain", 0, 10, 0.5, 1 Option "$ADVSNDMNU_REVERB", "fluid_reverb", "OnOff" - Slider "$ADVSNDMNU_FLUIDVOICES", "fluid_voices", 16, 4096, 16, 1 + Option "$ADVSNDMNU_CHORUS", "fluid_chorus", "OnOff" + Slider "$ADVSNDMNU_MIDIVOICES", "fluid_voices", 16, 4096, 16, 0 // Leaving out the more advanced stuff for now. StaticText " " StaticText "$ADVSNDMNU_TIMIDITY", 1 @@ -1690,7 +1691,7 @@ OptionMenu AdvSoundOptions protected TextField "$ADVSNDMNU_TIMIDITYCONFIG", "timidity_config" SubMenu "$ADVSNDMNU_SELCONFIG", "TimidityConfigMenu" Option "$ADVSNDMNU_REVERB", "timidity_reverb", "OnOff" - Option "$ADVSNDMNU_TIMIDITYCHORUS", "timidity_chorus", "OnOff" + Option "$ADVSNDMNU_CHORUS", "timidity_chorus", "OnOff" Slider "$ADVSNDMNU_TIMIDITYVOLUME", "timidity_mastervolume", 0, 4, 0.2, 1 StaticText " " StaticText "$ADVSNDMNU_WILDMIDI", 1 From 8ca3427850c585e4befaab028737498702b5fbc5 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Thu, 28 Dec 2017 18:32:26 +0200 Subject: [PATCH 051/110] Fixed applying of Doom 64 lighting to horizon portals https://forum.zdoom.org/viewtopic.php?t=58878 --- src/gl/scene/gl_portal.cpp | 3 +++ src/gl/scene/gl_portal.h | 1 + src/gl/scene/gl_walls.cpp | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/gl/scene/gl_portal.cpp b/src/gl/scene/gl_portal.cpp index 2e5df1da9d..ed38127662 100644 --- a/src/gl/scene/gl_portal.cpp +++ b/src/gl/scene/gl_portal.cpp @@ -1180,6 +1180,7 @@ void GLHorizonPortal::DrawContents() gl_RenderState.SetMaterial(gltexture, CLAMP_NONE, 0, -1, false); + gl_RenderState.SetObjectColor(origin->specialcolor); gl_SetPlaneTextureRotation(sp, gltexture); gl_RenderState.AlphaFunc(GL_GEQUAL, 0.f); @@ -1237,6 +1238,7 @@ void GLEEHorizonPortal::DrawContents() horz.plane.GetFromSector(sector, sector_t::ceiling); horz.lightlevel = gl_ClampLight(sector->GetCeilingLight()); horz.colormap = sector->Colormap; + horz.specialcolor = 0xffffffff; if (portal->mType == PORTS_PLANE) { horz.plane.Texheight = r_viewpoint.Pos.Z + fabs(horz.plane.Texheight); @@ -1250,6 +1252,7 @@ void GLEEHorizonPortal::DrawContents() horz.plane.GetFromSector(sector, sector_t::floor); horz.lightlevel = gl_ClampLight(sector->GetFloorLight()); horz.colormap = sector->Colormap; + horz.specialcolor = 0xffffffff; if (portal->mType == PORTS_PLANE) { horz.plane.Texheight = r_viewpoint.Pos.Z - fabs(horz.plane.Texheight); diff --git a/src/gl/scene/gl_portal.h b/src/gl/scene/gl_portal.h index 9ef8cf5f72..010472c977 100644 --- a/src/gl/scene/gl_portal.h +++ b/src/gl/scene/gl_portal.h @@ -48,6 +48,7 @@ struct GLHorizonInfo GLSectorPlane plane; int lightlevel; FColormap colormap; + PalEntry specialcolor; }; struct GLSkyInfo diff --git a/src/gl/scene/gl_walls.cpp b/src/gl/scene/gl_walls.cpp index 018f8ab678..529d46bb56 100644 --- a/src/gl/scene/gl_walls.cpp +++ b/src/gl/scene/gl_walls.cpp @@ -441,6 +441,7 @@ bool GLWall::DoHorizon(seg_t * seg,sector_t * fs, vertex_t * v1,vertex_t * v2) hi.plane.GetFromSector(fs, sector_t::ceiling); hi.lightlevel = gl_ClampLight(fs->GetCeilingLight()); hi.colormap = fs->Colormap; + hi.specialcolor = fs->SpecialColors[sector_t::ceiling]; if (fs->e->XFloor.ffloors.Size()) { @@ -469,6 +470,7 @@ bool GLWall::DoHorizon(seg_t * seg,sector_t * fs, vertex_t * v1,vertex_t * v2) hi.plane.GetFromSector(fs, sector_t::floor); hi.lightlevel = gl_ClampLight(fs->GetFloorLight()); hi.colormap = fs->Colormap; + hi.specialcolor = fs->SpecialColors[sector_t::floor]; if (fs->e->XFloor.ffloors.Size()) { From a441cea35076b6ee4abe09c5e0f08c7d83b47af5 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 28 Dec 2017 11:04:43 -0500 Subject: [PATCH 052/110] - interpolate particles --- src/gl/scene/gl_sprite.cpp | 14 +++++++++++--- src/polyrenderer/scene/poly_particle.cpp | 5 ++++- src/swrenderer/things/r_particle.cpp | 22 +++++++++++++++------- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/gl/scene/gl_sprite.cpp b/src/gl/scene/gl_sprite.cpp index a773373ef0..edd0da1d98 100644 --- a/src/gl/scene/gl_sprite.cpp +++ b/src/gl/scene/gl_sprite.cpp @@ -40,6 +40,7 @@ #include "events.h" #include "actorinlines.h" #include "r_data/r_vanillatrans.h" +#include "i_time.h" #include "gl/system/gl_interface.h" #include "gl/system/gl_framebuffer.h" @@ -1209,9 +1210,16 @@ void GLSprite::ProcessParticle (particle_t *particle, sector_t *sector)//, int s } } - x = particle->Pos.X; - y = particle->Pos.Y; - z = particle->Pos.Z; + double timefrac = r_viewpoint.TicFrac; + if (paused || bglobal.freeze) + timefrac = 0.; + float xvf = (particle->Vel.X) * timefrac; + float yvf = (particle->Vel.Y) * timefrac; + float zvf = (particle->Vel.Z) * timefrac; + + x = float(particle->Pos.X) + xvf; + y = float(particle->Pos.Y) + yvf; + z = float(particle->Pos.Z) + zvf; float factor; if (gl_particles_style == 1) factor = 1.3f / 7.f; diff --git a/src/polyrenderer/scene/poly_particle.cpp b/src/polyrenderer/scene/poly_particle.cpp index 6b5e1e9c56..0ab3beb229 100644 --- a/src/polyrenderer/scene/poly_particle.cpp +++ b/src/polyrenderer/scene/poly_particle.cpp @@ -34,7 +34,10 @@ EXTERN_CVAR(Int, gl_particles_style) void RenderPolyParticle::Render(PolyRenderThread *thread, const TriMatrix &worldToClip, const PolyClipPlane &clipPlane, particle_t *particle, subsector_t *sub, uint32_t stencilValue) { - DVector3 pos = particle->Pos; + double timefrac = r_viewpoint.TicFrac; + if (paused || bglobal.freeze) + timefrac = 0.; + DVector3 pos = particle->Pos + (particle->Vel * timefrac); double psize = particle->size / 8.0; double zpos = pos.Z; diff --git a/src/swrenderer/things/r_particle.cpp b/src/swrenderer/things/r_particle.cpp index 33d2a6d093..7c2d88f481 100644 --- a/src/swrenderer/things/r_particle.cpp +++ b/src/swrenderer/things/r_particle.cpp @@ -77,7 +77,15 @@ namespace swrenderer double xscale, yscale; int x1, x2, y1, y2; sector_t* heightsec = NULL; - + + double timefrac = r_viewpoint.TicFrac; + if (paused || bglobal.freeze) + timefrac = 0.; + + double ippx = particle->Pos.X + particle->Vel.X * timefrac; + double ippy = particle->Pos.Y + particle->Vel.Y * timefrac; + double ippz = particle->Pos.Z + particle->Vel.Z * timefrac; + RenderPortal *renderportal = thread->Portal.get(); // [ZZ] Particle not visible through the portal plane @@ -85,8 +93,8 @@ namespace swrenderer return; // transform the origin point - tr_x = particle->Pos.X - thread->Viewport->viewpoint.Pos.X; - tr_y = particle->Pos.Y - thread->Viewport->viewpoint.Pos.Y; + tr_x = ippx - thread->Viewport->viewpoint.Pos.X; + tr_y = ippy - thread->Viewport->viewpoint.Pos.Y; tz = tr_x * thread->Viewport->viewpoint.TanCos + tr_y * thread->Viewport->viewpoint.TanSin; @@ -121,7 +129,7 @@ namespace swrenderer auto viewport = thread->Viewport.get(); yscale = xscale; // YaspectMul is not needed for particles as they should always be square - ty = (particle->Pos.Z - viewport->viewpoint.Pos.Z) * thread->Viewport->YaspectMul; + ty = (ippz - viewport->viewpoint.Pos.Z) * thread->Viewport->YaspectMul; y1 = xs_RoundToInt(viewport->CenterY - (ty + psize) * yscale); y2 = xs_RoundToInt(viewport->CenterY - (ty - psize) * yscale); @@ -184,9 +192,9 @@ namespace swrenderer map = GetColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites], true); } - if (botpic != skyflatnum && particle->Pos.Z < botplane->ZatPoint(particle->Pos)) + if (botpic != skyflatnum && ippz < botplane->ZatPoint(particle->Pos)) return; - if (toppic != skyflatnum && particle->Pos.Z >= topplane->ZatPoint(particle->Pos)) + if (toppic != skyflatnum && ippz >= topplane->ZatPoint(particle->Pos)) return; // store information in a vissprite @@ -199,7 +207,7 @@ namespace swrenderer // vis->yscale *= InvZtoScale; vis->depth = (float)tz; vis->idepth = float(1 / tz); - vis->gpos = { (float)particle->Pos.X, (float)particle->Pos.Y, (float)particle->Pos.Z }; + vis->gpos = { (float)ippx, (float)ippy, (float)ippz }; vis->y1 = y1; vis->y2 = y2; vis->x1 = x1; From b8415199c9b8edf5d999fcdd474a5f44e1566418 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Tue, 5 Dec 2017 00:32:37 +0100 Subject: [PATCH 053/110] Fix culling bug --- src/polyrenderer/drawers/poly_triangle.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/polyrenderer/drawers/poly_triangle.cpp b/src/polyrenderer/drawers/poly_triangle.cpp index 990ca581db..83a6f9ed79 100644 --- a/src/polyrenderer/drawers/poly_triangle.cpp +++ b/src/polyrenderer/drawers/poly_triangle.cpp @@ -333,7 +333,7 @@ void PolyTriangleDrawer::draw_shaded_triangle(const ShadedTriVertex *vert, bool args->v1 = &clippedvert[numclipvert - 1]; args->v2 = &clippedvert[i - 1]; args->v3 = &clippedvert[i - 2]; - if (is_frontfacing(args) && args->CalculateGradients()) + if (is_frontfacing(args) == ccw && args->CalculateGradients()) ScreenTriangle::Draw(args, thread); } } @@ -344,7 +344,7 @@ void PolyTriangleDrawer::draw_shaded_triangle(const ShadedTriVertex *vert, bool args->v1 = &clippedvert[0]; args->v2 = &clippedvert[i - 1]; args->v3 = &clippedvert[i]; - if (!is_frontfacing(args) && args->CalculateGradients()) + if (is_frontfacing(args) != ccw && args->CalculateGradients()) ScreenTriangle::Draw(args, thread); } } From 25d53ecd2cc9228f651e852184020c5bc0481225 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 29 Dec 2017 09:39:01 +0200 Subject: [PATCH 054/110] Enabled position independent executable for generic GCC/Clang This affects mostly Linux (and probably MinGW) as default toolchains for Windows and macOS have the corresponding option turned on by default --- CMakeLists.txt | 6 ++++++ src/m_fixed.h | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 345fd480db..5809118d89 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -234,6 +234,12 @@ else() if( APPLE AND "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" ) set( ALL_C_FLAGS "-static-libgcc" ) endif() + + if( NOT APPLE ) + # Generic GCC/Clang requires position independent executable to be enabled explicitly + set( ALL_C_FLAGS "${ALL_C_FLAGS} -fPIE" ) + set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie" ) + endif() endif() set( CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${REL_LINKER_FLAGS}" ) diff --git a/src/m_fixed.h b/src/m_fixed.h index b751d6b1fa..8bbb2dbf97 100644 --- a/src/m_fixed.h +++ b/src/m_fixed.h @@ -7,7 +7,7 @@ // Unfortunately, the Scale function still gets badly handled on 32 bit x86 platforms so it's the last remaining piece of inline assembly // GCC inlines -#if defined(__GNUC__) && defined(__i386__) && !defined(__clang__) +#if defined(__GNUC__) && defined(__i386__) && !defined(__clang__) && !defined(__PIC__) #ifndef alloca // MinGW does not seem to come with alloca defined. #define alloca __builtin_alloca From 996bddd602fe2015fbdc1d44fae7650d8cc715d7 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 29 Dec 2017 09:42:03 +0200 Subject: [PATCH 055/110] Exposed pixel stretch to ZScript as member variable instead of function https://forum.zdoom.org/viewtopic.php?t=58539 --- src/g_level.cpp | 20 +++----------------- src/g_levellocals.h | 2 +- wadsrc/static/zscript/base.txt | 2 +- 3 files changed, 5 insertions(+), 19 deletions(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index c333ba0740..cb5bc4baff 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1481,6 +1481,8 @@ void G_InitLevelLocals () level.outsidefogdensity = info->outsidefogdensity; level.skyfog = info->skyfog; + level.pixelstretch = info->pixelstretch; + compatflags.Callback(); compatflags2.Callback(); @@ -1952,23 +1954,6 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, SetInterMusic) return 0; } -//========================================================================== -// -// -// -//========================================================================== - -float FLevelLocals::PixelStretch() -{ - return level.info->pixelstretch; -} - -DEFINE_ACTION_FUNCTION(FLevelLocals, GetPixelStretch) -{ - PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); - ACTION_RETURN_FLOAT(self->PixelStretch()); -} - //========================================================================== // // @@ -2011,6 +1996,7 @@ DEFINE_FIELD(FLevelLocals, teamdamage) DEFINE_FIELD(FLevelLocals, fogdensity) DEFINE_FIELD(FLevelLocals, outsidefogdensity) DEFINE_FIELD(FLevelLocals, skyfog) +DEFINE_FIELD(FLevelLocals, pixelstretch) DEFINE_FIELD_BIT(FLevelLocals, flags, noinventorybar, LEVEL_NOINVENTORYBAR) DEFINE_FIELD_BIT(FLevelLocals, flags, monsterstelefrag, LEVEL_MONSTERSTELEFRAG) DEFINE_FIELD_BIT(FLevelLocals, flags, actownspecial, LEVEL_ACTOWNSPECIAL) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 024e6302dd..60cb30df08 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -46,7 +46,6 @@ struct FLevelLocals void Tick (); void AddScroller (int secnum); void SetInterMusic(const char *nextmap); - float PixelStretch(); uint8_t md5[16]; // for savegame validation. If the MD5 does not match the savegame won't be loaded. int time; // time in the hub @@ -149,6 +148,7 @@ struct FLevelLocals int outsidefogdensity; int skyfog; + float pixelstretch; bool IsJumpingAllowed() const; bool IsCrouchingAllowed() const; diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 237f8a0841..4ffe34dced 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -536,6 +536,7 @@ struct LevelLocals native native readonly int fogdensity; native readonly int outsidefogdensity; native readonly int skyfog; + native readonly float pixelstretch; // level_info_t *info cannot be done yet. native String GetUDMFString(int type, int index, Name key); @@ -547,7 +548,6 @@ struct LevelLocals native native static void WorldDone(); native static void RemoveAllBots(bool fromlist); native void SetInterMusic(String nextmap); - native double GetPixelStretch(); native String FormatMapName(int mapnamecolor); native bool IsJumpingAllowed() const; native bool IsCrouchingAllowed() const; From a670e79b8ac989235a77610422c7c65a3c5f8ac7 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 29 Dec 2017 11:47:30 +0200 Subject: [PATCH 056/110] Applied texture offsets and scales on animated doors https://forum.zdoom.org/viewtopic.php?t=58892 --- src/p_doors.cpp | 10 +++++++--- src/r_defs.h | 10 +++++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/p_doors.cpp b/src/p_doors.cpp index 43deaeaf87..abfe81722c 100644 --- a/src/p_doors.cpp +++ b/src/p_doors.cpp @@ -711,9 +711,13 @@ DAnimatedDoor::DAnimatedDoor (sector_t *sec, line_t *line, int speed, int delay, } - picnum = m_Line1->sidedef[0]->GetTexture(side_t::top); - m_Line1->sidedef[0]->SetTexture(side_t::mid, picnum); - m_Line2->sidedef[0]->SetTexture(side_t::mid, picnum); + auto &tex1 = m_Line1->sidedef[0]->textures; + tex1[side_t::mid].InitFrom(tex1[side_t::top]); + + auto &tex2 = m_Line2->sidedef[0]->textures; + tex2[side_t::mid].InitFrom(tex2[side_t::top]); + + picnum = tex1[side_t::top].texture; // don't forget texture scaling here! FTexture *tex = TexMan[picnum]; diff --git a/src/r_defs.h b/src/r_defs.h index 1ac282cf92..02da2ac0ee 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -1139,7 +1139,15 @@ struct side_t double yScale; TObjPtr interpolation; FTextureID texture; - //int Light; + + void InitFrom(const part &other) + { + if (texture.isNull()) texture = other.texture; + if (0.0 == xOffset) xOffset = other.xOffset; + if (0.0 == yOffset) yOffset = other.yOffset; + if (1.0 == xScale && 0.0 != other.xScale) xScale = other.xScale; + if (1.0 == yScale && 0.0 != other.yScale) yScale = other.yScale; + } }; sector_t* sector; // Sector the SideDef is facing. From 33213f5d5de2c3ca5f8ab446a36e7a48e2a64027 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 29 Dec 2017 14:37:09 +0200 Subject: [PATCH 057/110] Fixed rendering of wrapped midtex with sky ceiling https://forum.zdoom.org/viewtopic.php?t=58311 --- src/gl/scene/gl_walls.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gl/scene/gl_walls.cpp b/src/gl/scene/gl_walls.cpp index 529d46bb56..470cd97768 100644 --- a/src/gl/scene/gl_walls.cpp +++ b/src/gl/scene/gl_walls.cpp @@ -828,7 +828,7 @@ void GLWall::DoMidTexture(seg_t * seg, bool drawfogboundary, back->GetTexture(sector_t::ceiling) == skyflatnum) { // intra-sky lines do not clip the texture at all if there's no upper texture - topleft = topright = texturetop; + topleft = topright = wrap ? 1e16f : texturetop; } else { From 19d25b00a392220a530637775ebf5cba40c7ec6b Mon Sep 17 00:00:00 2001 From: SashaTheRed Date: Fri, 29 Dec 2017 14:55:19 +0200 Subject: [PATCH 058/110] Localized 'Press Space...' in player setup menu https://forum.zdoom.org/viewtopic.php?t=58881 --- wadsrc/static/language.enu | 3 +++ wadsrc/static/zscript/menu/playermenu.txt | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index 8b40c52da1..1cb2460478 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -1795,6 +1795,9 @@ PLYRMNU_PLAYERGENDER = "Gender"; PLYRMNU_AUTOAIM = "Autoaim"; PLYRMNU_SWITCHONPICKUP = "Switch on pickup"; PLYRMNU_ALWAYSRUN = "Always Run"; +PLYRMNU_PRESSSPACE = "PRESS \cjSPACE"; +PLYRMNU_SEEFRONT = "TO SEE FRONT"; +PLYRMNU_SEEBACK = "TO SEE BACK"; // Display Options DSPLYMNU_TITLE = "DISPLAY OPTIONS"; diff --git a/wadsrc/static/zscript/menu/playermenu.txt b/wadsrc/static/zscript/menu/playermenu.txt index dac376ee90..09d05b0c2c 100644 --- a/wadsrc/static/zscript/menu/playermenu.txt +++ b/wadsrc/static/zscript/menu/playermenu.txt @@ -585,11 +585,11 @@ class PlayerMenu : ListMenu override void Drawer () { Super.Drawer(); - String str = "PRESS " .. TEXTCOLOR_WHITE .. "SPACE"; + String str = Stringtable.Localize("$PLYRMNU_PRESSSPACE"); screen.DrawText (SmallFont, Font.CR_GOLD, 320 - 32 - 32 - SmallFont.StringWidth (str)/2, 50 + 48 + 70, str, DTA_Clean, true); - str = mRotation ? "TO SEE FRONT" : "TO SEE BACK"; + str = Stringtable.Localize(mRotation ? "$PLYRMNU_SEEFRONT" : "$PLYRMNU_SEEBACK"); screen.DrawText (SmallFont, Font.CR_GOLD, 320 - 32 - 32 - SmallFont.StringWidth (str)/2, 50 + 48 + 70 + SmallFont.GetHeight (), str, DTA_Clean, true); } -} \ No newline at end of file +} From a3d1efc8d63988214c8eab19dbaf1af15a0fec67 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 30 Dec 2017 12:08:32 +0200 Subject: [PATCH 059/110] Better angle selection for rotated automap sprites https://forum.zdoom.org/viewtopic.php?t=58348 --- src/am_map.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index 2d80b59a0e..452f82b785 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -2950,7 +2950,7 @@ void AM_drawThings () const size_t spriteIndex = sprite.spriteframes + (show > 1 ? t->frame : 0); frame = &SpriteFrames[spriteIndex]; - DAngle angle = 270. -t->Angles.Yaw; + DAngle angle = 270. + 22.5 - t->Angles.Yaw; if (frame->Texture[0] != frame->Texture[1]) angle += 180. / 16; if (am_rotate == 1 || (am_rotate == 2 && viewactive)) { From 8f7ca00d1930bc9c1671fa36fd7f41ebaf3cee89 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 30 Dec 2017 12:10:39 +0200 Subject: [PATCH 060/110] Added optional angles to player's coordinates display Set hud_showangles CVAR to display pitch, yaw, roll below player's coordinates --- src/g_shared/shared_hud.cpp | 49 ++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/src/g_shared/shared_hud.cpp b/src/g_shared/shared_hud.cpp index b3e9532d8d..9dc90d908a 100644 --- a/src/g_shared/shared_hud.cpp +++ b/src/g_shared/shared_hud.cpp @@ -96,6 +96,7 @@ CVAR (Int, hud_armor_yellow, 50, CVAR_ARCHIVE) // armor amount less than whic CVAR (Int, hud_armor_green, 100, CVAR_ARCHIVE) // armor amount above is blue, below is green CVAR (Bool, hud_berserk_health, true, CVAR_ARCHIVE); // when found berserk pack instead of health box +CVAR (Bool, hud_showangles, false, CVAR_ARCHIVE) // show player's pitch, yaw, roll CVAR (Int, hudcolor_titl, CR_YELLOW, CVAR_ARCHIVE) // color of automap title CVAR (Int, hudcolor_time, CR_RED, CVAR_ARCHIVE) // color of level/hub time @@ -907,20 +908,44 @@ static void DrawCoordinates(player_t * CPlayer) DTA_KeepRatio, true, DTA_VirtualWidth, hudwidth, DTA_VirtualHeight, hudheight, TAG_DONE); - mysnprintf(coordstr, countof(coordstr), "X: %d", int(pos.X)); - screen->DrawText(SmallFont, hudcolor_xyco, xpos, ypos+2*h, coordstr, - DTA_KeepRatio, true, - DTA_VirtualWidth, hudwidth, DTA_VirtualHeight, hudheight, TAG_DONE); + int linenum = 3; - mysnprintf(coordstr, countof(coordstr), "Y: %d", int(pos.Y)); - screen->DrawText(SmallFont, hudcolor_xyco, xpos, ypos+3*h, coordstr, - DTA_KeepRatio, true, - DTA_VirtualWidth, hudwidth, DTA_VirtualHeight, hudheight, TAG_DONE); + typedef struct CoordEntry + { + const char* const format; + double value; + } + CoordEntryList[3]; - mysnprintf(coordstr, countof(coordstr), "Z: %d", int(pos.Z)); - screen->DrawText(SmallFont, hudcolor_xyco, xpos, ypos+4*h, coordstr, - DTA_KeepRatio, true, - DTA_VirtualWidth, hudwidth, DTA_VirtualHeight, hudheight, TAG_DONE); + const auto drawentries = [&](CoordEntryList&& entries) + { + for (const auto& entry : entries) + { + mysnprintf(coordstr, countof(coordstr), entry.format, entry.value); + screen->DrawText(SmallFont, hudcolor_xyco, xpos, ypos + linenum * h, coordstr, + DTA_KeepRatio, true, + DTA_VirtualWidth, hudwidth, DTA_VirtualHeight, hudheight, TAG_DONE); + ++linenum; + } + }; + + drawentries({ + { "X: %.0f", pos.X }, + { "Y: %.0f", pos.Y }, + { "Z: %.0f", pos.Z } + }); + + if (hud_showangles) + { + const DRotator& angles = CPlayer->mo->Angles; + ++linenum; + + drawentries({ + { "P: %.1f", angles.Pitch.Degrees }, + { "Y: %.1f", (90.0 - angles.Yaw).Normalized360().Degrees }, + { "R: %.1f", angles.Roll.Degrees }, + }); + } } //--------------------------------------------------------------------------- From 340f1fce30b633b07bf49e0ec65682c123ab2eef Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sat, 30 Dec 2017 16:20:52 -0500 Subject: [PATCH 061/110] - load Doom translations when parsing UMAPINFO in order to activate the correct boss specials - one typo (only on a comment) change --- src/g_mapinfo.cpp | 2 +- src/umapinfo.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/g_mapinfo.cpp b/src/g_mapinfo.cpp index 0481c17846..951b6a346d 100644 --- a/src/g_mapinfo.cpp +++ b/src/g_mapinfo.cpp @@ -2233,7 +2233,7 @@ void G_ParseMapInfo (FString basemapinfo) } if (nindex != 2) { - CommitUMapinfo(&gamedefaults); // UMPAINFOs are collected until a regular MAPINFO is found so that they properly use the base settings. + CommitUMapinfo(&gamedefaults); // UMAPINFOs are collected until a regular MAPINFO is found so that they properly use the base settings. FMapInfoParser parse(nindex == 1 ? FMapInfoParser::FMT_New : FMapInfoParser::FMT_Unknown); level_info_t defaultinfo; parse.ParseMapInfo(lump, gamedefaults, defaultinfo); diff --git a/src/umapinfo.cpp b/src/umapinfo.cpp index b6b435c40f..b332a072ad 100644 --- a/src/umapinfo.cpp +++ b/src/umapinfo.cpp @@ -332,6 +332,8 @@ static int ParseMapEntry(FScanner &scanner, UMapEntry *val) int ParseUMapInfo(int lumpnum) { + P_LoadTranslator("xlat/doom.txt"); + FScanner scanner(lumpnum); unsigned int i; From a5ded11994210e66fdad5fd28c7002c43f91d9e5 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sat, 30 Dec 2017 16:36:29 -0500 Subject: [PATCH 062/110] - load translator from gameinfo instead of Doom for UMAPINFO --- src/umapinfo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/umapinfo.cpp b/src/umapinfo.cpp index b332a072ad..745cdb94e2 100644 --- a/src/umapinfo.cpp +++ b/src/umapinfo.cpp @@ -332,7 +332,7 @@ static int ParseMapEntry(FScanner &scanner, UMapEntry *val) int ParseUMapInfo(int lumpnum) { - P_LoadTranslator("xlat/doom.txt"); + P_LoadTranslator(gameinfo.translator); FScanner scanner(lumpnum); unsigned int i; From 40fd816d544319d26146e931bf1d9f200a1e1a76 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 31 Dec 2017 11:34:12 +0200 Subject: [PATCH 063/110] Improved compatibility of blocking lines handling Only the first blocking line changes contact state during line iteration This reverts 3b818171d5f1796c0c1ff2acc0f06a233900324e https://forum.zdoom.org/viewtopic.php?t=57870 --- src/p_map.cpp | 132 ++++++++++++++++++++++++++++---------------------- 1 file changed, 75 insertions(+), 57 deletions(-) diff --git a/src/p_map.cpp b/src/p_map.cpp index d71b22d850..56eea2e1f0 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -856,7 +856,7 @@ static int LineIsBelow(line_t *line, AActor *actor) //========================================================================== static // killough 3/26/98: make static -bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::CheckResult &cres, const FBoundingBox &box, FCheckPosition &tm) +bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::CheckResult &cres, const FBoundingBox &box, FCheckPosition &tm, const bool wasfit) { line_t *ld = cres.line; bool rail = false; @@ -902,12 +902,15 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec double portz = cres.line->frontsector->GetPortalPlaneZ(sector_t::ceiling); if (tm.thing->Z() < portz && tm.thing->Z() + tm.thing->MaxStepHeight >= portz && tm.floorz < portz) { - tm.floorz = portz; - tm.floorsector = cres.line->frontsector; - tm.floorpic = cres.line->sidedef[0]->GetTexture(side_t::mid); - tm.floorterrain = 0; - tm.portalstep = true; - tm.portalgroup = cres.line->frontsector->GetOppositePortalGroup(sector_t::ceiling); + if (wasfit) + { + tm.floorz = portz; + tm.floorsector = cres.line->frontsector; + tm.floorpic = cres.line->sidedef[0]->GetTexture(side_t::mid); + tm.floorterrain = 0; + tm.portalstep = true; + tm.portalgroup = cres.line->frontsector->GetOppositePortalGroup(sector_t::ceiling); + } return true; } } @@ -916,7 +919,10 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec { P_DamageMobj(tm.thing, NULL, NULL, tm.thing->Mass >> 5, NAME_Melee); } - tm.thing->BlockingLine = ld; + if (wasfit) + { + tm.thing->BlockingLine = ld; + } CheckForPushSpecial(ld, 0, tm.thing); return false; } @@ -948,12 +954,15 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec if (state == -1) return true; if (state == 1) { - // the line should not block but we should set the ceilingz to the portal boundary so that we can't float up into that line. - double portalz = cres.line->frontsector->GetPortalPlaneZ(sector_t::floor); - if (portalz < tm.ceilingz) + if (wasfit) { - tm.ceilingz = portalz; - tm.ceilingsector = cres.line->frontsector; + // the line should not block but we should set the ceilingz to the portal boundary so that we can't float up into that line. + double portalz = cres.line->frontsector->GetPortalPlaneZ(sector_t::floor); + if (portalz < tm.ceilingz) + { + tm.ceilingz = portalz; + tm.ceilingsector = cres.line->frontsector; + } } return true; } @@ -965,12 +974,15 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec if (state == -1) return true; if (state == 1) { - double portalz = cres.line->frontsector->GetPortalPlaneZ(sector_t::ceiling); - if (portalz > tm.floorz) + if (wasfit) { - tm.floorz = portalz; - tm.floorsector = cres.line->frontsector; - tm.floorterrain = 0; + double portalz = cres.line->frontsector->GetPortalPlaneZ(sector_t::ceiling); + if (portalz > tm.floorz) + { + tm.floorz = portalz; + tm.floorsector = cres.line->frontsector; + tm.floorterrain = 0; + } } return true; } @@ -981,7 +993,10 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec { P_DamageMobj(tm.thing, NULL, NULL, tm.thing->Mass >> 5, NAME_Melee); } - tm.thing->BlockingLine = ld; + if (wasfit) + { + tm.thing->BlockingLine = ld; + } // Calculate line side based on the actor's original position, not the new one. CheckForPushSpecial(ld, P_PointOnLineSide(cres.Position, ld), tm.thing); return false; @@ -1000,9 +1015,12 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec double portz = tm.thing->Sector->GetPortalPlaneZ(sector_t::ceiling); if (tm.thing->Z() < portz && tm.thing->Z() + tm.thing->MaxStepHeight >= portz && tm.floorz < portz) { - // Actor is stepping through a portal. - tm.portalstep = true; - tm.portalgroup = tm.thing->Sector->GetOppositePortalGroup(sector_t::ceiling); + if (wasfit) + { + // Actor is stepping through a portal. + tm.portalstep = true; + tm.portalgroup = tm.thing->Sector->GetOppositePortalGroup(sector_t::ceiling); + } return true; } } @@ -1042,41 +1060,44 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec open.bottom += 32; } - // adjust floor / ceiling heights - if (!(cres.portalflags & FFCF_NOCEILING)) + if (wasfit) { - if (open.top < tm.ceilingz) + // adjust floor / ceiling heights + if (!(cres.portalflags & FFCF_NOCEILING)) { - tm.ceilingz = open.top; - tm.ceilingsector = open.topsec; - tm.ceilingpic = open.ceilingpic; - tm.ceilingline = ld; - tm.thing->BlockingLine = ld; - } - } - - // If we are stepping through a portal the line's opening must be checked, regardless of the NOFLOOR flag - if (!(cres.portalflags & FFCF_NOFLOOR) || (tm.portalstep && open.bottomsec->PortalGroup == tm.portalgroup)) - { - if (open.bottom > tm.floorz) - { - tm.floorz = open.bottom; - tm.floorsector = open.bottomsec; - tm.floorpic = open.floorpic; - tm.floorterrain = open.floorterrain; - tm.touchmidtex = open.touchmidtex; - tm.abovemidtex = open.abovemidtex; - tm.thing->BlockingLine = ld; - } - else if (open.bottom == tm.floorz) - { - tm.touchmidtex |= open.touchmidtex; - tm.abovemidtex |= open.abovemidtex; + if (open.top < tm.ceilingz) + { + tm.ceilingz = open.top; + tm.ceilingsector = open.topsec; + tm.ceilingpic = open.ceilingpic; + tm.ceilingline = ld; + tm.thing->BlockingLine = ld; + } } - if (open.lowfloor < tm.dropoffz) + // If we are stepping through a portal the line's opening must be checked, regardless of the NOFLOOR flag + if (!(cres.portalflags & FFCF_NOFLOOR) || (tm.portalstep && open.bottomsec->PortalGroup == tm.portalgroup)) { - tm.dropoffz = open.lowfloor; + if (open.bottom > tm.floorz) + { + tm.floorz = open.bottom; + tm.floorsector = open.bottomsec; + tm.floorpic = open.floorpic; + tm.floorterrain = open.floorterrain; + tm.touchmidtex = open.touchmidtex; + tm.abovemidtex = open.abovemidtex; + tm.thing->BlockingLine = ld; + } + else if (open.bottom == tm.floorz) + { + tm.touchmidtex |= open.touchmidtex; + tm.abovemidtex |= open.abovemidtex; + } + + if (open.lowfloor < tm.dropoffz) + { + tm.dropoffz = open.lowfloor; + } } } @@ -1881,7 +1902,7 @@ bool P_CheckPosition(AActor *thing, const DVector2 &pos, FCheckPosition &tm, boo while (it.Next(&lcres)) { - bool thisresult = PIT_CheckLine(it, lcres, it.Box(), tm); + bool thisresult = PIT_CheckLine(it, lcres, it.Box(), tm, good); good &= thisresult; if (thisresult) { @@ -5920,10 +5941,7 @@ bool P_AdjustFloorCeil(AActor *thing, FChangePosition *cpos) } bool isgood = P_CheckPosition(thing, thing->Pos(), tm); - - // This is essentially utterly broken because it even uses the return from a failed P_CheckPosition but the entire logic will break down if that isn't done. - // However, if tm.floorz is greater than tm.ceilingz we have a real problem that needs to be dealt with exolicitly. - if (!(thing->flags4 & MF4_ACTLIKEBRIDGE) && tm.floorz <= tm.ceilingz) + if (!(thing->flags4 & MF4_ACTLIKEBRIDGE)) { thing->floorz = tm.floorz; thing->ceilingz = tm.ceilingz; From de4fc97ac665114bdc4ed46e46c528be0b7191e1 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 31 Dec 2017 13:30:30 +0200 Subject: [PATCH 064/110] Fixed ammo limit for give cheat https://forum.zdoom.org/viewtopic.php?t=58930 --- src/p_mobj.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index dc0e76ad1f..1cc9d96f62 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -829,10 +829,16 @@ bool AActor::GiveInventory(PClassActor *type, int amount, bool givecheat) } else { - if (!givecheat) - item->Amount = amount; + if (givecheat) + { + item->Amount = MIN(amount, type->IsDescendantOf(NAME_Ammo) + ? item->IntVar("BackpackMaxAmount") + : item->MaxAmount); + } else - item->Amount = MIN (amount, item->MaxAmount); + { + item->Amount = amount; + } } } if (!item->CallTryPickup (this)) From 294bf6ed53ee8971bd3491e5effb109f2f1be6e1 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 31 Dec 2017 15:23:54 +0200 Subject: [PATCH 065/110] Simplified base class checks in AActor::GiveInventory() --- src/p_mobj.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 1cc9d96f62..c688f0b98b 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -823,7 +823,7 @@ bool AActor::GiveInventory(PClassActor *type, int amount, bool givecheat) item->ClearCounters(); if (!givecheat || amount > 0) { - if (type->IsDescendantOf (PClass::FindActor(NAME_BasicArmorPickup)) || type->IsDescendantOf(PClass::FindActor(NAME_BasicArmorBonus))) + if (type->IsDescendantOf(NAME_BasicArmorPickup) || type->IsDescendantOf(NAME_BasicArmorBonus)) { item->IntVar(NAME_SaveAmount) *= amount; } From 8f70d70dd6514c2ed4e4aaf748dae555aaca697e Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 31 Dec 2017 15:25:51 +0200 Subject: [PATCH 066/110] Generalized maximum amount for give cheat https://forum.zdoom.org/viewtopic.php?t=58930 --- src/p_mobj.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index c688f0b98b..d5c5e93ea6 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -831,9 +831,11 @@ bool AActor::GiveInventory(PClassActor *type, int amount, bool givecheat) { if (givecheat) { - item->Amount = MIN(amount, type->IsDescendantOf(NAME_Ammo) - ? item->IntVar("BackpackMaxAmount") - : item->MaxAmount); + const AInventory *const haveitem = FindInventory(type); + + item->Amount = MIN(amount, nullptr == haveitem + ? static_cast(GetDefaultByType(type))->MaxAmount + : haveitem->MaxAmount); } else { From 2c4eae74876bcf1f5c79320db106636cea37fed0 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 31 Dec 2017 21:29:27 +0200 Subject: [PATCH 067/110] Applied vertical offset to transferred sky in OpenGL renderer https://forum.zdoom.org/viewtopic.php?t=58934 --- src/gl/scene/gl_sky.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gl/scene/gl_sky.cpp b/src/gl/scene/gl_sky.cpp index 3186dc987c..90642ddfdb 100644 --- a/src/gl/scene/gl_sky.cpp +++ b/src/gl/scene/gl_sky.cpp @@ -69,7 +69,7 @@ void GLSkyInfo::init(int sky1, PalEntry FadeColor) if (!texture[0] || texture[0]->tex->UseType == FTexture::TEX_Null) goto normalsky; skytexno1 = texno; x_offset[0] = s->GetTextureXOffset(pos) * (360.f/65536.f); - y_offset = s->GetTextureYOffset(pos); + y_offset = s->GetTextureYOffset(pos) - 28.0; mirrored = !l->args[2]; } else From be8147406e06b6654fff1a3846589c48ac0a704f Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Mon, 1 Jan 2018 11:11:21 +0200 Subject: [PATCH 068/110] Fixed initialization of BlockThingsIterator objects https://forum.zdoom.org/viewtopic.php?t=58945 --- src/p_maputl.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index 31ab084968..24c30375e2 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -1275,20 +1275,21 @@ void FMultiBlockThingsIterator::Reset() // //=========================================================================== -class DBlockThingsIterator : public DObject, public FMultiBlockThingsIterator +class DBlockThingsIterator : public DObject { DECLARE_ABSTRACT_CLASS(DBlockThingsIterator, DObject); FPortalGroupArray check; + FMultiBlockThingsIterator iterator; public: FMultiBlockThingsIterator::CheckResult cres; bool Next() { - return FMultiBlockThingsIterator::Next(&cres); + return iterator.Next(&cres); } DBlockThingsIterator(AActor *origin, double checkradius = -1, bool ignorerestricted = false) - : FMultiBlockThingsIterator(check, origin, checkradius, ignorerestricted) + : iterator(check, origin, checkradius, ignorerestricted) { cres.thing = nullptr; cres.Position.Zero(); @@ -1296,7 +1297,7 @@ public: } DBlockThingsIterator(double checkx, double checky, double checkz, double checkh, double checkradius, bool ignorerestricted, sector_t *newsec) - : FMultiBlockThingsIterator(check, checkx, checky, checkz, checkh, checkradius, ignorerestricted, newsec) + : iterator(check, checkx, checky, checkz, checkh, checkradius, ignorerestricted, newsec) { cres.thing = nullptr; cres.Position.Zero(); From d8aa53f5b104602f397f86928257db75482f4307 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Mon, 1 Jan 2018 14:51:32 -0500 Subject: [PATCH 069/110] - whitelisted `openmenu` --- src/c_dispatch.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/c_dispatch.cpp b/src/c_dispatch.cpp index 2ab57ab7eb..75779cc939 100644 --- a/src/c_dispatch.cpp +++ b/src/c_dispatch.cpp @@ -201,7 +201,8 @@ static const char *MenuDefCommands[] = "fpuke", "pukename", "event", - "netevent" + "netevent", + "openmenu" }; // CODE -------------------------------------------------------------------- From c4648a2b1cd9267ac02da63c91240db7c62432f5 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Tue, 2 Jan 2018 13:04:28 +0200 Subject: [PATCH 070/110] Added CheckMove() function to ZScript Actor class https://forum.zdoom.org/viewtopic.php?t=58964 --- src/p_map.cpp | 8 ++++++++ wadsrc/static/zscript/actor.txt | 1 + wadsrc/static/zscript/constants.txt | 9 +++++++++ 3 files changed, 18 insertions(+) diff --git a/src/p_map.cpp b/src/p_map.cpp index 56eea2e1f0..ea4031eb48 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -2879,6 +2879,14 @@ bool P_CheckMove(AActor *thing, const DVector2 &pos, int flags) return true; } +DEFINE_ACTION_FUNCTION(AActor, CheckMove) +{ + PARAM_SELF_PROLOGUE(AActor); + PARAM_FLOAT(x); + PARAM_FLOAT(y); + PARAM_INT_DEF(flags); + ACTION_RETURN_BOOL(P_CheckMove(self, DVector2(x, y), flags)); +} //========================================================================== diff --git a/wadsrc/static/zscript/actor.txt b/wadsrc/static/zscript/actor.txt index ee464a35b5..d9847e2b14 100644 --- a/wadsrc/static/zscript/actor.txt +++ b/wadsrc/static/zscript/actor.txt @@ -624,6 +624,7 @@ class Actor : Thinker native } native bool TryMove(vector2 newpos, int dropoff, bool missilecheck = false, FCheckPosition tm = null); + native bool CheckMove(vector2 newpos, int flags = 0); native void NewChaseDir(); native void RandomChaseDir(); native bool CheckMissileRange(); diff --git a/wadsrc/static/zscript/constants.txt b/wadsrc/static/zscript/constants.txt index e35af3a80f..e6954b7896 100644 --- a/wadsrc/static/zscript/constants.txt +++ b/wadsrc/static/zscript/constants.txt @@ -516,6 +516,15 @@ enum EWarpFlags WARPF_COPYPITCH = 0x8000, }; +// Flags for Actor.CheckMove() + +enum ECheckMoveFlags +{ + PCM_DROPOFF = 1, + PCM_NOACTORS = 1 << 1, + PCM_NOLINES = 1 << 2, +}; + // flags for A_SetPitch/SetAngle/SetRoll enum EAngleFlags { From c3c1e76e8a28f01b1d6e48daced80b546c34499e Mon Sep 17 00:00:00 2001 From: Major Cooke Date: Sun, 31 Dec 2017 19:02:14 -0600 Subject: [PATCH 071/110] Added vector diff functions to ZScript LevelLocals class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vec2Diff() and Vec3Diff() work like Actor’s Vec2To() and Vec3To() but use arbitrary points --- src/g_level.cpp | 46 ++++++++++++++++++++++++++++++++++ wadsrc/static/zscript/base.txt | 3 +++ 2 files changed, 49 insertions(+) diff --git a/src/g_level.cpp b/src/g_level.cpp index cb5bc4baff..ce8ff0850c 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1954,6 +1954,52 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, SetInterMusic) return 0; } +//========================================================================== +// +// +//========================================================================== + +template +inline T VecDiff(const T& v1, const T& v2) +{ + T result = v2 - v1; + + if (level.subsectors.Size() > 0) + { + const sector_t *const sec1 = P_PointInSector(v1); + const sector_t *const sec2 = P_PointInSector(v2); + + if (nullptr != sec1 && nullptr != sec2) + { + result += Displacements.getOffset(sec2->PortalGroup, sec1->PortalGroup); + } + } + + return result; +} + +DEFINE_ACTION_FUNCTION(FLevelLocals, Vec2Diff) +{ + PARAM_PROLOGUE; + PARAM_FLOAT(x1); + PARAM_FLOAT(y1); + PARAM_FLOAT(x2); + PARAM_FLOAT(y2); + ACTION_RETURN_VEC2(VecDiff(DVector2(x1, y1), DVector2(x2, y2))); +} + +DEFINE_ACTION_FUNCTION(FLevelLocals, Vec3Diff) +{ + PARAM_PROLOGUE; + PARAM_FLOAT(x1); + PARAM_FLOAT(y1); + PARAM_FLOAT(z1); + PARAM_FLOAT(x2); + PARAM_FLOAT(y2); + PARAM_FLOAT(z2); + ACTION_RETURN_VEC3(VecDiff(DVector3(x1, y1, z1), DVector3(x2, y2, z2))); +} + //========================================================================== // // diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 4ffe34dced..01e2af7951 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -552,6 +552,9 @@ struct LevelLocals native native bool IsJumpingAllowed() const; native bool IsCrouchingAllowed() const; native bool IsFreelookAllowed() const; + + native static clearscope vector2 Vec2Diff(vector2 v1, vector2 v2); + native static clearscope vector3 Vec3Diff(vector3 v1, vector3 v2); String TimeFormatted(bool totals = false) { From a280cbc62cfc877f79bf547571ee51ea8cdb52ba Mon Sep 17 00:00:00 2001 From: SashaTheRed Date: Tue, 2 Jan 2018 13:56:37 +0100 Subject: [PATCH 072/110] Add sprite support for French and Portugese languages --- .../filter/game-doom/graphics/stcfn159.lmp | Bin 0 -> 126 bytes .../filter/game-doom/graphics/stcfn192.lmp | Bin 0 -> 131 bytes .../filter/game-doom/graphics/stcfn194.lmp | Bin 0 -> 147 bytes .../filter/game-doom/graphics/stcfn195.lmp | Bin 0 -> 147 bytes .../filter/game-doom/graphics/stcfn199.lmp | Bin 0 -> 145 bytes .../filter/game-doom/graphics/stcfn200.lmp | Bin 0 -> 132 bytes .../filter/game-doom/graphics/stcfn201.lmp | Bin 136 -> 132 bytes .../filter/game-doom/graphics/stcfn202.lmp | Bin 0 -> 143 bytes .../filter/game-doom/graphics/stcfn206.lmp | Bin 0 -> 122 bytes .../filter/game-doom/graphics/stcfn207.lmp | Bin 0 -> 118 bytes .../filter/game-doom/graphics/stcfn212.lmp | Bin 0 -> 144 bytes .../filter/game-doom/graphics/stcfn213.lmp | Bin 0 -> 144 bytes .../filter/game-doom/graphics/stcfn217.lmp | Bin 0 -> 129 bytes .../filter/game-doom/graphics/stcfn219.lmp | Bin 0 -> 138 bytes 14 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 wadsrc_extra/static/filter/game-doom/graphics/stcfn159.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/graphics/stcfn192.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/graphics/stcfn194.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/graphics/stcfn195.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/graphics/stcfn199.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/graphics/stcfn200.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/graphics/stcfn202.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/graphics/stcfn206.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/graphics/stcfn207.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/graphics/stcfn212.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/graphics/stcfn213.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/graphics/stcfn217.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/graphics/stcfn219.lmp diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn159.lmp b/wadsrc_extra/static/filter/game-doom/graphics/stcfn159.lmp new file mode 100644 index 0000000000000000000000000000000000000000..d57a2dd3eb335f4a3bfa23a61f8c8d938968c634 GIT binary patch literal 126 zcmd;J;9y{2U}Vq$k_JF*1;p+^91O(qK%4`_WkAfxtPcYJ8Cdo8x9V>Ju{iYgH|uZS j3KnK$2T>chZwE?1+1r3JU`1PDia>fd>u&=oftm&YiTEC1 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn192.lmp b/wadsrc_extra/static/filter/game-doom/graphics/stcfn192.lmp new file mode 100644 index 0000000000000000000000000000000000000000..006a09f71c74a0a0d4a50c8fccb6864fadea3464 GIT binary patch literal 131 zcmXwx!3}^g3(FuSs5JMyOqoeqj-!9++F5m(#-~tZRJ1e-HrY&gT-4RF<5djRCbd#9HB37}9 sT^s@YkgSe1-(Zo1^@s6 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn195.lmp b/wadsrc_extra/static/filter/game-doom/graphics/stcfn195.lmp new file mode 100644 index 0000000000000000000000000000000000000000..b9e53b30a71be447ab5eeb3c8178dc3e6bbfa17b GIT binary patch literal 147 zcmd;J;9y{2U}Vq$k`_Sh3dBJ`91p}fKwJsLZ9vSxtPcV#EMQ9iKLdxp{x*I6EnBwe kLpYoDw*vv3vq^s|P$g6uDhHuwm;ScRn>Rz1K@0|R0D)pA`v3p{ literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn199.lmp b/wadsrc_extra/static/filter/game-doom/graphics/stcfn199.lmp new file mode 100644 index 0000000000000000000000000000000000000000..07039d4fb1e0a3870b1dd7a722c785977516266b GIT binary patch literal 145 zcmXYo!3}^Q5Cl;%flmCLZyT@zE3gDRups3R q4ycp+33!vT)F>e`=WgagH43wFK!QT=Rsuv2TPbIFSnT+JME(HPxFX#E literal 136 zcmXwx%ME}q3`5K^EI9=g!Wsde*nP4AL#%9 diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn202.lmp b/wadsrc_extra/static/filter/game-doom/graphics/stcfn202.lmp new file mode 100644 index 0000000000000000000000000000000000000000..ca4c44ee828d8a2a3ec1c17abd015d0f7642bf42 GIT binary patch literal 143 zcmX|(!3}^w2n6vZrTE*A4cLGU*nkb#fF+5bTywg)oRSR5z=Dd3NGAjPNG39qg{)*F pJCPn=J)%IMT**llgC9ntm;ssQRU#U|=u+VhbR40pdU)jsxN>AT9!8MrM5w_z$ADfoOJp{moz@{r?Oc gAog}307`&3+w?bW-UO5ds{*P90kFU|`S#VlyCi24a68jt1fkAT9u6Mn-*o{r?Qi`ubZzG>5+aW}pBF e{AXkblG}j*#@@JT6HpSY2&fngz&b&K5OV-`5*o1p literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn212.lmp b/wadsrc_extra/static/filter/game-doom/graphics/stcfn212.lmp new file mode 100644 index 0000000000000000000000000000000000000000..ca0f6133ead1400a434583764bf350a10ae180e6 GIT binary patch literal 144 zcmY+6%ME}q3`5OFqN8y0jR9DI1z3Ou7=VpXXoa#IxGfi=JS$P`1OxyLM(HGGv4~Y{ tVi$)%$6S4z^}#?U((gP6(&!ewEN0|cT9+h~mg}=6daO3(Wv}_)=NB_6C6WLD literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn213.lmp b/wadsrc_extra/static/filter/game-doom/graphics/stcfn213.lmp new file mode 100644 index 0000000000000000000000000000000000000000..116cd8dc4b73e5f9c061045296d5b99e83a71a19 GIT binary patch literal 144 zcmd;J;9y{2U}Vq$l4d~c1jPP890SCeKwJjIO+d`RtPcV#Od#?<1G~QdHhukFJ3wp> nef`b)yEbp#1?Ozk*9Ri7%r+2f3!JlSD?}MkKTtVDKZ?l!_cbJk literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn217.lmp b/wadsrc_extra/static/filter/game-doom/graphics/stcfn217.lmp new file mode 100644 index 0000000000000000000000000000000000000000..4d8caefc761b26ab227c687475a8419177a53b79 GIT binary patch literal 129 zcmd;J;9y{2U}Vq$l7>KR3&dVP91g_EK%57}6+q0yq7MfD8Q4Me_HEns_5U+)=<9FN n-?Vk>E+_{m2$TbI7{RI_Y$i5+{VfnROsx9)+qQ!gz|8{y2 Date: Tue, 2 Jan 2018 14:09:57 +0100 Subject: [PATCH 073/110] Fixed sprite offsets --- .../filter/game-doom/graphics/stcfn200.lmp | Bin 132 -> 132 bytes .../filter/game-doom/graphics/stcfn201.lmp | Bin 132 -> 132 bytes .../filter/game-doom/graphics/stcfn206.lmp | Bin 122 -> 122 bytes .../filter/game-doom/graphics/stcfn207.lmp | Bin 118 -> 118 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn200.lmp b/wadsrc_extra/static/filter/game-doom/graphics/stcfn200.lmp index d75cef410b11ec60e66742dd5f6c16f45b8c043a..c6c4637e28b05bde0a6a7c4b8f48a41dba869e07 100644 GIT binary patch delta 15 WcmZo+Y++>QVBlb2U|^icUJC#bxB@r; delta 15 UcmZo+Y++>QVBlZ?f{E<401>nTHvj+t diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn201.lmp b/wadsrc_extra/static/filter/game-doom/graphics/stcfn201.lmp index 06f1aec12fbe81724e81290e52a37dccc27710f5..1497e3abba8d7888b8353c3c56258183fd19deb5 100644 GIT binary patch delta 15 WcmZo+Y++>QVBlb2U|^icUJC#bxB@r; delta 15 UcmZo+Y++>QVBlZ?f{E<401>nTHvj+t diff --git a/wadsrc_extra/static/filter/game-doom/graphics/stcfn206.lmp b/wadsrc_extra/static/filter/game-doom/graphics/stcfn206.lmp index 3fe8bbb5f5b905c77427dc4c93bd613db65c6fbe..08325aecfa403d1d637b34c6a0577b386700bf7e 100644 GIT binary patch delta 11 Scmb=bV&!1qU|^WYS_%LR+yWH< delta 11 Scmb=bV&!1qU|^caS_%LR Date: Wed, 3 Jan 2018 10:48:10 +0200 Subject: [PATCH 074/110] Extended Actor.CheckMove() with optional position information https://forum.zdoom.org/viewtopic.php?t=58964 --- src/p_map.cpp | 19 ++++++++++++++++--- wadsrc/static/zscript/actor.txt | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/p_map.cpp b/src/p_map.cpp index ea4031eb48..7cab335c09 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -2784,9 +2784,8 @@ DEFINE_ACTION_FUNCTION(AActor, TryMove) // //========================================================================== -bool P_CheckMove(AActor *thing, const DVector2 &pos, int flags) +static bool P_CheckMove(AActor *thing, const DVector2 &pos, FCheckPosition& tm, int flags) { - FCheckPosition tm; double newz = thing->Z(); auto f1 = thing->flags & MF_PICKUP; @@ -2879,13 +2878,27 @@ bool P_CheckMove(AActor *thing, const DVector2 &pos, int flags) return true; } +bool P_CheckMove(AActor *thing, const DVector2 &pos, int flags) +{ + FCheckPosition tm; + return P_CheckMove(thing, pos, tm, flags); +} + DEFINE_ACTION_FUNCTION(AActor, CheckMove) { PARAM_SELF_PROLOGUE(AActor); PARAM_FLOAT(x); PARAM_FLOAT(y); PARAM_INT_DEF(flags); - ACTION_RETURN_BOOL(P_CheckMove(self, DVector2(x, y), flags)); + PARAM_POINTER_DEF(tm, FCheckPosition); + if (tm == nullptr) + { + ACTION_RETURN_BOOL(P_CheckMove(self, DVector2(x, y), flags)); + } + else + { + ACTION_RETURN_BOOL(P_CheckMove(self, DVector2(x, y), *tm, flags)); + } } diff --git a/wadsrc/static/zscript/actor.txt b/wadsrc/static/zscript/actor.txt index d9847e2b14..6dd222fbfc 100644 --- a/wadsrc/static/zscript/actor.txt +++ b/wadsrc/static/zscript/actor.txt @@ -624,7 +624,7 @@ class Actor : Thinker native } native bool TryMove(vector2 newpos, int dropoff, bool missilecheck = false, FCheckPosition tm = null); - native bool CheckMove(vector2 newpos, int flags = 0); + native bool CheckMove(vector2 newpos, int flags = 0, FCheckPosition tm = null); native void NewChaseDir(); native void RandomChaseDir(); native bool CheckMissileRange(); From 6aa724a9b442e5f019fff4605498a659055ce8bc Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 3 Jan 2018 21:45:52 -0500 Subject: [PATCH 075/110] - add 'gl_riskymodernpath' for computers that worked before the GL >= 3.3 modern path enforcement, since some did, but they seemed to be the exception rather than the rule. --- src/gl/system/gl_interface.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/gl/system/gl_interface.cpp b/src/gl/system/gl_interface.cpp index b2b4ea9ae9..1ac8b33fe3 100644 --- a/src/gl/system/gl_interface.cpp +++ b/src/gl/system/gl_interface.cpp @@ -44,6 +44,7 @@ RenderContext gl; EXTERN_CVAR(Bool, gl_legacy_mode) extern int currentrenderer; +CVAR(Bool, gl_riskymodernpath, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) //========================================================================== // @@ -209,7 +210,10 @@ void gl_LoadExtensions() // The minimum requirement for the modern render path is GL 3.3. // Although some GL 3.1 or 3.2 solutions may theoretically work they are usually too broken or too slow. // unless, of course, we're simply using this as a software backend... - if ((gl_version < 3.3f && (currentrenderer==1)) || gl_version < 3.0f) + float minmodernpath = 3.3f; + if (gl_riskymodernpath) + minmodernpath = 3.1f; + if ((gl_version < minmodernpath && (currentrenderer==1)) || gl_version < 3.0f) { gl.legacyMode = true; gl.lightmethod = LM_LEGACY; From 4b044e30d7ae9a8343eb5d42706272ba13d5ad6f Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Wed, 3 Jan 2018 23:28:48 -0500 Subject: [PATCH 076/110] - ACS stack checking (proxy commit by Rachael) --- src/p_acs.cpp | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 22afac1b63..e499f9d015 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -851,9 +851,25 @@ FWorldGlobalArray ACS_GlobalArrays[NUM_GLOBALVARS]; // //---------------------------------------------------------------------------- +struct FACSStackMemory +{ + int32_t& operator[](const size_t index) + { + if (index >= STACK_SIZE) + { + I_Error("Corrupted stack pointer in ACS VM"); + } + + return buffer[index]; + } + +private: + int32_t buffer[STACK_SIZE]; +}; + struct FACSStack { - int32_t buffer[STACK_SIZE]; + FACSStackMemory buffer; int sp; FACSStack *next; FACSStack *prev; @@ -1488,7 +1504,20 @@ void P_CollectACSGlobalStrings() { for (FACSStack *stack = FACSStack::head; stack != NULL; stack = stack->next) { - GlobalACSStrings.MarkStringArray(stack->buffer, stack->sp); + const int32_t sp = stack->sp; + + if (0 == sp) + { + continue; + } + else if (sp < 0 && sp >= STACK_SIZE) + { + I_Error("Corrupted stack pointer in ACS VM"); + } + else + { + GlobalACSStrings.MarkStringArray(&stack->buffer[0], sp); + } } FBehavior::StaticMarkLevelVarStrings(); P_MarkWorldVarStrings(); @@ -6889,7 +6918,7 @@ inline int getshort (int *&pc) return res; } -static bool CharArrayParms(int &capacity, int &offset, int &a, int *Stack, int &sp, bool ranged) +static bool CharArrayParms(int &capacity, int &offset, int &a, FACSStackMemory& Stack, int &sp, bool ranged) { if (ranged) { @@ -7012,7 +7041,7 @@ int DLevelScript::RunScript () } FACSStack stackobj; - int32_t *Stack = stackobj.buffer; + FACSStackMemory& Stack = stackobj.buffer; int &sp = stackobj.sp; int *pc = this->pc; @@ -7376,7 +7405,7 @@ int DLevelScript::RunScript () sp -= sizeof(CallReturn)/sizeof(int); retsp = &Stack[sp]; activeBehavior->GetFunctionProfileData(activeFunction)->AddRun(runaway - ret->EntryInstrCount); - sp = int(locals - Stack); + sp = int(locals - &Stack[0]); pc = ret->ReturnModule->Ofs2PC(ret->ReturnAddress); activeFunction = ret->ReturnFunction; activeBehavior = ret->ReturnModule; From df0cddb35d0b7a57f4bbe94a9718164d5d184054 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 5 Jan 2018 16:26:31 +0200 Subject: [PATCH 077/110] Do not output empty conversation replies to console https://forum.zdoom.org/viewtopic.php?t=58992 --- src/p_conversation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index a715f6a491..5d3a872a4a 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -1044,7 +1044,7 @@ static void HandleReply(player_t *player, bool isconsole, int nodenum, int reply player->SetLogNumber(reply->LogNumber); } - if (replyText != NULL && isconsole) + if (nullptr != replyText && '\0' != replyText[0] && isconsole) { TerminalResponse(replyText); } From 44f01e1dc65de483b8d7319f6fb025f1b96e147a Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 6 Jan 2018 12:13:15 +0200 Subject: [PATCH 078/110] Added bounds check for local variables in ACS VM --- src/p_acs.cpp | 13 ++++++------- src/p_acs.h | 42 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/p_acs.cpp b/src/p_acs.cpp index e499f9d015..7ef6f56839 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -644,7 +644,7 @@ inline int PitchToACS(DAngle ang) struct CallReturn { - CallReturn(int pc, ScriptFunction *func, FBehavior *module, int32_t *locals, ACSLocalArrays *arrays, bool discard, unsigned int runaway) + CallReturn(int pc, ScriptFunction *func, FBehavior *module, const ACSLocalVariables &locals, ACSLocalArrays *arrays, bool discard, unsigned int runaway) : ReturnFunction(func), ReturnModule(module), ReturnLocals(locals), @@ -656,7 +656,7 @@ struct CallReturn ScriptFunction *ReturnFunction; FBehavior *ReturnModule; - int32_t *ReturnLocals; + ACSLocalVariables ReturnLocals; ACSLocalArrays *ReturnArrays; int ReturnAddress; int bDiscardResult; @@ -6967,7 +6967,7 @@ static void SetMarineSprite(AActor *marine, PClassActor *source) int DLevelScript::RunScript () { DACSThinker *controller = DACSThinker::ActiveThinker; - int32_t *locals = &Localvars[0]; + ACSLocalVariables locals(Localvars); ACSLocalArrays noarrays; ACSLocalArrays *localarrays = &noarrays; ScriptFunction *activeFunction = NULL; @@ -7335,7 +7335,6 @@ int DLevelScript::RunScript () int i; ScriptFunction *func; FBehavior *module; - int32_t *mylocals; if(pcd == PCD_CALLSTACK) { @@ -7364,9 +7363,9 @@ int DLevelScript::RunScript () state = SCRIPT_PleaseRemove; break; } - mylocals = locals; + const ACSLocalVariables mylocals = locals; // The function's first argument is also its first local variable. - locals = &Stack[sp - func->ArgCount]; + locals.Reset(&Stack[sp - func->ArgCount], func->ArgCount + func->LocalCount); // Make space on the stack for any other variables the function uses. for (i = 0; i < func->LocalCount; ++i) { @@ -7405,7 +7404,7 @@ int DLevelScript::RunScript () sp -= sizeof(CallReturn)/sizeof(int); retsp = &Stack[sp]; activeBehavior->GetFunctionProfileData(activeFunction)->AddRun(runaway - ret->EntryInstrCount); - sp = int(locals - &Stack[0]); + sp = int(locals.GetPointer() - &Stack[0]); pc = ret->ReturnModule->Ofs2PC(ret->ReturnAddress); activeFunction = ret->ReturnFunction; activeBehavior = ret->ReturnModule; diff --git a/src/p_acs.h b/src/p_acs.h index 178a6ecce8..4f53ce1a37 100644 --- a/src/p_acs.h +++ b/src/p_acs.h @@ -147,6 +147,44 @@ struct ProfileCollector int Index; }; +class ACSLocalVariables +{ +public: + ACSLocalVariables(TArray &variables) + : memory(&variables[0]) + , count(variables.Size()) + { + } + + void Reset(int32_t *const memory, const size_t count) + { + // TODO: pointer sanity check? + // TODO: constraints on count? + + this->memory = memory; + this->count = count; + } + + int32_t& operator[](const size_t index) + { + if (index >= count) + { + I_Error("Out of bounds access to local variables in ACS VM"); + } + + return memory[index]; + } + + const int32_t *GetPointer() const + { + return memory; + } + +private: + int32_t *memory; + size_t count; +}; + struct ACSLocalArrayInfo { unsigned int Size; @@ -173,7 +211,7 @@ struct ACSLocalArrays } // Bounds-checking Set and Get for local arrays - void Set(int *locals, int arraynum, int arrayentry, int value) + void Set(ACSLocalVariables &locals, int arraynum, int arrayentry, int value) { if ((unsigned int)arraynum < Count && (unsigned int)arrayentry < Info[arraynum].Size) @@ -181,7 +219,7 @@ struct ACSLocalArrays locals[Info[arraynum].Offset + arrayentry] = value; } } - int Get(int *locals, int arraynum, int arrayentry) + int Get(ACSLocalVariables &locals, int arraynum, int arrayentry) { if ((unsigned int)arraynum < Count && (unsigned int)arrayentry < Info[arraynum].Size) From 83cd53c9b1c52498d62fb6d501396ff782037c70 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 6 Jan 2018 13:26:51 +0200 Subject: [PATCH 079/110] Added partial bounds check for instruction pointer in ACS VM This change adds verification of instruction pointer for indirect usages only, i.e. via NEXT...() macros --- src/p_acs.cpp | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 7ef6f56839..19f9de486d 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -761,6 +761,35 @@ protected: private: DLevelScript(); + int getbyte(int *&pc) + { + CheckInstructionPointer(pc); + + int res = *(uint8_t *)pc; + pc = (int *)((uint8_t *)pc+1); + return res; + } + + int getshort(int *&pc) + { + CheckInstructionPointer(pc); + + int res = LittleShort( *(int16_t *)pc); + pc = (int *)((uint8_t *)pc+2); + return res; + } + + void CheckInstructionPointer(int *pc) const + { + const uint32_t offset = activeBehavior->PC2Ofs(pc); + const uint32_t size = activeBehavior->GetDataSize(); + + if (offset >= size) + { + I_Error("Out of bounds instruction pointer in ACS VM"); + } + } + friend class DACSThinker; }; @@ -6896,7 +6925,7 @@ enum }; -#define NEXTWORD (LittleLong(*pc++)) +#define NEXTWORD (CheckInstructionPointer(pc), LittleLong(*pc++)) #define NEXTBYTE (fmt==ACS_LittleEnhanced?getbyte(pc):NEXTWORD) #define NEXTSHORT (fmt==ACS_LittleEnhanced?getshort(pc):NEXTWORD) #define STACK(a) (Stack[sp - (a)]) @@ -6904,20 +6933,6 @@ enum // Direct instructions that take strings need to have the tag applied. #define TAGSTR(a) (a|activeBehavior->GetLibraryID()) -inline int getbyte (int *&pc) -{ - int res = *(uint8_t *)pc; - pc = (int *)((uint8_t *)pc+1); - return res; -} - -inline int getshort (int *&pc) -{ - int res = LittleShort( *(int16_t *)pc); - pc = (int *)((uint8_t *)pc+2); - return res; -} - static bool CharArrayParms(int &capacity, int &offset, int &a, FACSStackMemory& Stack, int &sp, bool ranged) { if (ranged) From 16333320d09663b12396b37f5be5def64e865b9c Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 6 Jan 2018 17:48:49 +0200 Subject: [PATCH 080/110] Fixed transfer of count secret flag from random spawner https://forum.zdoom.org/viewtopic.php?t=59013 --- wadsrc/static/zscript/shared/randomspawner.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/wadsrc/static/zscript/shared/randomspawner.txt b/wadsrc/static/zscript/shared/randomspawner.txt index 7488fdd4d1..9914670b45 100644 --- a/wadsrc/static/zscript/shared/randomspawner.txt +++ b/wadsrc/static/zscript/shared/randomspawner.txt @@ -168,6 +168,7 @@ class RandomSpawner : Actor newmobj.SpawnFlags = SpawnFlags & ~MTF_SECRET; // MTF_SECRET needs special treatment to avoid incrementing the secret counter twice. It had already been processed for the spawner itself. newmobj.HandleSpawnFlags(); newmobj.SpawnFlags = SpawnFlags; + newmobj.bCountSecret = SpawnFlags & MTF_SECRET; // "Transfer" count secret flag to spawned actor newmobj.ChangeTid(tid); newmobj.Vel = Vel; newmobj.master = master; // For things such as DamageMaster/DamageChildren, transfer mastery. From 9fd78e90addcff9d5ece94ec37043bc385806643 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sat, 6 Jan 2018 19:59:49 -0500 Subject: [PATCH 081/110] - export 'GetChecksum' as part of FLevelLocals in ZScript --- src/p_setup.cpp | 13 +++++++++++++ wadsrc/static/zscript/base.txt | 2 ++ 2 files changed, 15 insertions(+) diff --git a/src/p_setup.cpp b/src/p_setup.cpp index b87bf6b874..a0d0f1842b 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -116,6 +116,7 @@ #include "events.h" #include "types.h" #include "i_time.h" +#include "scripting/vm/vm.h" #include "fragglescript/t_fs.h" @@ -552,6 +553,18 @@ void MapData::GetChecksum(uint8_t cksum[16]) md5.Final(cksum); } +DEFINE_ACTION_FUNCTION(FLevelLocals, GetChecksum) +{ + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); + char md5string[33]; + + for(int j = 0; j < 16; ++j) + { + sprintf(md5string + j * 2, "%02x", level.md5[j]); + } + + ACTION_RETURN_STRING((const char*)md5string); +} //=========================================================================== // diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 01e2af7951..fe776fcbc1 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -555,6 +555,8 @@ struct LevelLocals native native static clearscope vector2 Vec2Diff(vector2 v1, vector2 v2); native static clearscope vector3 Vec3Diff(vector3 v1, vector3 v2); + + native String GetChecksum() const; String TimeFormatted(bool totals = false) { From 6d37a670273d716e5c4db35083d09e4bf647c513 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 7 Jan 2018 15:02:22 +0200 Subject: [PATCH 082/110] Added unsafe execution context for console commands Some console commands are insecure because they access user's file system Such commands cannot be executed from MENUDEF and KEYCONF aliases --- src/c_dispatch.cpp | 68 ++++++++++++++++++---------------------------- src/c_dispatch.h | 27 ++++++++++++++++++ 2 files changed, 54 insertions(+), 41 deletions(-) diff --git a/src/c_dispatch.cpp b/src/c_dispatch.cpp index 75779cc939..b8e221e389 100644 --- a/src/c_dispatch.cpp +++ b/src/c_dispatch.cpp @@ -126,7 +126,8 @@ FButtonStatus Button_Mlook, Button_Klook, Button_Use, Button_AltAttack, Button_AM_PanLeft, Button_AM_PanRight, Button_AM_PanDown, Button_AM_PanUp, Button_AM_ZoomIn, Button_AM_ZoomOut; -bool ParsingKeyConf, ParsingMenuDef = false; +bool ParsingKeyConf; +static bool UnsafeExecutionContext; // To add new actions, go to the console and type "key ". // This will give you the key value to use in the first column. Then @@ -187,24 +188,6 @@ static const char *KeyConfCommands[] = "clearplayerclasses" }; -static const char *MenuDefCommands[] = -{ - "snd_reset", - "reset2defaults", - "reset2saved", - "menuconsole", - "clearnodecache", - "am_restorecolors", - "undocolorpic", - "special", - "puke", - "fpuke", - "pukename", - "event", - "netevent", - "openmenu" -}; - // CODE -------------------------------------------------------------------- IMPLEMENT_CLASS(DWaitingCommand, false, false) @@ -602,25 +585,6 @@ void C_DoCommand (const char *cmd, int keynum) } } - if (ParsingMenuDef) - { - int i; - - for (i = countof(MenuDefCommands)-1; i >= 0; --i) - { - if (strnicmp (beg, MenuDefCommands[i], len) == 0 && - MenuDefCommands[i][len] == 0) - { - break; - } - } - if (i < 0) - { - Printf ("Invalid command for MENUDEF/ZScript: %s\n", beg); - return; - } - } - // Check if this is an action if (*beg == '+' || *beg == '-') { @@ -707,9 +671,9 @@ DEFINE_ACTION_FUNCTION(DOptionMenuItemCommand, DoCommand) if (CurrentMenu == nullptr) return 0; PARAM_PROLOGUE; PARAM_STRING(cmd); - ParsingMenuDef = true; + UnsafeExecutionContext = true; C_DoCommand(cmd); - ParsingMenuDef = false; + UnsafeExecutionContext = false; return 0; } @@ -1061,6 +1025,17 @@ void FConsoleCommand::Run (FCommandLine &argv, APlayerPawn *who, int key) m_RunFunc (argv, who, key); } +void FUnsafeConsoleCommand::Run (FCommandLine &args, APlayerPawn *instigator, int key) +{ + if (UnsafeExecutionContext) + { + Printf(TEXTCOLOR_RED "Cannot execute unsafe command " TEXTCOLOR_GOLD "%s\n", m_Name); + return; + } + + FConsoleCommand::Run (args, instigator, key); +} + FConsoleAlias::FConsoleAlias (const char *name, const char *command, bool noSave) : FConsoleCommand (name, NULL), bRunning(false), bKill(false) @@ -1381,9 +1356,13 @@ CCMD (alias) alias = NULL; } } + else if (ParsingKeyConf) + { + new FUnsafeConsoleAlias (argv[1], argv[2]); + } else { - new FConsoleAlias (argv[1], argv[2], ParsingKeyConf); + new FConsoleAlias (argv[1], argv[2], false); } } } @@ -1521,6 +1500,13 @@ void FConsoleAlias::SafeDelete () } } +void FUnsafeConsoleAlias::Run (FCommandLine &args, APlayerPawn *instigator, int key) +{ + UnsafeExecutionContext = true; + FConsoleAlias::Run(args, instigator, key); + UnsafeExecutionContext = false; +} + void FExecList::AddCommand(const char *cmd, const char *file) { // Pullins are special and need to be separated from general commands. diff --git a/src/c_dispatch.h b/src/c_dispatch.h index 24a7c42ecf..dac14b818a 100644 --- a/src/c_dispatch.h +++ b/src/c_dispatch.h @@ -127,6 +127,22 @@ protected: FConsoleCommand Cmd_##n##_Ref (#n, Cmd_##n); \ void Cmd_##n (FCommandLine &argv, APlayerPawn *who, int key) +class FUnsafeConsoleCommand : public FConsoleCommand +{ +public: + FUnsafeConsoleCommand (const char *name, CCmdRun RunFunc) + : FConsoleCommand (name, RunFunc) + { + } + + virtual void Run (FCommandLine &args, APlayerPawn *instigator, int key) override; +}; + +#define UNSAFE_CCMD(n) \ + static void Cmd_##n (FCommandLine &, APlayerPawn *, int key); \ + static FUnsafeConsoleCommand Cmd_##n##_Ref (#n, Cmd_##n); \ + void Cmd_##n (FCommandLine &argv, APlayerPawn *who, int key) + const int KEY_DBLCLICKED = 0x8000; class FConsoleAlias : public FConsoleCommand @@ -147,6 +163,17 @@ protected: bool bKill; }; +class FUnsafeConsoleAlias : public FConsoleAlias +{ +public: + FUnsafeConsoleAlias (const char *name, const char *command) + : FConsoleAlias (name, command, true) + { + } + + virtual void Run (FCommandLine &args, APlayerPawn *instigator, int key) override; +}; + // Actions struct FButtonStatus { From f25a5ea2bc4b42312a477ce261e95a93586379c5 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 7 Jan 2018 15:03:49 +0200 Subject: [PATCH 083/110] Marked a few commands as unsafe This process of finding unsafe commands is not complete! --- src/c_cmds.cpp | 10 +++++----- src/c_console.cpp | 2 +- src/d_main.cpp | 4 ++-- src/g_level.cpp | 2 +- src/m_misc.cpp | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/c_cmds.cpp b/src/c_cmds.cpp index 748680e91a..e3e87595df 100644 --- a/src/c_cmds.cpp +++ b/src/c_cmds.cpp @@ -467,7 +467,7 @@ CCMD (print) } } -CCMD (exec) +UNSAFE_CCMD (exec) { if (argv.argc() < 2) return; @@ -495,7 +495,7 @@ void execLogfile(const char *fn, bool append) } } -CCMD (logfile) +UNSAFE_CCMD (logfile) { if (Logfile) @@ -651,7 +651,7 @@ CCMD (error) } } -CCMD (error_fatal) +UNSAFE_CCMD (error_fatal) { if (argv.argc() > 1) { @@ -794,7 +794,7 @@ CCMD (warp) // //========================================================================== -CCMD (load) +UNSAFE_CCMD (load) { if (argv.argc() != 2) { @@ -819,7 +819,7 @@ CCMD (load) // //========================================================================== -CCMD (save) +UNSAFE_CCMD (save) { if (argv.argc() < 2 || argv.argc() > 3) { diff --git a/src/c_console.cpp b/src/c_console.cpp index c3ab769037..9cbb5623fe 100644 --- a/src/c_console.cpp +++ b/src/c_console.cpp @@ -627,7 +627,7 @@ void C_InitConsole (int width, int height, bool ingame) // //========================================================================== -CCMD (atexit) +UNSAFE_CCMD (atexit) { if (argv.argc() == 1) { diff --git a/src/d_main.cpp b/src/d_main.cpp index 656a2ca3b5..92e10903f6 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -2821,7 +2821,7 @@ void D_DoomMain (void) // //========================================================================== -CCMD(restart) +UNSAFE_CCMD(restart) { // remove command line args that would get in the way during restart Args->RemoveArgs("-iwad"); @@ -2917,4 +2917,4 @@ CUSTOM_CVAR(Bool, I_FriendlyWindowTitle, true, CVAR_GLOBALCONFIG|CVAR_ARCHIVE|CV I_SetWindowTitle(DoomStartupInfo.Name.GetChars()); else I_SetWindowTitle(NULL); -} \ No newline at end of file +} diff --git a/src/g_level.cpp b/src/g_level.cpp index ce8ff0850c..b427599f01 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -277,7 +277,7 @@ CCMD(recordmap) // //========================================================================== -CCMD (open) +UNSAFE_CCMD (open) { if (netgame) { diff --git a/src/m_misc.cpp b/src/m_misc.cpp index 8fcaf9e0cd..eb51ec7b9a 100644 --- a/src/m_misc.cpp +++ b/src/m_misc.cpp @@ -315,7 +315,7 @@ void M_SaveDefaultsFinal () GameConfig = NULL; } -CCMD (writeini) +UNSAFE_CCMD (writeini) { const char *filename = (argv.argc() == 1) ? NULL : argv[1]; if (!M_SaveDefaults (filename)) From 059e40e2d52cb201609f78c1520f14c53093f2bd Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 7 Jan 2018 15:04:50 +0200 Subject: [PATCH 084/110] Prohibited setting of non-mod CVARs from unsafe alias --- src/c_dispatch.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/c_dispatch.cpp b/src/c_dispatch.cpp index b8e221e389..73d0d5d3e6 100644 --- a/src/c_dispatch.cpp +++ b/src/c_dispatch.cpp @@ -651,6 +651,12 @@ void C_DoCommand (const char *cmd, int keynum) if (args.argc() >= 2) { // Set the variable + if (UnsafeExecutionContext && !(var->GetFlags() & CVAR_MOD)) + { + Printf(TEXTCOLOR_RED "Cannot set console variable" TEXTCOLOR_GOLD " %s " TEXTCOLOR_RED "from unsafe command\n", var->GetName()); + return; + } + var->CmdSet (args[1]); } else From e8a7f00b9b7958a4920551bd64d0f7e69b53513c Mon Sep 17 00:00:00 2001 From: Jameson Ernst Date: Sun, 7 Jan 2018 14:04:51 -0800 Subject: [PATCH 085/110] Adjust FNF enum to fix FILLZEROS --- src/g_statusbar/shared_sbar.cpp | 4 ++-- wadsrc/static/zscript/statusbar/statusbar.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index 30bc5f1df1..22ab540359 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -2074,8 +2074,8 @@ DEFINE_ACTION_FUNCTION(DBaseStatusBar, GetGlobalACSArrayValue) enum ENumFlags { - FNF_FILLZEROS, - FNF_WHENNOTZERO, + FNF_WHENNOTZERO = 0x1, + FNF_FILLZEROS = 0x2, }; DEFINE_ACTION_FUNCTION(DBaseStatusBar, FormatNumber) diff --git a/wadsrc/static/zscript/statusbar/statusbar.txt b/wadsrc/static/zscript/statusbar/statusbar.txt index 992328e81e..56e831f97b 100644 --- a/wadsrc/static/zscript/statusbar/statusbar.txt +++ b/wadsrc/static/zscript/statusbar/statusbar.txt @@ -254,8 +254,8 @@ class BaseStatusBar native ui enum ENumFlags { - FNF_FILLZEROS, - FNF_WHENNOTZERO, + FNF_WHENNOTZERO = 0x1, + FNF_FILLZEROS = 0x2, } enum EShade From b008426ed7c6f24a8033111b24147b6822a7bd08 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Mon, 8 Jan 2018 10:41:31 +0200 Subject: [PATCH 086/110] Added propagation of unsafe execution context to waiting command Thanks Edward-san for pointing this out --- src/c_dispatch.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/c_dispatch.cpp b/src/c_dispatch.cpp index 73d0d5d3e6..fa786b271b 100644 --- a/src/c_dispatch.cpp +++ b/src/c_dispatch.cpp @@ -65,7 +65,7 @@ class DWaitingCommand : public DThinker { DECLARE_CLASS (DWaitingCommand, DThinker) public: - DWaitingCommand (const char *cmd, int tics); + DWaitingCommand (const char *cmd, int tics, bool unsafe); ~DWaitingCommand (); void Serialize(FSerializer &arc); void Tick (); @@ -75,6 +75,7 @@ private: char *Command; int TicsLeft; + bool IsUnsafe; }; class DStoredCommand : public DThinker @@ -203,12 +204,14 @@ DWaitingCommand::DWaitingCommand () { Command = NULL; TicsLeft = 1; + IsUnsafe = false; } -DWaitingCommand::DWaitingCommand (const char *cmd, int tics) +DWaitingCommand::DWaitingCommand (const char *cmd, int tics, bool unsafe) { Command = copystring (cmd); TicsLeft = tics+1; + IsUnsafe = unsafe; } DWaitingCommand::~DWaitingCommand () @@ -223,7 +226,10 @@ void DWaitingCommand::Tick () { if (--TicsLeft == 0) { + const bool wasUnsafe = UnsafeExecutionContext; + UnsafeExecutionContext = IsUnsafe; AddCommandString (Command); + UnsafeExecutionContext = wasUnsafe; Destroy (); } } @@ -739,7 +745,7 @@ void AddCommandString (char *cmd, int keynum) // Note that deferred commands lose track of which key // (if any) they were pressed from. *brkpt = ';'; - Create (brkpt, tics); + Create (brkpt, tics, UnsafeExecutionContext); } return; } From 6370594e17ddd9fa99b270a88ff67c772da3072d Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Mon, 8 Jan 2018 17:16:03 +0200 Subject: [PATCH 087/110] Fixed crash on finishgame CCMD before starting new game https://forum.zdoom.org/viewtopic.php?t=59045 --- src/d_player.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_player.h b/src/d_player.h index c8c5b0fc7c..80ac8c8700 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -510,7 +510,7 @@ public: crouchdir = 0; crouching = 0; crouchviewdelta = 0; - viewheight = mo->ViewHeight; + viewheight = mo ? mo->ViewHeight : 0; } } From f68d90accbb252306bcef62645f78afa0dfc4798 Mon Sep 17 00:00:00 2001 From: Blue Shadow Date: Mon, 8 Jan 2018 19:04:18 +0300 Subject: [PATCH 088/110] Fixed a case of infinite loop in A_BrainDie --- wadsrc/static/zscript/doom/bossbrain.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/wadsrc/static/zscript/doom/bossbrain.txt b/wadsrc/static/zscript/doom/bossbrain.txt index fadc280e3d..163683f277 100644 --- a/wadsrc/static/zscript/doom/bossbrain.txt +++ b/wadsrc/static/zscript/doom/bossbrain.txt @@ -205,7 +205,11 @@ extend class Actor if (mo.health > 0 && mo.bBossSpawned) { mo.DamageMobj(self, self, mo.health, "None", DMG_NO_ARMOR|DMG_FORCED|DMG_THRUSTLESS|DMG_NO_FACTOR); - count++; + + // [Blue Shadow] If 'mo' is a RandomSpawner or another actor which can't be killed, + // it could cause this code to loop indefinitely. So only let it trigger a loop if it + // has been actually killed. + if (mo.bKilled) count++; } } } while (count != 0); From 8667987cd65e709b8eb5c02e0b603d7aa515c3a5 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 8 Jan 2018 18:13:02 +0100 Subject: [PATCH 089/110] - DWaitingCommand needs to serialize its unsafe state. --- src/c_dispatch.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/c_dispatch.cpp b/src/c_dispatch.cpp index fa786b271b..ec4571b53b 100644 --- a/src/c_dispatch.cpp +++ b/src/c_dispatch.cpp @@ -197,7 +197,8 @@ void DWaitingCommand::Serialize(FSerializer &arc) { Super::Serialize (arc); arc("command", Command) - ("ticsleft", TicsLeft); + ("ticsleft", TicsLeft) + ("unsafe", IsUnsafe); } DWaitingCommand::DWaitingCommand () From 7416f42b4714de223c6e8cf2f69da136f7a34aa4 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 9 Jan 2018 12:34:01 -0500 Subject: [PATCH 090/110] - add 'FriendlySeeBlocks' actor property that allows a modder to expand the maximum radius that a friendly monster can see enemies. --- src/actor.h | 1 + src/p_enemy.cpp | 2 +- src/p_mobj.cpp | 2 ++ wadsrc/static/zscript/actor.txt | 3 +++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/actor.h b/src/actor.h index 0c92db400e..1510a5787c 100644 --- a/src/actor.h +++ b/src/actor.h @@ -1169,6 +1169,7 @@ public: int Score; // manipulated by score items, ACS or DECORATE. The engine doesn't use this itself for anything. FString * Tag; // Strife's tag name. int DesignatedTeam; // Allow for friendly fire cacluations to be done on non-players. + int friendlyseeblocks; // allow to override friendly search distance calculation AActor *BlockingMobj; // Actor that blocked the last move line_t *BlockingLine; // Line that blocked the last move diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index d44d3e4446..86bd5c8c33 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -1704,7 +1704,7 @@ bool P_LookForEnemies (AActor *actor, INTBOOL allaround, FLookExParams *params) { AActor *other; - other = P_BlockmapSearch (actor, 10, LookForEnemiesInBlock, params); + other = P_BlockmapSearch (actor, actor->friendlyseeblocks, LookForEnemiesInBlock, params); if (other != NULL) { diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index d5c5e93ea6..03f1e47508 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -355,6 +355,7 @@ DEFINE_FIELD(AActor, BloodColor) DEFINE_FIELD(AActor, BloodTranslation) DEFINE_FIELD(AActor, RenderHidden) DEFINE_FIELD(AActor, RenderRequired) +DEFINE_FIELD(AActor, friendlyseeblocks) //========================================================================== // @@ -533,6 +534,7 @@ void AActor::Serialize(FSerializer &arc) A("stealthalpha", StealthAlpha) A("renderhidden", RenderHidden) A("renderrequired", RenderRequired); + A("friendlyseeblocks", friendlyseeblocks); } #undef A diff --git a/wadsrc/static/zscript/actor.txt b/wadsrc/static/zscript/actor.txt index 6dd222fbfc..1cdbecc0e1 100644 --- a/wadsrc/static/zscript/actor.txt +++ b/wadsrc/static/zscript/actor.txt @@ -203,6 +203,7 @@ class Actor : Thinker native native readonly int BloodTranslation; native int RenderHidden; native int RenderRequired; + native readonly int FriendlySeeBlocks; meta String Obituary; // Player was killed by this actor meta String HitObituary; // Player was killed by this actor in melee @@ -292,6 +293,7 @@ class Actor : Thinker native property RipLevelMax: RipLevelMax; property RenderHidden: RenderHidden; property RenderRequired: RenderRequired; + property FriendlySeeBlocks: FriendlySeeBlocks; // need some definition work first //FRenderStyle RenderStyle; @@ -372,6 +374,7 @@ class Actor : Thinker native BurnHeight -1; RenderHidden 0; RenderRequired 0; + FriendlySeeBlocks 10; // 10 (blocks) * 128 (one map unit block) } // Functions From 68cd0fad76fb3c584319a3eba4fff4f4dc114785 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Mon, 8 Jan 2018 16:13:35 -0500 Subject: [PATCH 091/110] - fixed crash when entering 'finishgame' in the console outside of a level. --- src/statistics.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/statistics.cpp b/src/statistics.cpp index 865ba04110..447352f862 100644 --- a/src/statistics.cpp +++ b/src/statistics.cpp @@ -592,6 +592,12 @@ CCMD(printstats) CCMD(finishgame) { + bool gamestatecheck = gamestate == GS_LEVEL || gamestate == GS_INTERMISSION || gamestate == GS_FINALE; + if (!gamestatecheck) + { + Printf("Cannot use 'finishgame' while not in a game!\n"); + return; + } // This CCMD simulates an end-of-game action and exists to end mods that never exit their last level. Net_WriteByte(DEM_FINISHGAME); } From be82f3ef56220514e81cf702b295ab9c6a9f3f7c Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 9 Jan 2018 20:30:33 +0100 Subject: [PATCH 092/110] - TapwaveZodiac's submission for: * Improved French translation, also covers previously missing strings. * Adds a string for Borderless Windowed. * Adds option to enable or disable borderless windowed for Windows only. These commits had to be manually recreated because somehow the files appaarently ended up with CRLF in the repo which can cause problems with Windows Git and line ending normalization on. --- wadsrc/static/language.enu | 3 +- wadsrc/static/language.fr | 2641 ++++++++++++++++++++++++++---------- wadsrc/static/menudef.txt | 7 + 3 files changed, 1940 insertions(+), 711 deletions(-) diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index 1cb2460478..6bb5dbdc28 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -2186,13 +2186,14 @@ MODMNU_CHIPOMATIC = "Chip-o-matic"; RNDMNU_TITLE = "CHANGE RENDERER"; RNDMNU_RENDERER = "Hardware Acceleration"; RNDMNU_TRUECOLOR = "Software Truecolor Mode"; -RNDMNU_POLY = "Poly Renderer (experimental)"; +RNDMNU_POLY = "Poly Renderer (experimental)"; RNDMNU_CANVAS = "Software Canvas"; // Video Options VIDMNU_TITLE = "VIDEO MODE"; VIDMNU_FULLSCREEN = "Fullscreen"; VIDMNU_HIDPI = "Retina/HiDPI support"; +VIDMNU_BRDLSS = "Borderless Windowed Mode"; VIDMNU_ASPECTRATIO = "Aspect ratio"; VIDMNU_FORCEASPECT = "Force aspect ratio"; VIDMNU_CROPASPECT = "Forced ratio style"; diff --git a/wadsrc/static/language.fr b/wadsrc/static/language.fr index 155ba21c0e..9731033278 100644 --- a/wadsrc/static/language.fr +++ b/wadsrc/static/language.fr @@ -1,323 +1,348 @@ //===================================== -//French strings updated by DoomKn1ght. +//French strings updated by Tapwave. +//Some strings are "missing" because they're identical in English. +//(Usually 'secrets', but also some other items.) //===================================== [fr] -D_DEVSTR = "MODE DEVELOPPEMENT ON.\n"; -D_CDROM = "VERSION CD-ROM: DEFAULT.CFG DANS C:\\DOOMDATA\n"; +D_DEVSTR = "Mode développeur ON.\n"; +D_CDROM = "Version CD-ROM: DEFAULT.CFG dans C:\\DOOMDATA\n"; // // M_Menu.C // -PRESSKEY = "APPUYEZ SUR UNE TOUCHE."; -PRESSYN = "APPUYEZ SUR Y OU N"; -QUITMSG = "VOUS VOULEZ VRAIMENT\nQUITTER CE SUPER JEU?"; +PRESSKEY = "Appuyez sur un touche.."; +PRESSYN = "Appuyez sur Y ou N."; +QUITMSG = "Voulez-vous vraiment \nquitter cet excellent jeu?"; TXT_YES = "Oui"; TXT_NO = "Non"; // QuitDoom1 messages -QUITMSG1 = "ne partez pas,Il ya encore\ndes démons a griller!"; -QUITMSG2 = "fichons le camp ,ça dégenere\nen bain de sang!"; -QUITMSG3 = "Je ne quitterai pas si j'etait vous.\nos est bien pire."; -QUITMSG4 = "Vous essayez de dire que vous aimez dos\nmieux que moi ,pas vrai?"; -QUITMSG5 = "Ne partez pas encore-il y a \nun demon dans le coin!"; -QUITMSG6 = "vous savez ,la prochaine que vous venez ici\nje vous grille."; -QUITMSG7 = "allez y partez. regardez si j'y fais attention."; +QUITMSG1 = "Ne partez pas, il ya encore\ndes démons a buter!"; +QUITMSG2 = "Fichons le camp, ça dégénère\nen bain de sang!"; +QUITMSG3 = "Je ne quitterais pas si j'étais vous.\nVotre OS est bien pire."; +QUITMSG4 = "Vous essayez de dire que vous aimez DOS\nmieux que moi, pas vrai?"; +QUITMSG5 = "Ne partez pas encore! Il y a \nun démon dans le coin!"; +QUITMSG6 = "Vous savez, la prochaine que revenez\nje vous grille."; +QUITMSG7 = "Allez y, partez, allez voir si j'y suis."; // QuitDOOM II messages -QUITMSG8 = "vous voulez vraiment quitter?\nalors,vous avez perdus un huitieme!"; -QUITMSG9 = "ne partez pas maintenent,il y a un \nportail interdimensionnel attendant\na l'ecran os"; -QUITMSG10 = "tirez vous de la et retournez\na vos programmes ennuyeux."; -QUITMSG11 = "si j'etait votre patron,je vous\n tuerais dans la minute!"; -QUITMSG12 = "regardez l'ami. vous partez maintenant\net vous perdez votre nombre de tues!"; -QUITMSG13 = "allez partez. quand vous reviendrez\n,je vous attendrai avec une batte."; -QUITMSG14 = "vous etes chanceux je vous gifle pas\nparce que vous pensez partir."; +QUITMSG8 = "Vous voulez vraiment quitter?\nVous avez vraiment les fils qui se croisent!"; +QUITMSG9 = "Ne partez pas maintenant, il y a un \nportail interdimensionnel dans\n votre os!"; +QUITMSG10 = "Tirez vous de là et retournez\nà vos programmes ennuyeux."; +QUITMSG11 = "Si j'étais votre patron, je vous\n collerai un Deathmatch dans la minute!"; +QUITMSG12 = "Regardez l'ami. Vous partez maintenant\net vous pouvez oublier votre score!"; +QUITMSG13 = "Allez, partez. Quand vous reviendrez\nje vous attendrai avec une batte."; +QUITMSG14 = "Vous êtes chanceux que je ne vous \ncolle pas une parce que vous pensez partir."; // Quit Strife messages -QUITMSG15 = "ou allez vous?!\nque va devenir la rebellion?"; -QUITMSG16 = "carnage interruptus...\ntout un programme!"; -QUITMSG17 = "mais vous etes l'espoir\n-- mon unique chance!!"; -QUITMSG18 = "personne ne peut marcher sur un oiseau noir."; -QUITMSG19 = "je vous pensais different..."; -QUITMSG20 = "d'accord! tuez et allez vous en!"; -QUITMSG21 = "vous pouvez quitter...\nmais vous ne pouvez pas vous cacher..."; -QUITMSG22 = "whaaa, quel est le probleme?\nvotre mere a dit a table?"; +QUITMSG15 = "Où allez vous?\nQue va devenir la rébellion?"; +QUITMSG16 = "Carnage interruptus...\nTout un programme!"; +QUITMSG17 = "Mais vous êtes l'espoir,\n notre unique chance!"; +QUITMSG18 = "Personne n'abandonne Blackbird!"; +QUITMSG19 = "Je vous croyais différent..."; +QUITMSG20 = "C'est ça! Tuez n'importe-qui \net barrez-vous comme ça!"; +QUITMSG21 = "Vous pouvez partir...\nMais vous ne pouvez pas vous cacher..."; +QUITMSG22 = "Bah, il est où est le problème?\nMaman a dit 'à table!'?"; // Quit Chex messages -QUITMSG23 = "N'abbandonnez pas maintenant...do\nVoulez vous toujours quitter?"; -QUITMSG24 = "S'il vous plait ne quitter pas, nous\nnescessitons votre aide!"; //7 times as likely to show +QUITMSG23 = "N'abandonnez pas maintenant...do\nVoulez vous toujours quitter?"; +QUITMSG24 = "Ne partez pas, ou les\n Flémoïdes vont nous battre!"; +QUITMSG25 = "S'il vous plaît, ne quittez pas, nous\navons besoin de votre aide!"; +QUITMSG26 = "J'espère que tu prends une pause\npour un bol de Chex(R) Party Mix."; +QUITMSG27 = "Restez avec nous!\nNous avons besoin de vous!"; +QUITMSG28 = "N'abandonnez pas la\nFédération Intergalactique des Céréales!"; +QUITMSG29 = "Le vrai Chex Warrior\nn'abandonnerait pas de si tôt!"; -LOADNET = "VOUS NE POUVEZ PAS CHARGER\nUN JEU EN RESEAU!\n\nAPPUYEZ SUR UNE TOUCHE."; -QLOADNET = "CHARGEMENT RAPIDE INTERDIT EN RESEAU!\n\nAPPUYEZ SUR UNE TOUCHE."; -QSAVESPOT = "VOUS N'AVEZ PAS CHOISI UN EMPLACEMENT!\n\nAPPUYEZ SUR UNE TOUCHE."; -SAVEDEAD = "VOUS NE POUVEZ PAS SAUVER SI VOUS NE JOUEZ" - "PAS!\n\nAPPUYEZ SUR UNE TOUCHE."; -QSPROMPT = "SAUVEGARDE RAPIDE DANS LE FICHIER \n\n'%s'?\n\nAPPUYEZ SUR Y OU N"; -QLPROMPT = "VOULEZ-VOUS CHARGER LA SAUVEGARDE" - "\n\n'%s'?\n\nAPPUYEZ SUR Y OU N"; -NEWGAME = "VOUS NE POUVEZ PAS LANCER\n" - "UN NOUVEAU JEU SUR RESEAU.\n\nAPPUYEZ SUR UNE TOUCHE."; -NIGHTMARE = "VOUS CONFIRMEZ? CE NIVEAU EST\n" - "VRAIMENT IMPITOYABLE!\nAPPUYEZ SUR Y OU N"; -SWSTRING = "CECI EST UNE VERSION SHAREWARE DE DOOM.\n\n" - "VOUS DEVRIEZ COMMANDER LA TRILOGIE COMPLETE.\n\nAPPUYEZ SUR UNE TOUCHE."; -MSGOFF = "MESSAGES OFF"; -MSGON = "MESSAGES ON"; -NETEND = "VOUS NE POUVEZ PAS METTRE FIN A UN JEU SUR " - "RESEAU!\n\nAPPUYEZ SUR UNE TOUCHE."; -ENDGAME = "VOUS VOULEZ VRAIMENT METTRE FIN AU JEU?\n\nAPPUYEZ SUR Y OU N"; -DOSY = "(APPUYEZ SUR Y POUR REVENIR AU OS.)"; +LOADNET = "Impossible de charger une partie\npendant un jeu en réseau!\n\nAppuyez sur un touche."; +QLOADNET = "Chargement Rapide impossible\npendant un jeu en réseau!\n\nAppuyez sur un touche."; +QSAVESPOT = "Vous n'avez pas choisi un\nemplacement de sauvegarde!\n\nAppuyez sur un touche."; +SAVEDEAD = "Vous ne pouvez pas sauvegarder" + "si vous ne jouez pas!\n\nAppuyez sur un touche."; +QSPROMPT = "Sauvegarde rapide sur le fichier \n\n'%s'?\n\nAppuyez sur Y ou N."; +QLPROMPT = "Voulez-vous charger la sauvegarde" + "\n\n'%s'?\n\nAppuyez sur Y ou N."; +NEWGAME = "Vous ne pouvez pas lancer\n" + "une nouvelle partie en réseau.\n\nAppuyez sur un touche."; +NIGHTMARE = "Vous êtes sur? Ce niveau de\n" + "difficulté est vraiment impitoyuable!\nAppuyez sur Y ou N."; +SWSTRING = "Votre version de DOOM est une version SHAREWARE.\n\n" + "Pensez à commander la version complète!\n\nAppuyez sur un touche."; +MSGOFF = "Messages désactivés."; +MSGON = "Messages activés."; +NETEND = "Vous ne pouvez pas mettre fin à " + "une partie en réseau!\n\nAppuyez sur un touche."; +ENDGAME = "Voulez vous mettre fin à votre partie?\n\nAppuyez sur Y ou N."; -EMPTYSTRING = "EMPLACEMENT VIDE"; +DOSY = "(Appuyez sur Y pour revenir à votre OS.)"; + +EMPTYSTRING = "Emplacement Vide"; // // P_inter.C // -GOTARMOR = "ARMURE RECUPEREE."; -GOTMEGA = "MEGA-ARMURE RECUPEREE!"; -GOTHTHBONUS = "BONUS DE SANTE RECUPERE."; -GOTARMBONUS = "BONUS D'ARMURE RECUPERE."; -GOTSTIM = "STIMPACK RECUPERE."; -GOTMEDINEED = "MEDIKIT RECUPERE. VOUS EN AVEZ VRAIMENT BESOIN!"; -GOTMEDIKIT = "MEDIKIT RECUPERE."; -GOTSUPER = "SUPERCHARGE!"; +GOTARMOR = "Armure récupérée."; +GOTMEGA = "Méga-Armure récupérée!"; +GOTHTHBONUS = "Bonus de Santé récupéré."; +GOTARMBONUS = "Bonus d'Armure récupéré."; +GOTSTIM = "Stimpack récupéré."; +GOTMEDINEED = "Médikit récupéré, et vous en aviez vraiment besoin!"; +GOTMEDIKIT = "Médikit récupéré."; +GOTSUPER = "Supercharge!"; -GOTBLUECARD = "CARTE MAGNETIQUE BLEUE RECUPEREE."; -GOTYELWCARD = "CARTE MAGNETIQUE JAUNE RECUPEREE."; -GOTREDCARD = "CARTE MAGNETIQUE ROUGE RECUPEREE."; -GOTBLUESKUL = "CLEF CRANE BLEUE RECUPEREE."; -GOTYELWSKUL = "CLEF CRANE JAUNE RECUPEREE."; -GOTREDSKUL = "CLEF CRANE ROUGE RECUPEREE."; +GOTBLUECARD = "Carte d'accès BLEUE récupérée."; +GOTYELWCARD = "Carte d'accès JAUNE récupérée."; +GOTREDCARD = "Carte d'accès ROUGE récupérée."; +GOTBLUESKUL = "Clef Crâne BLEUE récupérée."; +GOTYELWSKUL = "Clef Crâne JAUNE récupérée."; +GOTREDSKUL = "Clef Crâne ROUGE récupérée."; -GOTINVUL = "INVULNERABILITE!"; -GOTBERSERK = "BERSERK!"; -GOTINVIS = "INVISIBILITE PARTIELLE "; -GOTSUIT = "COMBINAISON ANTI-RADIATIONS "; -GOTMAP = "CARTE INFORMATIQUE "; -GOTVISOR = "VISEUR A AMPLIFICATION DE LUMIERE "; -GOTMSPHERE = "MEGASPHERE!"; +GOTINVUL = "Invulnérabilité!"; +GOTINVIS = "Invisibilité Partielle"; +GOTSUIT = "Combinaison Hazmat"; +GOTMAP = "Carte Informatique"; +GOTVISOR = "Lunettes de Vision Nocturne"; +GOTMSPHERE = "Mégasphere!"; -GOTCLIP = "CHARGEUR RECUPERE."; -GOTCLIPBOX = "BOITE DE BALLES RECUPEREE."; -GOTROCKET = "ROQUETTE RECUPEREE."; -GOTROCKBOX = "CAISSE DE ROQUETTES RECUPEREE."; -GOTCELL = "CELLULE D'ENERGIE RECUPEREE."; -GOTCELLBOX = "PACK DE CELLULES D'ENERGIE RECUPERE."; -GOTSHELLS = "4 CARTOUCHES RECUPEREES."; -GOTSHELLBOX = "BOITE DE CARTOUCHES RECUPEREE."; -GOTBACKPACK = "SAC PLEIN DE MUNITIONS RECUPERE!"; +GOTCLIP = "Chargeur récupéré."; +GOTCLIPBOX = "Boîte de balles récupérée."; +GOTROCKET = "Roquette récupérée."; +GOTROCKBOX = "Caisse de roquettes récupérée."; +GOTCELL = "Cellule énergétique récupérée."; +GOTCELLBOX = "Pack de cellules énergétiques récupéré."; +GOTSHELLS = "4 cartouches récupérées."; +GOTSHELLBOX = "Boîte de cartouches récupérée."; +GOTBACKPACK = "Sac à dos plein de munitions récupéré!"; -GOTBFG9000 = "VOUS AVEZ UN BFG9000! OH, OUI!"; -GOTCHAINGUN = "VOUS AVEZ LA MITRAILLEUSE!"; -GOTCHAINSAW = "UNE TRONCONNEUSE!"; -GOTLAUNCHER = "VOUS AVEZ UN LANCE-ROQUETTES!"; -GOTPLASMA = "VOUS AVEZ UN FUSIL A PLASMA!"; -GOTSHOTGUN = "VOUS AVEZ UN FUSIL!"; -GOTSHOTGUN2 = "VOUS AVEZ UN SUPER FUSIL!"; - -// -// P_Doors.C -// -PD_BLUEO = "IL VOUS FAUT UNE CLEF BLEUE"; -PD_REDO = "IL VOUS FAUT UNE CLEF ROUGE"; -PD_YELLOWO = "IL VOUS FAUT UNE CLEF JAUNE"; -PD_BLUEK = "IL VOUS FAUT UNE CLEF BLEUE"; -PD_REDK = "IL VOUS FAUT UNE CLEF ROUGE"; -PD_YELLOWK = "IL VOUS FAUT UNE CLEF JAUNE"; +GOTBFG9000 = "UN BFG9000! OH, OUI!"; +GOTCHAINGUN = "Une MITRAILLEUSE!"; +GOTCHAINSAW = "Une TRONCONNEUSE! Viande frâiche!"; +GOTLAUNCHER = "Un LANCE-ROQUETTES!"; +GOTPLASMA = "Un FUSIL A PLASMA!"; +GOTSHOTGUN = "Un FUSIL A POMPE!"; +GOTSHOTGUN2 = "Un SUPER FUSIL DE CHASSE!"; +PICKUP_PISTOL_DROPPED = "Un PISTOLET."; +BETA_BONUS1 = "Dague diabolique récupérée."; +BETA_BONUS2 = "Coffre-crâne récupéré."; +BETA_BONUS3 = "Sceptre maléfique récupéré."; +BETA_BONUS4 = "Bible profane récupérée."; // // G_game.C // -GGSAVED = "JEU SAUVEGARDE."; +GGSAVED = "Partie sauvegardée."; +NEWSAVE = ""; // // HU_stuff.C // -HUSTR_MSGU = "[MESSAGE NON ENVOYE]"; +HUSTR_MSGU = "[Message Non Envoyé]"; -HUSTR_E1M1 = "E1M1: HANGAR"; -HUSTR_E1M2 = "E1M2: USINE NUCLEAIRE "; -HUSTR_E1M3 = "E1M3: RAFFINERIE DE TOXINES "; -HUSTR_E1M4 = "E1M4: CENTRE DE CONTROLE "; -HUSTR_E1M5 = "E1M5: LABORATOIRE PHOBOS "; -HUSTR_E1M6 = "E1M6: TRAITEMENT CENTRAL "; -HUSTR_E1M7 = "E1M7: CENTRE INFORMATIQUE "; -HUSTR_E1M8 = "E1M8: ANOMALIE PHOBOS "; -HUSTR_E1M9 = "E1M9: BASE MILITAIRE "; +HUSTR_E1M1 = "E1M1: Hangar"; +HUSTR_E1M2 = "E1M2: Centrale Nucléaire"; +HUSTR_E1M3 = "E1M3: Raffinerie de Toxines"; +HUSTR_E1M4 = "E1M4: Centre de Contrôle"; +HUSTR_E1M5 = "E1M5: Laboratoires Phobos"; +HUSTR_E1M6 = "E1M6: Centre de Traitement"; +HUSTR_E1M7 = "E1M7: Station Informatique"; +HUSTR_E1M8 = "E1M8: Anomalie de Phobos"; +HUSTR_E1M9 = "E1M9: Base Militaire "; -HUSTR_E2M1 = "E2M1: ANOMALIE DEIMOS "; -HUSTR_E2M2 = "E2M2: ZONE DE CONFINEMENT "; -HUSTR_E2M3 = "E2M3: RAFFINERIE"; -HUSTR_E2M4 = "E2M4: LABORATOIRE DEIMOS "; -HUSTR_E2M5 = "E2M5: CENTRE DE CONTROLE "; -HUSTR_E2M6 = "E2M6: HALLS DES DAMNES "; -HUSTR_E2M7 = "E2M7: CUVES DE REPRODUCTION "; -HUSTR_E2M8 = "E2M8: TOUR DE BABEL "; -HUSTR_E2M9 = "E2M9: FORTERESSE DU MYSTERE "; +HUSTR_E2M1 = "E2M1: Anomalie de Déimos"; +HUSTR_E2M2 = "E2M2: Zone de Stockage"; +HUSTR_E2M3 = "E2M3: Raffinerie"; +HUSTR_E2M4 = "E2M4: Laboratoires Déimos"; +HUSTR_E2M5 = "E2M5: Centre de Commandement"; +HUSTR_E2M6 = "E2M6: Halls des Damnés"; +HUSTR_E2M7 = "E2M7: Cuves de Reproduction"; +HUSTR_E2M8 = "E2M8: Tour de Babel"; +HUSTR_E2M9 = "E2M9: Mystérieuse Forteresse"; -HUSTR_E3M1 = "E3M1: DONJON DE L'ENFER "; -HUSTR_E3M2 = "E3M2: BOURBIER DU DESESPOIR "; -HUSTR_E3M3 = "E3M3: PANDEMONIUM"; -HUSTR_E3M4 = "E3M4: MAISON DE LA DOULEUR "; -HUSTR_E3M5 = "E3M5: CATHEDRALE PROFANE "; -HUSTR_E3M6 = "E3M6: MONT EREBUS"; -HUSTR_E3M7 = "E3M7: LIMBES"; -HUSTR_E3M8 = "E3M8: DIS"; -HUSTR_E3M9 = "E3M9: CLAPIERS"; +HUSTR_E3M1 = "E3M1: Donjon Infernal"; +HUSTR_E3M2 = "E3M2: Bourbier du Désespoir"; +HUSTR_E3M3 = "E3M3: Pandémonium"; +HUSTR_E3M4 = "E3M4: Maison de la Douleur"; +HUSTR_E3M5 = "E3M5: Cathédrale Profane"; +HUSTR_E3M6 = "E3M6: Mont Erèbe"; +HUSTR_E3M7 = "E3M7: Limbes"; +HUSTR_E3M8 = "E3M8: Dis"; +HUSTR_E3M9 = "E3M9: Clapiers"; -HUSTR_E4M1 = "E4M1: L'ENFER EN CONTREBAS"; -HUSTR_E4M2 = "E4M2: UNE HAINE PARFAITE"; -HUSTR_E4M3 = "E4M3: COUPER LE MAL"; -HUSTR_E4M4 = "E4M4: LE MAL INDISCIPLINE "; -HUSTR_E4M5 = "E4M5: ILS S'EN REPENTIRONT"; -HUSTR_E4M6 = "E4M6: CONTRE TOI AVEC MECHANCETE"; -HUSTR_E4M7 = "E4M7: ET L'ENFER SUIVI"; -HUSTR_E4M8 = "E4M8: UNTO LE CRUEL"; -HUSTR_E4M9 = "E4M9: PEUR"; +HUSTR_E4M1 = "E4M1: Le Séjour des Morts"; +HUSTR_E4M2 = "E4M2: Une Parfaite Haine"; +HUSTR_E4M3 = "E4M3: Séparer les Vicieux"; +HUSTR_E4M4 = "E4M4: Un Mal Irrépréssible"; +HUSTR_E4M5 = "E4M5: Ils se repentiront"; +HUSTR_E4M6 = "E4M6: D'une manière criminelle"; +HUSTR_E4M7 = "E4M7: Et l'Enfer Suivit"; +HUSTR_E4M8 = "E4M8: A un Homme cruel"; +HUSTR_E4M9 = "E4M9: Terreur"; -HUSTR_1 = "NIVEAU 1: ENTREE "; -HUSTR_2 = "NIVEAU 2: HALLS SOUTERRAINS "; -HUSTR_3 = "NIVEAU 3: LE FEU NOURRI "; -HUSTR_4 = "NIVEAU 4: LE FOYER "; -HUSTR_5 = "NIVEAU 5: LES EGOUTS "; -HUSTR_6 = "NIVEAU 6: LE BROYEUR "; -HUSTR_7 = "NIVEAU 7: L'HERBE DE LA MORT"; -HUSTR_8 = "NIVEAU 8: RUSES ET PIEGES "; -HUSTR_9 = "NIVEAU 9: LE PUITS "; -HUSTR_10 = "NIVEAU 10: BASE DE RAVITAILLEMENT "; -HUSTR_11 = "NIVEAU 11: LE CERCLE DE LA MORT!"; - -HUSTR_12 = "NIVEAU 12: L'USINE "; -HUSTR_13 = "NIVEAU 13: LE CENTRE VILLE"; -HUSTR_14 = "NIVEAU 14: LES ANTRES PROFONDES "; -HUSTR_15 = "NIVEAU 15: LA ZONE INDUSTRIELLE "; -HUSTR_16 = "NIVEAU 16: LA BANLIEUE"; -HUSTR_17 = "NIVEAU 17: LES IMMEUBLES"; -HUSTR_18 = "NIVEAU 18: LA COUR "; -HUSTR_19 = "NIVEAU 19: LA CITADELLE "; -HUSTR_20 = "NIVEAU 20: JE T'AI EU!"; - -HUSTR_21 = "NIVEAU 21: LE NIRVANA"; -HUSTR_22 = "NIVEAU 22: LES CATACOMBES "; -HUSTR_23 = "NIVEAU 23: LA GRANDE FETE "; -HUSTR_24 = "NIVEAU 24: LE GOUFFRE "; -HUSTR_25 = "NIVEAU 25: LES CHUTES DE SANG"; -HUSTR_26 = "NIVEAU 26: LES MINES ABANDONNEES "; -HUSTR_27 = "NIVEAU 27: CHEZ LES MONSTRES "; -HUSTR_28 = "NIVEAU 28: LE MONDE DE L'ESPRIT "; -HUSTR_29 = "NIVEAU 29: LA LIMITE "; -HUSTR_30 = "NIVEAU 30: L'ICONE DU PECHE "; +HUSTR_1 = "NIVEAU 1: Hall D'Entrée"; +HUSTR_2 = "NIVEAU 2: Souterrains"; +HUSTR_3 = "NIVEAU 3: Parcours du Combatant"; +HUSTR_4 = "NIVEAU 4: Le Focus"; +HUSTR_5 = "NIVEAU 5: Les Egouts"; +HUSTR_6 = "NIVEAU 6: Le Broyeur"; +HUSTR_7 = "NIVEAU 7: Mortellement Simple"; +HUSTR_8 = "NIVEAU 8: Ruses et Pièges"; +HUSTR_9 = "NIVEAU 9: La Fosse"; +HUSTR_10 = "NIVEAU 10: Base de Ravitaillement"; +HUSTR_11 = "NIVEAU 11: Le Cercle de la Mort!"; +HUSTR_12 = "NIVEAU 12: L'Usine"; +HUSTR_13 = "NIVEAU 13: Centre-Ville"; +HUSTR_14 = "NIVEAU 14: Les Antres Profondes"; +HUSTR_15 = "NIVEAU 15: Zone Industrielle"; +HUSTR_16 = "NIVEAU 16: Banlieue"; +HUSTR_17 = "NIVEAU 17: Immeubles"; +HUSTR_18 = "NIVEAU 18: La Cour"; +HUSTR_19 = "NIVEAU 19: La Citadelle"; +HUSTR_20 = "NIVEAU 20: Je t'ai Eu!"; +HUSTR_21 = "NIVEAU 21: Nirvana"; +HUSTR_22 = "NIVEAU 22: Les Catacombes"; +HUSTR_23 = "NIVEAU 23: Une Tonne-eau de plaisir"; +HUSTR_24 = "NIVEAU 24: Le Gouffre"; +HUSTR_25 = "NIVEAU 25: Chutes de Sang"; +HUSTR_26 = "NIVEAU 26: Les Mines Abandonnées"; +HUSTR_27 = "NIVEAU 27: Monstrueuse Résiden,ce"; +HUSTR_28 = "NIVEAU 28: Le Monde Spirituel"; +HUSTR_29 = "NIVEAU 29: La Limite"; +HUSTR_30 = "NIVEAU 30: L'Icône du Péché"; HUSTR_31 = "NIVEAU 31: WOLFENSTEIN"; -HUSTR_32 = "NIVEAU 32: LE MASSACRE"; +HUSTR_32 = "NIVEAU 32: GROSSE"; +HUSTR_31B = "NIVEAU 31: IDKFQ"; +HUSTR_32B = "NIVEA 32: KEEN"; +HUSTR_33 = "Niveau 33: Trahison"; -PHUSTR_1 = "level 1: congo"; -PHUSTR_2 = "level 2: la source des ames"; -PHUSTR_3 = "level 3: aztec"; -PHUSTR_4 = "level 4: mis en cage"; -PHUSTR_5 = "level 5: la ville fantome"; -PHUSTR_6 = "level 6: le repair des barons"; -PHUSTR_7 = "level 7: caughtyard"; -PHUSTR_8 = "level 8: le royaume"; -PHUSTR_9 = "level 9: abattoire"; -PHUSTR_10 = "level 10: l'assault"; -PHUSTR_11 = "level 11: traque"; -PHUSTR_12 = "level 12: vitesse"; -PHUSTR_13 = "level 13: la crypte"; -PHUSTR_14 = "level 14: la genese"; -PHUSTR_15 = "level 15: le crepuscule"; -PHUSTR_16 = "level 16: le presage"; -PHUSTR_17 = "level 17: l'enceinte"; -PHUSTR_18 = "level 18: la neurosphere"; -PHUSTR_19 = "level 19: nme"; -PHUSTR_20 = "level 20: le domaine de la mort"; -PHUSTR_21 = "level 21: le pourfendeur"; -PHUSTR_22 = "level 22: mission impossible"; -PHUSTR_23 = "level 23: la pierre tombale"; -PHUSTR_24 = "level 24: la frontiere finale"; -PHUSTR_25 = "level 25: le temple des tenebres"; -PHUSTR_26 = "level 26: bunker"; -PHUSTR_27 = "level 27: ante-christ"; -PHUSTR_28 = "level 28: l'egout"; -PHUSTR_29 = "level 29: l'odyssee des bruits"; -PHUSTR_30 = "level 30: la porte de l'enfer"; -PHUSTR_31 = "level 31: l'antre des demons-cybernetiques"; -PHUSTR_32 = "level 32: On y va!"; +NHUSTR_1 = "NIVEAU 1: La Base Terrienne"; +NHUSTR_2 = "NIVEAU 2: Les Laboratoires de la Douleur"; +NHUSTR_3 = "NIVEAU 3: Canyon des Morts"; +NHUSTR_4 = "NIVEAU 4: Montagne Infernale"; +NHUSTR_5 = "NIVEAU 5: Vivisection"; +NHUSTR_6 = "NIVEAU 6: Enfer Sanglant"; +NHUSTR_7 = "NIVEAU 7: Banquet du Baron"; +NHUSTR_8 = "NIVEAU 8: Tombe Maléfique"; +NHUSTR_9 = "NIVEAU 9: Marche des Démons"; -THUSTR_1 = "level 1: le systeme de controle"; -THUSTR_2 = "level 2: le barbecue humain"; -THUSTR_3 = "level 3: le controle de l'energie"; -THUSTR_4 = "level 4: les trous de vers"; -THUSTR_5 = "level 5: la boucle"; -THUSTR_6 = "level 6: la saison d'ouverture"; -THUSTR_7 = "level 7: la prison"; -THUSTR_8 = "level 8: metal"; -THUSTR_9 = "level 9: le fief"; -THUSTR_10 = "level 10: redemption"; -THUSTR_11 = "level 11: le complexe de stockage"; -THUSTR_12 = "level 12: le cratere"; -THUSTR_13 = "level 13: l'usine de traitement des dechets nucleaires"; -THUSTR_14 = "level 14: l'acierie"; -THUSTR_15 = "level 15: la zone morte"; -THUSTR_16 = "level 16: les echelons les plus bas"; -THUSTR_17 = "level 17: la zone de traitement"; -THUSTR_18 = "level 18: le moulin"; -THUSTR_19 = "level 19: acheminement/production"; -THUSTR_20 = "level 20: traitement central"; -THUSTR_21 = "level 21: le centre administratif"; -THUSTR_22 = "level 22: l'habitat"; -THUSTR_23 = "level 23: le projet de mine lunaire"; -THUSTR_24 = "level 24: la carrière"; -THUSTR_25 = "level 25: l'antre des barons"; -THUSTR_26 = "level 26: ballistyx"; -THUSTR_27 = "level 27: le mont souffrance"; -THUSTR_28 = "level 28: que diable?"; -THUSTR_29 = "level 29: le fleuve styx"; -THUSTR_30 = "level 30: le dernier appel"; -THUSTR_31 = "level 31: pharaon"; -THUSTR_32 = "level 32: les caraibbes"; -HUSTR_TALKTOSELF1 = "VOUS PARLEZ TOUT SEUL "; -HUSTR_TALKTOSELF2 = "QUI EST LA?"; -HUSTR_TALKTOSELF3 = "VOUS VOUS FAITES PEUR "; -HUSTR_TALKTOSELF4 = "VOUS COMMENCEZ A DELIRER "; -HUSTR_TALKTOSELF5 = "VOUS ETES LARGUE..."; +PHUSTR_1 = "NIVEAU 1: Congo"; +PHUSTR_2 = "NIVEAU 2: Puits des Ames"; +PHUSTR_3 = "NIVEAU 3: Aztèque"; +PHUSTR_4 = "NIVEAU 4: Enfermé"; +PHUSTR_5 = "NIVEAU 5: Ville Fantôme"; +PHUSTR_6 = "NIVEAU 6: Repaire du Baron"; +PHUSTR_7 = "NIVEAU 7: Cour-oincé"; +PHUSTR_8 = "NIVEAU 8: Royaume"; +PHUSTR_9 = "NIVEAU 9: Abattoir"; +PHUSTR_10 = "NIVEAU 10: Assaut"; +PHUSTR_11 = "NIVEAU 11: Traque"; +PHUSTR_12 = "NIVEAU 12: Vitesse"; +PHUSTR_13 = "NIVEAU 13: La Crypte"; +PHUSTR_14 = "NIVEAU 14: Genèse"; +PHUSTR_15 = "NIVEAU 15: Le Crépuscule"; +PHUSTR_16 = "NIVEAU 16: Le Présage"; +PHUSTR_17 = "NIVEAU 17: Installation"; +PHUSTR_18 = "NIVEAU 18: Neurosphère"; +PHUSTR_19 = "NIVEAU 19: NMI"; +PHUSTR_20 = "NIVEAU 20: Le Domaine de la Mort"; +PHUSTR_21 = "NIVEAU 21: Pourfendeur"; +PHUSTR_22 = "NIVEAU 22: Mission Impossible"; +PHUSTR_23 = "NIVEAU 23: Pierre Tombale"; +PHUSTR_24 = "NIVEAU 24: La Frontière Finale"; +PHUSTR_25 = "NIVEAU 25: Le Temple des Ténèbres"; +PHUSTR_26 = "NIVEAU 26: Bunker"; +PHUSTR_27 = "NIVEAU 27: Anti-Christ"; +PHUSTR_28 = "NIVEAU 28: Les Egouts"; +PHUSTR_29 = "NIVEAU 29: Odysée de Bruits"; +PHUSTR_30 = "NIVEAU 30: La Porte des Enferts"; +PHUSTR_31 = "NIVEAU 31: Cyber-Antre"; +PHUSTR_32 = "NIVEAU 32: GO 2 IT"; -HUSTR_MESSAGESENT = "[MESSAGE ENVOYE]"; +THUSTR_1 = "NIVEAU 1: Système de Contrôle"; +THUSTR_2 = "NIVEAU 2: Barbecue Humain"; +THUSTR_3 = "NIVEAU 3: Contrôle Energétique"; +THUSTR_4 = "NIVEAU 4: Trou de Ver"; +THUSTR_5 = "NIVEAU 5: Hangar"; +THUSTR_6 = "NIVEAU 6: La Chasse Est Ouverte"; +THUSTR_7 = "NIVEAU 7: Prison"; +THUSTR_8 = "NIVEAU 8: Métal"; +THUSTR_9 = "NIVEAU 9: Forteresse"; +THUSTR_10 = "NIVEAU 10: Rédemption"; +THUSTR_11 = "NIVEAU 11: Complexe de Stockage"; +THUSTR_12 = "NIVEAU 12: Cratère"; +THUSTR_13 = "NIVEAU 13: Traitement Nucléaire"; +THUSTR_14 = "NIVEAU 14: Aciérie"; +THUSTR_15 = "NIVEAU 15: Zone Morte"; +THUSTR_16 = "NIVEAU 16: Profondeurs"; +THUSTR_17 = "NIVEAU 17: Zone de Traitement"; +THUSTR_18 = "NIVEAU 18: Fonderie"; +THUSTR_19 = "NIVEAU 19: Envoi/Réapparition"; +THUSTR_20 = "NIVEAU 20: Organisme Central"; +THUSTR_21 = "NIVEAU 21: Centre Administratif"; +THUSTR_22 = "NIVEAU 22: Habitat"; +THUSTR_23 = "NIVEAU 23: Projet Minier Lunaire"; +THUSTR_24 = "NIVEAU 24: Carrière"; +THUSTR_25 = "NIVEAU 25: l'Antre des Barons"; +THUSTR_26 = "NIVEAU 26: Ballistyx"; +THUSTR_27 = "NIVEAU 27: Mont Souffrance"; +THUSTR_28 = "NIVEAU 28: Que Diable?"; +THUSTR_29 = "NIVEAU 29: Fleuve Styx"; +THUSTR_30 = "NIVEAU 30: Dernier Appel"; +THUSTR_31 = "NIVEAU 31: Pharaon"; +THUSTR_32 = "NIVEAU 32: Caraïbes"; + +HUSTR_TALKTOSELF1 = "Vous parlez tout seul."; +HUSTR_TALKTOSELF2 = "Qui est là?"; +HUSTR_TALKTOSELF3 = "Vous vous surprenez."; +HUSTR_TALKTOSELF4 = "Vous commencez à délirer!"; +HUSTR_TALKTOSELF5 = "Vous avez perdu les pédales..."; + +HUSTR_MESSAGESENT = "[Message Envoyé]"; // // AM_map.C // -AMSTR_FOLLOWON = "MODE POURSUITE ON"; -AMSTR_FOLLOWOFF = "MODE POURSUITE OFF"; +AMSTR_FOLLOWON = "Suivi du Joueur ON"; +AMSTR_FOLLOWOFF = "Suivi du Joueur OFF"; -AMSTR_GRIDON = "GRILLE ON"; -AMSTR_GRIDOFF = "GRILLE OFF"; +AMSTR_GRIDON = "Quadrillage ON"; +AMSTR_GRIDOFF = "Quadrillage OFF"; -AMSTR_MARKEDSPOT = "REPERE MARQUE "; -AMSTR_MARKSCLEARED = "REPERES EFFACES "; +AMSTR_TEXON = "Mode Texturé ON"; +AMSTR_TEXOFF = "Mode Texturé OFF"; + +AMSTR_MARKEDSPOT = "Repère marqué."; +AMSTR_MARKSCLEARED = "Repères éffacés."; // // ST_stuff.C // -STSTR_MUS = "CHANGEMENT DE MUSIQUE "; -STSTR_NOMUS = "IMPOSSIBLE SELECTION"; -STSTR_DQDON = "INVULNERABILITE ON "; -STSTR_DQDOFF = "INVULNERABILITE OFF"; +STSTR_MUS = "Changement de Musique"; +STSTR_NOMUS = "Séléction Impossible!"; +STSTR_DQDON = "Invulnérabilité ON "; +STSTR_DQDOFF = "Invulnérabilité OFF"; +STSTR_DQD2ON = "Parfaite Invulnérabilité ON"; +STSTR_DQD2OFF = "Parfaite Invulnérabilité OFF"; -STSTR_KFAADDED = "ARMEMENT MAXIMUM! "; -STSTR_FAADDED = "ARMES (SAUF CLEFS) AJOUTEES"; +STSTR_KFAADDED = "Armement Maximum!"; +STSTR_FAADDED = "Arsenal ajouté. (Pas de clés!)"; -STSTR_NCON = "BARRIERES ON"; -STSTR_NCOFF = "BARRIERES OFF"; +STSTR_NCON = "Collisions OFF"; +STSTR_NCOFF = "Collisions ON"; +STSTR_NC2ON = "Collisions 3D OFF"; -STSTR_BEHOLDX = "AMELIORATION ACTIVEE"; +STSTR_BEHOLD = "in V ulnérable, S urpuissance, I nvisible, p R otection, c A rte, où L umière?"; +STSTR_BEHOLDX = "Amélioration Activée!"; +STSTR_CHOPPERS = "... C'est pas de la merde. - GM"; -STSTR_CLEV = "CHANGEMENT DE NIVEAU..."; +STSTR_CLEV = "Changement de niveau..."; + +TXT_DEFAULTPICKUPMSG = "Quelque chose récupéré."; // // F_Finale.C @@ -633,188 +658,251 @@ T6TEXT = // // Character cast strings F_FINALE.C // -CC_ZOMBIE = "ZOMBIE"; -CC_SHOTGUN = "TYPE AU FUSIL"; -CC_HEAVY = "MEC SUPER-ARME"; -CC_IMP = "DIABLOTIN"; -CC_DEMON = "DEMON"; -CC_LOST = "AME PERDUE"; -CC_CACO = "CACODEMON"; -CC_HELL = "CHEVALIER DE L'ENFER"; -CC_BARON = "BARON DE L'ENFER"; -CC_ARACH = "ARACHNOTRON"; -CC_PAIN = "ELEMENTAIRE DE LA DOULEUR"; -CC_REVEN = "REVENANT"; -CC_MANCU = "MANCUBUS"; -CC_ARCH = "ARCHI-INFAME"; -CC_SPIDER = "L'ARAIGNEE CERVEAU"; -CC_CYBER = "LE CYBERDEMON"; -CC_HERO = "NOTRE HEROS"; +CC_ZOMBIE = "Zombie"; +CC_SHOTGUN = "Type au Fusil"; +CC_HEAVY = "Mec avec un Gros Flingue"; +CC_IMP = "Diablotin"; +CC_DEMON = "Démon"; +CC_LOST = "Ame Perdue"; +CC_CACO = "Cacodémon"; +CC_HELL = "Chevalier Infernal"; +CC_BARON = "Baron des Enfers"; +CC_ARACH = "Arachnotron"; +CC_PAIN = "Elémentaire de Douleur"; +CC_REVEN = "Revenant"; +CC_MANCU = "Mancube"; +CC_ARCH = "Arche-vile"; +CC_SPIDER = "L'Araignée Commandante"; +CC_CYBER = "Le Cyberdémon"; +CC_HERO = "Notre Héros"; // New strings from BOOM -PD_BLUEC = "Vous avez besoin d une carte bleu pour ouvrir cette porte"; -PD_REDC = "Vous avez besoin d une carte rouge pour ouvrir cette porte"; -PD_YELLOWC = "Vous avez besoin d une carte jaune pour ouvrir cette porte"; -PD_BLUES = "Vous avez besoin d un crane bleu pour ouvrir cette porte"; -PD_REDS = "Vous avez besoin d un crane rouge pour ouvrir cette porte"; -PD_YELLOWS = "Vous avez besoin d un crane jaune pour ouvrir cette porte"; -PD_ANY = "toute cle ouvrira cette porte"; -PD_ANYOBJ = "toute cle activera cet objet"; -PD_ALL3 = "Vous avez besoin des trois cle pour ouvrir cette porte"; -PD_ALL3O = "Vous avez besoin des trois cle pour activer cet objet"; -PD_ALL6 = "Vous avez besoin des six clef pour ouvrir cette porte"; -PD_ALL6O = "Vous avez besoin des six clef pour activer cet objet"; -PD_ALLKEYS = "Vous avez besoin de toutes les clef"; +PD_BLUEO = "Il vous faut une clé bleue pour activer cet objet."; +PD_REDO = "Il vous faut une clé rouge pour activer cet objet."; +PD_YELLOWO = "Il vous faut une clé jaune pour activer cet objet."; +PD_BLUEK = "Il vous faut une clé bleue pour ouvrir cette porte."; +PD_REDK = "Il vous faut une clé rouge pour ouvrir cette porte."; +PD_YELLOWK = "Il vous faut une clé jaune pour ouvrir cette porte."; +PD_BLUECO = "Il vous faut une carte bleue pour activer cet objet."; +PD_REDCO = "Il vous faut une carte rouge pour activer cet objet."; +PD_YELLOWCO = "Il vous faut une carte jaune pour activer cet objet."; +PD_BLUESO = "Il vous faut un crâne bleu pour activer cet objet."; +PD_REDSO = "Il vous faut un crâne rouge pour activer cet objet."; +PD_YELLOWSO = "Il vous faut un crâne jaune pour activer cet objet."; + +PD_BLUEC = "Il vous faut une carte bleue pour ouvrir cette porte."; +PD_REDC = "Il vous faut une carte rouge pour ouvrir cette porte."; +PD_YELLOWC = "Il vous faut une carte jaune pour ouvrir cette porte."; +PD_BLUES = "Il vous faut un crâne bleu pour ouvrir cette porte."; +PD_REDS = "Il vous faut un crâne rouge pour ouvrir cette porte."; +PD_YELLOWS = "Il vous faut un crâne jaune pour ouvrir cette porte."; +PD_ANY = "N'importe quelle clé peut ouvrir cette porte."; +PD_ANYOBJ = "N'importe quelle clé peut activer cet objet."; +PD_ALL3 = "Il vous faut une clé de chaque couleur pour ouvrir cette porte."; +PD_ALL3O = "Il vous faut une clé de chaque couleur pour activer cet objet."; +PD_ALL6 = "Il vous faut les six clés pour ouvrir cette porte."; +PD_ALL6O = "Il vous faut les six clés pour activer cet objet."; +PD_ALLKEYS = "Vous avez besoin de toutes les six clés."; // Gameflow messages -TXT_FRAGLIMIT = "limite de frag atteinte."; -TXT_TIMELIMIT = "limite de temps atteinte."; +TXT_FRAGLIMIT = "Limite de frags atteinte."; +TXT_TIMELIMIT = "Limite de temps atteinte."; // Spree messages -SPREEKILLSELF = "%o etait en folie meurtriere avant que %g ne (le/la) frag!"; -SPREEOVER = "La folie meurtrière %o a ete termine par %k"; -SPREE5 = "%k est dans une folie meurtrière!"; -SPREE10 = "%k se dechaine!"; +SPREEKILLSELF = "%o était en pleine folie meurtrière que %g ne se bute!"; +SPREEOVER = "La folie meurtrière de %o à été terminée par %!k"; +SPREE5 = "%k est en folie meurtrière!"; +SPREE10 = "%k est en plein massacre!"; SPREE15 = "%k domine!"; -SPREE20 = "%k est inarretable!"; -SPREE25 = "%k est comme un dieu!"; +SPREE20 = "%k est inarrétable!"; +SPREE25 = "%k est un dieu!"; // Mulitkill messages MULTI2 = "Double meurtre!"; MULTI3 = "Multi meurtre!"; MULTI4 = "Ultra meurtre!"; -MULTI5 = "Meurtre monstre!"; +MULTI5 = "Monster Kill!"; // Obituary strings // First the self-kills, then the other-kills OB_SUICIDE = "%o se suicide."; -OB_FALLING = "%o est tombe trop bas."; -OB_CRUSH = "%o a ete ecrase."; -OB_EXIT = "%o a essaye de quitter."; -OB_WATER = "%o ne peut pas nager."; -OB_SLIME = "%o a mute."; -OB_LAVA = "%o a brule."; -OB_BARREL = "%o a fait boom."; -OB_SPLASH = "%o est reste au mauvais endroit."; -OB_R_SPLASH = "%o aurait du guarder ses distances."; -OB_ROCKET = "%o aurait du guarder ses distances."; -OB_KILLEDSELF = "%o se tua (lui/elle)meme."; +OB_FALLING = "%o est tombé trop loin."; +OB_CRUSH = "%o a été écrasé."; +OB_EXIT = "%o a tenté de partir."; +OB_WATER = "%o ne sait pas nager."; +OB_SLIME = "%o a muté."; +OB_LAVA = "%o a fondu."; +OB_BARREL = "%o a sauté."; +OB_SPLASH = "%o s'est tenu au mauvais endroit."; +OB_R_SPLASH = "%o aurait dû garder ses distances."; +OB_ROCKET = "%o aurait dû garder ses distances."; +OB_KILLEDSELF = "%o s'est tué/e."; +OB_VOODOO = "%o a succombé au pouvoir du Vaudou."; -OB_STEALTHBABY = "%o cru voir un arachnotron."; -OB_STEALTHVILE = "%o cru voir un archi-infame."; -OB_STEALTHBARON = "%o cru voir un baron de l'enfer."; -OB_STEALTHCACO = "%o cru voir un cacodemon."; -OB_STEALTHCHAINGUY = "%o cru voir un mitrailleur."; -OB_STEALTHDEMON = "%o cru voir un demon."; -OB_STEALTHKNIGHT = "%o cru voir un chevalier de l'enfer."; -OB_STEALTHIMP = "%o cru voir un lutin."; -OB_STEALTHFATSO = "%o cru voir un mancubus."; -OB_STEALTHUNDEAD = "%o cru voir un revenant."; -OB_STEALTHSHOTGUY = "%o cru voir un type au fusil."; -OB_STEALTHZOMBIE = "%o cru voir un zombie."; -OB_UNDEADHIT = "%o a ete cogne par un revenant."; -OB_IMPHIT = "%o a ete lacere par un imp."; -OB_CACOHIT = "%o s'est approche trop pres d'un cacodemon."; -OB_DEMONHIT = "%o a ete mordu par un demon."; -OB_SPECTREHIT = "%o a ete mange par un spectre."; -OB_BARONHIT = "%o a ete dechire par un baron de l'enfer."; -OB_KNIGHTHIT = "%o a ete etrippe par un un chevalier de l'enfer."; -OB_ZOMBIE = "%o a ete tue par un zombie."; -OB_SHOTGUY = "%o a ete tire par un type au fusil."; -OB_VILE = "%o a ete incinere par un archi-infame."; -OB_UNDEAD = "%o n'aurais pas pu esquive cette boule de feu de revenant."; -OB_FATSO = "%o s'est fait aplatir par un mancubus."; -OB_CHAINGUY = "%o a ete perfore par un mitrailleur."; -OB_SKULL = "%o a ete hante par une ame perdue."; -OB_IMP = "%o brule par un lutin."; -OB_CACO = "%o a ete terrasse par un Cacodemon."; -OB_BARON = "%o a ete meurtri par un Baron de l'Enfer."; -OB_KNIGHT = "%o a ete assassine par un Chevalier de l'Enfer."; -OB_SPIDER = "%o est reste en admiration devant le demon arachneen."; -OB_BABY = "%o a laisse un arachnotron l'avoir."; -OB_CYBORG = "%o a ete reduie a une eclaboussure par un demon-cybernetique."; -OB_WOLFSS = "%o a rencontre un Nazi."; +OB_STEALTHBABY = "%o a cru voir un Arachnotron."; +OB_STEALTHVILE = "%o a cru voir un Arche-Vile."; +OB_STEALTHBARON = "%o a cru voir un Baron des enfers."; +OB_STEALTHCACO = "%o a cru voir un Cacodémon."; +OB_STEALTHCHAINGUY = "%o a cru voir un mitrailleur."; +OB_STEALTHDEMON = "%o a cru voir un démon."; +OB_STEALTHKNIGHT = "%o a cru voir un chevalier infernal."; +OB_STEALTHIMP = "%o a cru voir un diablotin."; +OB_STEALTHFATSO = "%o a cru voir un mancube."; +OB_STEALTHUNDEAD = "%o a cru voir un revenant."; +OB_STEALTHSHOTGUY = "%o a cru voir un type au fusil."; +OB_STEALTHZOMBIE = "%o a cru voir un zombie."; +OB_UNDEADHIT = "%o s'est pris un raclée de la part d'un revenant."; +OB_IMPHIT = "%o a été lacéré par un diablotin."; +OB_CACOHIT = "%o s'est approché trop près d'un Cacodémon."; +OB_DEMONHIT = "%o a été mordu par un démon."; +OB_SPECTREHIT = "%o a été dévoré par un spectre."; +OB_BARONHIT = "%o a été déchiré par un Baron des Enfers."; +OB_KNIGHTHIT = "%o a été étripé par un un chevalier infernal."; +OB_ZOMBIE = "%o a été tué par un zombie."; +OB_SHOTGUY = "%o s'est fait flinguer par un type au fusil."; +OB_VILE = "%o a été incinéré par un Arche-Vile."; +OB_UNDEAD = "%o n'a pas réussi à esquiver un missile de revenant."; +OB_FATSO = "%o s'est fait aplatir par un Mancube."; +OB_CHAINGUY = "%o a été perforé par un mitrailleur."; +OB_SKULL = "%o s'est fait surprendre par une âme perdue."; +OB_IMP = "%o brûlé par un diablotin."; +OB_CACO = "%o a été terrassé par un Cacodémon."; +OB_BARON = "%o a été démoli par un Baron des Enfers."; +OB_KNIGHT = "%o a été éclaté par un chevalier infernal."; +OB_SPIDER = "%o est resté pris d'admiration devant le Démon Arachnéen."; +OB_BABY = "%o a laissé un arachnotron l'avoir."; +OB_CYBORG = "%o a été pulvérisé par un Cyberdémon."; +OB_WOLFSS = "%o a rencontré un Nazi."; +OB_DOG = "%o s'est fait mordre par un chien."; -OB_CHICKEN = "%o a ete picore a mort."; -OB_BEAST = "%o a ete carbonise par un dragon-garou."; -OB_CLINK = "%o a ete entaille par un sabregriffe."; -OB_DSPARIL1 = "%o a ete ebouillante par un serpent de D'Sparil."; -OB_DSPARIL1HIT = "%o a ete mache par un serpent de D'Sparil."; -OB_DSPARIL2 = "%o etait trop faible pour D'Sparil."; -OB_DSPARIL2HIT = "%o a ete gifle par D'Sparil."; -OB_HERETICIMP = "%o a ete effraye par une gargouille."; -OB_HERETICIMPHIT = "%o a ete mis en pieces par une gargouille."; -OB_IRONLICH = "%o a ete devaste par une sangsue de fer."; -OB_IRONLICHHIT = "%o a fait ami-ami avec sangsue de fer."; -OB_BONEKNIGHT = "%o s'est fait hache par un guerrier mort-vivant."; +OB_CHICKEN = "%o a été picoré a mort."; +OB_BEAST = "%o a été carbonisé par un dragon-garou."; +OB_CLINK = "%o s'est fait découper par un sabregriffe."; +OB_DSPARIL1 = "%o a été ébouillanté par un serpent de D'Sparil."; +OB_DSPARIL1HIT = "%o a été dévoré par un serpent de D'Sparil."; +OB_DSPARIL2 = "%o n'a pas pu égaler D'Sparil."; +OB_DSPARIL2HIT = "%o a été battu a plate couture par D'Sparil."; +OB_HERETICIMP = "%o a été effrayé par une gargouille."; +OB_HERETICIMPHIT = "%o a été mis en pièces par une gargouille."; +OB_IRONLICH = "%o a été dévasté par une Liche de Fer."; +OB_IRONLICHHIT = "%o a fait ami-ami avec une Liche de Fer."; +OB_BONEKNIGHT = "%o s'est pris la hache d'un guerrier mort-vivant."; OB_BONEKNIGHTHIT = "%o s'est fait pourfendre par un guerrier mort-vivant."; -OB_MUMMY = "%o a ete aplati par un golem."; -OB_MUMMYLEADER = "%o a ete hurle a mort par un nitrogolem."; -OB_SNAKE = "%o s est fait entrechoque par un ophidien."; -OB_WIZARD = "%o a ete maudit par un sorcier."; -OB_WIZARDHIT = "%o a ete palpe par un sorcier."; +OB_MINOTAUR = "%o was blasted into cinders by a Maulotaur."; +OB_MINOTAURHIT = "%o s'est fait éclater par un Massetaure."; +OB_MUMMY = "%o a été défoncé par un golem."; +OB_MUMMYLEADER = "%o s'est fait percer les tympans par un nitrogolem."; +OB_SNAKE = "%o s est fait secouer par un ophidien."; +OB_WIZARD = "%o a été maudit par un sorcier."; +OB_WIZARDHIT = "%o a été palpé par un sorcier."; -OB_FIREDEMON = "%o a goute au feu d'un Afrit."; -OB_DEMON1 = "%o a ete brule par un Serpent."; -OB_DEMON2 = "%o a ete empoisonne par un Serpent."; -OB_ETTIN = "%o a ete reduit en puree par un Ettin."; -OB_CENTAUR = "%o a ete coupe par un Centaure."; -OB_SLAUGHTAURHIT = "%o a ete coupe par un Massacrotaure."; -OB_SLAUGHTAUR = "%o a ete terrasse par une boule de feu de Massacrotaure."; -OB_BISHOP = "%o a succombe face au pouvoir obscure d'un eveque."; -OB_ICEGUY = "%o a ete gele par un Wendigo."; -OB_SERPENTHIT = "%o a ete mutile par un Chasseur."; -OB_SERPENT = "%o a ete brule par un Chasseur."; -OB_WRAITH = "%o a ete carbonise par un Reiver."; -OB_WRAITHHIT = "%o a eu sa vie ravit par un Reiver."; -OB_DRAGON = "%o a ete incinere par une vouivre de la mort."; -OB_KORAX = "%o a ete balaye de l'echiquier par Korax."; -OB_FBOSS = "%o a ete pourfendu par Zedek."; -OB_MBOSS = "%o n'aurait pu absorber la mana de Menelkir."; -OB_CBOSS = "%o a ete baptise par Traductus."; -OB_HERESIARCH = "%o a eu ses os roulles par un Heresiarche."; +OB_FIREDEMON = "%o a gouté au feu d'un Afrit."; +OB_DEMON1 = "%o a été brûlé par un Serpent."; +OB_DEMON2 = "%o a été empoisonné par un Serpent."; +OB_ETTIN = "%o a été réduit en purée par un Ettin."; +OB_CENTAUR = "%o a été tranché par un Centaure."; +OB_SLAUGHTAURHIT = "%o a été tranché par un Sangtaure."; +OB_SLAUGHTAUR = "%o a été touché par une boule de feu de Sangtaure."; +OB_BISHOP = "%o a succombé au pouvoir obscur d'un évèque."; +OB_ICEGUY = "%o a été gelé par un Wendigo."; +OB_SERPENTHIT = "%o a été mutilé par un Chasseur."; +OB_SERPENT = "%o a été fondu par un Chasseur."; +OB_WRAITH = "%o a été carbonisé par un Reiver."; +OB_WRAITHHIT = "%o a perdu la vie face à un Reiver."; +OB_DRAGON = "%o a été incinéré par une vouivre de la mort."; +OB_KORAX = "%o a été balayé de l'échiquier par Korax."; +OB_FBOSS = "%o a été pourfendu par Zedek."; +OB_MBOSS = "%o n'aurait pu absorber le mana de Menelkir."; +OB_CBOSS = "%o a été baptisé par Traductus."; +OB_HERESIARCH = "%o s'est fait rouler les os par l'Hérésiarche."; -OB_ACOLYTE = "%o a ete tire avec zele par un Acolyte."; -OB_MACIL = "%o n'aurait jamais du se rebelle contre Macil."; -OB_REBEL = "%o a ete abbatu par un Rebel."; -OB_BEGGAR = "%o a ete battu a mort par un pauvre."; -OB_PEASANT = "%o n'aurait jamais du chercher la bagarre a un civil."; -OB_ALIENSPECTRE = "%o a ete terrasse par le Spectre."; -OB_ENTITY = "%o a senti le courroux du dieu unique."; -OB_LOREMASTER = "%o n'a pu echapper a l'emprise du Maitre des Traditions."; -OB_PROGRAMMER = "%o a ete efface par le Programmer."; -OB_STFBISHOP = "%o a ete descendu par l'Eveque."; -OB_SENTINEL = "%o a ete abbatu par une Sentinelle."; -OB_CRUSADER = "%o a ete balaye par un croise."; -OB_INQUISITOR = "%o a ete condamne par un Inquisiteur."; -OB_STALKER = "%o a ete embette par un chasseur."; -OB_TURRET = "%o a declenche les defenses automatiques."; -OB_TEMPLARHIT = "%o a ete griffe par un Templier."; -OB_TEMPLAR = "%o a ete vaporise par un Templier."; -OB_REAVERHIT = "%o a ete fendu par un Reaver."; -OB_REAVER = "%o a ete descendu par un Reaver."; +OB_ACOLYTE = "%o a souffert d'une bavure policière."; +OB_MACIL = "%o n'aurait jamais du se rebeller contre Macil."; +OB_REBEL = "%o a été abattu par un Rebel."; +OB_BEGGAR = "%o a été battu a mort par un pauvre."; +OB_PEASANT = "%o n'aurait jamais du chercher des noises a un civil."; +OB_ALIENSPECTRE = "%o a été terrasse par le Spectre."; +OB_ENTITY = "%o a senti le courroux du Seul Dieu."; +OB_LOREMASTER = "%o n'a pu échapper a l'emprise du Maître des Traditions."; +OB_PROGRAMMER = "%o a été effacé par le Programmeur."; +OB_STFBISHOP = "%o a été pulvérisé par l'Evèque."; +OB_SENTINEL = "%o a été abattu par une Sentinelle."; +OB_CRUSADER = "%o a été balayé par un croisé."; +OB_INQUISITOR = "%o a été condamné par un Inquisiteur."; +OB_STALKER = "%o a été asticoté par un chasseur."; +OB_TURRET = "%o a déclenché les défenses automatiques."; +OB_TEMPLARHIT = "%o a été griffé par un Templier."; +OB_TEMPLAR = "%o a été vaporisé par un Templier."; +OB_REAVERHIT = "%o a été fendu par un Reaver."; +OB_REAVER = "%o a été descendu par un Reaver."; -OB_MPFIST = "%o a bouffe le poing de %k."; -OB_MPCHAINSAW = "%o a ete tondu par la tronconneuse de %k."; -OB_MPPISTOL = "%o a ete chatouille par le pistolet a eau de %k."; -OB_MPSHOTGUN = "%o a bouffe le baton a feu de %k."; -OB_MPSSHOTGUN = "%o s est fait gicle par le super fusil de %k."; -OB_MPCHAINGUN = "%o a ete fauche par la mitrailleuse de %k."; -OB_MPROCKET = "%o a chevauche la fusee de %k."; -OB_MPR_SPLASH = "%o a presque esquive la fusee de %k."; -OB_MPPLASMARIFLE = "%o a ete bruler par le fusil a plasma de %k."; -OB_MPBFG_BOOM = "%o a ete eclate en morceaux par le BFG de %k."; -OB_MPBFG_SPLASH = "%o n a pas pu se protege du BFG de %k."; -OB_MPTELEFRAG = "%o a ete telefrague par %k."; -OB_RAILGUN = "%o a ete enraille par %k."; +OB_MPFIST = "%o a bouffé le poing de %k."; +OB_MPCHAINSAW = "%o a été tondu par la tronconneuse de %k."; +OB_MPPISTOL = "%o a été châtouillé par le pistolet de %k."; +OB_MPSHOTGUN = "%o a s'est mangé de la chevrotine de la part de %k."; +OB_MPSSHOTGUN = "%o s est fait gicler par le fusil de chasse de %k."; +OB_MPCHAINGUN = "%o a été ventilé par la mitrailleuse de %k."; +OB_MPROCKET = "%o a chevauché la roquette de %k."; +OB_MPR_SPLASH = "%o a presque esquivé la roquette de %k."; +OB_MPPLASMARIFLE = "%o a été réduit en bouillie par le fusil a plasma de %k."; +OB_MPBFG_BOOM = "%o a été oblitéré par le BFG de %k."; +OB_MPBFG_SPLASH = "%o n a pas pu se couvrir du BFG de %k."; +OB_MPTELEFRAG = "%o a été téléfragué par %k."; +OB_RAILGUN = "%o a été aligné par %k."; +OB_MPBFG_MBF = "%o a été irradié par le BFG de %k."; + +OB_MPSTAFF = "%o s'est fait matraquer par %k."; +OB_MPGAUNTLETS = "%o s'est pris un coup de jus par les gantelets de %k."; +OB_MPGOLDWAND = "%o à fait coucou à la baguette magique de %k."; +OB_MPCROSSBOW = "%o s'est fait clouer par l'arbalète étherique de %k."; +OB_MPBLASTER = "%o s'est fait flinguer par la griffe draconique de %k."; +OB_MPSKULLROD = "%o repose six pieds sous terre grâce au Bâton infernal de %k."; +OB_MPPHOENIXROD = "%o s'est fait réduire en cendres par le Bâton du Phénix de %k."; +OB_MPMACE = "%o a rebondi sur les balles de la Masse de Feu à %k."; + +OB_MPPSTAFF = "%o à été foudroyé par le bâton chargé de %k."; +OB_MPPGAUNTLETS = "%o s'est fait saigner à blanc par les gantelets de %k."; +OB_MPPGOLDWAND = "%o à été assailli par la baguette elfique de %k."; +OB_MPPCROSSBOW = "%o s'est fait transpercer par l'arbalète éthérique de %k."; +OB_MPPBLASTER = "%o à été mis en pièces par la griffe draconique de %k."; +OB_MPPSKULLROD = "%k à versé toute la rage des enfers sur %o."; +OB_MPPPHOENIXROD = "%o à été incinéré par le Bâton du Phénix de %k."; +OB_MPPMACE = "%o s'est fait écraser par la balle de Masse géante de %k."; + +OB_MPFWEAPFIST = "%o à été tabassé à mort par les poings de %k."; +OB_MPFWEAPAXE = "%o s'est fait hacher menu par %k."; +OB_MPFWEAPHAMMERM = "%o s'est fait éclater le crâne par le marteau de %k."; +OB_MPFWEAPHAMMERR = "%o a eu son âme reforgée par le marteau de %k."; +OB_MPFWEAPQUIETUS = "%o à été réduit au silence par le pouvoir de %k et Quietus."; +OB_MPCWEAPMACE = "%o s'est fait casser la figure par la masse de %k."; +OB_MPCWEAPSTAFFM = "%o s'est fait mordre par le Bâton du Serpent %k."; +OB_MPCWEAPSTAFFR = "%o s'est étranglé sur le Bâton du Serpent de %k"; +OB_MPCWEAPFLAME = "%o s'est fait allumer par %k."; +OB_MPCWEAPWRAITHVERGE = "%o wa été purifié par la Verge Phantasmale de %k."; +OB_MPMWEAPWAND = "%o s'est pris un rayon saphirique en trop de la part de %k."; +OB_MPMWEAPFROST = "%o s'est fait transformer en glaçon par %k."; +OB_MPMWEAPLIGHTNING = "%o a reçu un sacré coup de jus de la part de %k."; +OB_MPMWEAPBLOODSCOURGE = "%o s'est fait effacer de l'univers par la Menace Sanglante de %k."; + +OB_MPPUNCHDAGGER = "%o s'est fait planter un lame dans le dos de la part de %k."; +OB_MPELECTRICBOLT = "%o s'est fait clouer au mur par %k."; +OB_MPPOISONBOLT = "%o a recu une dose létale de la colère de %k."; +OB_MPASSAULTGUN = "%o s'est fait couvrir de trous par le fusil d'assaut de %k."; +OB_MPMINIMISSILELAUNCHER = "%o a avalé le missile de %k."; +OB_MPSTRIFEGRENADE = "%o a été mis sens dessus dessous pa la grenade explosive de %k."; +OB_MPPHOSPHOROUSGRENADE = "%o s'est permis une pyroclave dans les flammes phosphoriques de %k."; +OB_MPFLAMETHROWER = "%o est passé au barbecue de %k."; +OB_MPMAULER1 = "%o s'est fait électrocuter par %k."; +OB_MPMAULER = "%o à été vicieusement vaporisé par %k."; +OB_MPSIGIL = "%o s'est prosterné face à la toute puissance du Sigil de %k."; // Same as OB_MPTELEFRAG, but shown when a monster telefrags you -OB_MONTELEFRAG = "%o a ete telefrague."; +OB_MONTELEFRAG = "%o a été telefrague."; OB_DEFAULT = "%o est mort."; -OB_FRIENDLY1 = "%k a terrasser un de ses equipies."; -OB_FRIENDLY2 = "%k verifie ses lunetttes."; -OB_FRIENDLY3 = "%k a obtenu un frag pour l'autre equipe."; +OB_FRIENDLY1 = "%k a tué un de ses équipiers."; +OB_FRIENDLY2 = "%k vérifie ses lunettes."; +OB_FRIENDLY3 = "%k marque un point pour l'autre équipe."; OB_FRIENDLY4 = "%k a perdu un autre ami."; SAVEGAMENAME = "zdoomsv"; @@ -824,6 +912,230 @@ STARTUP3 = ""; STARTUP4 = ""; STARTUP5 = ""; +SCORE_ITEMS = "OBJETS"; +SCORE_BONUS = "BONUS"; +SCORE_COLOR = "COULEUR"; +SCORE_SECRET = "SECRET"; +SCORE_NAME = "NOM"; +SCORE_DELAY = "DELAI(ms)"; +SCORE_KILLS = "VICTIMES"; +SCORE_FRAGS = "FRAGS"; +SCORE_DEATHS = "MORTS"; +SCORE_MISSED = "RATES"; +SCORE_TOTAL = "TOTAL"; +SCORE_LVLTIME = "TEMPS NIVEAU"; + +// Item tags: Doom weapons +TAG_FIST = "Poing Américain"; +TAG_CHAINSAW = "Tronçonneuse"; +TAG_PISTOL = "Pistolet"; +TAG_SHOTGUN = "Fusil à pompe"; +TAG_SUPERSHOTGUN = "Super Fusil de chasse"; +TAG_CHAINGUN = "Mitrailleuse"; +TAG_ROCKETLAUNCHER = "Lance-Roquettes"; +TAG_PLASMARIFLE = "Fusil à Plasma"; +TAG_BFG9000 = "BFG 9000"; + +// Item tags: Heretic weapons +TAG_STAFF = "Bâton"; +TAG_GAUNTLETS = "Gantelets du Nécromancien"; +TAG_GOLDWAND = "Baguette Elfique"; +TAG_CROSSBOW = "Arbalète Etherique"; +TAG_BLASTER = "Griffe Draconique"; +TAG_SKULLROD = "Bâton Infernal"; +TAG_PHOENIXROD = "Bâton du Phénix"; +TAG_MACE = "Masse de Feu"; + +TAG_STAFFP = "Bâton"; +TAG_GAUNTLETSP = "Gantelets du Nécromancien"; +TAG_GOLDWANDP = "Baguette Elfique"; +TAG_CROSSBOWP = "Arbalète Etherique"; +TAG_BLASTERP = "Griffe Draconique"; +TAG_SKULLRODP = "Bâton Infernal"; +TAG_PHOENIXRODP = "Bâton du Phénix"; +TAG_MACEP = "Masse de Feu"; + +// Item tags: Heretic artifacts +TAG_ARTIEGG = "Ovule de Métamorphose"; +TAG_ARTIFIREBOMB = "Bombe a retardement des Anciens"; +TAG_ARTIFLY = "Ailes du Courroux"; +TAG_ARTIHEALTH = "Flasque en Quartz"; +TAG_ARTIINVISIBILITY = "Orbe des Ombres"; +TAG_ARTIINVULNERABILITY = "Anneau d'Invincibilité"; +TAG_ARTISUPERHEALTH = "Urne Mystique"; +TAG_ARTITELEPORT = "Outil du Chaos"; +TAG_ARTITOMEOFPOWER = "Livre du Pouvoir"; +TAG_ARTITORCH = "Torche"; + +// Item tags: Hexen weapons +TAG_CWEAPMACE = "Masse de Pénitence"; +TAG_CWEAPSTAFF = "Sceptre du Serpent"; +TAG_CWEAPFLAME = "Tempête de Feu"; +TAG_CWEAPWRAITHVERGE = "Bâton du Courroux"; +TAG_FWEAPFIST = "Gantelets à Pointes"; +TAG_FWEAPAXE = "Hache de Timon"; +TAG_FWEAPHAMMER = "Marteau de la Rétribution"; +TAG_FWEAPQUIETUS = "Quietus"; +TAG_MWEAPWAND = "Baguette de Saphir"; +TAG_MWEAPFROST = "Eclats de Givre"; +TAG_MWEAPLIGHTNING = "Foudre Mortelle"; +TAG_MWEAPBLOODSCOURGE = "Fléau Sanglant"; + +// Item tags: Hexen artifacts +TAG_ARTIBLASTRADIUS = "Disque de Répulsion"; +TAG_ARTIBOOSTARMOR = "Brassards en peau de Dragon"; +TAG_ARTIBOOSTMANA = "Cratère de Pouvoir"; +TAG_ARTIPOISONBAG = "Fléchette"; +TAG_ARTIPOISONBAG1 = "Fléchette - Nuage Toxique"; +TAG_ARTIPOISONBAG2 = "Fléchette - Bombe a Retardement"; +TAG_ARTIPOISONBAG3 = "Fléchette - Grenade"; +TAG_ARTIHEALINGRADIUS = "Incantation Mystique"; +TAG_ARTIDEFENDER = "Icône du Défenseur"; +TAG_ARTIPORK = "Porcificateur"; +TAG_ARTISPEED = "Bottes de Célérité"; +TAG_ARTISUMMON = "Serviteur Noir"; +TAG_ARTITELEPORTOTHER = "Outil de Banissement"; + + +// Item tags: Hexen puzzle items +TAG_ARTIPUZZSKULL = "Crâne de Yorick"; +TAG_ARTIPUZZGEMBIG = "Coeur de D'Sparil"; +TAG_ARTIPUZZGEMRED = "Planète en rubis"; +TAG_ARTIPUZZGEMGREEN1 = "Planète en émeraude (1)"; +TAG_ARTIPUZZGEMGREEN2 = "Planète en émeraude (2)"; +TAG_ARTIPUZZGEMBLUE1 = "Planète en saphir (1)"; +TAG_ARTIPUZZGEMBLUE2 = "Planète en saphir (2)"; +TAG_ARTIPUZZBOOK1 = "Codex Démoniaque"; +TAG_ARTIPUZZBOOK2 = "Liber Obscura"; +TAG_ARTIPUZZSKULL2 = "Masque de Flammes"; +TAG_ARTIPUZZFWEAPON = "Sceau du Glaive"; +TAG_ARTIPUZZCWEAPON = "Relique Sacrée"; +TAG_ARTIPUZZMWEAPON = "Sceau du Mage"; +TAG_ARTIPUZZGEAR1 = "Engrenage en Fer"; +TAG_ARTIPUZZGEAR2 = "Engrenage en Bronze"; +TAG_ARTIPUZZGEAR3 = "Engrenage en Fer et Bronze"; +TAG_ARTIPUZZGEAR4 = "Engrenage en Argent et Bronze"; + +// Item tags: Strife weapons +TAG_PUNCHDAGGER = "Dague de Poing"; +TAG_STRIFECROSSBOW1 = "Arbalète"; +TAG_STRIFECROSSBOW2 = "Arbalète"; +TAG_ASSAULTGUN = "Fusil d'Assaut"; +TAG_MMLAUNCHER = "Lanceur de Mini-Missiles"; +TAG_FLAMER = "Lance-Flammes"; +TAG_MAULER1 = "Broyeur"; +TAG_MAULER2 = "Broyeur"; +TAG_GLAUNCHER1 = "Lance-Grenades"; +TAG_GLAUNCHER2 = "Lance-Grenades"; +TAG_SIGIL = "SIGIL"; + +// Item tags: Strife artifacts +TAG_COIN = "Pièce"; +TAG_MEDPATCH = "Pansement"; +TAG_MEDICALKIT = "Kit Médical"; +TAG_SURGERYKIT = "Kit de Chirurgie"; // "full_health" in the Teaser +TAG_BELDINSRING = "Anneau"; +TAG_OFFERINGCHALICE = "Calice d'Obole"; +TAG_EAR = "Oreille"; +TAG_BROKENCOUPLING = "Coupleur Energétique cassé"; +TAG_SHADOWARMOR = "Armure de l'Ombre"; +TAG_ENVSUIT = "Combinaison Hazmat"; +TAG_GUARDUNIFORM = "Uniforme de Garde"; +TAG_OFFICERSUNIFORM = "Uniforme d'Officier"; +TAG_FTHROWERPARTS = "Pièces de Lance-Flamme"; +TAG_REPORT = "Compte-rendu"; +TAG_INFO = "Info"; +TAG_TARGETER = "Cibleur"; +TAG_COMMUNICATOR = "Communicateur"; +TAG_DEGNINORE = "Minerai de Degnin"; +TAG_GUNTRAINING = "Précision"; +TAG_HEALTHTRAINING = "Endurance"; +TAG_SCANNER = "Analyseur"; +TAG_PRISONPASS = "Passe de la Prison"; +TAG_ALARM = "Alarme"; +TAG_AMMOFILLUP = "Munitions"; +TAG_HEALTHFILLUP = "Santé"; +TAG_TELEPORTERBEACON = "Balise de téléportation"; +TAG_METALARMOR = "Armure en Métal"; +TAG_LEATHER = "Armure en Cuir"; +TAG_HEGRENADES = "Grenades Explosives"; +TAG_PHGRENADES = "Grenades Incendiaires"; // "Fire-Grenade_Rounds" in the Teaser +TAG_CLIPOFBULLETS = "Chargeur d'Assaut"; // "bullets" in the Teaser +TAG_BOXOFBULLETS = "Bôite de Munitions"; +TAG_MINIMISSILES = "Mini-Missiles"; //"rocket" in the Teaser +TAG_CRATEOFMISSILES = "Caisse de Mini-Missiles"; //"box_of_rockets" in the Teaser +TAG_ENERGYPOD = "Cellule Energétique"; +TAG_ENERGYPACK = "Pack Energétique"; +TAG_POISONBOLTS = "Carreaux Empoisonnés"; // "poison_arrows" in the Teaser +TAG_ELECTRICBOLTS = "Carreaux Electriques"; // "electric_arrows" in the Teaser +TAG_AMMOSATCHEL = "Sacoche à munitions"; // "Back_pack" in the Teaser + +// Item tags: Strife keys +TAG_BASEKEY = "Clé de la base"; +TAG_GOVSKEY = "Clé du Gouverneur"; // "Rebel_Key" in the Teaser +TAG_PASSCARD = "Passe"; +TAG_IDBADGE = "Badge d'Identification"; +TAG_PRISONKEY = "Clé de la Prison"; +TAG_SEVEREDHAND = "Main coupée"; +TAG_POWER1KEY = "Clé Power1"; +TAG_POWER2KEY = "Clé Power2"; +TAG_POWER3KEY = "Clé Power3"; +TAG_GOLDKEY = "Clé en Or"; +TAG_IDCARD = "Carte d'Identité"; +TAG_SILVERKEY = "Clé en Argent"; +TAG_ORACLEKEY = "Clé de l'Oracle"; +TAG_MILITARYID = "Identification Militaire"; +TAG_ORDERKEY = "Clé de l'Ordre"; +TAG_WAREHOUSEKEY = "Clé de l'Entrepôt"; +TAG_BRASSKEY = "Clé en Bronze"; +TAG_REDCRYSTALKEY = "Clé de Cristal Rouge"; +TAG_BLUECRYSTALKEY = "Clé de Crisal Bleu"; +TAG_CHAPELKEY = "Clé de la Chapelle"; +TAG_CATACOMBKEY = "Clé des Catacombes"; // "Tunnel_Key" in the Teaser +TAG_SECURITYKEY = "Clé de la Sécurité"; +TAG_COREKEY = "Clé du Réacteur"; // "New_Key1" in the Teaser +TAG_MAULERKEY = "Clé du Broyeur"; // "New_Key2" in the Teaser +TAG_FACTORYKEY = "Clé de l'Usine"; // "New_Key3" in the Teaser +TAG_MINEKEY = "Clé de la Mine"; // "New_Key4" in the Teaser +TAG_NEWKEY5 = "New Key5"; +TAG_ORACLEPASS = "Passe de l'Oracle"; + +// Item tags: misc Strife stuff +TAG_10GOLD = "10 Pièces"; +TAG_25GOLD = "25 Pièces"; +TAG_50GOLD = "50 Pièces"; +TAG_300GOLD = "300 Pièces"; +TAG_QUEST4 = "quest4"; +TAG_QUEST5 = "quest5"; +TAG_QUEST6 = "quest4"; + +// Item tags: Strife NPCs +TAG_ACOLYTE = "Acolyte"; +TAG_ARMORER = "Armurier"; +TAG_BARKEEP = "Barman"; +TAG_BEGGAR = "Mendiant"; +TAG_MACIL1 = "Macil"; +TAG_MACIL2 = "Macil"; +TAG_MEDIC = "Médecin"; +TAG_ORACLE = "Oracle"; +TAG_PRIEST = "Prêtre"; +TAG_RATBUDDY = "Copain Rat"; +TAG_REBEL = "Rebelle"; +TAG_TEMPLAR = "Templier"; +TAG_WEAPONSMITH = "Forgeron"; + +// Item tags: Chex weapons +TAG_SPOON = "Cuillère à Botte"; +TAG_SPORK = "Super Fourchette"; +TAG_MINIZORCHER = "Mini Zorcheur"; +TAG_LARGEZORCHER = "Zorcheur Large"; +TAG_SUPERLARGEZORCHER = "Zorcheur Extra-large"; +TAG_RAPIDZORCHER = "Zorcheur"; +TAG_ZORCHPROPULSOR = "Propulseur de Zorch"; +TAG_PHASINGZORCHER = "Zorcheur à Phase"; +TAG_LAZDEVICE = "ZZL"; + + // Heretic strings HE1TEXT = "avec la destruction des sangsues\n" @@ -936,13 +1248,13 @@ HE5TEXT = // EPISODE 1 - LA CITE DES DAMNES HHUSTR_E1M1 = "LES DOCKS"; -HHUSTR_E1M2 = "LE DONGEON"; -HHUSTR_E1M3 = "LA MAISON DU GARDIEN"; -HHUSTR_E1M4 = "LA TOUR DE GUARDE"; -HHUSTR_E1M5 = "LA CITADEL"; -HHUSTR_E1M6 = "LA CATHEDRAL"; +HHUSTR_E1M2 = "LE DONJON"; +HHUSTR_E1M3 = "LE CORPS DE GARDE"; +HHUSTR_E1M4 = "LA TOUR DE GARDE"; +HHUSTR_E1M5 = "LA CITADELLE"; +HHUSTR_E1M6 = "LA CATHEDRALE"; HHUSTR_E1M7 = "LA CRYPTE"; -HHUSTR_E1M8 = "LA BOUCHE DE L ENFER"; +HHUSTR_E1M8 = "LA GEULE DE L'ENFER"; HHUSTR_E1M9 = "LE CIMETIERE"; // EPISODE 2 - LA BOUCHE DE L ENFER @@ -952,93 +1264,93 @@ HHUSTR_E2M3 = "LA RIVIERE DE FEU"; HHUSTR_E2M4 = "LA GROTTE DE GLACE"; HHUSTR_E2M5 = "LES CATACOMBES"; HHUSTR_E2M6 = "LE LABYRINTHE"; -HHUSTR_E2M7 = "LA GRANDE PIECE"; +HHUSTR_E2M7 = "LE GRAND HALL"; HHUSTR_E2M8 = "LE PORTAIL DU CHAOS"; HHUSTR_E2M9 = "LE GLACIER"; // EPISODE 3 - LA COUPOLE DE D'SPARIL -HHUSTR_E3M1 = "L' ENTREPOT"; -HHUSTR_E3M2 = "LA FOSSE D AISANCES"; +HHUSTR_E3M1 = "L'ENTREPOT"; +HHUSTR_E3M2 = "LE BOURBIER"; HHUSTR_E3M3 = "LA CONFLUENCE"; HHUSTR_E3M4 = "LA FORTRESSE D'AZUR"; HHUSTR_E3M5 = "LE REPAIRE DES OPHIDIENS"; HHUSTR_E3M6 = "LES COULOIRS DE LA PEUR"; HHUSTR_E3M7 = "LE GOUFFRE"; HHUSTR_E3M8 = "LE DONJON DE D'SPARIL"; -HHUSTR_E3M9 = "L AQUIFER"; +HHUSTR_E3M9 = "L AQUIFERE"; // EPISODE 4: L'OSSUAIRE HHUSTR_E4M1 = "LE CATAFALQUE"; HHUSTR_E4M2 = "LE FORTIN"; HHUSTR_E4M3 = "LE DEAMBULATOIRE"; -HHUSTR_E4M4 = "LE SEPULCHRE"; +HHUSTR_E4M4 = "LE SEPULCRE"; HHUSTR_E4M5 = "LE GRAND ESCALIER"; -HHUSTR_E4M6 = "LE COULOIR DE L APOSTAT"; +HHUSTR_E4M6 = "LEs HALLS DE L'APOTRE"; HHUSTR_E4M7 = "LES RAMPARTS DE LA PERDITION"; HHUSTR_E4M8 = "LE PONT EFFONDRE"; -HHUSTR_E4M9 = "LE MAUSOLE"; +HHUSTR_E4M9 = "LE MAUSOLEE"; // EPISODE 5: LE DOMAINE STAGNANT -HHUSTR_E5M1 = "LES FALAISES OCHRE "; +HHUSTR_E5M1 = "LES FALAISES OCHRE"; HHUSTR_E5M2 = "LES RAPIDES"; HHUSTR_E5M3 = "LE QUAI"; HHUSTR_E5M4 = "LA COUR"; -HHUSTR_E5M5 = "L HYDRATYR"; +HHUSTR_E5M5 = "L'HYDRATYR"; HHUSTR_E5M6 = "LA COLONNADE"; HHUSTR_E5M7 = "LE PRESBYTERE FETIDE"; HHUSTR_E5M8 = "LE CHAMPS DU JUGEMENT"; -HHUSTR_E5M9 = "L ECHEVAUX DE D'SPARIL"; +HHUSTR_E5M9 = "L'ECHEVAUX DE D'SPARIL"; // Keys -TXT_GOTBLUEKEY = "CLÉ BLEUE"; -TXT_GOTYELLOWKEY = "CLÉ JAUNE"; -TXT_GOTGREENKEY = "CLÉ VERTE"; +TXT_GOTBLUEKEY = "CLÉ BLEUE"; +TXT_GOTYELLOWKEY = "CLÉ JAUNE"; +TXT_GOTGREENKEY = "CLÉ VERTE"; // Artifacts -TXT_ARTIHEALTH = "FLACON DE QUARTZ"; +TXT_ARTIHEALTH = "FLASQUE EN QUARTZ"; TXT_ARTIFLY = "LES AILES DU COURROUX"; TXT_ARTIINVULNERABILITY = "L'ANNEAU D'INVINCIBILITE"; -TXT_ARTITOMEOFPOWER = "TOME DU POUVOIR"; +TXT_ARTITOMEOFPOWER = "LIVRE DU POUVOIR"; TXT_ARTIINVISIBILITY = "SPHERE D'OMBRE"; TXT_ARTIEGG = "OVULE DE METAMORPHOSE"; TXT_ARTISUPERHEALTH = "URNE MYSTIQUE"; TXT_ARTITORCH = "LA TORCHE"; -TXT_ARTIFIREBOMB = "BOMBE A RETARDEMENT DES ANCIENTS"; -TXT_ARTITELEPORT = "L'USTENSIL DU CHAOS"; +TXT_ARTIFIREBOMB = "BOMBE A RETARDEMENT DES ANCIENS"; +TXT_ARTITELEPORT = "L'OUTIL DU CHAOS"; // Items -TXT_ITEMHEALTH = "FIOLE DE CRYSTAL"; -TXT_ITEMBAGOFHOLDING = "SAC DE PRISES"; +TXT_ITEMHEALTH = "FIOLE DE CRISTAL"; +TXT_ITEMBAGOFHOLDING = "SAC SANS FOND"; TXT_ITEMSHIELD1 = "BOUCLIER D'ARGENT"; TXT_ITEMSHIELD2 = "BOUCLIER ENCHANTE"; -TXT_ITEMSUPERMAP = "CARTE ROULEAU DEPLIANTE"; +TXT_ITEMSUPERMAP = "ROULEAU DU CARTOGRAPHE"; // Ammo -TXT_AMMOGOLDWAND1 = "SCEPTRE DE CRYSTAL"; +TXT_AMMOGOLDWAND1 = "CRISTAL ELFIQUE"; TXT_AMMOGOLDWAND2 = "GEODE DE CRYSTAL"; TXT_AMMOMACE1 = "SPHERES DE MASSE"; TXT_AMMOMACE2 = "PILE DE SPHERES DE MASSE"; -TXT_AMMOCROSSBOW1 = "FLECHES ETHEREES"; -TXT_AMMOCROSSBOW2 = "CARQUOIS DE FLECHES ETHEREES"; -TXT_AMMOBLASTER1 = "L'ORBE DE GRIFFE"; -TXT_AMMOBLASTER2 = "L'ORBE D'ENERGIE"; +TXT_AMMOCROSSBOW1 = "CARREAUX ETHERIQUES"; +TXT_AMMOCROSSBOW2 = "CARQUOIS DE CARREAUX ETHERIQUES"; +TXT_AMMOBLASTER1 = "ORBE DE GRIFFE"; +TXT_AMMOBLASTER2 = "ORBE D'ENERGIE DRACONIQUE"; TXT_AMMOSKULLROD1 = "RUNES MINEURES"; TXT_AMMOSKULLROD2 = "RUNES SUPERIEURES"; -TXT_AMMOPHOENIXROD1 = "L'ORBE DE FLAMES"; -TXT_AMMOPHOENIXROD2 = "L'ORBE DE L'ENFER"; +TXT_AMMOPHOENIXROD1 = "ORBE DE FLAMES"; +TXT_AMMOPHOENIXROD2 = "ORBE INFERNAL"; // Weapons TXT_WPNMACE = "MASSE DE FEU"; -TXT_WPNCROSSBOW = "ARBALETE ETHEREE"; -TXT_WPNBLASTER = "GRIFFE DU DRAGON"; -TXT_WPNSKULLROD = "LE BATON DE L'ENFER"; -TXT_WPNPHOENIXROD = "LE BATON DU PHOENIX"; -TXT_WPNGAUNTLETS = "LES GANTELETS DU NECROMANCIER"; +TXT_WPNCROSSBOW = "ARBALETE ETHERIQUE"; +TXT_WPNBLASTER = "GRIFFE DRACONIQUE"; +TXT_WPNSKULLROD = "BATON INFERNAL"; +TXT_WPNPHOENIXROD = "BATON INFERNAL"; +TXT_WPNGAUNTLETS = "GANTELETS DU NECROMANCIEN"; TXT_NEEDBLUEKEY = "CETTE PORTE NESCESSITE UNE CLE BLEU POUR S'OUVRIR"; TXT_NEEDGREENKEY = "CETTE PORTE NESCESSITE UNE CLE VERTE POUR S'OUVRIR"; @@ -1051,10 +1363,25 @@ TXT_CHEATKEYS = "TOUTES LES CLES"; TXT_CHEATSOUNDON = "DEBOGUAGE DU SON ACTIVE"; TXT_CHEATSOUNDOFF = "DEBOGUAGE DU SON DESACTIVE"; TXT_CHEATIDDQD = "TU ESSAIE DE TRICHER, HEIN? MAINTENANT TU CREVE!"; -TXT_CHEATIDKFA = "TRICHEUR - TU NE MERITE PAS D'ARMES"; -TXT_CHEATTICKERON = "HORLOGE ALUMMEE"; -TXT_CHEATTICKEROFF = "HORLOGE ETEINTE"; +TXT_CHEATIDKFA = "TRICHEUR - TU NE MERITE PAS D'ARMES!"; +TXT_CHEATTICKERON = "COMPTEUR ALLUME"; +TXT_CHEATTICKEROFF = "COMPTER ETEINT"; TXT_CHEATARTIFACTS3 = "VOUS L'AVEZ"; +TXT_MIDASTOUCH = "YOU GOT THE MIDAS TOUCH, BABY!"; +TXT_GOTSTUFF = "Voilà ton équipement!"; +TXT_FREEZEON = "Temps arrêté."; +TXT_FREEZEOFF = "Le temps reprend son cours.."; +TXT_STRANGE = "Vous vous sentez mal à l'aise..."; +TXT_STRANGER = "Vous vous sentez très mal à l'aise..."; +TXT_NOTSTRANGE = "Vous vous sentez mieux."; +TXT_LEADBOOTSON = "Bottes en plomb ON"; +TXT_LEADBOOTSOFF = "Bottes en plomb OFF"; +TXT_LIGHTER = "Vous vous sentez très léger."; +TXT_GRAVITY = "La gravité vous ramène au sol."; + +TXT_IMKILLS = "MORTS"; +TXT_IMITEMS = "OBJETS"; +TXT_IMTIME = "TEMPS"; RAVENQUITMSG = "ETES VOUS SUR DE VOULOIR QUITTER?"; @@ -1062,9 +1389,9 @@ RAVENQUITMSG = "ETES VOUS SUR DE VOULOIR QUITTER?"; // Mana -TXT_MANA_1 = "MANA BLEUE"; -TXT_MANA_2 = "MANA VERTE"; -TXT_MANA_BOTH = "MANA COMBINEE"; +TXT_MANA_1 = "MANA BLEU"; +TXT_MANA_2 = "MANA VERT"; +TXT_MANA_BOTH = "MANA COMBINE"; // Keys @@ -1094,242 +1421,264 @@ TXT_NEED_KEY_CASTLE = "Vous avez besoin de la CLE DU CHATEAU"; // Artifacts -TXT_ARTIINVULNERABILITY2 = "L'ICONE DU DEFENSEUR"; -TXT_ARTISUMMON = "SERVANT OBSCURE"; +TXT_ARTIINVULNERABILITY2 = "ICONE DU DEFENSEUR"; +TXT_ARTISUMMON = "SERVITEUR NOIR"; TXT_ARTIEGG2 = "PORCIFICATEUR"; -TXT_ARTIPOISONBAG = "FLECHETTE"; -TXT_ARTITELEPORTOTHER = "L'USTENSIL DE BANISSEMENT"; -TXT_ARTISPEED = "BOTTES DE VITESSE"; -TXT_ARTIBOOSTMANA = "CRATERE DE LA PUISSANCE"; +TXT_ARTITELEPORTOTHER = "OUTIL DE BANISSEMENT"; +TXT_ARTISPEED = "BOTTES DE CELERITE"; +TXT_ARTIBOOSTMANA = "CRATERE DE POUVOIR"; TXT_ARTIBOOSTARMOR = "BRACELETS EN PEAU DE DRAGON"; TXT_ARTIBLASTRADIUS = "DISQUE DE REPULSION"; -TXT_ARTIHEALINGRADIUS = "CADRE D' ENCHANTEMENT MYSTIQUE"; +TXT_ARTIHEALINGRADIUS = "INCANTATION MYSTIQUE"; // Puzzle artifacts TXT_ARTIPUZZSKULL = "CRANE DE YORICK"; TXT_ARTIPUZZGEMBIG = "COEUR DE D'SPARIL"; -TXT_ARTIPUZZGEMRED = "PLANETE DE RUBI"; +TXT_ARTIPUZZGEMRED = "PLANETE DE RUBIS"; TXT_ARTIPUZZGEMGREEN1 = "PLANETE D'EMERAUDE"; TXT_ARTIPUZZGEMGREEN2 = "PLANETE D'EMERAUDE"; -TXT_ARTIPUZZGEMBLUE1 = "PLANETE DE SAPPHIRE"; -TXT_ARTIPUZZGEMBLUE2 = "PLANETE DE SAPPHIRE"; -TXT_ARTIPUZZBOOK1 = "CODEX DES DEMON"; -TXT_ARTIPUZZBOOK2 = "LIVRE OBSCURE"; -TXT_ARTIPUZZSKULL2 = "MASQUE DE FLAMES"; -TXT_ARTIPUZZFWEAPON = "LE SCEAU DE GLAIVE"; -TXT_ARTIPUZZCWEAPON = "LA SAINTE RELIQUE"; -TXT_ARTIPUZZMWEAPON = "SIGIL DU MAGE"; +TXT_ARTIPUZZGEMBLUE1 = "PLANETE DE SAPHIR"; +TXT_ARTIPUZZGEMBLUE2 = "PLANETE DE SAPHIR"; +TXT_ARTIPUZZBOOK1 = "CODEX DEMONIAQUE"; +TXT_ARTIPUZZBOOK2 = "LIBER OBSCURA"; +TXT_ARTIPUZZSKULL2 = "MASQUE DE FLAMMES"; +TXT_ARTIPUZZFWEAPON = "SCEAU DU GLAIVE"; +TXT_ARTIPUZZCWEAPON = "RELIQUE SACREE"; +TXT_ARTIPUZZMWEAPON = "SCEAU DU MAGE"; TXT_ARTIPUZZGEAR = "ROUAGE D'HORLOGE"; -TXT_USEPUZZLEFAILED = "VOUS NE POUVEZ PAS UTILISE CECI ICI"; +TXT_USEPUZZLEFAILED = "VOUS NE POUVEZ PAS UTILISER CET OBJET ICI"; + // Items TXT_ARMOR1 = "ARMURE DE MAILLES"; TXT_ARMOR2 = "BOUCLIER DU FAUCON"; TXT_ARMOR3 = "CASQUE DE PLATINE"; -TXT_ARMOR4 = "AMULET DE L'ELOIGNEMENT"; +TXT_ARMOR4 = "AMULET DE PROTECTION"; // Weapons TXT_WEAPON_F2 = "HACHE DE TIMON"; -TXT_WEAPON_F3 = "MARTEAU DE LA VENGEANCE"; +TXT_WEAPON_F3 = "MARTEAU DE LA RETRIBUTION"; TXT_WEAPON_F4 = "QUIETUS ASSEMBLE"; TXT_WEAPON_C2 = "SCEPTRE DU SERPENT"; TXT_WEAPON_C3 = "TEMPETE DE FEU"; TXT_WEAPON_C4 = "BATON DU COURROUX ASSEMBLE"; -TXT_WEAPON_M2 = "BRISURES GELEE"; -TXT_WEAPON_M3 = "ARC DE LA MORT"; -TXT_WEAPON_M4 = "FLEAUT SANGLANT ASSEMBLE"; +TXT_WEAPON_M2 = "ECLATS DE GIVRE"; +TXT_WEAPON_M3 = "FOUDRE MORTELLE"; +TXT_WEAPON_M4 = "FLEAU SANGLANT ASSEMBLE"; TXT_WEAPONPIECE = "Une piece d'arme! C'est votre jour de chance!"; -TXT_QUIETUS_PIECE = "SEGMENT DU QUIETUS"; +TXT_QUIETUS_PIECE = "SEGMENT DE QUIETUS"; TXT_WRAITHVERGE_PIECE = "SEGMENT DU BATON DU COURROUX"; -TXT_BLOODSCOURGE_PIECE = "SEGMENT DU FLEAUT SANGLANT"; +TXT_BLOODSCOURGE_PIECE = "SEGMENT DU FLEAU SANGLANT"; // Strife locks -TXT_NEEDKEY = "Vous n'avez pas la cle."; -TXT_NEED_PASSCARD = "Vous avez besoin de la carte passe."; -TXT_NEED_PASSCARD_DOOR = "Vous avez besoin de la cle carte passe pour ouvrir cette porte."; -TXT_NEED_IDCARD = "Vous avez besoin d'une carte ID."; -TXT_NEED_PRISONKEY = "Vous n'avez pas la cle de la prison."; -TXT_NEED_HANDPRINT = "Votre main ne s'imprime pas sur le dossier."; -TXT_NEED_GOLDKEY = "Vous avez besoin d'une clé d'or."; -TXT_NEED_IDBADGE = "Vous avez besoin d'un badge ID."; -TXT_NEED_IDBADGE_DOOR = "Vous avez besoin d'un badge ID pour ouvrir cette porte."; -TXT_NEED_SILVERKEY = "Vous avez besoin de la cle d'argent."; -TXT_NEED_BRASSKEY = "Vous avez besoin de la cle de laiton."; -TXT_NEED_REDCRYSTAL = "Vous avez besoin du crystal rouge."; -TXT_NEED_BLUECRYSTAL = "Vous avez besoin du crystal bleu."; +TXT_NEEDKEY = "Vous n'avez pas la clé."; +TXT_NEED_PASSCARD = "Vous avez besoin du passe."; +TXT_NEED_PASSCARD_DOOR = "Vous avez besoin du passe ouvrir cette porte."; +TXT_NEED_IDCARD = "Vous avez besoin d'une carte d'identité."; +TXT_NEED_PRISONKEY = "Vous n'avez pas la clé de la prison."; +TXT_NEED_HANDPRINT = "Votre main n'est pas reconnue par le scanner."; +TXT_NEED_GOLDKEY = "Vous avez besoin d'une clé d'or."; +TXT_NEED_IDBADGE = "Vous avez besoin d'un badge d'identification."; +TXT_NEED_IDBADGE_DOOR = "Vous avez besoin d'un badge d'identification pour ouvrir cette porte."; +TXT_NEED_SILVERKEY = "Vous avez besoin de la clé en argent."; +TXT_NEED_BRASSKEY = "Vous avez besoin de la clé en bronze."; +TXT_NEED_REDCRYSTAL = "Vous avez besoin du cristal rouge."; +TXT_NEED_BLUECRYSTAL = "Vous avez besoin du cristal bleu."; + // Strife Quest messages -TXT_QUEST_14 = "Vous avez explose le crystal"; -TXT_QUEST_16 = "Vous avez explose les portes"; -TXT_QUEST_27 = "Vous avez explose l'ordinateur"; +TXT_QUEST_14 = "Vous avez explosé le cristal!"; +TXT_QUEST_16 = "Vous avez explosé les portes!"; +TXT_QUEST_27 = "Vous avez explosé l'ordinateur!"; -TXT_KILLED_BISHOP = "Vous avez tue l'eveque!"; -TXT_KILLED_ORACLE = "Vous avez tue l'oracle!"; -TXT_KILLED_MACIL = "Vous avez tue Macil!"; -TXT_KILLED_LOREMASTER = "Vous avez tue le Maitre des tradition!"; +TXT_KILLED_BISHOP = "Vous avez tué l'évèque!"; +TXT_KILLED_ORACLE = "Vous avez tué l'oracle!"; +TXT_KILLED_MACIL = "Vous avez tué Macil!"; +TXT_KILLED_LOREMASTER = "Vous avez tué le Maitre des traditions!"; // Strife pickup messages -TXT_METALARMOR = "Vous avez pris l'armure de metal."; +TXT_METALARMOR = "Vous avez pris l'armure de métal."; TXT_LEATHERARMOR = "Vous avez pris l'armure de cuir."; -TXT_MEDPATCH = "Vous avez pris le bandeau medical."; -TXT_MEDICALKIT = "Vous avez pris la trousse medical."; -TXT_SURGERYKIT = "Vous avez pris la trousse de chirurgie."; +TXT_MEDPATCH = "Vous avez pris le pansement."; +TXT_MEDICALKIT = "Vous avez pris le kit médical."; +TXT_SURGERYKIT = "Vous avez pris le kit de chirurgie."; TXT_STRIFEMAP = "Vous avez pris la carte"; TXT_BELDINSRING = "Vous avez pris l'anneau."; TXT_OFFERINGCHALICE = "Vous avez pris le Calice d'obole."; TXT_EAR = "Vous avez pris l'oreille."; -TXT_BROKENCOUPLING = "Vous avez pris la connexion coupee d'energie."; -TXT_SHADOWARMOR = "Vous avez pris l'armure d'ombre."; -TXT_ENVSUIT = "Vous avez pris la combinaison Environmentale."; -TXT_GUARDUNIFORM = "Vous avez pris l'Uniforme du guarde."; -TXT_OFFICERSUNIFORM = "Vous avez pris l'Uniforme de l' officier."; -TXT_FTHROWERPARTS = "Vous avez pris les pieces du lance-flames."; +TXT_BROKENCOUPLING = "Vous avez pris le coupleur energétique cassé."; +TXT_SHADOWARMOR = "Vous avez pris l'armure de l'ombre."; +TXT_ENVSUIT = "Vous avez pris la combinaison hazmat."; +TXT_GUARDUNIFORM = "Vous avez pris l'Uniforme du garde."; +TXT_OFFICERSUNIFORM = "Vous avez pris l'Uniforme de l'officier."; +TXT_FTHROWERPARTS = "Vous avez pris les pièces du lance-flames."; TXT_REPORT = "Vous avez pris le compte-rendu."; TXT_INFO = "Vous avez pris l'info."; TXT_TARGETER = "Vous avez pris le cibleur."; TXT_COMMUNICATOR = "Vous avez pris le Communicateur"; -TXT_COIN = "Vous avez pris la piece."; -TXT_XGOLD = "Vous avez pris l'or de %d."; -TXT_BEACON = "Vous avez pris la balise de Teletransporteur."; +TXT_COIN = "Vous avez pris la pièce."; +TXT_XGOLD = "Vous avez pris %d pièces."; +TXT_BEACON = "Vous avez pris la balise de téléporteur."; TXT_DEGNINORE = "Vous avez pris le minerai de Degnin."; TXT_SCANNER = "Vous avez pris l'analyseur."; -TXT_NEEDMAP = "L' analyseur ne marchera pas sans une carte!\n"; -TXT_PRISONPASS = "Vous avez pris le pass de la prison."; +TXT_NEEDMAP = "L'analyseur ne marchera pas sans une carte!\n"; +TXT_PRISONPASS = "Vous avez pris le passe de la prison."; -TXT_STRIFECROSSBOW = "Vous avez pris l'arbalete"; -TXT_ASSAULTGUN = "Vous avez pris le fusil d'assaut"; -TXT_MMLAUNCHER = "Vous avez pris le mini lance-missile"; -TXT_FLAMER = "Vous avez pris le lance-flames"; -TXT_MAULER = "Vous avez pris le molesteur"; -TXT_GLAUNCHER = "Vous avez pris le lance-grenade"; +TXT_STRIFECROSSBOW = "Vous avez pris l'arbalète."; +TXT_ASSAULTGUN = "Vous avez pris le fusil d'assaut."; +TXT_MMLAUNCHER = "Vous avez pris le lance mini-missile."; +TXT_FLAMER = "Vous avez pris le lance-flames."; +TXT_MAULER = "Vous avez pris le Broyeur."; +TXT_GLAUNCHER = "Vous avez pris le lance-grenades"; TXT_SIGIL = "Vous avez pris le SIGIL."; -TXT_BASEKEY = "Vous avez pris la cle Base."; -TXT_GOVSKEY = "Vous avez pris la cle Govs."; -TXT_PASSCARD = "Vous avez pris la carte-pass."; -TXT_IDBADGE = "Vous avez pris le Badge ID."; -TXT_PRISONKEY = "Vous avez pris la cle de la Prison."; -TXT_SEVEREDHAND = "Vous avez pris la main coupee."; -TXT_POWER1KEY = "Vous avez pris la cle Power1 ."; -TXT_POWER2KEY = "Vous avez pris la cle Power2."; -TXT_POWER3KEY = "Vous avez pris la cle Power3."; -TXT_GOLDKEY = "Vous avez pris la cle d'or."; -TXT_IDCARD = "Vous avez pris la Carte ID ."; -TXT_SILVERKEY = "Vous avez pris la cle d'argent."; -TXT_ORACLEKEY = "Vous avez pris la cle Oracle."; +TXT_BASEKEY = "Vous avez pris la clé de la Base."; +TXT_GOVSKEY = "Vous avez pris la clé du Gouverneur."; +TXT_PASSCARD = "Vous avez pris le passe."; +TXT_IDBADGE = "Vous avez pris le Badge d'identification."; +TXT_PRISONKEY = "Vous avez pris la clé de la Prison."; +TXT_SEVEREDHAND = "Vous avez pris la main coupée."; +TXT_POWER1KEY = "Vous avez pris la clé Power1."; +TXT_POWER2KEY = "Vous avez pris la clé Power2."; +TXT_POWER3KEY = "Vous avez pris la clé Power3."; +TXT_GOLDKEY = "Vous avez pris la clé d'or."; +TXT_IDCARD = "Vous avez pris la Carte d'identité."; +TXT_SILVERKEY = "Vous avez pris la clé d'argent."; +TXT_ORACLEKEY = "Vous avez pris la clé Oraclé."; TXT_MILITARYID = "Vous avez pris l'ID Militaire."; -TXT_ORDERKEY = "Vous avez pris la cle de l'Ordre."; -TXT_WAREHOUSEKEY = "Vous avez pris la cle de l'entrepot."; -TXT_BRASSKEY = "Vous avez pris la cle de bronze."; -TXT_REDCRYSTAL = "Vous avez pris la cle crystal rouge."; -TXT_BLUECRYSTAL = "Vous avez pris la cle crystal bleu."; -TXT_CHAPELKEY = "Vous avez pris la cle de la chapel."; -TXT_CATACOMBKEY = "Vous avez pris la cle des Catacombes."; -TXT_SECURITYKEY = "Vous avez pris la cle de la Securite."; -TXT_COREKEY = "Vous avez pris la cle Core."; -TXT_MAULERKEY = "Vous avez pris la cle du broyeur."; -TXT_FACTORYKEY = "Vous avez pris la cle de l'usine."; -TXT_MINEKEY = "Vous avez pris la cle de la mine."; -TXT_NEWKEY5 = "Vous avez pris la nouvelle cle 5."; +TXT_ORDERKEY = "Vous avez pris la clé de l'Ordre."; +TXT_WAREHOUSEKEY = "Vous avez pris la clé de l'entrepot."; +TXT_BRASSKEY = "Vous avez pris la clé de bronze."; +TXT_REDCRYSTAL = "Vous avez pris la clé cristal rouge."; +TXT_BLUECRYSTAL = "Vous avez pris la clé cristal bleu."; +TXT_CHAPELKEY = "Vous avez pris la clé de la chapel."; +TXT_CATACOMBKEY = "Vous avez pris la clé des Catacombes."; +TXT_SECURITYKEY = "Vous avez pris la clé de la Sécurité."; +TXT_COREKEY = "Vous avez pris la clé du réacteur."; +TXT_MAULERKEY = "Vous avez pris la clé du Broyeur."; +TXT_FACTORYKEY = "Vous avez pris la clé de l'usine."; +TXT_MINEKEY = "Vous avez pris la clé de la mine."; +TXT_NEWKEY5 = "Vous avez pris la nouvelle clé 5."; TXT_ORACLEPASS = "Vous avez pris le passe de l'Oracle."; -TXT_HEGRENADES = "Vous avez pris les HE-Grenades."; -TXT_PHGRENADES = "Vous avez pris les Phoshorus-Grenades."; -TXT_CLIPOFBULLETS = "Vous avez pris les chargeurs de balles."; -TXT_BOXOFBULLETS = "Vous avez pris la boite de balles."; -TXT_MINIMISSILES = "Vous avez pris les mini missiles."; +TXT_HEGRENADES = "Vous avez pris les Grenades Explosives."; +TXT_PHGRENADES = "Vous avez pris les Grenades Phosphoriques."; +TXT_CLIPOFBULLETS = "Vous avez pris le Chargeur."; +TXT_BOXOFBULLETS = "Vous avez pris la boîte de balles."; +TXT_MINIMISSILES = "Vous avez pris les mini-missiles."; TXT_CRATEOFMISSILES = "Vous avez pris la caisse de missiles."; -TXT_ENERGYPOD = "Vous avez pris la gousse d'energie."; -TXT_ENERGYPACK = "Vous avez pris le paquet d'energie."; -TXT_POISONBOLTS = "Vous avez pris le carreau empoisone."; -TXT_ELECTRICBOLTS = "Vous avez pris le carreau electrique."; -TXT_AMMOSATCHEL = "Vous avez pris le sachet de munitions"; +TXT_ENERGYPOD = "Vous avez pris la cellule d'énergie."; +TXT_ENERGYPACK = "Vous avez pris le pack energétique."; +TXT_POISONBOLTS = "Vous avez pris les carreaux empoisonnés."; +TXT_ELECTRICBOLTS = "Vous avez pris les carreaux électriques."; +TXT_AMMOSATCHEL = "Vous avez pris la sacoche de munitions"; // Random dialogs -TXT_RANDOM_PEASANT_01 = "S'il vous plait ne me blessez pas."; -TXT_RANDOM_PEASANT_02 = "Si vous cherchez a me blesse, Je n' en merite pas l'effort."; +TXT_RANDOM_PEASANT_01 = "S'il vous plaît, laissez-moi tranquille."; +TXT_RANDOM_PEASANT_02 = "Si vous cherchez à me faire mal, Je n'en mérite pas l'effort."; TXT_RANDOM_PEASANT_03 = "Je ne sais rien."; -TXT_RANDOM_PEASANT_04 = "Allez vous en ou j'appel les guardes!"; -TXT_RANDOM_PEASANT_05 = "Je voudrais quelque fois que ces rebelles apprennent quelle est leur place et stoppent ce non-sens."; -TXT_RANDOM_PEASANT_06 = "Laisse moi seul, OK?"; -TXT_RANDOM_PEASANT_07 = "Je ne suis pas sur , mais quelque fois je pense connaitre certains des acolytes."; -TXT_RANDOM_PEASANT_08 = "L' ordre maintient tout bien verrouille aux alentours."; -TXT_RANDOM_PEASANT_09 = "Ce n'est pas possible que ce ne sois juste q'une force de securite."; -TXT_RANDOM_PEASANT_10 = "J'ai entendu que l' ordre etait tres nerveux a cause des action du front aux alentours."; +TXT_RANDOM_PEASANT_04 = "Allez vous en ou j'appelle les gardes!"; +TXT_RANDOM_PEASANT_05 = "Je voudrais qu'a un moment, ces rebelles apprennent quelle est leur place et arrètent cette idiotie."; +TXT_RANDOM_PEASANT_06 = "Laissez moi seul, OK?"; +TXT_RANDOM_PEASANT_07 = "Je ne suis pas sûr, mais quelque fois je pense reconnaître certains des acolytes."; +TXT_RANDOM_PEASANT_08 = "L'ordre maintient la sûreté aux alentours."; +TXT_RANDOM_PEASANT_09 = "Ca ne peut pas être juste une escouade de sécurité..."; +TXT_RANDOM_PEASANT_10 = "J'ai entendu dire que l'ordre était sur les nerfs à cause des actions au front."; -TXT_RANDOM_REBEL_01 = "Ce n'est pas possible l'ordre se dressera contre nous."; -TXT_RANDOM_REBEL_02 = "Nous sommes presque pret a frappe. Les plans de Macil echouront."; -TXT_RANDOM_REBEL_03 = "Nous sommes tous derriere vous, ne vous inquiete pas."; -TXT_RANDOM_REBEL_04 = "Ne vous approche pas trop de ces robots. Ils vous brulerons pour un rien!"; -TXT_RANDOM_REBEL_05 = "Le jour de gloire arrivera bientot, et ceux qui s'opposeront a nous seront ecrases!"; -TXT_RANDOM_REBEL_06 = "Ne vous reposez pas. Du travail nous attend encore."; -TXT_RANDOM_REBEL_07 = "Macil dis que tu es le nouvel espoir. Garde ca a l'esprit."; -TXT_RANDOM_REBEL_08 = "Une fois que nous auront fait chuter ces charlatans, Nous seront capable de rebatir le monde tel qu'il devrait etre."; -TXT_RANDOM_REBEL_09 = "Souvient toi tu ne te bas pas seulement pour toi meme, mais pour tous le monde ici et dehors."; -TXT_RANDOM_REBEL_10 = "Aussi longtemps qu'un de nous est debout, nous vaincront."; +TXT_RANDOM_REBEL_01 = "L'ordre n'a aucune chance contre nous."; +TXT_RANDOM_REBEL_02 = "Nous sommes presque prêts à agir. Les plans de Macil se déroulent comme prévu."; +TXT_RANDOM_REBEL_03 = "On couvre tes arrières, t'inquiète pas."; +TXT_RANDOM_REBEL_04 = "Ne vous approchez pas trop des gros robots. Ils brûleront jusqu'à l'os!"; +TXT_RANDOM_REBEL_05 = "Le jour de gloire arrivera bientôt, et ceux qui s'opposeront a nous seront écrasés!"; +TXT_RANDOM_REBEL_06 = "Ne vous reposez pas sur vos lauriers. Du travail nous attend encore."; +TXT_RANDOM_REBEL_07 = "Macil nous dis que tu es notre nouvel espoir. Garde ca à l'esprit."; +TXT_RANDOM_REBEL_08 = "Une fois que nous nous serons débarassés de ces charlatans, nous serons capable de rebatir le monde tel qu'il devrait être."; +TXT_RANDOM_REBEL_09 = "Souviens-toi, tu ne te bas pas seulement pour toi, mais pour tous le monde ici et ailleurs."; +TXT_RANDOM_REBEL_10 = "Aussi longtemps qu'un de nous est vivant, nous vaincrons."; -TXT_RANDOM_AGUARD_01 = "Bouge de la, paysan!"; -TXT_RANDOM_AGUARD_02 = "Suis la vrai foie , seulement la tu commencera a comprendre."; -TXT_RANDOM_AGUARD_03 = "C'est seulement a travers la mort que quelqu'un peut renaitre."; -TXT_RANDOM_AGUARD_04 = "Je ne suis pas interesse par tes betises inutiles."; -TXT_RANDOM_AGUARD_05 = "si j'avais voulu te parler je te l'aurais dis."; +TXT_RANDOM_AGUARD_01 = "Barre-toi, paysan!"; +TXT_RANDOM_AGUARD_02 = "Suis la vraie foi, tu commençeras a comprendre."; +TXT_RANDOM_AGUARD_03 = "C'est seulement a travers la mort que quelqu'un peut renaître."; +TXT_RANDOM_AGUARD_04 = "Je ne suis pas interessé par tes idioties inutiles."; +TXT_RANDOM_AGUARD_05 = "Si j'avais voulu te parler je te l'aurais dis."; TXT_RANDOM_AGUARD_06 = "Va ennuyer quelqu'un d'autre!"; TXT_RANDOM_AGUARD_07 = "Bouge!"; -TXT_RANDOM_AGUARD_08 = "Si l'alarme s'eteind, reste en dehors de notre chemin!"; -TXT_RANDOM_AGUARD_09 = "L'ordre nettoira le monde et le conduira dans une nouvelle ere."; -TXT_RANDOM_AGUARD_10 = "Un probleme? Je pense que non."; +TXT_RANDOM_AGUARD_08 = "Si l'alarme s'enclenche, reste en dehors de notre chemin!"; +TXT_RANDOM_AGUARD_09 = "L'ordre nettoira le monde et le conduira dans une nouvelle ère."; +TXT_RANDOM_AGUARD_10 = "Un problème? Je pense que non."; -TXT_RANDOM_BEGGAR_01 = "L'aumone pour les pauvres?"; -TXT_RANDOM_BEGGAR_02 = "Qui regarde tu, surfacer?"; -TXT_RANDOM_BEGGAR_03 = "Aurai tu de la nourriture en trop sur toi, n'aurais tu pas?"; -TXT_RANDOM_BEGGAR_04 = "Vous les gens de la surface vous ne comprendrez jamais."; -TXT_RANDOM_BEGGAR_05 = "Ha, les guarde ne nous trouve pas, ces idiot ne savent meme pas que l'ont existent."; -TXT_RANDOM_BEGGAR_06 = "Un jour a part les membres de l'ordre sera force de nous rejoidre."; -TXT_RANDOM_BEGGAR_07 = "Reste immobile maintenant, mais tu sais que cela sera un jour pour toi aussi."; -TXT_RANDOM_BEGGAR_08 = "Ils n'y pas plus ennuyant qu'un surfacer et son comportement!"; -TXT_RANDOM_BEGGAR_09 = "L'ordre n'en aura pas pour longtemps de votre front."; -TXT_RANDOM_BEGGAR_10 = "Prend guarde a toi, surfacer. Nous connaisont nos ennemis!"; +TXT_RANDOM_BEGGAR_01 = "L'aumône pour les pauvres?"; +TXT_RANDOM_BEGGAR_02 = "Tu regarde qui, habitant de la surface?"; +TXT_RANDOM_BEGGAR_03 = "Aurais-tu de la nourriture en trop sur toi?"; +TXT_RANDOM_BEGGAR_04 = "Vous, les gens de la surface, vous ne comprendrez jamais."; +TXT_RANDOM_BEGGAR_05 = "Ha, les gardes ne nous trouveront jamaiss, ces idios ne savent même pas que l'on existe!"; +TXT_RANDOM_BEGGAR_06 = "Un jour, tous sauf les membres de l'ordre seront forcés de nous rejoindre."; +TXT_RANDOM_BEGGAR_07 = "Amuse toi à nous regarder autant que tu veus, mais tu sais que ceci sera aussi ton sort un jour."; +TXT_RANDOM_BEGGAR_08 = "Il n'y rien de plus barbant qu'un type de la surface et son attitude!"; +TXT_RANDOM_BEGGAR_09 = "L'ordre se débarrassera de vos soldats pathétiques."; +TXT_RANDOM_BEGGAR_10 = "Prend guarde a toi, habitant de la surface. Nous connaîssons nos ennemis!"; -TXT_RANDOM_PGUARD_01 = "Nous sommes les mains du destin. Apprendre notre colere est de trouve l'oubli!"; +TXT_RANDOM_PGUARD_01 = "Nous sommes les mains du destin. Apprendre notre colere est l'égal de trouver l'oubli!"; TXT_RANDOM_PGUARD_02 = "L'ordre nettoira le monde des faibles et corrompus!"; -TXT_RANDOM_PGUARD_03 = "Obei aux ordres du maitre!"; -TXT_RANDOM_PGUARD_04 = "longue vies aux frere de l'ordre!"; -TXT_RANDOM_PGUARD_05 = "La liberte est l'illusion qui aveugle les faible d'esprit."; +TXT_RANDOM_PGUARD_03 = "Obéissez à la volonté de vos maîtres!"; +TXT_RANDOM_PGUARD_04 = "Longue vie aux membres de l'Ordre!"; +TXT_RANDOM_PGUARD_05 = "La liberté de penser est l'illusion qui aveugle les faible d'esprit."; TXT_RANDOM_PGUARD_06 = "le pouvoir est le chemin de la gloire. Suivre l'ordre c'est suivre ce chemin!"; TXT_RANDOM_PGUARD_07 = "Prend ta place parmi les justes, rejoins nous!"; -TXT_RANDOM_PGUARD_08 = "L'ordre protege les siens."; -TXT_RANDOM_PGUARD_09 = "Les Acolytes? Ils ont deja a voir la pleine gloire de l'ordre."; -TXT_RANDOM_PGUARD_10 = "Si il y a une once de gloire dans ce corps pathetique, Tu entrera dans les armes de l'ordre."; +TXT_RANDOM_PGUARD_08 = "L'ordre protège les siens."; +TXT_RANDOM_PGUARD_09 = "Les Acolytes? Ils n'ont pas encore été témoins de la vraie gloire de l'ordre."; +TXT_RANDOM_PGUARD_10 = "Si il y a une once de gloire dans ce corps pathétique, ceux de l'ordre te prendront parmi les leurs."; TXT_RANDOMGOODBYE_1 = "Au revoir!"; TXT_RANDOMGOODBYE_2 = "Merci, au revoir!"; TXT_RANDOMGOODBYE_3 = "A plus tard!"; +TXT_HAVEENOUGH = "Vous avez l'air d'en avoir assez!"; +TXT_GOAWAY = "Allez-vous en!"; + +TXT_COMM0 = "Message reçu."; +TXT_COMM1 = "Message reçu de BlackBird"; + +AMMO_CLIP = "Balles"; +AMMO_SHELLS = "Cartouches"; +AMMO_ROCKETS = "Roquettes"; +AMMO_CELLS = "Cellules"; +AMMO_GOLDWAND = "Cristaux"; +AMMO_CROSSBOW = "Carreaux"; +AMMO_BLASTER = "Orbes"; +AMMO_MACE = "Sphères"; +AMMO_PHOENIXROD = "Orbes de Feu"; +AMMO_MANA1 = "Mana Bleu"; +AMMO_MANA2 = "Mana Vert"; +$ifgame(chex) AMMO_CLIP = "Charge Zorch"; +$ifgame(chex) AMMO_SHELLS = "Charge de Zorcheur Large"; +$ifgame(chex) AMMO_ROCKETS = "Charge de Propulseur"; +$ifgame(chex) AMMO_CELLS = "Charge de Phaseur"; + // Menu -MNU_NEWGAME = "NOUVEAU JEU"; +MNU_NEWGAME = "NOUVELLE PARTIE"; MNU_OPTIONS = "OPTIONS"; MNU_GAMEFILES = "FICHIERS DE JEU"; MNU_INFO = "INFO"; MNU_QUITGAME = "QUITTER LE JEU"; -MNU_FIGHTER = "COMBATTANT"; -MNU_CLERIC = "CLERC"; -MNU_MAGE = "MAGICIEN"; -MNU_RANDOM = "AU HAZARD"; +MNU_FIGHTER = "GUERRIER"; +MNU_CLERIC = "MOINE"; +MNU_RANDOM = "AU HASARD"; MNU_LOADGAME = "CHARGEMENT"; MNU_SAVEGAME = "SAUVEGARDE"; MNU_COTD = "LA CITE DES DAMNES"; -MNU_HELLSMAW = "LA BOUCHE DE L'ENFER"; +MNU_HELLSMAW = "LA GEULE DE L'ENFER"; MNU_DOME = "LE DOME DE D'SPARIL"; MNU_OSSUARY = "L'OSSUAIRE"; MNU_DEMESNE = "LE DOMAINE STAGNANT"; @@ -1337,33 +1686,47 @@ MNU_DEMESNE = "LE DOMAINE STAGNANT"; MNU_WETNURSE = "VOUS AVEZ BESOIN D'UNE NOURRICE"; MNU_YELLOWBELLIES = "UN TROUILLARD-TU-EST"; MNU_BRINGEST = "AMMENEZ LES MOI!"; -MNU_SMITE = "TU EST UN MAITRE-MEUTRIER"; +MNU_SMITE = "TU EST UN MAITRE-MEURTRIER"; MNU_BLACKPLAGUE = "LA PESTE NOIRE ME POSSEDE"; MNU_NOPICTURE = "Pas d'image"; -MNU_DIFFVERSION = "Version\nDifferente"; +MNU_DIFFVERSION = "Version\nDifférente"; MNU_NOFILES = "Pas de fichier"; -MNU_CHOOSECLASS = "CHOISISSEZ UNE CLASS:"; +MNU_CHOOSECLASS = "CHOISISSEZ UNE CLASSE:"; MNU_CHOOSESKILL = "CHOISISSEZ UN NIVEAU DE DIFICULTE:"; +SKILL_BABY = "Je suis trop jeune pour mourir!"; +SKILL_EASY = "Hé, pas trop fort!"; +SKILL_NORMAL = "Fais-moi mal!"; +SKILL_HARD = "Ultra-Violence!"; +SKILL_NIGHTMARE = "CAUCHEMAR!"; + +CSKILL_BABY = "On y Va Doucement"; +CSKILL_EASY = "Pas trop Collant"; +CSKILL_NORMAL = "Des Tonnes de Gelée"; +CSKILL_HARD = "Extrêmement Gluant"; +CSKILL_NIGHTMARE = "Carrément Crade!"; + +SSKILL_BABY = "Entrâinement"; +SSKILL_EASY = "Recrue"; +SSKILL_NORMAL = "Véteran"; +SSKILL_NIGHTMARE = "Massacre!"; + MNU_SQUIRE = "ECUYER"; MNU_KNIGHT = "CHEVALIER"; MNU_WARRIOR = "GUERRIER"; -MNU_BERSERKER = "FOU-FURIEUX"; -MNU_TITAN = "TITAN"; MNU_ALTARBOY = "ENFANT DE CHOEUR"; -MNU_ACOLYTE = "ACOLYTE"; MNU_PRIEST = "PRETRE"; -MNU_CARDINAL = "CARDINALE"; +MNU_CARDINAL = "CARDINAL"; MNU_POPE = "PAPE"; MNU_APPRENTICE = "APPRENTI"; MNU_ENCHANTER = "ENCHANTEUR"; MNU_SORCERER = "SORCIER"; -MNU_WARLOCK = "BRISEUR DE SERMENT"; -MNU_ARCHMAGE = "ARCHIMAGICIEN"; +MNU_WARLOCK = "MAGE DE GUERRE"; +MNU_ARCHMAGE = "ARCHIMAGE"; MNU_PLAYERSETUP = "REGLAGE DU JOUEUR"; @@ -1371,66 +1734,782 @@ MNU_DELETESG = "Voulez vous vraiment effacer cette sauvegarde?\n"; $ifgame(heretic) SWSTRING = "SEULEMENT DISPONIBLE DANS LA VERSION ENREGISTREE"; +// Options Menu +OPTMNU_CONTROLS = "Modifier les Contrôles"; +OPTMNU_MOUSE = "Options de la Souris"; +OPTMNU_JOYSTICK = "Options de la Manette"; +OPTMNU_PLAYER = "Options du Joueur"; +OPTMNU_GAMEPLAY = "Options du Gameplay"; +OPTMNU_COMPATIBILITY = "Options de Compatibilité"; +OPTMNU_AUTOMAP = "Options de la Carte"; +OPTMNU_HUD = "Options de l'ATH"; +OPTMNU_MISCELLANEOUS = "Options Annexes"; +OPTMNU_NETWORK = "Options Réseau"; +OPTMNU_SOUND = "Options du Son"; +OPTMNU_DISPLAY = "Options de l'Affichage"; +OPTMNU_VIDEO = "Choisir Mode D'Affichage"; +OPTMNU_CHANGERENDER = "Changer de Moteur de Rendu"; +OPTMNU_DEFAULTS = "Réinitialiser les paramètres"; +OPTMNU_RESETTOSAVED = "Recharger dernière config."; +OPTMNU_CONSOLE = "Ouvrir la console"; + +// Controls Menu + +CNTRLMNU_TITLE = "MODIFIER CONTROLES"; +CNTRLMNU_SWITCHTEXT1 = "ENTREE pour changer, RET. ARRIERE pour effacer."; +CNTRLMNU_SWITCHTEXT2 = "Appuyez sur la nouvelle touche pour l'assigner,\nAppuyez sur ECHAP pour annuler."; +CNTRLMNU_CONTROLS = "Contrôles"; +CNTRLMNU_ATTACK = "Tirer"; +CNTRLMNU_ALTATTACK = "Tir Secondaire"; +CNTRLMNU_RELOAD = "Recharger Arme"; +CNTRLMNU_ZOOM = "Zoom avec Arme"; +CNTRLMNU_USER1 = "Etat d'Arme 1"; +CNTRLMNU_USER2 = "Etat d'Arme 2"; +CNTRLMNU_USER3 = "Etat d'Arme 3"; +CNTRLMNU_USER4 = "Etat d'Arme 4"; +CNTRLMNU_USE = "Utiliser/Ouvrir"; +CNTRLMNU_FORWARD = "Avancer"; +CNTRLMNU_BACK = "Reculer"; +CNTRLMNU_MOVELEFT = "Aller à Gauche"; +CNTRLMNU_MOVERIGHT = "Aller à Droite"; +CNTRLMNU_TURNLEFT = "Tourner à Gauche"; +CNTRLMNU_TURNRIGHT = "Tourner à Droite"; +CNTRLMNU_TURN180 = "Faire un 180"; +CNTRLMNU_JUMP = "Sauter"; +CNTRLMNU_CROUCH = "S'accroupir (tenir)"; +CNTRLMNU_TOGGLECROUCH = "S'accroupir (alterner)"; +CNTRLMNU_MOVEUP = "Voler/Nager en haut"; +CNTRLMNU_MOVEDOWN = "Voler/Nager en bas"; +CNTRLMNU_LAND = "Arrêter de voler"; +CNTRLMNU_MOUSELOOK = "Vue à la souris"; +CNTRLMNU_KEYBOARDLOOK = "Vue au clavier"; +CNTRLMNU_LOOKUP = "Regarder en haut"; +CNTRLMNU_LOOKDOWN = "Regarder en bas"; +CNTRLMNU_CENTERVIEW = "Recentrer Vue"; +CNTRLMNU_RUN = "Courir (tenir)"; +CNTRLMNU_TOGGLERUN = "Courir (alterner)"; +CNTRLMNU_STRAFE = "Pas de côté"; +CNTRLMNU_SCOREBOARD = "Afficher Scores (tenir)"; +CNTRLMNU_TOGGLESCOREBOARD = "Afficher Scores (alterner)"; +CNTRLMNU_CHAT = "Chat"; +CNTRLMNU_SAY = "Parler"; +CNTRLMNU_TEAMSAY = "Parler (équipe)"; +CNTRLMNU_WEAPONS = "Armes"; +CNTRLMNU_NEXTWEAPON = "Arme Suivante"; +CNTRLMNU_PREVIOUSWEAPON = "Arme Précédente"; +CNTRLMNU_SLOT1 = "Emplacement D'Arme 1"; +CNTRLMNU_SLOT2 = "Emplacement D'Arme 2"; +CNTRLMNU_SLOT3 = "Emplacement D'Arme 3"; +CNTRLMNU_SLOT4 = "Emplacement D'Arme 4"; +CNTRLMNU_SLOT5 = "Emplacement D'Arme 5"; +CNTRLMNU_SLOT6 = "Emplacement D'Arme 6"; +CNTRLMNU_SLOT7 = "Emplacement D'Arme 7"; +CNTRLMNU_SLOT8 = "Emplacement D'Arme 8"; +CNTRLMNU_SLOT9 = "Emplacement D'Arme 9"; +CNTRLMNU_SLOT0 = "Emplacement D'Arme 0"; +CNTRLMNU_INVENTORY = "Inventaire"; +CNTRLMNU_USEITEM = "Activer objet"; +CNTRLMNU_USEALLITEMS = "Activer tous les objets"; +CNTRLMNU_NEXTITEM = "Objet suivant"; +CNTRLMNU_PREVIOUSITEM = "Objet précédent"; +CNTRLMNU_DROPITEM = "Lâcher objet"; +CNTRLMNU_QUERYITEM = "Vérifier objet"; +CNTRLMNU_DROPWEAPON = "Lâcher arme"; +CNTRLMNU_OTHER = "Autres"; +CNTRLMNU_AUTOMAP = "Activer Carte"; +CNTRLMNU_CHASECAM = "Caméra 3ième personne"; +CNTRLMNU_COOPSPY = "Espionner Coéquiper"; +CNTRLMNU_SCREENSHOT = "Capture d'Ecran"; +CNTRLMNU_CONSOLE = "Ouvrir Console"; +CNTRLMNU_POPUPS = "Popups de Strife"; +CNTRLMNU_MISSION = "Objectifs de Mission"; +CNTRLMNU_KEYS = "Liste des Clés"; +CNTRLMNU_STATS = "Statistiques, armes et munitions"; + +// Mouse Menu + +MOUSEMNU_TITLE = "OPTIONS SOURIS"; +MOUSEMNU_ENABLEMOUSE = "Activer Souris"; +MOUSEMNU_MOUSEINMENU = "Activer Souris dans les Menus"; +MOUSEMNU_SHOWBACKBUTTON = "Afficher le bouton retour"; +MOUSEMNU_CURSOR = "Curseur"; +MOUSEMNU_SENSITIVITY = "Sensibilité générale"; +MOUSEMNU_NOPRESCALE = "Prescaling movement souris"; +MOUSEMNU_SMOOTHMOUSE = "Lissage Souris"; +MOUSEMNU_TURNSPEED = "Vitesse pour tourner"; +MOUSEMNU_MOUSELOOKSPEED = "Vitesse Vue Souris"; +MOUSEMNU_FORWBACKSPEED = "Vitesse Avancer/reculer"; +MOUSEMNU_STRAFESPEED = "Vitesse Gauche/Droite"; +MOUSEMNU_ALWAYSMOUSELOOK = "Toujours vue Souris"; +MOUSEMNU_INVERTMOUSE = "Inverser Souris"; +MOUSEMNU_LOOKSPRING = "Recentrer après Vue Souris"; +MOUSEMNU_LOOKSTRAFE = "Mouvement Latéral par Souris"; + +// Joystick Menu + +JOYMNU_TITLE = "CONFIGURER MANETTE"; +JOYMNU_OPTIONS = "OPTIONS MANNETTE"; +JOYMNU_NOMENU = "Bloquer la manette dans les menus"; + +// Player Setup Menu +MNU_PLAYERSETUP = "OPTIONS JOUEUR"; +PLYRMNU_NAME = "Nom"; +PLYRMNU_TEAM = "Equipe"; +PLYRMNU_PLAYERCOLOR = "Couleur"; +PLYRMNU_RED = "Rouge"; +PLYRMNU_GREEN = "Vert"; +PLYRMNU_BLUE = "Bleu"; +PLYRMNU_PLAYERCLASS = "Classe"; +PLYRMNU_PLAYERGENDER = "Genre"; +PLYRMNU_AUTOAIM = "Auto-visée"; +PLYRMNU_SWITCHONPICKUP = "Dernière arme"; +PLYRMNU_ALWAYSRUN = "Toujours courir"; +PLYRMNU_PRESSSPACE = "APPUYEZ SUR \cjESPACE"; +PLYRMNU_SEEFRONT = "POUR VOIR L'AVANT"; +PLYRMNU_SEEBACK = "POUR VOIR L'ARRIERE"; + +// Display Options +DSPLYMNU_TITLE = "OPTIONS AFFICHAGE"; +DSPLYMNU_SCOREBOARD = "Options Tableau des Scores"; +DSPLYMNU_SCREENSIZE = "Taille de l'écran"; +DSPLYMNU_BRIGHTNESS = "Luminosité"; +DSPLYMNU_VSYNC = "Synchronisation Verticale"; +DSPLYMNU_CAPFPS = "Interpolation du rendu"; +DSPLYMNU_COLUMNMETHOD = "Rendu par Colonnes"; +DSPLYMNU_BLENDMETHOD = "Mode de Rendu transparence"; + +DSPLYMNU_WIPETYPE = "Style de Fondu d'écran"; +DSPLYMNU_SHOWENDOOM = "Montrer la fenêtre ENDOOM"; +DSPLYMNU_BLOODFADE = "Intensité du flash dommages"; +DSPLYMNU_PICKUPFADE = "Intensité du flash objets"; +DSPLYMNU_WATERFADE = "Intensité du fondu sous l'eau"; +DSPLYMNU_SKYMODE = "Mode du rendu du Ciel"; +DSPLYMNU_LINEARSKY = "Ciel linéaire"; +DSPLYMNU_GZDFULLBRIGHT = "Fullbright ignore couleur secteur"; +DSPLYMNU_SCALEFUZZ = "Scaling de l'effet de bruit"; +DSPLYMNU_DRAWFUZZ = "Effet de bruit"; +DSPLYMNU_OLDTRANS = "Transparence classique"; +DSPLYMNU_TRANSSOUL = "Transparence des âmes perdues"; +DSPLYMNU_FAKECONTRAST = "Faux Contraste"; +DSPLYMNU_ROCKETTRAILS = "Trainées des Roquettes"; +DSPLYMNU_BLOODTYPE = "Type de particules Sang"; +DSPLYMNU_PUFFTYPE = "Type de particules Balles"; +DSPLYMNU_MAXPARTICLES = "Nombre de particules"; +DSPLYMNU_MAXDECALS = "Number de décalques"; +DSPLYMNU_PLAYERSPRITES = "Montrer les sprites joueur"; +DSPLYMNU_DEATHCAM = "Caméra 3ème pers à la mort"; +DSPLYMNU_TELEZOOM = "Zoom sur téléportation"; +DSPLYMNU_QUAKEINTENSITY = "Intensité des séismes"; +DSPLYMNU_NOMONSTERINTERPOLATION = "Interpolation des monstres"; +DSPLYMNU_MENUDIM = "Assombrissement menu"; +DSPLYMNU_DIMCOLOR = "Couleur de l'assombrissement"; +DSPLYMNU_MOVEBOB = "Chaloupage arme en movement"; +DSPLYMNU_STILLBOB = "Chaloupage arme statique"; +DSPLYMNU_BOBSPEED = "Vitesse du chaloupage"; +DSPLYMNU_GPUSWITCH = "GPU alternatif sur PC Portable"; + +// HUD Options +HUDMNU_TITLE = "OPTIONS ATH"; +HUDMNU_ALTHUD = "ATH Alternatif"; +HUDMNU_MESSAGE = "Options des Messages"; +HUDMNU_UISCALE = "Echelle de l'interface"; +HUDMNU_CROSSHAIR = "Viseur par défaut"; +HUDMNU_FORCECROSSHAIR = "Forcer Viseur par défaut"; +HUDMNU_GROWCROSSHAIR = "Agrandir viseur en prenant un objet"; +HUDMNU_CROSSHAIRCOLOR = "Couleur Viseur"; +HUDMNU_CROSSHAIRHEALTH = "Coleur Viseur selon santé"; +HUDMNU_CROSSHAIRSCALE = "Mise à l'échelle du viseur"; +HUDMNU_NAMETAGS = "Afficher noms des objets"; +HUDMNU_NAMETAGCOLOR = "Couleur des noms d'objet"; +HUDMNU_SCALEFULLSCREENHUD = "Etirer l'ATH plein écran"; +HUDMNU_OLDOUCH = "Ancien code pour l' 'ouch face'"; +HUDMNU_HEXENFLASHES = "Flash d'arme dans Hexen"; +HUDMNU_POISONFLASHES = "Flash de poison dans Hexen"; +HUDMNU_ICEFLASHES = "Flash de morts par glace"; +HUDMNU_HAZARDFLASHES = "Flash d'accumulation de poison"; +HUDMNU_SCALEOPT = "Option de mise à l'échelle"; + +// Scaling options +SCALEMNU_TITLE = "OPTIONS MISE A L ECHELLE"; +SCALEMNU_OVERRIDE = "Annule les paramètres au dessus"; +SCALEMNU_MESSAGES = "Messages"; +SCALEMNU_CONSOLE = "Console"; +SCALEMNU_STATBAR = "Barre d'état"; +SCALEMNU_HUD = "ATH plein écran"; +SCALEMNU_ALTHUD = "ATH alternatif"; +SCALEMNU_HUDASPECT = "ATH préserve le rapport d'aspect"; +SCALEMNU_USEUI = "Défaut"; +SCALEMNU_USEFS = "Plein écran"; +SCALEMNU_ADAPT = "Ecran"; + +// AltHUD Options +ALTHUDMNU_TITLE = "ATH ALTERNATIF"; +ALTHUDMNU_ENABLE = "Activer l'ATH Alternatif"; +ALTHUDMNU_SHOWSECRETS = "Afficher compteur de secrets"; +ALTHUDMNU_SHOWMONSTERS = "Afficher compteur de monstres"; +ALTHUDMNU_SHOWITEMS = "Afficher compteur d'objets"; +ALTHUDMNU_SHOWSTATS = "Afficher Endurance et Précision"; +ALTHUDMNU_SHOWBERSERK = "Afficher Berserk"; +ALTHUDMNU_SHOWWEAPONS = "Afficher Armes"; +ALTHUDMNU_SHOWAMMO = "Afficher Munitions pour"; +ALTHUDMNU_SHOWTIME = "Afficher temps niveau"; +ALTHUDMNU_TIMECOLOR = "Couleur du timer"; +ALTHUDMNU_SHOWLAG = "Afficher latence réseau"; +ALTHUDMNU_AMMOORDER = "Ordre d'affichage des munitions"; +ALTHUDMNU_AMMORED = "Compteur de munitions rouge sous"; +ALTHUDMNU_AMMOYELLOW = "Compteur de munitions jaune sous"; +ALTHUDMNU_HEALTHRED = "Compteur de santé rouge sous"; +ALTHUDMNU_HEALTHYELLOW = "Compteur de santé jaune sous"; +ALTHUDMNU_HEALTHGREEN = "Compteur de santé vert sous"; +ALTHUDMNU_ARMORRED = "Compteur d' armure rouge sous"; +ALTHUDMNU_ARMORYELLOW = "Compteur d' armure jaune sous"; +ALTHUDMNU_ARMORGREEN = "Compteur d' armure bleu sous"; +ALTHUDMNU_AUTOMAPHUD = "ATH Alternatif pour carte"; +ALTHUDMNU_TITLECOLOR = "Couleur titre du niveau"; +ALTHUDMNU_MAPTIMECOLOR = "Couleur temps du niveau"; +ALTHUDMNU_HUBTIMECOLOR = "Couleur temps du hub"; +ALTHUDMNU_TOTALTIMECOLOR = "Couleur temps total"; +ALTHUDMNU_COORDINATECOLOR = "Couleur coordonnées"; +ALTHUDMNU_COORDINATEMODE = "Mode coordonnées"; +ALTHUDMNU_STATSNAMECOLOR = "Couleur nom des statistiques"; +ALTHUDMNU_STATSCOLOR = "Couleur statistiques"; + +// Misc. Options +MISCMNU_TITLE = "OPTIONS ANNEXES"; +MISCMNU_MERGEKEYS = "Combiner Alt/Ctrl/maj gauche & droite"; +MISCMNU_WINFULLSCREENTOGGLE = "Alt-Entrée alterne plein écran"; +MISCMNU_MACFULLSCREENTOGGLE = "Command-F alterne plein écran"; +MISCMNU_QUERYIWAD = "Afficher la séléction d'IWAD"; +MISCMNU_ALLCHEATS = "Activer cheats de tous les jeux"; +MISCMNU_ENABLEAUTOSAVES = "Activer Sauvegardes auto"; +MISCMNU_AUTOSAVECOUNT = "Total de sauvegardes auto"; +MISCMNU_SAVELOADCONFIRMATION = "Confirmation C/S"; +MISCMNU_DEHLOAD = "Charger fichiers *.deh/*.bex"; +MISCMNU_CACHENODES = "Mise en cache des nodes"; +MISCMNU_CACHETIME = "Limite cache des nodes"; +MISCMNU_CLEARNODECACHE = "Vider le cache des nodes"; +MISCMNU_INTERSCROLL = "Sauter compteurs d'intermission"; +// Automap Options +AUTOMAPMNU_TITLE = "OPTIONS CARTE"; +AUTOMAPMNU_COLORSET = "Set de couleurs de la carte"; +AUTOMAPMNU_CUSTOMCOLORS = "Couleurs définies par carte"; +AUTOMAPMNU_SETCUSTOMCOLORS = "Choisir couleurs personnalisées"; +AUTOMAPMNU_CONTROLS = "Choisir contrôles de la carte"; +AUTOMAPMNU_ROTATE = "Rotation de la Carte"; +AUTOMAPMNU_OVERLAY = "Carte en Surimpression"; +AUTOMAPMNU_TEXTURED = "Activer affichage texturé"; +AUTOMAPMNU_FOLLOW = "Suivre le joueur"; +AUTOMAPMNU_SHOWITEMS = "Afficher compte d'objets"; +AUTOMAPMNU_SHOWMONSTERS = "Afficher compte de monstres"; +AUTOMAPMNU_SHOWSECRETS = "Afficher compte de secrets"; +AUTOMAPMNU_SHOWTIME = "Afficher temps passé"; +AUTOMAPMNU_SHOWTOTALTIME = "Afficher total de temps passé"; +AUTOMAPMNU_MAPSECRETS = "Afficher secrets sur carte"; +AUTOMAPMNU_SHOWMAPLABEL = "Afficher label de carte"; +AUTOMAPMNU_DRAWMAPBACK = "Afficher fond d'écran carte"; +AUTOMAPMNU_SHOWKEYS = "Afficher les clés (cheat)"; +AUTOMAPMNU_SHOWTRIGGERLINES = "Afficher lignes d'action"; +AUTOMAPMNU_SHOWTHINGSPRITES = "Afficher objets comme sprites"; +AUTOMAPMNU_PTOVERLAY = "Superposer les portails"; +AUTOMAPMNU_EMPTYSPACEMARGIN = "Marge d'espace vide"; + +// Automap Controls +MAPCNTRLMNU_TITLE = "CONTROLES CARTE"; +MAPCNTRLMNU_CONTROLS = "Contrôles de la carte"; +MAPCNTRLMNU_PANLEFT = "Aller à gauche"; +MAPCNTRLMNU_PANRIGHT = "Aller à droite"; +MAPCNTRLMNU_PANUP = "Aller en haut"; +MAPCNTRLMNU_PANDOWN = "Aller en bas"; +MAPCNTRLMNU_ZOOMIN = "Zoom avant"; +MAPCNTRLMNU_ZOOMOUT = "Zoom arrière"; +MAPCNTRLMNU_TOGGLEZOOM = "Alterner zoom"; +MAPCNTRLMNU_TOGGLEFOLLOW = "Alterner suivi"; +MAPCNTRLMNU_TOGGLEGRID = "Alterner grille"; +MAPCNTRLMNU_TOGGLETEXTURE = "Alterner texture"; +MAPCNTRLMNU_SETMARK = "Placer repère"; +MAPCNTRLMNU_CLEARMARK = "Enlever repères"; + +// Automap Colors +MAPCOLORMNU_TITLE = "COULEURS CARTE"; +MAPCOLORMNU_DEFAULTMAPCOLORS = "Couleurs par défaut"; +MAPCOLORMNU_BACKCOLOR = "Fond"; +MAPCOLORMNU_YOURCOLOR = "Votre couleur"; +MAPCOLORMNU_WALLCOLOR = "Murs à 1 côté"; +MAPCOLORMNU_FDWALLCOLOR = "Murs à 2 côtés avec différents sols"; +MAPCOLORMNU_CDWALLCOLOR = "Murs à 2 côtés avec différents plafonds"; +MAPCOLORMNU_EFWALLCOLOR = "Murs à 2 côtés avec sols 3d"; +MAPCOLORMNU_GRIDCOLOR = "Quadrillage"; +MAPCOLORMNU_XHAIRCOLOR = "Point Central"; +MAPCOLORMNU_NOTSEENCOLOR = "Murs non découvers"; +MAPCOLORMNU_LOCKEDCOLOR = "Portes verouillées"; +MAPCOLORMNU_INTRALEVELCOLOR = "Téléporteurs (même niveau)"; +MAPCOLORMNU_INTERLEVELCOLOR = "Téléporteurs (autre niveau)"; +MAPCOLORMNU_SECRETSECTORCOLOR = "Secteur Secret"; +MAPCOLORMNU_SPECIALWALLCOLOR = "Lignes d'actions spéciales"; +MAPCOLORMNU_CHEATMODE = "Mode Cheat"; +MAPCOLORMNU_TSWALLCOLOR = "Murs à 2 côtés invisibles"; +MAPCOLORMNU_SECRETWALLCOLOR = "Murs Secrets"; +MAPCOLORMNU_THINGCOLOR = "Acteurs"; +MAPCOLORMNU_MONSTERCOLOR = "Monstres"; +MAPCOLORMNU_NONCOUNTINGMONSTERCOLOR = "Monstres non comptés"; +MAPCOLORMNU_FRIENDCOLOR = "Amis"; +MAPCOLORMNU_ITEMCOLOR = "Objets"; +MAPCOLORMNU_COUNTITEMCOLOR = "Objets comptés"; +MAPCOLORMNU_OVERLAY = "Mode surimpression"; +MAPCOLORMNU_OVCHEATMODE = "Mode Cheat Surimpression"; +MAPCOLORMNU_PORTAL = "Portails superposés"; + +// Message Options +MSGMNU_SHOWMESSAGES = "Afficher messages"; +MSGMNU_SHOWOBITUARIES = "Afficher avis de décès"; +MSGMNU_SHOWSECRETS = "Afficher secrets"; +MSGMNU_MESSAGELEVEL = "Niveau de message minimum"; +MSGMNU_CENTERMESSAGES = "Messages centrés"; +MSGMNU_MESSAGECOLORS = "Couleur des messages"; +MSGMNU_ITEMPICKUP = "Objets ramassés"; +MSGMNU_OBITUARIES = "Avis de décès"; +MSGMNU_CRITICALMESSAGES = "Messages d'erreur"; +MSGMNU_CHATMESSAGES = "Message de Chat"; +MSGMNU_TEAMMESSAGES = "Messages d'équipe"; +MSGMNU_CENTEREDMESSAGES = "Messages centrés"; +MSGMNU_SCREENSHOTMESSAGES = "Messages de capture d'écran"; +MSGMNU_LONGSAVEMESSAGES = "Messages de sauvegarde détailés"; +MSGMNU_DEVELOPER = "Mode de Développement"; + +// Scoreboard Options +SCRBRDMNU_TITLE = "TABLEAU DES SCORES"; +SCRBRDMNU_COOPERATIVE = "Options Mode Coop"; +SCRBRDMNU_ENABLE = "Activer Tableau des Scores"; +SCRBRDMNU_HEADERCOLOR = "Couleur du Titre"; +SCRBRDMNU_YOURCOLOR = "Votre couleur"; +SCRBRDMNU_OTHERPLAYERCOLOR = "Couleur des autres joueurs"; +SCRBRDMNU_DEATHMATCH = "Options Deathmatch"; +SCRBRDMNU_TEAMDEATHMATCH = "Options Deathmatch en équipe"; + +// Gameplay Menu +GMPLYMNU_TITLE = "OPTIONS GAMEPLAY"; +GMPLYMNU_TEAMPLAY = "Jeu en équipe"; +GMPLYMNU_TEAMDAMAGE = "Facteur de Tir Fratricide"; +GMPLYMNU_SMARTAUTOAIM = "Autovisée intelligente"; +GMPLYMNU_FALLINGDAMAGE = "Dommages de chute"; +GMPLYMNU_DROPWEAPON = "Arme lâchée à la mort"; +GMPLYMNU_DOUBLEAMMO = "Double munitions"; +GMPLYMNU_INFINITEAMMO = "Munitions infinies"; +GMPLYMNU_INFINITEINVENTORY = "Objets infinis"; +GMPLYMNU_NOMONSTERS = "Pas de monstres"; +GMPLYMNU_NOMONSTERSTOEXIT = "Rien à tuer pour sortir"; +GMPLYMNU_MONSTERSRESPAWN = "Monstres réapparaissent"; +GMPLYMNU_NORESPAWN = "Pas de réapparition"; +GMPLYMNU_ITEMSRESPAWN = "Objets réapparaissent"; +GMPLYMNU_SUPERRESPAWN = "Powerups réapparaissent"; +GMPLYMNU_FASTMONSTERS = "Monstres Rapides"; +GMPLYMNU_DEGENERATION = "Dégéneration"; +GMPLYMNU_NOAUTOAIM = "Autoriser Auto-visée"; +GMPLYMNU_ALLOWSUICIDE = "Autoriser Suicide"; +GMPLYMNU_ALLOWJUMP = "Autoriser Sauts"; +GMPLYMNU_ALLOWCROUCH = "Autoriser Acroupissement"; +GMPLYMNU_ALLOWFREELOOK = "Autoriser Vue Libre"; +GMPLYMNU_ALLOWFOV = "Autoriser Angles de vue"; +GMPLYMNU_BFGFREEAIM = "Autoriser Visée au BFG"; +GMPLYMNU_ALLOWAUTOMAP = "Autoriser Carte"; +GMPLYMNU_AUTOMAPALLIES = "Alliés sur la carte"; +GMPLYMNU_ALLOWSPYING = "Autoriser espionnage"; +GMPLYMNU_CHASECAM = "Cheat caméra 3ième personne"; +GMPLYMNU_DONTCHECKAMMO = "Vérifier munitions pour changement arme"; +GMPLYMNU_KILLBOSSSPAWNS = "Tuer L'Icône tue tous ses monstres"; +GMPLYMNU_NOCOUNTENDMONSTER = "Ennemis dans secteur de sortie comptent"; +GMPLYMNU_DEATHMATCH = "Options Deathmatch"; +GMPLYMNU_WEAPONSSTAY = "Armes restent au sol quand récupérées"; +GMPLYMNU_ALLOWPOWERUPS = "Autoriser powerups"; +GMPLYMNU_ALLOWHEALTH = "Autoriser objets santé"; +GMPLYMNU_ALLOWARMOR = "Autoriser objets armure"; +GMPLYMNU_SPAWNFARTHEST = "Apparaître au plus loin"; +GMPLYMNU_SAMEMAP = "Même Carte"; +GMPLYMNU_FORCERESPAWN = "Forcer Réapparition"; +GMPLYMNU_ALLOWEXIT = "Autoriser Sortie"; +GMPLYMNU_BARRELSRESPAWN = "Réapparition des Tonneaux"; +GMPLYMNU_RESPAWNPROTECTION = "Protection à la réapparition"; +GMPLYMNU_LOSEFRAG = "Perdre 1 frag quand tué"; +GMPLYMNU_KEEPFRAGS = "Garder les frags gagnés"; +GMPLYMNU_NOTEAMSWITCH = "Pas de changement d'équipe"; +GMPLYMNU_COOPERATIVE = "Options Coopératives"; +GMPLYMNU_MULTIPLAYERWEAPONS = "Spawns d'armes deathmatch"; +GMPLYMNU_LOSEINVENTORY = "Perdre l'inventaire"; +GMPLYMNU_KEEPKEYS = "Garder clés"; +GMPLYMNU_KEEPWEAPONS = "Garder armes"; +GMPLYMNU_KEEPARMOR = "Garder armure"; +GMPLYMNU_KEEPPOWERUPS = "Garder powerups"; +GMPLYMNU_KEEPAMMO = "Garder munitions"; +GMPLYMNU_LOSEHALFAMMO = "Perdre la moité des munitions"; +GMPLYMNU_SPAWNWHEREDIED = "Réapparaitre sur lieu de mort"; + +// Compatibility Options +CMPTMNU_TITLE = "OPTIONS COMPATIBILITE"; +CMPTMNU_MODE = "Mode de compatibilité"; +CMPTMNU_ACTORBEHAVIOR = "Comportement des Acteurs"; +CMPTMNU_CORPSEGIBS = "Monstres écrasés peuvent être ressucités"; +CMPTMNU_NOBLOCKFRIENDS = "Monstres amicaux ne sont pas bloqués"; +CMPTMNU_LIMITPAIN = "Limite sur les âmes des élémentaires"; +CMPTMNU_MBFMONSTERMOVE = "Mouvement monstre affecté par les effets"; +CMPTMNU_CROSSDROPOFF = "Monstres ne passent pas les corniches"; +CMPTMNU_DROPOFF = "Monstres bloqués par les corniches"; +CMPTMNU_INVISIBILITY = "Monstres voient joueurs invisibles"; +CMPTMNU_MINOTAUR = "Pas de feu de Massetaur sur l'eau"; +CMPTMNU_NOTOSSDROPS = "OBjets lâchés sont direct au sol"; +CMPTMNU_DEHACKEDBEHAVIOR = "Comportement DeHackEd"; +CMPTMNU_DEHHEALTH = "Niveaux de santé DEH comme Doom2.EXE"; +CMPTMNU_MUSHROOM = "Vitesse A_Mushroom originale pour DEH"; +CMPTMNU_MAPACTIONBEHAVIOR = "Comportement Niveau/Actions"; +CMPTMNU_USEBLOCKING = "Toute ligne d'action bloque "; +CMPTMNU_ANYBOSSDEATH = "N'importe quel boss peut activer actions boss"; +CMPTMNU_NODOORLIGHT = "Pas d'effet de lumière BOOM sur portes"; +CMPTMNU_LIGHT = "Trouver prochaine texture comme DOOM"; +CMPTMNU_SHORTTEX = "Trouver plus petite texture comme Doom"; +CMPTMNU_STAIRS = "Construction d'escalier plus buggée"; +CMPTMNU_FLOORMOVE = "Mouvement des sols à la DOOM"; +CMPTMNU_POINTONLINE = "Algorithme point-sur-ligne de DOOM"; +CMPTMNU_MULTIEXIT = "Sortie niveau utilisable plusieures fois"; +CMPTMNU_PHYSICSBEHAVIOR = "Comportement Physique"; +CMPTMNU_NOPASSOVER = "Hauteur des acteurs infinie"; +CMPTMNU_BOOMSCROLL = "Glisseurs BOOM additifs"; +CMPTMNU_BADANGLES = "Direction pure NSEO impossible"; +CMPTMNU_WALLRUN = "Activer Wallrunning"; +CMPTMNU_RAVENSCROLL = "Glisseurs Raven à leur vitesse originale"; +CMPTMNU_TRACE = "Secteurs en autoréférence ne bloque pas les tirs"; +CMPTMNU_HITSCAN = "Vérification Hitscan à la DOOM"; +CMPTMNU_MISSILECLIP = "Clipping des missiles à la DOOM"; +CMPTMNU_RENDERINGBEHAVIOR = "Comportement d'affichage"; +CMPTMNU_POLYOBJ = "Dessiner les Polyobjets comme Hexen"; +CMPTMNU_MASKEDMIDTEX = "Offsets Y ignorés sur les textures centrales"; +CMPTMNU_SPRITESORT = "Ordres des sprites inversé"; +CMPTMNU_SOUNDBEHAVIOR = "Comportement Sonore"; +CMPTMNU_SOUNDSLOTS = "Massacrer le son pour BFG silencieux"; +CMPTMNU_SILENTPICKUP = "Autres joueurs n'entendent pas les ramassages"; +CMPTMNU_SILENTINSTANTFLOORS = "Sols à movement instanté font du bruit"; +CMPTMNU_SECTORSOUNDS = "Sons secteur utilisent le centre comme origine"; +CMPTMNU_SOUNDCUTOFF = "Sons s'arrêtent quand acteur disparait"; +CMPTMNU_SOUNDTARGET = "Ciblage des sons selon algorithme original"; +CMPTMNU_TELEPORT = "Téléports par scripts n'activent pas le secteur"; +CMPTMNU_PUSHWINDOW = "Lignes non-bloquantes sont non-poussables"; + +// Sound Options +SNDMNU_TITLE = "OPTIONS SONORES"; +SNDMNU_SFXVOLUME = "Volume des Sons"; +SNDMNU_MENUVOLUME = "Volume du Menu"; +SNDMNU_MUSICVOLUME = "Volume Musique"; +SNDMNU_MIDIDEVICE = "Sortie MIDI"; +SNDMNU_BACKGROUND = "Sons activé en arrière plan"; +SNDMNU_UNDERWATERREVERB = "Reverbération sous l'eau"; +SNDMNU_RANDOMIZEPITCHES = "Tons sonores aléatoires"; +SNDMNU_CHANNELS = "Canaux sonores"; +SNDMNU_BACKEND = "Traitement Son"; +SNDMNU_OPENAL = "Options OpenAL"; +SNDMNU_RESTART = "Redémarrer moteur sonore"; +SNDMNU_ADVANCED = "Options avancées"; +SNDMNU_MODREPLAYER = "Options lecteur de module"; + +// OpenAL Options +OPENALMNU_TITLE = "OPTIONS OPENAL"; +OPENALMNU_PLAYBACKDEVICE = "Sortie sonore"; +OPENALMNU_ENABLEEFX = "Activer EFX"; +OPENALMNU_RESAMPLER = "Resampler"; + +// Advanced Sound Options +ADVSNDMNU_TITLE = "OPTIONS SONORES AVANCEES"; +ADVSNDMNU_SAMPLERATE = "Sample rate"; +ADVSNDMNU_HRTF = "HRTF"; +ADVSNDMNU_OPLSYNTHESIS = "Synthèse OPL"; +ADVSNDMNU_OPLNUMCHIPS = "Puces OPL émulées"; +ADVSNDMNU_OPLFULLPAN = "Latéralisation complète MIDI"; +ADVSNDMNU_OPLCORES = "Coeur émulateur OPL"; +ADVSNDMNU_GUSEMULATION = "Emulation GUS"; +ADVSNDMNU_GUSCONFIG = "Fichier Config. GUS"; +ADVSNDMNU_MIDIVOICES = "Voix MIDI"; +ADVSNDMNU_DMXGUS = "Lire fichiers DMXGUS"; +ADVSNDMNU_GUSMEMSIZE = "Taille mémoire GUS"; +ADVSNDMNU_FLUIDSYNTH = "FluidSynth"; +ADVSNDMNU_FLUIDPATCHSET = "Patchset"; +ADVSNDMNU_FLUIDGAIN = "Gain"; +ADVSNDMNU_REVERB = "Reverb"; +ADVSNDMNU_CHORUS = "Chorus"; +ADVSNDMNU_TIMIDITY = "Timidity++"; +ADVSNDMNU_TIMIDITYEXE = "Chemin exécutable"; +ADVSNDMNU_TIMIDITYCONFIG = "Fichier de config. TiMidity"; +ADVSNDMNU_TIMIDITYVOLUME = "Volume Relatif"; +ADVSNDMNU_WILDMIDI = "WildMidi"; +ADVSNDMNU_WILDMIDICONFIG = "Fichier config. WildMidi"; +ADVSNDMNU_SELCONFIG = "Sélectionner configuration"; + +// Module Replayer Options +MODMNU_TITLE = "OPTIONS LECTEUR MODULES"; +MODMNU_REPLAYERENGINE = "Moteur de lecture"; +MODMNU_MASTERVOLUME = "Volume maître"; +MODMNU_QUALITY = "Qualité"; +MODMNU_VOLUMERAMPING = "Rampe du volume"; +MODMNU_CHIPOMATIC = "Chip-o-matic"; + +// Renderer Options +RNDMNU_TITLE = "SELECTION MOTEUR RENDU"; +RNDMNU_RENDERER = "Accélération Matérielle"; +RNDMNU_TRUECOLOR = "Mode Software Couleurs Réeles"; +RNDMNU_POLY = "Moteur Poly (expérimental)"; +RNDMNU_CANVAS = "Canvas Software"; + +// Video Options +VIDMNU_TITLE = "MODE VIDEO"; +VIDMNU_FULLSCREEN = "Plein écran"; +VIDMNU_HIDPI = "Support Retina/HiDPI "; +VIDMNU_BRDLSS = "Mode fenêtré sans bordures"; +VIDMNU_ASPECTRATIO = "Rapport D'Aspect"; +VIDMNU_FORCEASPECT = "Forcer Rapport"; +VIDMNU_CROPASPECT = "Style de Ratio forcé"; +VIDMNU_5X4ASPECTRATIO = "Activer Rapport 5:4"; +VIDMNU_SCALEMODE = "Echelle de Résolution"; +VIDMNU_SCALEFACTOR = "Facteur d'échelle"; +VIDMNU_ENTERTEXT = "Appuyez sur ENTREE pour choisir un mode"; +VIDMNU_TESTTEXT1 = "Appuyez sur T pour tester ce mode pendant 5 secondes."; +VIDMNU_TESTTEXT2 = "Veuillez attendre 5 secondes..."; + +// Network Options +NETMNU_TITLE = "OPTIONS RESEAU"; +NETMNU_LOCALOPTIONS = "Options Locales"; +NETMNU_MOVEPREDICTION = "Prédiction de Mouvement"; +NETMNU_LINESPECIALPREDICTION = "Prédiction des actions de ligne"; +NETMNU_PREDICTIONLERPSCALE = "Prédiction d'échelle LERP"; +NETMNU_LERPTHRESHOLD = "Limite LERP"; +NETMNU_HOSTOPTIONS = "Options Hôte"; +NETMNU_EXTRATICS = "Tics supplémentaires"; +NETMNU_TICBALANCE = "Equilibrage de latence"; + +// Joystick menu + +JOYMNU_ENABLE = "Activer support contrôleur"; +JOYMNU_DINPUT = "Activer contrôleurs DirectInput"; +JOYMNU_XINPUT = "Activer contrôleurs XInput"; +JOYMNU_PS2 = "Activer adaptateurs PS2 bruts"; +JOYMNU_NOCON = "Aucun Contrôleur détecté."; +JOYMNU_CONFIG = "Configurer contrôleurs:"; +JOYMNU_DISABLED1 = "Le Support de contrôleur doit être activé"; +JOYMNU_DISABLED2 = "avant de pouvoir en détecter un."; +JOYMNU_INVALID = "Contrôleur invalide spécifé dans le menu."; +JOYMNU_OVRSENS = "Sensibilité générale"; +JOYMNU_AXIS = "Configuration des axes"; +JOYMNU_INVERT = "Inverser"; +JOYMNU_DEADZONE = "Zone neutre"; +JOYMNU_NOAXES = "Aucun axe à configurer"; + +// Option Values +OPTVAL_MALE = "Masculin"; +OPTVAL_FEMALE = "Féminin"; +OPTVAL_OTHER = "Neutre"; +OPTVAL_UPPERLEFT = "Supérieur gauche"; +OPTVAL_UPPERRIGHT = "Supérieur droite"; +OPTVAL_LOWERLEFT = "Inférieur gauche"; +OPTVAL_LOWERRIGHT = "Inférieur droite"; +OPTVAL_TOUCHSCREENLIKE = "Style écran tactile"; +OPTVAL_NONE = "Aucun"; +OPTVAL_TURNING = "Tourner"; +OPTVAL_LOOKINGUPDOWN = "Vue haut/bas"; +OPTVAL_MOVINGFORWARD = "Avancer"; +OPTVAL_STRAFING = "Pas de côté"; +OPTVAL_MOVINGUPDOWN = "Mouvement haut/bas"; +OPTVAL_INVERTED = "Inversé"; +OPTVAL_NOTINVERTED = "Non Inversé"; +OPTVAL_ORIGINAL = "Original"; +OPTVAL_OPTIMIZED = "Optimisé"; +OPTVAL_CLASSIC = "Classique (+ Rapide)"; +OPTVAL_PRECISE = "Précis"; +OPTVAL_STRETCH = "Etirer"; +OPTVAL_CAPPED = "Limité"; +OPTVAL_PARTICLES = "Particules"; +OPTVAL_SPRITESPARTICLES = "Sprites & Particules"; +OPTVAL_MELT = "Fondu"; +OPTVAL_BURN = "Brûlure"; +OPTVAL_CROSSFADE = "Fondu en croix"; +OPTVAL_ONLYMODIFIED = "Modifié seulement"; +OPTVAL_SMOOTH = "Lisse"; +OPTVAL_TRANSLUCENT = "Transparent"; +OPTVAL_FUZZ = "Bruit Blanc"; +OPTVAL_SHADOW = "Ombre"; +OPTVAL_ITEMS = "Objets"; +OPTVAL_WEAPONS = "Armes"; +OPTVAL_BOTH = "Les Deux"; +OPTVAL_PLAYER = "Joueur"; +OPTVAL_MAP = "Niveau"; +OPTVAL_SCALETO640X400 = "Echelle 640x400"; +OPTVAL_CURRENTWEAPON = "Arme actuelle"; +OPTVAL_AVAILABLEWEAPONS = "Armes Disponibles"; +OPTVAL_ALLWEAPONS = "Toutes les armes"; +OPTVAL_LEVELMILLISECONDS = "Niveau, milisecondes"; +OPTVAL_LEVELSECONDS = "Niveau, secondes"; +OPTVAL_LEVEL = "Niveau"; +OPTVAL_HUBSECONDS = "Hub, secondes"; +OPTVAL_HUB = "Hub"; +OPTVAL_TOTALSECONDS = "Total, secondes"; +OPTVAL_TOTAL = "Total"; +OPTVAL_SYSTEMSECONDS = "Système, secondes"; +OPTVAL_SYSTEM = "Système"; +OPTVAL_NETGAMESONLY = "Parties en Ligne seulement"; +OPTVAL_ALWAYS = "Toujours"; +OPTVAL_AMMOIMAGETEXT = "Image et Texte"; +OPTVAL_AMMOTEXTIMAGE = "Texte et Image"; +OPTVAL_SCRIPTSONLY = "Scripts seulement"; +OPTVAL_NEVER = "Jamais"; +OPTVAL_ALL = "Tout"; +OPTVAL_ONLYLASTONE = "Dernier seulement"; +OPTVAL_CUSTOM = "Modifié"; +OPTVAL_TRADITIONALDOOM = "Doom Traditionnel"; +OPTVAL_TRADITIONALSTRIFE = "Strife Traditionnel"; +OPTVAL_TRADITIONALRAVEN = "Raven Traditionnel"; +OPTVAL_ONLYWHENFOUND = "Seulement découverts"; +OPTVAL_ONFOROVERLAYONLY = "On pour Surimpression"; +OPTVAL_OVERLAYNORMAL = "Surimpression+Normal"; +OPTVAL_OVERLAYONLY = "Surimpression seulement"; +OPTVAL_NOTFORHUBS = "Pas pour les hubs"; +OPTVAL_FRONT = "Devant"; +OPTVAL_ANIMATED = "Animés"; +OPTVAL_ROTATED = "Tournés"; +OPTVAL_MAPDEFINEDCOLORSONLY = "Couleurs définies carte seul."; +OPTVAL_NODOORS = "Tout sauf portes"; +OPTVAL_ITEMPICKUP = "Objets Ramassés"; +OPTVAL_OBITUARIES = "Avis de décès"; +OPTVAL_CRITICALMESSAGES = "Messages Critiques"; +OPTVAL_NEVERFRIENDS = "Jamais les Amis"; +OPTVAL_ONLYMONSTERS = "Monstres Seulement"; +OPTVAL_HEXEN = "Hexen"; +OPTVAL_OLD = "Ancien"; +OPTVAL_DEFAULT = "Défaut"; +OPTVAL_SOUNDSYSTEM = "Système Sonore"; +OPTVAL_LINEAR = "Linéaire"; +OPTVAL_CUBIC = "Cubique"; +OPTVAL_BLEP = "Step limité sur bande"; +OPTVAL_LINEARSLOW = "Linéaire (Lent)"; +OPTVAL_BLAM = "Linéaire limité sur bande"; +OPTVAL_CUBICSLOW = "Cubique (Lent)"; +OPTVAL_NOTEONOFFONLY = "Note on/off seulement"; +OPTVAL_FULLRAMPING = "Rampe complète"; +OPTVAL_ALLUNACKNOWLEDGED = "Tout non-confirmé"; +OPTVAL_ERRORS = "Erreurs"; +OPTVAL_WARNINGS = "Alertes"; +OPTVAL_EVERYTHING = "Tout"; +OPTVAL_FULLSCREENONLY = "Plein écran seulement"; +OPTVAL_HWPOLY = "OpenGL-Accéléré"; +OPTVAL_SWDOOM = "Moteur Software Doom"; +OPTVAL_DEDICATED = "Haute-Performance"; +OPTVAL_INTEGRATED = "Sauvegarde d'énergie"; +OPTVAL_VTFZDOOM = "ZDoom (Forcé)"; +OPTVAL_VTFVANILLA = "Vanilla (Forcé)"; +OPTVAL_VTAZDOOM = "Auto (ZDoom Préféré)"; +OPTVAL_VTAVANILLA = "Auto (Vanilla Préféré)"; +OPTVAL_SCALENEAREST = "Mise à l'échelle (Proche Voisin)"; +OPTVAL_SCALELINEAR = "Mise à l'échelle (Linéaire)"; + +// Colors +C_BRICK = "\cabrique"; +C_TAN = "\cbbeige"; +C_GRAY = "\ccgris"; +C_GREEN = "\cdvert"; +C_BROWN = "\cebrun"; +C_GOLD = "\cfor"; +C_RED = "\cgrouge"; +C_BLUE = "\chbleu"; +C_WHITE = "\cjblanc"; +C_YELLOW = "\ckjaune"; +C_DEFAULT = "\cldéfaut"; +C_BLACK = "\cmnoir"; +C_LIGHTBLUE = "\cnbleu clair"; +C_CREAM = "\cocrème"; +C_DARKGREEN = "\cqvert sombre"; +C_DARKRED = "\crrouge sombre"; +C_DARKBROWN = "\csbrun sombre"; +C_PURPLE = "\ctviolet"; +C_DARKGRAY = "\cugris sombre"; +C_ICE = "\cwglace"; +C_FIRE = "\cxfeu"; +C_SAPPHIRE = "\cysaphir"; +C_TEAL = "\czturquoise"; +// Option Strings +OPTSTR_SIMPLEARROW = "Flèche simple"; +OPTSTR_SYSTEMCURSOR = "Curseur Système"; +OPTSTR_NOSOUND = "Pas de son"; +OPTSTR_SURROUND = "5 enceintes"; +OPTSTR_5POINT1 = "Enceintes 5.1"; +OPTSTR_7POINT1 = "Enceintes 7.1"; +OPTSTR_NOINTERPOLATION = "Pas d'interpolation"; + + + +SAFEMESSAGE = "Voulez-vous vraiment faire ça?"; +MNU_COLORPICKER = "CHOISIR COULEUR"; + + +WI_FINISHED = "terminé"; +WI_ENTERING = "Entrant:"; + +AM_MONSTERS = "Monstres:"; +AM_ITEMS = "Objets:"; + + // Bloodbath announcer -BBA_BONED = "%k desossa %o comme un poisson"; +BBA_BONED = "%k désossa %o comme un poisson"; BBA_CASTRA = "%k castra %o"; -BBA_CREAMED = "%k a battu a plate couture %o"; -BBA_DECIMAT = "%k a decime %o"; -BBA_DESTRO = "%k a detruit %o"; -BBA_DICED = "%k a coupe en des %o"; -BBA_DISEMBO = "%k a etripe %o"; -BBA_FLATTE = "%k a aplatit %o"; -BBA_JUSTICE = "%k a rendu une justice anal a %o"; -BBA_MADNESS = "%k a fait une folie ANAL a %o"; -BBA_KILLED = "%k a tue %o"; -BBA_MINCMEAT = "%k a fait de la viande hachee de %o"; -BBA_MASSACR = "%k a massacre %o"; -BBA_MUTILA = "%k a mutile %o"; -BBA_REAMED = "%k a decoupe en fines lamelles %o"; +BBA_CREAMED = "%k a battu %o à plate couture "; +BBA_DECIMAT = "%k a décimé %o"; +BBA_DESTRO = "%k a détruit %o"; +BBA_DICED = "%k a coupé en dés %o"; +BBA_DISEMBO = "%k a étripé %o"; +BBA_FLATTE = "%k a aplati %o"; +BBA_JUSTICE = "%k a rendu une justice anale a %o"; +BBA_MADNESS = "%k a donné la FOLIE ANALE a %o"; +BBA_KILLED = "%k a tué %o"; +BBA_MINCMEAT = "%k a fait de la viande hachée de %o"; +BBA_MASSACR = "%k a massacré %o"; +BBA_MUTILA = "%k a mutilé %o"; +BBA_REAMED = "%k a découpé en fines lamelles %o"; BBA_RIPPED = "%k a ouvert un nouvel orifice a %o"; -BBA_SLAUGHT = "%k a massacre %o"; -BBA_SMASHED = "%k a enfonce %o"; -BBA_SODOMIZ = "%k y a sodomise n %o"; -BBA_SPLATT = "%k a eclabousse les morceaux de %o"; -BBA_SQUASH = "%k a ecrabouille %o"; -BBA_THROTTL = "%k a etouffe %o"; -BBA_WASTED = "%k a decharne %o"; -BBA_BODYBAG = "%k a placer %o dans son linceul"; -BBA_HELL = "%k a envoye en enfer %o"; -BBA_TOAST = "%k a grille %o"; -BBA_SNUFF = "%k a creve %o"; -BBA_HOSED = "%k a arose %o"; -BBA_SPRAYED = "%k a pulverise %o"; -BBA_DOGMEAT = "%k a fait de la patee pour chien %o"; +BBA_SLAUGHT = "%k a meurtri %o"; +BBA_SMASHED = "%k a enfoncé %o"; +BBA_SODOMIZ = "%k y a sodomisé n %o"; +BBA_SPLATT = "%k a explosé de %o"; +BBA_SQUASH = "%k a écrabouillé %o"; +BBA_THROTTL = "%k a étouffé %o"; +BBA_WASTED = "%k a décharne %o"; +BBA_BODYBAG = "%k a placé %o dans son linceul"; +BBA_HELL = "%k a envoyé %o en enfer"; +BBA_TOAST = "%k a grillé %o"; +BBA_SNUFF = "%k a crevé %o"; +BBA_HOSED = "%k a arrosé %o"; +BBA_SPRAYED = "%k a pulvérise %o"; +BBA_DOGMEAT = "%k a fait de la patée pour chien %o"; BBA_BEATEN = "%k a battu %o"; -BBA_EXCREMENT = "%o est un excrement"; +BBA_EXCREMENT = "%o est une merde"; BBA_HAMBURGER = "%o est un hamburger"; -BBA_SCROTUM = "%o a souffert d'une separation du scrotum"; -BBA_POPULATION = "%o s'est propose pour un controle de la population"; -BBA_SUICIDE = "%o s'est suicide"; -BBA_DARWIN = "%o a recu la medaille Darwin"; +BBA_SCROTUM = "%o a souffert d'une séparation du scrotum"; +BBA_POPULATION = "%o s'est proposé pour un controle de la population"; +BBA_SUICIDE = "%o s'est suicidé"; +BBA_DARWIN = "%o a recu la médaille Darwin"; // Chex Quest Strings CHUSTR_E1M1 = "E1M1: La piste d'atterissage"; CHUSTR_E1M2 = "E1M2: Le centre de stockage"; -CHUSTR_E1M3 = "E1M3: Les labos experimentaux"; +CHUSTR_E1M3 = "E1M3: Les labos éxperimentaux"; CHUSTR_E1M4 = "E1M4: L'Arboretum"; CHUSTR_E1M5 = "E1M5: Les cavernes de Bazoik"; CE1TEXT = "Mission accomplie.\n" "\n" - "Etes vous pret pour la prochaine mission?\n" + "Etes vous prêt pour la prochaine mission?\n" "\n" "\n" "\n" "\n" "\n" "\n" - "Pressez le bouton echap pour continuer..."; + "Appuyez sur échap pour continuer..."; CE2TEXT = "Vous l'avez fait!"; CE3TEXT = "Merveilleux travail!"; @@ -1438,91 +2517,233 @@ CE4TEXT = "Fantastique!"; //These replaced Doom2 messages CE5TEXT = "Trop fort!"; CE6TEXT = "Dans la bonne voie!"; -CE7TEXT = "merci pour l'aide!"; -CE8TEXT = "Genial!\n"; +CE7TEXT = "Merci pour l'aide!"; +CE8TEXT = "Génial!\n"; CE9TEXT = "Fabuleux!"; //The next for plutonia -CE10TEXT = "joliment travaille!"; +CE10TEXT = "Joliment fait!"; CE11TEXT = "Joli travail!"; -CE12TEXT = "Bien joue!"; -CE13TEXT = "mangez du Chex(R)!"; -CE14TEXT = "Etes vous pres?"; -CE15TEXT = "Etiez vous pres"; +CE12TEXT = "Bien joué!"; +CE13TEXT = "Mangez du Chex(R)!"; +CE14TEXT = "Etes vous prêt?"; +CE15TEXT = "Etiez vous prêt.."; //TNT CE16TEXT = "Il y en plus a venir..."; CE17TEXT = "Continuez le bon travail!"; -CE18TEXT = "Soyez prets!"; +CE18TEXT = "Soyez prêts!"; CE19TEXT = "Soyez fiers."; CE20TEXT = "Wow!"; -CE21TEXT = "Genial."; +CE21TEXT = "Génial!"; + +CLOADNET = "Vous ne pouvez pas charger quand\n vous êtes en ligne!\n\nappuyez sur une touche."; +$ifgame(chex) QSPROMPT = "Sauvegarde rapide sur le fichier\n\n'%s'?\n\nAppuyez sur Y ou N."; +$ifgame(chex) QLOADNET = "Vous ne pouvez pas charger quand\n vous êtes en ligne!\n\nappuyez sur une touche."; +$ifgame(chex) QLPROMPT = "Chargement rapide sur le fichier\n\n'%s'?\n\nAppuyez sur Y ou N."; +CNEWGAME = "Vous ne pouvez pas lancer une partie quand\n vous êtes en ligne!\n\nappuyez sur une touche."; + +CNIGHTMARE = "Attention, ce mode n'y va pas avec tact...\nVoulez-vous continuer?\n\nAppuyez sur Y ou N."; + +CSWSTRING = "Ceci est Chex(R) Quest. Attendez-vous\n\nà de futur niveaux sur www.chexquest.com.\n\nappuyez sur une touche."; + +$ifgame(chex) NETEND = "Vous ne pouvez pas arrêter la partie quand\n vous êtes en ligne!\n\nappuyez sur une touche."; +$ifgame(chex) ENDGAME = "Finir la partie?\n\nAppuyez sur Y ou N."; CC_FLEMOIDUSCOMMONUS = "FLEMOIDUS COMMONUS"; CC_FLEMOIDUSBIPEDICUS = "FLEMOIDUS BIPEDICUS"; CC_FLEMOIDUSBIPEDICUSWITHARMOR = "FLEMOIDUS BIPEDICUS AVEC ARMURE"; CC_THEFLEMBRANE = "LA FLEMBRANE"; -CLOADNET = "vous ne pouvez pas charger lors d'une quete reseau!\n\npressez un bouton."; -$ifgame(chex) QSPROMPT = "sauvergarde rapide par dessus la denome quete\n\n'%s'?\n\npressez y or n."; -$ifgame(chex) QLOADNET = "vous ne pouvez pas charger rapidement lors d'une quete reseau!!\n\npressez un bouton."; -$ifgame(chex) QLPROMPT = "voulez charger rapidement la denome quete\n\n'%s'?\n\npressez y or n."; -CNEWGAME = "vous ne pouvez pas commencer une nouvelle quete\nlors d'une quete reseau.\n\pressez un bouton."; - -CNIGHTMARE = "Atention, ca va etre dur.\nVoulez vous continuer?\n\npressez y or n."; - -CSWSTRING = "Ceci est la quete de Chex(R). a la recherche de\n\nfutures niveau at www.chexquest.com.\n\npressez un bouton."; - -$ifgame(chex) NETEND = "vous ne pouvez pas interompre une quete internet!\n\npressez un bouton."; -$ifgame(chex) ENDGAME = "etes vous sure de vouloir interompre la quete?\n\npressez y or n."; - GOTCHEXARMOR = "Vous avez pris l'armure Chex(R)."; GOTSUPERCHEXARMOR = "Vous avez pris la super armure Chex(R)!"; GOTWATER = "Vous avez pris un verre d'eau."; -GOTREPELLENT = "Vous avez pris de la chaux repulsive."; -GOTBREAKFAST = "Petit-dejeuner supercharge!"; -GOTCBLUEKEY = "Vous avez pris une cle bleue."; -GOTCYELLOWKEY = "Vous avez pris une cle jaune."; -GOTCREDKEY = "Vous avez pris une cle rouge."; +GOTREPELLENT = "Vous avez pris de la chaux répulsive."; +GOTBREAKFAST = "Petit-déjeuner superchargé!"; +GOTCBLUEKEY = "Vous avez pris une clé bleue."; +GOTCYELLOWKEY = "Vous avez pris une clé jaune."; +GOTCREDKEY = "Vous avez pris une clé rouge."; GOTFRUIT = "Vous avez pris un bol de fruits."; -GOTVEGETABLESNEED = "Les legumes sont VRAIMENT bon pour vous!"; -GOTVEGETABLES = "Vous avez pris un bol de legumes."; -GOTSLIMESUIT = "Combinaison pare-geleevisqueuse"; -GOTCHEXMAP = "Vous avez trouve une carte de la zone electronique"; +GOTVEGETABLESNEED = "Les légumes sont VRAIMENT bons pour vous!"; +GOTVEGETABLES = "Vous avez pris un bol de légumes."; +GOTSLIMESUIT = "Combinaison pare-gelée"; +GOTCHEXMAP = "Vous avez trouve une carte informatique de la zone."; GOTZORCHRECHARGE = "Vous avez pris une mini recharge zorch."; -GOTMINIZORCHPACK = "Vous avez pris un mini paquet zorch."; +GOTMINIZORCHPACK = "Vous avez pris un pack de mini recharges zorch."; GOTPROPULSORPACK = "Vous avez pris un paquet propulseur zorch."; -GOTPHASINGZORCHERRECHARGE = "Vous avez pris une recharge zorcheur phasant"; -GOTPHASINGZORCHERPACK = "Vous avez pris un paquet zorcheur phasant."; -GOTLARGEZORCHERRECHARGE = "Vous avez pris une grande recharge zorcheur."; -GOTLARGEZORCHERPACK = "Vous avez pris un grand paquet zorcheur."; +GOTPHASINGZORCHERRECHARGE = "Vous avez pris une recharge zorch phasée."; +GOTPHASINGZORCHERPACK = "Vous avez pris un pack de recharges zorch phasée."; +GOTLARGEZORCHERRECHARGE = "Vous avez pris une recharge pour zorcheur large."; +GOTLARGEZORCHERPACK = "Vous avez pris un pack de recharges pour zorcheur large."; GOTZORCHPACK = "Vous avez pris un zorchpak!"; -GOTLAZDEVICE = "Vous avez pris l'ustensil LAZ! woot!"; +GOTLAZDEVICE = "Vous avez pris l'Outil ZZL! Wahou!"; GOTRAPIDZORCHER = "Vous avez pris le Zorcheur Rapide!"; -GOTSUPERBOOTSPORK = "Vous avez pris le Super Bootspork!"; +GOTSUPERBOOTSPORK = "Vous avez pris la Super Fourchette!"; GOTZORCHPROPULSOR = "Vous avez pris le Propulseur Zorch!"; -GOTPHASINGZORCHER = "Vous avez pris le Zorcheur phasant!"; -GOTSUPERLARGEZORCHER = "Vous avez pris le mega Zorcheur!"; +GOTPHASINGZORCHER = "Vous avez pris le Zorcheur phasé!"; +GOTLARGEZORCHER = "Vous avez pris le Zorcheur Large!"; +GOTSUPERLARGEZORCHER = "Vous avez pris le méga Zorcheur!"; +GOTMINIZORCHER = "Vous avez pris le Mini Zorcheur."; -$ifgame(chex) STSTR_DQDON = "Mode invincible ALLUME"; -$ifgame(chex) STSTR_DQDOFF = "Mode invincible ETEINT"; -$ifgame(chex) STSTR_FAADDED = "Zorch Ajoute"; -$ifgame(chex) STSTR_KFAADDED = "Super Zorch Ajoute"; +$ifgame(chex) STSTR_DQDON = "Mode invincible ON"; +$ifgame(chex) STSTR_DQDOFF = "Mode invincible OFF"; +$ifgame(chex) STSTR_FAADDED = "Zorch Ajouté"; +$ifgame(chex) STSTR_KFAADDED = "Super Zorch Ajouté"; $ifgame(chex) STSTR_CHOPPERS = "... Mangez du Chex(R)!"; -OB_COMMONUS = "%o a ete gelifie par un flemoid."; -OB_BIPEDICUS = "%o a ete gelifie par un bipedicus."; -OB_BIPEDICUS2 = "%o a ete gelifie par un bipedicus en armure."; -OB_CYCLOPTIS = "%o a ete gelifie par un cycloptis."; -OB_FLEMBRANE = "%o a ete defait par la Flembrane."; +OB_COMMONUS = "%o à été gélifié par un flemoid."; +OB_BIPEDICUS = "%o à été gélifié par un bipedicus."; +OB_BIPEDICUS2 = "%o à été gélifié par un bipedicus en armure."; +OB_CYCLOPTIS = "%o à été gélifié par un cycloptis."; +OB_FLEMBRANE = "%o à été battu par la Flembrane."; -OB_MPSPOON = "%o a ete nourri a la petite cuilliere par %k."; -OB_MPBOOTSPORK = "%o a ete melange minutieusement par le bootspork de %k."; -OB_MPZORCH = "%o a ete zorche par %k."; -OB_MPMEGAZORCH = "%o a ete frappe par le mega zorcheur de %k."; -OB_MPRAPIDZORCH = "%o a ete zorche rapidement par %k."; -OB_MPPROPULSOR = "%o a ete zorche par le propulseur de %k."; -OB_MPP_SPLASH = "%o a ete frape par le propulseur de %k."; -OB_MPPHASEZORCH = "%o a ete phase zorche par %k."; -OB_MPLAZ_BOOM = "%o est tombe en proie a l'ustensil LAZ %k."; -OB_MPLAZ_SPLASH = "%o a ete lazze par %k."; +OB_MPSPOON = "%o à été nourri a la petite cuillière par %k."; +OB_MPBOOTSPORK = "%o à été mélange minutieusement par la Super Fourchette de %k."; +OB_MPZORCH = "%o à été zorché par %k."; +OB_MPMEGAZORCH = "%o à été frappé par le mega zorcheur de %k."; +OB_MPRAPIDZORCH = "%o à été zorché rapidement par %k."; +OB_MPPROPULSOR = "%o à été zorché par le propulseur de %k."; +OB_MPP_SPLASH = "%o à été frappé par le propulseur de %k."; +OB_MPPHASEZORCH = "%o à été phasé par %k."; +OB_MPLAZ_BOOM = "%o est devenu la proie de l'ustensil ZZL %k."; +OB_MPLAZ_SPLASH = "%o à été pris par le ZZL de %k."; + +// GZDoom exclusive: + +DSPLYMNU_GLOPT = "Moteur de Rendu OpenGL"; +DSPLYMNU_SWOPT = "Moteur de Rendu Software"; +DSPLYMNU_GAMMA = "Correction Gamma"; +DSPLYMNU_CONTRAST = "Contraste"; +DSPLYMNU_HWGAMMA = "Gamma moniteur"; + +// OpenGL Options +GLMNU_TITLE = "OPTIONS OPENGL"; +GLMNU_DYNLIGHT = "Options Lumières Dynamiques"; +GLMNU_TEXOPT = "Options Textures"; +GLMNU_PREFS = "Préférences"; + +// Texture Options +GLTEXMNU_TITLE = "OPTIONS TEXTURE"; +GLTEXMNU_TEXENABLED = "Textures activées"; +GLTEXMNU_TEXFILTER = "Mode de Filtrage Texture"; +GLTEXMNU_ANISOTROPIC = "Filtre Anisotropique"; +GLTEXMNU_TEXFORMAT = "Format Texture"; +GLTEXMNU_ENABLEHIRES = "Activer Textures haute résolution"; +GLTEXMNU_HQRESIZE = "Mise à l'échelle haute résolution"; +GLTEXMNU_RESIZETEX = "Mise à l'échelle textures"; +GLTEXMNU_RESIZESPR = "Mise à l'échelle sprites"; +GLTEXMNU_RESIZEFNT = "Mise à l'échelle texte"; +GLTEXMNU_PRECACHETEX = "Mise en cache des textures"; +GLTEXMNU_TRIMSPREDGE = "Nettoyer le bord des sprites"; +GLTEXMNU_SORTDRAWLIST = "Ordonner liste de rendu par texture"; + +// Dynamic Light Options +GLLIGHTMNU_TITLE = "LUMIERES DYNAMIQUES"; +GLLIGHTMNU_LIGHTSENABLED = "Lumières Dynamiques (OpenGL)"; +GLLIGHTMNU_LIGHTDEFS = "Activer les définitions GLDEFS"; +GLLIGHTMNU_CLIPLIGHTS = "Limiter taille des lumières"; +GLLIGHTMNU_LIGHTSPRITES = "Lumières affectent les sprites"; +GLLIGHTMNU_LIGHTPARTICLES = "Lumières affectent les particules"; +GLLIGHTMNU_LIGHTSHADOWMAP = "Shadowmaps"; +GLLIGHTMNU_LIGHTSHADOWMAPQUALITY = "Qualité Shadowmap"; + +// OpenGL Preferences +GLPREFMNU_TITLE = "Préférences OpenGL"; +GLPREFMNU_SECLIGHTMODE = "Mode de lumière Secteur"; +GLPREFMNU_FOGMODE = "Mode du broullard"; +GLPREFMNU_FOGFORCEFULLBRIGHT = "Brouillard force fullbright"; +GLPREFMNU_WPNLIGHTSTR = "Intensité lumineuse des armes"; +GLPREFMNU_ENVIRONMENTMAPMIRROR = "Mappage environment sur les miroirs"; +GLPREFMNU_ENV = "Mode de vision nocture amélioré"; +GLPREFMNU_ENVSTEALTH = "VNA affiche monstres invisibles"; +GLPREFMNU_SPRBRIGHTFOG = "Forcer luminosité dans brouillard"; +GLPREFMNU_SPRCLIP = "Adjusted le clipping des sprites"; +GLPREFMNU_SPRBLEND = "Adoucir bords des sprites"; +GLPREFMNU_FUZZSTYLE = "Style de bruit blanc"; +GLPREFMNU_SPRBILLBOARD = "Etalage des sprites"; +GLPREFMNU_SPRBILLFACECAMERA = "Sprites font face à la caméra"; +GLPREFMNU_PARTICLESTYLE = "Style de particules"; +GLPREFMNU_AMBLIGHT = "Niveau de lumière ambiente"; +GLPREFMNU_RENDERQUALITY = "Qualité du rendu"; +GLPREFMNU_MENUBLUR = "Flou menu"; +GLPREFMNU_VRMODE = "3D VR Stéréo"; +GLPREFMNU_VRQUADSTEREO = "Activer Quad Stereo"; +GLPREFMNU_TONEMAP = "Mode Tonemap"; +GLPREFMNU_BLOOM = "Effet surbrillance"; +GLPREFMNU_LENS = "Effet distorsion de lentille"; +GLPREFMNU_SSAO = "Qualité Occlusion Ambiente"; +GLPREFMNU_SSAO_PORTALS = "OA pour les portails"; +GLPREFMNU_FXAA = "Qualité FXAA"; +GLPREFMNU_PALTONEMAPORDER = "Ordre des palettes tonemap"; +GLPREFMNU_PALTONEMAPPOWER = "Exponent des palettes tonemap"; +GLPREFMNU_SWLMBANDED = "Lumière bandées en Software"; + +// Option Values +OPTVAL_SMART = "Intelligent"; +OPTVAL_SMARTER = "+ Intelligent"; +OPTVAL_INFRAREDONLY = "Vis. Noct. Seulement"; +OPTVAL_INFRAREDANDTORCH = "Iis Noct. & Torche"; +OPTVAL_ANYFIXEDCOLORMAP = "N'importe quelle colormap"; +OPTVAL_NONENEARESTMIPMAP = "Aucun (mipmap proche voisin)"; +OPTVAL_NONELINEARMIPMAP = "Aucun (mipmap linéaire)"; +OPTVAL_NONETRILINEAR = "Aucun (mipmap trilinéaire)"; +OPTVAL_BILINEAR = "Bilinéaire"; +OPTVAL_TRILINEAR = "Trilinéaire"; +OPTVAL_USEASPALETTE = "Utiliser comme pallette"; +OPTVAL_BLEND = "Mélanger"; +OPTVAL_BRIGHT = "Clair"; +OPTVAL_DARK = "Sombre"; +OPTVAL_SPEED = "Vitesse"; +OPTVAL_QUALITY = "Qualité"; +OPTVAL_OPTIMAL = "Optimiser"; +OPTVAL_YAXIS = "Axe Y"; +OPTVAL_XYAXIS = "Axes X/Y"; +OPTVAL_SQUARE = "Carrées"; +OPTVAL_ROUND = "Rondes"; +OPTVAL_PIXELFUZZ = "Bruit Pixélisé"; +OPTVAL_SMOOTHFUZZ = "Bruit doux"; +OPTVAL_SWIRLYFUZZ = "Bruit marbré"; +OPTVAL_TRANSLUCENTFUZZ = "Bruit transparent"; +OPTVAL_NOISE = "Neige"; +OPTVAL_SMOOTHNOISE = "Neige adoucie"; +OPTVAL_JAGGEDFUZZ = "Neige rugeuse"; +OPTVAL_GREENMAGENTA = "Vert/Magenta"; +OPTVAL_REDCYAN = "Rouge/Bleu"; +OPTVAL_AMBERBLUE = "Ambre/Bleu"; +OPTVAL_LEFTEYE = "Oeil Gauche"; +OPTVAL_RIGHTEYE = "Oeil Droit"; +OPTVAL_SBSFULL = "Côte-â-côte Complet"; +OPTVAL_SBSNARROW = "Côte-â-côte étroit"; +OPTVAL_TOPBOTTOM = "Dessus/Dessous"; +OPTVAL_ROWINTERLEAVED = "Entrelacement rangée"; +OPTVAL_COLUMNINTERLEAVED = "Entralcement colonne"; +OPTVAL_CHECKERBOARD = "Damier"; +OPTVAL_QUADBUFFERED = "Quadruple-tampon"; +OPTVAL_LOW = "Bas"; +OPTVAL_MEDIUM = "Moyen"; +OPTVAL_HIGH = "Haut"; +OPTVAL_EXTREME = "Extrême"; +OPTVAL_REVERSEFIRST = "Inverse"; + +// QZDoom exclusive: + +DSPLYMNU_TCOPT = "Options TrueColor"; + +TCMNU_TITLE = "OPTIONS TRUECOLOR"; + + +TCMNU_TRUECOLOR = "Sortie Truecolor"; +TCMNU_MINFILTER = "Filtrage linéaire en réduction"; +TCMNU_MAGFILTER = "Filtrage linéaire en agrandissement"; +TCMNU_MIPMAP = "Utiliser textures mipmappées"; +TCMNU_DYNLIGHTS = "Lumières Dynamiques (Software)"; + +// SVE strings: + +TAG_TALISMANRED = "Talisman Rouge"; +TAG_TALISMANGREEN = "Talisman Vert"; +TAG_TALISMANBLUE = "Talisman Bleu"; +MSG_TALISMANRED = "Vous avez un pressentiment qu'il ne fallait pas y toucher....."; +MSG_TALISMANGREEN = "Quel que soit cette chose, elle ne devrait pas être ici..."; +MSG_TALISMANBLUE = "Ca doit servir a quelque chose..."; +MSG_TALISMANPOWER = "Vous avez une puissance inégalée!"; diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 43c86b7124..e28b6f2aa2 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -1874,10 +1874,17 @@ OptionMenu VideoModeMenu protected Title "$VIDMNU_TITLE" Option "$VIDMNU_FULLSCREEN", "fullscreen", "YesNo" + IfOption(Mac) { Option "$VIDMNU_HIDPI", "vid_hidpi", "YesNo" } + + IfOption(Windows) + { + Option "$VIDMNU_BRDLSS", "win_borderless", "YesNo" + } + Option "$VIDMNU_ASPECTRATIO", "menu_screenratios", "Ratios" Option "$VIDMNU_FORCEASPECT", "vid_aspect", "ForceRatios" Option "$VIDMNU_CROPASPECT", "vid_cropaspect", "CropAspect" From 9c189e5d4b659e7550fe637db778bc3a3fd1ba82 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 9 Jan 2018 15:30:45 -0500 Subject: [PATCH 093/110] - expose a monster's 'friendlyseeblocks' to UDMF --- src/doomdata.h | 1 + src/namedef.h | 1 + src/p_mobj.cpp | 1 + src/p_setup.cpp | 1 + src/p_udmf.cpp | 5 +++++ 5 files changed, 9 insertions(+) diff --git a/src/doomdata.h b/src/doomdata.h index 5f681fa76e..ce9939d682 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -371,6 +371,7 @@ struct FMapThing int16_t roll; uint32_t RenderStyle; int FloatbobPhase; + int friendlyseeblocks; }; diff --git a/src/namedef.h b/src/namedef.h index 054c53e492..ace456a691 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -502,6 +502,7 @@ xx(Roll) xx(Scale) xx(ScaleX) xx(ScaleY) +xx(FriendlySeeBlocks) xx(Floatbobphase) xx(Floatbobstrength) xx(Target) diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 03f1e47508..5398971b9d 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -6029,6 +6029,7 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position) mobj->SpawnPoint = mthing->pos; mobj->SpawnAngle = mthing->angle; mobj->SpawnFlags = mthing->flags; + mobj->friendlyseeblocks = mthing->friendlyseeblocks; if (mthing->FloatbobPhase >= 0 && mthing->FloatbobPhase < 64) mobj->FloatBobPhase = mthing->FloatbobPhase; if (mthing->Gravity < 0) mobj->Gravity = -mthing->Gravity; else if (mthing->Gravity > 0) mobj->Gravity *= mthing->Gravity; diff --git a/src/p_setup.cpp b/src/p_setup.cpp index a0d0f1842b..f7db67c2ec 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -1831,6 +1831,7 @@ void P_LoadThings2 (MapData * map) mti[i].Alpha = -1; mti[i].Health = 1; mti[i].FloatbobPhase = -1; + mti[i].friendlyseeblocks = 10; } delete[] mtp; } diff --git a/src/p_udmf.cpp b/src/p_udmf.cpp index 24257dbcd0..0f3eb58757 100644 --- a/src/p_udmf.cpp +++ b/src/p_udmf.cpp @@ -799,6 +799,11 @@ public: th->Scale.X = th->Scale.Y = CheckFloat(key); break; + case NAME_FriendlySeeBlocks: + CHECK_N(Zd | Zdt) + th->friendlyseeblocks = CheckInt(key); + break; + default: CHECK_N(Zd | Zdt) if (0 == strnicmp("user_", key.GetChars(), 5)) From ee9736fbb3ca52723c0a38f09cdef67eb72f1b7a Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 9 Jan 2018 15:48:19 -0500 Subject: [PATCH 094/110] - print out FriendlySeeBlocks on 'info' ccmd - not setting FriendlySeeBlocks on UDMF now causes the actor to use its ZScript default --- src/p_mobj.cpp | 4 +++- src/p_setup.cpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 5398971b9d..2c05874ab9 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -6029,7 +6029,8 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position) mobj->SpawnPoint = mthing->pos; mobj->SpawnAngle = mthing->angle; mobj->SpawnFlags = mthing->flags; - mobj->friendlyseeblocks = mthing->friendlyseeblocks; + if (mthing->friendlyseeblocks > 0) + mobj->friendlyseeblocks = mthing->friendlyseeblocks; if (mthing->FloatbobPhase >= 0 && mthing->FloatbobPhase < 64) mobj->FloatBobPhase = mthing->FloatbobPhase; if (mthing->Gravity < 0) mobj->Gravity = -mthing->Gravity; else if (mthing->Gravity > 0) mobj->Gravity *= mthing->Gravity; @@ -8466,5 +8467,6 @@ void PrintMiscActorInfo(AActor *query) Printf("\nSpeed= %f, velocity= x:%f, y:%f, z:%f, combined:%f.\n", query->Speed, query->Vel.X, query->Vel.Y, query->Vel.Z, query->Vel.Length()); Printf("Scale: x:%f, y:%f\n", query->Scale.X, query->Scale.Y); + Printf("FriendlySeeBlocks: %d\n", query->friendlyseeblocks); } } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index f7db67c2ec..937f77fa8c 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -1831,7 +1831,7 @@ void P_LoadThings2 (MapData * map) mti[i].Alpha = -1; mti[i].Health = 1; mti[i].FloatbobPhase = -1; - mti[i].friendlyseeblocks = 10; + mti[i].friendlyseeblocks = -1; } delete[] mtp; } From 337bbfc88c358840a43a445567169bad21649ac4 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 12 Jan 2018 10:51:14 +0200 Subject: [PATCH 095/110] Custom submenus are no longer removed from altered protected menu https://forum.zdoom.org/viewtopic.php?t=59081 --- src/menu/menudef.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/menu/menudef.cpp b/src/menu/menudef.cpp index de9c8bc92d..39be1eea93 100644 --- a/src/menu/menudef.cpp +++ b/src/menu/menudef.cpp @@ -542,7 +542,7 @@ static bool FindMatchingItem(DMenuItemBase *desc) { // Check for presence of menu auto menu = MenuDescriptors.CheckKey(name); - if (menu == nullptr) return true; + if (menu == nullptr) return false; } else if (grp == 4) { From d9ddd50c987ed874000862b429a75e4aeca79488 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 12 Jan 2018 18:27:19 +0200 Subject: [PATCH 096/110] Disabled interpolation point "thinking" https://forum.zdoom.org/viewtopic.php?t=59087 --- wadsrc/static/zscript/shared/movingcamera.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wadsrc/static/zscript/shared/movingcamera.txt b/wadsrc/static/zscript/shared/movingcamera.txt index 6ed206d4b1..2bce936086 100644 --- a/wadsrc/static/zscript/shared/movingcamera.txt +++ b/wadsrc/static/zscript/shared/movingcamera.txt @@ -62,6 +62,8 @@ class InterpolationPoint : Actor Next = null; } + override void Tick () {} // Nodes do no thinking + void FormChain () { let me = self; From d95ac933761bdd5e95637931369422d07257c45d Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 13 Jan 2018 12:41:19 +0200 Subject: [PATCH 097/110] Fixed crash when resolving multipatches with missing textures https://forum.zdoom.org/viewtopic.php?t=59088 --- src/textures/multipatchtexture.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/textures/multipatchtexture.cpp b/src/textures/multipatchtexture.cpp index a765d2d417..f6b3f3302b 100644 --- a/src/textures/multipatchtexture.cpp +++ b/src/textures/multipatchtexture.cpp @@ -1369,7 +1369,7 @@ void FMultiPatchTexture::ResolvePatches() { if (Parts[i].Texture == nullptr) { - memcpy(&Parts[i], &Parts[i + 1], NumParts - i - 1); + memcpy(&Parts[i], &Parts[i + 1], (NumParts - i - 1) * sizeof(TexPart)); i--; NumParts--; } From 9b52c18ef6139f19d26151114bbbbb059f12c2c1 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 13 Jan 2018 12:44:23 +0200 Subject: [PATCH 098/110] Improved layout of FMultiPatchTexture::TexPart structure Removed "gaps" between members (for 64-bit targets) and initialized them in place --- src/textures/multipatchtexture.cpp | 34 +++++++----------------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/src/textures/multipatchtexture.cpp b/src/textures/multipatchtexture.cpp index f6b3f3302b..46b652e297 100644 --- a/src/textures/multipatchtexture.cpp +++ b/src/textures/multipatchtexture.cpp @@ -175,15 +175,14 @@ protected: struct TexPart { - int16_t OriginX, OriginY; - uint8_t Rotate; - uint8_t op; - FRemapTable *Translation; - PalEntry Blend; - FTexture *Texture; - blend_t Alpha; - - TexPart(); + FRemapTable *Translation = nullptr; + FTexture *Texture = nullptr; + PalEntry Blend = 0; + blend_t Alpha = FRACUNIT; + int16_t OriginX = 0; + int16_t OriginY = 0; + uint8_t Rotate = 0; + uint8_t op = OP_COPY; }; struct TexInit @@ -797,23 +796,6 @@ FTexture *FMultiPatchTexture::GetRawTexture() return NumParts == 1 ? Parts->Texture : this; } -//========================================================================== -// -// FMultiPatchTexture :: TexPart :: TexPart -// -//========================================================================== - -FMultiPatchTexture::TexPart::TexPart() -{ - OriginX = OriginY = 0; - Rotate = 0; - Texture = NULL; - Translation = NULL; - Blend = 0; - Alpha = FRACUNIT; - op = OP_COPY; -} - //========================================================================== // // FTextureManager :: AddTexturesLump From 23c50540f65f452f381b6a5e89bf30d95826562a Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 13 Jan 2018 13:13:38 +0200 Subject: [PATCH 099/110] Added missing fields to StrifeDialogueNode ZScript definition https://forum.zdoom.org/viewtopic.php?t=59091 --- wadsrc/static/zscript/menu/conversationmenu.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wadsrc/static/zscript/menu/conversationmenu.txt b/wadsrc/static/zscript/menu/conversationmenu.txt index abda3dee28..8d05ee4baa 100644 --- a/wadsrc/static/zscript/menu/conversationmenu.txt +++ b/wadsrc/static/zscript/menu/conversationmenu.txt @@ -46,6 +46,8 @@ struct StrifeDialogueNode native version("2.4") native String Goodbye; native StrifeDialogueReply Children; + native Name MenuClassName; + native String UserData; } // FStrifeDialogueReply holds responses the player can give to the NPC From 72f181be080b616e8321544beda439fcb0ed8695 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 14 Jan 2018 10:04:13 +0200 Subject: [PATCH 100/110] Revert "Added partial bounds check for instruction pointer in ACS VM" This reverts commit 83cd53c9b1c52498d62fb6d501396ff782037c70. --- src/p_acs.cpp | 45 +++++++++++++++------------------------------ 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 19f9de486d..7ef6f56839 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -761,35 +761,6 @@ protected: private: DLevelScript(); - int getbyte(int *&pc) - { - CheckInstructionPointer(pc); - - int res = *(uint8_t *)pc; - pc = (int *)((uint8_t *)pc+1); - return res; - } - - int getshort(int *&pc) - { - CheckInstructionPointer(pc); - - int res = LittleShort( *(int16_t *)pc); - pc = (int *)((uint8_t *)pc+2); - return res; - } - - void CheckInstructionPointer(int *pc) const - { - const uint32_t offset = activeBehavior->PC2Ofs(pc); - const uint32_t size = activeBehavior->GetDataSize(); - - if (offset >= size) - { - I_Error("Out of bounds instruction pointer in ACS VM"); - } - } - friend class DACSThinker; }; @@ -6925,7 +6896,7 @@ enum }; -#define NEXTWORD (CheckInstructionPointer(pc), LittleLong(*pc++)) +#define NEXTWORD (LittleLong(*pc++)) #define NEXTBYTE (fmt==ACS_LittleEnhanced?getbyte(pc):NEXTWORD) #define NEXTSHORT (fmt==ACS_LittleEnhanced?getshort(pc):NEXTWORD) #define STACK(a) (Stack[sp - (a)]) @@ -6933,6 +6904,20 @@ enum // Direct instructions that take strings need to have the tag applied. #define TAGSTR(a) (a|activeBehavior->GetLibraryID()) +inline int getbyte (int *&pc) +{ + int res = *(uint8_t *)pc; + pc = (int *)((uint8_t *)pc+1); + return res; +} + +inline int getshort (int *&pc) +{ + int res = LittleShort( *(int16_t *)pc); + pc = (int *)((uint8_t *)pc+2); + return res; +} + static bool CharArrayParms(int &capacity, int &offset, int &a, FACSStackMemory& Stack, int &sp, bool ranged) { if (ranged) From 09e2326c632c472830c3978b9bd221e2c844af07 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 14 Jan 2018 10:12:00 +0200 Subject: [PATCH 101/110] Use dummy uallong() function for all Intel targets 64-bit Intel targets built with GCC/Clang were using strict memory alignment version of this function --- src/p_acs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 7ef6f56839..eccfb48af4 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -815,7 +815,7 @@ TArray ACS_StringBuilderStack; // //============================================================================ -#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) +#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__x86_64__) inline int uallong(const int &foo) { return foo; From f28914d1b6f94197f94105eb9a2fd7c87b860827 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 14 Jan 2018 11:29:45 +0200 Subject: [PATCH 102/110] Simplified handling of command line arguments in Cocoa backend Empty arguments are no longer ignored --- src/posix/cocoa/i_main.mm | 57 +++++++++++-------------------- src/posix/osx/iwadpicker_cocoa.mm | 1 - 2 files changed, 19 insertions(+), 39 deletions(-) diff --git a/src/posix/cocoa/i_main.mm b/src/posix/cocoa/i_main.mm index 5d30341b4e..f5c49eaafb 100644 --- a/src/posix/cocoa/i_main.mm +++ b/src/posix/cocoa/i_main.mm @@ -226,14 +226,7 @@ void OriginalMainTry(int argc, char** argv) namespace { -const int ARGC_MAX = 64; - -int s_argc; -char* s_argv[ARGC_MAX]; - -TArray s_argvStorage; - -bool s_restartedFromWADPicker; +TArray s_argv; void NewFailure() @@ -348,7 +341,17 @@ ApplicationController* appCtrl; FConsoleWindow::CreateInstance(); atterm(FConsoleWindow::DeleteInstance); - exit(OriginalMain(s_argc, s_argv)); + const size_t argc = s_argv.Size(); + TArray argv(argc + 1, true); + + for (size_t i = 0; i < argc; ++i) + { + argv[i] = s_argv[i].LockBuffer(); + } + + argv[argc] = nullptr; + + exit(OriginalMain(argc, &argv[0])); } @@ -356,20 +359,13 @@ ApplicationController* appCtrl; { ZD_UNUSED(theApplication); - if (s_restartedFromWADPicker - || 0 == [filename length] - || s_argc + 2 >= ARGC_MAX) - { - return FALSE; - } - // Some parameters from command line are passed to this function // These parameters need to be skipped to avoid duplication // Note: SDL has different approach to fix this issue, see the same method in SDLMain.m const char* const charFileName = [filename UTF8String]; - for (int i = 0; i < s_argc; ++i) + for (size_t i = 0, count = s_argv.Size(); i < count; ++i) { if (0 == strcmp(s_argv[i], charFileName)) { @@ -377,11 +373,8 @@ ApplicationController* appCtrl; } } - s_argvStorage.Push("-file"); - s_argv[s_argc++] = s_argvStorage.Last().LockBuffer(); - - s_argvStorage.Push([filename UTF8String]); - s_argv[s_argc++] = s_argvStorage.Last().LockBuffer(); + s_argv.Push("-file"); + s_argv.Push([filename UTF8String]); return TRUE; } @@ -539,21 +532,12 @@ void ReleaseApplicationController() int main(int argc, char** argv) { - for (int i = 0; i <= argc; ++i) + for (int i = 0; i < argc; ++i) { const char* const argument = argv[i]; - if (NULL == argument || '\0' == argument[0]) - { - continue; - } - - if (0 == strcmp(argument, "-wad_picker_restart")) - { - s_restartedFromWADPicker = true; - } #if _DEBUG - else if (0 == strcmp(argument, "-wait_for_debugger")) + if (0 == strcmp(argument, "-wait_for_debugger")) { NSAlert* alert = [[NSAlert alloc] init]; [alert setMessageText:@GAMENAME]; @@ -562,11 +546,8 @@ int main(int argc, char** argv) [alert runModal]; } #endif // _DEBUG - else - { - s_argvStorage.Push(argument); - s_argv[s_argc++] = s_argvStorage.Last().LockBuffer(); - } + + s_argv.Push(argument); } NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; diff --git a/src/posix/osx/iwadpicker_cocoa.mm b/src/posix/osx/iwadpicker_cocoa.mm index 6b8a10b6a7..2d8b2057c4 100644 --- a/src/posix/osx/iwadpicker_cocoa.mm +++ b/src/posix/osx/iwadpicker_cocoa.mm @@ -418,7 +418,6 @@ static void RestartWithParameters(const WadStuff& wad, NSString* parameters) executablePath = @"/usr/bin/arch"; } - [arguments addObject:@"-wad_picker_restart"]; [arguments addObject:@"-iwad"]; [arguments addObject:[NSString stringWithUTF8String:wad.Path]]; From 13c4e58c3dc5794bab149d1919f5fdbe18324b2c Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 14 Jan 2018 10:47:46 +0100 Subject: [PATCH 103/110] - simplified IgnoreMIDIVolume. The XP related check had already been deactivated but not removed. --- .../mididevices/music_win_mididevice.cpp | 29 +------------------ 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/src/sound/mididevices/music_win_mididevice.cpp b/src/sound/mididevices/music_win_mididevice.cpp index d794c7df38..d75a20de28 100644 --- a/src/sound/mididevices/music_win_mididevice.cpp +++ b/src/sound/mididevices/music_win_mididevice.cpp @@ -649,18 +649,11 @@ void CALLBACK WinMIDIDevice::CallbackFunc(HMIDIOUT hOut, UINT uMsg, DWORD_PTR dw // are done by sending MIDI channel volume messages to the stream, not // through midiOutSetVolume().) // -// This is using VC++'s __uuidof extension instead of the the CLSID_ and -// IID_ definitions because I couldn't figure out why it wasn't finding them -// when linking, and __uuidof circumvents that problem. I'd also be -// surprised if w32api includes any WASAPI stuff any time soon, so it's no -// big loss making this VC++-specific for the time being -// //========================================================================== static bool IgnoreMIDIVolume(UINT id) { MIDIOUTCAPS caps; - bool mustcheck = false; if (MMSYSERR_NOERROR == midiOutGetDevCaps(id, &caps, sizeof(caps))) { @@ -668,7 +661,7 @@ static bool IgnoreMIDIVolume(UINT id) { // We cannot determine what this is so we have to assume the worst, as the default // devive's volume control is irreparably broken. - mustcheck = true; + return true; } // The Microsoft GS Wavetable Synth advertises itself as MIDIDEV_SWSYNTH with a VOLUME control. // If the one we're using doesn't match that, we don't need to bother checking the name. @@ -676,28 +669,8 @@ static bool IgnoreMIDIVolume(UINT id) { if (strncmp(caps.szPname, "Microsoft GS", 12) == 0) { - mustcheck = true; - } - } - if (mustcheck) - { -#ifndef __GNUC__ - IMMDeviceEnumerator *enumerator; - - // Now try to create an IMMDeviceEnumerator interface. If it succeeds, - // we know we're using the new audio stack introduced with Vista and - // should ignore this MIDI device's volume control. - if (SUCCEEDED(CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_ALL, - __uuidof(IMMDeviceEnumerator), (void**)&enumerator)) - && enumerator != nullptr) - { - enumerator->Release(); return true; } -#else - // assume the worst and consider volume control broken. - return true; -#endif } } return false; From 56f656516d8ed10c15403cfe4dd2b130c551ba41 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Tue, 16 Jan 2018 11:00:48 +0200 Subject: [PATCH 104/110] Fixed rare crash when menu is closed from Ticker() function https://forum.zdoom.org/viewtopic.php?t=59112 --- src/menu/menu.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/menu/menu.cpp b/src/menu/menu.cpp index db0fd2efbb..86ec78abf2 100644 --- a/src/menu/menu.cpp +++ b/src/menu/menu.cpp @@ -735,7 +735,11 @@ void M_Ticker (void) if (CurrentMenu != nullptr && menuactive != MENU_Off) { CurrentMenu->CallTicker(); + } + // Check again because menu could be closed from Ticker() + if (CurrentMenu != nullptr && menuactive != MENU_Off) + { for (int i = 0; i < NUM_MKEYS; ++i) { if (MenuButtons[i].bDown) From 6d20da8ab553a75780e7844eb234e53c84d40fef Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Thu, 18 Jan 2018 11:43:32 +0200 Subject: [PATCH 105/110] Fixed nust -> must typos --- src/scripting/backend/codegen.cpp | 2 +- src/scripting/zscript/zcc_compile.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index d504282d1a..a8aa1a897f 100644 --- a/src/scripting/backend/codegen.cpp +++ b/src/scripting/backend/codegen.cpp @@ -8935,7 +8935,7 @@ FxExpression *FxVMFunctionCall::Resolve(FCompileContext& ctx) else { bool writable; - ArgList[i] = ArgList[i]->Resolve(ctx); // nust be resolved before the address is requested. + ArgList[i] = ArgList[i]->Resolve(ctx); // must be resolved before the address is requested. if (ArgList[i] != nullptr && ArgList[i]->ValueType != TypeNullPtr) { if (type == ArgList[i]->ValueType && type->isRealPointer() && type->toPointer()->PointedType->isStruct()) diff --git a/src/scripting/zscript/zcc_compile.cpp b/src/scripting/zscript/zcc_compile.cpp index 5971806058..ab8bef5f0c 100644 --- a/src/scripting/zscript/zcc_compile.cpp +++ b/src/scripting/zscript/zcc_compile.cpp @@ -1627,7 +1627,7 @@ PType *ZCCCompiler::DetermineType(PType *outertype, ZCC_TreeNode *field, FName n } else { - Error(field, "%s: Base type for dynamic array types nust be integral, but got %s", name.GetChars(), ftype->DescriptiveName()); + Error(field, "%s: Base type for dynamic array types must be integral, but got %s", name.GetChars(), ftype->DescriptiveName()); } } else From f629678320d22f70d617f09ba720726f7ba29970 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Thu, 18 Jan 2018 15:34:56 +0200 Subject: [PATCH 106/110] Fixed const correctness for secplane structure https://forum.zdoom.org/viewtopic.php?t=59151 --- src/r_defs.h | 2 +- wadsrc/static/zscript/mapdata.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/r_defs.h b/src/r_defs.h index 02da2ac0ee..6a3dfac762 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -394,7 +394,7 @@ public: } // Moves a plane up/down by hdiff units - double GetChangedHeight(double hdiff) + double GetChangedHeight(double hdiff) const { return D - hdiff * normal.Z; } diff --git a/wadsrc/static/zscript/mapdata.txt b/wadsrc/static/zscript/mapdata.txt index 8914fd4056..99134a70a6 100644 --- a/wadsrc/static/zscript/mapdata.txt +++ b/wadsrc/static/zscript/mapdata.txt @@ -184,7 +184,7 @@ struct SecPlane native play native bool isEqual(Secplane other) const; native void ChangeHeight(double hdiff); native double GetChangedHeight(double hdiff) const; - native double HeightDiff(double oldd, double newd = 0.0); + native double HeightDiff(double oldd, double newd = 0.0) const; native double PointToDist(Vector2 xy, double z) const; } From 19cf887ad12f5ab32a3b8a98b690cbc2ab347664 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 19 Jan 2018 19:48:55 +0100 Subject: [PATCH 107/110] - fixed: Dynamic arrays for object pointers need different treatment than arrays for regular pointers, because they require GC::WriteBarrier to be called. --- src/scripting/backend/dynarrays.cpp | 108 ++++++++++++++++++++++++++++ src/scripting/types.cpp | 5 +- wadsrc/static/zscript/dynarrays.txt | 19 +++++ 3 files changed, 131 insertions(+), 1 deletion(-) diff --git a/src/scripting/backend/dynarrays.cpp b/src/scripting/backend/dynarrays.cpp index c12e602a08..56331442fa 100644 --- a/src/scripting/backend/dynarrays.cpp +++ b/src/scripting/backend/dynarrays.cpp @@ -51,6 +51,7 @@ typedef TArray FDynArray_I32; typedef TArray FDynArray_F32; typedef TArray FDynArray_F64; typedef TArray FDynArray_Ptr; +typedef TArray FDynArray_Obj; typedef TArray FDynArray_String; //----------------------------------------------------- @@ -672,6 +673,112 @@ DEFINE_ACTION_FUNCTION(FDynArray_Ptr, Clear) } +//----------------------------------------------------- +// +// Object array +// +//----------------------------------------------------- + +DEFINE_ACTION_FUNCTION(FDynArray_Obj, Copy) +{ + PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); + PARAM_POINTER(other, FDynArray_Obj); + *self = *other; + return 0; +} + +DEFINE_ACTION_FUNCTION(FDynArray_Obj, Move) +{ + PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); + PARAM_POINTER(other, FDynArray_Obj); + *self = std::move(*other); + return 0; +} + +DEFINE_ACTION_FUNCTION(FDynArray_Obj, Find) +{ + PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); + PARAM_OBJECT(val, DObject); + ACTION_RETURN_INT(self->Find(val)); +} + +DEFINE_ACTION_FUNCTION(FDynArray_Obj, Push) +{ + PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); + PARAM_OBJECT(val, DObject); + GC::WriteBarrier(val); + ACTION_RETURN_INT(self->Push(val)); +} + +DEFINE_ACTION_FUNCTION(FDynArray_Obj, Pop) +{ + PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); + ACTION_RETURN_BOOL(self->Pop()); +} + +DEFINE_ACTION_FUNCTION(FDynArray_Obj, Delete) +{ + PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); + PARAM_INT(index); + PARAM_INT_DEF(count); + self->Delete(index, count); + return 0; +} + +DEFINE_ACTION_FUNCTION(FDynArray_Obj, Insert) +{ + PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); + PARAM_INT(index); + PARAM_OBJECT(val, DObject); + GC::WriteBarrier(val); + self->Insert(index, val); + return 0; +} + +DEFINE_ACTION_FUNCTION(FDynArray_Obj, ShrinkToFit) +{ + PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); + self->ShrinkToFit(); + return 0; +} + +DEFINE_ACTION_FUNCTION(FDynArray_Obj, Grow) +{ + PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); + PARAM_INT(count); + self->Grow(count); + return 0; +} + +DEFINE_ACTION_FUNCTION(FDynArray_Obj, Resize) +{ + PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); + PARAM_INT(count); + self->Resize(count); + return 0; +} + +DEFINE_ACTION_FUNCTION(FDynArray_Obj, Reserve) +{ + PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); + PARAM_INT(count); + ACTION_RETURN_INT(self->Reserve(count)); +} + +DEFINE_ACTION_FUNCTION(FDynArray_Obj, Max) +{ + PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); + ACTION_RETURN_INT(self->Max()); +} + +DEFINE_ACTION_FUNCTION(FDynArray_Obj, Clear) +{ + PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); + self->Clear(); + return 0; +} + + //----------------------------------------------------- // // String array @@ -781,4 +888,5 @@ DEFINE_FIELD_NAMED_X(DynArray_I32, FArray, Count, Size) DEFINE_FIELD_NAMED_X(DynArray_F32, FArray, Count, Size) DEFINE_FIELD_NAMED_X(DynArray_F64, FArray, Count, Size) DEFINE_FIELD_NAMED_X(DynArray_Ptr, FArray, Count, Size) +DEFINE_FIELD_NAMED_X(DynArray_Obj, FArray, Count, Size) DEFINE_FIELD_NAMED_X(DynArray_String, FArray, Count, Size) diff --git a/src/scripting/types.cpp b/src/scripting/types.cpp index 91ceb9077a..5059834d48 100644 --- a/src/scripting/types.cpp +++ b/src/scripting/types.cpp @@ -2050,7 +2050,10 @@ PDynArray *NewDynArray(PType *type) break; case REGT_POINTER: - backingname = "DynArray_Ptr"; + if (type->isObjectPointer()) + backingname = "DynArray_Obj"; + else + backingname = "DynArray_Ptr"; break; default: diff --git a/wadsrc/static/zscript/dynarrays.txt b/wadsrc/static/zscript/dynarrays.txt index 088e3cc41c..df10b70b2c 100644 --- a/wadsrc/static/zscript/dynarrays.txt +++ b/wadsrc/static/zscript/dynarrays.txt @@ -115,6 +115,25 @@ struct DynArray_Ptr native native void Clear (); } +struct DynArray_Obj native +{ + native readonly uint Size; + + native void Copy(DynArray_Obj other); + native void Move(DynArray_Obj other); + native uint Find(Object item) const; + native uint Push (Object item); + native bool Pop (); + native void Delete (uint index, int deletecount = 1); + native void Insert (uint index, Object item); + native void ShrinkToFit (); + native void Grow (uint amount); + native void Resize (uint amount); + native uint Reserve (uint amount); + native uint Max () const; + native void Clear (); +} + struct DynArray_String native { native readonly uint Size; From 2720e36a2c2298c84314092c7152c180e86cb0dc Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 20 Jan 2018 09:11:28 +0100 Subject: [PATCH 108/110] - marked a few more CCMDs unsafe. --- src/c_bind.cpp | 2 +- src/c_cmds.cpp | 2 +- src/g_game.cpp | 2 +- src/g_level.cpp | 2 +- src/sound/i_music.cpp | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/c_bind.cpp b/src/c_bind.cpp index 5098b9a95a..62d497f800 100644 --- a/src/c_bind.cpp +++ b/src/c_bind.cpp @@ -558,7 +558,7 @@ void C_UnbindAll () AutomapBindings.UnbindAll(); } -CCMD (unbindall) +UNSAFE_CCMD (unbindall) { C_UnbindAll (); } diff --git a/src/c_cmds.cpp b/src/c_cmds.cpp index e3e87595df..efc11a3d24 100644 --- a/src/c_cmds.cpp +++ b/src/c_cmds.cpp @@ -674,7 +674,7 @@ UNSAFE_CCMD (error_fatal) //========================================================================== #if !defined(_WIN32) || !defined(_DEBUG) -CCMD (crashout) +UNSAFE_CCMD (crashout) { *(volatile int *)0 = 0; } diff --git a/src/g_game.cpp b/src/g_game.cpp index 82bff3f736..0e44e83016 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -2618,7 +2618,7 @@ CCMD (playdemo) } } -CCMD (timedemo) +UNSAFE_CCMD (timedemo) { if (argv.argc() > 1) { diff --git a/src/g_level.cpp b/src/g_level.cpp index b427599f01..0b211f3e60 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -224,7 +224,7 @@ CCMD (map) // //========================================================================== -CCMD(recordmap) +UNSAFE_CCMD(recordmap) { if (netgame) { diff --git a/src/sound/i_music.cpp b/src/sound/i_music.cpp index 28f839c6c8..342fc5bf6d 100644 --- a/src/sound/i_music.cpp +++ b/src/sound/i_music.cpp @@ -708,7 +708,7 @@ ADD_STAT(music) // //========================================================================== -CCMD (writeopl) +UNSAFE_CCMD (writeopl) { if (argv.argc() == 2) { @@ -746,7 +746,7 @@ CCMD (writeopl) // //========================================================================== -CCMD (writewave) +UNSAFE_CCMD (writewave) { if (argv.argc() >= 2 && argv.argc() <= 3) { @@ -784,7 +784,7 @@ CCMD (writewave) // //========================================================================== -CCMD (writemidi) +UNSAFE_CCMD (writemidi) { if (argv.argc() != 2) { From b5006bbee462297fc8971cd858de89eac5b2a3a0 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 20 Jan 2018 10:34:07 +0200 Subject: [PATCH 109/110] Fixed potential compilation error in ACS loader https://forum.zdoom.org/viewtopic.php?t=59164 --- src/p_acs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_acs.cpp b/src/p_acs.cpp index eccfb48af4..e2fccad141 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -2367,7 +2367,7 @@ void FBehavior::SerializeVarSet (FSerializer &arc, int32_t *vars, int max) static int ParseLocalArrayChunk(void *chunk, ACSLocalArrays *arrays, int offset) { - unsigned count = (LittleShort(static_cast(((unsigned *)chunk)[1]) - 2)) / 4; + unsigned count = LittleShort(static_cast(((unsigned *)chunk)[1] - 2)) / 4; int *sizes = (int *)((uint8_t *)chunk + 10); arrays->Count = count; if (count > 0) From 94720f8a9635fa154f0f5410f8776d989299773b Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 20 Jan 2018 11:33:06 +0100 Subject: [PATCH 110/110] - replaced DBIGFONT and SBIGFONT in gzdoom.pk3 with the one from Ultimate Simplicity, which comes with permission to reuse. The original copyrighted fonts have been moved to the 'extra' PK3. --- wadsrc/static/credits/dbigfont.txt | 9 +++++++++ wadsrc/static/dbigfont.lmp | Bin 6671 -> 6253 bytes wadsrc/static/sbigfont.lmp | Bin 7546 -> 6253 bytes wadsrc_extra/static/dbigfont.lmp | Bin 0 -> 6671 bytes wadsrc_extra/static/sbigfont.lmp | Bin 0 -> 7546 bytes 5 files changed, 9 insertions(+) create mode 100644 wadsrc/static/credits/dbigfont.txt create mode 100644 wadsrc_extra/static/dbigfont.lmp create mode 100644 wadsrc_extra/static/sbigfont.lmp diff --git a/wadsrc/static/credits/dbigfont.txt b/wadsrc/static/credits/dbigfont.txt new file mode 100644 index 0000000000..9ff451fc21 --- /dev/null +++ b/wadsrc/static/credits/dbigfont.txt @@ -0,0 +1,9 @@ +DBIGFONT, SBIGFONT + +Taken from sp_usimp.zip (Ultimate Simplicity) by Agent Spork + +sp_usimp.txt contains the following permissions: + +Authors MAY use the contents of this file as a base for modification or +reuse. Permissions have been obtained from original authors for any of +their resources modified or included in this file. diff --git a/wadsrc/static/dbigfont.lmp b/wadsrc/static/dbigfont.lmp index b44080a5a8107ae41b3925545b32d2096d25f0a0..6502551e3bd6539a67667feed0a7fc97675b52ea 100644 GIT binary patch literal 6253 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 literal 6671 zcmcJUJ&f$OcE?H1&WFV1irgWkSxVy<$4*|lAPJBr=?uh$fw*+xCV(gb@)Iut4L@O=EwpSpkd z`rrTMwfdufQ0fIe&pWkIRyo!1Q>s!s{%U@k^5^K=^84lATCEwm;djG34SzS~cda~k zna`J>SAm{TMo6Fh-IQz1YVwmgUQ&Pi$}6wD`s%B%z4qGcufP7r8*jY%=9_Q5_13dz z&)$Cf?RVaJ=iPVTeeb>Z-hco74?g(d!w*0F=%bH5{`lihKKbO+Pe1+av(G;N{PQoq z_~Oeizx?W}ufG2J>uu!LQH`!;~XNFNli2-^G|BNyfdnusXDEU@64!b z<1+I8P)2QBr!^g;@%x>-P3flTQZ^bT!en%FI2nB%k*>SRSbex{_NnU*ZOWt3A<>cO zm|3CAtl!+R!p>NWT-V5=^<<1zX!CosQYPlHf1!(AaI&|q^YvlhSi4za4@c9q-aeVF zYwx^nZ>o{Ge}(pKxI6ZJ*F|Pl#_sGcH+Hx4zGmvt)OQG#zh+K7nm@hsR@dHHcGeHW zU4OSvd*9T?*xK3M^|f`}Gz!f`%cRfhtXKOs>q*_}ln+{0)-kV6``l;-%xbNZ+c)}D z1h-v;wY>;-vtFJwjR;#kG<3<-w@MHDMr17uV6ui)R$TEVACu>v?^4CBZet@hX~F*Nj|SGjz@rqo!M5i%`YeL>T?GxsAo#`c|C94D?%;Fy4!UbqttUnaHP7_RK`6ib1eZWU0}7r~XaGsB05DNeyF31)eMQ8}+2;R_EbK|HpqD zL|QFVs|PjeM|D*k|0Mnur!S8FKYM(=cwF8p?tWrEarGl}KM?v)*wdIiOvl?+QZ^h~ zLNFvOA6gRauL5otQTkdSARI(=sfhR&_x>nWLBtj#Ol~Gn+MEx`xh zB9S$#V2;B;-!XI@I)vDf?SIad{bMoIQ6}foy4<>49(I|OMhP#@Kbr^U!b^ENZu=yg zaCUMlpJK$<(eUJC=Fl^d$=xvI7!%9I=pC8J!_NCNQxM^vH&%U&{dlxE)VtaS#@Od& zjT@8t{&*ZjCBxfiK%4QE^Mu4?RvSDws*O2je~}2wA^|j;%A!rRCKNl6Db4j(aHh6( zJ#C0I*~FRcplW`Rv@m^+qNRXmpNLkJDF5rEB04mU%m|K&0#NpuWA7gHmTE{rrDEQtE#nXRah^d-6a4Y&5?EVMfd;WouH$OUa^i zNx1?~1sKX*iWQK$0F?+yid7M$e3dy!n=^C%hS*(e)3$ja%J)9?Pv*JcB)wPW06GXZ zH+g>%qHD_&dwUa@=xDs%QeJ^FyDb$Zxb04$3zzpJ@sChDvsAxTv3_;hs z+990idE)w{X0r*g@0sGvgm49K>l8#e%Uk3%#f2#;)y78v`p-~F3WlMKS>PZ@FHPW& zp*6h%aW-`pGU7rIJPCbX<_j_(R+RZ_v(P&4rOsa!dUrxP8DS$0{HPc7?E3*Qp_mev z)#&D|JBKlBPMQ1GhCD!L!q}@}>JKSnW)m==XD2?9V$8Z`%w)CT`S<3Yt6urBpNFdNuoy#X5_R?)M=Y?V z2eWob$jqtOHT9yqPr$agE%icV1fDO=Otb7rtj?-3m_1SxySA6|iWNGH0O1W{FcN(9 zv%4xwi#9(P;pnl0< zW`;o$1exkCWm{5>O*$E|<|!M1q9F8(U@cL6!kj1eDw#NoM}6wX{(v!AQQTZr;`Fjz zlAyY0j2QX*l3=VdLN=}}q!7uPI1H3go8Xetgn-LLnIJfum)+8;LS2!>eO`JAg-wYC z^eK7#+=z#n)styRmR!ODc*rll_Fw}|qMhEF7!cP>^K3RGnlvVl70B?I%9|lfc67Va zkkmetrk(USoK%*$G$XkyEBc(vitKv<1vE1&`6poXWNt&ooX{^eiZ|H3!FRKHQA#3m zEnbJ($h91Hd_r5cVDXy()EWChmjr><o!2H58+t%XjtqYyC?`=-cu{u&3BWJTC&4xELq;8t*68b`A)YWrg?!EF%t;^Thxu$DCpXW^%F;)Dr^++5}~` zc1v53f@F0RK=B4A<`PO0C+q|cO=zJVBo?J{;p7VjQofjGF^Xs_Q37BLgJjmV@khxl z53iMg{k4flj>}jeNd$`@j|FxBnsRP4;aIZb6yG2o!%^T6oT9U%62(g!&8!@(`=y;E zrYRDab}em?F~i7vG_RM#07EFyg2QtDl4|jQX~8O&&%;Vqom4XQ05oGb%Rv#W6t11> zGkXkPLcw+bw}g}{^_G2Ink9e8{7aJwWY;)U24hfxKN34JRV15a<~sCg8a5e!cq!tu znca@GBgoMDgnA3U{UN5Y5~e}b%P&byFC2qYOraTo>(GPeg=V0+y8aKiOqcj!OA6%S^z}AGA&VgKaRMs40hRDf_UUp+7?@N{s>a z{p8lvP$K5uaMsK5-fWAfFwl7b1+ttKaSw%+Ll~JO&=R^NCw5C768I8x_{8FWiLM`; z1eK5{IlGlYMg5g?GDowYJ{8^k;!{xtTiE^hsR)e#BB+IUg7gd&(|L(~d{pu0DAPnB z+miz%;BjyMSiTDpPt<*sr$S3Vsxp+SP66gqhFIeFMteBv)L(Oot?L*$&|>nlS*2ch zl@wIW5eY7Yf!O_}&=bDpiR8KnFo_ zoTMo)Vg7l`Q?0>^rR>o=RC2KYwGm!f}#3gB} ziYVGtlp+*-b_wu6ek2RQ$x>%1$2{h_r1XR^#Vy+K zIG0%@S{&pD7IKEb6D$RRShJEy>VO{)N8g%`vO}SHM8x(Ll=%Ub_*_@)w~Bp2_!}UQ zumYQ9P5D(D0X%6h-%9I>)unCv;Q8P{@}Nzi$oVO})?sJqhvRiY03VQ}jlU>jWHTg{ z;woX=XAFa(OWUT5{;Xz&bQj}R?Cy$B5F0kV)EfENAXfZ!?ickWcqICwXp`V!0%nwP zj%h3{xULO+eGB@vV~-btEMMfHb*NrAv1nZQun2_-i-5P6!>3T*6NIUdIGN=_dYQ%g09u}iiF-`j z;a<|XQ+QlM6|?T~%?<>_0fqW?*pXCScpo3Jh5qpeGL_RJm-n-FLukPr+zV&C`e z$bqv@{t*5K_Q|s3FTla}iEX;4yDBr%zyFJ@o<(B|)SZ?hH?_ZsjZXNo$+s!bxqo9fb~C=t+yPs8*d1d1A-Ca<@D{xz_8f6J zqd8-T?b{K?5AhtabqAO;f%;K*%sF@X@ZqCJk6wQH4ZFt+(BF+wHgCe#aem z+#eume*5ir-g)QUci(;Q zz4zXK|NRd>_~642Km6#Uk3RnR<4->MPKL7mlFTVKV%P+tD>Z`B5{`%`b zpFH^|xA1Nj^WMiiE4+_IQF>pL<=lIIDt@aFysu)|^L^;+-j70EH>`5IzITpwdJ6hJ z=cR{c0WF^BCcgBJr*l2id;b^LyN($hBkP*t{CrOP0Nc^7D!xVE|5i`uCv%wKzbiZM z=T(HA`4T>8RH5@bJblAdJ&%X6>4c~xeP9!#i$(OmdTva)V`%^!oA z_gM`?>Z<2XL9_EM3$q{=*G+Gp6;UcJT-h=M6~@x}r5no@r8VXZARA~~%pwEi&f zrmjPkv$NFI`EjV&)JMKfwLAOOT{EqlS{-W^RV|zD7;6bIo5OB;8A!4LApgKdt!HI7 z>tRfw?EJ+tkY)-XGK;-nNxcXYT{uu{H}+--IT1o6#6k;!m|tw`i`>?iMr|O2Ihhc8 z@9K`RYA@N)H zcc^a&=)!7_o0(OvcTS80n>c4g1{$Nlq#gWv01~KiW9g-9b&!4*E)2y|0Q&VtZ1UL z#7xs+Uo%fJl3ikH<^gQ#3EUbC>06kohlP2yJ_VlkEIzjxU;6RDQTYpltZ^vlLP{LV zs@p5(dU+nq_09GL>2*XQ45Gj_@rj)Ls3H)8Ek4F@>U>%mCKYe8))LKK%Dxs)Ehx%| z6%?g3`Ih?8uZunPtJWN75k^T!g;~tI=83lE-myuRi(7iP9+`3CXf}#q;1nv9h=c}_ zi$VIYss#qg(A+6+#)u6z#WAz3#A^@7L_sLY+MVb@DZ|-B>yV6mmI{{`I}&}RyFKWf z(V`F|y8N20hvWd=}u&Z@xJneIO~l2<)CFGE}~yUBdjks zl4fixZGb0ZbWjlme~^_F-Zy-ZHcs=ouf}xqd06_N(p|I3OJwLUcyuM%Dv6}GZpeAGHSotOcsN<|sLy7pDR+_~a(OJaz1JK?o4sA2adQZF`)}Pf1HZ}$bv@|Ot zF=WPJL-0rGS<_VeZ*f}Fmo?Z?^h6w!G0^3kWg%fOVo{Nli50;W{MLtv)pCxYH7t!` zteL_K9te%rLRf8YIf_zhM;*7L44xIS>gRpARuFK&$F!K?fGltQW(8;jlT3LX)U4r< zSs5ELnr-9-rM_CHLn)J$z{Ap(*q}!;j|7u7myzGvW<*xE>SBlCLKOynUe4zRA5|Fg z^(qTxMhOxGSOz4Z;DCIjY^achX!Z3{K1vM{nQ0wjTgWtE~T?;x*gNiXNskmtZdT7Sj z^?yqCgGYyj441^}-~p%%Lb>@4AedK6Y0QkK&?lq)TcL9$5hX!s68Wn50ddBOWLFYs zp@*$1Ae8x|190wxRxeUl>9sUcI>_Ll7zn0!IT{?Shc^<#F^|76gA2dm$r z|B=$^X}>N5p!eEfHj!TFEsSS56w##tL(N!jkk@<7dh$3k&!{$USM@B9Q)-hY!5aqe za~#Av1hrOWr|Qmg;SHAd;q5@s&xZG6|B!MqR+CwPGke%ZN~ID=;X#x)zTL5iU?8;~G|A;2RZ)Qkm5otYpZN zyNawtSJ_R*jm;D$;I(F22GZl!g7p{%2`xUD#CVatrAKK*nzZ)?v+~H7p;qpuMy9q$ z-Fc~a2&%V@@Y1i%av;*VOK}V8ICE3Mif&M(VI#JnU&ioj`t&kohm2edoGm=ag0$sP z2V_pcs0r4Ofnx~Mn$o&`_&ur*__0Jxc7{g7XLK-xN2vo{ScKHU)3A$X@ids7!7TbH z)>(o!sPOIJRbG@zG(m*#vWA%{mK2~WO5t&3CYb}AqykB?1uo&mEY*gwaFV8^LX+Z< z1wu}W6`N)yHbI1~Enq4$^@LTDx6ekiqUg#)^TJ@1(L-hPt{M~eydUilnkRU|46QCK zDbNwK>X3Np!0LG&MZW6CA@XHqy}R$^idbuCN^n*tk*6y!_sDwCIM|Q7zRa|_f+zdI zaXmCUq;C{7QtX;EA}6IN$y2ifGigL`nS9sAtRP>>8&~oIn6Pe~bS#1I z3!jxaNoN`aaqM9U900+G5_rcgL`vW-t)H5}(V-G}QuFPE@5w=U05vM7=>he2Mt0bKaw+~9&%Ak_(ly6nSf*Ihj zqXHpEw;p`4jG|>$zo71v^%m6k#v)PJynI2ZRmJZ(Nz1);lGufdWLJeA=|zz_GnX*c ztm8pc6!?qMO<(*@K&k@2s{~3(MhDU>9hHIjmO@~PkXn)=reaT{fJ)#;i@!ow1VXr} zC{?99tGelDl}>GImq}X^i~|69TPafaQTTIiN$n3*0c0GCiJ^qGd!8)E0T@hY4o%5Z zM>kk1Ae9-U?E%)VbeCT{zyr zlW48#YjH)FqX+~J($c&4qii`$q;A{w zvD7h8nY#DWlmc|YL;b5^%M+2FF43$i=~8{6j3IEhVF#Bo(5P-q8G`t+^_}MgLEPOS z+9QI6{fa8l4$eC4q)k&HovJQ@l5#XprCpyZ5J24`trFWF5^@38?n(P#0ox2QE?}abYewMx4i?xZiadB>?wOoFnUuvS$EJ vbQc*ogp&a#!c1%a(`A2kf5X9t`!W@;>F|Sxaayxnu1iepp^HVC=%4PtKO0?4 literal 7546 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