diff --git a/src/common/audio/sound/s_sound.cpp b/src/common/audio/sound/s_sound.cpp index 6f53e663e..f2195f890 100644 --- a/src/common/audio/sound/s_sound.cpp +++ b/src/common/audio/sound/s_sound.cpp @@ -1826,7 +1826,8 @@ void S_SetSoundPaused(int state) if ((state || i_soundinbackground) && !pauseext) { - S_ResumeSound(true); + if (!paused) + S_ResumeSound(true); if (GSnd != nullptr) { GSnd->SetInactive(SoundRenderer::INACTIVE_Active); diff --git a/src/common/filesystem/source/file_directory.cpp b/src/common/filesystem/source/file_directory.cpp index 2b891b9a6..c2ac8624f 100644 --- a/src/common/filesystem/source/file_directory.cpp +++ b/src/common/filesystem/source/file_directory.cpp @@ -128,9 +128,15 @@ int FDirectory::AddDirectory(const char *dirpath, LumpFilterInfo* filter, FileSy Printf(FSMessageLevel::Warning, "%s is larger than 2GB and will be ignored\n", entry.FilePath.c_str()); continue; } + // for accessing the file we need to retain the original unaltered path. + // On Linux this is important because its file system is case sensitive, + // but even on Windows the Unicode normalization is destructive + // for some characters and cannot be used for file names. + // Examples for this are the Turkish 'i's or the German ß. + SystemFilePath[count] = stringpool->Strdup(entry.FilePathRel.c_str()); // for internal access we use the normalized form of the relative path. + // this is fine because the paths that get compared against this will also be normalized. Entries[count].FileName = NormalizeFileName(entry.FilePathRel.c_str()); - SystemFilePath[count] = Entries[count].FileName; Entries[count].CompressedSize = Entries[count].Length = entry.Length; Entries[count].Flags = RESFF_FULLPATH; Entries[count].ResourceID = -1; diff --git a/src/common/filesystem/source/filesystem.cpp b/src/common/filesystem/source/filesystem.cpp index f011c4c57..a8418956f 100644 --- a/src/common/filesystem/source/filesystem.cpp +++ b/src/common/filesystem/source/filesystem.cpp @@ -252,7 +252,7 @@ bool FileSystem::InitMultipleFiles (std::vector& filenames, LumpFil stringpool->shared = true; // will be used by all owned resource files. // first, check for duplicates - if (allowduplicates) + if (!allowduplicates) { for (size_t i=0;i LoadWidgetFontData(const std::string& name) std::vector returnv; if (!stricmp(name.c_str(), "notosans")) { - returnv.resize(5); + returnv.resize(3); returnv[0].fontdata = LoadFile("widgets/noto/notosans-regular.ttf"); returnv[1].fontdata = LoadFile("widgets/noto/notosansarmenian-regular.ttf"); returnv[2].fontdata = LoadFile("widgets/noto/notosansgeorgian-regular.ttf"); @@ -62,6 +62,7 @@ std::vector LoadWidgetFontData(const std::string& name) wchar_t wbuffer[256]; if (GetWindowsDirectoryW(wbuffer, 256)) { + returnv.resize(5); FString windir(wbuffer); returnv[3].fontdata = LoadDiskFile((windir + "/fonts/yugothm.ttc").GetChars()); returnv[3].language = "ja"; diff --git a/src/launcher/launcherwindow.cpp b/src/launcher/launcherwindow.cpp index 55158ccc5..96039ea08 100644 --- a/src/launcher/launcherwindow.cpp +++ b/src/launcher/launcherwindow.cpp @@ -72,8 +72,8 @@ void LauncherWindow::Exit() void LauncherWindow::UpdateLanguage() { - // Pages->SetTabText(PlayGame, GStrings("PICKER_TAB_PLAY")); - // Pages->SetTabText(Settings, GStrings("PICKER_TAB_SETTINGS")); + Pages->SetTabText(PlayGame, GStrings("PICKER_TAB_PLAY")); + Pages->SetTabText(Settings, GStrings("OPTMNU_TITLE")); Banner->UpdateLanguage(); PlayGame->UpdateLanguage(); Settings->UpdateLanguage(); diff --git a/src/launcher/settingspage.cpp b/src/launcher/settingspage.cpp index 731c29a15..d1d21b45d 100644 --- a/src/launcher/settingspage.cpp +++ b/src/launcher/settingspage.cpp @@ -183,6 +183,8 @@ void SettingsPage::OnGeometryChanged() y += DontAskAgainCheckbox->GetPreferredHeight(); #ifdef RENDER_BACKENDS + double x = w / 2 - panelWidth / 2; + y = 0; BackendLabel->SetFrameGeometry(x, y, 190.0, BackendLabel->GetPreferredHeight()); y += BackendLabel->GetPreferredHeight(); @@ -192,7 +194,6 @@ void SettingsPage::OnGeometryChanged() OpenGLCheckbox->SetFrameGeometry(x, y, 190.0, OpenGLCheckbox->GetPreferredHeight()); y += OpenGLCheckbox->GetPreferredHeight(); - double x = w / 2 - panelWidth / 2; GLESCheckbox->SetFrameGeometry(x, y, 190.0, GLESCheckbox->GetPreferredHeight()); y += GLESCheckbox->GetPreferredHeight(); #endif diff --git a/src/playsim/actor.h b/src/playsim/actor.h index a304326c4..5781f387e 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -719,18 +719,21 @@ struct ModelOverride enum EModelDataFlags { MODELDATA_HADMODEL = 1 << 0, + MODELDATA_OVERRIDE_FLAGS = 1 << 1, }; class DActorModelData : public DObject { DECLARE_CLASS(DActorModelData, DObject); public: - FName modelDef; + PClass * modelDef; TArray models; TArray skinIDs; TArray animationIDs; TArray modelFrameGenerators; int flags; + int overrideFlagsSet; + int overrideFlagsClear; AnimOverride curAnim; AnimOverride prevAnim; // used for interpolation when switching anims diff --git a/src/playsim/p_actionfunctions.cpp b/src/playsim/p_actionfunctions.cpp index 687543712..4c842d3bb 100644 --- a/src/playsim/p_actionfunctions.cpp +++ b/src/playsim/p_actionfunctions.cpp @@ -5096,7 +5096,7 @@ static void EnsureModelData(AActor * mobj) auto ptr = Create(); ptr->flags = (mobj->hasmodel ? MODELDATA_HADMODEL : 0); - ptr->modelDef = NAME_None; + ptr->modelDef = nullptr; mobj->modelData = ptr; mobj->hasmodel = true; @@ -5111,7 +5111,8 @@ static void CleanupModelData(AActor * mobj) && mobj->modelData->modelFrameGenerators.Size() == 0 && mobj->modelData->skinIDs.Size() == 0 && mobj->modelData->animationIDs.Size() == 0 - && mobj->modelData->modelDef == NAME_None) + && mobj->modelData->modelDef == nullptr + &&(mobj->modelData->flags & ~MODELDATA_HADMODEL) == 0 ) { mobj->hasmodel = mobj->modelData->flags & MODELDATA_HADMODEL; mobj->modelData->Destroy(); @@ -5123,6 +5124,8 @@ enum ESetAnimationFlags { SAF_INSTANT = 1 << 0, SAF_LOOP = 1 << 1, + SAF_USEACTORROLL = 1 << 2, + SAF_USEACTORPITCH = 1 << 3, }; void SetAnimationInternal(AActor * self, FName animName, double framerate, int startFrame, int loopFrame, int interpolateTics, int flags, double ticFrac) @@ -5265,6 +5268,32 @@ void SetAnimationFrameRateUINative(AActor * self, double framerate) SetAnimationFrameRateInternal(self, framerate, I_GetTimeFrac()); } +void SetModelFlag(AActor * self, int flag) +{ + EnsureModelData(self); + self->modelData->flags |= MODELDATA_OVERRIDE_FLAGS; + self->modelData->overrideFlagsSet |= flag; + self->modelData->overrideFlagsClear &= ~flag; +} + +void ClearModelFlag(AActor * self, int flag) +{ + EnsureModelData(self); + self->modelData->flags |= MODELDATA_OVERRIDE_FLAGS; + self->modelData->overrideFlagsClear |= flag; + self->modelData->overrideFlagsSet &= ~flag; +} + +void ResetModelFlags(AActor * self) +{ + if(self->modelData) + { + self->modelData->overrideFlagsClear = 0; + self->modelData->overrideFlagsSet = 0; + self->modelData->flags &= ~MODELDATA_OVERRIDE_FLAGS; + } +} + enum ChangeModelFlags { CMDL_WEAPONTOPLAYER = 1 << 0, @@ -5291,14 +5320,16 @@ void ChangeModelNative( ) { if(!self) ThrowAbortException(X_READ_NIL, "In function parameter self"); - FName modeldef { ENamedName(i_modeldef) }; + FName n_modeldef { ENamedName(i_modeldef) }; FName model { ENamedName(i_model) }; FName skin { ENamedName(i_skin) }; FName animation { ENamedName(i_animation) }; - if (modeldef != NAME_None && PClass::FindClass(modeldef.GetChars()) == nullptr) + PClass * modeldef = nullptr; + + if (n_modeldef != NAME_None && (modeldef = PClass::FindActor(n_modeldef.GetChars())) == nullptr) { - Printf("Attempt to pass invalid modeldef name %s in %s.", modeldef.GetChars(), self->GetCharacterName()); + Printf("Attempt to pass invalid modeldef name %s in %s.", n_modeldef.GetChars(), self->GetCharacterName()); return; } @@ -5533,6 +5564,35 @@ DEFINE_ACTION_FUNCTION_NATIVE(AActor, SetAnimationFrameRateUI, SetAnimationFrame return 0; } +DEFINE_ACTION_FUNCTION_NATIVE(AActor, SetModelFlag, SetModelFlag) +{ + PARAM_ACTION_PROLOGUE(AActor); + PARAM_INT(flag); + + SetModelFlag(self, flag); + + return 0; +} + +DEFINE_ACTION_FUNCTION_NATIVE(AActor, ClearModelFlag, ClearModelFlag) +{ + PARAM_ACTION_PROLOGUE(AActor); + PARAM_INT(flag); + + ClearModelFlag(self, flag); + + return 0; +} + +DEFINE_ACTION_FUNCTION_NATIVE(AActor, ResetModelFlags, ResetModelFlags) +{ + PARAM_ACTION_PROLOGUE(AActor); + + ResetModelFlags(self); + + return 0; +} + // This needs to account for the fact that internally renderstyles are stored as a series of operations, // but the script side only cares about symbolic constants. DEFINE_ACTION_FUNCTION(AActor, GetRenderStyle) diff --git a/src/playsim/p_enemy.cpp b/src/playsim/p_enemy.cpp index 6111a6019..58adfb737 100644 --- a/src/playsim/p_enemy.cpp +++ b/src/playsim/p_enemy.cpp @@ -1823,7 +1823,7 @@ int P_LookForPlayers (AActor *actor, INTBOOL allaround, FLookExParams *params) if (!(player->mo->flags & MF_SHOOTABLE)) continue; // not shootable (observer or dead) - if (actor->IsFriend(player->mo)) + if (!actor->IsHostile(player->mo)) continue; // same +MF_FRIENDLY, ignore if (player->cheats & CF_NOTARGET) @@ -1917,7 +1917,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Look) targ = NULL; } - if (targ && targ->player && ((targ->player->cheats & CF_NOTARGET) || !(targ->flags & MF_FRIENDLY))) + if (targ && targ->player && ((targ->player->cheats & CF_NOTARGET) || !self->IsHostile(targ))) { return 0; } @@ -1931,7 +1931,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Look) if (targ && (targ->flags & MF_SHOOTABLE)) { - if (self->IsFriend (targ)) // be a little more precise! + if (!self->IsHostile (targ)) // be a little more precise! { // If we find a valid target here, the wandering logic should *not* // be activated! It would cause the seestate to be set twice. diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 7df3bb1a3..bb449cdac 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -1361,6 +1361,8 @@ void DActorModelData::Serialize(FSerializer& arc) ("animationIDs", animationIDs) ("modelFrameGenerators", modelFrameGenerators) ("flags", flags) + ("overrideFlagsSet", overrideFlagsSet) + ("overrideFlagsClear", overrideFlagsClear) ("curAnim", curAnim) ("prevAnim", prevAnim); } diff --git a/src/r_data/models.cpp b/src/r_data/models.cpp index 9b19b307e..3a9d3afbb 100644 --- a/src/r_data/models.cpp +++ b/src/r_data/models.cpp @@ -66,8 +66,10 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod { // Setup transformation. + int smf_flags = smf->getFlags(actor->modelData); + FTranslationID translation = NO_TRANSLATION; - if (!(smf->flags & MDL_IGNORETRANSLATION)) + if (!(smf_flags & MDL_IGNORETRANSLATION)) translation = actor->Translation; // y scale for a sprite means height, i.e. z in the world! @@ -85,7 +87,7 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod float angle = angles.Yaw.Degrees(); // [BB] Workaround for the missing pitch information. - if ((smf->flags & MDL_PITCHFROMMOMENTUM)) + if ((smf_flags & MDL_PITCHFROMMOMENTUM)) { const double x = actor->Vel.X; const double y = actor->Vel.Y; @@ -105,7 +107,7 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod } } - if (smf->flags & MDL_ROTATING) + if (smf_flags & MDL_ROTATING) { bool isPaused = paused || P_CheckTickerPaused(); float timeFloat; @@ -135,13 +137,13 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod // Added MDL_USEACTORPITCH and MDL_USEACTORROLL flags processing. // If both flags MDL_USEACTORPITCH and MDL_PITCHFROMMOMENTUM are set, the pitch sums up the actor pitch and the velocity vector pitch. - if (smf->flags & MDL_USEACTORPITCH) + if (smf_flags & MDL_USEACTORPITCH) { double d = angles.Pitch.Degrees(); - if (smf->flags & MDL_BADROTATION) pitch += d; + if (smf_flags & MDL_BADROTATION) pitch += d; else pitch -= d; } - if (smf->flags & MDL_USEACTORROLL) roll += angles.Roll.Degrees(); + if (smf_flags & MDL_USEACTORROLL) roll += angles.Roll.Degrees(); VSMatrix objectToWorldMatrix; objectToWorldMatrix.loadIdentity(); @@ -157,7 +159,7 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod // [MK] distortions might happen depending on when the pixel stretch is compensated for // so we make the "undistorted" behavior opt-in - if (smf->flags & MDL_CORRECTPIXELSTRETCH) + if (smf_flags & MDL_CORRECTPIXELSTRETCH) { stretch = (smf->modelIDs[0] != -1 ? Models[smf->modelIDs[0]]->getAspectFactor(actor->Level->info->pixelstretch) : 1.f) / actor->Level->info->pixelstretch; objectToWorldMatrix.scale(1, stretch, 1); @@ -165,14 +167,14 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod // Applying model transformations: // 1) Applying actor angle, pitch and roll to the model - if (smf->flags & MDL_USEROTATIONCENTER) + if (smf_flags & MDL_USEROTATIONCENTER) { objectToWorldMatrix.translate(smf->rotationCenterX, smf->rotationCenterZ/stretch, smf->rotationCenterY); } objectToWorldMatrix.rotate(-angle, 0, 1, 0); objectToWorldMatrix.rotate(pitch, 0, 0, 1); objectToWorldMatrix.rotate(-roll, 1, 0, 0); - if (smf->flags & MDL_USEROTATIONCENTER) + if (smf_flags & MDL_USEROTATIONCENTER) { objectToWorldMatrix.translate(-smf->rotationCenterX, -smf->rotationCenterZ/stretch, -smf->rotationCenterY); } @@ -180,7 +182,7 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod // 2) Applying Doomsday like rotation of the weapon pickup models // The rotation angle is based on the elapsed time. - if (smf->flags & MDL_ROTATING) + if (smf_flags & MDL_ROTATING) { objectToWorldMatrix.translate(smf->rotationCenterX, smf->rotationCenterY/stretch, smf->rotationCenterZ); objectToWorldMatrix.rotate(rotateOffset, smf->xrotate, smf->yrotate, smf->zrotate); @@ -198,7 +200,7 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod objectToWorldMatrix.rotate(smf->pitchoffset, 0, 0, 1); objectToWorldMatrix.rotate(-smf->rolloffset, 1, 0, 0); - if (!(smf->flags & MDL_CORRECTPIXELSTRETCH)) + if (!(smf_flags & MDL_CORRECTPIXELSTRETCH)) { stretch = (smf->modelIDs[0] != -1 ? Models[smf->modelIDs[0]]->getAspectFactor(actor->Level->info->pixelstretch) : 1.f) / actor->Level->info->pixelstretch; objectToWorldMatrix.scale(1, stretch, 1); @@ -206,15 +208,17 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod float orientation = scaleFactorX * scaleFactorY * scaleFactorZ; - renderer->BeginDrawModel(actor->RenderStyle, smf, objectToWorldMatrix, orientation < 0); + renderer->BeginDrawModel(actor->RenderStyle, smf_flags, objectToWorldMatrix, orientation < 0); RenderFrameModels(renderer, actor->Level, smf, actor->state, actor->tics, translation, actor); - renderer->EndDrawModel(actor->RenderStyle, smf); + renderer->EndDrawModel(actor->RenderStyle, smf_flags); } void RenderHUDModel(FModelRenderer *renderer, DPSprite *psp, FVector3 translation, FVector3 rotation, FVector3 rotation_pivot, FSpriteModelFrame *smf) { AActor * playermo = players[consoleplayer].camera; + int smf_flags = smf->getFlags(psp->Caller->modelData); + // [BB] No model found for this sprite, so we can't render anything. if (smf == nullptr) return; @@ -225,7 +229,7 @@ void RenderHUDModel(FModelRenderer *renderer, DPSprite *psp, FVector3 translatio // [Nash] Optional scale weapon FOV float fovscale = 1.0f; - if (smf->flags & MDL_SCALEWEAPONFOV) + if (smf_flags & MDL_SCALEWEAPONFOV) { fovscale = tan(players[consoleplayer].DesiredFOV * (0.5f * M_PI / 180.f)); fovscale = 1.f + (fovscale - 1.f) * cl_scaleweaponfov; @@ -262,12 +266,12 @@ void RenderHUDModel(FModelRenderer *renderer, DPSprite *psp, FVector3 translatio float orientation = smf->xscale * smf->yscale * smf->zscale; - renderer->BeginDrawHUDModel(playermo->RenderStyle, objectToWorldMatrix, orientation < 0, smf); + renderer->BeginDrawHUDModel(playermo->RenderStyle, objectToWorldMatrix, orientation < 0, smf_flags); auto trans = psp->GetTranslation(); if ((psp->Flags & PSPF_PLAYERTRANSLATED)) trans = psp->Owner->mo->Translation; RenderFrameModels(renderer, playermo->Level, smf, psp->GetState(), psp->GetTics(), trans, psp->Caller); - renderer->EndDrawHUDModel(playermo->RenderStyle, smf); + renderer->EndDrawHUDModel(playermo->RenderStyle, smf_flags); } double getCurrentFrame(const AnimOverride &anim, double tic) @@ -312,6 +316,9 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr { // [BB] Frame interpolation: Find the FSpriteModelFrame smfNext which follows after smf in the animation // and the scalar value inter ( element of [0,1) ), both necessary to determine the interpolated frame. + + int smf_flags = smf->getFlags(actor->modelData); + const FSpriteModelFrame * smfNext = nullptr; double inter = 0.; double inter_main = -1.f; @@ -351,7 +358,7 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr } } } - else if (gl_interpolate_model_frames && !(smf->flags & MDL_NOINTERPOLATION)) + else if (gl_interpolate_model_frames && !(smf_flags & MDL_NOINTERPOLATION)) { FState *nextState = curState->GetNextState(); if (curState != nextState && nextState) @@ -373,7 +380,7 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr { // [BB] Workaround for actors that use the same frame twice in a row. // Most of the standard Doom monsters do this in their see state. - if ((smf->flags & MDL_INTERPOLATEDOUBLEDFRAMES)) + if ((smf_flags & MDL_INTERPOLATEDOUBLEDFRAMES)) { const FState *prevState = curState - 1; if ((curState->sprite == prevState->sprite) && (curState->Frame == prevState->Frame)) @@ -539,7 +546,7 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr } // [RL0] while per-model animations aren't done, DECOUPLEDANIMATIONS does the same as MODELSAREATTACHMENTS - if ((!(smf->flags & MDL_MODELSAREATTACHMENTS) && !is_decoupled) || !evaluatedSingle) + if ((!(smf_flags & MDL_MODELSAREATTACHMENTS) && !is_decoupled) || !evaluatedSingle) { if (animationid >= 0) { @@ -593,7 +600,7 @@ static TArray SpriteModelHash; // //=========================================================================== -static void ParseModelDefLump(int Lump); +void ParseModelDefLump(int Lump); void InitModels() { @@ -675,7 +682,7 @@ void InitModels() } } -static void ParseModelDefLump(int Lump) +void ParseModelDefLump(int Lump) { FScanner sc(Lump); while (sc.GetString()) @@ -1134,11 +1141,11 @@ FSpriteModelFrame * FindModelFrame(const AActor * thing, int sprite, int frame, if(thing->flags9 & MF9_DECOUPLEDANIMATIONS) { - return &BaseSpriteModelFrames[thing->GetClass()]; + return &BaseSpriteModelFrames[(thing->modelData != nullptr && thing->modelData->modelDef != nullptr) ? thing->modelData->modelDef : thing->GetClass()]; } else { - return FindModelFrameRaw((thing->modelData != nullptr && thing->modelData->modelDef != NAME_None) ? PClass::FindActor(thing->modelData->modelDef) : thing->GetClass(), sprite, frame, dropped); + return FindModelFrameRaw((thing->modelData != nullptr && thing->modelData->modelDef != nullptr) ? thing->modelData->modelDef : thing->GetClass(), sprite, frame, dropped); } } @@ -1160,3 +1167,9 @@ bool IsHUDModelForPlayerAvailable (player_t * player) } return false; } + + +unsigned int FSpriteModelFrame::getFlags(class DActorModelData * defs) const +{ + return (defs && defs->flags & MODELDATA_OVERRIDE_FLAGS)? (flags | defs->overrideFlagsSet) & ~(defs->overrideFlagsClear) : flags; +} \ No newline at end of file diff --git a/src/rendering/hwrenderer/hw_models.cpp b/src/rendering/hwrenderer/hw_models.cpp index 1eec5eb80..3e51dafae 100644 --- a/src/rendering/hwrenderer/hw_models.cpp +++ b/src/rendering/hwrenderer/hw_models.cpp @@ -54,7 +54,7 @@ VSMatrix FHWModelRenderer::GetViewToWorldMatrix() return objectToWorldMatrix; } -void FHWModelRenderer::BeginDrawModel(FRenderStyle style, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix, bool mirrored) +void FHWModelRenderer::BeginDrawModel(FRenderStyle style, int smf_flags, const VSMatrix &objectToWorldMatrix, bool mirrored) { state.SetDepthFunc(DF_LEqual); state.EnableTexture(true); @@ -69,7 +69,7 @@ void FHWModelRenderer::BeginDrawModel(FRenderStyle style, FSpriteModelFrame *smf // This solves a few of the problems caused by the lack of depth sorting. // [Nash] Don't do back face culling if explicitly specified in MODELDEF // TO-DO: Implement proper depth sorting. - if ((smf->flags & MDL_FORCECULLBACKFACES) || (!(style == DefaultRenderStyle()) && !(smf->flags & MDL_DONTCULLBACKFACES))) + if ((smf_flags & MDL_FORCECULLBACKFACES) || (!(style == DefaultRenderStyle()) && !(smf_flags & MDL_DONTCULLBACKFACES))) { state.SetCulling((mirrored ^ di->drawctx->portalState.isMirrored()) ? Cull_CCW : Cull_CW); } @@ -79,16 +79,16 @@ void FHWModelRenderer::BeginDrawModel(FRenderStyle style, FSpriteModelFrame *smf state.SetModelMatrix(objectToWorldMatrix, normalModelMatrix); } -void FHWModelRenderer::EndDrawModel(FRenderStyle style, FSpriteModelFrame *smf) +void FHWModelRenderer::EndDrawModel(FRenderStyle style, int smf_flags) { state.SetBoneIndexBase(-1); state.SetModelMatrix(VSMatrix::identity(), VSMatrix::identity()); state.SetDepthFunc(DF_Less); - if ((smf->flags & MDL_FORCECULLBACKFACES) || (!(style == DefaultRenderStyle()) && !(smf->flags & MDL_DONTCULLBACKFACES))) + if ((smf_flags & MDL_FORCECULLBACKFACES) || (!(style == DefaultRenderStyle()) && !(smf_flags & MDL_DONTCULLBACKFACES))) state.SetCulling(Cull_None); } -void FHWModelRenderer::BeginDrawHUDModel(FRenderStyle style, const VSMatrix &objectToWorldMatrix, bool mirrored, FSpriteModelFrame *smf) +void FHWModelRenderer::BeginDrawHUDModel(FRenderStyle style, const VSMatrix &objectToWorldMatrix, bool mirrored, int smf_flags) { state.SetDepthFunc(DF_LEqual); state.SetDepthClamp(true); @@ -104,7 +104,7 @@ void FHWModelRenderer::BeginDrawHUDModel(FRenderStyle style, const VSMatrix &obj // [BB] In case the model should be rendered translucent, do back face culling. // This solves a few of the problems caused by the lack of depth sorting. // TO-DO: Implement proper depth sorting. - if (!(style == DefaultRenderStyle()) || (smf->flags & MDL_FORCECULLBACKFACES)) + if (!(style == DefaultRenderStyle()) || (smf_flags & MDL_FORCECULLBACKFACES)) { state.SetCulling((mirrored ^ di->drawctx->portalState.isMirrored()) ? Cull_CW : Cull_CCW); } @@ -114,13 +114,13 @@ void FHWModelRenderer::BeginDrawHUDModel(FRenderStyle style, const VSMatrix &obj state.SetModelMatrix(objectToWorldMatrix, normalModelMatrix); } -void FHWModelRenderer::EndDrawHUDModel(FRenderStyle style, FSpriteModelFrame *smf) +void FHWModelRenderer::EndDrawHUDModel(FRenderStyle style, int smf_flags) { state.SetBoneIndexBase(-1); state.SetModelMatrix(VSMatrix::identity(), VSMatrix::identity()); state.SetDepthFunc(DF_Less); - if (!(style == DefaultRenderStyle()) || (smf->flags & MDL_FORCECULLBACKFACES)) + if (!(style == DefaultRenderStyle()) || (smf_flags & MDL_FORCECULLBACKFACES)) state.SetCulling(Cull_None); } diff --git a/src/rendering/hwrenderer/hw_models.h b/src/rendering/hwrenderer/hw_models.h index c2c80bd75..c3e5125da 100644 --- a/src/rendering/hwrenderer/hw_models.h +++ b/src/rendering/hwrenderer/hw_models.h @@ -46,12 +46,12 @@ public: FHWModelRenderer(HWDrawInfo *d, FRenderState &st, int mli) : modellightindex(mli), di(d), state(st) {} ModelRendererType GetType() const override { return GLModelRendererType; } - void BeginDrawModel(FRenderStyle style, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix, bool mirrored) override; - void EndDrawModel(FRenderStyle style, FSpriteModelFrame *smf) override; + void BeginDrawModel(FRenderStyle style, int smf_flags, const VSMatrix &objectToWorldMatrix, bool mirrored) override; + void EndDrawModel(FRenderStyle style, int smf_flags) override; IModelVertexBuffer *CreateVertexBuffer(bool needindex, bool singleframe) override; VSMatrix GetViewToWorldMatrix() override; - void BeginDrawHUDModel(FRenderStyle style, const VSMatrix &objectToWorldMatrix, bool mirrored, FSpriteModelFrame *smf) override; - void EndDrawHUDModel(FRenderStyle style, FSpriteModelFrame *smf) override; + void BeginDrawHUDModel(FRenderStyle style, const VSMatrix &objectToWorldMatrix, bool mirrored, int smf_flags) override; + void EndDrawHUDModel(FRenderStyle style, int smf_flags) override; void SetInterpolation(double interpolation) override; void SetMaterial(FGameTexture *skin, bool clampNoFilter, FTranslationID translation) override; void DrawArrays(int start, int count) override; diff --git a/src/rendering/hwrenderer/scene/hw_drawstructs.h b/src/rendering/hwrenderer/scene/hw_drawstructs.h index c83b572a4..00706f81e 100644 --- a/src/rendering/hwrenderer/scene/hw_drawstructs.h +++ b/src/rendering/hwrenderer/scene/hw_drawstructs.h @@ -383,6 +383,7 @@ public: PalEntry ThingColor; // thing's own color FColormap Colormap; FSpriteModelFrame * modelframe; + int modelframeflags; FRenderStyle RenderStyle; int OverrideShader; diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 9e8bc0e98..578001c91 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -478,7 +478,7 @@ bool HWSprite::CalculateVertices(HWDrawInfo *di, FVector3 *v, DVector3 *vp) FQuaternion quat = FQuaternion::FromAngles(FAngle::fromDeg(270) - di->Viewpoint.HWAngles.Yaw, di->Viewpoint.HWAngles.Pitch, FAngle::fromDeg(0)); FVector3 sideVec = quat * FVector3(0, 1, 0); FVector3 upVec = quat * FVector3(0, 0, 1); - FVector3 res = sideVec * -offx + upVec * offy; + FVector3 res = sideVec * -offx + upVec * -offy; mat.Translate(res.X, res.Z, res.Y); } @@ -558,7 +558,7 @@ bool HWSprite::CalculateVertices(HWDrawInfo *di, FVector3 *v, DVector3 *vp) inline void HWSprite::PutSprite(HWDrawInfo *di, FRenderState& state, bool translucent) { // That's a lot of checks... - if (modelframe && !modelframe->isVoxel && !(modelframe->flags & MDL_NOPERPIXELLIGHTING) && RenderStyle.BlendOp != STYLEOP_Shadow && gl_light_sprites && di->Level->HasDynamicLights && !di->isFullbrightScene() && !fullbright) + if (modelframe && !modelframe->isVoxel && !(modelframeflags & MDL_NOPERPIXELLIGHTING) && RenderStyle.BlendOp != STYLEOP_Shadow && gl_light_sprites && di->Level->HasDynamicLights && !di->isFullbrightScene() && !fullbright) { hw_GetDynModelLight(di->drawctx, actor, lightdata); dynlightindex = state.UploadLights(lightdata); @@ -855,6 +855,7 @@ void HWSprite::Process(HWDrawInfo *di, FRenderState& state, AActor* thing, secto } modelframe = isPicnumOverride ? nullptr : FindModelFrame(thing, spritenum, thing->frame, !!(thing->flags & MF_DROPPED)); + modelframeflags = modelframe ? modelframe->getFlags(thing->modelData) : 0; // Too close to the camera. This doesn't look good if it is a sprite. if (fabs(thingpos.X - vp.Pos.X) < 2 && fabs(thingpos.Y - vp.Pos.Y) < 2 diff --git a/wadsrc/static/language.0 b/wadsrc/static/language.0 index b43bba5a3..b669c46c1 100644 --- a/wadsrc/static/language.0 +++ b/wadsrc/static/language.0 @@ -843,7 +843,7 @@ Simple options menu,OPTMNU_SIMPLEON,,,,ZjednoduÅ¡ená nastavení,Enkel menu med Browse Game Config,OPTMNU_OPENCONFIG,,,,Procházet konfiguraÄní soubory,Gennemse spilkonfiguration,Konfigurationsdatei anzeigen,,Foliumi agordojn de ludo,Abrir carpeta de configuración de juego,,Selaa pelin asetuksia,Parcourir configuration,Játék konfiguráció böngészése,Apri le Configurazioni di Gioco,ゲームコンフィグå‚ç…§,게임 환경설정 찾아보기,Door gameconfiguratie bladeren,Bla gjennom spillkonfigurasjon,PrzeglÄ…daj Ustawienia Gry,Abrir pasta de configuração de jogo,,Caută ConfiguraÈ›ia Jocului,Открыть файл наÑтроек игры,,Bläddra i spelkonfigurationen,Oyun Yapılandırmasına Gözat,ПереглÑд налаштувань гри, Browse Screenshots,OPTMNU_OPENSCREENSHOTS,,,,Procházet snímky obrazovky,Gennemse skærmbilleder,Screenshots anzeigen,,Foliumi ekrankopiojn,Abrir carpeta de capturas de pantalla,,Selaa kuvakaappauksia,Parcourir les captures d'écran,KépernyÅ‘képek böngészése,Apri gli Screenshot,クリーンショットå‚ç…§,스í¬ë¦°ìƒ· 찾아보기,Door schermafbeeldingen bladeren,Bla gjennom skjermbilder,PrzeglÄ…daj Zrzuty Ekranu,Abrir pasta de capturas de tela,,Caută Capturi de Ecran,ПроÑмотр Ñнимков Ñкрана,,Bläddra bland skärmdumpar,Ekran Görüntülerine Gözat,ПереглÑд Ñкріншотів, Browse Saved Games,OPTMNU_OPENSAVES,,,,Procházet uložené hry,Gennemse gemte spil,Spielstände anzeigen,,Foliumi konservitajn ludadojn,Abrir carpeta de partidas guardadas,,Selaa tallennettuja pelejä,Parcourir sauvegardes,Elmentett játékok böngészése,Apri i Giochi Salvati,セーブã—ãŸã‚²ãƒ¼ãƒ å‚ç…§,ì €ìž¥ëœ ê²Œìž„ 찾아보기,Door opgeslagen games bladeren,Bla gjennom lagrede spill,PrzeglÄ…daj Zapisy Gry,Abrir pasta de jogos salvos,,Caută Salvări,ПроÑмотр Ñохранённых игр,,Bläddra bland sparade spel,Kaydedilen Oyunlara Gözat,ПереглÑд збережень ігр, -Swap mouse buttons,MOUSEMNU_SWAPBUTTONS,,,,Prohodit tlaÄítka myÅ¡i,Udskift museknapper,Maustasten vertauschen,,Permuti musbutonojn,Alternar botones de ratón,,Vaihda hiiren painikkeita,Permuter les boutons de la souris,Egérgombok felcserélése,Inverti i comandi del mouse,マウスボタンをå転,마우스 버튼 바꾸기,Muisknoppen verwisselen,Bytt museknapper,ZamieÅ„ Przyciski Myszki,Trocar botões do mouse,,Schimbă Butoanele Mouse-ului între Ele,ПоменÑть меÑтами кнопки мыши,,Byta musknappar,Fare düğmelerini deÄŸiÅŸtirme,ПомінÑти міÑцÑми кнопки миші, +Swap mouse buttons,MOUSEMNU_SWAPBUTTONS,,,,Prohodit tlaÄítka myÅ¡i,Udskift museknapper,Maustasten vertauschen,,Permuti musbutonojn,Alternar botones de ratón,,Vaihda hiiren painikkeita,Permuter les boutons de la souris,Egérgombok felcserélése,Inverti i comandi del mouse,マウスボタンをå転,마우스 버튼 바꾸기,Muisknoppen verwisselen,Bytt museknapper,ZamieÅ„ Przyciski Myszki,Trocar botões do mouse,,Schimbă Butoanele Mouse-ului între Ele,ПоменÑть меÑтами кнопки мыши,Замените дугмад миша,Byta musknappar,Fare düğmelerini deÄŸiÅŸtirme,ПомінÑти міÑцÑми кнопки миші, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,, Only modified,OPTVAL_ONLYMODIFIED,,,,Pouze upravené,Kun ændret,Nur modfizierte,,Nur modifitaj,Solo modificados,,Vain muunneltu,Modifié seulement,Csak módosított,Solo modificato,モディファイã®ã¿,ìˆ˜ì •ëœ ê²ƒë§Œ,Alleen gewijzigd,Bare endret,Tylko zmodyfikowane,Somente modificado,,Numai modificat,Только изменённый,Само модификовано,Endast ändrat,Yalnızca deÄŸiÅŸtirilmiÅŸ,Тільки в модифікаціÑÑ…, Unknown,TXT_UNKNOWN,,,,Neznámé,Ukendt,Unbekannt,Άχνωστο,Nekonata,Desconocido,,Tuntematon,Inconnue,Ismeretlen,Sconosciuto,䏿˜Ž,알 수 ì—†ìŒ,Onbekend,Ukjent,Nieznane,Desconhecido,,Necunoscut,ÐеизвеÑтно,Ðепознат,Okänd,Bilinmiyor,Ðевідомо, @@ -851,26 +851,27 @@ HUD,OPTVAL_HUD,,,,,,,,,,,,ATH,,,,,,,,,,,Отображение информац Automap,OPTVAL_AUTOMAP,,,,Automapa,,,,AÅ­tomata mapo,Automapa,,,Carte,Auto-térkép,Automappa,オートマップ,오토맵,,,Automapa,Automapa,,Hartă Computerizată,Ðвтокарта,Ðутомап,,,Ðвтокарта, HUD + Automap,OPTVAL_HUDANDMAP,,,,HUD + Automapa,,,,HUD + AÅ­tomata mapo,HUD + Automapa,,,ATH + Carte,HUD + Auto-térkép,HUD + Automappa,HUD+オートマップ,HUD + 오토맵,,,HUD + Automapa,HUD + Automapa,,Interfață + Hartă Computerizată,Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ + автокарта,HUD + Ðутомап,,,Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ + Ðвтокарта, This savegame needs these files,TXT_SAVEGAMENEEDS,,,,Uložená hra potÅ™ebuje tyto soubory,Dette savegame har brug for disse filer,Dieser Spielstand benötigt die folgenden Dateien,Το αÏχείο αποθήκευσης χÏιάζετε αυτά τα αÏχεία,Ĉi tiu konservita ludo bezonas ĉi tiujn dosierojn,Esta partida guardada necesita los siguientes archivos,,Tämä pelitallenne tarvitsee nämä tiedostot,Cette sauvegarde nécessite les fichiers suivants:,Ehhez a mentéshez a következÅ‘ fájlok kellenek:,Questo salvataggio ha bisogno di questi file,ã“ã®ã‚»ãƒ¼ãƒ–データã«ã¯ å¿…è¦ãªãƒ•ァイルãŒã‚ã‚‹,ì´ ì €ìž¥ ëœ ê²Œìž„ì€ í•´ë‹¹ 파ì¼ì´ 필요합니다.,Dit spel heeft de volgende bestanden nodig,Dette lagringsspillet trenger disse filene,Ten zapis gry potrzebuje tych plików,Este jogo salvo precisa destes arquivos,Este jogo guardado precisa destes arquivos,Acest joc salvat necesită următoarele fiÈ™iere,Данное Ñохранение требует Ñледующие файлы,Овој Ñачуваној игри требају ови фајлови,Detta sparande behöver dessa filer,Bu kayıt oyunu ÅŸu dosyalara ihtiyaç duyar,Цій грі потрібні такі файли, -Multiplayer Options,OPTMNU_MULTIPLAYER,,,,Multiplayer,Multiplayer-indstillinger,Mehrspieleroptionen,,Agordoj de la plurludanta reÄimo,Opciones del multijugador,,,,,,マルãƒãƒ—レイ オプション,,Multiplayer Opties,Alternativer for flerspiller,Opcje Trybu Wielu Graczy,Opções de multijogador,,,ÐаÑтройки Ñетевой игры,,Alternativ för flera spelare,Çok Oyunculu Seçenekler,Параметри багатокориÑтувацької гри, -Input Options,OPTMNU_INPUT,,,,Vstupní zařízení,Input-indstillinger,Eingabeoptionen,,Enig-agordoj,Opciones de entrada (input),,,,,,入力オプション,,In1voeropties,Alternativer for inndata,Opcje Sterowania,Opções de entrada,,,ÐаÑтройки ввода,,Inmatningsalternativ,Girdi Seçenekleri,Параметри введеннÑ, -System Options,OPTMNU_SYSTEM,,,,Systém,Systemindstillinger,Systemoptionen,,Agordoj de la sistemo,Opciones del sistema,,,,,,システムオプション,,Systeem Opties,Systemalternativer,Opcje Systemowe,Opções de sistema,,,ÐаÑтройки ÑиÑтемы,,Systemalternativ,Sistem Seçenekleri,СиÑтемні налаштуваннÑ, -Light Options,OPTMNU_LIGHT,,,,OsvÄ›tlení,Lysindstillinger,Beleuchtungsoptionen,,Lum-agordoj,Opciones de iluminación,,,,,,å…‰æºã‚ªãƒ—ション,,Licht Opties,Alternativer for lys,Opcje OÅ›wietlenia,Opções de iluminação,,,ÐаÑтройки оÑвещениÑ,,Alternativ för ljus,Işık Seçenekleri,Параметри оÑвітленнÑ, -Sprite Options,OPTMNU_SPRITE,,,,Sprity,Sprite-indstillinger,Spriteoptionen,,Agordoj de la mov-rastrumoj,Opciones de los «sprites»,,,,,,スプライトオプション,,Sprite-opties,Sprite-alternativer,Opcje Sprite'ów,Opções de sprite,,,ÐаÑтройки Ñпрайтов,,Alternativ för sprite,Sprite Seçenekleri,Параметри Ñпрайтів, -Coronas,GLPREFMNU_CORONAS,,,,Záře,Coronas,,,Lum-ampoloj,Focos de luz,,,,,,光冠,,Corona's,Koronaer,Korony,,,,Короны,,Koronor,Koronalar,Корони, -Appearance,DSPLYMNU_APPEARANCE,,,,Vzhled,Udseende,Spieldarstellung,,Aspekto,Apariencia,,,,,,アピアランス,,Uiterlijk,Utseende,WyglÄ…d,Aparência,,,ВнешноÑть,,Utseende,Görünüş,Зовнішній виглÑд, -Advanced Display Options,DSPLYMNU_ADVANCED,,,,Grafika (pokroÄilé),Avancerede visningsindstillinger,Erweiterte Anzeigeoptionen,,Altnivelaj ekran-agordoj,Opciones avanzadas de visualización,,,,,,高度ãªãƒ‡ã‚£ã‚¹ãƒ—レイオプション,,Geavanceerde Weergave Opties,Avanserte visningsalternativer,Zaawansowane Opcje WyÅ›wietlania,Opções de vídeo avançadas,,,РаÑширенные наÑтройки Ñкрана,,Avancerade visningsalternativ,GeliÅŸmiÅŸ Görüntüleme Seçenekleri,Додаткові параметри відображеннÑ, -Select which game file to run.,PICKER_SELECT,,,,,,Bitte wähle ein Spiel aus.,,,,,,,,,,,,,,,,,Выбор файла игры Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка.,,,,, -Play Game,PICKER_PLAY,,,,,,Spielen,,,,,,,,,,,,,,,,,Играть,,,,, -Exit,PICKER_EXIT,,,,,,Verlassen,,,,,,,,,,,,,,,,,Выход,,,,, -General,PICKER_GENERAL,,,,,,Allgemein,,,,,,,,,,,,,,,,,Общее,,,,, -Extra Graphics,PICKER_EXTRA,,,,,,Extragrafiken,,,,,,,,,,,,,,,,,Доп. графика,,,,, -Fullscreen,PICKER_FULLSCREEN,,,,,,Vollbild,,,,,,,,,,,,,,,,,Полный Ñкран,,,,, -Disable autoload,PICKER_NOAUTOLOAD,,,,,,Autoload deaktivieren,,,,,,,,,,,,,,,,,Отключить автозагрузку,,,,, -Don't ask me again,PICKER_DONTASK,,,,,,Nicht nochmal fragen,,,,,,,,,,,,,,,,,Ðе Ñпрашивать Ñнова,,,,, -Lights,PICKER_LIGHTS,,,,,,Lichter,,,,,,,,,,,,,,,,,ОÑвещение,,,,, -Brightmaps,PICKER_BRIGHTMAPS,,,,,,,,,,,,,,,,,,,,,,,Карты оÑвещениÑ,,,,, -Widescreen,PICKER_WIDESCREEN,,,,,,Breitbildunterstützung,,,,,,,,,,,,,,,,,Широкий Ñкран,,,,, -Additional Parameters:,PICKER_ADDPARM,,,,,,Zusätzliche Parameter,,,,,,,,,,,,,,,,,Доп. параметры:,,,,, -Welcome to %s!,PICKER_WELCOME,,,,,,Willkommen bei %s!,,,,,,,,,,,,,,,,,Добро пожаловать в %s!,,,,, -Version %s,PICKER_VERSION,,,,,,,,,,,,,,,,,,,,,,,ВерÑÐ¸Ñ %s,,,,, -Rendering API,PICKER_PREFERBACKEND,,,,API vykreslování,,Render API,,Preferita bildigado de API,API de renderizado,,Renderöinti API,API de rendu,RenderelÅ‘ API,API di rendering,優先レンダリングAPI,기본ì ì¸ API ëžœë”ë§,,,API renderowania,API de renderização,,API Video Preferat,API Ð´Ð»Ñ Ñ€ÐµÐ½Ð´ÐµÑ€Ð¸Ð½Ð³Ð°,ÐПИ приказивања,API för rendering,,API Ð´Ð»Ñ Ð²Ñ–Ð·ÑƒÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ—, \ No newline at end of file +Multiplayer Options,OPTMNU_MULTIPLAYER,,,,Multiplayer,Multiplayer-indstillinger,Mehrspieleroptionen,,Agordoj de la plurludanta reÄimo,Opciones del multijugador,,,Options multijoueurs,,,マルãƒãƒ—レイ オプション,,Multiplayer Opties,Alternativer for flerspiller,Opcje Trybu Wielu Graczy,Opções de multijogador,,,ÐаÑтройки Ñетевой игры,Опције за више играча,Alternativ för flera spelare,Çok Oyunculu Seçenekler,Параметри багатокориÑтувацької гри, +Input Options,OPTMNU_INPUT,,,,Vstupní zařízení,Input-indstillinger,Eingabeoptionen,,Enig-agordoj,Opciones de entrada (input),,,Options d'entrée,,,入力オプション,,In1voeropties,Alternativer for inndata,Opcje Sterowania,Opções de entrada,,,ÐаÑтройки ввода,Опције уноÑа,Inmatningsalternativ,Girdi Seçenekleri,Параметри введеннÑ, +System Options,OPTMNU_SYSTEM,,,,Systém,Systemindstillinger,Systemoptionen,,Agordoj de la sistemo,Opciones del sistema,,,Options du système,,,システムオプション,,Systeem Opties,Systemalternativer,Opcje Systemowe,Opções de sistema,,,ÐаÑтройки ÑиÑтемы,СиÑтемÑке опције,Systemalternativ,Sistem Seçenekleri,СиÑтемні налаштуваннÑ, +Light Options,OPTMNU_LIGHT,,,,OsvÄ›tlení,Lysindstillinger,Beleuchtungsoptionen,,Lum-agordoj,Opciones de iluminación,,,Options de lumière,,,å…‰æºã‚ªãƒ—ション,,Licht Opties,Alternativer for lys,Opcje OÅ›wietlenia,Opções de iluminação,,,ÐаÑтройки оÑвещениÑ,Опције оÑветљења,Alternativ för ljus,Işık Seçenekleri,Параметри оÑвітленнÑ, +Sprite Options,OPTMNU_SPRITE,,,,Sprity,Sprite-indstillinger,Spriteoptionen,,Agordoj de la mov-rastrumoj,Opciones de los «sprites»,,,Options des sprites,,,スプライトオプション,,Sprite-opties,Sprite-alternativer,Opcje Sprite'ów,Opções de sprite,,,ÐаÑтройки Ñпрайтов,Сприте опције,Alternativ för sprite,Sprite Seçenekleri,Параметри Ñпрайтів, +Coronas,GLPREFMNU_CORONAS,,,,Záře,Coronas,,,Lum-ampoloj,Focos de luz,,,Corons,,,光冠,,Corona's,Koronaer,Korony,,,,Короны,ЦоронаÑ,Koronor,Koronalar,Корони, +Appearance,DSPLYMNU_APPEARANCE,,,,Vzhled,Udseende,Spieldarstellung,,Aspekto,Apariencia,,,Apparence,,,アピアランス,,Uiterlijk,Utseende,WyglÄ…d,Aparência,,,ВнешноÑть,Изглед,Utseende,Görünüş,Зовнішній виглÑд, +Advanced Display Options,DSPLYMNU_ADVANCED,,,,Grafika (pokroÄilé),Avancerede visningsindstillinger,Erweiterte Anzeigeoptionen,,Altnivelaj ekran-agordoj,Opciones avanzadas de visualización,,,Options d'affichage avancées,,,高度ãªãƒ‡ã‚£ã‚¹ãƒ—レイオプション,,Geavanceerde Weergave Opties,Avanserte visningsalternativer,Zaawansowane Opcje WyÅ›wietlania,Opções de vídeo avançadas,,,РаÑширенные наÑтройки Ñкрана,Ðапредне опције приказа,Avancerade visningsalternativ,GeliÅŸmiÅŸ Görüntüleme Seçenekleri,Додаткові параметри відображеннÑ, +Select which game file to run.,PICKER_SELECT,,,,,"Vælg, hvilket spil du vil spille",Bitte wähle ein Spiel aus.,,,,,,Sélectionner le jeu à jouer,,,,,Selecteer welk spel je wilt spelen,Velg hvilket spill du vil spille,,Selecione o arquivo de jogo para rodar.,,,Выбор файла игры Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка.,Изаберите коју датотеку игре желите да покренете.,Välj vilket spel du vill spela,Hangi oyunu oynayacağınızı seçin,, +Play Game,PICKER_PLAY,,,,,Start spil,Spielen,,,,,,Démarrer le jeu,,,,,Spel starten,Start spill,,Jogar,,,Играть,Играј игру,Starta spel,Oyunu BaÅŸlat,, +Exit,PICKER_EXIT,,,,,Afslut,Verlassen,,,,,,Quitter,,,,,Verlaten,Avslutt,,Sair,,,Выход,Изађи,Avsluta,Çıkış,, +General,PICKER_GENERAL,,,,,Generelt,Allgemein,,,,,,Général,,,,,Algemeen,Generelt,,Geral,,,Общее,Генерал,Allmänt,Genel,, +Extra Graphics,PICKER_EXTRA,,,,,Ekstra grafik,Extragrafiken,,,,,,Graphiques supplémentaires,,,,,Extra afbeeldingen,Ekstra grafikk,,Gráficos extra,,,Доп. графика,Ектра ГрапхицÑ,Extra grafik,Ekstra Grafikler,, +Fullscreen,PICKER_FULLSCREEN,,,,,Fuld skærm,Vollbild,,,,,,Plein écran,,,,,Volledig scherm,Fullskjerm,,Tela cheia,,,Полный Ñкран,Цео екран,Fullskärm,Tam Ekran,, +Disable autoload,PICKER_NOAUTOLOAD,,,,,Deaktiver autoload,Autoload deaktivieren,,,,,,Désactiver le chargement automatique,,,,,Autoload uitschakelen,Deaktiver autolading,,Desativar autocarregamento,,,Отключить автозагрузку,Онемогући аутоматÑко учитавање,Inaktivera autoload,Otomatik yükleme yok,, +Don't ask me again,PICKER_DONTASK,,,,,Spørg mig ikke igen,Nicht nochmal fragen,,,,,,Ne me demandez plus rien,,,,,Vraag me niet opnieuw,Ikke spør meg igjen,,Não me pergunte de novo,,,Ðе Ñпрашивать Ñнова,Ðе питај ме поново,FrÃ¥ga mig inte igen,Bir daha sorma.,, +Lights,PICKER_LIGHTS,,,,,Lys,Lichtdefinitionen,,,,,,Lumières,,,,,Verlichting,Lysdefinisjoner,,Luzes,,,ОÑвещение,Светла,Definitioner av ljus,Işık tanımları,, +Brightmaps,PICKER_BRIGHTMAPS,,,,,,,,,,,,Cartes lumineuses,,,,,Heldermaps,Lyskart,,,,,Карты оÑвещениÑ,БригхтмапÑ,Ljuskartor,Brightmaps,, +Widescreen,PICKER_WIDESCREEN,,,,,,Breitbildunterstützung,,,,,,Écran large,,,,,Breedbeeld,Bredskjerm,,,,,Широкий Ñкран,Широки екран,Bredbildsskärm,GeniÅŸ Ekran,, +Additional Parameters:,PICKER_ADDPARM,,,,,Yderligere parametre:,Zusätzliche Parameter,,,,,,Paramètres supplémentaires :,,,,,Extra parameters:,Ytterligere parametere:,,Parâmetros adicionais:,,,Доп. параметры:,Додатни параметри:,Ytterligare parametrar:,Ek Parametreler:,, +Welcome to %s!,PICKER_WELCOME,,,,,Velkommen til %s!,Willkommen bei %s!,,,,,,Bienvenue à %s !,,,,,Welkom bij %s!,Velkommen til %s!,,Boas vindas ao %s!,,,Добро пожаловать в %s!,Добродошли у %s!,Välkommen till %s!,S'ye hoÅŸ geldiniz!,, +Version %s,PICKER_VERSION,,,,,,,,,,,,,,,,,Versie %s,Versjon %s,,Versão %s,,,ВерÑÐ¸Ñ %s,Верзија %s,,Sürüm %s,, +Rendering API,PICKER_PREFERBACKEND,,,,API vykreslování,,Render API,,Preferita bildigado de API,API de renderizado,,Renderöinti API,API de rendu,RenderelÅ‘ API,API di rendering,優先レンダリングAPI,기본ì ì¸ API ëžœë”ë§,,,API renderowania,API de renderização,,API Video Preferat,API Ð´Ð»Ñ Ñ€ÐµÐ½Ð´ÐµÑ€Ð¸Ð½Ð³Ð°,ÐПИ приказивања,API för rendering,,API Ð´Ð»Ñ Ð²Ñ–Ð·ÑƒÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ—, +Game,PICKER_TAB_PLAY,,,,Hra,Spil,Spiel,,Ludo,Juego,,Peli,Jeu,Játék,Gioco,ゲーム,게임,Spel,Spill,Gra,Jogo,,Joc,Игра,Игра,Spel,Oyun,Гра, \ No newline at end of file diff --git a/wadsrc/static/language.csv b/wadsrc/static/language.csv index d20f814c3..fcefad347 100644 --- a/wadsrc/static/language.csv +++ b/wadsrc/static/language.csv @@ -1856,7 +1856,7 @@ zorcher.",Получена Ð±Ð°Ñ‚Ð°Ñ€ÐµÑ Ñ„Ð°Ð·ÐµÑ€Ð½Ð¾Ð³Ð¾ зорчера.,П Picked up a large zorcher recharge.,GOTLARGEZORCHERRECHARGE,,,,Sebrán náboj pro velký bzukr.,Afhentede en stor zorcher-opladning.,Du hast eine Zorcher-Ladung genommen.,,Prenis grandzorĉilo-reÅargon.,Recogiste una gran recarga de zorch.,,Poimit ison zorcherin latauksen,Vous avez pris une recharge pour zorcheur large.,Felvettél egy Nagy Zorker ÚjratöltÅ‘t,Raccolta una ricarica per zorcher grande.,ラージ ゾーãƒãƒ£ãƒ¼ãƒªãƒãƒ£ãƒ¼ã‚¸ ã‚’ã²ã‚ã£ãŸã€‚,대형 저치 카트리지 íšë“.,Je hebt een zorcherlading opgepakt.,Plukket opp en stor zorcher-opplading.,Zebrano Å‚adunek do dużego zorchera.,Pegou recarga para zorcher grande.,Apanhaste recarga para o zorcher grande.,Ai ridicat o încărcătură mare pentru zorcher.,Получена зарÑдка большого зорчера.,Покупио Ñи велики зорчер пуњач.,Plockade upp en stor zorcher-uppladdning.,Büyük bir zorcher ÅŸarjı aldım.,ВзÑто зарÑд великого Зорчера. Picked up a large zorcher pack.,GOTLARGEZORCHERPACK,,,,Sebrán balík pro velký bzukr.,Afhentede en stor zorcher-pakke.,Du hast ein Zorcher-Ladepaket genommen.,,Prenis grandegzorĉilo-reÅargon.,Recogiste un gran paquete de zorch.,,Poimit ison zorcherin paketin.,Vous avez pris un pack de recharges pour zorcheur large.,Felvettél egy Nagy Zorker Csomagot,Raccolta una scatola per zorcher grande.,ラージ ゾーãƒãƒ£ãƒ¼ãƒ‘ック ã‚’ã²ã‚ã£ãŸã€‚,저치 카트리지 ë¬¶ìŒ íšë“.,Je hebt een pakket met zorcherladingen opgepakt.,Plukket opp en stor zorcherpakke.,Zebrano paczkÄ™ dużego zorchera.,Pegou um pacote de recargas para zorcher grande.,Apanhaste um pacote de recargas para o zocher grande.,Ai ridicat un pachet mare de încărcături pentru zorcher.,Получена Ð±Ð°Ñ‚Ð°Ñ€ÐµÑ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð³Ð¾ зорчера.,Покупио Ñи велики зорчер пакет.,Plockade upp ett stort zorcherpaket.,Büyük bir zorcher paketi aldı.,ВзÑто батарею великого Зорчера. Picked up a Zorchpak!,GOTZORCHPACK,,,,Sebrán Bzukrbatoh!,Afhentede en Zorchpak!,Du hast ein Zorchpaket genommen.,,Prenis Zorĉpakon!,¡Recogiste un Zorchpak!,,Poimit zorchpakin!,Vous avez pris un zorchpak!,Felvettél egy Zorkpakkot!,Raccolto uno ZorchZaino!,ゾーãƒãƒ‘ックをã¦ã«ã„れãŸ!,저치 팩 íšë“!,Je hebt en zorchpak opgepakt.,Plukket opp en Zorchpak!,Zebrano PaczkÄ™ Zorch.,Pegou um Zorchpak!,Apanhaste um Zorchpak!,Ai ridicat un Ghiozdan Zorch!,Получен зорч-рюкзак!,Покупио Ñи зорчпак.,Jag hämtade en Zorchpak!,Bir Zorchpak aldım!,ВзÑто Зорч-Ñумку! -You got the LAZ Device! Woot!,GOTLAZDEVICE,,,,Získal@[ao_cs] jsi velkodosahový bzukr! Cooo?,Du fik LAZ-enheden! Woot!,Du hast den Flächenzorcher!,,Vi prenis la LAZ-aparaton! Hura!,¡Tienes el dispositivo LAZ! ¡Yuju!,,Sait SAZ-laitteen! Juhuu!,Vous avez pris l'Outil ZZL! Wahou!,Felvetted a LAZ Készüléket! Wáó!,Hai trovato il dispositivo LAZ! Cavolo!,LAZ デãƒã‚¤ã‚¹ã‚’ã¦ã«ã„れãŸ! ワァオ!,LAZ 장치 습ë“! 완전 ì§±ì¸ê±¸!,Je hebt het LAZ-apparaat! Woot!,Du har LAZ-enheten! Woot!,ZdobyÅ‚@[irreg_3_pl] urzÄ…dzenie LAZ! Juhu!,Você achou o Dispositivo LAZ! Oba!,Apanhaste um Dispositivo LAZ! Fixe!,Ai ridicat un Dispozitiv LAZ! Uraa!,Получено уÑтройÑтво Ð·Ð¾Ñ€Ñ‡Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð³Ð¾ радиуÑа! Ура!,Добио Ñи ЛÐЗ уређај. ВУТ!,Du fick LAZ-enheten! Woot!,LAZ cihazını aldın! Woot!, +You got the LAZ Device! Woot!,GOTLAZDEVICE,,,,Získal@[ao_cs] jsi velkodosahový bzukr! Cooo?,Du fik LAZ-enheden! Woot!,Du hast den Flächenzorcher!,,Vi prenis la LAZ-aparaton! Hura!,¡Tienes el dispositivo LAZ! ¡Yuju!,,Sait SAZ-laitteen! Juhuu!,Vous avez pris l'Outil ZZL! Wahou!,Felvetted a LAZ Készüléket! Wáó!,Hai trovato il dispositivo LAZ! Cavolo!,LAZ デãƒã‚¤ã‚¹ã‚’ã¦ã«ã„れãŸ! ワァオ!,LAZ 장치 습ë“! 완전 ì§±ì¸ê±¸!,Je hebt het LAZ-apparaat! Woot!,Du har LAZ-enheten! Woot!,ZdobyÅ‚@[irreg_3_pl] urzÄ…dzenie LAZ! Juhu!,Você achou o Dispositivo LAZ! Oba!,Apanhaste um Dispositivo LAZ! Fixe!,Ai ridicat un Dispozitiv LAZ! Uraa!,Получено уÑтройÑтво Ð·Ð¾Ñ€Ñ‡Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð³Ð¾ радиуÑа! Ура!,Добио Ñи ЛÐЗ уређај. ВУТ!,Du fick LAZ-enheten! Woot!,LAZ cihazını aldın! Woot!,Ти отримав приÑтрій LAZ! Супер! You got the Rapid Zorcher!,GOTRAPIDZORCHER,,,,Získal@[ao_cs] jsi rychlobzukr!,Du fik en Rapid Zorcher!,Du hast den schnellen Zorcher genommen!,,Vi prenis la Rapidzorĉilon!,¡Tienes el Zorcher Rápido!,,Sait pikazorcherin!,Vous avez pris le Zorcheur Rapide!,Felvetted a Gyors Zorkert!,Hai trovato il zorcher rapido!,ラピッドゾーãƒãƒ£ãƒ¼ ã‚’ã¦ã«ã„れãŸ!,ì†ì‚¬ ìžì³ 습ë“!,Je hebt de snelle Zorcher!,Du har Rapid Zorcher!,ZdobyÅ‚@[irreg_3_pl] Szybkostrzelny Zorcher!,Você pegou o Zorcher Automático!,Apanhaste o Zorcher Automático!,Ai ridicat un Zorcher cu Foc Rapid!,Получен ÑкороÑтрельный зорчер!,Добио Ñи рапидан зорчер!,Du fick den snabba Zorcher!,Hızlı Zorcher'ı aldın!, You got the Super Bootspork!,GOTSUPERBOOTSPORK,,,,Získal@[ao_cs] jsi super botovidliÄku!,Du fik Super Bootspork!,Du hast den Super-Gabelquirl genommen!,,Vi prenis la Superan ÅœargmanÄilaron!,¡Tienes el Súper Cuchador!,,Sait superluhan!,Vous avez pris la Super Fourchette!,Felvetted a Szuper Rotációs Villát!,Hai trovato il super bootspork!,スーパーã•ãã‚れスプーン ã‚’ã¦ã«ã„れãŸ!,부트스í¬í¬ 습ë“!,Je hebt de Super Bootspork!,Du har Super Bootspork!,ZdobyÅ‚@[irreg_3_pl] Super Åyżkowidelec!,Você pegou o Super Garfo!,Apanhaste o Super Garfo-Colher!,Ai ridicat o Super Lingură!,Получена Ñуперложковилка!,Добио Ñи Ñупер чизмо-порк!,Du fick Super Bootspork!,Süper Bootspork'u aldın!, You got the Zorch Propulsor!,GOTZORCHPROPULSOR,,,,Získal@[ao_cs] jsi bzukový propulsor!,Du fik Zorch-propulsoren!,Du hast den Propellerzorcher genommen!,,Vi prenis la Zorĉpropulsilon!,¡Tienes el Propulsor de Zorch!,,Sait zorchtyöntimen!,Vous avez pris le Propulseur Zorch!,Felvetted a Zork Elhárítót!,Hai trovato il propulsore zorch!,ロケット ゾーãƒãƒ£ãƒ¼ ã‚’ã¦ã«ã„れãŸ!,저치 추진기 습ë“!,Je hebt de Zorch Propulsor!,Du fikk Zorch Propulsor!,ZdobyÅ‚@[irreg_3_pl] PÄ™dnik Zorch!,Você pegou o Propulsor de Zorch!,Apanhaste o Propulsor de Zorch!,Ai ridicat un Accelerator Zorch!,Получен уÑкоритель хорча!,Добио Ñи зорч погон!,Du fick Zorch Propulsor!,Zorch Propulsor'u aldın!, @@ -3344,9 +3344,11 @@ Show time widget,ALTHUDMNU_SHOWTIMESTAT,,,,Zobrazit widget s Äasem,Vis tid widg MBF21,OPTVAL_MBF21,,,,,,,,,,,,,,,,,,,,,,,,,,, Crushed monsters get resurrected as ghosts,CMPTMNU_VILEGHOSTS,,,,Oživovat rozdrcené příšery jako duchy,Knuste monstre genopstÃ¥r som spøgelser,Zermalmte Monster werden als Geister wiedererweckt,Συνθλιμένα τέÏατα αναστήνοντε ως φαντάσματα,Dispremitaj monstroj reviviÄas kiel fantomojn,Los monstruos aplastados son resucitados como fantasmas,,Murskatut hirviöt heräävät henkiin aaveina...,Les monstres écrasés ressuscitent en fantômes,Összenyomott szörnyek szellemként születnek újra,Mostri schiacciati vengono resuscitati come fantasmi,圧死ã—ãŸæ•µãŒè˜‡ç”Ÿã§ã‚´ãƒ¼ã‚¹ãƒˆåŒ–,ë¶„ì‡„ëœ ëª¬ìŠ¤í„°ëŠ” 유령으로 부활합니다.,Verpletterde monsters worden herrezen als geesten,Knuste monstre gjenoppstÃ¥r som spøkelser,Zmiażdżone potwory wskrzeszone jako duchy,Monstros esmagados ressucitam como fantasmas,,MonÈ™trii striviÈ›i sunt readuÈ™i la viață ca fantome.,Раздавленные монÑтры воÑкреÑают в виде призраков,Сломљена чудовишта ваÑкрÑавају као духови,Krossade monster Ã¥teruppstÃ¥r som spöken.,EzilmiÅŸ canavarlar hayalet olarak dirilir, View bobbing while flying,MISCMNU_FVIEWBOB,,,,Pohupování pohledu pÅ™i létání,Vis bobbing mens du flyver,Waffenpendeln beim Fliegen,,Vidi kapo-balanciÄon dum flugado,La vista tambalea al volar,,,Chaloupage en vol,Nézet repüléskori billegése,,飛行中ã®è¦–点æºã‚Œ,비행 중 í”들림 보기,Bekijk bob bedrag terwijl je vliegt,Se bobbing mens du flyr,Pokaż bujanie podczas lotu,Balanço na visão durante voo,,MiÈ™care cameră în timpul zborului,Покачивание камеры при полёте,Погледајте Ñкакање током лета,Visa att det guppar när du flyger,Uçarken sallanmayı görüntüle, -%o was maimed by a Serpent.,OB_DEMON1HIT,,,,%o byl@[ao_cs] zmrzaÄen@[ao_cs] zlohadem.,%o blev lemlæstet af en slange.,%o wurde von einer Schlange zerfleischt.,,%o vundegiÄis de Serpento.,,,,%o a été mutilé@[e_fr] par un Serpent.,,,,,%o werd verminkt door een slang.,%o ble lemlestet av en slange.,Wąż skaleczyÅ‚ gracza %o,%o foi mutilad@[ao_ptb] por uma Serpente.,,,Игрок %o иÑкалечен змеем.,,%o blev lemlästad av en orm.,"%o, bir yılan tarafından sakat bırakıldı.", -Antialias Lines,AUTOMAPMNU_LINEANTIALIASING,,,,Vyhlazovat Äáry,,Linien glätten,,Glatigaj Linioj,,,,,,,,,,,Linie Antyaliasowe,Linhas com antiserrilhamento,,,Линии ÑглаживаниÑ,,,, -Move and shoot through other players,GMPLYMNU_NOPLAYERCLIP ,,,,,,Keine Kollisionen mit anderen Spielern,,,,,,,,,,,,,Brak kolizji z innymi graczami,Mover e atirar através de outros jogadores,,,Перемещение и Ñтрельба через игроков,,,, -Share keys with all players,GMPLYMNU_SHAREKEYS,,,,,,Schlüssel mit allen Spielern teilen,,,,,,,,,,,,,Współdziel klucze z innymi graczami,Compartilhar chaves com todos os jogadores,,,Общие ключи игроков,,,, -Disallow override of camera facing mode,GLPREFMNU_SPRBILLFACECAMERAFORCE,,,,,,,,,,,,,,,,,,,ZabroÅ„ nadpisywania trybu widoku,Forçar modo de alinhamento do sprite à câmera,,,Запретить переопределение режима поворота камеры,,,, -Swap health and armor,ALTHUDMNU_SWAPHEALTHARMOR,,,,,,Anzeige für Gesundheit und Panzerung tauschen,,,,,,,,,,,,,ZamieÅ„ zdrowie i pancerz,,,,ПоменÑть отображение Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð¸ брони меÑтами,,,, \ No newline at end of file +%o was maimed by a Serpent.,OB_DEMON1HIT,,,,%o byl@[ao_cs] zmrzaÄen@[ao_cs] zlohadem.,%o blev lemlæstet af en slange.,%o wurde von einer Schlange zerfleischt.,,%o vundegiÄis de Serpento.,,,,%o a été mutilé@[e_fr] par un Serpent.,,%o è stato mutilato da un serpente.,,,%o werd verminkt door een slang.,%o ble lemlestet av en slange.,Wąż skaleczyÅ‚ gracza %o,%o foi mutilad@[ao_ptb] por uma Serpente.,,,Игрок %o иÑкалечен змеем.,,%o blev lemlästad av en orm.,"%o, bir yılan tarafından sakat bırakıldı.", +Antialias Lines,AUTOMAPMNU_LINEANTIALIASING,,,,Vyhlazovat Äáry,Antialias-linjer,Linien glätten,,Glatigaj Linioj,,,,Lignes Antialias,,,,,Antialijnen,Antialias-linjer,Linie Antyaliasowe,Linhas com antiserrilhamento,,,Линии ÑглаживаниÑ,,Antialias Linjer,Antialias Hatları, +Move and shoot through other players,GMPLYMNU_NOPLAYERCLIP ,,,,,Bevæg dig og skyd gennem andre spillere,Keine Kollisionen mit anderen Spielern,,,,,,Déplacez-vous et tirez à travers les autres joueurs,,Muoversi e sparare attraverso gli altri giocatori,,,Beweeg en schiet door andere spelers,Beveg deg og skyt gjennom andre spillere,Brak kolizji z innymi graczami,Mover e atirar através de outros jogadores,,,Перемещение и Ñтрельба через игроков,,Förflytta dig och skjut genom andra spelare,DiÄŸer oyuncuların arasından geçin ve ateÅŸ edin, +Share keys with all players,GMPLYMNU_SHAREKEYS,,,,,Del nøgler med alle spillere,Schlüssel mit allen Spielern teilen,,,,,,Partager les clés avec tous les joueurs,,Condividere i tasti con tutti i giocatori,,,Deel toetsen met alle spelers,Del nøkler med alle spillere,Współdziel klucze z innymi graczami,Compartilhar chaves com todos os jogadores,,,Общие ключи игроков,,Dela nycklar med alla spelare,Anahtarları tüm oyuncularla paylaşın, +Disallow override of camera facing mode,GLPREFMNU_SPRBILLFACECAMERAFORCE,,,,,Tillad ikke tilsidesættelse af kameravendt tilstand,Änderung des Kameramodus nicht erlauben,,,,,,Interdiction de modifier le mode d'orientation de la caméra,,Disconoscimento della modalità telecamera,,,Overschrijven van camerastand verbieden,Tillat ikke overstyring av kameramodus,ZabroÅ„ nadpisywania trybu widoku,Forçar modo de alinhamento do sprite à câmera,,,Запретить переопределение режима поворота камеры,,TillÃ¥t inte Ã¥sidosättande av kamerans vändläge,Kameraya bakma modunun geçersiz kılınmasına izin verme, +Swap health and armor,ALTHUDMNU_SWAPHEALTHARMOR,,,,,Byt om pÃ¥ helbred og rustning,Anzeige für Gesundheit und Panzerung tauschen,,,,,,Échanger la santé et l'armure,,Scambio di salute e armatura,,,Verwissel gezondheid en pantser,Bytt helse og rustning,ZamieÅ„ zdrowie i pancerz,Trocar saúde e armadura,,,ПоменÑть отображение Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð¸ брони меÑтами,,Byt hälsa och rustning,SaÄŸlık ve zırhı deÄŸiÅŸtir, +Use classic HUD scaling,SCALEMNU_HUD_OLDSCALE,hud_oldscale,,,,Brug klassisk HUD-skalering,Klassische HUD-Skalierung,,,,,,Utiliser l'échelle classique du HUD,,Utilizzare la scalatura classica dell'HUD,,,Gebruik klassieke HUD-schaling,Bruk klassisk HUD-skalering,,Usar escala clássica do HUD,,,КлаÑÑичеÑкое маÑштабирование интерфейÑа,,Använd klassisk HUD-skalning,Klasik HUD ölçeklendirmesini kullanın, +HUD scale factor,SCALEMNU_HUD_SCALEFACTOR,hud_scalefactor,,,,HUD-skaleringsfaktor,HUD-Skalierungsfaktor,,,,,,Facteur d'échelle du HUD,,Fattore di scala dell'HUD,,,HUD-schaalfactor,HUD-skaleringsfaktor,,Fator de escala do HUD,,,Значение маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа,,Skalningsfaktor för HUD,HUD ölçek faktörü, \ No newline at end of file diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 585554302..d3395e656 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -1300,6 +1300,40 @@ class Actor : Thinker native native version("4.12") void SetAnimationFrameRate(double framerate); native version("4.12") ui void SetAnimationFrameRateUI(double framerate); + native version("4.12") void SetModelFlag(int flag); + native version("4.12") void ClearModelFlag(int flag); + native version("4.12") void ResetModelFlags(); + + + action version("4.12") void A_SetAnimation(Name animName, double framerate = -1, int startFrame = -1, int loopFrame= -1, int interpolateTics = -1, int flags = 0) + { + invoker.SetAnimation(animName, framerate, startFrame, loopFrame, interpolateTics, flags); + } + + action version("4.12") void A_SetAnimationFrameRate(double framerate) + { + invoker.SetAnimationFrameRate(framerate); + } + + action version("4.12") void A_SetModelFlag(int flag) + { + invoker.SetModelFlag(flag); + } + + action version("4.12") void A_ClearModelFlag(int flag) + { + invoker.ClearModelFlag(flag); + } + + action version("4.12") void A_ResetModelFlags() + { + invoker.ResetModelFlags(); + } + + + + + int ACS_NamedExecute(name script, int mapnum=0, int arg1=0, int arg2=0, int arg3=0) { return ACS_Execute(-int(script), mapnum, arg1, arg2, arg3); diff --git a/wadsrc/static/zscript/constants.zs b/wadsrc/static/zscript/constants.zs index 87a0c995c..637daff97 100644 --- a/wadsrc/static/zscript/constants.zs +++ b/wadsrc/static/zscript/constants.zs @@ -1475,3 +1475,26 @@ const WATER_SINK_FACTOR = 0.125; const WATER_SINK_SMALL_FACTOR = 0.25; const WATER_SINK_SPEED = 0.5; const WATER_JUMP_SPEED = 3.5; + + +// for SetModelFlag/ClearModelFlag +enum EModelFlags +{ + // [BB] Color translations for the model skin are ignored. This is + // useful if the skin texture is not using the game palette. + MDL_IGNORETRANSLATION = 1<<0, + MDL_PITCHFROMMOMENTUM = 1<<1, + MDL_ROTATING = 1<<2, + MDL_INTERPOLATEDOUBLEDFRAMES = 1<<3, + MDL_NOINTERPOLATION = 1<<4, + MDL_USEACTORPITCH = 1<<5, + MDL_USEACTORROLL = 1<<6, + MDL_BADROTATION = 1<<7, + MDL_DONTCULLBACKFACES = 1<<8, + MDL_USEROTATIONCENTER = 1<<9, + MDL_NOPERPIXELLIGHTING = 1<<10, // forces a model to not use per-pixel lighting. useful for voxel-converted-to-model objects. + MDL_SCALEWEAPONFOV = 1<<11, // scale weapon view model with higher user FOVs + MDL_MODELSAREATTACHMENTS = 1<<12, // any model index after 0 is treated as an attachment, and therefore will use the bone results of index 0 + MDL_CORRECTPIXELSTRETCH = 1<<13, // ensure model does not distort with pixel stretch when pitch/roll is applied + MDL_FORCECULLBACKFACES = 1<<14, +}; \ No newline at end of file